当后者(客户端)处于 TCP FIN-WAIT-1 状态时,服务器向客户端发送数据包会发生什么?

当后者(客户端)处于 TCP FIN-WAIT-1 状态时,服务器向客户端发送数据包会发生什么?

根据TCP/IP 指南当客户端关闭 TCP 会话时,它将发送一个数据包,其中包含设置为服务器并转换到FIN-WAIT-1,但它说:

在这种状态下,客户端仍然可以从服务器接收数据,但不再接受从其本地应用程序发送到服务器的数据。

所以,我的问题是,如果服务器将数据发送回客户端,会发生什么?由于应用程序可能已经关闭,或者不再处于可以从套接字读取的状态,数据将去哪里?此外,客户端是否会发送确认返回该数据?那么连接会发生什么?(恢复时间或许?)

注意:我不关心这些数据,我只是想知道在没有进程从 TCP 缓冲区读取的情况下是否存在内存泄漏,或者网络堆栈本身是否会处理这个问题。

谢谢。

答案1

由于应用程序可能已经关闭或者不再处于可以从套接字读取的状态,那么数据要去哪里呢?

它依赖于实现。如果套接字在应用程序端关闭,则 TCP 堆栈可以将传入的数据丢弃在底层。或者,您可以有一个实现,close在收到服务器的 FIN 之前不从 () 调用(或等效调用)返回,从而允许另一个线程继续read从套接字 ()(尽管write() 会收到错误)。如果read() 在服务器的 FIN 到达之前没有完成,则可以发出 EOF 信号。(在异步模型中将“线程”替换为“回调”)。

回答问题的最佳方式:在您喜欢的实现上进行测试。

相关内容