Linux系统上,可以使用raw socket实现IP层的自定义,在windows上面,从windowsXP的SP2开始,就禁止假冒IP发送报文了,要实现自定义的报文发送,自写驱动是一个方法,另外一个简易方法就是使用winpcap库了。
winpcap是一套开源的库,在linux上有对应的库(libpcap),因此用winpcap实现的代码是可以做到跨平台移植的。
winpcap的介绍文章有很多,我这里就不说了,只说一些开发过程中的经验与总结。
1 winpcap.dll实际上是对Packet.dll的封装,另外还封装了读写pcap文件模块,可以打开或者保存pcap文件。如果仅仅操作网络,那么可以直接使用packet.dll。
2 pcap文件格式是非常简单的,可以自己写函数来实现读取和写入功能,仅仅是报文头加报文的不断重复过程。
3 winpcap在windows上面的发送速度可以达到1500大小的报文9万pps的速率。64字节的报文速率则一般只能达到33万pps。
4 报文能发送速度和接收速度并不是匹配的,要想接收也达到以上速率,需要对接收速率做很大的优化。
5 winpcap的接收是比较慢的,最好直接用Packet.dll里面的函数实现接收功能,并做好缓冲。因为收到的报文如果处理不及时,下一个报文如果不收上来的话,就会造成丢包了。
6 winpcap的驱动名称为 npf.sys,此文件可以直接替换,不过替换之后要重启才能生效。winpcap提供的源代码可以直接编译出驱动,是不错的代码。
7 自己实现报文模拟工具,如果只是简单的发包工具还好,如果要实现交互过程,比如自己实现tcp,那么就需要自己实现tcp/ip协议栈了,这部分可以使用开源的lwip库,不过这个库的效率非常低,最好还是自己实现。
8 要自己实现tcp/ip协议栈,就需要认真仔细的熟读tcp与ip的rfc文档了,两本经典书是要翻熟,并且还要有充足的代码经验,实现多种设计模拟。刚毕业两年的同志就不要打算这么做了,实现自定义协议栈非常复杂。需要积累非常多的经验。
9 要做这方面的工具,需要有比较多的基本库的积累,什么都没有,那么实现这么一个工具,要做的事情是比较多的。