socket_RAW 返回的数据包
时间: 2023-08-02 17:32:55 浏览: 86
使用 `socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))` 创建的原始套接字可以用来捕获和发送链路层数据包,返回的数据包包含链路层头和数据负载。链路层头的结构体定义如下:
```c
struct ethhdr {
unsigned char h_dest[ETH_ALEN];
unsigned char h_source[ETH_ALEN];
__be16 h_proto;
} __attribute__((packed));
```
其中,`h_dest` 和 `h_source` 分别表示目的 MAC 地址和源 MAC 地址,`h_proto` 表示上层协议类型。数据负载则是链路层头后面的部分,其长度可以根据数据包的具体情况而定。
需要注意的是,使用原始套接字捕获数据包时,操作系统不会进行任何的协议栈处理,也就是说,数据包不会被 IP 层或者 TCP/UDP 层处理。因此,需要自己编写代码对数据包进行解析和处理,包括解析链路层头、根据协议类型判断数据包的类型、解析数据负载等等。
相关问题
socket_RAW 返回的数据包结构
使用 `socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))` 创建的原始套接字返回的数据包结构如下:
```c
struct sockaddr_ll {
unsigned short sll_family; // Always AF_PACKET
unsigned short sll_protocol; // Network protocol ( htons(ETH_P_IP)、htons(ETH_P_ARP)、htons(ETH_P_ALL) 等)
int sll_ifindex; // Interface index
unsigned short sll_hatype; // ARP hardware type, usually ARPHRD_ETHER
unsigned char sll_pkttype; // Packet type (PACKET_HOST、PACKET_BROADCAST、PACKET_MULTICAST、PACKET_OTHERHOST、PACKET_OUTGOING等)
unsigned char sll_halen; // Length of address
unsigned char sll_addr[8]; // Physical layer address
};
```
其中,`sll_family` 始终为 `AF_PACKET`,`sll_protocol` 表示网络协议类型,与创建原始套接字时设置的协议类型一致,`sll_ifindex` 表示接口的索引,`sll_hatype` 表示 ARP 硬件类型,通常为 `ARPHRD_ETHER`,`sll_pkttype` 表示数据包类型,包括 `PACKET_HOST`、`PACKET_BROADCAST`、`PACKET_MULTICAST`、`PACKET_OTHERHOST`、`PACKET_OUTGOING` 等,`sll_halen` 表示物理地址的长度,`sll_addr` 表示物理地址。
在数据包的数据部分,前面是链路层头,可以通过 `struct ethhdr` 结构体来解析,后面是网络层及以上的协议数据,需要根据协议类型进行解析。
socket_raw lldp
socket_raw lldp是指使用原始套接字(socket_raw)实现LLDP(Link Layer Discovery Protocol)功能。
LLDP是一种链路层发现协议,用于在本地网络中进行设备的发现和相互通信。通过交换LLDP数据单元(LLDPDU),设备可以交换彼此的身份、端口和其它有关连接的信息。
使用socket_raw套接字可以使我们读取和发送链路层数据包,因此可以利用这个特性来实现对LLDP协议的支持。通过创建一个原始套接字,我们可以直接获取传入链路层数据包,并实现对它们的解析和处理。
比如,我们可以使用socket_raw lldp来监听本地网络中的LLDP数据包,并提取其中的信息,比如设备的型号、端口、IP地址等。我们还可以将自己的设备信息编码成LLDPDU,并使用socket_raw lldp将其发送到网络中,实现设备的发现和相互通信。
需要注意的是,使用原始套接字需要具有足够的权限,并且需要对链路层数据包进行解析和编码,这是一项相对底层的操作,不太容易实现并且可能存在一些安全风险。在使用socket_raw lldp时,我们需要谨慎处理和过滤数据包,以防止潜在的攻击和网络问题。
综上所述,socket_raw lldp通过使用原始套接字实现了对LLDP协议的支持,可以实现设备的发现和通信。但在使用时需要注意权限和安全问题。
阅读全文