【发布时间】:2010-06-05 21:00:16
【问题描述】:
我看到应用程序通过 UDP 向某个端口上的 IP 发送数据包并接收响应。响应到哪个端口? (顺便说一句,如果没有端口转发到我的 PC,路由器如何知道响应是针对我的 PC 的?)
你好,Neo_b
【问题讨论】:
我看到应用程序通过 UDP 向某个端口上的 IP 发送数据包并接收响应。响应到哪个端口? (顺便说一句,如果没有端口转发到我的 PC,路由器如何知道响应是针对我的 PC 的?)
你好,Neo_b
【问题讨论】:
分配响应的端口取决于应用程序。 UDP 是完全无状态的,因此在发出数据包后,应用程序可以期待响应的唯一方法是它是否知道另一端将发送一个数据包。根据 UDP 应用程序,为了简单起见,我希望响应会出现在同一个端口上——对于 TCP 等协议而言,情况并非如此,它有一个故意随机(和高)源端口。
要回答您的第二个问题,许多路由器,甚至是便宜的家用路由器,都会使用stateful packet inspection (SPI)。可能会发生这样的事情,但如果我离开,我会得到纠正:
[用客户端、路由器、互联网、服务器搭建舞台。]
我想这是特定于路由器的实现方式,但这是我对其工作原理的理解。
【讨论】:
如果我向另一台机器上的 UDP 端口发送消息,无论我从哪个端口发送消息,无论它是如何选择的,都会出现在 UDP 数据报中。我原以为远程端会将对该数据报的任何响应发送到该源端口。
我想即使端口被防火墙或 NAT 设备更改也是如此,远程端看到来自特定端口的数据报并将回复发送回来,然后防火墙/NAT 设备将该端口转换为原始源端口。
【讨论】:
创建 UDP 套接字时,必须将其绑定到端口号。如果你不这样做,操作系统会分配一个ephemeral port.
另一端的应用程序必须知道这个端口。当回复被发回时,您的路由器可能不知道如何路由。有两种方法可以解决这个问题
【讨论】: