2

原文地址:连接

TCP 有限状态机可以用来描述 TCP 连接的所有阶段。从连接前的 null 状态,到建立连接过程中经历的一系列状态,以及关闭连接过程中出现的一系列状态。

要完整地描述上述过程需要囊括大部分的 TCP 标准,免不了大段复杂的解释。这只会让大家昏昏入睡。大部分人其实只需大致了解下就可以了。简化的TCP 有限状态机无疑能做到这点。

本篇文章将用一图一表简单介绍 TCP 的各种状态,介绍设备在这些状态下所执行的动作,以及它们的下一状态。为了简化描述,我们用三个英文简称来代表触发状态转变的三种信号。这三个英文简称来自 TCP 报头的标识位(TCP header flag)

  • SYN:同步信号,用来建立连接。之所以称为同步信号(SYN)是因为它的作用是同步两端设备的初始序列号(sequence numbers)

  • FIN:结束信号,表明设备希望中止连接

  • ACK:回应信号,表示成功接收到对方发过来的信号

再次声明,这里只会讲解了 TCP 连接、断开时涉及的正常状态,一些应对错误时出现的 TCP 状态不会在这里讲述。如果全部讲完,就违背了本篇“简单”的宗旨

由于不会使用嵌套表格,所以另起了一列,重复内容用 \ 代替

状态 状态描述 设备动作及下一个状态
CLOSED CLOSED状态是建立连接前所处的状态 被动开启:服务器 TCP 端口被动开启,连接开始进行。服务器会建立控制连接的传输控制块(一种数据结构,简称 TCB),然后进入 LISTEN 状态
\ \ 主动开启,发送 SYN :客户端发送 SYN ,主动进行连接,同时建立传输控制块(TCB)。然后进入 SYN-SENT 状态
LISTEN LISTEN 状态表明设备(通常是服务器)正在等待接收对方 SYN ,自家的 SYN 尚未发送 接收到客户端的 SYN ,发送 SYN + ACK :服务端接收到客户端发送的 SYN 后进行回复,回应信号包括自己的SYN,以及表明收到客户端 SYN 的 ACK 信号。随后,服务端进入 SYN-RECEIVED 状态
SYN-SENT SYN-SENT 状态表明设备(通常是客户端)已经发送了 SYN , 正在等待另一端设备(通常是服务端)发送 SYN进行配对 收到另一端发送的 SYN,回应 ACK:如果设备已经发送了 SYN,且接收到了配对端的 SYN,但还没有收到配对端回应 SYN 的 ACK。那么设备将发送 ACK,表明自己已经接收到对方的 SYN。随后进入 SYN-RECEVIED 状态,等待接收对方回应自己 SYN 的 ACK
\ \ 收到配对端的 SYN + ACK,发送 ACK:如果接收到对方的 SYN ,也接收到了对方回应这边 SYN 的 ACK,那么设备就发送 ACK,告知对方自己收到了它的 SYN。进入 ESTABLISHED 状态
SYN-RECEIVED SYN-RECEIVED 表明设备收到对方发过来的 SYN ,自己也向对方发送了 SYN。现在正在等待接收对方发送的 ACK, 以确认配对一方已收到这边发送的 SYN 接收 ACK:当收到对方的 ACK (表示收到这边发送的 SYN),进入 ESTABLISHED 状态
ESTABLISHED ESTABLISHED 状态是 TCP 连接完成后所处的稳定状态。此时,连接双方可以自由收发数据。ESTABLISHED 状态会一直维持到 TCP 连接结束 请求关闭,发送 FIN:设备发送带有 FIN 标识的信号,要求关闭连接。随后进入 FIN-WAIT-1 状态
\ \ 接收 FIN:设备接收到连接方为关闭连接而传来的 FIN。设备回应 ACK,进入 CLOSE-WAIT 状态
CLOSE-WAIT CLOSE-WAIT 状态表示设备接收到连接方传来的 FIN,现在需要等待设备上的程序为关闭连接做相应的工作 请求关闭,发送 FIN:设备上使用 TCP 的程序被告知连接端要求关闭 TCP 连接,程序于是向设备的 TCP 层发出关闭请求。TCP 发送 FIN 给已经提出关闭要求(已经发送了 FIN)的连接端。进入 LAST-ASK 状态
LAST-ACK LAST-ASK表示设备已经接收了另一端发送过来的 FIN,并回应了ACK。也向对方发送了 FIN,此时还需等待接收对方回应的 ACK,以确认对方成功接收了这边发送过去的 FIN 收到了回应 FIN 的 ACK:设备收到了回应 FIN 的 ACK。现在 TCP 两端的设备都各自发送了 FIN,也各自收到了对方的回应。因此,设备直接进入了 CLOSED 状态
FIN-WAIT-1 FIN-WAIT-1 状态表明设备可能处在等待接收对方回应收到 FIN 的 ACK ,也可能处在等待接收对方发送的 FIN 收到回应 FIN 的 ACK:设备收到回应自己关闭请求的答复,进入 FIN-WAIT-2 状态
\ \ 收到 FIN,发送 ACK:设备没有接到对方为回复 FIN 而发送的 ACK,但收到了对方请求关闭连接的 FIN。那么设备回应对方发来的 FIN,发送 ACK,然后进入 CLOSING 状态
FIN-WAIT-2 FIN_WAIT_2 状态表明设备已经发送了 FIN,并且收到了对方回应的 ACK,还在等待对方发送 FIN 接收到 FIN,发送 ACK:设备接收到对方的 FIN,回应 ACK,进入 TIME-WAIT 状态
CLOSING CLOSING状态表明设备已经接收到了对方的 FIN,自己也回应了 ACK,还需等待接收对方回应自己 FIN 的 ACK 接收到回应 FIN 的 ACK:设备接收到对方回应自己 FIN 的 ACK,进入 TIME-WAIT 状态
TIME-WAIT 设备处于 TIME-WAIT 状态表明设备收到了对方的 FIN,并且回应了 ACK,设备发送了 FIN,也收到了对方回应的 ACK。此时可以关闭连接。不过我们还是要倒计一段时间再关闭,防止影响连接端接收这边发送过去的 ACK。也防止和新连接产生冲突 倒计时间到:设计的定时时间耗尽后,连接关闭,进入 CLOSED 状态

图片描述


AWang
9 声望0 粉丝