【发布时间】:2018-07-16 08:54:39
【问题描述】:
Linux 熟捕获标头有什么用?当我在特定接口上进行数据包捕获时,我会从设备获取此标头。
【问题讨论】:
标签: networking linux-kernel wifi wireshark
Linux 熟捕获标头有什么用?当我在特定接口上进行数据包捕获时,我会从设备获取此标头。
【问题讨论】:
标签: networking linux-kernel wifi wireshark
在 Wireshark wiki SLL 页面上可能最好地描述了 Linux 熟捕获标头及其原因,为方便起见,此处引用:
Linux 熟模式捕获 (SLL)
这是 Linux 上的 libpcap 使用的伪协议,用于从“任何”设备捕获并在本地链路层标头不可用或无法使用的某些设备上捕获。 (例如,Linux PPP 代码不能可靠地向 libpcap 提供 PPP 标头 - 它通常不存在,这意味着数据包类型不可用,或者在某些但不是所有数据包中包含额外的随机垃圾,就像在某些PPP-over-ISDN 接口 - 所以 SLL 伪链路层用于 PPP 接口。它用于“任何”设备,因为并非机器上的所有接口都必须具有相同的链路层类型,但是,为了捕获过滤器才能工作,接口上的所有数据包必须具有相同类型的链路层标头。)
在 Linux 中从“任何”设备或其他设备之一捕获时,libpcap 不会像Ethernet 那样为真正的“硬件协议”提供链路层标头,而是为这个伪协议提供了一个虚假的链路层头。
(对于那些好奇的人,“SLL”代表“sockaddr_ll”;在“cooked 模式”下捕获是通过从 PF_PACKET/SOCK_DGRAM 套接字而不是通常用于捕获的 PF_PACKET/SOCK_RAW 套接字读取来完成的。使用 SOCK_DGRAM 而不是比 SOCK_RAW 意味着 Linux 套接字代码不提供数据包的链路层标头。这意味着链路层协议的数据包类型字段等信息(如果有)不可用,因此 libpcap 构造了一个合成链路层来自在套接字上执行recvfrom() 时提供的地址的标头。在PF_PACKET 套接字上,该地址的类型为sockaddr_ll,其中“ll”可能代表“链路层”;该结构中的字段以@987654328 开头@。有关详细信息,请参阅 Linux 系统上的 packet(7) 手册页。)
【讨论】: