TCP写入的连接时间(netstat显示为ESTABLISHED)

ren*_*ish 3 c sockets networking timeout tcp

我做了一个实验:
服务器侦听端口8804接受客户端的连接,然后无限地向客户端发送数据.我关闭了网络.

  1. 当我运行netstat -anotp | grep 8804,它表明服务器和客户端上的连接都是"ESTABLISHED",但是没有数据传输.
  2. 一段时间后,服务器抛出一个错误:"连接超时"
  3. netstat -anotp | grep 8804,发现客户端仍然"ESTABLISHED"

所以:
1.为什么在系统上阻塞的服务器调用"write"会抛出"Connection timeout"错误.为什么不是客户?
2.如何让客户端找到连接实际上是关闭的.
3.当网络不起作用时,为什么服务器和客户端的状态都"已建立"?

感谢您的回答 !

Mik*_*ton 6

  1. 您的服务器期望它发送给客户端的各个数据段的TCP ACK; 但是,客户端不知道服务器的数据有多长.由于您关闭网络,服务器不再从客户端获取ACK.结果:服务器上的连接超时(请参阅注释1)
  2. 在套接字上使用TCP Keepalive(参见注释2)
  3. 您尚未启用TCP Keepalive.如果您使用的是python,则可以这样做(假设您的套接字已命名s):
# Do this before you accept() anything on the socket
s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
Run Code Online (Sandbox Code Playgroud)

编辑:
因为您正在使用C,所以指向Linux TCP Keepalive Howto的链接

注意
1. RFC 1122:第4.2.3.5节"TCP连接失败"
2. RFC 1122:第4.2.3.6节"TCP Keepalive"