18

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

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

如果DatagramSocket.send(DatagramPacket)实际上没有阻塞并且我不会使用已连接DatagramSocket并仅绑定到一个端口,那么将非阻塞模式与DatagramChanneland一起使用没有优势Selector吗?

4

3 回答 3

17

使用Java的DatagramSockets、Channels等已经有一段时间了,但我仍然可以给你一些帮助。

UDP 协议不像 TCP 那样建立连接。相反,它只是发送数据并忘记它。如果确保数据实际到达那里很重要,那是客户的责任。因此,即使您处于阻塞模式,您的发送操作也只会在刷新缓冲区所需的时间内阻塞。由于 UDP 对网络一无所知,它会尽早将其写出,而不检查网络速度或它是否真的到达了它应该去的地方。因此,对您而言,通道似乎实际上已准备好进行更多发送。

于 2009-02-20T13:48:40.970 回答
10

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

UDP也不保证

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

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

关于 UDP 的一个棘手的事情是它大部分时间都可以工作,但有时会以非常难以重现的方式严重失败。出于这个原因,即使您进行了一些测试并且它似乎有效,您也不应该假设可靠性。

于 2009-02-20T21:10:41.233 回答
0

非阻塞 UDP 在接收端最有用。数据包发送只能因本地情况而延迟:本地流量整形工具(如“游戏网卡”)将游戏流量优先于其他流量源,或者网卡过载(这不太可能发生)可能会延迟数据包的发送。一旦退出系统。一旦数据包离开本地接口,它就不再是应用程序的关注点了。

于 2013-04-10T09:07:11.863 回答