Linux 上的基础网络设备详解

Linux 抽象网络设备简介

和磁盘设备相似,Linux 用户想要使用网络功能,不能经过直接操做硬件完成,而须要直接或间接的操做一个 Linux 为咱们抽象出来的设备,既通用的 Linux 网络设备来完成。一个常见的状况是,系统里装有一个硬件网卡,Linux 会在系统里为其生成一个网络设备实例,如 eth0,用户须要对 eth0 发出命令以配置或使用它了。更多的硬件会带来更多的设备实例,虚拟的硬件也会带来更多的设备实例。随着网络技术,虚拟化技术的发展,更多的高级网络设备被加入了到了 Linux 中,使得状况变得更加复杂。在如下章节中,将一一分析在虚拟化技术中常常使用的几种 Linux 网络设备抽象类型:Bridge、802.1.q VLAN device、VETH、TAP,详细解释如何用它们配合 Linux 中的 Route table、IP table 简单的建立出本地虚拟网络。网络

Bridge

Bridge(桥)是 Linux 上用来作 TCP/IP 二层协议交换的设备,与现实世界中的交换机功能类似。Bridge 设备实例能够和 Linux 上其余网络设备实例链接,既 attach 一个从设备,相似于在现实世界中的交换机和一个用户终端之间链接一根网线。当有数据到达时,Bridge 会根据报文中的 MAC 信息进行广播、转发、丢弃处理。函数

如图所示,Bridge 的功能主要在内核里实现。当一个从设备被 attach 到 Bridge 上时,至关于现实世界里交换机的端口被插入了一根连有终端的网线。这时在内核程序里,netdev_rx_handler_register()被调用,一个用于接受数据的回调函数被注册。之后每当这个从设备收到数据时都会调用这个函数能够把数据转发到 Bridge 上。当 Bridge 接收到此数据时,br_handle_frame()被调用,进行一个和现实世界中的交换机相似的处理过程:判断包的类别(广播/单点),查找内部 MAC 端口映射表,定位目标端口号,将数据转发到目标端口或丢弃,自动更新内部 MAC 端口映射表以自我学习。学习

Bridge 和现实世界中的二层交换机有一个区别,图中左侧画出了这种状况:数据被直接发到 Bridge 上,而不是从一个端口接受。这种状况能够看作 Bridge 本身有一个 MAC 能够主动发送报文,或者说 Bridge 自带了一个隐藏端口和寄主 Linux 系统自动链接,Linux 上的程序能够直接从这个端口向 Bridge 上的其余端口发数据。因此当一个 Bridge 拥有一个网络设备时,如 bridge0 加入了 eth0 时,实际上 bridge0 拥有两个有效 MAC 地址,一个是 bridge0 的,一个是 eth0 的,他们之间能够通信。由此带来一个有意思的事情是,Bridge 能够设置 IP 地址。一般来讲 IP 地址是三层协议的内容,不该该出如今二层设备 Bridge 上。可是 Linux 里 Bridge 是通用网络设备抽象的一种,只要是网络设备就可以设定 IP 地址。当一个 bridge0 拥有 IP 后,Linux 即可以经过路由表或者 IP 表规则在三层定位 bridge0,此时至关于 Linux 拥有了另一个隐藏的虚拟网卡和 Bridge 的隐藏端口相连,这个网卡就是名为 bridge0 的通用网络设备,IP 能够当作是这个网卡的。当有符合此 IP 的数据到达 bridge0 时,内核协议栈认为收到了一包目标为本机的数据,此时应用程序能够经过 Socket 接收到它。一个更好的对比例子是现实世界中的带路由的交换机设备,它也拥有一个隐藏的 MAC 地址,供设备中的三层协议处理程序和管理程序使用。设备里的三层协议处理程序,对应名为 bridge0 的通用网络设备的三层协议处理程序,即寄主 Linux 系统内核协议栈程序。设备里的管理程序,对应 bridge0 寄主 Linux 系统里的应用程序。spa

Bridge 的实现当前有一个限制:当一个设备被 attach 到 Bridge 上时,那个设备的 IP 会变的无效,Linux 再也不使用那个 IP 在三层接受数据。举例以下:若是 eth0 原本的 IP 是 192.168.1.2,此时若是收到一个目标地址是 192.168.1.2 的数据,Linux 的应用程序能经过 Socket 操做接受到它。而当 eth0 被 attach 到一个 bridge0 时,尽管 eth0 的 IP 还在,但应用程序是没法接受到上述数据的。此时应该把 IP 192.168.1.2 赋予 bridge0。orm

另外须要注意的是数据流的方向。对于一个被 attach 到 Bridge 上的设备来讲,只有它收到数据时,此包数据才会被转发到 Bridge 上,进而完成查表广播等后续操做。当请求是发送类型时,数据是不会被转发到 Bridge 上的,它会寻找下一个发送出口。用户在配置网络时常常忽略这一点从而形成网络故障。路由

相关文章
相关标签/搜索