paulwong

          TCP 連線狀態(tài)機(jī)制與流程

          https://dev.twsiyuan.com/2017/09/tcp-states.html
          在開發(fā)基於 HTTP 的網(wǎng)路應(yīng)用服務(wù)時(shí),當(dāng)有大量連線要求,或是與長連線 (Persistent connection) 要求時(shí),常常遇到底層 TCP 的連線斷線錯(cuò)誤,導(dǎo)致服務(wù)不穩(wěn)定。因此研究了解 TCP 的連線狀態(tài)機(jī)制,並嘗試用自己的方式整理筆記,希望能從基礎(chǔ)知識(shí)中找到解決錯(cuò)誤的線索,或是任何能更進(jìn)一步優(yōu)化服務(wù)的手段。

          僅紀(jì)錄 TCP 連線狀態(tài)以及建立或是斷開連線流程,關(guān)於進(jìn)一步的 TCP 封包協(xié)定可參考 Reference 連線。

          TCP 建立連線 (Open)

          通常的 TCP 連線建立流程與狀態(tài),需要三次的訊息交換來建立連線 (three-way handshaking):

          TCP 建立連線流程圖

          TCP 建立連線流程圖

          其中左邊通常為 server,右邊則為 client,文字流程描述:

          1. Server 建立 TCB,開啟監(jiān)聽連線,進(jìn)入狀態(tài) LISTENING
          2. Client 發(fā)出連線要求 SYN,進(jìn)入狀態(tài) SYN-SENT,等待回應(yīng)
          3. Server 收到 SYN 要求,回應(yīng)連線傳送 SYN+ACK,並進(jìn)入狀態(tài) SYN-RCVD (SYN-RECEIVED)
          4. Client 收到 SYN+ACK 確認(rèn)完成連線進(jìn)入狀態(tài) ESTABLISHED,並送出 ACK
          5. Server 收到 ACK 確認(rèn)連線完成,也進(jìn)入狀態(tài) ESTABLISHED
          6. 雙方開始傳送交換資料

          該些名詞與狀態(tài)說明:

          • CLOSED:連線關(guān)閉狀態(tài)
          • LISTENING:監(jiān)聽狀態(tài),被動(dòng)等待連線
          • SYN-SENT:主動(dòng)送出連線要求 SYN,並等待對(duì)方回應(yīng)
          • SYN-RCVD:收到連線要求 SYN,送出己方的 SYN+ACK 後,等待對(duì)方回應(yīng)
          • ESTABLISHED:確定完成連線,可開始傳輸資料
          • TCB:Transmission Control Block,see wiki
          • SYN:Synchronous,表示與對(duì)方建立連線的同步符號(hào)
          • ACK:Acknowledgement,表示發(fā)送的數(shù)據(jù)已收到無誤

          在建立連線時(shí),可能會(huì)發(fā)生雙方同步建立連線的情形 (Simultaneous open),常見於 P2P 的應(yīng)用中,其 TCP 建立連線的流程不太一樣:

          TCP 同步建立連線流程圖

          TCP 同步建立連線流程圖

          畫成 TCP 狀態(tài)流程圖會(huì)是這樣:

          TCP Open 狀態(tài)圖

          TCP Open 狀態(tài)圖

          TCP 斷開連線 (Close)

          TCP 關(guān)閉流程如下,比建立連線還要複雜一些,需要經(jīng)過四次的訊息交換 (four-way handshaking),要注意的是可以是由 server 發(fā)起主動(dòng)關(guān)閉,抑或是 client 發(fā)起主動(dòng)關(guān)閉:

          TCP 關(guān)閉連線流程圖

          TCP 關(guān)閉連線流程圖

          其中左邊通常為 client 狀態(tài) (由 client 主動(dòng)發(fā)起關(guān)閉連線),右邊則為 server 狀態(tài),文字流程描述:

          1. Client 準(zhǔn)備關(guān)閉連線,發(fā)出 FIN,進(jìn)入狀態(tài) FIN-WAIT-1
          2. Server 收到 FIN,發(fā)回收到的 ACK,進(jìn)入狀態(tài) CLOSE-WAIT,並通知 App 準(zhǔn)備斷線
          3. Client 收到 ACK,進(jìn)入狀態(tài) FIN-WAIT-2,等待 server 發(fā)出 FIN
          4. Server 確認(rèn) App 處理完斷線請(qǐng)求,發(fā)出 FIN,並進(jìn)入狀態(tài) LAST-ACK
          5. Client 收到 FIN,並回傳確認(rèn)的 ACK,進(jìn)入狀態(tài) TIME-WAIT,等待時(shí)間過後正式關(guān)閉連線
          6. Server 收到 ACK,便直接關(guān)閉連線

          該些名詞與狀態(tài)說明:

          • ESTABLISHED:連線開啟狀態(tài)
          • CLOSE-WAIT:等待連線關(guān)閉狀態(tài),等待 App 回應(yīng)
          • LAST-ACK:等待連線關(guān)閉狀態(tài),等待遠(yuǎn)端回應(yīng) ACK 後,便關(guān)閉連線
          • FIN-WAIT-1:等待連線關(guān)閉狀態(tài),等待遠(yuǎn)端回應(yīng) ACK
          • FIN-WAIT-2:等待連線關(guān)閉狀態(tài),等待遠(yuǎn)端回應(yīng) FIN
          • TIME-WAIT:等待連線關(guān)閉狀態(tài),等段一段時(shí)候,保證遠(yuǎn)端有收到其 ACK 關(guān)閉連線 (網(wǎng)路延遲問題)
          • CLOSED:連線關(guān)閉狀態(tài)
          • FIN:表示關(guān)閉連線的同步符號(hào)
          • ACK:Acknowledgement,表示發(fā)送的數(shù)據(jù)已收到無誤

          有可能連線的雙方同時(shí)發(fā)起關(guān)閉,雖然機(jī)率還蠻低的:

          TCP 同步關(guān)閉連線流程圖

          TCP 同步關(guān)閉連線流程圖

          這邊多一個(gè)狀態(tài):

          • CLOSING:等待連線關(guān)閉狀態(tài),等待遠(yuǎn)端回應(yīng) ACK

          畫成 TCP 狀態(tài)流程圖會(huì)是這樣:

          TCP Close 狀態(tài)圖

          TCP Close 狀態(tài)圖

          查詢現(xiàn)在電腦的 TCP 狀態(tài)

          查詢目前所有的連線狀態(tài) (Windows & Linux):

          netstat -a

          Reference

          posted on 2020-12-29 10:04 paulwong 閱讀(253) 評(píng)論(0)  編輯  收藏 所屬分類: LINUXLINUX-SHELLTCP

          主站蜘蛛池模板: 建始县| 上蔡县| 陈巴尔虎旗| 澜沧| 三门县| 平潭县| 扶风县| 峨边| 吉木乃县| 阜阳市| 灵台县| 宁都县| 香港| 遵义市| 东丽区| 肥东县| 衢州市| 察哈| 张北县| 阿图什市| 禹城市| 德州市| 静安区| 梨树县| 浮山县| 正镶白旗| 抚宁县| 巫溪县| 泰兴市| 卓资县| 敦煌市| 繁昌县| 鄯善县| 荣昌县| 凤阳县| 淮阳县| 巍山| 塔河县| 鹤壁市| 华池县| 大方县|