socket(AF_INET, SOCK_RAW, IPPROTO_IP)的意思

来源:互联网 发布:h3c dhcp mac地址绑定 编辑:程序博客网 时间:2024/05/19 02:16

这是include/linux/in.h里的定义:

/* Standard well-defined IP protocols. */
enum {
IPPROTO_IP = 0,   /* Dummy protocol for TCP   */
IPPROTO_ICMP = 1,   /* Internet Control Message Protocol */
IPPROTO_IGMP = 2,   /* Internet Group Management Protocol */
IPPROTO_IPIP = 4,   /* IPIP tunnels (older KA9Q tunnels use 94) */
IPPROTO_TCP = 6,   /* Transmission Control Protocol */
IPPROTO_EGP = 8,   /* Exterior Gateway Protocol   */
IPPROTO_PUP = 12,   /* PUP protocol     */
IPPROTO_UDP = 17,   /* User Datagram Protocol   */
IPPROTO_IDP = 22,   /* XNS IDP protocol    */
IPPROTO_DCCP = 33,   /* Datagram Congestion Control Protocol */
IPPROTO_RSVP = 46,   /* RSVP protocol    */
IPPROTO_GRE = 47,   /* Cisco GRE tunnels (rfc 1701,1702) */

IPPROTO_IPV6 = 41,   /* IPv6-in-IPv4 tunnelling   */

IPPROTO_ESP = 50,            /* Encapsulation Security Payload protocol */
IPPROTO_AH = 51,             /* Authentication Header protocol       */
IPPROTO_BEETPH = 94,        /* IP option pseudo header for BEET */
IPPROTO_PIM    = 103,   /* Protocol Independent Multicast */

IPPROTO_COMP   = 108,                /* Compression Header protocol */
IPPROTO_SCTP   = 132,   /* Stream Control Transport Protocol */
IPPROTO_UDPLITE = 136, /* UDP-Lite (RFC 3828)    */

IPPROTO_RAW = 255,   /* Raw IP packets    */
IPPROTO_MAX
};

--------------------------------------------------------------------------------------------------------

对于socket(AF_INET, SOCK_RAW, IPPROTO_IP),其原型为

int socket (int domain, int type, int protocol);

1 参数protocol用来指明所要接收的协议包,如果是象IPPROTO_TCP(6)这种非0、非255的协议,当操作系统内核碰到ip头中protocol域和创建socket所使用参数protocol相同的IP包,就会交给这个raw socket来处理,因此,一般来说,要想接收什么样的数据包,就应该在参数protocol里来指定相应的协议。当内核向此raw socket交付数据包的时候,是包括整个IP头的,并且已经是重组好的IP包。

2 如果protocol是IPPROTO_RAW(255),这时候,这个socket只能用来发送IP包,而不能接收任何的数据。发送的数据需要自己填充IP包头,并且自己计算校验和。

3 对于protocol为0(IPPROTO_IP)的raw socket。用于接收任何的IP数据包。其中的校验和和协议分析由程序自己完成。


原创粉丝点击