【问题标题】:Receiving a response through UDP通过 UDP 接收响应
【发布时间】:2010-06-05 21:00:16
【问题描述】:

我看到应用程序通过 UDP 向某个端口上的 IP 发送数据包并接收响应。响应到哪个端口? (顺便说一句,如果没有端口转发到我的 PC,路由器如何知道响应是针对我的 PC 的?)

你好,Neo_b

【问题讨论】:

    标签: sockets udp


    【解决方案1】:

    分配响应的端口取决于应用程序。 UDP 是完全无状态的,因此在发出数据包后,应用程序可以期待响应的唯一方法是它是否知道另一端将发送一个数据包。根据 UDP 应用程序,为了简单起见,我希望响应会出现在同一个端口上——对于 TCP 等协议而言,情况并非如此,它有一个故意随机(和高)源端口。

    要回答您的第二个问题,许多路由器,甚至是便宜的家用路由器,都会使用stateful packet inspection (SPI)。可能会发生这样的事情,但如果我离开,我会得到纠正:

    [用客户端、路由器、互联网、服务器搭建舞台。]

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

    我想这是特定于路由器的实现方式,但这是我对其工作原理的理解。

    【讨论】:

    • 感谢您写得很好。唯一的更正是对 #4 假设:“可能在同一个端口上响应”。这不太可能,因为它会干扰在发送方机器上相同端口上运行的 UDP 服务器。
    • 这是一个很好的 Java 快速参考:stackoverflow.com/questions/10556829/…
    【解决方案2】:

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

    我想即使端口被防火墙或 NAT 设备更改也是如此,远程端看到来自特定端口的数据报并将回复发送回来,然后防火墙/NAT 设备将该端口转换为原始源端口。

    【讨论】:

    • 我认为事情就是这样,因为我只是查看了一些名称服务器代码。 DNS 请求通常通过 UDP 进行,但需要发回答案。
    【解决方案3】:

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

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

    1. 您可以显式配置路由 到您的计算机上的特定 港口。
    2. 您可以将路由器配置为 通过以下方式跟踪 UDP 连接 自动打开路线 你的电脑当一个特定的 数据包被发送。 UPNP 协议是 基于这个概念。

    【讨论】:

    • 感谢你们两位的快速解答。我已经编译了稍微修改的 UDP 客户端和服务器版本。当我尝试在我尝试过的几乎所有端口上向 localhost 发送消息时,它们在我的 PC 上工作。尽管当我向 LAN 中另一台 PC 上运行的服务器发送查询并在发送查询的同一端口上侦听响应时,我没有收到响应(当我使用自己的 UnrealScript 代码时,我以某种方式收到响应)。
    猜你喜欢
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多