Linux 熟捕获头有什么用?当我在特定接口(interface)上进行数据包捕获时,我从设备获取此 header 。
最佳答案
Linux 熟捕获 header 及其原因可能在 Wireshark wiki SLL 上得到了最好的描述。页面,为方便起见在此处引用:
Linux 熟模式捕获 (SLL)
这是 Linux 上的 libpcap 使用的伪协议(protocol),用于从“任何”设备捕获以及在 native 链路层 header 不可用或无法使用的某些设备上捕获。 (例如,Linux PPP 代码不能可靠地向 libpcap 提供 PPP header - 它通常不存在,这意味着数据包类型不可用,或者在某些但不是所有数据包中包含额外的随机垃圾,就像某些数据包上发生的那样PPP-over-ISDN 接口(interface) - 因此 SLL 伪链路层用于 PPP 接口(interface)。它用于“任何”设备,因为并非机器上的所有接口(interface)都必须具有相同的链路层类型,但是,为了捕获过滤器要工作,接口(interface)上的所有数据包必须具有相同类型的链路层 header 。)
在 Linux 中从“任何”设备或其他设备之一捕获时,libpcap不提供真正的“硬件协议(protocol)”的链路层 header ,如 Ethernet ,而是为此伪协议(protocol)提供一个假的链路层 header 。
(对于那些好奇的人来说,“SLL”代表“sockaddr_ll”;“cooked 模式”下的捕获是通过从 PF_PACKET/SOCK_DGRAM 套接字而不是通常用于捕获的 PF_PACKET/SOCK_RAW 套接字读取来完成的。使用 SOCK_DGRAM 而不是比 SOCK_RAW 意味着 Linux 套接字代码不提供数据包的链路层 header 。这意味着诸如链路层协议(protocol)的数据包类型字段(如果有)之类的信息不可用,因此 libpcap 构造了一个合成链路层在套接字上执行 recvfrom()
时提供的地址中的 header 。在 PF_PACKET 套接字上,该地址的类型为 sockaddr_ll
,其中“ll”大概代表“链路层”;其中的字段结构以 sll_
开头。有关更多详细信息,请参阅 Linux 系统上的 packet(7)
手册页。)
关于networking - Linux 数据包中的熟捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51358018/