%# -*- coding: utf-8-unix -*-

\section{基于OpenFlow的拓扑测量}
\label{sec:c:sdn-ob:s:topo}

\subsection{实验目的}
\label{subsec:c:sdn-ob:s:topo_object}

本实验的主要目的是让学生了解OpenFlow协议中PACKET\_IN和链路探测协议
（LLDP）的工作原理和网络拓扑构建方法。

\subsection{实验内容}
\label{subsec:c:sdn-ob:s:topo_content}

使用可编程网络平台及SDN交换机源码，分析LLDP的工作原理。
通过PACKET\_IN消息收集网络设备节点信息。
掌握网络拓扑的构建方法。主要完成以下内容：

\begin{enumerate}
  \item \textbf{打印连接主机信息：}基于SDN交换机源码，在端口分组接收回调函数中添加相关逻辑，解析输入分组数据，提取设备MAC与IP信息，打印显示其内容；
  \item \textbf{打印接收LLDP消息：}基于SDN交换机源码，在端口分组接收回调函数中添加相关逻辑，解析输入分组数据，打印LLDP分组的相关协议字段；
  \item \textbf{打印发送LLDP消息：}基于SDN交换机源码，在OpenFlow协议回调函数中添加相关逻辑，提取SDN控制器下发的PACKET\_OUT消息，且消息封装的分组协议为LLDP格式；打印输出LLDP分组中的相关协议字段；
  \item \textbf{提取控制器链路与设备信息：}
  使用REST~API接口获取SDN控制器的网络链路信息和设备连接信息；
  \item \textbf{构建拓扑图：}以WEB形式展示网络拓扑结构图；
  \item \textbf{修改网络验证：}改变物理网络拓扑结构后，
  重新展示学习到的网络拓扑结构图。
\end{enumerate}

\subsection{实验原理、方法和手段}
\label{subsec:c:sdn-ob:s:topo_principle}

\subsubsection{LLDP工作原理}

LLDP是一个用于信息通告和获取的协议，发送的信息通告不需要确认，不能发送一个请求来请求获取某些信息，也就是说LLDP是一个单向的协议，只有主动通告一种工作方式，无需确认，不能查询、请求。LLDP帧的发送有两种触发方式：一是定时器到期触发；二是设备状态发生了变化触发。

LLDP协议主要完成的功能包括：初始化并维护本地MIB 库中的信息；从本地MIB库中提取信息，并将信息封装到LLDP帧中；识别并处理接收到的LLDPDU帧；维护远端设备LLDP MIB 信息库；当本地或远端设备MIB信息库中有信息发生变化时，发出通告事件。

网络拓扑的测量是通过一些链路探测协议在各交换节点中相互收发来完成的链路的拓扑测量功能。
SDN交换机使用LLDP链路探测协议主要是通过PACKET\_OUT消息发送LLDP分组，
通过PACKET\_IN接收LLDP分组，通过计算获取交换机之间的连通关系和端口连接关系。

\subsubsection{SDN交换机中LLDP的分组处理流程}
\begin{enumerate}
  \item 主动发送LLDP：
  SDN控制器主动构造特定的LLDP报文（含交换机标记与输出端口信息），
  封装在OpenFlow的PACKET\_OUT方法中，从指定的交换机各端口发送出去；
  \item 接收处理LLDP：如果端口连接的是主机，则主机会丢弃该报文，
  若同样是OpenFlow交换机，则会通过PACKET\_IN的方式将该LLDP报文转发给控制器；
  \item LLDP学习：控制器收到LLDP报文后，
  则会学习到这两个交换机之间存在一条连接链路；
  \item 网络设备信息学习：主机连接到交换机后，
  主机端会主动构造一些广播报文发送到网络上，
  这些报文会携带上本机的MAC地址和IP地址等信息。
  交换机接收到主机发送报文后，在其交换流表中找不到转发表项，
  则会将该报文完整内容和其所输入的端口信息封装在OpenFlow协议的PACKET\_IN方法中，
  将报文送到SDN控制器；控制器接收到该消息后，
  通过学习对比发现是一台新主机入网，则会将该报文中的源MAC地址、
  IP地址和接收交换机信息及输入端口信息等均记录在一张网络设备信息数据表中；
  \item 构建设备连接关系：
  交换机之间的链路信息加上交换机与主机之间的链路信息就完整的构成了全网的拓扑连接关系。
\end{enumerate}

\begin{figure}[h!]
  \centering
  \includegraphics[width=10cm]{openflow-topo}
  \caption{OpenFlow拓扑测量实验拓扑图}
  \label{fig:c:sdn-ob_openflow-topo}
\end{figure}

\subsection{实验条件}
\label{subsec:c:sdn-ob:s:topo_requirement}

\begin{itemize}
  \item 可编程网络平台两个，测试主机两台，SDN控制器一台。
  连接拓扑如图\ref{fig:c:sdn-ob_openflow-topo}所示；
  \item 串口线两根，网线五根；
  \item SDN交换机框架源码。
\end{itemize}

\subsection{实验步骤}
\label{subsec:c:sdn-ob:s:topo_procedure}

\begin{enumerate}
  \item 运行SDN交换机；

  请参考附录\ref{app:openbox}：《FAST平台介绍与操作说明手册》完成。
  \item 基于SDN交换机开源代码，在端口分组接收回调函数中添加相应逻辑；
  \begin{code}[c]
    int port_recv_callback(int inport,struct fast_packet *pkt,int pkt_len)
    {
      //解析分组字段，提取LLDP分组，并打印输出其相关协议字段

      //解析分组字段，判断帧类型为0x0800，源IP为单播地址的分组，打印其源MAC地址与IP地址
    }
  \end{code}
  \begin{enumerate}
    \item 解析接收数据，判断以太网帧类型，
    如果帧类型为0x88CC，则说明是LLDP协议分组，根据LLDP协议打印相关协议字段内容；
    \item 解析分组，提取输入帧类型为0x0800的分组，
    打印输出其源MAC地址与源IP地址（仅输出IP地址为单播类型的条目）。
  \end{enumerate}
  \item 编译SDN交换机，验证添加逻辑功能，观察是否正确打印需要的消息内容；
  \item 分析端口接收回调函数中打印的消息内容；
  \begin{enumerate}
    \item 从LLDP分组中可解析得知对端交换机的某个端口发送到本交换机的某个端口；
    \item 从普通IPv4报文中可以获得连接到该交换机上的主机节点信息
    （MAC地址和IPv4地址）。
  \end{enumerate}
  \item 验证并观察SDN控制器自带的拓扑展示界面；
  \begin{enumerate}
    \item 在控制器主机打开WEB界面，输入地址：
    \texttt{127.0.0.1/ui/index.html}。查看浏览器界面数据；
    \item 切换浏览器的拓扑显示版块，
    查看网络拓扑展示效果可以看到两台交换机中间用线连接；
    \item 连接上一台测试主机，刷新拓扑界面，
    查看到界面新增了一台主机，并显示其IP地址信息；
    \item 再连接上另一台主机，刷新拓扑界面，
    查看到界面又新增了一台主机，并显示其IP地址信息；
    \item 断开两台交换机之间的网线，新拓扑界面，
    查看两个交换机之间的连线消失；
    \item 断开一台测试主机，刷新拓扑界面，查看其对应的主机从界面消失。
  \end{enumerate}
  \item 使用控制器的北向REST API接口查询网络的所有链路连接关系数据，

  API接口为：\texttt{/wm/topology/links/json}；
  \item 使用控制器的北向REST API接口查询全网所有设备节点信息，

  API接口为：\texttt{/wm/device/}；
  \item 自己开发网络拓扑展示效果图；
  \item 修改网络拓扑后验证自己开发程序的效果。
\end{enumerate}

\subsection{思考题}
\label{subsec:c:sdn-ob:s:topo_rethink}

\begin{enumerate}
  \item 在网络拓扑的探测学习中，主机节点信息通过哪种协议分组学习效果最好？
  \item OpenFlow交换机之间用一台普通交换机连接，能学习到全网的拓扑结构信息吗？
  分析原因。
\end{enumerate}

\subsection{注意事项及有关说明}
\label{subsec:c:sdn-ob:s:topo_notice}
\begin{enumerate}
  \item SDN控制器的WEB界面有缓存，每次物理拓扑更新后要先清理浏览器历史缓存数据再刷新WEB界面。
\end{enumerate}

\subsection{考核方法}
\label{subsec:c:sdn-ob:s:topo_criterion}

完成本次实验，需要提交一份实验报告、一份程序源代码和一份程序输出日志。
\begin{enumerate}
  \item （20分）在规定时间内完成实验，并提交实验成果；
  \item （20分）正确打印输入与输出LLDP消息内容和连接主机信息；
  \item （20分）通过REST API编程获取链路状态信息与设备信息，并能生成拓扑关系图；
  \item （20分）以图形界面形式展示拓扑图；
  \item （10分）动态修改物理拓扑后，程序可以及时刷新出正确拓扑图状态；
  \item （10分）实验报告与源代码内容完整、格式规范。
\end{enumerate}
