在UDP套接字上使用默认(阻塞)行为时,在这种情况下会调用sendto()块吗?我主要对Linux行为感兴趣。
对于TCP我明白,如果发送窗口已满,拥塞控制会使send()调用阻塞,但UDP呢?它有时会阻塞,或者只是让数据包在较低层被丢弃吗?
答案 0 :(得分:16)
如果您填充了套接字缓冲区,但它是高度依赖于操作系统的,则会发生这种情况。由于UDP没有提供任何保证,当您的套接字缓冲区已满时,您的操作系统可以决定执行任何操作:阻塞或丢弃。您可以尝试增加SO_SNDBUF以暂时缓解。
这甚至可以取决于系统的微调,例如它还取决于网络接口驱动程序中TX环的大小。在iperf mailing list中有一些关于此的讨论,但您真的想与操作系统的开发人员讨论这个问题。
答案 1 :(得分:9)
这可能是因为您的操作系统正在尝试执行ARP请求以获取远程主机的硬件地址。
基本上每当数据包熄灭时,标头都需要远程主机的IP地址和远程主机的MAC地址。 192.168.1.34和AB:32:24:64:F3:21。
您的“阻止”行为可能是ARP正在运行。
我听说过旧版本的Windows(我认为是2k),如果请求耗时太长并且发送的数据过多,第一个数据包有时会被丢弃。从那时起,服务包可能已经修复了。