Linux 数据包中的 Cooked 捕获

Linux Cooked Capture in Packets

Linux熟捕获header有什么用?当我在特定接口上进行数据包捕获时,我从设备上得到了这个 header。

Linux 熟捕获 header 及其原因可能在 Wireshark wiki SLL 页面上有最好的描述,为方便起见,在此处引用:

Linux cooked-mode 捕获 (SLL)

这是 libpcap 在 Linux 上使用的 pseudo-protocol 从 "any" 设备捕获并在某些设备上捕获本机 link 层 header 不可用或无法使用。 (例如,Linux PPP 代码不能可靠地向 libpcap 提供 PPP header - 它通常不存在,这意味着数据包类型不可用,或者在某些但包含额外的随机垃圾并非所有数据包,如某些 PPP-over-ISDN 接口上发生的那样 - 因此 SLL pseudo-link-layer 用于 PPP 接口。它用于 "any" 设备,因为并非机器上的所有接口都必须具有相同的link-layer 类型,但是,为了使捕获过滤器起作用,接口上的所有数据包必须具有相同的类型 link-layer header。)

当从 "any" 设备或​​其他设备之一捕获时,在 Linux 中 libpcap doesn't supply the link-layer header for the real "hardware protocol" like Ethernet,而是提供一个伪造的 link-layer header 对于这个 pseudo-protocol.

(对于那些好奇的人,"SLL" 代表 "sockaddr_ll";在 "cooked mode" 中捕获是通过从 PF_PACKET/SOCK_DGRAM 套接字而不是 PF_PACKET/SOCK_RAW 套接字通常用于捕获。使用 SOCK_DGRAM 而不是 SOCK_RAW 意味着 Linux 套接字代码不提供数据包的 link-layer header。这意味着link-layer 协议的数据包类型字段等信息(如果有)不可用,因此 libpcap 在执行 [=16= 时从提供的地址构造一个合成的 link-layer header ] Linux 系统上的手册页以获取更多详细信息。)