我正在通过万兆以太网电缆和带有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"
我们注意到的一些事情:
Linux
也不会终止进程并移动到终端中的下一行。Wireshark
并不会显示任何数据包丢失。Linux
中运行系统性能监视器显示传入数据速率(对于接收方)与来自发送方的传出数据速率相同。这与管道视图所认为的相反(参见#2)我们不确定netcat的问题在哪里,如果有办法解决它。任何帮助/见解将不胜感激。
另外,对于它的价值,使用带有TCP
转移的netcat可以正常工作。并且,我确实理解UDP
对于可靠性并不知道,并且应该预期丢包,但它是我们必须使用的协议。
由于
答案 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从上到下。总结那里的所有信息有点困难,但看一看,我认为它可以帮助指导你。