【问题标题】:Python socket NAT port addressPython套接字NAT端口地址
【发布时间】:2016-12-14 21:23:41
【问题描述】:

我在 NAT 后面有一个客户端套接字,我想获取进程使用的本地端口号。

为了说明我的问题,这里有一个简单的例子。

假设我使用以下代码创建了一个服务器:

welcome_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
welcome_socket.bind(("", 1500))
welcome_socket.listen(5)

然后我监听传入的连接:

(client_socket, address) = self.welcome_socket.accept()

我使用以下代码从客户端(在 NAT 之后)进行连接:

sock = socket.create_connection(("server_address", 1500))

这是我有点困惑的地方。

我在服务器端获得的地址具有客户端连接到的 WiFi 网络的公共地址(我期望的)和一些端口号,根据我对 NAT 的理解,应该与实际端口号不同由客户端使用并用于地址转换。

但是,如果我在客户端上使用 getsockname() 函数,我会得到与服务器提供的端口号相同的端口号。

回到代码中的例子。

在服务器上:

client_socket.getpeername()
>>> ('WiFi_address', 4551)

在客户端:

sock.getsockname()
>>> ('local_address', 4551)

因此,即使客户端位于 NAT 之后,两个端口号也是相同的。这是怎么回事?我是否误解了 NAT 的工作原理?还是有其他命令可以获取客户端socket绑定的物理地址?

任何见解将不胜感激。

【问题讨论】:

    标签: python sockets nat


    【解决方案1】:

    路由器很可能正在使用端口地址转换(或one-to-many NAT)。 wiki链接进一步引用

    PAT 尝试保留原始源端口。如果这个源端口 已使用,PAT 分配第一个可用端口号开始 从相应端口组 0-511、512-1023 或 1024-65535。当没有更多可用端口并且有更多可用端口时 比配置的一个外部 IP 地址,PAT 移动到下一个 IP 地址尝试再次分配原始源端口。这 进程继续进行,直到用完可用端口和外部 IP 地址。

    这应该是您在服务器上看到端口 4551 的原因。

    This link 也应该有助于澄清 NAT 和 PAT 之间的区别)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 2020-04-07
      • 2021-04-16
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      相关资源
      最近更新 更多