点击上方蓝字[协议分析与还原]关注我们


 介绍TCP排序方法,分享一个Windows版的TCP排序工具。

在分析协议的过程中,不可避免地需要抓包。

无论抓包条件如何优越,无论Windows下使用wireshark还是Linux下使用tcpdump,无论是在个人机器网卡还是骨干网络的分光分流口,当pcap被保存,当pcap文件被打开,都会碰到报文乱序、重传的情况,有时报文情况会相当的糟糕,并且相当的普遍,这是一种正常的技术现象,只要是抓包就会碰到的现象。

在协议解析系统中,首先要处理的就是TCP乱序重传的问题,否则,很多信息就解析不出来。

在协议分析过程中,也要处理TCP乱序重传问题,否则,分析就会遇到很多困难。

毕竟人脑并行处理的能力有限,当TCP报文的乱序严重影响到分析过程的时候,最好的解决方案是将报文的顺序调整正确,即对pcap内的报文进行排序。

如果报文数量较少,可以使用WireEdit工具手动对pcap包内的报文进行调整,对一个个数据帧进行剪切、粘帖、删除都很顺手,虽然每次操作都会消耗一定的时间。

有需要WireEdit的朋友,请发送“wireedit”获取下载地址。

当一个pcap内报文数量很多时,手动调整就很不现实了,迫切需要有一个对TCP进行排序的工具对报文进行排序。在网上一直没找到合适的工具。

一个可正常使用的还原解析系统,一般都实现了TCP排序及读包处理的过程,如果系统的TCP排序模块留有接口,读入pcap文件,输出排序好TCP的pcap文件,那我们就可以借助解析系统来实现TCP排序。

但很多时候,由于很多原因,协议还原解析系统并不能很好地满足需要,因此在这里提供一个简单的对pcap内的TCP排序的工具,发送“tcpsort”获取下载地址。

本文将首先介绍TCP排序原理,然后介绍下这款简单的排序工具的使用方法,它能满足大部分的TCP排序需求。

01

TCP排序基本原理

我们知道,TCP协议是有连接的协议,数据的传输具备可靠性,在协议控制层对数据传输过程及内容的正确性及可靠性进行保证。

对TCP IP协议的介绍可参考之前的文章:

协议分析中的TCP/IP网络协议

TCP排序就是利用TCP协议的可靠性特征,来使数据包的顺序正确,从而不影响协议的分析与解析过程。

一个常见的TCP报文,在以太头、IP头之后,就是TCP协议头了,TCP头格式如下:

熟悉TCP协议的同志应该知道,TCP头内的seq及ACK两个整数就是用来进行可靠性保证的关键字段。

每个报文根据之前已传输的数据内容体的长度,有一个自己的seq,当然,seq不一定唯一,因为有空包的存在,同时,seq从syn包的seq开始,同一个TCP流内,同一个方向的seq是递增的,递增值与TCP包内传输的内容体长度字节数相关。在我们使用wireshark看报文的时候,会在TCP头的解析内,看到一个nextseq值,这个值在报文中并不存在,是根据当前报文长度算出来的,我们在TCP排序过程中也会事先算好nextseq值。就像下面这个例子:

另外,seq值的递增,需要注意,根据协议标准,syn包的下一个包,seq值是加一的,而不会因为syn包内没有数据内容而相等,上下行都是这样子。

对于ACK,一般是标明所回应的另一侧的报文的序号,即对应报文的seq,ACK在双向报文具备严格的交互关系时,需要保证上下行TCP报文的顺序的TCP排序中需要用到,但应用面有限,更多的涉及到协议应用层数据的处理,同时会使复杂性大增,我们在对pcap的TCP排序中就可以简化掉,不需要额外处理了。

一般来说,简单的TCP排序只需要处理seq的变化就可以了,当一个方向期望的nextseq与比当前seq要小时,可以认为中间丢包了,就将当前报文缓存起来,等待中间报文的出现。

处理了乱序,当然要顺便简单处理下重传的数据了。为什么说是简单处理呢?因为严格按协议来处理太复杂了。

TCP头中有一个字段叫checksum,就是校验和,是报文内容的CRC32值,理论上我们可以用它来判断是否存在报文的重传,但对排序的实现而言,需要保存之前的checksum值,太不合算了,所以实际实现过程中没有选取它来判断重传。

同时,TCP协议的重传,是可以重传某一部分数据的,这在理论上,会导致重传相关的两个报文内容出现部分包含的情况,这种重传在实际抓包过程中出现很少,我们在排序中就不处理了。

把复杂情况排除,剩下的场景就简单了,只需要根据seq,nextseq,ack这几项tcp头内的特征,与前一个已经排序好的报文相比,值小的话就判断是重传即可。

另外,排序还需考虑连接报文从中间开始的情况,此时,直接认为第一个包就是排序好的包。

本文介绍的对pcap内TCP排序的工具就是按照上面的方法实现的。

02

TCP排序工具介绍

这款工具是在Windows下使用vs2012开发的,名称为“sortpcap”。

工具主要使用到了winpcap库,因此使用的机器最好能装winpcap库,如果装了wireshark,默认该库就已经装上了,就不需要额外安装。

工具的主要功能是,读入一个pcap文件,对文件内的TCP报文进行排序处理,最终输出排序好的pcap文件。

工具比较简单,使用命令行进行交互,但已满足了大部分的需求。使用过程很简单,可以选择在进程启动时参数中带文件名使用,像这样:

sortpcap.exe test3.pcap

回车后会立刻对文件进行排序,输出结果。

也可以在启动后再输入需要排序的文件:

其中的test3.pcap为输入的待排序文件名称,可带路径。

最终输出的排序好的pcap文件被命名为“sort.原输入文件名”,存在运行目录下:

排序过程中程序窗口会有些过程打印,本来是可以去掉的,但留着或许会有用,排序结束会输出提示:

按任意键就会退出程序窗口。

下面一个pcap排序前后的内容对比,这里用的是一个只有一条链接的pcap文件。

排序前的文件内容:

排序后的文件内容:

排序效果肉眼可见,排序后文件内错误的是一些0字节报文和checksum校验错误。

这款工具基本能上满足了协议分析的需求,如果需要的话发送“tcpsort”获取下载地址,源码恕不公开,如果确实需要源码,可与我联系。

需要注意,这个工具仅针对协议分析过程中的TCP排序需求实现,没有考虑其它的应用场景,所以如果需要在大型解析系统中使用的话,还需考虑特定情况。

TCP排序工具的介绍到此就结束了,欢迎扩散,共同提高。


长按进行关注,时刻进行交流。

点击右下方“在看”,与朋友们一起分享吧↘

wireshark和tcpdump抓包TCP乱序和重传怎么办?PCAP TCP排序工具分享的更多相关文章

  1. Wireshark和TcpDump抓包分析心得

    Wireshark和 TcpDump抓包分析心得  1. Wireshark与tcpdump介绍 Wireshark是一个网络协议检测工具,支持Windows平台和Unix平台,我一般只在Window ...

  2. 转 Wireshark和TcpDump抓包分析心得

    1. Wireshark与tcpdump介绍 Wireshark是一个网络协议检测工具,支持Windows平台和Unix平台,我一般只在Windows平台下使用Wireshark,如果是Linux的话 ...

  3. 转:tcpdump抓包分析(强烈推荐)

    转自:https://mp.weixin.qq.com/s?__biz=MzAxODI5ODMwOA==&mid=2666539134&idx=1&sn=5166f0aac71 ...

  4. tcpdump 抓包让wireshark来分析

    在linux下面用tcpdump 抓包非常方便, 但是抓的包要提取出来进行分析, 还是得用wireshark来过滤分析比较方便. 下面先介绍一下 TCPDUMP 的使用 例:tcpdump host ...

  5. Wireshark理解TCP乱序重组和HTTP解析渲染

    TCP数据传输过程 TCP乱序重组原理 HTTP解析渲染 TCP乱序重组 TCP具有乱序重组的功能.(1)TCP具有缓冲区(2)TCP报文具有序列号所以,对于你说的问题,一种常见的处理方式是:TCP会 ...

  6. linux下使用tcpdump抓包分析tcp的三次握手

    首先贴上tcp 三次握手的原理图服务器开启ftp服务并执行tcpdump抓包服务器:192.168.3.14 ftp服务客户端:192.168.3.100 服务器执行以下命令,客户端访问服务器ftp: ...

  7. Android利用tcpdump抓包,用wireshark分析包。

    1.前言 主要介绍在android手机上如何利用tcpdump抓包,用wireshark分析包. android tcpdump官网: http://www.androidtcpdump.com/ t ...

  8. 使用 tcpdump 抓包分析 TCP 三次握手、四次挥手与 TCP 状态转移

    目录 文章目录 目录 前文列表 TCP 协议 图示三次握手与四次挥手 抓包结果 抓包分析 TCP 三次握手 数据传输 四次挥手 TCP 端口状态转移 状态转移 前文列表 <常用 tcpdump ...

  9. tcpdump抓包命令

    本文转自 : http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html http://www.itshouce.com.cn/l ...

随机推荐

  1. C# List集合 GroupBy分组

    var grpBalance = listBalance.GroupBy(m => new { m.MerChantId, m.Name}).Distinct().Select(t => ...

  2. wx-all

    学习这部分时也学了不少代码,一段一段往这上面写实在有点~~~ 直接把代码部署到代码该在的地方吧,哈哈哈 这是网址 把代码放这上面就好多了,不怕代码丢,还可保证代码完整,嘻嘻嘻~~~~~~

  3. Mac 停止redis服务

    停止redis服务: redis-cli shutdown 开始redis服务: redis-server

  4. ESLint + Prettier + husky + lint-staged 规范统一前端代码风格

    写在前面: ESLint: Find and fix problems in your JavaScript code. Prettier: Prettier is an opinionated co ...

  5. linux中关于权限的一些事

    权限这个东西对于初学者来说可能会有点陌生,不过不要紧,看完下面的讲解应该会对你有一定的帮助 权限rwx rwxrwxrwx  u     g    o         a r:可读      4 w: ...

  6. linux源码安装mysql,shell编程学习,ubuntu

    一.mysql安装 以源码安装的方式编译和安装Mysql 5.6. 1.卸载旧版本 rpm -qa | grep mysql 检查是否有旧版本 查询结果:mysql-libs-5.1.73-7.el6 ...

  7. Hyperledger Fabric私有数据

    官方文档:点这里 1简介 在同一个通道中,允许某一组织在对同一通道内其他组织保持部分的数据私有.也就是说有一部分被标识为私有的数据只能具有权限的组织查看和操作,而其余组织不具备查看和操作私有数据的权限 ...

  8. How to: Supply Initial Data for the Entity Framework Data Model 如何:为EF数据模型提供初始数据

    After you have introduced a data model, you may need to have the application populate the database w ...

  9. 【坑】The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone.

    在使用spring JDBC 连接数据库时出现的错误: Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: ...

  10. Leetcode 之 Mysql(day01)

    大四已经接近一半了,下学期就要准备找工作实习了.为了自己能找到一份比较满意的实习,今天开始要刷一下题目.今天就刷 MySQL 语言.以下就是我今天刷的题目.大家也可以去 leetcode 注册一个账号 ...