2011-09-22 78 views
2

我有一个很大的1GB文件,我试图发送到另一个节点。在发送者发送200个数据包(在发送完整文件之前)之后,代码跳出。说“Sendto no send space available”。可能是什么问题以及如何照顾它。通过UDP套接字发送的限制

除此之外,我们需要在此传输中获得最大吞吐量。那么我们应该使用哪种发送缓冲区大小来提高效率?

什么是我们可以用来传输文件而没有碎片的最大MTU?

感谢 日图


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

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

我正在emulab环境中运行整个设置,名为deter。我将链路丢失设置为0,但仍然有一些数据包丢失。这背后可能的原因是什么?即使我在发送每个数据包之后添加延迟(假设接收方在缓冲区满时丢弃数据包),仍然会丢失数据包。

+0

需要更多细节。套接字是否无阻塞? –

+5

我认为TCP将是文件传输的更好选择。你有使用UDP的理由吗?如果是这样,你有什么样的纠错? – feathj

回答

2

也同意@jonfen。没有用于高速文件传输的UDP。

UDP会产生较少的协议开销。但是,在最大传输速率下,传输错误是不可避免的(如丢包)。所以必须引入TCP一样的纠错方案。最终结果低于TCP性能。

5

使用UDP进行高速数据传输是可能的,但是您必须确保不将数据发送出去的速度比网卡能够将其传输到网络上的速度要快。在实践中,这意味着要么使用阻塞I/O,要么在select()上阻塞,而在select()时只发送下一个数据包表示套接字已准备好写入。 (理想情况下,您也不会发送数据的速度超过接收设备可以接收数据的速度,但现代CPU速度通常比现代网络I/O速度快得多),但这不是什么问题

一旦您有该逻辑工作正常,发送缓冲区的大小并不是非常重要。 (也就是说,你的发送缓冲区永远不会占用1GB的文件,所以确保你的程序不会溢出发送缓冲区是发送缓冲区是大还是小的关键问题)接收缓冲区的大小打开接收器很重要,尽管...最好尽可能地做到这一点,因此如果接收过程被另一个程序从CPU中断开,接收计算机不会丢弃数据包。

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