众所周知,通过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行为,之所以想要处理