1. 程式人生 > 其它 >簡介TCP協議的三次握手和四次揮手

簡介TCP協議的三次握手和四次揮手

技術標籤:網路網路協議網路tcpip

我們在學習網路程式設計的時候,肯定需要學習TCP相關的知識,其中他的三次握手和四次揮手過程必不可少。接下來我們簡單瞭解一下什麼是三次握手和四次揮手。

一、三次握手

即通訊雙方建立連線的過程,在建立連線時,雙方一共需要傳送三個包來建立一個可靠的連線。

那為什麼三個包就可以確認連線呢?(其實這只是在正常情況下)

我們來考慮一下,我們平時和別人聊天的過程。

A:你好,在嗎

B:你好,我在

A:好的

........開始聊天........

但是,由於我們網路的不可靠性,在未建立可靠連線時,我們傳送的訊息都是會丟失的。

第一個不可靠:

假如A在傳送“你好,在嗎”後,沒有收到B的回覆,那麼這裡會怎麼樣呢?

這裡分兩種情況,第一種,由於網路原因,A傳送的“你好,在嗎”這條訊息B沒有收到;第二種,B傳送的“你好,我在”由於網路原因丟失,A沒有收到

不管哪種情況,A都會再次傳送請求連線的訊息給B,以確保收到B的回覆。

第二個不可靠

B收到了A傳送的“你好,在嗎”訊息後,給A回覆了“你好,我在”,但是由於網路等原因,A沒有收到,或者A收到了B的回覆,但是A再次回覆B的訊息“好的”B沒有收到

這個時候B會再次傳送訊息給A,直到收到A的回覆或者到達最大重試次數。這裡有個最大重試次數5次(可以設定),且每次重試時間間隔分別3s/6s/12s...,如果指定次數還沒有收到回覆,那麼會關閉這個對話(即TCP中的連線)

如果A第二次給B發訊息後,B沒有收到,那麼A再發訊息的時候,B會給A一個RST包響應,讓A感知到B的錯誤

這裡提一個SYN攻擊

SYN攻擊就是偽造大量的不存在的客戶端,然後給服務端傳送連線請求,當服務端收到連線請求後,回覆給這些不存在的客戶端ACK訊息,但是收不到他們的ACK訊息,這時服務端會重複(5次)的給這些客戶端傳送ACK包。這樣的話,對於伺服器的記憶體,頻寬都有很大的消耗。

二、四次揮手

所謂的四次揮手,即TCP連線釋放的過程

想想我們過年從家走的過程

我:我要走啦
我媽:嗯,你等一下,我把吃的給你塞到車上再走
(開始狂塞)
我媽:好了,你可以走了
我:好的,我走了
......出發,去打工......

至於為什麼四次揮手,是因為伺服器在收到客戶端的斷開請求時,要花一定的時間來處理之前的請求。所以伺服器就先給客戶端一個答覆,告訴他收到了請求,等伺服器處理完了,再告訴客戶端他處理完了。

這裡考慮網路的不可靠,我們需要考慮一下情況

假如我媽說的“好了,你可以走了”,因為我耳背,沒有聽到,或者我回復的“好的,我走了”,因為我聲音太小,她沒有聽到,這個時候,我媽在看到我沒回他訊息,就會再次給我說,“好了,你快走”。直到我回復她,她聽到了。

假如我說的“好的,我走了”,我媽聽到了,沒有什麼要給我交代的了,那麼我走了就走了。但是,如果我就這麼直接走了,我媽想了一下還有一個鴨忘記給我了。那我不就少帶了東西嗎。所以這裡我不能直接走,我需要等待2MSL時間,確保沒有事了再走。

什麼是MSL?

Maximum Segment Lifetime:一段TCP報文在傳輸過程中的最大生命週期。

為什麼要等待2MSL?

這是最保守的方式。2MSL即是伺服器端發出為FIN報文和客戶端發出的ACK確認報文所能保持有效的最大時長。

假如在最後一次客戶端傳送ACK報文給服務端時,由於種種原因,服務端沒有收到,這個時候服務端會再次傳送一個ACK報文給客戶端,客戶端再次向伺服器端發出ACK確認報文,計時器重置,重新開始2MSL的計時。

隨筆隨筆