TCP写入连接超时(netstat显示已建立)

3
我进行了一个实验:
一个服务器在8804端口监听客户端连接,然后无休止地向客户端发送数据。我关闭了网络连接。
  1. 当我运行netstat -anotp | grep 8804时,它显示连接在服务器和客户端上都是“已建立”,但没有数据传输。
  2. 过了一会儿,服务器抛出一个错误:“连接超时”。
  3. netstat -anotp | grep 8804发现客户端仍处于“已建立”状态。
所以:
1.为什么被系统调用“write”阻塞的服务器会抛出“连接超时”错误?为什么不是客户端?
2.如何让客户端发现连接实际上已经关闭。
3.为什么当网络不工作时,服务器和客户端的状态都是“已建立”?
感谢您的回答!

1
你在哪种编程语言中遇到了这个问题? - Mike Pennington
1个回答

6
  1. 您的服务器期望接收到客户端发送的TCP ACK来确认每个数据段是否成功送达客户端;但是,客户端不知道服务器数据的长度。由于您断开了网络连接,服务器无法再从客户端获取ACK。结果:服务器连接超时(请参见注释1)。
  2. 在您的套接字上使用TCP Keepalives(请参见注释2)。
  3. 您尚未启用TCP Keepalives。如果您正在使用Python,则可以像这样启用(假设您的套接字命名为s):
# Do this before you accept() anything on the socket
s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)

编辑:
由于您正在使用C语言,此处提供Linux TCP Keepalives Howto的链接。

注意事项:

  1. RFC 1122:第4.2.3.5节“TCP连接失败”
  2. RFC 1122:第4.2.3.6节“TCP Keepalives”

Mike,+1 但是“客户端不知道服务器数据的长度”具体是什么意思? - user207421
1
@EJP,谢谢...我指出当他的服务器向客户端发起“无限”的数据传输时,它被动地必须等待来自服务器的EOF,如果没有一些保持活动机制,它会等待很长时间。有了保持活动机制,就可以限制它等待下一个段或EOF的时间。我肯定可以在上面更好地解释它。 - Mike Pennington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接