在使用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 那些事》