我正在尝试使用libpcap查看TCP有效负载信息。为此,我需要在内存中找到有效载荷的位置。我使用这个Programming With Pcap指南来确定请求有效负载的位置。当嗅探来自与服务(环回适配器)驻留在同一台计算机上的客户机的数据包时,IP头长度为0。我找不到请求负载的位置。在侦听环回适配器时是否会出现这种情况?我正在开发一个MacOSX 10.8系统,监听适配器“lo0”。
以下是我的尝试:
//this callback is called when a packet is found
void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet){
ethernet = (struct sniff_ethernet*)(packet);
ip = (struct sniff_ip*)(packet + SIZE_ETHERNET); <-- the result is 0
size_ip = IP_HL(ip)*4;
if (size_ip < 20) {
printf(" * Invalid IP header length: %u bytes\n", size_ip);
return;
}
tcp = (struct sniff_tcp*)(packet + SIZE_ETHERNET + size_ip);
size_tcp = TH_OFF(tcp)*4;
if (size_tcp < 20) {
printf(" * Invalid TCP header length: %u bytes\n", size_tcp);
return;
}
payload = (u_char *)(packet + SIZE_ETHERNET + size_ip + size_tcp);
}
结构嗅探IP:
#define SIZE_ETHERNET 14
/* IP header */
struct sniff_ip {
u_char ip_vhl; /* version << 4 | header length >> 2 */
u_char ip_tos; /* type of service */
u_short ip_len; /* total length */
u_short ip_id; /* identification */
u_short ip_off; /* fragment offset field */
#define IP_RF 0x8000 /* reserved fragment flag */
#define IP_DF 0x4000 /* dont fragment flag */
#define IP_MF 0x2000 /* more fragments flag */
#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
u_char ip_ttl; /* time to live */
u_char ip_p; /* protocol */
u_short ip_sum; /* checksum */
struct in_addr ip_src,ip_dst; /* source and dest address */
};
最佳答案
ethernet = (struct sniff_ethernet*)(packet);
ip = (struct sniff_ip*)(packet + SIZE_ETHERNET); <-- the result is 0
如果在环回接口上捕获,则该代码是错误的。不是OS X(或任何其他支持libpcap/winpcap的操作系统)上的所有接口都提供以太网报头;您需要调用
pcap_datalink()
来查找捕获设备的链路层类型(或捕获文件,如果您正在使用pcap_open_offline()
读取捕获文件),并在此基础上解析数据包的链路层报头。有关完整列表,请参见the list of pcap link-layer header types。
DLT_EN10MB
是以太网设备的链路层头类型(“10MB”是历史数据,是指3MB与10MB以太网,具有不同的头;DLT_EN10MB
适用于10MB和100MB,1GB和10GB,40GB和100GB以及…以及一些提供假以太网报头的非以太网设备。大多数BSD和OS X上的环回设备的链路层头类型为
DLT_NULL
;正如“链路层头类型”页所述,它有一个4字节的链路层头,其中包含该协议的OSPF_
值,该值可能是IPv4或IPv6。关于c - libpcap - packet ip header length是带有loopback tcp请求的零字节,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17129532/