TCP的三次握手


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

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

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

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

 

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

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

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

TCP的三次握手: 首先Client端發送連接請求報文,Server段接受連接后回復ACK報文,並為這次連接分配資源。Client端接收到ACK報文后也向Server段發生ACK報文,並分配資源,這樣TCP連接就建立了。

下面是另外一種解釋
第一次
第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SENT狀態,等待服務器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。

第二次
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;

第三次

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: