TCP協議之三次握手四次揮手

2022-05-29 10:00:17 字數 2481 閱讀 2213

tcp協議是可靠的傳輸:表現在2個方面

1.是保證資料報可以按照傳送的順序到達

2.另外一方面是保證資料報一定程度的正確性(後文詳解為什麼是一定程度上的正確性)。

其可靠性的實現則基於2點技術,

一點是具有乙個crc校驗,這樣如果資料報中的某些資料出現錯誤可以通過該校驗和發現;

另外一點是每個資料報都有乙個序號,這樣就能保證資料報的順序性,如果出現錯位的資料報可以請求重發。

tcp協議是乙個可靠的傳輸協議,其可靠性表現在2方面,一方面是保證資料報可以按照傳送的順序到達,另外一方面是保證資料報一定程度的正確性(後文詳解為什麼是一定程度上的正確性)。其可靠性的實現則基於2點技術,一點是具有乙個crc校驗,這樣如果資料報中的某些資料出現錯誤可以通過該校驗和發現;另外一點是每個資料報都有乙個序號,這樣就能保證資料報的順序性,如果出現錯位的資料報可以請求重發。

既然說到了格式,那我們先看一下tcp資料報的資料格式。如下圖是tcp資料報的格式,包括原埠、目的埠、序列號和標識位等等內容,內容有些多,看著可能有點眼花。但從大的方面理解,這個資料報其實只包含2部分內容,乙個是包頭,另外乙個則是具體需要傳輸的資料。在tcp協議的控制邏輯中,包頭起著最為關鍵的作用,它是tcp協議中諸如建立連線、斷開連線、重傳和錯誤校驗等各種特性的基礎。

圖2 tcp資料報格式

連線的建立

tcp在具體傳輸資料之前需要建立連線。這裡的連線並不是物理連線,物理連線基於底層的協議已經建立完成,而且tcp建立連線也是要假設底層連線已經成功,tcp的連線其實是乙個虛擬的,邏輯的連線。簡單粗暴的理解,就是客戶端和服務端分別記錄了各自接受到的資料報的序號,並且將自身設定為某種狀態。在tcp協議中,連線的建立通常成為3次握手,從字面的概念可以看出,連線的建立需要經過3次確認的過程。

圖3 建立連線的3次握手

tcp協議3次握手的過程如圖所示,初始狀態客戶端和服務端都處於關閉狀態。主要過程分為3步:

從上面流程可以看出,連線的建立需要經過多次互動,這就是我們日常中所說的建立連線是高成本的操作。在實際生產環境中,為了應對這個問題,會減少連線建立的頻度,通常的做法是建立連線池,傳輸資料時直接從連線池中獲取連線,而不是新建連線。

有人可能覺得可以對建立連線的過程進行優化,比如將客戶端***一次的確認取消掉,覺得這個沒有卵用。對於正常情況確實沒有多大的作用,這裡主要是應對異常情況。因為網路拓撲是非常複雜的,特別是在廣域網中,有著數不清的網路節點,因此會出現各種異常情況。因此,tcp協議在設計的時候必須要保證異常情況下的可靠性。

我們這裡舉乙個例子,就是連線請求超時的情況。假設客戶端向服務端傳送乙個連線請求,由於各種原因,請求一直沒有到達服務端,因此服務端也就沒有回覆連線確認訊息。客戶端連線超時,因此客戶端重新傳送乙個連線請求到服務端,這次比較順利,很快到達了,並且順利建立了連線。之後,前乙個資料報經過長途跋涉最終還是到了服務端,服務端也向客戶端傳送了回覆資料報,服務端認為連線是建立成功的,並且會維持連線。但客戶端層面認為連線是超時的,因此將永遠不會關閉該連線。這樣就會造成服務端有殘留的資源,從而造成服務端資源浪費,久而久之可能會導致服務端無新連線資源可用。

另外乙個需要說明的是客戶端和服務端的套接字都有相應的狀態,而且狀態會隨著連線的不同階段變化。初始狀態都是close,最終連線建立成功後都是established,具體變化過程如圖3所示。後面本文會詳細介紹狀態變化情況。

傳輸資料

完成連線建立之後,客戶端和服務端就可以進行資料傳輸了。我們知道tcp是可靠的傳輸,那麼傳輸的可靠性是通過什麼來保證的呢?主要就是通過包頭中的校驗和、請求序列號和應答序列號(參考圖2)。

tcp資料內容的可靠性是通過校驗和保證的。tcp在傳送資料時都會計算整個資料報的校驗和,並儲存在包頭的校驗和字段中。接收方會按照規則進行計算,從而確認接收到的資料是否是正確的。傳送發計算校驗和的流程大概如下:

接收方將所有原碼相加,高位疊加,如果全為1則表示資料正確,否則說明資料有錯誤。

tcp資料報順序的可靠性是通過請求序列號和應答序列號保證的。在資料傳輸中的每個請求都會有乙個請求序列號,而在接收方接收到資料後會傳送乙個應答序列號,這樣傳送方就能知道資料是否被正確接收,而接收方也能知道資料是否出現亂序,從而保證資料報的順序性。

斷開連線

tcp關閉連線分為4步,稱為4次揮手。連線的關閉不一定是在客戶端發起,服務端也可以發起關閉連線。關閉連線的過程如下:

圖4 關閉連線流程示意圖

tcp是全雙工通訊,因此關閉連線時需要雙向關閉連線。首先是關閉發起方關閉本端的連線,然後是關閉接收方在收到發起方的關閉請求後,除了回覆關閉應答外,還要確保資料傳輸完成後發起乙個關閉連線的請求,保證雙向同時關閉。

TCP之三次握手四次揮手

tcp提供一種面向連線的,可靠的位元組流服務。tcp首部的資料格式如下。如果不計任選字段,通常是20個位元組 目的埠 埠指明接收方計算機上的應用程式介面。tcp報頭中的源埠號和目的埠號同ip資料報中的源ip與目的ip唯一確定一條tcp連線。控制位 urg ack psh rst syn fin,共6...

TCP之三次握手四次揮手

tcp提供一種面向連線的,可靠的位元組流服務。tcp首部的資料格式如下。如果不計任選字段,通常是20個位元組 目的埠 埠指明接收方計算機上的應用程式介面。tcp報頭中的源埠號和目的埠號同ip資料報中的源ip與目的ip唯一確定一條tcp連線。控制位 urg ack psh rst syn fin,共6...

tcp協議三次握手 四次揮手

起初,伺服器和客戶端都為closed狀態。在通訊開始前,雙方都得建立各自的傳輸控制塊 tcb 伺服器建立完tcb後遍進入listen狀態,此時準備接收客戶端發來的連線請求。第一次握手 客戶端向服務端傳送連線請求報文段。該報文段的頭部中syn 1,ack 0,seq x。請求傳送後,客戶端便進入syn...