1. 利用Mininet仿真平台构建如下图所示的网络拓扑,配置主机h1和h2的IP地址(h1:10.0.0.1,h2:10.0.0.2),测试两台主机之间的网络连通性
2. 利用Wireshark工具,捕获拓扑中交换机与控制器之间的通信数据,对OpenFlow协议类型的各类报文(hello, features_request, features_reply, set_config, packet_in, packet_out等)进行分析
hello
控制器6633端口 ---> 交换机56694端口
Features Request
控制器6633端口 ---> 交换机56694端口
Set Config
控制器6633端口 ---> 交换机56694端口
Features Reply
交换机56694端口--- 控制器6633端口
Packet_in
交换机56694端口--- 控制器6633端口
//结合Packet_in的结构
struct ofp_packet_in {
struct ofp_header header;
uint32_t buffer_id; /*Packet-in消息所携带的数据包在交换机缓存区中的ID*/
uint16_t total_len; /*data字段的长度*/
uint16_t in_port; /*数据包进入交换机时的端口号*/
uint8_t reason; /*发送Packet-in消息的原因,具体见 ofp_packet_in_reason*/
uint8_t pad;
uint8_t data[0]; /*携带的数据包*/
};
Packet_out
交换机6633端口--- 控制器56694端口
接下来是另一台交换机(端口35536)与控制器(端口6633)的交互过程
h1 ping h2
Packet_in
Flow_mod
```c++
//结合flow_mod结构
struct ofp_flow_mod {
struct ofp_header header;
struct ofp_match match; /流表的匹配域/
uint64_t cookie; /流表项标识符/
uint16_t command; /可以是ADD,DELETE,DELETE-STRICT,MODIFY,MODIFY-STRICT/
uint16_t idle_timeout; /空闲超时时间/
uint16_t hard_timeout; /最大生存时间/
uint16_t priority; /优先级,优先级高的流表项优先匹配/
uint32_t buffer_id; /缓存区ID ,用于指定缓存区中的一个数据包按这个消息的action列表处理/
uint16_t out_port; /如果这条消息是用于删除流表则需要提供额外的匹配参数/
uint16_t flags; /标志位,可以用来指示流表删除后是否发送flow‐removed消息,添加流表时是否检查流表重复项,添加的流表项是否为应急流表项。/
struct ofp_action_header actions[0]; /action列表/
};
https://img2018.cnblogs.com/blog/1791976/201911/1791976-20191119000229014-1797307140.png)