(1). 原始套接字创建
创建原始套接字需要超级用户权限
int sockfd = socket(AF_INET, SOCK_RAW, protocol);
a. 原始套接字不存在端口号概念
对其调bind
,会设置从其发出数据报源地址设为设置值.对其调connect
,会设置目的IP
.
b. 原始套接字输出
未connect
的,sendto,sendmsg
已经connect
的,write,writev,send
(2). IP_HDRINCL
IP_HDRINCL
选项开启下,应用负责IP
首部+
数据构造
IP_HDRINCL
选项未开启下,应用负责数据构造,IP
首部由内核构造
IPV4
首部校验和字段总是由内核计算并存储
IPV6
不存在IP_HDRINCL
选项,如需控制IPV6
头部及其扩展头部一般通过套接字选项来交互.
(3). 原始套接字输入
a. 多数ICMP
分组在内核处理完其中的ICMP
消息后传递到原始套接字
b. 所有IGMP
分组在内核完成处理其中的IGMP
消息后传到原始套接字
c. 协议字段不明的IP
数据报
数据报的协议字段需与原始套接字协议参数匹配
对已经bind
的原始套接字,数据报的目的IP
需与其绑定的IP
一致
对已经connect
的原始套接字,数据报的源IP
需与其绑定的IP
一致
递送的原始IPV4
数据报含IP首部,递送的原始IPV6
数据报仅含数据部分