缅怀Stevens大师。
本文只是,对UNPv1前几节的转载!!!并非原创!!!!!要想真的学会raw socket 把UNPv1 28章的3个程序从头到尾好好看看一下!!
最好的参考资料:
1.师从互联网。
2.Linux man 命令:man 7 raw。
3.UNP v1第28章 。
4.http://www.cublog.cn/u2/62281/showart_1096746.html
http://linux.chinaitlab.com/c/389513.html
第一条:概述
使用原始套接字(raw socket)可以发送和接收到主机网卡上的数据帧或者数据包,简而言之,可以编写基于IP协议的程序。
man中指出:Raw sockets 允许用户创建新的IPv4协议。原始套接口收发的原始数据报(raw datagram)不包括链路层的头部。
UNPV1中:原始套接口提供了普通TCP和UDP socket不能提供的3个能力如下:
1.进程使用raw socket 可以读写ICMPv4、IGMPv4、ICMPv6等分组。这个能力还使得使用ICMP或IGMP构造的应用程序能够完全作为用户进程处理,而不必往内核中添加额外代码。从下一条可以看出内核中是包括ICMP和IGMP协议的处理代码的。
2.大多数内核只处理IPv4数据报中一个名为协议的8位字段的值为1(ICMP)、2(IGMP)、6(TCP)、17(UDP)四种情况。然而该字段的值还有许多其他值。进程使用raw socket 就可以读写那些内核不处理的IPv4数据报了。
3.通过使用raw socket ,进程可以使用IP_HDRINCL套接口选项自行构造IPv4头部。这个能力可用于构造TCP或UDP分组等。//Head is include with data。
本文中只涉及数据报相关的内容,至于以太网帧,留待下一篇文章
第二条:创建Raw socket
1.只有root用户才能创建raw socket,以防止普通用户向Internet输入他们自行构造的IP数据报。
int sockfd=socket(AF_INET,SOCK_RAW,protocol);
protocol参数其值如下:定义在netinet/in.h
如果指定protocol为0时,原始套接字可以接收内核传递给原始套接字的任何IP数据包
IPPROTO_IP = 0, /* Dummy protocol for TCP. *///这个协议的Dummy的意思是系统什么也不做。
IPPROTO_HOPOPTS = 0, /* IPv6 Hop-by-Hop options. */
IPPROTO_ICMP = 1, /* Internet Control Message Protocol. */
IPPROTO_IGMP = 2, /* Internet Group Managem