非阻塞 TCP/IP SocketChannelSelector NIO 帮助我用少量线程处理许多 TCP/IP 连接。但是 UDP 怎么样? DatagramChannels?(我必须承认我对UDP不是很熟悉。)

UDP 发送操作似乎不会阻塞,即使 DatagramChannel 未在阻塞模式下运行。真的有这样的情况吗 DatagramSocket.send(DatagramPacket) 由于拥塞或类似原因而阻塞?我真的很好奇是否存在这种情况以及生产环境中存在哪些可能的情况。

如果 DatagramSocket.send(DatagramPacket) 实际上并没有阻止,我不会使用连接的 DatagramSocket 并且仅绑定到一个端口,使用非阻塞模式是否没有优势 DatagramChannelSelector?

有帮助吗?

解决方案

这已经有一段时间,因为我用Java的DatagramSockets,渠道之类的,但我仍然可以给你一些帮助。

像TCP所做的UDP协议不建立连接。相反,它只是发送数据,而忘记了。如果确保数据实际获取那里是重要的,这是客户的责任。因此,即使你在阻塞模式,您的发送操作将只阻止只要它采取了刷新缓冲区。由于UDP不知道网络的东西,它会写出来尽早而不检查网络速度或者如果它实际获取到它应该走了。因此,为了你,它看起来好像通道实际上是立即准备更多的发送。

其他提示

UDP 不会阻止(它仅在将数据传输到操作系统时阻止) 这意味着,如果下一跳/交换机/计算机在任何时候无法缓冲 UDP 数据包,它就会丢弃它。在某些情况下,这可能是理想的行为。但这是您需要注意的事情。

UDP 也不保证

  • 按照发送数据包的顺序发送数据包。
  • 不要分解大数据包。
  • 跨交换机转发数据包。通常交换机之间的 UDP 转发是关闭的。

然而,UDP 确实支持多播,因此可以将相同的数据包传送到一台或多台主机。然而,发送者不知道是否有人收到数据包。

UDP 的一个棘手问题是它在大多数情况下都能工作,但有时会以难以重现的方式严重失败。因此,即使您做了一些测试并且看起来有效,您也不应该假设可靠性。

非阻塞UDP是在接收侧最有用。 发送报文只能被延误的原因是当地的情况:本地流量整形工具,如“游戏网卡”,超过其他流量来源的优先级游戏业务,或超载的网络卡(这是不可能发生的),可以延迟数据包的发送。一旦从系统中。一旦包离开本地接口,它不再是应用的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top