我正在尝试使用POX控制器向交换机添加流条目,我的代码是:
fm = of.ofp_flow_mod()
fm.match.in_port = 1
fm.priority = 33001
fm.match.dl_type = 0x800
fm.match.nw_src = IPAddr("10.0.0.1")
fm.match.nw_dst = IPAddr("10.0.0.5")
fm.actions.append(of.ofp_action_output( port = 2 ) )
event.connection.send( fm )
但是,当我从10.0.0.1 ping到10.0.0.5时,没有回复 . 可能是什么问题? (我还为ICMP回复添加了对称流)
谢谢
1 回答
(注意:我在以下示例中将
10.0.0.5
更改为10.0.0.3
,因为我使用1个交换机测试,mininet中有3个主机拓扑 . )您的问题是ARP请求无法通过 . 您需要添加两个额外的规则来让dl_type = 0x0806的消息通过 . 所以:
如果您的网络中没有任何环路,您还可以添加一个规则,在每个端口上泛洪数据包,除了它来自的端口 .
更多信息:当您发送发往IP地址的ICMP回应请求时,会发生以下情况:
主机发出ARP请求("who has IP 10.0.0.3?")以找出下一跳的硬件MAC地址 .
然后主机向下一跳发送ICMP数据包 .
如果初始查询没有响应,则不会发送ICMP数据包,因为主机不知道接下来要将其发送到何处 . 您可以在本答案末尾的
tcpdump
示例中看到此信息 .这是mininet的输出:
那么,如果我们已经"know"下一跳是什么呢?在这种情况下,我们可以告诉
ping
将ICMP IPv4数据包发送出特定接口 . 它不会使用ARP . 但是,ping请求的接收方仍将尝试使用ARP来确定如何发送响应 . 请求将到达,但响应不会 .您可以通过运行以下命令将初始ping强制发送到特定接口,而不使用ARP请求:
即使您没有设置ARP规则(因为
nw_src
和nw_dst
匹配),初始ICMP数据包也将通过 . 如果在h3上运行tcpdump
(运行xterm h3
并在新终端tcpdump
中),则可以看到ICMP消息在这种情况下到达,但返回消息没有 .最后的ARP请求的长序列是接收主机试图找出应该将响应发送回哪个接口 .