- 什么PF_PACKET类型的socket
- PF_PACKET类型socket应用场合
- 数据层面:驱动程序怎么把报文送到相应的socket buffer
- 数据层面:内核驱动可以与用户态零拷贝吗?
1. 什么PF_PACKET类型的socket
创建socket的函数如下:
fd = socket(int domain, int type, int protocol)
基于TCP/IP的传输层实现的:
文件传送协议ftp,基于tcp实现,用下面的方式创建socket:
fd = socket(AF_INET, SOCK_STREAM, IPPTORO_TCP)
自动地址分配协议dhcp,基于udp实现,用下面的方式创建socket:
fd = socket(AF_INET, SOCK_DGRAM, IPPTORO_UDP)
基于TCP/IP的网络层实现的:
消息控制协议icmp,基于raw ip实现,用下面的方式创建socket:
fd = socket(AF_INET, SOCK_RAW, IPPTORO_ICMP)
组播控制协议igmp,基于raw ip实现,用下面的方式创建socket:
fd = socket(AF_INET, SOCK_RAW, IPPTORO_IGMP)
socket是基于tcp/ip的网络编程接口,用于收发数据报,设置接收内核的某些状态以及事件。pf_packet类型的socket,是用来与驱动层面收发数据报的,接收和发送报文包含链路层信息,详细的信息参考:http://swoolley.org/man.cgi/7/packet。
socket的介绍使用,编程参考:https://blog.csdn.net/somyjun/article/details/84303074
2. PF_PACKET类型socket应用场合
- 抓包,分析(如tcpdump)
所有链接层的报文,单播、组播、广播,目的MAC地址,IP地址是设备本身配置的,或者是其他设备的,都通过socket发给用户态的抓包、分析程序。
一般链路层在处理收到的报文时,会依据目的MAC、目的IP地址,如果它们不是设备本身配置的(还有一些广播、组播除外),都会丢弃。因此,需要设置设备网络设备为混杂模式(promiscuous)。
struct packet_mreq mr;
memset(&mr,0,sizeof(mr));

最低0.47元/天 解锁文章

1116

被折叠的 条评论
为什么被折叠?



