免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1495 | 回复: 0
打印 上一主题 下一主题

raw socket protocol [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-09 11:56 |只看该作者 |倒序浏览
                有关raw socket的一些知识
    众所周知,通过socket编程,我们能够实现机器之间的通信.在TCP/IP协议
簇(PF_INET)中,可以建立面向连接的SOCK_STREAM类型的socket,非连接的
SOCK_DGRAM类型的socket.事实上,在所有的网络程序中,也是这两种socket用
的最为广泛.除此之外,还有一些不常用的socket类型,它们却是在某些网络通
信中担当重要的角色.这里要讲的就是这么一种socket,称之为raw socket.
    raw socket的作用主要在三个方面:
    1.通过raw socket来接受发向本机的ICMP,IGMP协议包,或者用来发送这些
    协议包.
    2.接受发向本机的但TCP/IP栈不能够处理的IP包.
    3.用来发送一些自己制定源地址特殊作用的IP包(自己写IP头,TCP头等等)
    我们知道,平时我们想看一看网络是否通达,就用ping命令测试一些.ping
命令用的是ICMP协议.因此,我们不能够通过建立一个SOCK_STREAM或SOCK_DGRAM
来发送这个包,只能够自己亲自来构建ICMP包来发送.这是一种情况.另一种情况
是:现在许多操作系统在实现网络部分的时候,通常只实现了常用的几种协议,
如tcp,udp,icmp等,但象其它的如ospf,ggp等协议,操作系统往往没有实现,如果
自己有必要编写位于其上的应用,就必须借助raw socket来实现,这是因为操作
系统遇到自己不能够处理的数据包(ip头中的protocol所指定的上层协议不能处
理).就将这个包交给raw socket.而最后一种使用raw socket的目的主要是用来
构建一些特殊的协议头,比如我们想对某台机器进行denial of service类型的
攻击,但是有不想留下痕迹,让别人知道IP包的来源,这时候就可以使用raw
socket来发送这些伪造源地址信息的包,这其实也是这种攻击所采用的主要技术
手段.当然了,我说的是HACKER行为,之所以想要处理这些特殊的IP包,通常也是
为了诊断网络的目的.
   
    raw socket的建立是通过如下方式的:
   
    sockfd = socket(PF_INET, SOCK_RAW, protocol);
    第一个参数就不必讲了,第二个参数说明建立的是一个raw socket,第三个
参数倒是需要详细解说一下.这里分三种情况:
    1.参数protocol用来指明所要接收的协议包,如果是象IPPROTO_TCP(6)这
    种非0,非255的协议,则内核碰到ip头中protocol域和创建socket所使用参
    数protocol相同的IP包,就会交给这个rawsocket来处理.因此,一般说来,
    要想接收什么样的数据包,就应该在参数protocol里来指定相应的协议.当
    内核向此raw socket交付数据包的时候,是包括整个IP头的,并且已经是重
    组好的IP包. 如下:
    ---------------------------------------------------------------
    |ip header|tcp header(or x header)|             data          |
    ---------------------------------------------------------------         
    用recvfrom收到的数据包括一个IP头,一个相应的协议头,然后是数据(数
    据也可以为空,就看实际情况了). 但当我们发送IP包的时候,却不用亲自
    处理IP包头,只需要填 充参数protocol所指定的相应的协议头即可.也就
    是说,用sendto的时候,我们提供给它的缓冲区数据是从IP包头的第一个字
    节开始,如下,只需要构造这么一个缓冲区就可以了.
    --------------------------------------------------------------
    |tcp header(or udp header or x header)|           data       |
    --------------------------------------------------------------
    如果想自己也想亲自处理IP头,则需要IP_HDRINCL的socket选项.如下:
    int flag = 1;
    setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &flag, sizeof(int));
    这样,发送时所要提供的缓冲区有成如下形式:
    ---------------------------------------------------------------
    |ip header|tcp header(or x header)|             data          |
    ---------------------------------------------------------------         
    但是,即时是这种情况,在我们发送IP包的时候.也不是填充ip头的所有字
    段,而是应该将ip头的id(identification)字段设置为0,表示让内核来处
    理这个字段.同时,内核还帮你完成ip头的校验和的计算,并随后填充check
    字段.
    2.如果protocol是IPPROTO_RAW(255),这时候,这个socket只能用来发送
    IP包,而不能接收任何数据.发送的数据需要自己填充IP包头,并且自己计
    算校验和.
    3.对于protocol为0(IPPROTO_IP)的raw socket. 在linux和sco unix上
    是不允许建立的.我没有再试过其他操作系统,谁能给我一个答案:)
    对于raw socket,只有root权限才能够创建.
    这里对raw socket总结一下: 当内核接收到IP包的时候,首先检查ip包的
protocol域,当存在与此域匹配的raw socket时,就将包先传给此raw socket,
然后交给相应的上层协议处理.交给raw socket的数据是包括IP头并且已经重
组完成后的.当使用raw socket发送包的时候,如果raw socket创建时的protocol
不是0或255,并且没有设置IP_HDRINCL选项,则发送的数据不包括IP头.如果此
选项置位,则需要自己构件IP头.如果创建protocol为255的raw socket,此raw
socket只能用来发送包括IP头,自己构建IP包.
       
附录:
IP头结构:
struct iphdr                                                       
                                                               
|-------|--------|---------------|-------------------------------|
|version|   ihl  |            tos      |           tot_len                    |
|-------|--------|---------------|-------------------------------|
|         id             |                      |               frag_off                 |
|----------------|---------------|-------------------------------|
|      ttl       | protocol            |                check                           |
|----------------|---------------|-------------------------------|
|                             saddr                              |
|----------------------------------------------------------------|
|                              daddr                                                   |
|----------------------------------------------------------------|
参考书籍:
Unix Network Programming (Volume 1 SECOND EDITION P655-P702)
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/75914/showart_2089684.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP