TCP连接的状态转移

来源:互联网 发布:香港 收音机软件 推荐 编辑:程序博客网 时间:2024/05/23 17:51

摘自:《深入理解计算机网络》 王达著 机械工业出版社
相关知识链接
1. IPV4数据报头部格式
2. IPv6数据报头部格式
3. IPv4数据报的封装与解封装
4. IPv4数据报的分段与重组
5. ARP协议报文格式及ARP表
6. ARP地址解析原理
7. ICMP协议及报文格式
8. IPv6协议族的其它协议
9. TCP的主要特性
10. TCP的套接字
11. TCP端口

TCP状态转移

TCP的套接字那一篇博客中,我们知道TCP Socket 服务原语只有8个。比 OSI/RM 体系结构中定义的传输层服务原语还少,但是在这8中 TCP Socket 服务原语中,有的原语又可以有不同的状态,如下表所示。我们把在 TCP 传输连接的建立和释放过程中的通信双方主机的这些状态称为“有限状态机(Finite State Machine, FSN)”。下面具体阐述一下在 TCP 传输连接建立、释放过程中的这些原语状态的变化。


状态 描述 CLOSED 呈阻塞、关闭状态,表示主机当前没有活动的传输连接或正在传输连接 LISTEN 呈监听状态,表示服务器正在等待新的传输连接进入 SYN RCVD 表示主机已收到一个传输连接请求,但未确认 SYN SEND 表示主机已经发出一个传输连接请求,等待对方确认 ESTABLISHED 传输连接建立,通信双方进入正常数据传输状态 FIN WAIT 1 (主动关闭)主机已经发送关闭连接请求,等待对方确认 FIN WAIT 2 (主动关闭)主机已经收到对方关闭传输连接确认,等待对方发送关闭传输连接请求 TIMED WAIT 完成双向传输连接关闭,等待所有分组消失 CLOSING 双方同时尝试关闭传输连接,并已确认 CLOSE WAIT (被动关闭)收到对方发来的关闭传输连接请求,并已确认 LAST ACK (被动关闭)等待最后一个关闭传输连接确认,并等待所有分组消失

下图描述了TCP通信主机在传输连接建立和释放过程中的各种有限状态机,方框中表示的是通信主机在不同时期的状态,箭头表示状态之间的转换,旁边的注释表示状态转换过程中所需进行的动作(包括调用 Socket 服务原语以及 TCP 数据段的发送和接收等)。下图中用粗线表示客户端主动和被动的服务器连接建立的正常过程,其中客户端的状态转移用带箭头的粗实线表示,服务器端的状态转换用带箭头的粗虚线表示。带箭头的细线表示一些不常见的事件,如复位、同事打开、同事关闭等。



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


每个连接均开始于 CLOSED 状态。当一方执行了被动的连接原语(LISTEN)或主动连接原语(CONNECT)时,它便会离开CLOSED状态。如果此时另一方执行了相对应的连接原语,连接便建立了,并且状态会变为(ESTABLISHED)。任何一方局可以首先请求释放连接,连接释放后,状态又回到了 CLOSED 。

我们来仔细研究一下客户端和服务器各自的状态转移流程,我们先沿着带箭头的粗实线路径来看客户端的状态转移过程,然后再沿着带箭头的虚实线路径来看服务器的状态转移过程。

  • 一开始,服务器应用层首先调用 LISTEN 原语从 CLOSED 状态进入被动打开状态 (LISTEN),等待客户端连接。
  • 当客户端的一个应用程序调用 CONNECT 原语后,本地的TCP实体为其建立一个连接记录并标记为 SYN SENT状态,然后给服务器发送一个SYN数据段(SYN字段置1)。这是TCP传输连接的第一次握手。
  • 服务器在收到一个客户端的SYN数据段后,其TCP实体向客户端发送确认ACK数据段(ACK字段置1),同时发送一个SYN数据段(SYN字段置1,表示接受同步请求),进入 SYN REVD 状态。这是TCP传输连接的第二次握手。

说明:这里可能有一个非正常事件发生,那就是如果此时服务器不想建立传输连接,那么由其应用层调用 CLOSE 原语,向客户端发送一个 FIN 数据段(FIN字段值置1),然后进入 FIN WAIT 1 状态,等待客户端确认。当客户端收到服务器发来的 FIN 数据段后,向服务器发送一个 ACK 确认数据段后进入到 CLOSING 状态,表示双方同时尝试关闭传输连接,等待双方确认。在服务器收到客户端发来的 ACK 数据段后即进入到 TIMED WAIT 状态,在超时后双方立即关闭连接。这是一种突发、非正常的连接关闭事件。


  • 客户端在收到服务器发来的 SYN 和 ACK 数据段后,其 TCP 实体给服务器端发送一个 ACK 数据段,并进入 ESTABLISH 状态。这是TCP连接的第三次握手。
  • 服务器在收到来自客户端的ACK确认数据段后,完成整个TCP传输连接的全部三次握手过程,也进入 ESTABLISHED。

此时双方可以自由进行数据传输了。当一个应用程序完成数据传输后,它需要关闭TCP连接。假设仍由客户端发起主动关闭连接。

  • 客户端应用层调用 CLOSE 原语,本地的TCP实体发送一个 FIN 数据段(FIN字段值置1),并等待服务器的确认响应,进入 FIN WAIT 1 状态。

说明:这里有可能有一个非正常的事件发生,那就是客户端在 FIN WAIT 1 状态收到服务器的 FIN 和ACK 数据段后(而不是像从 FIN WAIT 2 状态进入那样只收到服务器的ACK确认数据段),向服务器发送一个 ACK 数据段,直接就进入到 TIMED WAIT 状态。在超时后双方即关闭连接。


  • 服务器在收到客户端的 FIN 数据段之后,它给客户端返回一个ACK数据段(ACK字段值为1),进入 CLOSING WAIT 状态。
  • 客户端收到来自服务器的ACK确认字段后,进入 FIN WAIT 2 状态,此时连接在一个方向上就断开了,但仍可以接收到服务器端发来的数据段。
  • 当服务器收到客户端发来的 FIN 数据段时就知道客户端已有数据发送了,在本端已接受完全部数据后,也由应用层调用 CLOSE 原语,请求关闭另一个方向的连接,其本地 TCP 实体向客户端发送一个 FIN 数据段,并进入 LAST ACK 状态,等待最后一个 ACK 确认数据段。
  • 在客户端收到来自服务器的 FIN 数据段后,向服务器发送最后一个 ACK 确认数据段,进入LAST ACK 状态,等待最后一个 ACK 确认数据段。
  • 在客户端收到来自服务器的 FIN 数据段后,向服务器发送最后一个 ACK 确认数据段,进入 TIMED WAIT 状态。此时,双方连接均已断开,但 TCP 实体仍要等待一个2倍数据段 MSL (Maximum Segment Lifetime)最大生命时间,以确保该连接的所有分组消失,以防出现确认丢失的情况。当定时器超时后,TCP 删除该连接记录,返回到初始状态 (CLOSED)。
  • 服务器收到客户端最后一个 ACK 确认数据之后,其 TCP 实体便释放该连接,并删除连接记录,以返回到初始状态(CLOSED)。
原创粉丝点击