linux 发送原始数据包

时间:2022-01-28 10:51:26

int packet_socket = socket(PF_PACKET, socket_type, protocol);


描述:
packet socket用于从设备驱动层接收或发送原始数据包,可用于用户在
物理层以上构建自己的通信协议.

socket_type 可为: SOCK_RAW/或SOCK_DGRAM.其中SOCK_RAW可用于发送
原始数据包,此时可自定义数据链路层头部;SOCK_DGRAM可用于在数据链
路层以上构建包.结构sockaddr_ll中会用到链路层头部信息.协议为IE-
EE 802.3 协议号的网络序列(可参考文件--它包含了
可接受的协议号定义).所有到达的属于已定义物理层协议的包先通过p-
acket socket到达已在内核实现的链路层协议处理层.

仅有特权进程或有CAP_NET_RAW属性的进程才能打开packet套接口.

如果用SOCK_RAW,则数据包将直接通过设备驱动程序不加任何改变地发送
出去.这就要求用户程序必须了解物理层头部结构,并适当地构建包,此时
地址解析将用到标准sockaddr_ll结构.SOCK_RAW很象用于2.0版核心老的
SOCK_PACKET,但他们并不完全一致.

SOCK_DGRAM建立在更高层.在接受包时,物理头将在到达用户前被去掉;而
在发包时,物理头部将在发送前被自动添加.