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

📄 141.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="134.htm">上一层</a>][<a href="142.htm">下一篇</a>]
<hr><p align="left"><small>发信人: guru ( Darkness), 信区: unp <br>

标  题: BPF(Berkeley Packets Filter,伯克利包过滤器)(转载) <br>

发信站: UNIX编程 (2001年06月20日18:19:34 星期三), 站内信件 <br>

  <br>

【 以下文字转载自 APUE 讨论区 】 <br>

【 原文由 lookout 所发表 】 <br>

  <br>

BPF(Berkeley Packets Filter,伯克利包过滤器) <br>

  <br>

作者:bobdai <br>

  <br>

    4.4BSD和其他源自Berkeley的实现使用BPF作为访问数据链路层的手段。SCO OpenServe <br>

r虽然源自SVR3,但他采取了BPF的思想,BPF可以作为一个可加载模块随时加载到内核。BPF <br>

所做的事情,无非就是读入数据,按照规则检查数据,符合要求则向上层模块传递数据(可 <br>

指定大小,比如我只对包的前100字节感兴趣则可让其只传前100字节),不符合要求的数据 <br>

就抛弃。规则的设定较为麻烦一些,下面将简单介绍。对BPF的详细介绍可参见<< TCP/IP I <br>

llustrated, Volume 2 >>    [Gary R. Wright(Contributor)] <br>

  <br>

    BPF定义了一个伪机器。这个伪机器可以执行代码,有一个累加器,寄存器,和赋值、 <br>

算 <br>

术、跳转指令。一条指令由一个定义好的结构 struct bpf_insn 表示,与真正的机器代码 <br>

很 <br>

相似,若干个这样的结构组成的数组,就成为BPF的指令序列。下图给出了一段BPF“程序” <br>



的例子。为了方便“编程”起见,BPF的 <br>

  <br>

struct bpf_insn insns[] = <br>

  <br>

{ <br>

  <br>

        BPF_STMT( BPF_LD + BPF_H + BPF_ABS, 12 ), <br>

  <br>

        BPF_JUMP( BPF_JMP + BPF_JEQ + BPF_K, ETHERTYPE_IP, 0, 3 ), <br>

  <br>

        BPF_STMT( BPF_LD + BPF_W + BPF_ABS, 30 ), <br>

  <br>

        BPF_JUMP( BPF_JMP + BPF_JEQ + BPF_K, 0xc0a80001, 0, 1 ), <br>

  <br>

        BPF_STMT( BPF_RET + BPF_K, 60 ), <br>

  <br>

        BPF_STMT( BPF_RET + BPF_K, 0 ), <br>

  <br>

}; <br>

  <br>

            图 2.3 <br>

  <br>

  <br>

设计者用两个宏 BPF_STMT和BPF_JUMP来直观代替了结构赋值操作,这两个宏展开后,其实 <br>

都 <br>

是一个赋了值的struct bpf_insn结构。BPF的主要指令有BPF_LD,BPF_ALU,BPF_JMP,BPF_ <br>

RET等。BPF_LD将数据装入累加器,BPF_ALU对累加器执行算术命令,BPF_JMP是跳转指令,B <br>

PF_RET是程序返回指令。现在,让我们看看图2.3的BPF程序。这段程序执行这样的过滤功能 <br>

:首先判断收到的帧是否携带IP包,是则继续,否则返回0字节(即丢弃该包);然后判断I <br>

P包的目的地址是否 192.168.0.1(转换为32位整型值为0xc0a80001),是则返回此帧的头6 <br>

0字节,否则返回0字节。 <br>

  <br>

第一句BPF_STMT( BPF_LD + BPF_H + BPF_ABS, 12 ),表示将帧的第12字节(从第0字节开始 <br>

计算)开始处的两个字节作为一个字送入累加器。BPF_H表示按字传送,另外还有BPF_W和BP <br>

F_B分别表示传双字和单个字节;BPF_ABS表示12为相对于帧头的绝对偏移,另外BPF_IND表 <br>

示 <br>

相对偏移。 <br>

  <br>

第二句BPF_JUMP( BPF_JMP + BPF_JEQ + BPF_K, ETHERTYPE_IP, 0, 3 ),表示将累加器的内 <br>

容与常数 ETHERTYPE_IP 比较,相等则PC(Program Counter)加0(相当于继续执行第三句) <br>

,否则PC加3,即跳到第六句。BPF_JEQ表示“相等则转移”,另外还有BPF_JA和BPF_JGT等 <br>

, <br>

与汇编语言的语义几乎完全相同。而硬件帧的第12、13字节正是ETHER_HEADER结构中ETHER_ <br>

TYPE成员所在空间。 <br>

  <br>



第三句BPF_STMT( BPF_LD + BPF_W + BPF_ABS, 30 ),与第一句类似,将帧的第30字节处开 <br>

始的4个字节传入累加器,这32位数据正是IP包的目的地址。 <br>

  <br>

第四句BPF_JUMP( BPF_JMP + BPF_JEQ + BPF_K, 0xc0a80001, 0, 1 ),类似于第二句,将累 <br>

加器的内容与数0xc0a80001比较,相等则执行第五句,否则执行第六句。 <br>

  <br>

第五句BPF_STMT( BPF_RET + BPF_K, 60 ),表示结束程序,并输出收到帧的前60字节。 <br>

  <br>

第六句BPF_STMT( BPF_RET + BPF_K, 0 ),表示结束程序,不输出数据。 <br>

有关BPF程序的简介到此为止,更详细的资料可以参见<< TCP/IP Illustrated, Volume 2 ( <br>

TCPv2) >> [Gary R. Wright(Contributor)] 的第三十一章。 <br>

  <br>

-- <br>

※ 来源:.UNIX编程WWW apue.dhs.org. [FROM: 202.114.1.117] <br>

-- <br>

※ 转载:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.36.175] <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="134.htm">上一层</a>][<a href="142.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>

⌨️ 快捷键说明

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