使用 socket.socket 将数据连续发送到两个不同的 IP:NAT 保持相同端口是标准行为吗?
Posted
技术标签:
【中文标题】使用 socket.socket 将数据连续发送到两个不同的 IP:NAT 保持相同端口是标准行为吗?【英文标题】:Sending data consecutively to two different IPs with socket.socket: is it standard behaviour that the NAT keeps the same port? 【发布时间】:2019-05-06 09:32:34 【问题描述】:在标准家用路由器/NAT 后面的家用计算机上,我打开一个socket
,并将数据发送到两个不同的服务器(具有不同的公共 IP):
import socket, time
soc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for addr in ['203.0.113.2', '198.51.100.77']:
soc.sendto(b'', (addr, 4000))
data, _ = soc.recvfrom(6)
print(data)
time.sleep(2)
在侦听端口 4000 的第一台服务器上,我注意到 4000 已被 NAT 转换为端口 57358。
在侦听端口 4000 的第二台服务器上,我注意到 4000 也已转换为端口 57358。
当
打开一个套接字 向第一台服务器发送数据, NAT 路由器将端口 4000 转换为 57358那么,当使用相同的套接字向另一个 IP 发送数据时,NAT 会将端口 4000 转换为相同的端口?(在我的示例中为 57358)
还是只是运气?
注意:我已经通过连接到家庭 ISP 路由器的计算机和通过 WiFi 连接到我的手机网络共享的计算机对此进行了测试,在这两种情况下,我都得到了相同的行为。
【问题讨论】:
NAPT 的实现取决于 NAPT 设备的供应商。一台设备可能会这样做,而另一台设备则不同。 这可能是@RonMaupin 的答案(你能把它贴出来吗?)。我认为也许使用 single socket 会保持一些连接处于活动状态,以便在切换到另一个目标 IP 时,NAT 会知道它应该提供相同的 NAT 转换端口。 好的。我做到了。 【参考方案1】:好像有各种methods of translation,比如Symmetric NAT:
,
full-cone NAT、post-restricted cone NAT 等,它们中的每一种都可能导致不同的行为 (?)。
【讨论】:
【参考方案2】:NAPT 的实施取决于 NAPT 设备的供应商。一台设备可能会这样做,而另一台设备会有所不同。
【讨论】:
以上是关于使用 socket.socket 将数据连续发送到两个不同的 IP:NAT 保持相同端口是标准行为吗?的主要内容,如果未能解决你的问题,请参考以下文章