參照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這個報文攜帶資料序號100~149,說明這是上乙個報文的一部分,所以應該丟棄這個報文。
注:第二、三這兩種情況可以合併,即seq2 ==seq1 而且len2<=len1,這裡分別列出只是為了說明各種不同情況。
4)部分重複報文情況一
seq2=150
len2=30
seq2>seq1而且seq2即這個報文攜帶序號150~179,這個序號段被包含在上乙個報文段中(100~199),
所以應該丟棄這個報文。
5)部分重複報文情況二
seq2=150
len2=100
seq2>seq1而且seq2seq1+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)的分析。
TCP資料報重組實現分析
tcp重組資料報分析 參照tcp ip詳解第二卷24 29章,詳細論述了tcp協議的實現,大概總結一下tcp如何向應用層保證資料報的正確性 可靠性,即tcp如何實現對資料報文的重組。首先要設計兩個報文佇列,乙個存放正常來到的報文,乙個存放失序到來的報文。比如正常報文佇列最後乙個報文資料如下 報文資料...
TCP協議資料報及攻擊分析
urg urget pointer is valid 緊急指標字段值有效 syn 表示建立連線 fin 表示關閉連線 ack 表示響應 psh 表示有 data資料傳輸 rst 表示連線重置。1 syn 一段tcp對話開始時的資料報,收到的主機將以syn ack回應,並進入半連線狀態,將此鏈結存入佇...
TCP資料報格式
tcp 提供一種面向連線的 全雙工的 可靠的位元組流服務。在乙個tcp 連線中,僅有兩方進行彼此通訊。廣播和多播不能用於tcp。tcp 的接收端必須丟棄重複的資料。tcp 對位元組流的內容不作任何解釋。對位元組流的解釋由tcp 連線雙方的應用層解釋。tcp 通過下列方式來提供可靠性 應用資料被分割成...