当前位置:  开发笔记 > 前端 > 正文

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

如何解决《UDPsendto()块什么时候阻止?》经验,为你挑选了2个好方法。

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

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



1> MarcH..:

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

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


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

2> mj_..:

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

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

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

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


当IP数据包熄灭时,它需要远程主机的IP地址和**下一跳的MAC地址**...
推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有