networking - Linux 数据包中的熟捕获

标签 networking linux-kernel wifi wireshark

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/

相关文章:

从主机 curl VM 中的 Elasticsearch 实例

java:通过socket发送方法

linux - 当linux内存不足时,除了重置机器之外,还有什么办法可以挽救?

linux - Linux内核源码中的 "current"是什么?

iOS - 在后台监听应用程序的网络连接变化

networking - 如何在 Amazon Virtual Private Cloud 上设置网络 ACL?

memory-management - 如何检测谁发出了错误的 kfree

Android 显示来自 BroadcastReceiver 的通知

android - 为 WiFi 连接禁用三星 "Auto Network Switch"

sockets - 我如何知道何时进行 UTF8 或 punycode DNS 查询?