技術人的七夕|TCP談三次戀愛、分手四次是個渣男麼?

TCP三次握手和四次斷開不管是在開發還是面試中都是一個非常重要的知識點,它是我們優化web程序性能的基礎。

但是大部分教材都對這部分解釋的比較抽象,本文我們就通俗易懂的講清楚這一重要的知識點

每一次TCP連接都需要三個階段:連接建立、數據傳送和連接釋放。三次握手就發生在連接建立階段。

TCP三次握手的目的是為了解決網絡中存在延遲的重複分組的問題。

TCP 三次握手

TCP 三次握手就好比於男生開始告白女生,但女生又不敢完全確認,這是朋友之間鬧著玩,還是認真的,所以需要相互確認來確定戀愛關係。

1、男生首先向女生告白(syn),女生收到後露出驚訝的表情,然後向對方點頭示意(ack)

2、男生看到對方點頭後,確定自己的告白被同意進入戀愛狀態(Estalished)

3、但是此時女生還是有點質疑,這是不是跟自己鬧著玩的,所以女生反問一句,你真的喜歡我嗎(syn)

4、此時,男生向對方做出肯定的回答(ack),女生收到後同時進入戀愛狀態(Estalished)

5、於是兩人擁抱在了一起

總結過程

其實是分了四步完成

1.男生告白(syn)

2.女生確認(ack)

3.女生反問(syn)

4.男生確認(ack)

技術人的七夕|TCP談三次戀愛、分手四次是個渣男麼?

圖一

而大家需要注意的是,在該過程中,其實女生執行的兩次動作,是一次一起完成的,於是四個動作簡化分三步完成。

男生告白--女生同意並同時反問對方--男生確認如圖一,出現兩個狀態 syn_sent 與 syn_rcvd 這是用來標識建立 TCP 連接的兩端的建立過程的

syn_sent 是主動打開方,syn_rcvd 是被動打開方

建立 TCP 連接狀態切換

初始階段,建立 TCP 連接的兩端進程都處於CLOSED 狀態。

服務器端的 TCP 服務器進程先創建傳輸控制模塊 TCB,準備接受客戶進程的連接請求,然後服務器進程就處於 LISTEN (監聽)狀態,等待客戶的連接請求

客戶端向服務端發出連接請求報文段,這時首部中的請求位 SYN=1,同時選擇一個初始序號 seq=a。

TCP規定,SYN 報文段(即SYN=1的報文段)不能攜帶數據,但要消耗掉一個序號。這時,客戶端進程就進入 SYN-SENT(同步已發送)狀態。

服務端收到連接請求報文段後,向客戶端發送確認。在確認報文段中把 SYN 和 ACK 位都置為 1,確認號是ack=a+1,同時也為自己選擇一個初始序號 seq=b。請注意,這個報文段也不能攜帶數據,但同樣要消耗掉一個序號。這時服務端進程就進入 SYN-RCVD(同步已收到)狀態。

客戶端進程收到服務端確認後,還要向服務端給出確認。確認報文段的 ACK 置為 1,確認號 ack=b+1,而自己的序號seq=a+1。這時,TCP連接已經建立,客戶端進入 ESTABLISHED(已建立連接)狀態,當服務端收到客戶端的確認後,也會進入ESTABLISHED狀態。

TCP 四次斷開

TCP 斷開連接與建立連接過程類似,但並不是把中間兩步合為一步

分手過程

所以分為如下四步完成

1.男生提分手

2.女生同意

3.女生接著說是我甩的你

4.男生同意

之所以中間兩個動作沒有合為一個動作,是因為 TCP 存在半關閉狀態

技術人的七夕|TCP談三次戀愛、分手四次是個渣男麼?

圖二

如圖二:有一個非常特殊的狀態 time_wait,該狀態是主動提分手一方在確認對方的分手之後的進入的一個狀態,該狀態標準的持續時間是 4 分鐘,4 分鐘後才會進入到 Closed 狀態,釋放端口。

它就好比主動分手方要承擔的責任,是你提出的要分手,你得付出代價。這個後果就是持續 4 分鐘的 time_wait 狀態,不能釋放套接字資源(端口),就好比守寡期,這段時間內套接字資源(端口)不得回收利用。

斷開 TCP 連接狀態切換

客戶端發送斷開連接報文,其中 FIN 置位,攜帶序列號為 a 後,進入 fin_wait_1 狀態(終止等待狀態)

服務器收到客戶端連接斷開報文段後,就立即給客戶端發送確認,其中 ACK 置位,攜帶序列號 a+1,然後服務器就進入到 close-wait 狀態,此時服務器進程就通知高層應用進程,因而從服務器到客戶端的連接就釋放了。此時是“半關閉”狀態。即客戶端不可以發送給服務端,但是服務端可以發送給客戶端。

此時,若服務端沒有數據報要發送給客戶端了,其應用進程就通知 TCP 釋放連接,然後給客戶端發送連接斷開報文段,並等待確認。客戶端發送確認後,進入 time-wait,注意,此時 TCP 連接還沒有釋放掉,然後經過時間等待計時器設置的2MSL後,客戶端才進入到 close 狀態,服務端收到客戶端的確認斷開報文後,就進入 close 狀態。

TCP談戀愛和分手都是日常狀態,為的是提供可靠的連接服務。


分享到:


相關文章: