gpt4 book ai didi

TCP 写入连接超时(netstat 显示 ESTABLISHED)

转载 作者:可可西里 更新时间:2023-11-01 02:33:34 30 4
gpt4 key购买 nike

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

  1. 当我运行 netstat -anotp | grep 8804 ,显示服务器和客户端的连接都是“ESTABLISHED”,但是没有数据传输。
  2. 一段时间后,服务器抛出一个错误:“连接超时”
  3. netstat -anotp | grep 8804,发现客户端还是“ESTABLISHED”

所以:
1. 为什么阻塞在系统调用“write”上的服务器抛出“连接超时”错误。为什么不是客户端?
2. 如何让客户端发现连接实际上已经关闭了。
3、为什么网络不通时服务器和客户端的状态都是“ESTABLISHED”?

感谢您的回答!

最佳答案

  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)

编辑:
由于您使用的是 C,因此链接到 Linux TCP Keepalives Howto

注意事项

  1. RFC 1122: Section 4.2.3.5 "TCP Connection Failures"
  2. RFC 1122: Section 4.2.3.6 "TCP Keepalives"

关于TCP 写入连接超时(netstat 显示 ESTABLISHED),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7874193/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com