UDP 打孔。如何监听一个繁忙的端口?

网络工程 UDP
2022-02-07 02:24:50

今天是个好日子!

我正在开发一个对时间非常敏感的网络应用程序,并且不能选择使用中间服务器。因此,我决定实现一个 udp 打孔算法。为了简化,我用两点来解释我的问题。假设A向B发送了一些东西。据我所知,当A向B发送一些东西时,A没有太多选择使用哪个端口(用于发送)。操作系统会自动分配该端口。但是 B 可以看到 A 发送数据包的端口。现在 B 尝试在该端口上发回一个数据包,以便 A 可以读取它。

这是我遇到的一个问题/问题:

  1. 当尝试在 A 点上使用 netcat(用于测试)侦听用于发送数据包的端口时,我收到一条消息,表明该端口正忙。我在听错误的端口吗?我认为UDP协议连接较少,多个程序可以同时使用同一个端口。

  2. 有没有办法(c#)来查看我的应用程序用来发送数据包的端口?

以下“图表”显示了我正在尝试实现的更详细的部分

A ---------> R ------------> C

当 C 点收到 UDP 数据包时,它可以在 R 点看到路由器的外部端口。这是 C 发送 udp 数据包的地方。收到数据包后,路由器将其发送给 A。我的问题是如何在 A 上读取该数据包?谢谢你的帮助

1个回答

默认情况下,在你的代码中建立一个 Socket 连接会选择一个任意的临时源端口(1024-65535),但是这可以被覆盖:

例如,DNS 使用 UDP 和源和目标端口 53 进行传输。

关于你的其他问题:

  1. UDP 是无连接的,但不要将其与能够绑定到同一个套接字的多个应用程序混淆 - 如果数据包进入特定端口,则只能将其传递给单个应用程序(Wireshark 等应用程序除外它没有专门绑定到端口,而是将特殊过滤器应用于复制发送到它的所有流量的接口。)在您的情况下,您的应用程序和 netcat 不能同时绑定到同一个端口。

  2. 当 s 是一个 Socket 时,您可以从 LocalEndPoint 中提取此信息。
    Console.WriteLine (""I am connected on port number " + ((IPEndPoint)s.LocalEndPoint).Port.ToString ()); 更多信息在这里:https ://msdn.microsoft.com/en-us/library/system.net.sockets.socket.localendpoint(v=vs.110).aspx

  3. 这是 NAT(网络地址转换)的固有问题 - 解决它的唯一方法是专门配置 R 以将您的流量端口转发回 A。