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


 介绍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. 动态代理模式——JDK动态代理

    今天,我就来讲一下动态代理的设计模式. 动态代理的意义在于生成一个代理对象,来代理真实对象,从而控制真实对象的访问.操作动态代理需要两个步骤:一.代理对象和真实对象建立代理关系.二.实现代理对象的代理 ...

  2. 【译】ModSecurity事务生命周期

    本篇简要介绍ModSecurity Transaction Lifecycle,也即ModSecurity的事务生命周期. Transaction Lifecycle In ModSecurity, ...

  3. linux路径问题

    在 Linux 中,简单的理解一个文件的路径,指的就是该文件存放的位置,例如,在<Linux文件系统的层次结构>中提到的 /home/cat 就表示的是 cat 文件所存放的位置.只要我们 ...

  4. 一文解读Docker (转)

    最初的2小时,你会爱上Docker,对原理和使用流程有个最基本的理解,避免满世界无头苍蝇式找资料.本人反对暴风骤雨式多管齐下狂轰滥炸的学习方式,提倡迭代学习法,就是先知道怎么玩,有个感性认识,再深入学 ...

  5. Webpack 一些概念

    目录 引子 Dependency Graph Runtime Manifest Module.Bundle.Chunk Bundle Splitting Code Splitting Tree Sha ...

  6. .NET 收徒,带你走向架构师。

    最近感悟天命,偶有所得,故而打算收徒若干,以继吾之传承. 有缘者,可破瓶颈,走向架构师之峰,指日可待. 入门基本要求: 1.工作经验:1年或以上. 2.入门费用:10000元(RMB). 联系方式(联 ...

  7. Leetcode题解 - DFS部分题目代码+思路(756、1034、1110、491、721、988)

    756. 金字塔转换矩阵 """ 学到的新知识: from collections import defaultditc可以帮我们初始化字典,不至于取到某个不存在的值的时 ...

  8. 数据库索引的优化及SQL处理过程

    想要设计出好的索引,首先必须了解SQL语句在数据库服务器中的处理过程,本文介绍数据库索引设计与优化中几个对索引优化非常重要的概念. 谓词 谓词就是条件表达式. SQL语句的where子句由一个或者多个 ...

  9. Ubuntu 18.04安装MySQL

    安装 MySQL 服务端 sudo apt-get install mysql-server 等待安装完成. 检查 mysql 服务状态 servive mysql status 登录 mysql 客 ...

  10. library: Vulnhub Walkthrough

    网络主机探测: 端口主机扫描: ╰─ nmap -p1-65535 -sV -A -O -sT 10.10.202.136 21/tcp open ftp vsftpd 3.0.380/tcp ope ...