原始套接口(RAW SOCKET)
原始套接口提供三种TCP和UDP套接口不提供的功能:
1). 可以读写ICMPv4, IGMPv4和ICMPv6分组. 例如Ping和Traceroute程序就是利用ICMP分组
2). 可以读写特殊的IPv4数据报, 内核不处理这些数据报IPv4协议字段
3). 使用IP_HDRINCL选项可以构造自己IPv4头部. 可以用这个特性来构造自己的TCP和UTP分组
原始套接口创建
1). 设置第二个参数为SOCK_RAW
这个IPPROTO_XXX可以在<netinet/in.h>找到定义, 例如可以为IPPROTO_ICMP,IPPROTO_IP, IPPRPTO_TCP和IPPRPTO_UDP等
2). 可以设置IP_HDRINCL选项
3). 可以调用bind绑定本地IP
4). 可以调用connect绑定目的IP
原始套接口输出
1). 通过sendto或sendmsg到目的IP, 或write, writev或send到connect的原始套接口
2). 如果IP_HDRINCL没有设置, 用户数据从IP头之后开始
3). 如果IP_HDRINCL设置, 用户数据必须包括IP头, 并且要自己设置IPv4标示字段和校验和之外的所有字段