TCP重组数据包分析
參照TCP/IP詳解第二卷24~29章,詳細論述了TCP協(xié)議的實現(xiàn),大概總結(jié)一下TCP如何向應(yīng)用層保證數(shù)據(jù)包的正確性、可靠性,即TCP如何實現(xiàn)對數(shù)據(jù)報文的重組。
首先要設(shè)計兩個報文隊列,一個存放正常來到的報文,一個存放失序到來的報文。
比如正常報文隊列最后一個報文數(shù)據(jù)如下:
報文數(shù)據(jù)段第一字節(jié)的序號 數(shù)據(jù)報長度
下一個來到的報文可能有多種情況,現(xiàn)依次分析如下:
1)正常報文
seq2=seq1+len1
由此報文的seq可知,這個報文攜帶數(shù)據(jù)序200~399,正是上一個報文的預(yù)期后續(xù)報文,將此報文追加到正常報文隊列。
2)完全重復(fù)報文
seq2==seq1 而且len2==len1
這個報文攜帶數(shù)據(jù)序號100~199,與上一個報文攜帶的數(shù)據(jù)序號100~199完全一樣,即完全重復(fù),所以應(yīng)該丟棄這個報文。
3)重復(fù)子報文
seq2==seq1 而且len2 < len1
這個報文攜帶數(shù)據(jù)序號100~149,說明這是上一個報文的一部分,所以應(yīng)該丟棄這個報文。
注:第二、三這兩種情況可以合并,即seq2==seq1 而且len2<=len1,這里分別列出只是為了說明各種不同情況。
4)部分重復(fù)報文情況一
seq2 > seq1而且seq2 < seq1+len1而且seq2+len2 <= seq1+len1
即這個報文攜帶序號150~179,這個序號段被包含在上一個報文段中(100~199),
所以應(yīng)該丟棄這個報文。
5)部分重復(fù)報文情況二
seq2>seq1 而且
seq2 < seq1+len1 而且
seq2+len2 > seq1+len1
即這個報文攜帶序號150~249,這個序號段前一部分150~199被包含在上一個報文段(100~199)中,后一部分200~249是新的數(shù)據(jù),此時應(yīng)該對這個報文作如下處理:
A. 計算重復(fù)字節(jié)數(shù)
(seq1+len1) - seq2 = 100+100-150 = 50
即這個報文段前50個字節(jié)是重復(fù)的。
B. 截取報文段新數(shù)據(jù)
丟棄這個報文段的前50字節(jié),截取后面的新數(shù)據(jù),即只保留字節(jié)序號段200~249。
C. 重新設(shè)置這個報文段的seq
seq2 = seq2+50 = 150+50 = 200
D. 重新設(shè)置這個報文段的數(shù)據(jù)長度
len2 = len2-50 = 100-50=50
E. 重新設(shè)置后報文段如下
seq2=200
len2=50
即現(xiàn)在這個報文段攜帶數(shù)據(jù)序號200~249,正好是上一個報文的后續(xù)報文,現(xiàn)在可以將其作為正常報文追加到正常報文隊列。
6)提前到達的報文
seq2 > seq1+len1
這個報文段攜帶序號300~399的數(shù)據(jù),即不是上一個報文100~199的后續(xù)報文,而是提前到來的報文,此時應(yīng)該將這個報文放置到失序報文隊列存儲起來,以備后續(xù)重組使用。
這樣直到tcp斷開這個socket的鏈接(FIN=1),此時將正常報文隊列和失序報文隊列中的數(shù)據(jù)合并起來,完成重組。取出正常報文隊列最后一個報文的seq和len,在失序報文隊列中查找屬于它的后續(xù)報文,該報文是否可以作為正常報文隊列的后續(xù)報文處理過程同前面1)~5)的分析。
總結(jié)
以上是生活随笔為你收集整理的TCP重组数据包分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 串口编程四 串口设备程序开发
- 下一篇: vlfeat各种版本下载链接: