我已按照here中的代码修复了打印输出IP地址的问题 . 当我从我的机器读取捕获的文件时,我完美地工作,结果与tcpdump相同 . 但是,当我读取另一个pcap文件(从大型网络的边界路由器捕获)时,它给了我完全不同的IP地址 . 我发现这些pcap在以太网帧中包含VLAN . 如何检测数据包是否包含vlan标头?
您必须检查物理层协议(现在很可能是以太网)并确定以太网类型(以太网头的第13和第14个字节) . 您可以查看可能的以太网类型的示例列表here .
如果类型是0x0800(IPv4),那么一切都应该按预期工作 .
但是,如果ethertype是0x8100(802.1Q),则必须从VLAN头(第17和第18字节)中提取实际有效载荷类型
这是一个非常粗略的代码,从指向以太网开头的基地址开始绕过上层
char *get_ip_hdr(char *base) { // If frame is not ethernet retun NULL uint16_t ether_type = ntohs(*(uint16_t *) (base + 12)); if (ether_type == 0x0800 ) { return base + 14; } else if (ether_type == 0x8100 ) { // VLAN tag ether_type = ntohs(*(uint16_t *) (base + 16)); if (ether_type == 0x800) { return base + 18; } } return NULL }
Note 要警惕double VLAN tagging并采取必要的类似步骤以跳过它 .
1 回答
您必须检查物理层协议(现在很可能是以太网)并确定以太网类型(以太网头的第13和第14个字节) . 您可以查看可能的以太网类型的示例列表here .
如果类型是0x0800(IPv4),那么一切都应该按预期工作 .
但是,如果ethertype是0x8100(802.1Q),则必须从VLAN头(第17和第18字节)中提取实际有效载荷类型
这是一个非常粗略的代码,从指向以太网开头的基地址开始绕过上层
Note 要警惕double VLAN tagging并采取必要的类似步骤以跳过它 .