FIN_WAIT_2状态
- 在FIN_WAIT_2状态,某TCP通信端已发送一个FIN并已得到另一端的确认。除非出现半关闭的情况,否则该TCP端将会等待另一端的应用识别出自己已接收到一个文件末尾的通知并关闭这一端引发发送FIN的连接。只有当应用程序已完成了这一关闭操作(它的FIN已经被接收),正在关闭的TCP连接才会从FIN_WAIT_2状态转移到TIME_WAIT状态。这同时意味着连接的一端能够依然永远保持这种状态,另一端也会依然处于CLOSE_WAIT状态,并且能够永远维持这一状态直到应用程序决定宣布它的关闭。
- 目前有许多办法都可以防止连接进入FIN_WAIT_2这一无限等待状态:如果负责主动关闭的应用程序执行的是一个完全关闭的操作,而不是用一个半关闭来指明它还期望接收数据,那么就会设置一个计时器。如果计时器超时的时候,连接依然是空闲的,那TCP连接就会到CLOSED状态。在Linux系统中,可以通过调整变量net.ipv4.tcp_fin_timeout的数值来设置计时器的秒数。它的默认值是60S。
重置报文段
当发现一个到达的报文段对于相关连接而言是不正确的时候,TCP就会发送一个重置报文段。重置报文段通常会导致TCP连接的快速拆卸。
半开连接
如果在未告知另一端的情况下通信的一端关闭或终止连接,那么就认为该TCP连接处于半开状态。这通常发生在通信的一方的主机崩溃的情况下。只要不尝试通过半开连接传输数据,正常工作的一端将不会检测出另一端已经崩溃(可以利用TCP的keepalive选项发现另一端已经消失)如果通过半开连接传输数据,TCP规定接收者将回复一个重置报文段。
时间等待错误
设计TIME_WAIT状态的目的是允许任何受制于一条关闭连接的数据报被丢弃。在这段时期,等待的TCP通常不需要做任何操作,它只需要维持当前状态直到2MSL的计时结束。然而,如果在这段时间内收到来自于这条连接的一些报文段,或者是重置报文段,这种情况被称作时间等待错误。这会使客户端过早地从TIME_WAIT状态转移至CLOSED状态。许多系统规定当处于TIME_WAIT状态时不对重置报文段做出反应。
TCP保活机制
在一条空闲的TCP连接中不会有任何数据交换。TCP保活机制是一种在不影响数据流内容的情况下探测对方的方式。它是由一个保活计时器实现的。当计时器被激发,连接的一端将发送一个保活探测报文,另一端接收报文的同时会发送一个ACK作为响应。探测及其响应报文都不包含任何新的有效数据,当它们丢失时也不会进行重传。保活功能默认情况下是关闭的。保活功能可以被设置在连接的一端、两端,或者两端都没有。
TCP保活机制主要是为了:
-
客户端和服务器需要了解什么时候终止进程或者与对方断开连接
-
在一些情况下,虽然应用进程之间没有数据交换,全仍然需要通过连接保持一个最小的数据流。
保活机制可能会导致一个好的连接由于两端系统之间网络的短暂断开而终止。保活功能一般是为服务器应用程序提供的,服务器应用程序希望知道客户主机是否崩溃或离开,从而决定是否为客户端绑定资源。一般用于非交互性应用进行短时间的对话,如Web服务器。而更多的实现长时间交互服务的服务器可能不希望保活功能,如ssh