我启动了一个需要使用网络级数据包的项目,例如IP / ICMP / UDP / TCP数据包。
处理它有两种主要方法:Raw套接字和Winpcap / libpcap。
我知道pcap在操作系统上安装了一个驱动程序,允许程序员捕获和发送数据包。另一方面,原始套接字在Windows 7或更高版本中有一些限制。
项目需要将一些IP / ICMP / UDP / TCP数据包发送到路由器并分析响应,例如IP-Identifier
,TTL
,....此外,我希望它适用于Linux和Windows。
您能列出这两种方法的比较吗?
答案 0 :(得分:1)
如果您希望代码是可移植的,那么您就不能使用原始套接字API(在Linux和Windows上这是相当不同的)。 Winpcap通常与libpcap兼容,考虑到它正在做什么,pcap API通常是合理的。
答案 1 :(得分:0)
在你的情况下,RAW套接字可以工作,但你必须做类似的事情
sock_raw_tcp = socket(AF_INET , SOCK_RAW , IPPROTO_TCP);
sock_raw_udp = socket(AF_INET , SOCK_RAW , IPPROTO_UDP);
sock_raw_icmp = socket(AF_INET , SOCK_RAW , IPPROTO_ICMP);
你没有像IP_PROTO_IP这样的选项。现在,使用RAW套接字,您将只获得IP标头+传输级标头,但不会获得以太网标头。因此,如果您只对应用程序层数据感兴趣并且想要使用Ipaddress&的IP标头。端口号等的TTL和传输头,那就OK了。请记住,对于TCP,您可能还需要检查总和并重新组装。 UDP也需要一些校验和。
但是,winpcap为您解决了许多管理问题,因为它使用设备驱动程序连接NIC的数据链路层或第2层。在这里,您还将获得以太网帧,而不必打开不同类型的RAW套接字。您仍然必须像在网络层(第3层)那样应用与数据包打交道的应用程序相关逻辑。