7.1.1 网络设备概述
Linux最为突出的特点在于它是开放的自由软件以及其内置的网络支持。在Linux中,所有的网络通信都发生在软件接口与物理网络设备之间,本章主要从网络配置文件和Linux网络命令展开对Linux网络配置的介绍。
在Linux中,为了简化对设备的管理,所有外围的硬件设备被归结为三类:字符设备(如键盘、鼠标等)、块设备(如硬盘、光驱、软驱等)和网络设备(也称为网络接口——network interface,如以太网卡)。
为了屏蔽网络环境中物理网络设备的多样性,Linux对所有的物理设备进行抽象并定义了一个统一的概念,称之为接口(Interface)。所有对网络硬件的访问都是通过接口进行的,接口对上层协议提供一致化的操作集合来处理基本数据的发送和接收,对下层屏蔽硬件差异。
在Linux中所有网络接口都用一个net_device的数据结构表示。通常,网络设备是一个物理设备如以太网卡,但软件也可以作为网络设备,如回送设备(Loopback)。所有被网络设备发送和接收的包都用数据结构skb_buff表示,这是一个具有很好的灵活性的数据结构,可以很容易增加或删除网络协议数据包头。
网络设备有其非常特殊的地方。它与字符设备、块设备都有很大的不同:一是网络接口不存在于Linux的文件系统根目录下的dev中,而是在内核中用一个net_device数据结构表示。而每一个字符设备或者块设备则在文件系统中都存在一个相应的特殊设备文件来表示该设备,如/dev/hda1、/dev/sda1、/dev/tty1等。网络设备在做数据包发送和接收时,直接通过接口访问,不需要进行文件的操作,而对字符设备和块设备的访问都需通过文件操作界面。二是网络接口是在系统初始化时实时生成的,对于内核支持的但不存在的物理网络设备,将不可能有与之相对应的net_device结构。而对于系统支持的字符设备和块设备,即使该物理设备不存在,在dev下也会有相应的设备文件与之相对应。且在系统初始化的时候,内核将会对所有内核支持的字符设备和块设备进行登记,初始化该设备的文件操作界面(Struct File_operations),而不管该设备在物理上是否存在。
网络设备和字符设备、块设备也有一些共同之处,比如在系统中网络设备的角色和安装的块设备相似。一个块设备在blk_dev数组及内核其他的数据结构中登记自己,然后根据请求,通过自己的request_function函数“发送”和“接收”数据块。相似地,为了能与外面世界进行数据交流,一个网络接口也必须在一个特殊的数据结构中登记自己。
网络设备在初始化时,调用系统函数register_netdev()将自己的net_device结构加入到dev_base指向的net_device链表中。因此链表中的每一个单元表示一个存在网络设备(可能是物理的也可能是逻辑的)。当要发送数据时,Linux的网络层子系统将根据系统路由表在dev_base指向的链表中,选择相应的网络接口进行数据传输,而当接收到数据包时,通过驱动程序登记的中断服务程序进行数据的接收处理。如图7-1所示为网络设备工作原理图。
图7-1 Linux网络设备工作原理图
小知识
Linux网络设备不是面向流的设备,因此不会将网络设备的名字(例如eth0)映射到文件系统中去。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。