TCP的状态变迁图,做个记录,以待查阅。
[img]http://dl.iteye.com/upload/attachment/369228/d17f0943-a88b-35d8-a6d3-31e5397a6e13.jpg[/img]
这个图中所说的服务器和客户其实是相对来说的,也就是说TCP的两端都既可以是服务器也可以是客户端,图中所说的只不过是作为服务器和客户端的时候正常的状态变迁。一端如果主动发起了一个动作,那么这一端就可以被理解为服务器,另外一端就被理解为客户端。
两个导致进入ESTABLISHED状态的变迁对应打开一个连接,两个导致从ESTABLISHED状态离开的变迁对应关闭一个连接。ESTABLISHED状态时连接双方能够进行双向数据传递的状态。(TCP是全双工的)CLOSE状态不是一个真正的状态,而是这个状态图的假想的起始点和终点。
从LISTEN到SYN_SENT的变迁是正确的,但是有一些TCP的实现却并不支持这种状态的变迁(例如伯克利版本的TCP实现)。
只有当SYN_RCVD状态时从LISTEN状态(正常情况)进入,而不是从SYN_SENT状态(同时打开)进入时,从SYN_RCVD回到LISTEN的状态变迁才是合法的。这意味着如果我们执行被动打开(进入LISTEN),收到一个SYN,发送一个带ACK的SYN(进入SYN_RCVD),然后收到的是一个RST(复位报文段),而不是一个ACK,便又会回到LISTEN状态并等待一个另一个连接请求的到来。
TIME_WAIT状态也称为2MSL等待状态。每个具体的TCP实现必须选择一个报文段最大生存时间MSL(max segment lifetime)。它是任何报文段被丢弃前在网络中的最长时间。我们知道这个时间是有限的,因为TCP报文段以IP数据报在网络内传输,而IP数据报则有限制其生存时间的TTL字段。
对于一个具体实现所给定的MSL值,处理原则是:当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL。这样做是为了防止对收到的FIN作出应答的ACK由于某种原因没有到达接收端,等待这个时间可以保证能够接收到另一端超时重发的FIN。如果在这段时间内收到了另一端超时重发的FIN,那么就会重新新发送一个ACK作为应答。
[img]http://dl.iteye.com/upload/attachment/369228/d17f0943-a88b-35d8-a6d3-31e5397a6e13.jpg[/img]
这个图中所说的服务器和客户其实是相对来说的,也就是说TCP的两端都既可以是服务器也可以是客户端,图中所说的只不过是作为服务器和客户端的时候正常的状态变迁。一端如果主动发起了一个动作,那么这一端就可以被理解为服务器,另外一端就被理解为客户端。
两个导致进入ESTABLISHED状态的变迁对应打开一个连接,两个导致从ESTABLISHED状态离开的变迁对应关闭一个连接。ESTABLISHED状态时连接双方能够进行双向数据传递的状态。(TCP是全双工的)CLOSE状态不是一个真正的状态,而是这个状态图的假想的起始点和终点。
从LISTEN到SYN_SENT的变迁是正确的,但是有一些TCP的实现却并不支持这种状态的变迁(例如伯克利版本的TCP实现)。
只有当SYN_RCVD状态时从LISTEN状态(正常情况)进入,而不是从SYN_SENT状态(同时打开)进入时,从SYN_RCVD回到LISTEN的状态变迁才是合法的。这意味着如果我们执行被动打开(进入LISTEN),收到一个SYN,发送一个带ACK的SYN(进入SYN_RCVD),然后收到的是一个RST(复位报文段),而不是一个ACK,便又会回到LISTEN状态并等待一个另一个连接请求的到来。
TIME_WAIT状态也称为2MSL等待状态。每个具体的TCP实现必须选择一个报文段最大生存时间MSL(max segment lifetime)。它是任何报文段被丢弃前在网络中的最长时间。我们知道这个时间是有限的,因为TCP报文段以IP数据报在网络内传输,而IP数据报则有限制其生存时间的TTL字段。
对于一个具体实现所给定的MSL值,处理原则是:当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL。这样做是为了防止对收到的FIN作出应答的ACK由于某种原因没有到达接收端,等待这个时间可以保证能够接收到另一端超时重发的FIN。如果在这段时间内收到了另一端超时重发的FIN,那么就会重新新发送一个ACK作为应答。