【发布时间】:2011-06-16 19:50:33
【问题描述】:
这里的场景: 在 solaris 上运行 TCP 服务器,在 Linux 上运行 TCP 客户端。客户端连接并开始发送数据。客户端停止发送数据,并且在 N 秒不活动后,服务器发送一个 FIN、ACK(可能来自发送管道上的关闭调用)。客户端再次开始发送数据。服务器吓坏了,开始发送一堆没有设置其他标志的 RST 数据包。第一个数据包丢失,他们再次握手。发送永远不会返回错误,并且一个数据包会默默丢失。
任何想法为什么 RST 没有被传播到客户端?
【问题讨论】:
-
客户端上的
tcpdump+ 客户端上的strace将有助于诊断。根据您的描述,客户端似乎忽略了错误并在超时后重新连接。 -
除非客户端再次调用
connect(),否则内核不会再次握手。 -
我没有看到发送错误并重新连接。但现在我是,所以我愿意承认错误,直到我发现不是这样。谢谢。
-
这里没有证据表明 RST 没有传播到客户端。客户更有可能只是忽略了
send()错误。