10.3.5 TCP连接的状态转移
从表10-6中可以看出,TCP Socket服务原语只有8个,比OSI/RM中定义的传输层服务原语还要少,但是在这8种TCP Socket服务原语中,有的原语又可以有不同的状态,如表10-8所示。我们把在TCP传输连接的建立和释放中的通信双方主机的这些状态称之为“有限状态机”(Finite State Machine,FSM)。下面我们来具体阐述一下在TCP传输连接建立、释放过程中这些原语状态的变化。
表10-8 TCP连接状态
状 态
|
描 述
|
CLOSED
|
呈阻塞、关闭状态,表示主机当前没有活动的传输连接或正在进行传输连接
|
LISTEN
|
呈监听状态,表示服务器正在等待新的传输连接进入
|
SYN RCVD
|
表示主机已收到一个传输连接请求,但尚未确认
|
SYN SENT
|
表示主机已经发出一个传输连接请求,等待对方确认
|
ESTABLISHED
|
传输连接建立,通信双方进入正常数据传输状态
|
FIN WAIT 1
|
(主动关闭)主机已经发送关闭连接请求,等待对方确认
|
FIN WAIT 2
|
(主动关闭)主机已收到对方关闭传输连接确认,等待对方发送关闭传输连接请求
|
TIMED WAIT
|
完成双向传输连接关闭,等待所有分组消失
|
CLOSING
|
双方同时尝试关闭传输连接,等待对方确认
|
CLOSE WAIT
|
(被动关闭)收到对方发来的关闭传输连接请求,并已确认
|
LAST ACK
|
(被动关闭)等待最后一个关闭传输连接确认,并等待所有分组消失
|
图10-37描述了TCP通信主机在传输连接建立和释放过程中的各种有限状态机,图中的方框中表示的是通信主机在不同时期的状态,箭头表示状态之间的转换,旁边的注释表示状态转换过程中所需进行动作(包括调用Socket服务原语和TCP数据段的发送和接收等)。图中用粗线表示客户端主动和被动的服务器端连接建立的正常过程,其中客户端的状态转移用带箭头的粗实线表示,服务器端的状态转换用带箭头的粗虚线表示。带箭头的细线表示一些不常见的事件,如复位、同时打开、同时关闭等。
图10-37 TCP传输连接有限状态机转换流程
每个连接均开始于 CLOSED 状态。当一方执行了被动的连接原语(LISTEN )或主动的连接原语( CONNECT)时,它便会离开CLOSED状态。如果此时另一方执行了相对应的连接原语,连接便建立了,并且状态变为ESTABLISHED 。任何一方均可以首先请求释放连接,当连接被释放后,状态又回到了CLOSED 。
为了看清楚客户端和服务器各自的状态转移流程,我们先沿着带箭头的粗实线路径来看客户端的状态转移过程,然后再沿着带箭头的虚实线路径来看服务器的状态转移过程。
(1)一开始,服务器应用层首先调用LISTEN原语从CLOSED状态进入被动打开状态(LISTEN ),等待客户端的连接;
(2)当客户端的一个应用程序调用CONNECT原语后,本地的TCP实体为其创建一个连接记录并标记为SYN SENT状态,然后给服务器发送一个SYN数据段(SYN字段置1)。这是TCP传输连接建立的第一次握手。
(3)服务器在收到一个客户端的SYN数据段后,其TCP实体给客户端发送确认ACK数据段(ACK字段置1),同时发送一个SYN数据段(SYN字段置1,表示接受同步请求),进入SYN RCVD状态。这是TCP传输连接的第2次握手。
【说明】这里可能有一个非正常事件发生,那就是如果此时服务器不想建立传输连接,由其应用层调用CLOSE原语,向客户端发送一个FIN数据段(FIN字段置1),然后进入到FIN WAIT 1状态,等待客户端确认。当客户端收到服务器发来的FIN数据段后,向服务器发送一个ACK确认数据段后进入到CLOSING状态,表示双方同时尝试关闭传输连接,等待对方确认。在服务器收到客户端发来的ACK数据段后即进入到TIMED WAIT状态,在超时后双方即关闭连接。这是一种突发、非正常的连接关闭事件。
(4)客户端在收到服务器发来的SYN和ACK数据段后,其TCP实体给服务器端发送一个ACK数据段,并进入ESTABLISHED状态。这是TCP连接的第3次握手。
(5)服务器在收到来自客户端的ACK确认数据段后,完成整个TCP传输连接的全部三次握手过程,也进入ESTABLISHED状态。
此时,双方可以自由进行数据传输了。当一个应用程序完成数据传输任务后,它需要关闭TCP连接。假设仍由客户端发起主动关闭连接。
(6)客户端应用层调用CLOSE原语,本地的TCP实体发送一个FIN数据段(FIN字段置1),并等待服务器的确认响应,进入到FIN WAIT 1状态。
【说明】这里又可能有一个非正常的事件发生,那就是客户端在FIN WAIT 1状态收到服务器的FIN和ACK数据段后(而不是像从FIN WAIT 2状态进入那样只收到服务器的ACK确认数据段),向服务器发送一个ACK数据段,直接就进入了TIMED WAIT状态。在超时后双方即关闭连接。
(7)服务器在收到来自客户端的FIN数据段后,它给客户端发回一个ACK数据段(ACK字段置1)进入CLOSE WAIT状态。
(8)客户端在收到来自服务器的ACK确认数据段后就进入到了FIN WAIT 2状态,此时连接在一个方向上就断开了,但仍可以接收服务器端发来的数据段。
(9)当服务器收到客户端发来的FIN数据段时就知道客户端已有数据发送了,在本端已接收完全部的数据后,也由应用层调用CLOSE原语,请求关闭另一个方向的连接,其本地TCP实体向客户端发送一个FIN数据段,并进入LAST ACK状态,等待最后一个ACK确认数据段。
(10)在客户端收到来自服务器的FIN数据段后,向服务器发送最后一个ACK确认数据段,进入TIMED WAIT状态。此时双方连接均已经断开,但TCP实体仍要等待一个2倍数据段MSL(Maximum Segment Lifetime,最大数据段生存时间),以确保该连接的所有分组全部消失,防止出现确认丢失的情况。当定时器超时后,TCP删除该连接记录,返回到初始状态(CLOSED )。
(11)服务器收到客户端最后一个ACK确认数据段后,其TCP实体便释放该连接,并删除连接记录,也返回到初始状态(CLOSED)。
注:以上内容摘自新书《深入理解计算机网络》中,目前该书已可以京东网、卓越网、当当网上全面预订,并全部附有完整的目录信息(京东网上将于本月25号首先到货)。
京东网上的链接:http://book.360buy.com/11165825.html
卓越网上的链接:http://www.amazon.cn/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C-%E7%8E%8B%E8%BE%BE/dp/B00B0S7LDU/ref=sr_1_1?s=books&ie=UTF8&qid=1358153421&sr=1-1
当当网上的链接:http://product.dangdang.com/main/product.aspx?product_id=23166396
本文转自王达博客51CTO博客,原文链接http://blog.51cto.com/winda/1121078如需转载请自行联系原作者
茶乡浪子