1. 介绍
前面主要介绍了流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),基本上能够满足TCP与UDP的应用。但一些问题,我们仍然无法解决,如:
(1)发送一个自定义的IP包
(2)发送ICMP包
(3)侦听网络上的数据包
(4)伪装IP地址
(5)实现自定义的协议
究其原因,标准的套接字与TCP,UDP层打交道,而原始套接字只与IP层,MAC层打交道。
2.原始套接字的类型
(1)socket(AF_INET,SOCK_RAW,IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP);
(2)socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP|ETH_P_ARP|ETH_P_RAP|ETH_P_ALL));
第一种套接字类型可得到原始的IP包,这样就可以自己组织TCP,UDP,ICMP包了.
第二种套接字能收到发往本地的MAC帧,也能收到从本机发出去的MAC帧(第3个参数为ETH_P_ALL).也能接收到非发住本地的MAC帧(网卡设置为promisc混杂模式)
ETH_P_IP 0X800 只接收发往本机的mac的ip类型的数据帧ETH_P_ARP 0X806 只接收发往本机的arp类型的数据帧
ETH_P_RARP 0x8035 只接受发往本机的rarp类型的数据帧
ETH_P_ALL 0X3 接收发往本机的MAC所有类型ip,arp,rarp数据帧,接收从本机发出去的数据帧,混杂模式打开的情况下,会接收到非发往本地的MAC数据帧
此时设备无关的物理地址使用struct sockaddr_ll
所以第二种套接字的功能特别强大.
如果设置了IP_HDRINCL套接字选项,那么需要手