【问题标题】:Question with capture packets from PPP interface从 PPP 接口捕获数据包的问题
【发布时间】:2010-11-23 06:32:53
【问题描述】:

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

char filter_exp[] = "ip";   

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

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

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

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

【问题讨论】:

    标签: c networking ubuntu libpcap


    【解决方案1】:

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

    你的回调函数是使用pcap_datalink()pcap_t的调用结果来确定如何解析数据包,或者你已经根据pcap_datalink()的结果指定了不同的回调函数,对吧?

    如果不是,您可能会假设数据包将具有特定的链路层标头类型,这总是错误的做法。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我认为当我添加过滤器“ip”时,libpcap 会自动剥离 PPP 标头
      猜你喜欢
      • 2011-11-19
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 2013-05-05
      相关资源
      最近更新 更多