为什么TCP服务器会在接受连接后立即发送FIN?

Jay*_*Jay 5 tcp

从ethreal数据包捕获中,我看到以下对我来说很奇怪的行为:

Client --> Server  [SYN]
Server --> Client  [SYN, ACK]
Client --> Server  [ACK]
Server --> Client  [FIN, ACK]
Client --> Server  [ACK]
Client --> Server  [TCP Segment of a reassembled PDU] (I don't know what this means)
Server --> Client  [RST]
Run Code Online (Sandbox Code Playgroud)

关于为什么会发生这种情况的任何想法?

此外,服务器端口是6000.这会导致任何问题吗?

我的另一个疑问:

  1. 为什么有FIN,ACK?不应该只是FIN吗?该消息中ACK的含义是什么?
  2. 客户也不应该有FIN吗?

编辑:经过一些分析后,我发现文件描述符的数量是否已超过限制,然后服务器发送FIN.但是,在这种情况下,文件描述符似乎没有超出限制.对于其他情况,这会发生什么?

Jay*_*Jay 12

经过深入分析,发现以下问题是:

当客户端尝试TCP连接时,即使服务器当前没有调用accept,连接也会通过.如果服务器调用了"listen"函数并且它将继续接受连接直到达到积压限制,则会发生这种情况.

但是,如果应用程序进程超出了它可以使用的最大文件描述符的限制,那么当服务器调用接受时,它会意识到没有可用于为套接字分配的文件描述符并且无法接受调用和TCP连接发送FIN到另一边.

我只是在这里发布这个发现.我仍然把接受的答案留给了哈比的答案.

感谢所有回答这个问题的人.


Hab*_*bie 5

FIN通常表示shutdown(..)在套接字上调用的另一侧。