使用 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 保持相同端口是标准行为吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用socket模拟数据流计算

Python-实现socket简单地连续发数据

socket_connect没有超时

python socket编程

通过 tcp 套接字发送十六进制值

游戏制作者网络