BPF(BSD Packet Filter)简介

BPF(BSD Packet Filter)是一种抓取并过滤网络数据包(capture and filter packet)的内核结构(kernel architecture)。BPF包含2个重要的组成部分:网络分流器(network tap)和包过滤器(packet filter)。网络分流器负责从网络驱动拷贝数据包,而包过滤器则过滤掉不符合条件的数据包,只把符合需求的数据包上报给应用程序。下图摘自UNP

BPF

当数据包到达网卡时,正常情况下,数据链路层的驱动程序会把包转给协议栈。但当有BPF监听网卡时,驱动程序会首先把包发给BPFBPF会把包发给不同程序的包过滤器,再由过滤器决定哪些包并且包里的哪些内容应该保存下来。对于符合条件的数据包,BPF会把数据拷贝到和包过滤器对应的缓存(buffer)。然后驱动程序继续执行。

在用tcpdump命令过滤数据包时:

tcpdump -p -ni eth0 -d "ip and udp"

实际就用到了BPF

Scala笔记(1)——一个入门的Scala程序

这是一个简单的入门Scala程序(iterate.scala):

object Iterate {
  def main (args: Array[String]) {
    args.foreach(s => println(s))
  }
}

在程序中,Iterate被定义成objectScalaobjectsingleton,也就是运行时只能产生一个Iterate实例。

main方法只能定义在object中,传入到main方法中的命令行参数是一个字符串数组:args: Array[String]main方法可以看成是Java类的static main方法,即Iterate程序的入口函数。

s => println(s)是一个functional literal,做的仅仅是打印s而已。

执行这个程序:

[root@Fedora scala]# scala iterate.scala  1 2
1
2

可以看出打印了命令行参数。