UDP sendto()块什么时候阻止?

Joc*_*nde 25 udp network-programming blocking

在UDP套接字上使用默认(阻塞)行为时,在这种情况下会调用sendto()块吗?我主要对Linux行为感兴趣.

对于TCP我明白,如果发送窗口已满,拥塞控制会使send()调用阻塞,但UDP呢?它有时会阻塞,还是让数据包在较低层被丢弃?

Mar*_*rcH 16

如果您填充了套接字缓冲区,则会发生这种情况,但它依赖于高度操作系统.由于UDP没有提供任何保证,当您的套接字缓冲区已满时,您的操作系统可以决定执行任何操作:阻塞或丢弃.您可以尝试增加SO_SNDBUF以暂时缓解.

这甚至可以取决于系统的微调,例如它还取决于网络接口驱动程序中TX环的大小.在iperf邮件列表中有一些关于此的讨论,但您真的想与您的操作系统开发人员讨论这个问题.

  • 好了,但是现在问题又向前推了一步:Linux在哪些条件下让套接字缓冲区填满?(而不是丢弃数据包).遗憾的是,这是一个非常困难的问题. (3认同)
  • 好的,按照您的链接,我在[此主题](http://www.mail-archive.com/iperf-users@lists.sourceforge.net/msg00113.html)上找到了特定于Linux的说明.如此简短的简答:_Linux在完整的发送缓冲区上阻止发送. (2认同)

mj_*_*mj_ 9

这可能是因为您的操作系统正在尝试执行ARP请求以获取远程主机的硬件地址.

基本上,无论何时数据包熄灭,标头都需要远程主机的IP地址和远程主机的MAC地址.192.168.1.34和AB:32:24:64:F3:21.

您的"阻止"行为可能是ARP正在运行.

我听说在旧版本的Windows(我认为是2k)中,如果请求耗时太长并且您发送的数据过多,则第一个数据包有时会被丢弃.从那时起,服务包可能已经修复了.

  • 当IP数据包熄灭时,它需要远程主机的IP地址和**下一跳的MAC地址**... (3认同)