标签:自己 pack cell 读写 sock com rarp 封装 一个
标准套接字分为:
原始套接字:是一种对原始网络报文进行处理的套接字,主要用途有:
原始套接字主要应用于底层网络编程,原始套接字与标准套接字之间的关系如下:

原始套接字的创建:
int rawsock = socket(AF_INET,SOCK_RAW,protocol);
常见的协议类型如下:
链路层原始套接字
可以直接用于接收和发送链路层MAC帧,在发送时需要由调用者自行构造和封装MAC首部。而网络层原始套接字可以直接用于接收和发送IP层的报文数据,在发送时,需要自行构造IP报文头(取决是否设置IP_HEADER选项),另外必须在管理员权限下才能使用原始套接字。
原始套接口提供了普通TCP和UDP的socket不能提供的三种能力:
链路层原始套接字调用socket()函数创建,第一个 参数指定协议族类型为PF_PACKET,第二个type可以设置为SOCK_RAW或SOCK_DGRAM,第三个参数时协议类型(只对报文接收由意义)。协议类型protocol不同取值的意义如下:
socket(PF_PACKET,type,htons(protocol))
protocol不同取值:
| 
 protocol  | 
 值  | 
 作用  | 
| 
 ETH_P_ALL  | 
 0x0003  | 
 接收本机收到的所有二层报文  | 
| 
 ETH_P_IP  | 
 0x0008  | 
 接收本机收到的所有IP报文  | 
| 
 ETH_P_ARP  | 
 0x0806  | 
 接收本机收到的所有ARP报文  | 
| 
 ETH_P_RARP  | 
 0x8035  | 
 接收本机收到的所有RARP报文  | 
| 
 自定义协议  | 
 比如0x0810  | 
 接收本机收到的所有类型为0x0810的二层报文  | 
| 
 不指定  | 
 0  | 
 不能用于接收,只能用于发送  | 
| 
 …  | 
 …  | 
 …  | 
网络层原始套接字:
创建面向连接的TCP和创建面向无连接的UDP套接字,在接受和发送时只能操作数据部分,而不能对IP首部或TCP或UDP首部进行操作。如果想要操作IP首部或传输层协议首部,就需要调用如下socket()函数创建网络层原始套接字。
第一个参数指定协议族的类型为PF_INET
第二个参数为SOCK_RAW
第三个参数protocol为协议类型。
| 
 protocol  | 
 值  | 
 作用  | 
| 
 IPPROTO_TCP  | 
 6  | 
 接收TCP类型的报文  | 
| 
 IPPROTO_UDP  | 
 17  | 
 接收UDP类型报文  | 
| 
 IPPROTO_ICMP  | 
 1  | 
 接收ICMP类型报文  | 
| 
 IPPROTO_IGMP  | 
 2  | 
 接收IGMP类型报文  | 
| 
 IPPROTO_RAW  | 
 255  | 
 不能接收报文,只能发送(需要构造数据包首部)  | 
| 
 IPPROTO_OSPF  | 
 89  | 
 接收协议号为89的报文  | 
| 
 …  | 
 …  | 
 …  | 
标签:自己 pack cell 读写 sock com rarp 封装 一个
原文地址:https://www.cnblogs.com/wanghao-boke/p/11655015.html