编程随记 ---- 拼包程序(一)
六月中旬的某一天,老大的一封邮件把我招进了实验室,开始研究和项目为主的
实验室生活。
刚进去,彼此互不熟悉。老大就让我编写一个拼包程序,以此来瞧瞧我的编程能
力。给我讲了功能之后,还给了我一个工程框架。让我以此作为基础和环境来coding。
为了给我一些压力,老大还给了一个性能要求,每秒处理50MB数据包。而且不能
用winpcap,只能自己分析包,处理包,然后拼接成一个TCP数据流。还给了一个该程
序运行的环境:主干网。哎,现在想来,主干网成为了后面不可逾越的鸿沟。而当时
的想当然却把这个极其重要的条件给忽略掉了。从而使自己走了很多弯路。可惜,等
我发现时,已经在很晚很晚的后来了。。。
时间给了我两个星期。于是抽出一天的时间来研究用windump捕获下来的包格式。
安装了winpcap后,打开网页,随便浏览了几分钟。用windump来捕获这段时间的数据
包。谁知不可思议的事情发生了,居然捕获的数据包为0个。怎么可能呢?很显然那个
地方出现了问题。关了防火墙,再重试了一遍,还是为0个数据包。问题出现在哪呢?
自己捉摸了很久,也没研究出个所以然来。实在不行,于是在其他机子上试了下,居
然也没法正常捕获数据包。难道是windump的问题?这个问题一直在脑中盘踞了很久。
知道后来的某一天,使用了Ethereal后才找到了原因。
在网上用google搜了搜,结果也没找到什么原因来。实在没办法,只好从MIT网
上和师兄那边分别找来了已经捕获下来的wpcap格式的文件。先研究一下该格式再说,
windump的问题以后有时间再去研究。
继续利用google,在网上逛了一圈,终于找到心仪的资料,找到了wpcap格式的
具体介绍。用UE打开wpcap格式的文件一比较,果然如此。
打来VC6.0,开始编程解析wpcap格式的数据包。很轻松的就搞定了。
今天的任务搞定了,下次研究IP和TCP头。
wpcap文件格式:
每个wpcap格式的文件头都有24自己的特殊头文件:pcap_file_header。并且头四
个字节必须为:0xA1 0xB2 0xC3 0xD4或者为0xD4 0xC3 0xB2 0xA1。前者表示为大端
字节序,后者表示的是intelPC机的小端字节序。
每个以太网包又封装了一个pcap包头。该包头有16个字节。前8个字节表示时间,
后8个字节中前4个字节为后面的链路层数据包在文件里面的长度,后4个字节为该链路
层数据包的实际长度。两者可能不同是因为可能存在截断的情况。