简单的重现 - 在一个窗口中观察顶部的进程,在另一个窗口中运行:nc -lkp 10000 > /dev/null & ( head -50000000 /dev/urandom | nc -N 127.0.0.1 10000 ) & ( head -50000000 /dev/urandom | nc -N 127.0.0.1 10000 )
请注意,只有一个head进程nc正在主动使用 CPU。
将 strace 附加到head不活动的 - 看到它在写入时停止,例如:
strace: Process 589084 attached
write(1, "\264\347\270\26\27\24'BRb^\353\302\36@\216\17V\210*n\252`\353\330\351\276\2\250\330\350\217"..., 4096^Cstrace: Process 589084 detached
<detached ...>
Run Code Online (Sandbox Code Playgroud)
在不同的端口上设置两个侦听器 - 例如 10000 和 10001,并且两者都全速运行。
这是一个简单的示例,但我可以使用其他输入和输出来重现它 - 例如 zcatting 大文件并通过网络将它们发送到生产服务。这与输入无关,也与监听套接字无关。
那么 - 为什么我只能有一个 tcp 连接到任何给定的主动发送数据的主机/端口?
有一个独立的数据源(如果您不相信我,请随意实验),以及一个打开自己的 TCP 连接的独立进程(netstat将显示它们都打开) - 唯一的共同点是目的地(它不必须nc倾听 …