我正在使用 libpcap 从 PPP 接口捕获数据,并添加过滤器如下:
char filter_exp[] = "ip";
但是当我在回调函数中嗅探数据包时,我发现ip数据包的格式是
不正确,标头大小不是 20 字节。
而当我从 eth0 抓包时,一切正常。
那么谁能告诉我如何通过 libpcap 从 PPP 接口获取正确的 ip 数据包,谢谢!
我正在使用 libpcap 从 PPP 接口捕获数据,并添加过滤器如下:
char filter_exp[] = "ip";
但是当我在回调函数中嗅探数据包时,我发现ip数据包的格式是
不正确,标头大小不是 20 字节。
而当我从 eth0 抓包时,一切正常。
那么谁能告诉我如何通过 libpcap 从 PPP 接口获取正确的 ip 数据包,谢谢!
但是当我在回调函数中嗅探数据包时,我发现ip数据包的格式不正确,包头大小不是20字节。
您的回调函数正在使用pcap_datalink()
调用的结果pcap_t
来确定如何解析数据包,或者您已经根据 的结果指定了不同的回调函数pcap_datalink()
,对吗?
如果不是,您可能会假设数据包将具有特定的链路层标头类型,这总是错误的做法。
PPP 数据包不一定具有与以太网数据包相同的链路层标头类型(尽管在带有 WinPcap 的 Windows 上,它们可能具有相同的链路层标头类型!)。它们也可能没有 PPP 标头;特别是,在 Linux 上,它们将有一个Linux 熟化的捕获头,因为至少在某一时刻,内核会剥离 PPP 头并且不提供链路层头,因此 libpcap 必须进行“熟化”捕获才能能够得到网络层协议类型。 pcap_datalink()
对于 Linux 上的 PPP 设备,将返回DLT_LINUX_SLL
, notDLT_PPP
来表明这一点。
PPP和IP是完全不同的协议。如果您通过 PPP 传输 IP 数据报,那么您将把它们包装在 PPP 标头中,并将 IP 数据包作为有效负载。您需要在数据包成为 IP 数据包之前从数据包中去除 PPP 信息。