【電腦網路】TCP的三次握手與四次揮手

今天講一下TCP的三次握手與四次揮手

1.首先說TCP 協議的特點:TCP是在不可靠的IP層之上實現的可靠的數據傳輸協議,它主要解決傳輸的可靠、有序、無丟失和不重複問題。
TCP 是TCP/IP 體系中非常複雜的一個協議,主要特點如下:
1) TCP 是面向連接的傳輸層協議。
2) 每條TCP 連接只能有兩個端點,每條TCP 連接只能是點對點的(一對一)。
3) TCP 提供可靠的交付服務,保證傳送的數據無差錯、不丟失、不重複且有序。

這裡是一個提問點:如何保證數據無差錯、不丟失、不重複且有序的?有哪些機制來保證?
答:TCP 使用了校驗、序號、確認和重傳等機制來達到這一目的。

4) TCP 提供全雙工通訊,允許通訊雙方的應用進程在任何時候都能發送數據,為此TCP 連接的兩端都設有發送快取和接收快取,用來臨時存放雙向通訊的數據。
這裡是一個提問點:為什麼需要設置快取,快取的作用?
答:發送快取用來暫時存放以下數據:1.發送應用程式傳送給發送方TCP 準備發送的數據;2.TCP 已發送但尚未收到確認的數據。
接收快取用來暫時存放以下數據:1.按序到達但尚未被接收應用程式讀取的數據;2.不按序到達的數據。
5) TCP是面向位元組流的,雖然應用程式和TCP的交互是一次一個數據塊(大小不等),但TCP把應用程式交下來的數據僅視為一連串的無結構的位元組流。
一個位元組佔一個序號,每個報文段用第一個位元組的序號來標識,例如,一報文段的序號欄位值是301, 而攜帶的數據共有l00B, 表明本報文段的數據的最後一個位元組的序號是400, 因此下一個報文段的數據序號應從401開始,也就是期望的下一個序號(確認號)。

這裡說下關於不同層的數據處理單位問題網路的OSI定義的7層里,最底層的物理層傳輸的是比特流(bit)、倒數第2數據鏈路層處理的是以幀(frame)為單位的,再往上就是網路層處理的單位是報文(message),再往上是傳輸層,還是使用報文,傳輸層是上三層邏輯層與下三層物理層的一個中間層。每一層都會把前一層把數據處理打包一次,例如物理層傳到數據鏈路層,數據鏈路層就會把比特處理打包成幀,網路層就會把幀處理打包成報文。

 

TCP 是面向連接的協議,因此每個TCP 連接都有三個階段:連接建立、數據傳送和連接釋放。

三次握手建立連接:

部分欄位解釋:
1) 序號欄位(就是seq):序號欄位的值指的是本報文段所發送的數據的第一個位元組的序號。
2) 確認號欄位(就是ack):是期望收到對方的下一個報文段的數據的第一個位元組的序號。若確認號為N, 則表明到序號N-1為止的所有數據都已正確收到。(累積確認)
3) 確認位ACK:只有當ACK=1時確認號欄位才有效。當ACK=0時,確認號無效。TCP 規定,在連接建立後所有傳送的報文段都必須把ACK置1。
4) 同步位SYN:同步SYN=1表示這是一個連接請求或連接接收報文。當SYN= 1, ACK=0 時,表明這是一個連接請求報文,對方若同意建立連接,則在響應報文中使用SYN= 1, ACK=1。即SYN=1 表示這是一個連接請求或連接接收報文。
5) 終止位FIN (Finish) :用來釋放一個連接。FIN=1表明此報文段的發送方的數據已發送完畢了並要求釋放傳輸連接。

三次握手具體步驟:
1) 第一次握手客戶機的TCP首先向伺服器的TCP發送一個連接請求報文段。這個特殊的報文段中不含應用層數據,其首部中的SYN標誌位被置為1。另外,客戶機會隨機選擇一個起始序號seq = x(連接請求報文不攜帶數據,但要消耗一個序號)。
2) 第二次握手伺服器的TCP 收到連接請求報文段後,如同意建立連接,就向客戶機發回確認,並為該TCP連接分配TCP快取和變數。在確認報文段中,SYN 和ACK 位都被置為1, 確認號欄位的值為x+1,並且伺服器隨機產生起始序號seq= y( 確認報文不攜帶數據,但也要消耗一個序號)。確認報文段同樣不包含應用層數據。
3) 第三次握手當客戶機收到確認報文段後,還要向伺服器給出確認,並且也要給該連接分配快取和變數。這個報文段的ACK 標誌位被置1, 序號欄位為x+1, 確認號欄位ack=y+1。該報文段可以攜帶數據,若 不攜帶數據則不消耗序號 http中的tcp連接的第三次握手的報文段中就捎帶了客戶對萬維網文檔的請求。
成功進行以上三步後,就建立了TCP 連接,接下來就可以傳送應用層數據。TCP 提供的是全雙工通訊, 因此通訊雙方的應用進程在任何時候都能發送數據。

【總結】:
1) 第一次握手:客戶機向伺服器發送連接請求報文段;
2) 第二次握手:伺服器收到連接請求並確認,表明我收到你的請求了;
3) 第三次握手:客戶機收到伺服器的確認報文後向伺服器給出確認,表明我收到你的確認了 。

【拓展問題1】:什麼是SYN洪泛攻擊?(三次握手機制有什麼問題?)
答:由於伺服器端的資源是在完成第二次握手時分配的,而客戶端的資源是在完成第三次握手時分配的,攻擊者發送TCP的SYN報文段,SYN是TCP三次握手中的第一個數據包,而當伺服器返回ACK後,該攻擊者就不對其進行再確認,那這個TCP連接就處於掛起狀態,也就是所謂的半連接狀 態,伺服器收不到再確認的話,還會重複發送ACK給攻擊者。這樣更加會浪費伺服器的資源。攻 擊者就對伺服器發送非常大量的這種TCP連接,由於每一個都沒法完成三次握手,所以在伺服器上,這些TCP連接會因為掛起狀態而消耗CPU和記憶體,最後伺服器可能死機,就無法為正常用戶 提供服務了。
【拓展問題2】:如果已經建立了連接,但是客戶端突然出現故障了怎麼辦?
TCP還設有一個保活計時器,顯然,客戶端如果出現故障,伺服器不能一直等下去,白白浪費資源。伺服器每收到一次客戶端的請求後都會重新複位這個計時器,時間通常是設置為2小時,若兩 小時還沒有收到客戶端的任何數據,伺服器就會發送一個探測報文段,以後每隔75秒鐘發送一
次。若一連發送10個探測報文仍然沒反應,伺服器就認為客戶端出了故障,接著就關閉連接。
【拓展問題3】:為什麼不採用「兩次握手」建立連接呢?
答:這主要是為了防止兩次握手情況下已失效的連接請求報文段突然又傳送到伺服器而產生錯誤。考慮下面這種情況。客戶A 向伺服器B 發出TCP 連接請求,第一個連接請求報文在網路的某
個結點長時間滯留, A 超時後認為報文丟失,於是再重傳一次連接請求, B 收到後建立連接。數
據傳輸完畢後雙方斷開連接。而此時,前一個滯留在網路中的連接請求到達伺服器B, 而B 認為A 又發來連接請求,此時若使用「三次握手」,則B 向A 返回確認報文段,由於是一個失效的請求,因
此A 不予理睬,建立連接失敗。若採用的是「兩次握手」,則這種情況下B 認為傳輸連接已經建立,
並一直等待A 傳輸數據,而A 此時並無連接請求,因此不予理睬,這樣就造成了B的資源白白浪費。

四次揮手釋放連接

1) 第一次揮手:客戶機打算關閉連接時,向其TCP發送一個連接釋放報文段,並停止發送數據,主動關閉TCP 連接,該報文段的FIN 標誌位被置1, seq= u, 它等於前面已傳送過的數據的最後一個位元組的序號加1 (FIN 報文段即使不攜帶數據,也要消耗一個序號)。TCP是全雙工的,即可以想像為一條TCP 連接上有兩條數據通路。發送FIN 報文時,發送FIN 的一端不能再發送數據,即關閉了其中一條數據通路, 但對方還可以發送數據。
2) 第二次揮手:伺服器收到連接釋放報文段後即發出確認,確認號是ack = u + 1, 而這個報文段自己的序號是v, 等千它前面已傳送過的數據的最後一個位元組的序號加1 。此時,從客戶機到伺服器這個方向的連接就釋放了TCP連接處於半關閉狀態。但伺服器若發送數據,客戶機仍要接收,即從伺服器到客戶機這個方向的連接並未關閉。
3) 第三次揮手:若伺服器已經沒有要向客戶機發送的數據,就通知TCP釋放連接,此時其發出FIN=1的連接釋放報文段。
4) 第四次揮手:客戶機收到連接釋放報文段後,必須發出確認。在確認報文段中,ACK欄位被置為1, 確認號ack= w + 1, 序號seq= u + 1 。此時TCP連接還未釋放,必須經過時間等待計時器設置的時間2MSL(最長報文段壽命)後,A才進入連接關閉狀態。

【總結】:
1) 第一次揮手:客戶機向伺服器發送連接釋放報文段,並停止發送數據,主動關閉TCP連接;
2) 第二次揮手:伺服器收到釋放報文段後確認,這個時候客戶機到伺服器之間的連接已經關閉,但伺服器到客戶機的連接沒有關閉,因為如果伺服器還要發送數據,客戶機仍要接受的;
3) 第三次揮手:如果伺服器沒有數據要發送給客戶機,就發出連接釋放報文段給客戶機;
4) 第四次揮手:客戶機收到釋放報文段後發出確認。此時TCP連接還未釋放,必須經過時間等待計時器設置的時間2MSL(最長報文段壽命)後才進入連接關閉狀態。