【发布时间】:2020-01-12 04:01:54
【问题描述】:
尽管将两个 UDP 套接字绑定到主机不同接口上的 2 个不同地址,但流量仍流经单个接口。
网络拓扑如下: h2 和 s1 之间的 2 个链接 h1 和 s1 之间有 1 个链接
________
| |
h2 s1_______h1
|________|
我在 mininet 上模拟 2 台主机和 1 台交换机。 h1 在 10.0.0.1:4243 运行 UDP 服务器。另一台主机有 2 个接口,ips 10.0.0.2 & 10.0.0.4 。我在 h2 上制作 2 个套接字,将一个绑定到 (10.0.0.2,9999) 并将另一个套接字绑定到 (10.0.0.4,8888)。我正在运行下面的代码,它应该在两个接口上交替发送数据包。
相反,第一个数据包在两个接口上发送。所有后续数据包都通过单个接口发送。
客户端代码(在 h2 上运行)
def client():
sock1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock1.bind(("10.0.0.2",9999))
sock2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock2.bind(("10.0.0.4",8888))
while True:
text = 'The time is {}'.format(datetime.now())
data = text.encode('ascii')
sock1.sendto(data, ('10.0.0.1', 4243))
data, address = sock1.recvfrom(MAX_BYTES)
sock2.sendto(data, ('10.0.0.1', 4243))
data, address = sock2.recvfrom(MAX_BYTES)
服务器代码(在 h1 上运行)
def server():
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('10.0.0.1', 4243))
print('Listening at {}'.format(sock.getsockname()))
while True:
data, address = sock.recvfrom(MAX_BYTES)
text = data.decode('ascii')
print('The client at {} says {!r}'.format(address, text))
text = 'Your data was {} bytes long'.format(len(data))
data = text.encode('ascii')
sock.sendto(data, address)
一个数据包通过 h2 的两个接口发送。后续数据包都只能通过 IP 10.0.0.2 的接口发送和接收。在 Wireshark 上,一半的数据包的 src/dest IP 设置为 10.0.0.4
【问题讨论】:
-
你能在 h1 上显示
ip route show和 'cat /proc/sys/net/ipv4/ip_forward' 的输出吗? -
ip route show : 10.0.0.0/8 dev h1-eth0 proto kernel scope link src 10.0.0.1
-
猫 ip_forward : 1
-
我需要 h2 的输出,我想你给了 h1
-
您遇到了 TCP/IP 的“弱端系统模型”。
标签: python sockets network-programming udp mininet