SDN环境下两主机通信过程

感悟

SDN看了也有两个月了吧,刚接触时很兴奋呐,感觉就是一控制器加一交换机呗。弄懂里面的函数结构,接下来搞编程应该就可以了吧~~可是这仅仅是我天真的想法。当别人问我为什么是这样的时候,放到最初那会儿,我会干脆的说:SDN就是这样啊;而现在,我会很小心地分析它的协议流程,害怕漏掉或者说错某个细节。越了解越敬畏,一个概念的产生并且盛行是经过许多学者推敲和认证的,所 以无论是做科研还是学术,我们都应有一个严谨的态度。

两主机通信过程

本次实验环境Floodlight+Mininet。我们利用mininet仿真出一个switch下三台hosts:h1,h2, h3,然后h2 ping h3;通过wirshark抓包分析openflow的协议流程。(在本文我就不分析不同 switch下不同host的ping包过程了)默认加载了转发模块。拓扑图如下:
topo
1.最初h2会通过将自己和h3的ip地址同子网掩码与运算得知:自己和h3在同一网段,可直接通信;
2.h2对数据包二层封装时,发现自己并不知道h3的mac地址,于是发送ARP广播包;
3.switch收到arp广播包后,由于没有流表,于是它向控制器发送packet_in消息;
4.控制器收到packet_in后,向switch发送packet_out,并下发流表给switch让它将数据包从除2端口以外的其他所有端口发送;
5.h3收到arp数据包后,在数据包里添加上自己的mac地址;
6.switch收到h3的arp包,由于没有流表项,于是向控制器发送packet_in消息;
7.控制器学习到h3的mac和ip地址,向switch发送packet_out消息并下发h3到h2的流表项;
8.h2知道了h3的mac地址,完成icmp包的封装,就向h3发包了;
9.由于switch没有h2->h3的流表项,所以它还是会向控制器发送packet_in;
10.控制器发送packet_out给switch并下发h2->h3的流表;至此h2和h3就能不通过控制器只通过switch直接通信啦!

下面是寻址阶段抓包截图:(注:抓取的是通过eth0的包,eth0与控制器通信,所以也就是抓的控制器的包)
ping
寻址结束后,抓取控制器的包时,没有了h2 ping h3的icmp包,在端口2抓包:
eth2
在端口3抓包:
eth3

Openflow与传统路由的比较

Openflow与传统路由一样,在源主机不知道目的主机mac地址的情况下,都会进行arp寻址。但不同之处在于,传统路由没有控制器,所有流表在switch里,转发和控制都由switch负责;而Openflow协议里,switch若没有匹配流表(或者没有流表),它会向控制器发送请求,让控制器下发策略。
这是我个人的分析,欢迎指正,大家共同学习,若转载请注明出处!