Sockets 如何使用pcap解包NTP UDP数据包

Sockets 如何使用pcap解包NTP UDP数据包,sockets,udp,pcap,Sockets,Udp,Pcap,我可以使用 void my_callback(u_char *useless, const struct pcap_pkthdr* pkthdr, const u_char* packet) 我的数据包有六个输出: 08 00 27 E5 B5 3B 52 54 00 12 35 02 08 00 45 00 00 4C 7C E7 00 00 40 11 3C 28 5B BD 59 C6 0A 00 02 0F 00 7B 00 7B 00 38 B7 9D 24 02 03 E8 00

我可以使用

void my_callback(u_char *useless, const struct pcap_pkthdr* pkthdr, const u_char* packet) 
我的数据包有六个输出:

08 00 27 E5 B5 3B 52 54 00 12 35 02 08 00 45 00 00 4C 7C E7 00 00 40 11 3C 28 5B BD 59 C6 0A 00 02 0F 00 7B 00 7B 00 38 B7 9D 24 02 03 E8 00 00 04 A8 00 00 07 51 83 BC 03 DC DC C5 CC 47 F1 F1 69 C3 DC C5 CF 37 D2 5F A7 F5 DC C5 CF 38 3C 2D C2 CF DC C5 CF 38 3C 32 0B 9A
我知道,这是
NTP
数据包

我怎样才能获得额外的数据?剪切以太网帧等

谢谢你的帮助


我使用pCAP C++。

如果你读pCAP,你会从网络设备中得到原始包。有几种选择:

  • 从以太网设备读取数据包
  • 从vlan设备读取数据包
  • 数据包是从其他设备读取的
pcap期间使用的设备类型定义了数据包中的第一个协议头。要了解它,您可以查看全局pcap头的链接层类型字段

定义第一个协议头后,需要打开协议规范并查找:

  • 标头的大小(在您的情况下,它看起来像普通的以太网标头-14字节
    08 00 27 E5 B5 3B 52 54 00 12 35 02 08 00
  • 如何查找封装的数据包类型(在您的案例中,最后一个
    08 00
    表示IP)
找到IP头(
45 00 4C 7C E7 00 00 40 11…
)后,您可以确定IP头长度:

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Version|  IHL  |Type of Service|          Total Length         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |         Identification        |Flags|      Fragment Offset    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Time to Live |    Protocol   |         Header Checksum       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       Source Address                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Destination Address                        |
您需要:

  • IHL定义IP头的大小。这是IP头的第一个字节的低4位。在您的情况下,它是0x5。这意味着5个字或20个字节
  • 协议定义了IP报头中封装的数据。在您的情况下为0x11(IPPROTO_UDP)
之后,如果需要,您可以获取UDP头(8字节)检查端口,并根据NTP规范解析NTP头

在您的示例中,NTP头的总移位量为14+20+8字节