在使用netstat发现有个State字段,于是脑补了下,发现水还是蛮深的,以前只了解三次握手、四次握手,并没有了解其中的状态,现在有幸能够接触,大家可以直接Google搜索TCP状态图,会出现经典的状态图,如下:

image

我这里将对其进行整理,方便大家理解,看图前,先看下后面用到的术语:

  • S - 表示发送
  • R - 表示接收

连接建立阶段(三次握手)

CLOSED                                 ESTABLISH
  |                                        |
  |---------------- CLIENT ----------------|
  |                                        |
  |           SYN_SEND                     |
  |              |                         |
  |              |       R: SYN ACK        |
  |------------->|------------------------>|
  |    S: SYN    |          S: ACK         |
  |              |                         |
  |                                        |
  |                                        |
  |                                        |
  |---------------- SERVER ----------------|
  |                                        |
  |           LISTEN        SYN_RECV       |
  |              |              |          |
  |     OPEN     |    R: SYN    |  R: ACK  |
  |------------->|------------->|--------->|
  |              |  S: SYN ACK  |          |
  |              |              |          |
  |              |    R: RST    |          |
  |              |<-------------|          |
  |              |              |          |

  • CLIENT - 客户端
  • SERVER - 服务端
  • CLOSED - 关闭态
  • ESTABLISH - 连接态
  • LISTEN - 监听态(被动打开)
  • SYN_SEND - SYN发送态(已发送SYN)
  • SYN_RECV - SYN接收态(已接收SYN,并发送ACK)
  • 三次握手: 客户端发送SYN -> 服务端接收SYN,并发送SYN、ACK –> 客户端接收SYN、ACK,并发送ACK
  • RST - 复位指令,SYN_RECV在接收到RST可以回到LISTEN,主要用于处理异常连接,至于什么情况会出现RST,可以点击此传送门

连接释放阶段(四次握手)

ESTABLISH                                        CLOSED
  |                                                 |
  |--------------------- ACTIVE --------------------|
  |                                                 |
  |         FIN_WAIT_1   FIN_WAIT_2  TIME_WAIT      |
  |              |            |          |          |
  |              |   R: ACK   |  R: FIN  |   2MSL   |
  |------------->|----------->|--------->|--------->|
  |    S: FIN    |            |  S: ACK  |          |
  |              |            |          |          |
  |              |            |          |          |
  |              |     R: FIN ACK        |          |
  |              |---------------------->|          |
  |              |       S: ACK          |          |
  |              |                       |          |
  |              |                       |          |
  |              |         CLOSING       |          |
  |              |   R: FIN   |  R:ACK   |          |
  |              |----------->|--------->|          |
  |              |   S: ACK   |          |          |
  |                                                 |
  |                                                 |
  |-------------------- PASSIVE --------------------|
  |                                                 |
  |          CLOSE_WAIT     LAST_ACK                |
  |              |              |                   |
  |    R: FIN    |              |      R: ACK       |
  |------------->|------------->|------------------>|
  |    S: ACK    |    S: FIN    |                   |
  |              |              |                   |

  • ACTIVE - 主动方
  • PASSIVE - 被动方
  • CLOSED - 关闭态
  • ESTABLISH - 连接态
  • FIN_WAIT_1 - 主动发送FIN
  • CLOSE_WAIT - 收到FIN,并发送ACK
  • FIN_WAIT_2 - 主动发送FIN后,并接收到ACK
  • LAST_ACK - 被动方进入CLOSE_WAIT后,再次发送FIN
  • CLOSING - 当发出FIN的时候同时收到FIN,则进入CLOSING态(同时关闭)
  • TIME_WAIT - 等待结束态
  • 2MSL - 2倍报文最大生存时间,为什么需要2倍,因为当被动方发现收不到ACK,则会重发FIN,因此需要等待2倍MSL来预留需要再次发送ACK的时间
  • 四次握手:主动方发送FIN -> 被动方接收FIN,并发送ACK -> 被动方发送FIN -> 主动方接收FIN,并发送ACK

其他

另外,分享一篇文章《TCP 那些事