繁体   English   中英

当接收缓冲区快满时,阻止UDP数据包被部分切断

[英]Stopping UDP packets from being partially chopped off when receive buffer is almost full

我正在努力用C ++实现滑动窗口协议以进行分配。 我正在使用UDP(SOCK_DGRAM)套接字。 有时,程序必须背对背发送大量数据包(与窗口大小一样大)。 到目前为止,我还没有将窗口大小增加到超过30,但是最终应该可以达到256。 数据包大小必须从用户输入中获取,因此可以是任何合理的值。 当数据包大小较小(例如512字节)时,就没有问题。 当数据包较大时(例如40KB),前几个数据包将被正确读取,然后我的readNBytes()函数在仅读取其中一部分后突然挂在其中一个上。 我假设操作系统的接收缓冲区已满,并且其中一个数据包的一部分已被丢弃。 读取将其放入缓冲区的部分,然后readNBytes()等待其余部分,该部分已被OS丢弃。

发生这种情况时,操作系统是否设置了供我读取的标志? 理想情况下,如果不适合接收缓冲区,我想强迫OS丢弃整个数据包,而不仅仅是丢弃一部分。 IP_DONTFRAG没有在我的系统上定义,所以我不知道该怎么做。 我还想办法使接收缓冲区的大小是数据包大小的倍数,以使数据包不能部分放入缓冲区。 解决此问题的最佳方法是什么?

如果您的recv()缓冲区对于数据报而言太小,它将被截断。 它不会引起阻塞。

您的数据报太大了。 IPv4限制为65507字节,但通常接受的实际限制为534字节。 您当然应该将它们保持在MTU路径之内,否则您将保证碎片化,这只会增加数据报丢失的机会。

操作系统不会将一半数据包传递给应用程序。

IP负责在发送端处理分段,IP数据包最多可以达到64K,并且将被IP分段以适合基础层的MTU。

在接收端,相反的情况发生了,重新组装。 使用UDP,您要么收到整个数据包,要么什么也收不到。 仅接收其中一部分的唯一原因可能是您的应用程序接收缓冲区很小。 即使已收到所有内容,一些套接字实现也会将其砍掉

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM