通过UDP套接字发送的限制

Rit*_*ain 2 c++ udp

我有一个大的1GB文件,我试图发送到另一个节点.发送方发送200个数据包(发送完整文件之前)后,代码跳出.说"Sendto没有可用的发送空间".可能是什么问题以及如何处理它.

除此之外,我们需要在此次转移中获得最大吞吐量.那么我们应该使用什么来发送缓冲区大小才能有效?

在没有碎片的情况下,我们可以使用什么来传输文件的最大MTU?

谢谢Ritu


谢谢你的答案.实际上,我们的项目指定使用UDP,然后使用一些额外的代码来处理丢失的数据包.

现在我可以使用阻塞UDP套接字发送完整文件.

我在类似环境的emulab上运行整个设置,称为deter.我已将链路丢失设置为0,但仍有一些数据包丢失.可能背后的原因是什么?即使我在发送每个数据包后添加延迟(假设接收器在其缓冲区已满时丢弃数据包),但此数据包丢失仍然存在.

Jer*_*ner 5

可以使用UDP进行高速数据传输,但是您必须确保不要将数据发送()比网卡将其输送到线路上的速度快.在实践中,这意味着要么使用阻塞I/O,要么阻塞select(),并且只有当select()指示套接字已准备好写入时才发送下一个数据包.(理想情况下,您也不会比接收机器接收数据更快地发送数据,但这些日子不是问题,因为现代CPU速度通常比现代网络I/O速度快得多)

一旦你的逻辑正常工作,发送缓冲区的大小就不是非常重要.(即你的发送缓冲区永远不会大到足以保存1GB文件,因此确保程序不会溢出发送缓冲区是发送缓冲区是大还是小的关键问题)接收缓冲区的大小虽然接收器很重要,但最好尽量使其尽可能大,因此如果接收进程被另一个程序从CPU中移除,接收计算机将不会丢弃数据包.

关于MTU,如果你想避免数据包碎片(并假设你的数据包通过以太网传输),那么你不应该在每个UDP数据包中放置超过1468个字节(如果你使用IPv6,则不应该放置1452个字节).(通过从以太网的1500字节帧大小中减去必要的IP和UDP报头的大小来计算)