TCP與Socket狀態轉換圖

這裏寫圖片描述
原圖

正常開啓

  1. 初始時,Client 和 Server 的TCP狀態都爲CLOSED。
  2. S 端首先socket、bind、listen。listen後 S tcp狀態會變成LISTEN,執行 被動打開。
  3. S 端調用 accept ,阻塞等待 tcp 有連接完成。
  4. C 端socket、connect,connect會阻塞到tcp的三次握手完成。
  5. 在C tcp 發送第一個 SYN 報文時,C tcp 狀態變爲 SYN_SEND,爲主動打開一方。
  6. S tcp 收到 C tcp 的SYN後,狀態由 LISTEN變爲 SYN_RCVD,並進行發送回覆(SYN K, ACK J+1 )。
  7. C tcp 收到回覆時,狀態變爲 ESTABLISHED(數據傳輸狀態),並回復 確認(ACK K+1),然後 connect 函數返回,這時客戶點的 tcp連接創建完畢,可以向該套接字收發數據了。
  8. S tcp 收到3次握手的最後一個確認後,狀態變爲ESTABLISHED,至此,S 端的 accept 返回,返回已連接套接字(區分socket返回的監聽套接字)。

正常關閉

  1. C 調用 close ,C tcp 向 S tcp 發送 FIN 報文,狀態變爲 FIN_WAIT_1,主動關閉。
  2. S tcp 收到 FIN 後,狀態變爲 CLOSE_WAIT,並回復 確認,此爲 被動關閉。若此時 S 端正在阻塞 read 此套接字,read 將返回0。
  3. S 端 調用 close 或 退出進程,使 S tcp 向 C tcp 發送 FIN,S tcp 狀態變爲 LASK_ACK。
  4. C tcp 收到 S tcp 發送的 FIN 後,狀態變爲 TIME_WAIT,並對此 FIN 發送確認。在等待 2*MSL 後,狀態變爲 CLOSED,在此 2MSL 時間內,所有此 socket pair 的報文被丟棄(新建的,舊的)。
  5. S tcp 收到最後 ACK 後,狀態變爲 CLOSED。

異常情況

  • accept返回前連接終止
  • S 端進程終止
  • SIGPIPE信號
  • S 主機崩潰
  • S 主機崩潰後重啓
  • S 主機關機

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章