如何理解TCP的三次握手原理?

聶先森


根據我所知道的回答一下這個問題。

TCP的三次握手,有兩個作用:

  • 建立通信雙方的端到端的連接

  • 完成通信雙方的認證

TCP建立連接的三次握手

TCP建立連接的過程是客戶端和服務器之間的通信過程。

TCP建立連接三次握手的過程如下圖所示:

  • 第一次握手:客戶端發送SYN=1,seq=x報文到服務器端

  • 第二次握手:服務端收到客戶端報文之後,發送SYN=1,seq=y(服務端的序列號),ack=x+1(確認客戶端的序列號)

  • 第三次握手:客戶端收到服務端的報文之後,發送ACK=1(標識確認報文) seq=x+1,ack=y+1(確認服務端的序列號為y報文)

TCP報文的首部

要深入瞭解TCP建立連接的三次握手,需要了解一下TCP報文的首部信息。

如下圖所示,顯示了TCP報文的首部,與TCP三次握手相關的字段是:

  • 控制位(5位):SYN、ACK。用於傳輸TCP建立連接的控制數據,SYN標識同步報文、ACK標識確認報文。

  • 序號(32位):Seq。用於標識傳輸報文的序號,同時用於雙方的認證,用(源ip地址、目的ip地址、源端口、目的端口)標識端對端的通信,用(序列號、確認號)標識報文。

  • 確認號(32位):Ack。用於標識傳輸報文的確認號,確認對方的報文。

總結

  • TCP的三次握手是TCP連接的第一步,完成客戶端和服務端的建立連接。

  • TCP三次握手的過程,同時完成了客戶端和服務端通過序列號和確認號完成雙方的認證。


對於TCP三次握手,建立連接,完成認證,大家有什麼看法呢,歡迎在評論區留言討論。

如需更多幫助,請私信關注。謝謝


網絡通信兵


關於TCP協議三次握手的問題,在面試中是最為常見的知識點之一,得到了很多面試官的青睞,如果這個知識點沒有掌握好,面試官要是問得深入一點,求職者往往會不知所措。

為什麼建立連接需要三次握手?

首先非常明確的是兩次握手是最基本的。第一次握手,客戶端發了個連接請求消息到服務端,服務端收到信息後知道自己與客戶端是可以連接成功的,但此時客戶端並不知道服務端是否已經接收到了它的請求,所以服務端接收到消息後得應答,客戶端得到服務端的反饋後,才確定自己與服務端是可以連接上的,這就是第二次握手。

客戶端只有確定了自己能與服務端連接上才能開始發數據。所以兩次握手肯定是最基本的。

看到這裡,你或許會問,那麼為什麼需要第三次握手呢?我們來看一下,假設一下如果沒有第三次握手,而是兩次握手後我們就認為連接成功了,那麼會發生什麼?第三次握手是為了防止已經失效的連接請求報文段突然又傳到服務端,因而產生錯誤。

譬如發起請求遇到類似這樣的情況:客戶端發出去的第一個連接請求由於某些原因在網絡節點中滯留了導致延遲,直到連接釋放的某個時間點才到達服務端,這是一個早已失效的報文,但是此時服務端仍然認為這是客戶端的建立連接請求第一次握手,於是服務端回應了客戶端,第二次握手。

如果只有兩次握手,那麼到這裡,連接就建立了,但是此時客戶端並沒有任何數據要發送,而服務端還在傻傻的等候佳音,造成很大的資源浪費。所以需要第三次握手,只有客戶端再次回應一下,就可以避免這種情況。

如果你覺得上面的闡述過於專業化,還是有點萌萌的,不要緊,下面我們來個生活案例來闡述。

TCP 三次握手好比在一個夜高風黑的夜晚,你一個人在小區裡散步,不遠處看見小區裡的一位漂亮妹子迎面而來,但是因為路燈有點暗等原因不能100%確認,所以要通過招手的方式來確定對方是否認識自己。

你首先向妹子招手(syn),妹子看到你向自己招手後,向你點了點頭擠出了一個微笑(ack)。你看到妹子微笑後確認了妹子成功辨認出了自己(進入estalished狀態)。

但是妹子有點不好意思,向四周看了一看,有沒有可能你是在看別人呢,她也需要確認一下。妹子也向你招了招手(syn),你看到妹子向自己招手後知道對方是在尋求自己的確認,於是也點了點頭擠出了微笑(ack),妹子看到對方的微笑後確認了你就是在向自己打招呼(進入established狀態)。

於是兩人加快步伐,走到了一起,彼此之間相互擁抱。

我們來回顧一下,這個過程中總共有四個動作,

你招手

妹子點頭微笑

妹子招手

你點頭微笑

其中妹子連續進行了兩個動作,先是點頭微笑(回覆對方),然後再次招手(尋求確認),實際上我們可以將這兩個動作合成一個動作,招手的同時點頭和微笑(syn+ack)。於是這四個動作就簡化成了三個動作。

你招手

妹子點頭微笑並招手

你點頭微笑

這就是三次握手的本質,中間的一次動作是兩個動作的合併。通過這個案例,不知你對TCP三次握手,有沒有進一步的理解。

握手完成後,開始TCP 數據傳輸

TCP 數據傳輸就是兩個人隔空交流,有一定的距離,需要對方反覆確認聽見了自己的話。

你喊了一句話(data),妹子聽見了之後要向你回覆自己聽見了(ack)。如果你喊了一句,半天沒聽到妹子回覆,你會很低落,好比談戀愛的時候,你滿腔熱情,而妹子忽冷忽熱,所以你鍥而不捨,一次不行,就兩次,兩次不行就三次,這就是tcp重傳。

也有可能是妹子知道你的本意了,但是妹子有點害羞,遲遲沒有回覆亦或是妹子回覆了你沒收到,以至於你沒收到妹子的回覆。你不能判斷究竟到底妹子喜不喜歡你,對你有沒有好感,沒關係,男人嘛?要主動點,重傳一下就好。

既然會重傳,妹子就有可能同一句話聽見了兩次,這就是去重。對於重傳和去重這兩項工作操作系統的網絡內核模塊都已經幫我們處理好了,我們不用理會。

由於筆者水平有限,由於筆者水平有限,很多網絡基礎知識需要去深入瞭解去探索,文中紕漏之處在所難免,權當拋磚引玉,還請各位大牛不吝賜教。歡迎交流。

【END】



洪生鵬


TCP(傳輸控制協議)位於網絡層(IPv4或者IPv6)之上,用來給上層應用提供一種面向連接的、可靠的字節流服務。主要是這三個特性:面向連接可靠字節流。通過這三個特性,可以很好的理解TCP以及三次握手原理。

面向連接:是指交換數據前,通信雙方必須通過相互聯繫來建立一個TCP連接,然後才可以傳輸數據。所以使用TCP的應用在數據可交換前,通過三次握手建立連接。同時連接的狀態也需要維護,部分信息也在三次握手中完成協商,比如MSS字段。TCP連接是雙向的,雙方維護自己的TCP連接。

字節流:這是一種與上層應用交互的方式,對於應用程序來說,只需要將數據按照字節流送個TCP即可,TCP負責把這些字節按照寫入順序送到對端。應用程序可以寫入10字節,然後寫入20字節,然後寫入30字節。TCP只負責把這些數據傳遞給對方,可能通過一個報文,也可能通過兩個報文,或者三個報文,這個對上面是不透明的,但最終結果是這些數據按照寫入的順序流,到達對方。

可靠的:TCP通過確認ACK和序列號來保證數據傳輸的可靠性。本端向對端發送的信息(序列號為N),對端收到後,會返回一個帶ACK標誌,序列號為N+1的報文,期望本端發送後面的字節流。在實際中,為了效率,本端並不會收到每個報文的ACK報文後,才發送下一個報文,而是發送一組報文,對端只返回最後一個報文的ACK,表明該報文以及前面的報文都已收到。但是

對於SYN報文,是立刻返回ACK的。

由這三個性質,就可以理解三次握手原理。因為是面向連接的,所以需要SYN標誌建立連接,獲取相關信息,主要是首包序列號(如果沒有獲取首包序列號,則不知道數據從哪裡開始傳輸,否則開頭即使丟包也無法知道);因為是可靠的,需要ACK和序列號來確保可靠;同時連接是雙向的,所以本端對端都需要SYN+ACK交互。可以理解為兩次交互,對於本端來說,發送SYN報文,接受ACK;對於對端來說,發送SYN報文,接受ACK,其實就是三次握手所做的工作。


分享到:


相關文章: