1. SLL 介绍
SLL 是 libpcap 在 Linux 上使用的伪协议,用于从“any”设备(在所有接口上捕获数据包的伪设备),或者在本地链路层
头不可用或不能使用的设备上,捕获数据包。比如,Linux 的 PPP 代码在向 libpcap 提供 PPP 头时不可靠 - 通常,要么
不提供(意味着数据包类型不可用),要么在某些但非全部数据包中包含额外的随机数据(发生在某些 PPP-over-ISDN 接
口上)- 因此在 PPP 接口上使用 SLL 伪链路层。由于一台机器的所有接口并非必须具有相同的链路层类型,但是为使捕获
过滤器起作用,同一接口上的所有数据包必须具有相同类型的链路层头,所以在“any”上使用 SLL。
在 Linux 中,当从“any”设备或其它设备捕获数据包时,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”很可能代表“link layer”;该结构中的字段以 开头。请参阅 Linux 系统上的 packet(7) 手册页,获取更 sll_
多详细信息。
2. SLL 数据包结构
+---------------------------+
| Packet type |
| (2 Octets) |
+---------------------------+
| ARPHRD_ type |
| (2 Octets) |
+---------------------------+
| Link-layer address length |
| (2 Octets) |
+---------------------------+
| Link-layer address |
| (8 Octets) |
+---------------------------+
| Protocol type |
| (2 Octets) |
+---------------------------+
| Payload |
. .
. .
. .
2.1 描述
数据包类型字段以网络字节顺序(大端序)表示,它包含以下值之一:
0,如果数据包是由其他人专门发送给我们的;
1,如果数据包是由其他人广播的;