参照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)的分析。

TCP重组数据包分析相关推荐

  1. 以太网,IP,TCP,UDP数据包分析【转】

    原文地址:http://www.cnblogs.com/feitian629/archive/2012/11/16/2774065.html 1.ISO开放系统有以下几层: 7 应用层 6 表示层 5 ...

  2. JAVA网络编程:TCP/IP数据包结构

    2019独角兽企业重金招聘Python工程师标准>>> 一般来说,网络编程我们仅仅须要调用一些封装好的函数或者组件就能完毕大部分的工作,可是一些特殊的情况下,就须要深入的理解网络数据 ...

  3. Wireshark数据包分析(一)——使用入门

    Wireshark简介: Wireshark是一款最流行和强大的开源数据包抓包与分析工具,没有之一.在SecTools安全社区里颇受欢迎,曾一度超越Metasploit.Nessus.Aircrack ...

  4. TCP/IP数据包结构具体解释

    [关键词] TCP IP 数据包 结构 具体解释 网络 协议 一般来说,网络编程我们仅仅须要调用一些封装好的函数或者组件就能完毕大部分的工作,可是一些特殊的情况下,就须要深入的理解 网络数据包的结构, ...

  5. 数据包分析技术与网络基础

    1,数据包分析与数据包嗅探器 数据包分析,通常也被称为数据包嗅探或协议分析,指的是捕获和解析网络上在线传输数据的过程. 数据包分析过程通常由数据包嗅探器来执行,而数据包嗅探器则是一种用来在网络媒介上捕 ...

  6. 【转载】网络数据包分析 网卡Offload

    对于网络安全来说,网络传输数据包的捕获和分析是个基础工作,绿盟科技研究员在日常工作中,经常会捕获到一些大小远大于MTU值的数据包,经过分析这些大包的特性,发现和网卡的offload特性有关,本文对网卡 ...

  7. 网络数据包分析 网卡Offload

    对于网络安全来说,网络传输数据包的捕获和分析是个基础工作,科技研究员在日常工作中,经常会捕获到一些大小远大于MTU值的数据包,经过分析这些大包的特性,发现和网卡的offload特性有关,本文对网卡Of ...

  8. wireshark 十六进制 查看_Wireshark数据包分析(一)——使用入门

    Wireshark简介: Wireshark是一款最流行和强大的开源数据包抓包与分析工具,没有之一.在SecTools安全社区里颇受欢迎,曾一度超越Metasploit.Nessus.Aircrack ...

  9. Wireshark数据包分析之DHCP协议包解读

    *此篇博客仅作为个人笔记和学习参考 DHCP协议包格式 DHCP报文类型 DHCP Discover.DHCP Offer.DHCP Request.DHCP ACK.DHCP NAK.DHCP Re ...

最新文章

  1. R计算回归模型Mallows’ Cp指标
  2. Linux下的编译(环境是centos6.8 gcc 4.4.7)
  3. AI创想秀,邂逅“华为云ModelArts”征文大赛——第一次收官
  4. JAVA Java多线程与并发库
  5. 欧拉路HDU3018
  6. java中如何调用属性_java – 如何从属性文件导入值并在注释中使用它?
  7. 验证时间php,php中时间日期验证函数
  8. java中阻止类的继承
  9. Magpie: 基于React的炫酷的滚动抽奖程序
  10. 全面:Realtek/瑞昱无线产品图谱及市场构成
  11. 移动硬盘安装linux,thinkpad sl400笔记本安装vista,双系统
  12. CSS 实现元素固定宽高比
  13. php表单提交并发送邮件给某个邮箱(示例源码)
  14. linux audit 服务,linux 的 audit 服務
  15. Oracle 只读表空间 说明
  16. 如何在Windows命令行(DOS界面)中调用 编译器 来编译C/C++源程序
  17. 金蝶K3开发-工业老单据序时薄增加过滤条件
  18. Linq 的使用方法
  19. python 处理异常_Python异常处理:
  20. 聊城大学计算机学院许丽莉,计算机学院

热门文章

  1. leetcode1414. 和为 K 的最少斐波那契数字数目(贪心算法)
  2. 100万用户服务器_我的应用在一个月内如何增长超过100万用户
  3. 媒体格式分析之flv -- 基于FFMPEG
  4. webapi put 404
  5. BROCADE 300和MD3200扩展柜FC SAN,截图
  6. [Microsoft][SQL Server 2000 Driver for JDBC]Error establishing socket
  7. aws ec2 php,如何使用php aws sdk启动和停止ec2实例
  8. python中列表实现去重使用_Python实现嵌套列表去重方法示例
  9. java犯的小错误_[Java教程]十个JavaScript中易犯的小错误,你中了几枪?
  10. python线上编辑问题_python django - static文件处理与线上部署测试