TCP的分分合合(面試必問)
TCP連接與斷開
前言
相信面試過的小夥伴對這個話題應該不陌生,算是面試必問了,三次握手,四次揮手,以及其中的一些衍生問題。
TCP/IP(Transmission Control protocol / Internet Protocol)-傳輸控制協議,當前熱門流行的網路傳輸控制協議,作用在傳輸層,同時TCP協議是面向連接的,是可靠的;


握手
首先是握手連接圖解,
一般回答的是也是分步驟來回答的;
1、將三步具體回答出來,每一步做的是什麼
2、將標誌位資訊解釋,同時還有序列號
3、注意總結為什麼需要三次
客戶首先發送一個特殊的TCP報文段,伺服器用另一個特殊的TCP報文段來響應. 最後客戶再用第三個特殊報文段作為響應, 前兩個報文段不承載 「 有效載荷" ,也就是不包含應用層數據; 而第三個報文段可以承載有效載荷,由於在這兩台主機之間發送了3個報文段,所以這種連接建立過程常被稱為三次握手。
--《電腦網路-自頂向下方法》
-
三次握手建立連接(****步驟)
1.在一開始的請求當中,先是客戶端發送請求,同時將標誌位SYN值為1,請求建立連接,並將seq值變為x發送
2.伺服器接收到請求之後,表示同意建立請求,將ACK置1,並將seq變為x+1,同時發送一個數據位y過去
3.客戶端收到請求確認之後,再將收到的心情返回給伺服器 -
FLAG-SYN、ACK、FIN(重點關注)
- SYN是Synchronize Sequence Numbers用來建立連接時所發送的同步訊號
- ACK是Acknowledgement用於對收到的數據進行確認,確認的數據由確認序列號表示
- FIN是finish,常常在斷開連接時候來使用,表明自己不會發送數據了,要斷開連接了,但在這個標誌位下,是可以接收數據的
-
為什麼需要三次?
-
首先是也是比較重要的目的,確認資訊對等。若只有兩次握手,其中被請求建立連接的一方並不能確認自己的發報能力和對方的收報能力。因為在這裡沒有收到回饋,相當於第三次也算是個回饋,這樣兩者的發報和收報都是可以保證正常與否才建立連接。
-
第二是防止超時,假設只有兩次請求,常常會有無效的請求被當作有效的,這時會建立了臟連接,此時像B一樣,確認同意了建立連接,而A並不會理會。

-
揮手
其次是揮手的圖解,和上面一樣也是有步驟和注意事項的
-
步驟(很經典的一個實例)
- 男生:我們分手吧(FIN = 1,seq = x)
- 女生:好的,分吧,我收拾一下就走;等我收拾完告訴你(ACk = 1, seq = y, ack = x+1)
- 女生:我收拾完了,分吧,滾(說完這話,女生不能擁抱男生了)(FIN =1,ACk = 1,seq = w, ack = y+1)
- 男生:好的,再見(雙方還約定了兩個月的過渡時期,才可以分別找新的對象)(Ack = 1,seq = x+1,acl = w+1)
-
TCP連接時是同步的,但結束時是不同步的,當揮手第二次後宣告的了主動關閉方不會再主動發送數據,但仍然可以接收數據,此時處於半關閉狀態。這樣被動關閉方有足夠的時間去處理以前沒有處理完的數據,它可能還有一部分數據沒發送出去需要處理,在此之後提出主動關閉連接。所以4次揮手的設計為連接雙方都提供了一定的處理掃尾工作的時間,從而顯的是必要的。 細比一下,這很人性化,連接不是你想關就關的,就彷彿,你說要停電就立馬把電停了。這樣讓我處於一個窘境,提前為手機充滿電的時間都沒有。
-
關鍵狀態的分析
-
MSL:Maximum Segment LifeTime報文最大存活時間
-
TIME_WAIT:在客戶端最後一次發送ack報文後,就會進入這個階段,等待2MSL之後進入closed狀態;2MSL是報文在網文上生存的最長時間,在超過這個值就會被丟棄。常常面試會問道,為什麼需要這個階段?不是很浪費資源嗎?
1、可靠的終止TCP連接-確認被動關閉方能夠順利進入closed狀態;常常有最後一個ack由於網路沒法到達對方,和下面的2MSL問題回答相似 2、保證讓遲來的TCP報文段有足夠的時間被識別並丟棄為什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?
雖然按道理,四個報文都發送完畢,我們可以直接進入CLOSE狀態了,但是我們必須假象網路是不可靠的,有可以最後一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。在Client發送出最後的ACK回復,但該ACK可能丟失。Server如果沒有收到ACK,將不斷重複發送FIN片段。所以Client不能立即關閉,它必須確認Server接收到了該ACK。Client會在發送出ACK之後進入到TIME_WAIT狀態。Client會設置一個計時器,等待2MSL的時間。如果在該時間內再次收到FIN,那麼Client會重發ACK並再次等待2MSL。所謂的2MSL是兩倍的MSL(Maximum Segment Lifetime)。MSL指一個片段在網路中最大的存活時間,2MSL就是一個發送和一個回復所需的最大時間。如果直到2MSL,Client都沒有再次收到FIN,那麼Client推斷ACK已經被成功接收,則結束TCP連接。 -
CLOSE_WAIT:發生在被動關閉方收到關閉請求,並做出第一次應答後進入的狀態,該狀態是在等待關閉,並且通知各個程式執行緒發送剩餘數據,處理後事,關掉一些資源。
-
最後
借鑒了電腦網路書中的知識,還有碼出高效的內容,有什麼錯誤請大家及時指出,感謝閱讀!!

