linux2.6内核网桥分析

2008-03-19 16:15

Linux网桥分析

一、网桥原理

网桥(Bridge)也称桥接器,是连接两个局域网的存储转发设备,用它可以完成具有相同或相似体系结构网络系统的连接。一般情况下,被连接的网络系统都具有相同的逻辑链路控制规程(LLC),但媒体访问控制协议(MAC)可以不同。

桥工作在数据链路层,将两个LAN连起来,根据MAC地址来转发帧,可以看作一个“低层的路由器”(路由器工作在网络层,根据网络地址如IP地址进行转

发)。

远程网桥通过一个通常较慢的链路(如电话线)连接两个远程LAN,对本地网桥而言,性能比较重要,而对远程网桥而言,在长距离上可正常运行是更重要的。

二、Linux网桥的使用

要配置网桥,要网桥的配置工具bridge-utils。源代码可以在http://bridge.sourceforge.net/bridge-utils/ 下载。编译成功之后,生成网桥配置的工具名称为brctl。

配置说明:

五台主机。其中一台主机装有linux

,安装了网桥模块,而且有四块物理网卡,分别连接同一网段的其他主机。我们希望其成为一个网桥,为其他四台主机(IP分别为192.168.1.2

,192.168.1.3,192.168.1.4,192.168.1.5)

之间转发数据包。同时,为了方便管理,希望网桥能够有一个IP(192.168.1.1),那样管理员就可以在192.168.1.0/24网段内的主机

上telnet到网桥,对其进行配置,实现远程管理。

我们为这个逻辑网段一个名称,br_192。首先需要配置这样一个逻辑网段。

# brctl addbr br_192 (建立一个逻辑网段,名称为br_192)

实际上,我们可以把逻辑网段192.168.1.0/24看作使一个VLAN ,而br_192则是这个VLAN的名称。

立一个逻辑网段之后,我们还需要为这个网段分配特定的端口。在Linux中,一个端口实际上就是一个物理网卡。而每个物理网卡的名称则分别为

eth0,eth1,eth2,eth3。我们需要把每个网卡一一和br_192这个网段联系起来,作为br_192中的一个端口。

# brctl addif br_192 eth0 (让eth0成为br_192的一个端口)

# brctl addif br_192 eth1 (让eth1成为br_192的一个端口)

# brctl addif br_192 eth2 (让eth2成为br_192的一个端口)

# brctl addif br_192 eth3 (让eth3成为br_192的一个端口)

网桥的每个物理网卡作为一个端口,运行于混杂模式,而且是在链路层工作,所以就不需要IP了。

# ifconfig eth0 0.0.0.0

# ifconfig eth1 0.0.0.0

# ifconfig eth2 0.0.0.0

# ifconfig eth3 0.0.0.0

然后给br_192的虚拟网卡配置IP:192.168.1.1。那样就能远程管理网桥。

# ifconfig br_192 192.168.1.1

给br_192配置了IP之后,网桥就能够工作了。192.168.1.0/24网段内的主机都可以telnet到网桥上对其进行配置。

以上配置的是一个逻辑网段,实际上Linux网桥也能配置成多个逻辑网段(相当于交换机中划分多个VLAN)。具体的方法可以参考bridge-util中的HOWTO

三、Linux网桥分析

首先了解网桥处理包遵循着以下几条原则:

1 在一个接口上接收到的包不会再在那个接口上发送这个数据包。

2 每个接收到的数据包都要学习其源MAC地址。

3 如果数据包是多播包或广播包,则要在同一个网段中除了接收端口外的其他所有端口发送这个数据包,如果上层协议栈对多播包感兴趣,则需要把数据包提交给上层协议栈。

4 如果数据包的目的MAC地址不能在CAM表中找到,则要在同一个网段中除了接收端口外的其他所有端口发送这个数据包。

5 如果能够在CAM表中查询到目的MAC地址,则在特定的端口上发送这个数据包,如果发送端口和接收端口是同一端口,则不发送。

桥以混杂方式工作,它接收与之连接的所有LAN传送的每一帧。当一帧到达时,网桥必须决定将其丢弃还是转发。如果要转发,则必须决定发往哪个LAN。这需

要通过查询网桥中一张大型散列表里的目的地址而作出决定。该表可列出每个可能的目的地,以及它属于哪一条输出线路(LAN)。在插入网桥之初,所有的散列

表均为空。由于网桥不知道任何目的地的位置,因而采用扩散算法(flooding

algorithm):把每个到来的、目的地不明的帧输出到连在此网桥的所有LAN中(除了发送该帧的LAN)。随着时间的推移,网桥将了解每个目的地的

位置。一旦知道了目的地位置,发往该处的帧就只放到适当的LAN上,而不再散发。

网桥采用的算法是逆向学习法(backward learning)。网桥按混杂的方式工作,故它能看见所连接的任一LAN上传送的帧。查看源地址即可知道在哪个LAN上可访问哪台机器,于是在散列表中添上一项。

计算机和网桥加电、断电或迁移时,网络的拓扑结构会随之改变。为了处理动态拓扑问题,每当增加散列表项时,均在该项中注明帧的到达时间。每当目的地已在表

中的帧到达时,将以当前时间更新该项。这样,从表中每项的时间即可知道该机器最后帧到来的时间。网桥中有一个进程定期地扫描散列表,清除时间早于当前时间

若干分钟的全部表项。于是,如果从LAN上取下一台计算机,并在别处重新连到LAN上的话,那么在几分钟内,它即可重新开始正常工作而无须人工干预。这个

算法同时也意味着,如果机器在几分钟内无动作,那么发给它的帧将不得不散发,一直到它自己发送出一帧为止。

在Linux内核网桥的实现中,一个逻辑网段用net_bridge结构体表示。一个逻辑网段需要保留的信息有:

1 本逻辑网段中所有的端口(port_list)

每个端口用net_bridge_port结构体来表示,从net_bridge_port结构体中可以看出,它主要有:

1 逻辑网段中的下一个端口(next)

2 本端口所属的逻辑网段(br)

3 本端口所指向的物理网卡(dev)

4 本端口在网桥中的编号(port_no)

5 用于生成树管理的信息

一个逻辑网段中可以具有很多个端口,所有的端口都挂在以port_list为链表头的链表上。

2 本网段中CAM表(hash[BR_HASH_SIZE])

CAM表中的每个项用net_bridge_fdb_entry结构体代表,每项中有:

1 用于CAM表连接的链表指针(next_hash,pprev_hash)

2 此项当前的引用计数(use_count)

3 MAC地址(addr)

4 此项所对应的端口(dst)

5 处理MAC超时(ageing_timer)

6 是否是本机的MAC地址(is_local)

7 是否是静态MAC地址(is_static)

一个逻辑网段中的所有表项形成一个CAM表,他们之间的组织关系是一个HASH链表。HASH链的个数为BR_HASH_SIZE(256)。

3 本逻辑网段用于和外部通信的虚拟网络设备(dev)

Linux网桥可以在网桥上为每个逻辑网段配置一个IP,用于和外部通信。实际上这个IP不是配置在一个特定的物理网卡上面, 而是建立一个虚拟的网卡,虚拟网卡可以附在每个同一逻辑网段的物理网卡上,让这个网卡可以象所有的物理网卡一样工作。从而使网桥可以和外部通信。

4 本逻辑网段虚拟网卡的统计数据(statistics)

按照Linux网卡驱动的接口,一个网卡的统计信息是由每个网卡的私有数据处理的。一般的写法是用dev->priv来指向每个网卡的统计数据。网卡的get_stats方法就是用来读取统计数据。

linux 两台设备网桥配置6,linux2.6内核网桥分析相关推荐

  1. linux两台服务器传输,Linux两台服务器之间高速数据传输命令:scp应用详解

    Linux两台服务器之间高速数据传输命令:scp应用详解 Linux scp命令用于Linux之间复制文件和目录到另外一台,这个命令在多台服务器之间传输还是非常有用的,速度也是非常快的.比window ...

  2. 两台设备有三条链路,请问如何添加?

    两台设备有三条链路,请问如何添加? 添加一条线,再用"经过"功能. 默认情况下链路和节点的的中心点连接,因此,默认状态下两个节点间添加n条链路,都只能看到一条,之前的n-1条被最后 ...

  3. 两个服务器组虚拟机,linux 两台虚拟机

    linux 两台虚拟机 内容精选 换一换 在虚拟机完成安装配置后,可执行如下操作获取Linux镜像文件.打开VirtualBox,选中新创建的虚拟机,选择"设置 > 存储", ...

  4. 如何判断两台设备是否在同一局域网内

    1. IP&MASK 查看两台设备的ip4地址和子网掩码. 若子网掩码不一样,则不在同一局域网内. 若一样,分别计算IP&MASK,若二者相同,则在同一局域网内,否则不在同一局域网. ...

  5. Linux 两台主机之间建立信任关系方式及基本原理

    前言: 去年学过一段时间的现代密码学,最近在配置github, Linux主机之间建立信任关系的时候都用到了其中一些知识,所以刚好整理一下,想直接看操作方式的可直接拉到下面 密码学基本知识 一 现代密 ...

  6. linux两台机器间实现无密远程登录(使用证书)

    思路分析: 比如有两台主机,192.168.0.69,192.168.0.70.其中192.68.0.69上安装有ansible,为了使用ansible进行自动化运维,我们需要实现192.168.0. ...

  7. 同一个网络下两台设备看直播时,进度不是一致的?浅谈其运作原理

     目录 ​编辑 前言 开篇 概念补充 直播原理 真实场景 总结 前言 大家好哇!我是爷爷的茶七里香,发现一个很有意思的现象,想必大家也遇到过,我是在跟朋友同时看LOL总决赛直播的时候发现的,当时我跟他 ...

  8. [ Ubuntu 使用技巧 ] 使用 Synergy 联接两台设备使用同一套键鼠操控

    §1. General Purposes: Why I wrote this? 最近开发中会有一些时候需要使用其他设备,比如 RK3399 的开发板.正常情况下,可以通过 ssh 命令登上去在 Ter ...

  9. linux服务器拷贝目录文件夹,linux两台服务器之间文件/文件夹拷贝

    linux两台服务器之间文件/文件夹拷贝 跨服务器拷贝需要用到的命令是scp. ----------------------拷贝文件夹--------------------------------- ...

  10. linux同步某台服务器,linux 两台服务器之间开机自动同步指定目录下的文件

    linux 两台服务器之间开机自动同步指定目录下的文件 服务器B(172.17.166.11)上开机或者重启会自动拉取服务器A(172.17.166.10)上指定目录下所有文件 1.创建服务器B到服务 ...

最新文章

  1. 微软在.NET官网上线.NET 架构指南频道
  2. P2B: Point-to-Box Network 点云目标跟踪(CVPR 2020)
  3. 软件开发基本原则(一)—— 策略和因素 (转)
  4. 机器学习中Python常用库总结(numpy,scipy,matplotlib,pandas)
  5. pcb地线应该不应该做成环路_图解PCB地线干扰及抑制
  6. 全国软考数据库系统工程师教程(第2版)目录
  7. 每日一测5(关于继承)
  8. 调整心态,java复习要点总结。
  9. php sizeof函数,sizeof()的简单介绍
  10. 借势新基建,如何在智能基础设施布一盘大局?
  11. Web 组件势必取代前端?
  12. 一种基于区块链的物联网架构设计
  13. 产品快速迭代的五大要点
  14. 飞塔60d带宽_飞塔防火墙划分带宽 万兆防火墙
  15. 语音端点检测 php,几种语音端点检测方法简介
  16. 手写Android热修复
  17. ISP芯片:如何让数字之眼“看清”真实世界?
  18. ios开发者中心,证书,APPID,配置文件
  19. A 0.18um CMOS SOC for a 100-m-Range 10-Frame/s 200x96 pixel time-of-flight Depth Sensor翻译
  20. ABAQUS振动切削

热门文章

  1. 计算机组装配置兼容,电脑组装时怎么选择配置主板
  2. AM3352上移植sqlite3数据库
  3. Arduino连接HC05蓝牙模块
  4. Unknown column 'hghefsdhjd' in 'where clause'
  5. 北大开源ECCV2018深度去雨算法:RESCAN
  6. vum安装mysql_Vue自动化工具(Vue-CLI)的安装
  7. poi 操作 PPT,针对 PPTX--表格简单操作
  8. IDEA必备插件大全
  9. Vue番外之循环数组从指定下标开始
  10. 世界时钟-国家中英文名称-国家代码-与北京的时差 一览