0

我正在使用 libpcap 从 PPP 接口捕获数据,并添加过滤器如下:

char filter_exp[] = "ip";   

但是当我在回调函数中嗅探数据包时,我发现ip数据包的格式是

不正确,标头大小不是 20 字节。

而当我从 eth0 抓包时,一切正常。

那么谁能告诉我如何通过 libpcap 从 PPP 接口获取正确的 ip 数据包,谢谢!

4

2 回答 2

2

但是当我在回调函数中嗅探数据包时,我发现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来表明这一点。

于 2013-08-05T18:35:22.343 回答
0

PPP和IP是完全不同的协议。如果您通过 PPP 传输 IP 数据报,那么您将把它们包装在 PPP 标头中,并将 IP 数据包作为有效负载。您需要在数据包成为 IP 数据包之前从数据包中去除 PPP 信息。

于 2010-11-23T06:40:13.057 回答