使用UDP传输使用netcat丢弃数据包?

时间:2016-06-09 14:36:59

标签: linux sockets networking udp netcat

我正在通过万兆以太网电缆和带有Linux传输的netcat在两台UDP计算机之间发送大型数据文件,但似乎遇到了问题。

经过多次测试后,我得出的结论是netcat是个问题。我已使用UDP],[UDT][1 2以及[Tsunami-UDP]转移对Python UDT转移进行了测试,所有这些转移都没有任何丢包问题。

在服务器端,我们一直在做:

cat "bigfile.txt" | pv | nc -u IP PORT

然后在客户端,我们一直在做:

nc -u -l PORT > "outputFile.txt"

我们注意到的一些事情:

  1. 在其中一台计算机上,无论是客户端还是服务器,它都只是“挂起”。也就是说,即使传输完成,Linux也不会终止进程并移动到终端中的下一行。
  2. 如果我们在接收端运行管道视图,则传入数据速率明显低于发送方认为发送的数据速率。
  3. 正在运行Wireshark并不会显示任何数据包丢失。
  4. Linux中运行系统性能监视器显示传入数据速率(对于接收方)与来自发送方的传出数据速率相同。这与管道视图所认为的相反(参见#2)
  5. 我们不确定netcat的问题在哪里,如果有办法解决它。任何帮助/见解将不胜感激。

    另外,对于它的价值,使用带有TCP转移的netcat可以正常工作。并且,我确实理解UDP对于可靠性并不知道,并且应该预期丢包,但它是我们必须使用的协议。

    由于

3 个答案:

答案 0 :(得分:3)

很可能发送实例正在为接收实例发送数据太快。请注意,即使您看到接收NIC上没有丢弃(如您所说),也会发生这种情况,因为丢失可能发生在操作系统级别。您的操作系统可能会溢出UDP缓冲区。运行此命令:

watch -d "cat /proc/net/snmp | grep -w Udp" 

在您的文件传输过程中查看您的RcvbufErrors字段是否为非零和/或正在增长。

答案 1 :(得分:1)

这个答案(How to send only one UDP packet with netcat?)表示nc每行发送一个数据包。假设这是真的,这可能会导致数据包的数量明显高于其他传输机制。据推测,正如@Smeeheey建议的那样,接收端的接收缓冲区用完了。

要使发送端退出,可以将-q 1添加到命令行(在看到文件结束后1秒退出)。

但接收端nc无法知道传输何时完成。这就是为什么这些其他机制是“协议” - 它们内置了机制来传递文件的边界。原始UDP没有文件结尾的概念。

答案 2 :(得分:0)

调整Linux网络堆栈有点复杂,因为需要调整许多组件来确定数据被丢弃的位置。

如果可行/可行,我建议您首先监控整个网络堆栈中的数据包丢弃。完成后,您可以确定丢弃数据包的确切位置,然后根据需要调整调整参数。有很多不同的文件可以用很多不同的字段来衡量。我写了一篇关于监控和调优Linux网络堆栈的每个组件的detailed blog post从上到下。总结那里的所有信息有点困难,但看一看,我认为它可以帮助指导你。