TCP传输连接有限状态机转换机制

来源:互联网 发布:部落冲突药水升级数据 编辑:程序博客网 时间:2024/05/02 04:36

从表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 )。