TCP報文段的首部格式
1.1.首部字段詳解
-
TCP首部包括20字節的固定首部部分及長度可變的其他選項,所以TCP首部長度可變。20個字節又分為5部分,每部分4個字節32位,如圖中的5行,每行表示32位。
-
在傳輸層,TCP報文段包括:TCP首部和TCP數據部分;在網絡層,TCP報文段成為IP數據部分,加上IP首部組成IP數據報;在數據鏈路層,還要在IP數據報前面加上數據鏈路層的首部。
- 源端口和目的端口字段——各占 2 字節(16位)。端口是運輸層與應用層的服務接口。運輸層的復用和分用功能都要通過端口才能實現。
- 序號字段——占 4 字節。TCP 連接中傳送的數據流中的每一個字節都編上一個序號。序號字段的值則指的是本報文段所發送的數據的第一個字節的序號。比如分組的第一個數據包由文件的14個字節數據組成,那么該數據包所添加的序號就是1,同理第二個數據包由文件的59個字節數據組成,那么該數據包所添加的序號就是5;
- 確認號字段——占 4 字節,是期望收到對方的下一個報文段的數據的第一個字節的序號。比如接收端收到由文件14個字節數據+TCP首部組成的數據包后,刪除首部提取14個字節數據,返回的確認號為5,即告訴發送端下一次應該發送文件的第5個字節及其之后字節組成的數據包過來。
- 數據偏移(即首部長度)——占 4 位,它指出 TCP 報文段的數據起始處距離 TCP 報文段的起始處有多遠,也就是TCP首部的長度。“數據偏移”的單位是 32 位字(以 4 字節為計算單位),最大1111表示15x4=60個字節,即表示TCP首部最大長度為60個字節,因此“選項”部分最多40個字節。
- 保留字段——占 6 位,保留為今后使用,但目前應置為 0。
這里的六位二進制位,分別表示不同含義:
-
緊急 URG —— 當 URG = 1 時,表明緊急指針字段有效。它告訴系統此報文段中有緊急數據,應盡快傳送(相當於高優先級的數據)。 即URG=1的數據包不用排隊直接優先傳輸。
-
同步 SYN —— 同步 SYN = 1 表示這是一個連接請求或連接接受報文。即A想與B建立連接,發送過去的第一個數據包(第一次握手)中SYN=1;B返回的數據包(第二次握手)中SYN=1表示同意建立連接。
-
確認 ACK —— 只有當 ACK = 1 時確認號字段才有效。當 ACK = 0 時,確認號無效。
ACK是對已接受數據的確認,當A與B還在請求連接階段,A向B發送的第一個數據包(第一次握手)中ACK=0,無效,所以數據包中不顯示,表示還沒從B中接收到數據;序號Seq也為0,表示A還未向B發送數據;SYN=1,表示正在建立連接。
同理,B向A返回一個數據包(第二次握手)中,確認號ACK=1,表示B收到了A序號為0的數據包;序號Seq=0,也表示B還未向A發送數據;SYN=1表示同意建立連接。
A再向B發送一個數據包(第三次握手)中,確認號ACK=1,表示A收到了B發出的數據包;序號Seq=1,表示A已向B發送了1個數據包(即第一次握手);SYN=0,表示已建立連接。
以下為計算機打開網頁與Web服務器建立連接時抓取的第一個數據包(第一次握手):
可以看到計算機發出的第一個數據包(第一次握手)中,SYN=1,Seq=1,ACK=0無效,所以在藍色框內只能看到序號Seq,看不到確認號ACK;
以下為抓取的第三個數據包(第三次握手):
計算機發出第二個數據包(第三次握手)中,由於已經同步,建立連接,所以SYN=0,此后ACK都為1,所以藍色框中可以看到序號Seq和確認號ACK。
所以,抓包時看到大量的SYN數據包,說明計算機在大量建立會話。另外在建立連接(三次握手)時,SYN與ACK的值與正常通訊時不一樣。
有一種攻擊就是針對建立連接時SYN同步的機制
比如地址為102的計算機B想要與地址為101的計算機A建立連接,B向A發送請求連接數據包,並設置數據包中的源地址為不存在,A收到之后向該不存在的地址發出同意連接的數據包,發送完之后需要等待回復。於是B繼續上述操作,以此類推A不斷發出同意連接數據包並不斷等待,由此大量耗費系統資源。
下圖為使用SYN同步攻擊軟件攻擊XP系統過程中,捕獲的數據包:
紅色框中的地址是攻擊軟件瞎編的不存在的地址,藍色框中顯示建立的會話全是請求連接的TCP報文。
Land攻擊
原理與SYN攻擊類似,都是通過不斷建立同步SYN會話,耗盡系統資源。不同之處在於,Land攻擊發起的請求同步數據包目標地址和源地址都是攻擊對象的地址。
可以看到在Land攻擊時捕獲的數據包,都是請求同步SYN數據包且源地址和目標地址都為攻擊對象地址 192.168.80.66 。
- 推送 PSH (PuSH) —— 接收 TCP 收到 PSH = 1 的報文段,就盡快地交付接收應用進程,而不再等到整個緩存都填滿了后再向上交付。
- 復位 RST (ReSeT) —— 當 RST = 1 時,表明 TCP 連接中出現嚴重差錯(如由於主機崩潰或其他原因),必須釋放連接,然后再重新建立運輸連接。
- 終止 FIN (FINis) —— 用來釋放一個連接。FIN = 1 表明此報文段的發送端的數據已發送完畢,並要求釋放運輸連接。
- 窗口字段 —— 占 2 字節,用來讓對方設置發送窗口的依據,單位為字節。
如圖A要告訴B自己的接收緩存為Y1,B根據A的接收緩存Y1決定發送緩存X2;同理B告訴A自己的接收緩存Y2,A根據B的接收緩存Y2決定自己的發送緩存X1。也就是A/B的接收緩存決定了B/A的發送緩存。
可以看見建立TCP連接時發送的三個數據包(三次握手)的第一個數據包中,Window Size:65535;表示的即是某一連接方的窗口大小。
- 檢驗和 —— 占 2 字節。檢驗和字段檢驗的范圍包括首部和數據這兩部分。在計算檢驗和時,要在 TCP 報文段的前面加上 12 字節的偽首部。
- 緊急指針字段 —— 占 16 位,指出在本報文段中緊急數據共有多少個字節(緊急數據放在本報文段數據的最前面)。
-
選項字段 —— 長度可變。TCP 最初只規定了一種選項,即最大報文段長度 MSS (Maximum Segment Size)是 TCP 報文段中的數據字段的最大長度。數據字段加上 TCP 首部才等於整個的 TCP 報文段。
MSS 告訴對方 TCP:“我的緩存所能接收的報文段的數據字段的最大長度是 MSS 個字節。”
其他選項有:窗口擴大選項、時間戳選項、選擇確認選項(SACK)。
- 填充字段 —— 這是為了使整個首部長度是 4 字節的整數倍。
1.2.抓包驗證
通過抓取計算機訪問Web網站過程抓到的數據包,分析驗證TCP報文段的結構。
這就是建立TCP連接的“三次握手”過程,可以看到第一個數據包(第一次握手),是計算機給web站點發的,建立會話數據包都是SYN類型的,MSS表示最大數據包,即計算機告訴Web站點我支持的最大數據包容量為1460個字節;
第二個數據包(第二次握手),是Web站點給計算機發的同步數據包,告訴計算機我支持的最大數據包為1460個字節。還告訴計算機Win即Web服務器的發送窗口的緩存最多為60240個字節,當Web服務器發送完60240個數據包之后沒有收到確認信息,就停止發送數據包。
第三個數據包(第三次握手),是計算機給Web服務器發送的。Win=65535,表示告訴服務器計算機移動窗口最大緩存為65535個字節,說明計算機最多能接收處理來自Web服務器的65535個字節數據,若Web服務器沒有收到確認,就暫停傳輸數據包,等計算機處理完了再繼續發送。
可以看到建立會話的三個數據包,不僅為了測試網絡是否通暢,還協商了一些參數。
下面就到正題了,可以看到HTTP協議只用一個數據包就能解決問題。
選中TCP協議可以看到目標端口是80,源端口是1057,序號是1,確認號是1,TCP首部長度是20個字節。
之后便是Web服務器給計算機發送網站數據,其中夾雜着計算機給Web服務器的數據包是否收到的反饋信息。
1.3.TCP首部參數圖解:
- 黃色表示TCP報文數據部分,藍色表示TCP首部。可以看到四段TCP報文中序號Seq都是TCP報文數據部分的第一個字節的編號。因為計算機給Web服務器發送的數據為1203字節,所以Web服務器給計算機發送的三個TCP報文中確認號都是204,表示Web服務器收到了1203個字節數據,讓計算機從數據的第204個字節開始發。
- 第五段為計算機給Web服務器發的第二個TCP報文,因為發送的第一個TCP報文已包含1203個字節數據,所以第二個TCP報文發送的數據從204字節開始,所以該報文序號為204;由於收到了Web服務器發的三個TCP報文總計12053個字節的數據,所以該報文的確認號為2054,表示告訴Web服務器,我收到了你傳輸的1~2053個字節,接着從2054個字節開始給我發數據。
- 這就是確認號和序號怎么來的。