来自PPP接口的捕获数据包的问题

时间:2010-11-23 06:32:54

标签: c networking ubuntu libpcap

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

char filter_exp[] = "ip";   

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

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

当我从eth0捕获数据包时,一切正常。

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

2 个答案:

答案 0 :(得分:2)

  

但是当我在回调函数中嗅探数据包时,我发现ip包的格式不正确,标题大小不是20字节。

您的回调函数正在使用pcap_datalink()pcap_t调用的结果来确定如何解析数据包,或者您已根据{{1}的结果指定了不同的回调函数,对吧?

如果没有,你可能假设数据包将具有特定的链路层头类型,这总是错误的。

PPP数据包不一定具有与以太网数据包相同的链路层头类型(尽管在Windows上使用WinPcap,它们可能具有相同的链路层头类型!)。他们可能也没有PPP标头;特别是在Linux上,它们会有一个Linux cooked capture header因为,至少在某一点上,内核会剥离PPP头并提供 no 链接层标题,因此libpcap必须进行“熟”捕获才能获得网络层协议类型。对于Linux上的PPP设备,pcap_datalink()将返回pcap_datalink(),而不是DLT_LINUX_SLL,以表明这一点。

答案 1 :(得分:0)

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