PF_PACKET说开去

  • 什么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));

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值