我试图设置iptables导致docker容器之间的现实networking故障。 在服务器上,我运行netcat -lk 1234和一个Erlang牛仔服务器。 在客户端上运行客户端:
echo blah | netcat myserver 1234 curl myserver/xyz 最初,这些工作正常,有客户端 – 服务器通信的证据。 接下来,我在客户端的OUTPUT上引入iptables DROP规则。
iptables -A OUTPUT -j DROP echo blah | netcat myserver 1234 curl myserver/xyz netcat和curl通信都没有通过, 直到我删除了DROP规则,在这一点上他们无缝地恢复!
最后,我重复上述,但在删除DROP规则之前,我ctrl-c客户端可执行文件。 删除DROP规则后,我发现服务器没有收到客户请求。
我的结论是netat / curl客户端必须试图无限期地重新传输? 我不应该最终期望失败吗? 顺便说一句,同样的事情发生在与其他客户,例如。 Erlang http / websocket_client。
是的,TCP尝试通过不可靠的networkingbuild立可靠的连接,所以它能够承受一定程度的数据包丢失。 发送者将不断地重试发送它的数据,直到它从接收者那里得到一个ACK,或者直到它超时并且决定连接丢失。
根据这篇文章 ,在Linux上,发送数据的默认超时时间刚刚超过2分钟。
(如果两个端点都没有发送数据,除非它们被configuration为发送TCP保持活动消息,否则它们可能根本不会发现连接中断,但TCP保持活动消息默认情况下是在静止2小时后发送的。