TCP協議報文格式和三次握手,四次揮手

這裏寫圖片描述


源端口和目的端口: 用來表示發送主機的進程和接收主機的進程,實現TCP複用和分用

序號: TCP是面向字節流的,TCP連接中的每個字節都按序編號,序號字段又叫報文段序號,指的是當前報文段的第一個字節的序號,比如一報文段的序號字段爲301,數據有100字節,則序號爲301,下一個報文段應該從401開始,序號爲401

確認號:期望收到下一個報文段的第一個字節序號,比如A發送一個報文段序號爲501,數據長度爲200,則當B接收到501-700報文段,則希望下一次接收的數據序號爲701。

注意: 確認號 = N,表示到N-1爲止的所有數據都正確收到

數據偏移:佔4個比特位,最大能表示的數字爲1111(15),它的單位是4字節,這個字段實際上指出TCP首部長度,一般爲0101,也就是5 * 4 = 20字節,最大爲15 * 4 = 60字節,這也是TCP最大的首部長度(意味着選項和填充字段最大爲60 - 20 = 40字節)

保留:佔6位,以後使用,現在爲0

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述



TCP的建立和釋放連接

在瞭解完TCP的報文格式,下一個重點就是,TCP的建立和釋放連接,書上一般形象稱爲:三次握手,四次揮手

我們知道TCP是面向連接的,概括來說有三個過程:

  1. 建立連接

  2. 傳輸數據

  3. 釋放連接

TCP連接的建立是採用客戶服務器方式,主動發起連接請求的應用進程稱爲客戶端,被動等待連接建立的成爲服務器。

TCP的連接建立

連接建立如下圖:

這裏寫圖片描述

對於服務器而言,剛開始,它建立套接字,執行綁定,監聽函數之後處於listen狀態,等待客戶端發出請求,如果有則響應。

對於客戶端,A發送一個連接請求報文段,其中將首部中的SYN=1,同時選擇一個初始序號seq=x,TCP規定SYN報文段(即SYN=1的報文段)不能攜帶數據,不過還是要消耗一個序號,此時TCP客戶端處於SYN-SENT狀態。

B接受到連接請求報文段,如果同意則發送確認報文,在報文中將SYN=1,ACK=1,確認號設置爲x+1,注意它也會爲自己選擇一個初始序號seq=y,當然這個報文端也不攜帶數據但是消耗一個序號,此時TCP服務器端出於SYN-RCVD狀態。

最後客戶端收到B的確認還需要給出確認,這個確認報文段ACK=1,確認號ack=y+1,同時發送自己的序號seq=x+1,TCP規定,ACK報文段可攜帶數據,如果不攜帶數據數據則不消耗序號。這時,TCP連接已經建立,A進入established狀態。

當B接收到A確認後,也會進入established狀態。

以上就是三次握手的過程。那麼爲什麼是三次握手?兩次握手行不行?四次握手呢?我在知乎看到一個有意思的圖,可以幫我們理解這個問題:

q

爲什麼不是四次握手?很簡單,因爲三次握手就可以保證連接的正確建立,多一次握手浪費了網絡資源。那麼兩次握手爲什麼不能保證連接的正確建立呢?

謝希仁一書中講到:主要是爲了防止已失效的連接請求報文段突然又傳到了B造成錯誤。

什麼叫已失效的連接請求報文段?我們知道,網路的環境是異常複雜的,報文的傳輸是可能有滯留性的,也就是說,假如A發出一個連接請求報文,由於在網絡某個結點滯留太久,A以爲丟失報文段了就重發一個新的連接請求報文段,然而第一個報文段並沒有丟失經過一段時間都到達了B,這本來已失效了,但是B以爲A又發出一次連接請求,於是B分配資源建立連接。

然而A認爲第一個已經失效了,不會理會B的確認,也不會發送數據,而B還在傻傻的等着A發送數據,這樣子B的資源就被浪費了。

因此,採用三次握手纔會防止以上現象發生。B只有在三次握手後才真正分配資源建立連接,如果收不到確認也就不會建立連接。

瞭解SYN攻擊:

一、TCP握手協議
在TCP/IP協議中,TCP協議提供可靠的連接服務,採用三次握手建立一個連接。
第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。
完成三次握手,客戶端與服務器開始傳送數據,在上述過程中,還有一些重要的概念:

未連接隊列:在三次握手協議中,服務器維護一個未連接隊列,該隊列爲每個客戶端的SYN包(syn=j)開設一個條目,該條目表明服務器已收到SYN包,並向客戶發出確認,正在等待客戶的確認包。這些條目所標識的連接在服務器處於Syn_RECV狀態,當服務器收到客戶的確認包時,刪除該條目,服務器進入ESTABLISHED狀態。
Backlog參數:表示未連接隊列的最大容納數目。

SYN-ACK 重傳次數 服務器發送完SYN-ACK包,如果未收到客戶確認包,服務器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳,如果重傳次數超過系統規定的最大重傳次數,系統將該連接信息從半連接隊列中刪除。注意,每次重傳等待的時間不一定相同。

半連接存活時間:是指半連接隊列的條目存活的最長時間,也即服務從收到SYN包到確認這個報文無效的最長時間,該時間值是所有重傳請求包的最長等待時間總和。有時我們也稱半連接存活時間爲Timeout時間、SYN_RECV存活時間。

二、SYN攻擊原理

SYN攻擊屬於DOS攻擊的一種,它利用TCP協議缺陷,通過發送大量的半連接請求,耗費CPU和內存資源。SYN攻擊除了能影響主機外,還可以危害路由器、防火牆等網絡系統,事實上SYN攻擊並不管目標是什麼系統,只要這些系統打開TCP服務就可以實施。從上圖可看到,服務器接收到連接請求(syn=j),將此信息加入未連接隊列,併發送請求包給客戶(syn=k,ack=j+1),此時進入SYN_RECV狀態。當服務器未收到客戶端的確認包時,重發請求包,一直到超時,纔將此條目從未連接隊列刪除。配合IP欺騙,SYN攻擊能達到很好的效果,通常,客戶端在短時間內僞造大量不存在的IP地址,向服務器不斷地發送syn包,服務器回覆確認包,並等待客戶的確認,由於源地址是不存在的,服務器需要不斷的重發直至超時,這些僞造的SYN包將長時間佔用未連接隊列,正常的SYN請求被丟棄,目標系統運行緩慢,嚴重者引起網絡堵塞甚至系統癱瘓。

TCP的連接釋放

這裏寫圖片描述

數據傳輸結束後,通信雙方都可以釋放連接。A的應用進程首先發送一個請求釋放報文段,並停止發送數據,這個報文段將FIN=1,序號設爲seq=u,此時A的應用進程進入FIN-wait-1狀態。

B接收到釋放報文段即發送確認,確認號爲ack=u+1,這報文段自己的序號爲seq=v,然後B進入Close-wait狀態。此時,TCP連接處於半連接狀態,也就是說A到B這個連接已經釋放了,但是B如果要發送數據,A仍要接收,這個狀態可能要持續一會兒。

當B沒有要發送的數據,就釋放連接,此時發送的報文段必須使FIN=1,因此中間可能發送一些數據,所以seq=w,同時還必須重複上次已經發送的確認好ack=u+1。

最後A在收到B的連接釋放報文,發出確認報文,將ACK=1,確認號爲ack=w+1,而自己序號爲seq=w+1。

這裏寫圖片描述

爲什麼A在Time-Wait必須等待兩個MSL時間?

這裏寫圖片描述

發佈了96 篇原創文章 · 獲贊 119 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章