TCP三次握手與四次揮手

TCP建立連接與斷開連接的過程如下圖:
這裏寫圖片描述
TCP連接斷開其狀態轉移路線如下:
這裏寫圖片描述
其中以上1,2,3段則代表的爲TCP建立連接的時的三次握手,過程如下:

  1. 客戶端client主動發起請求連接,發送攜帶SYN標誌同步報文段1,幷包含一個ISN值爲1000的序號,並指定自己的最大段尺寸mss爲1460等;
    其代表含義爲:序號是1000,這個序號在⽹網絡通訊中⽤用作臨時的地址,每發一個數據字節,這個序號要加1,這樣在接收端可以根據序號排出數據包的正確順序,也可以發現丟包的情況,另外,規定SYN位和FIN位也要佔一個序號,這次雖然沒發數據,但是由於發了SYN位,因此下次再發送應該用序號1001。mss表示最大段尺寸,如果一 個段太大,封裝成幀後超過了鏈路層的最大幀長度,就必須在IP 層分片,爲了避免這種情況,客戶端聲明自己的最大段尺寸,建議服務器端發來的段不要超過這個長度。
  2. 服務器server端發出段2,其收到連接請求,其同意與client建立連接,並向其發送自己的連接請求SYN,其ISN值爲8000,聲明自己最大段尺寸爲mss爲1024,並對第一個同步報文段進行了確認。其代表含義是:我接收到序號1000及其以前所有的段,請你下次發送序號爲1001的段,也就是應答了客戶端的連接請求,同時也給客戶端發出一個連接請求,同時聲明最大尺寸爲1024“;
  3. 段3是client端對第2同步報文段的確認,確認序號爲8001.

以上即爲TCP三次握手的具體過程。
4、5、6段則是數據傳輸。
以上第一個圖中7、8、9、10段則代表TCP斷開連接時的四次揮手,具體過程如下:

  1. 客戶端發出段7,FIN位表示關閉連接的請求;
  2. 服務器發出段8,應答客戶端的關閉連接請求;
  3. 服務器發出段9,其中也包含FIN位,向客戶端發送關閉連接請求;
  4. 客戶端發出段10,應答服務器的關閉連接請求。

至此,TCP連接將斷開,client端則進入TIME_WAIT狀態(即客戶端還要生存2MSL生存時間,下篇博客詳解此狀態),server端則進入CLOSE狀態。

此處說明TCP建立連接後數據傳輸的過程,依然以第1個圖爲例:

  1. 客戶端發出段4,包含從序號1001開始的20個字節數據;
  2. 服務器發出段5,確認序號爲1021,對序號爲1001-1020的數據表示確認收到,同時請求發送序號1021開始的數據,服務器在應答的同時也向客戶端發送從序號8001開始的10個字節數據,這稱爲piggyback;
  3. 客戶端發出段6,對服務器發來的序號爲8001-8010的數據表示確認收到,請求發送序號8011開始的數據。

超時重傳:在數據傳輸過程中,ACK和確認序號是非常重要的,應用程序交給TCP協議發送的數據會暫存在TCP層的發送緩衝區中,發出數據包給對方之後,只有收到對方應答的ACK段才知道該數據包確實發到了對方,可以從發送緩衝區中釋放掉了,如果因爲網絡故障丟失了數據包或者丟失了對方發回的ACK段,經過等待超時後TCP協議自動將發送緩衝區中的數據包重發。
其實現機制則是對每一個TCP報文段維護一個重傳定時器,定時器在TCP報文段第一次發送時啓動,如果超時未收到對方的應答,TCP模塊則將重傳TCP報文段並重置定時器,下次的超時時間與執行多少次重傳設定取決於TCP重傳策略。

知道以上所有的知識,現在回答兩個經典問題:
1.爲什麼TCP連接要經過3次握手?

  • 防止已失效的連接請求報文再一次傳到對端(服務端):若客戶端發送一個連接請求沒有丟失,由於某些網絡結點長時間滯留,客戶端一定時間未收到服務端的確認,則會重傳一次連接請求,此連接收到確認,建立連接,數據傳輸完畢,釋放連接,此時第一次滯留的連接請求則到達服務端,服務端收到此滯留的報文段後,誤認爲是客戶端又一次的連接請求,於是向客戶端發出確認報文段,同意建立連接,假定是2次握手,此時服務器端則認爲連接確立了,並一直等待客戶端發來數據,可客戶端並不認定這次連接,不會發任何數據,則會造成服務器資源的浪費,但採用3次握手,客戶端則不會給服務器端的確認發出確認,服務器收最終不到確認信息則會放棄這次連接。

2.爲什麼TCP連接斷開要經過4次揮手?
首先了解半關閉狀態:通信的一端可以發送結束報文段給對方,告訴本端已經完成了數據的發送,但允許繼續接收來自對方的數據,直到對方也發送結束報文段以關閉連接,將這種狀態稱爲半關閉狀態。

  • 依然以第一幅圖爲例,服務器關閉連接通常需要4個段,服務器的應答和關閉連接請求通常不合併在一個段中,因爲有連接半關閉的情況,客戶端關閉連接之後就不能再發送數據給服務器了,但是服務器可能還有很多數據還未發送給客戶端,其則需要繼續發送數據給客戶端,直到發送完成,服務器則在關閉連接。
  • 兩個端都要確認對方端的FIN,保證TCP可靠的斷開連接,若沒收到ACK,則超時重傳。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章