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