参考文章:
通常所说的socket通信是指通假字通信,也就是IP层往上的,IP+接口号完成套接字通信。这种情况下通信产生的数据包如TCP/UDP/ICMP包。某些情况下我们需要执行更底层的操作,通过raw socket通信可以完成基于数据链路层的socket通信。
raw socket的主要结构为:sockfd = socket(PARAM1, SOCK_RAW, protocol);
最原始的套接字PARAM1主要有两种:
一种是处理IP层及其上的数据,通过指定socket第一个参数为AF_INET来创建这种套接字,这种情况下地址是IP地址。(XX.XX.XX.XX),4bytes
另一种是处理数据链路层即其上的数据,通过指定socket第一个参数为AF_PACKET来创建这种套接字,这种情况下地址是MAC地址。(XX:XX:XX:XX:XX:XX),6bytes
AF_INET表示获取从网络层开始的数据
socket(AF_INET, SOCK_RAW, …)
当接收包时,表示用户获得完整的包含IP报头的数据包,即数据从IP报头开始算起。
当发送包时,用户只能发送包含TCP报头或UDP报头或包含其他传输协议的报文,IP报头以及以太网帧头则由内核自动加封。除非是设置了IP_HDRINCL的socket选项。
如果第二个参数为SOCK_STREAM, SOCK_DGRAM,表示接收的数据直接为应用层数据。
PF_PACKET,表示获取的数据是从数据链路层开始的数据
socket(PF_PACKET