2009-11-29 157 views
4

我看到应用程序通过UDP将数据包发送到某个端口上的IP并接收响应。响应去了哪个端口? (顺便说一句,怎么可以在路由器知道响应是针对我的电脑,如果没有转发到我的电脑的端口?)通过UDP接收响应

问候,Neo_b

回答

7

什么端口分配一个反应是由应用程序。 UDP是完全无状态的,所以在发射一个数据包之后,应用程序可以期待响应的唯一方法就是知道另一端将要发送一个响应。根据UDP应用程序的不同,我期望为简单起见,响应将出现在相同的端口上 - 对于像TCP这样的协议,情况并非如此,它有一个有意识的随机(和高)源端口。

要回答你的第二个问题,很多路由器,甚至是廉价的家庭路由器,都要做stateful packet inspection(SPI)。这样的事情有可能发生,但我为被纠正,如果我关:[设置阶段,客户端,路由器,网络,服务器]

  1. 客户端发出的UDP数据包。
  2. 路由器将UDP数据包传递给Internet。
  3. 路由器记得客户端发送一个UDP包到服务器,并在其内存中建立一个映射。
  4. 服务器发送一个UDP数据包,可能在同一个端口上。
  5. 路由器接收数据包,并检查映射以找到最近与服务器通话的客户端。
  6. 路由器将数据包传递给客户端。

这是如何实现的是特定于路由器,我想象,但这是我的理解它是如何工作的。

1

创建UDP套接字时,必须将其绑定到端口号。如果你不操作,操作系统将分配一个ephemeral port.

另一方的应用程序必须知道这个端口。当回复发回时,您的路由器可能不知道如何路由。有两种方法来解决这一问题

  1. 您可以明确地在特定 端口上配置路由 到您的计算机。
  2. 到 跟踪由当发送一个特定的 包 自动打开一个路线 您的计算机的UDP连接可以配置你的路由器。基于这个概念,UPNP协议是 。
+0

感谢您的快速解答。我已经编译了UDP客户端和服务器的稍微修改版本。当我尝试在几乎任何我尝试过的端口上向本地主机发送消息时,他们在我的PC上工作。尽管当我向局域网中另一台PC上运行的服务器发送查询并在侦听到同一端口上的响应时,我没有收到响应(而当我使用自己的UnrealScript代码时,我以某种方式接受回应)。 – 2009-11-29 09:40:25

2

如果我将消息发送到另一台机器上的UDP端口,无论选择了哪个端口,它都会出现在UDP数据报中。我会认为远程端会将任何对该数据报的响应发送到该源端口。

我想这同样适用于即使端口被防火墙或NAT设备改变,远程端看到来自特定端口的数据报并发回应答,防火墙/ NAT设备然后将该端口转换为原始源端口。

+1

我认为这是事实,因为我只是看了一些域名服务器代码。 DNS请求通常通过UDP传输,但需要发回答案。 – user2081279 2017-04-06 08:26:19