⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 156.htm

📁 unix高级编程原吗
💻 HTM
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>123</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center">               ● UNIX网络编程                       (BM: clown)                </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p   align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="8.htm">上一层</a>][<a href="157.htm">下一篇</a>]
<hr><p align="left"><small>发信人: guru ( Darkness), 信区: UNP <br>

标  题: raw socket介绍 <br>

发信站: UNIX编程 (2001年07月24日11:38:57 星期二), 站内信件 <br>

  <br>

:发信人: python (老牛~~原在非洲耕地), 信区: Security WWW-POST <br>

:标  题: raw socket介绍 <br>

:发信站: 武汉白云黄鹤站 (Tue Jul 24 10:30:52 2001) , 站内信件 <br>

  <br>

众所周知,通过socket编程,我们能够实现机器之间的通信.在TCP/IP协议簇(PF_INET)中,可 <br>

  <br>

  <br>

  <br>

建立面向连接的SOCK_STREAM类型的socket,非连接的SOCK_DGRAM类型的socket.事实上,在  <br>

  <br>

有的网络程序中,也是这两种socket用的最为广泛.除此之外,还有一些不常用的socket类型 <br>

  <br>

它们却是在某些网络通信中担当重要的角色.这里要讲的就是这么一种socket,称之为raw s <br>

  <br>

cket.raw socket的作用主要在三个方面: <br>

  <br>

1.通过raw socket来接受发向本机的ICMP,IGMP协议包,或者用来发送这些协议包. <br>

  <br>

2.接受发向本机的但TCP/IP栈不能够处理的IP包. <br>



  <br>

3.用来发送一些自己制定源地址特殊作用的IP包(自己写IP头,TCP头等等) <br>

  <br>

  <br>

  <br>

我们知道,平时我们想看一看网络是否通达,就用ping命令测试一些.ping 命令用的是ICMP  <br>

  <br>

议.因此,我们不能够通过建立一个SOCK_STREAM或SOCK_DGRAM来发送这个包,只能够自己亲  <br>

  <br>

来构建ICMP包来发送.这是一种情况.另一种情况是:现在许多操作系统在实现网络部分的时 <br>

  <br>

  <br>

  <br>

,通常只实现了常用的几种协议, 如tcp,udp,icmp等,但象其它的如ospf,ggp等协议,操作系 <br>

  <br>

  <br>

  <br>

往往没有实现,如果自己有必要编写位于其上的应用,就必须借助raw socket来实现,这是因 <br>

  <br>

  <br>

  <br>

操作 系统遇到自己不能够处理的数据包(ip头中的protocol所指定的上层协议不能处理).  <br>



  <br>

将这个包交给raw socket.而最后一种使用raw socket的目的主要是用来构建一些特殊的协 <br>

  <br>

  <br>

  <br>

头,比如我们想对某台机器进行denial of service类型的攻击,但是有不想留下痕迹,让别  <br>

  <br>

知道IP包的来源,这时候就可以使用rawsocket来发送这些伪造源地址信息的包,这其实也是 <br>

  <br>

  <br>

  <br>

种攻击所采用的主要技术手段.当然了,我说的是HACKER行为,之所以想要处理这些特殊的IP <br>

  <br>

  <br>

  <br>

,通常也是为了诊断网络的目的. <br>

  <br>

  <br>

  <br>

raw socket的建立是通过如下方式的: <br>

  <br>

  <br>

  <br>

  <br>

sockfd = socket(PF_INET, SOCK_RAW, protocol); <br>

  <br>

  <br>

  <br>

第一个参数就不必讲了,第二个参数说明建立的是一个raw socket,第三个参数倒是需要详  <br>

  <br>

解说一下.这里分三种情况: <br>

  <br>

1.参数protocol用来指明所要接收的协议包,如果是象IPPROTO_TCP(6)这种非0,非255的协  <br>

  <br>

,则内核碰到ip头中protocol域和创建socket所使用参数protocol相同的IP包,就会交给这  <br>

  <br>

rawsocket来处理.因此,一般说来,要想接收什么样的数据包,就应该在参数protocol里来指 <br>

  <br>

  <br>

  <br>

相应的协议.当内核向此raw socket交付数据包的时候,是包括整个IP头的,并且已经是重组 <br>

  <br>

  <br>

  <br>

的IP包. 如下: <br>

的IP包. 如下: <br>

  <br>

  <br>

  <br>

--------------------------------------------------------------- <br>

  <br>

|ip header|tcp header(or x header)| data | <br>

  <br>

--------------------------------------------------------------- <br>

  <br>

用recvfrom收到的数据包括一个IP头,一个相应的协议头,然后是数据(数据也可以为空,就  <br>

  <br>

实际情况了). 但当我们发送IP包的时候,却不用亲自处理IP包头,只需要填 充参数protoco <br>

  <br>

所指定的相应的协议头即可.也就是说,用sendto的时候,我们提供给它的缓冲区数据是从IP <br>

  <br>

  <br>

  <br>

头的第一个字节开始,如下,只需要构造这么一个缓冲区就可以了. <br>

  <br>

  <br>

  <br>

-------------------------------------------------------------- <br>



  <br>

|tcp header(or udp header or x header)| data | <br>

  <br>

-------------------------------------------------------------- <br>

  <br>

如果想自己也想亲自处理IP头,则需要IP_HDRINCL的socket选项.如下: <br>

  <br>

  <br>

  <br>

int flag = 1; <br>

  <br>

setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &flag, sizeof(int)); <br>

  <br>

  <br>

  <br>

这样,发送时所要提供的缓冲区有成如下形式: <br>

  <br>

  <br>

  <br>

--------------------------------------------------------------- <br>

  <br>

|ip header|tcp header(or x header)| data | <br>



--------------------------------------------------------------- <br>

但是,即时是这种情况,在我们发送IP包的时候.也不是填充ip头的所有字段,而是应该将ip <br>

偷膇d(identification)字段设置为0,表示让内核来处理这个字段.同时,内核还帮你完成ip <br>

 的校验和的计算,并随后填充check字段. <br>

  <br>

2.如果protocol是IPPROTO_RAW(255),这时候,这个socket只能用来发送IP包,而不能接收任 <br>

  <br>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -