当前位置: 首页 > 编程日记 > 正文

wireshark和tcpdump抓包TCP乱序和重传怎么办?PCAP TCP排序工具分享

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


 介绍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头格式如下:

640?wx_fmt=png

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

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

640?wx_fmt=png

另外,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

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

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

640?wx_fmt=png

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

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

640?wx_fmt=png

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

640?wx_fmt=png

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

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

排序前的文件内容:

640?wx_fmt=png

排序后的文件内容:

640?wx_fmt=png

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

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

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

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


640?wx_fmt=jpeg

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

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

相关文章:

USACO JANUARY——矩形[rects]

Description 给出N个矩形(1≤N≤100)和它的长和宽(不超过1000),写一个程序找出最大的K,使得有K个矩形满足层层包含的关系,即里层的矩形被所有外层的矩形包含.一个矩形P1包含另一个矩形P2,则P2的一边小于P1的一边&#…

ORACLE分页SQL

ORACLE分页SQL 1&#xff0c;使用rownum SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM < 40 ) WHERE RN > 21 2&#xff0c;使用between SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A ) W…

01-基本概念

GCD 1 基本概念 概念&#xff1a; 是 Apple 开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上执行的并发任务 优点 多核并行运算不需要手动管理线程生命周期自动利用CPU的内核 两个基本点…

cocos2d游戏jsc文件格式解密,SpideMonkey大冒险

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 介绍cocos2d游戏中常用的jsc格式文件的解密。” 01 — 在破解游戏应用中&#xff0c;经常会碰到后缀为jsc的文件&#xff0c;这是基于cocos2d开发的游戏的加密代码&#xff0c;本质上是js文件&#xff0c;只是被加密了。 例如之前…

02-dispatch_barrier

1 dispatch_barrier_async 概念 栅栏方法&#xff0c;暂时的将一部操作做成一个同步操作&#xff0c;向一个栅栏一样的分开 dispatch_barrier_async函数的作用是在进程管理中起到一个栅栏的作用,它等待所有位于barrier函数之前的操作执行完毕后执行,并且在barrier函数执行之后…

sqljdbc.jar 和 sqljdbc4.jar

从微软官网下载的Sql server2008的JDBC jar包&#xff0c;解压后里面有两个jar包&#xff08;sqljdbc.jar 和 sqljdbc4.jar&#xff09;。到底应该用哪个呢&#xff1f; 地址&#xff1a; http://www.microsoft.com/downloads/details.aspx?FamilyIDa737000d-68d0-4531-b65d-d…

综合性深入的技术文章-20161103

已读文章&#xff1a; SqlServer性能检测和优化工具使用详细 百万级访问网站前期的技术准备 从100PV到1亿级PV网站架构演变 待阅读&#xff1a; 从0到千万级访问量网站架构演变史 memcached全面剖析–5. memcached的应用和兼容程序 PHP解决网站大流量与高并发 NGINX防御CC攻击教…

头条小视频和西瓜视频signature签名算法

点击上方↑↑↑蓝字[协议分析与还原]关注我们“分析今日头条内小视频和西瓜视频分享后浏览器打开所用的signature签名算法。” 上月写的一篇关于使用微信的wxid加好友的文章&#xff0c;竟然无意间碰到了一个微信搜索黑洞&#xff0c;成就了本号有史以来搜索量、阅读量、关注度…

一个winform带你玩转rabbitMQ

源码已放出 https://github.com/dubing/MaoyaRabbit 本章分3部分 一、安装部署初探 二、进阶 三、api相关 安装 部署 初探 先上图 一. 安装部署 下载 rabbitMQ &#xff1a;http://www.rabbitmq.com/download.html 安装rabbitmq需要erlang&#xff0c;下载erlang&#xff1a;ht…

03-dispatch_after

1 dispatch_after 概念 在指定时间之后将任务追加到主队列中。严格来说&#xff0c;这个时间并不是绝对准确的&#xff0c;但想要大致延迟执行任务&#xff0c;dispatch_after函数是很有效的。 NSLog("currentThread---%",[NSThread currentThread]); // 打印当前线…

C#模糊查询绑定datagridview

private CollectionViewSource wgdData new CollectionViewSource(); private DataTable Ds_wgd { get { return this.dgv_wgd.ItemsSource as DataTable; } set { wgdData.Source value; this.dgv_wgd.ItemsSource ((DataTable)wgdData.Source).DefaultView; } } //文本框修…

今日头条反爬措施形同虚设,论多平台协同在安全方面的重要性

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 玩头条练技能。”大家好&#xff0c;看到标题一定猜到了&#xff0c;我又来玩今日头条了&#xff0c;谁让它是东半球文明的杀时间神器呢。 想当年&#xff0c;头条刚问世&#xff0c;正愁长辈看新闻没合适且方便的工具&#xff0…

ueditor编辑器和at.js集成

源码&#xff1a; <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <%//禁止jsp解析${} %> <% page isELIgnored"true"%> <%String path request.getContextPath();String basePath reques…

Java缓存学习之五:spring 对缓存的支持

&#xff08;注意标题&#xff0c;Spring对缓存的支持 这里不单单指Ehcache &#xff09;   从3.1开始&#xff0c;Spring引入了对Cache的支持。其使用方法和原理都类似于Spring对事务管理的支持。Spring Cache是作用在方法上的&#xff0c;其核心思想是这样的&#xff1a;当…

04-dispatch_group

dispatch_group 实现线程同步 比如说&#xff0c;第一步我想先下载三张图片&#xff0c;然后第二步再去主线程刷新imgview 显示图片。 利用dispatch_group 来进行实现 &#xff0c;简单来讲就四行代码. 就可以让代码按照你想要的顺序进行发生。 使用步骤 创建一个dispatch_g…

fiddler教程:抓包带锁的怎么办?HTTPS抓包介绍。

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 介绍Fiddler的HTTPS抓包功能。” 这里首先回答下标题中的疑问&#xff0c;fiddler抓包带锁的原因是HTTPS流量抓包功能开启&#xff0c;但解密功能未开启导致&#xff0c;只需要将HTTPS流量解密功能开启就能解决问题。01—作为一款…

如何实现后台向前台传数据

技术交流群&#xff1a;233513714 这两天正在研究如何让后天主动向前台展现数据&#xff0c;只要后台有数据上传的时候就向前台上传(因为公司有个项目&#xff0c;硬件设备会不断的上传数据&#xff0c;服务端将接收到的数据向前台展示)。在网上查了一下&#xff0c;下面将介绍…

05-dispatch_semphore

dispatch_semphore 信号量 dispatch_semaphore信号量为基于计数器的一种多线程同步机制。如果semaphore计数大于等于1&#xff0c;计数-1&#xff0c;返回&#xff0c;程序继续运行。如果计数为0&#xff0c;则等待。dispatch_semaphore_signal(semaphore)为计数1操作,dispatc…

[leetcode]_Integer to Roman

题目&#xff1a;对应之前那道将罗马数字转换整型数字的题目。反过来。 思路&#xff1a;刚开始做的时候&#xff0c;想着用程序进行判断&#xff0c;复杂的要死。网络了别人代码&#xff0c;非常清晰。 代码&#xff1a; 1 public String intToRoman(int num) {2 S…

fiddler使用技巧进阶,如何抓包修改数据?——AutoResponder重定向

“ 介绍Fiddler的AutoResponder重定向功能。” Fiddler功能十分强大&#xff0c;既能抓取报文&#xff0c;也能构造报文&#xff0c;本文继续介绍fiddler的功能&#xff0c;这次的功能与构造报文相关&#xff0c;用来回答标题中的疑问&#xff0c;即修改数据的方法&#xff0c;…

nginx基于IP的虚拟主机

知识点&#xff1a; server的语法&#xff1a; upstream语法&#xff1a; upstream中192.168.100.1不是ip只是个标识&#xff0c;只要和下面的proxy_pass 对应即可。 基于IP的虚拟主机&#xff1a; listen和server_name中多加上端口也没问题 listen可以监听在虚拟ip上面 代码&a…

读《人月神话》所感

《人月神话》 读书心得&#xff1a;因为现在还是学生&#xff0c;且没有什么真正在应用项目的开发经验&#xff0c;所以读《人月神话》这本书&#xff0c;与其说是在学习这位计算机先驱的经验&#xff0c;不如说是在了解一个大型软件系统的开发过程以及在开发过程中将会遇到的…

Android逆向之调试smali代码基础

点击上方↑↑↑蓝字[协议分析与还原]关注我们 “ 介绍Android逆向中调试smali代码的方法。” 最近在重整Android逆向分析环境&#xff0c;一切都在从零开始&#xff0c;做下记录&#xff0c;给大家分享。 本文介绍Android逆向中smali代码的调试及环境的准备。 事先准备如下工具…

Python之路【第五篇】:面向对象及相关

Python之路【第五篇】&#xff1a;面向对象及相关 Python之路【第五篇】&#xff1a;面向对象及相关 面向对象基础 基础内容介绍详见一下两篇博文&#xff1a; 面向对象初级篇面向对象进阶篇其他相关 一、isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 123456class Foo…

关于安卓版的eclipse连接数据库并誓言增删改查

在安卓环境下连接数据库下面是主要代码极其作用&#xff1a; 1.编写 The Class类把课程表courses.db当做一个实体类&#xff0c;hashcode和equals这两个类是为了判断输入的查询内容和Excel表中的内容是否一致。 并在java里面区别两个对象是否一致 1 public class TheClass {2 …

07-主队列和全局队列

GCD 会主动的提供一个队列供开发者使用。 主队列 系统提供的串行队列 是在主线程执行的队列&#xff0c;所以是串行的队列。任务一个个执行。 dispatch_get_main_queue() 全局队列 系统提供的并发队列 全局队列是所有应用程序都能够使用的并发队列&#xff0c;不需要手动的创…

Android逆向--如何调试smali代码?

最近在重整Android逆向分析环境&#xff0c;一切都在从零开始&#xff0c;做下记录&#xff0c;给大家分享。 本文介绍Android逆向中smali代码的调试及环境的准备。 事先准备如下工具&#xff1a; Android killer&#xff1a;反编译APK应用为smali源码的工具 Android studi…

python -socket -client

socket client 发起连接。 流程为&#xff1a; 创建接口 发起连接 创建接口参数同socket server相同 发起连接的函数为socket.connect(ip,port) 这个地方的ip与port为socket server端的ip和监听port。 代码示例&#xff1a; # -*- coding: utf-8 -*-This is a testing program …

mysql的binlog太多太大占用了空间的解决办法

现象&#xff1a;网站访问越来越慢&#xff0c;最后无法访问了&#xff0c;经过检查发现磁盘满了 分析过程及解决方案&#xff1a;通常出现这种问题都应该登录服务器检查磁盘、内存和进程使用的情况&#xff0c;通过top、df –h和free –m来检查&#xff0c;发现磁盘空间满了。…

08-dispatch_apply

1 dispatch_apply dispatch_apply 是按照指定的次数将指定的block 添加到指定的queue当中去。 可以用于快速的迭代 // 获取全局并发队列dispatch_queue_t queue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);// 迭代数组NSLog("begin");NSArra…