标签:自己 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