<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    paulwong

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

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

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

    TCP 建立連線 (Open)

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

    TCP 建立連線流程圖

    TCP 建立連線流程圖

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

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

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

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

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

    TCP 同步建立連線流程圖

    TCP 同步建立連線流程圖

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

    TCP Open 狀態(tài)圖

    TCP Open 狀態(tài)圖

    TCP 斷開連線 (Close)

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

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

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

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

    1. Client 準(zhǔn)備關(guān)閉連線,發(fā)出 FIN,進入狀態(tài) FIN-WAIT-1
    2. Server 收到 FIN,發(fā)回收到的 ACK,進入狀態(tài) CLOSE-WAIT,並通知 App 準(zhǔn)備斷線
    3. Client 收到 ACK,進入狀態(tài) FIN-WAIT-2,等待 server 發(fā)出 FIN
    4. Server 確認(rèn) App 處理完斷線請求,發(fā)出 FIN,並進入狀態(tài) LAST-ACK
    5. Client 收到 FIN,並回傳確認(rèn)的 ACK,進入狀態(tài) TIME-WAIT,等待時間過後正式關(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),等待遠端回應(yīng) ACK 後,便關(guān)閉連線
    • FIN-WAIT-1:等待連線關(guān)閉狀態(tài),等待遠端回應(yīng) ACK
    • FIN-WAIT-2:等待連線關(guān)閉狀態(tài),等待遠端回應(yīng) FIN
    • TIME-WAIT:等待連線關(guān)閉狀態(tài),等段一段時候,保證遠端有收到其 ACK 關(guān)閉連線 (網(wǎng)路延遲問題)
    • CLOSED:連線關(guān)閉狀態(tài)
    • FIN:表示關(guān)閉連線的同步符號
    • ACK:Acknowledgement,表示發(fā)送的數(shù)據(jù)已收到無誤

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

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

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

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

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

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

    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 閱讀(250) 評論(0)  編輯  收藏 所屬分類: LINUXLINUX-SHELLTCP

    主站蜘蛛池模板: 亚洲黄色片免费看| a一级毛片免费高清在线| 67194在线午夜亚洲| 亚洲明星合成图综合区在线| 亚洲视频一区网站| 亚洲精品熟女国产| 亚洲欧洲精品国产区| 亚洲毛片无码专区亚洲乱| 亚洲另类视频在线观看| 亚洲娇小性色xxxx| 亚洲欧洲免费无码| 青青视频免费在线| fc2免费人成在线视频| a毛片在线免费观看| 一区二区在线免费观看| 免费福利视频导航| 毛色毛片免费观看| 免费一看一级毛片| 自拍偷自拍亚洲精品情侣| 久久亚洲精品无码| 亚洲一区二区三区免费观看| 亚洲youwu永久无码精品| 黄页网址在线免费观看| 99久久免费国产特黄| 8x8x华人永久免费视频| 成人毛片免费观看视频大全| 免费人成网站在线播放| 国产亚洲一区二区手机在线观看| 久久久亚洲欧洲日产国码二区| 亚洲精品午夜国产va久久| 羞羞网站免费观看| 国产猛男猛女超爽免费视频| 皇色在线视频免费网站| 免费人成年激情视频在线观看| 亚洲国产精品无码中文字| 亚洲AV成人噜噜无码网站| 成人久久久观看免费毛片| 免费无码毛片一区二区APP| 精品国产免费观看久久久| 亚洲午夜久久久久妓女影院| 亚洲国产日产无码精品|