a) 由主機A發送創建TCP鏈接的請求報文, 其中報文中包含seq序列號, 是由發送端隨機生成的, 而且還將報文中SYN字段置爲1, 表示須要創建TCP鏈接。html
b) 主機B會回覆A發送的TCP鏈接請求報文, 其中包含seq序列號, 是由回覆端隨機生成的, 而且將回復報文的SYN字段置爲1, 並且會產生ACK字段, ACK字段數值是在A發過來的seq序列號基礎上加1進行回覆,以便A收到信息時, 知曉本身的TCP創建請求已獲得了驗證。linux
c) A端收到B端發送的TCP創建驗證請求後, 會使本身的序列號加1表示, 而且再次回覆ACK驗證請求, 在B端發送過來的seq基礎上加1, 進行回覆。服務器
至此, 三次握手完成, 鏈接創建。併發
a) 主機A發送斷開TCP鏈接請求的報文, 其中報文中包含seq序列號, 是由發送端隨機生成的, 而且還將報文中FIN字段置爲1, 表示須要斷開TCP鏈接。socket
b) 主機B會回覆A發送的TCP斷開請求報文, 其中包含seq序列號, 是由回覆端隨機生成的, 並且會產生ACK字段, ACK字段數值, 是在A發過來的seq序列號基礎上加1進行回覆, 以便A收到信息時, 知曉本身的TCP斷開請求已獲得了驗證。tcp
c) 主機B在回覆完A的TCP斷開請求後, 不會立刻就進行TCP鏈接的斷開, 主機B會先確保斷開前, 全部傳輸到A的數據是否已經傳輸完畢, 一旦確認傳輸數據完畢就會將回復報文的FIN字段置爲1, 併產生隨機seq序列號。函數
d) 主機A收到主機B的TCP斷開請求後, 會回覆主機B的斷開請求, 包含隨機生成的seq字段和ack字段, ack字段會在主機B的TCP斷開請求的seq基礎上加1, 從而完成主機B請求的驗證回覆。spa
Statushtm |
Descriptionblog |
LISTEN |
服務啓動後首先處於偵聽LISTENING狀態 |
SYN_SENT |
在發送鏈接請求後等待匹配的鏈接請求。經過connect()函數向服務器發出一個同步SYNC信號後進入此狀態 |
SYN_RECEIVED |
已經收到併發送同步SYNC信號以後等待確認ACK請求 |
ESTABLISHED |
鏈接已經創建, 表示2臺機器能夠相互通訊, 此時鏈接兩端是平等的 |
FIN_WAIT_1 |
主動關閉端調用close()函數發出FIN請求包, 表示本方的數據發送所有結束, 等待TCP鏈接另外一端的確認包或FIN請求包 |
FIN_WAIT_2 |
主動關閉端在FIN_WAIT_1狀態下收到確認包, 進入等待遠程TCP的鏈接終止請求的半關閉狀態, 這時能夠接收數據, 但再也不發送數據 |
CLOSE_WAIT |
被動關閉端接到FIN後, 就發出ACK以迴應FIN請求, 並進入等待本地用戶的鏈接終止請求的半關閉狀態, 這時能夠發送數據, 但再也不接收數據 |
CLOSING |
在發出FIN後, 又收到對方發來的FIN後, 進入等待對方對鏈接終止FIN的確認ACK的狀態, 少見 |
LAST_ACK |
被動關閉端所有數據發送完成以後, 向主動關閉端發送FIN, 進入等待確認包的狀態 |
TIME_WAIT |
主動關閉端接收到FIN後, 就發送ACK包, 等待足夠時間(2倍MSL時間)以確保被動關閉端收到了終止請求的確認包 |
CLOSED |
鏈接關閉, 表明雙方無任何鏈接狀態 |
參考連接:
http://www.4e00.com/blog/linux/2016/08/06/tcp-open-and-close.html