2010-11-12 78 views
21

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

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

回答

14

如果您填充了套接字缓冲区,可能会发生这种情况,但它是依赖于高度依赖操作系统的。由于UDP不提供任何保证,当您的套接字缓冲区已满时,您的操作系统可以决定做任何事情:阻止或放弃。您可以尝试增加SO_SNDBUF以暂时缓解。

这甚至可能取决于系统的微调,例如它也可能取决于网络接口驱动程序中TX环的大小。在iperf mailing list中有一些关于此的讨论,但您真的想与您的操作系统的开发人员讨论此问题。

+1

好吧,下面你的链接,我找到了关于[这个线程]的linux特定解释(http://www.mail-archive.com/[email protected]/msg00113.html)。所以简短的回答:_Linux在完整的发送缓冲区_上阻塞sendto。 – 2010-11-12 15:11:25

+2

好的,但是现在这个问题被推进了一步:在哪种情况下,Linux会让套接字缓冲区填满? (而不是丢弃数据包)。这不幸是一个非常困难的问题。 – MarcH 2010-11-12 16:16:41

+0

@MarcH,怎么样recv,当套接字被阻塞时发送?我认为在这种情况下,发送和recv会阻止呢? – Bionix1441 2018-02-05 13:08:38

9

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

基本上每当一个数据包出去时,标题需要远程主机的IP地址和远程主机的MAC地址。 192.168.1.34和AB:32:24:64:F3:21。

您的“阻止”行为可能是ARP正在工作。

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

+0

好的,很好的回答元素,有趣;但我感兴趣的主要是与拥塞/满缓冲有关的阻塞(或阻塞)。 – 2010-11-12 14:27:50

+0

ARP仅用于在同一子网上定位主机 - 通常是路由器。并且结果被缓存用于随后的发送。 – selbie 2011-09-17 01:29:09

+2

当IP数据包熄灭时,它需要远程主机的IP地址以及**下一跳的MAC地址** ... – 2012-08-13 03:30:26