TCP连接的状态转移

计算机网络 同时被 2 个专栏收录
20 篇文章 1 订阅
10 篇文章 0 订阅

摘自:《深入理解计算机网络》 王达著 机械工业出版社
相关知识链接
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)。
  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值