点击上方↑↑↑蓝字[协议分析与还原]关注我们
“ 介绍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排序就是利用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排序工具的介绍到此就结束了,欢迎扩散,共同提高。
长按进行关注,时刻进行交流。
点击右下方“在看”,与朋友们一起分享吧↘