转载请注明出处: http://blog.csdn.net/mageover/article/details/51436775
本文是通过分析一次ping过程来学习forwarding模块,从最简单的拓扑结构入手,研究报文在整个网络中的流向,并深入到forwarding模块的源码。选择forwarding模块进行分析好处在于:这个模块是floodlight应用模块,实现了一个完整的功能,代码简洁却不简单,涉及到了许多其它模块所提供的接口,对理解floodlight的结构很有益处。
阅读本文的读者需要了解OpenFlow1.3协议,大致了解Floodlight的模块编写和OpenFlowJ-Loxigen
OpenFlow 1.3.0: http://www.sdnap.com/wp-content/uploads/openflow/openflow-spec-v1.3.0.pdf
how to write a module: https://floodlight.atlassian.net/wiki/display/floodlightcontroller/How+to+Write+a+Module
how to use OpenFlowJ-Loxigen: https://floodlight.atlassian.net/wiki/display/floodlightcontroller/How+to+use+OpenFlowJ-Loxigen
实验环境:两台vbox虚拟机,一台运行mininet模拟网络,一台运行floodlight控制器
一 ping过程分析
以h1 ping h2为例,整个报文的流程如下:
① h1------>s1
h1 ping h2,h1不知道h2的mac地址,只知道h2的ip地址
此时,h1会构建一个源mac为h1_mac,目的mac为广播地址的arp请求包,h1发送arp请求包到s1
② s1------>c0
s1收到arp请求包,发现没有对应流表项,产生OPF_PACKET_IN消息,并递交给c0
③ c0------>s1
c0收到OPF_PACKET_IN,发现是一个广播包,c0产生一个PACKET_OUT消息,要求广播该包,并递交给s1
④ s1------>h2
s1根据PACKET_OUT的指令进行广播,将arp请求包广播至h2
⑤ h2------>s1
h2收到h1发来的arp请求包,发现就是请求的自己的mac地址,于是构建一个arp响应包,发至s1,其源mac为h2_mac,目的mac为h1_mac
⑥ s1------>c0
s1收到arp响应包,发现没有对应流表项,产生OPF_PACKET