原文地址:链接服务器
TCP 有限状态机能够用来描述 TCP 链接的全部阶段。从链接前的 null 状态,到创建链接过程当中经历的一系列状态,以及关闭链接过程当中出现的一系列状态。数据结构
要完整地描述上述过程须要囊括大部分的 TCP 标准,免不了大段复杂的解释。这只会让你们昏昏入睡。大部分人其实只需大体了解下就能够了。简化的TCP 有限状态机无疑能作到这点。tcp
本篇文章将用一图一表简单介绍 TCP 的各类状态,介绍设备在这些状态下所执行的动做,以及它们的下一状态。为了简化描述,咱们用三个英文简称来表明触发状态转变的三种信号。这三个英文简称来自 TCP 报头的标识位(TCP header flag)ide
SYN:同步信号,用来创建链接。之因此称为同步信号(SYN)是由于它的做用是同步两端设备的初始序列号(sequence numbers)ui
FIN:结束信号,代表设备但愿停止链接spa
ACK:回应信号,表示成功接收到对方发过来的信号设计
再次声明,这里只会讲解了 TCP 链接、断开时涉及的正常状态,一些应对错误时出现的 TCP 状态不会在这里讲述。若是所有讲完,就违背了本篇“简单”的宗旨htm
因为不会使用嵌套表格,因此另起了一列,重复内容用 \ 代替图片
状态 | 状态描述 | 设备动做及下一个状态 |
---|---|---|
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 状态 |