原始套接字

Posted bzaq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原始套接字相关的知识,希望对你有一定的参考价值。

定义原始套接字的目的在于提供访问某个协议的接口, 通过原始套接字, 进程可以读写ICMPv4, IGMPv4和ICMPv6等分组, 进程也可以读写内核不处理其协议字段的IPv4数据报, 进程还可以使用IP_HDRINCL套接字选项自行构造IPv4首部。

创建一个原始套接字步骤如下:

int sockfd = socket(AF_INET, SOCK_RAW, protocol) 或者

int sockfd = socket(AF_INET6, SOCK_RAW, protocol)

其中protocol 通常不为0, 比如在ping程序中, protocol指定为IPPROTO_ICMP或IPPROTO_ICMPV6。

值得注意的是, 通过IPv6原始套接字发送和接收的协议首部中的所有字段均采用网络字节序, 另外通过IPv6原始套接字无法读入或写出完整的IPv6分组, 包括IPv6首部或任何扩展首部, 如果应用进程需要读入或者写出完整的IPv6数据报, 那就必须使用数据链路访问。

无论何时, 往一个原始IPv4套接字递送一个接收到的数据报, 传递到该套接字所在进程的都是包括IP首部在内的完整数据报, 而对于IPv6套接字, 传递到套接字的只是扣除了IPv6首部和所有扩展首部的净荷

以上是关于原始套接字的主要内容,如果未能解决你的问题,请参考以下文章

原始套接字

Linux Socket 原始套接字编程

原始套接字编程

原始套接字

原始套接字

python使用原始套接字 解析原始ip头数据