1. 程式人生 > >TCP資料包重組實現分析

TCP資料包重組實現分析

TCP重組資料包分析

參照TCP/IP詳解第二卷24~29章,詳細論述了TCP協議的實現,大概總結一下TCP如何嚮應用層保證資料包的正確性、可靠性,即TCP如何實現對資料報文的重組。

首先要設計兩個報文佇列,一個存放正常來到的報文,一個存放失序到來的報文。

 比如正常報文佇列最後一個報文資料如下:

 報文資料段第一位元組的序號                      資料報長度

seq1=100

len1=100

 下一個來到的報文可能有多種情況,現依次分析如下:

1)正常報文

seq2=200

len2=200

seq2 = seq1+len1

由此報文的seq可知,這個報文攜帶資料序號200~399,正是上一個報文的預期後續報文,將此報文追加到正常報文佇列。

 2)完全重複報文

seq2=100

len2=100

seq2 ==seq1 而且len2==len1

這個報文攜帶資料序號100~199,與上一個報文攜帶的資料序號100~199完全一樣,即完全重複,所以應該丟棄這個報文。

 3)重複子報文

seq2=100

len2=50

seq2 ==seq1 而且len2<len1

這個報文攜帶資料序號100~149,說明這是上一個報文的一部分,所以應該丟棄這個報文。

 注:第二、三這兩種情況可以合併,即seq2 ==seq1 而且len2<=len1,這裡分別列出只是為了說明各種不同情況。

 4)部分重複報文情況一

seq2=150

len2=30

seq2>seq1而且seq2<seq1+len1而且seq2+len2<=seq1+len1

即這個報文攜帶序號150~179,這個序號段被包含在上一個報文段中(100~199),

所以應該丟棄這個報文。

 5)部分重複報文情況二

seq2=150

len2=100

seq2>seq1而且seq2<seq1+len1而且seq2+len2>seq1+len1

即這個報文攜帶序號150~249,這個序號段前一部分150~199被包含在上一個報文段(100~199)中,後一部分200~249是新的資料,此時應該對這個報文作如下處理:

A.       計算重複位元組數

 (seq1+len1) - Seq2= 100+100-150 = 50

即這個報文段前50個位元組是重複的。

B.       擷取報文段新資料

丟棄這個報文段的前50位元組,擷取後面的新資料,即只保留位元組序號段200~249。

C.       重新設定這個報文段的seq

seq2 = seq2+50 = 150+50 = 200

D.       重新設定這個報文段的資料長度

len2 = len2-50 =100-50=50

E.        重新設定後報文段如下

seq2=200

len2=50

即現在這個報文段攜帶資料序號200~249,正好是上一個報文的後續報文,現在可以將其作為正常報文追加到正常報文佇列。

 6)提前到達的報文

seq2=300

len2=100

seq2>seq1+len1

這個報文段攜帶序號300~399的資料,即不是上一個報文100~199的後續報文,而是提前到來的報文,此時應該將這個報文放置到失序報文佇列儲存起來,以備後續重組使用。

 這樣直到tcp斷開這個socket的連結(FIN=1),此時將正常報文佇列和失序報文佇列中的資料合併起來,完成重組。取出正常報文佇列最後一個報文的seq和len,在失序報文佇列中查詢屬於它的後續報文,該報文是否可以作為正常報文佇列的後續報文處理過程同前面1)~5)的分析。