1 网桥的原理及在linux内核中的实现

来源:互联网 发布:鲁班软件 北京 编辑:程序博客网 时间:2024/06/05 05:07


 

2.1   

桥接的概念

 

简单来说,桥接就是把一台机器上的若干个网络接口“连接”起来。其结果是,其中一个网口收到的报文会被复制给其他网

口并发送出去。以使得网口之间的报文能够互相转发。

 

交换机就是这样一个设备,它有若干个网口,并且这些网口是桥接起来的。于是,与交换机相连的若干主机就能够通过交换

机的报文转发而互相通信。

 

如下图:主机

A

发送的报文被送到交换机

S1

eth0

口,由于

eth0

eth1

eth2

桥接在一起,故而报文被复制到

eth1

eth2

,并且发送出去,然后被主机

B

和交换机

S2

接收到。而

S2

又会将报文转发给主机

C

D

 

 

交换机在报文转发的过程中并不会篡改报文数据,只是做原样复制。然而桥接却并不是在物理层实现的,而是在数据链路层。

交换机能够理解数据链路层的报文,所以实际上桥接却又不是单纯的报文转发。

 

交换机会关心填写在报文的数据链路层头部中的

Mac

地址信息(包括源地址和目的地址),以便了解每个

Mac

地址所代表

的主机都在什么位置(与本交换机的哪个网口相连)。在报文转发时,交换机就只需要向特定的网口转发即可,从而避免不

必要的网络交互。这个就是交换机的“地址学习”。但是如果交换机遇到一个自己未学习到的地址,就不会知道这个报文应

该从哪个网口转发,则只好将报文转发给所有网口(接收报文的那个网口除外)。

 

比如主机

C

向主机

A

发送一个报文,报文来到了交换机

S1

eth2

网口上。假设

S1

刚刚启动,还没有学习到任何地址,则

它会将报文转发给

eth0

 eth1

。同时,

S1

会根据报文的源

Mac

地址,记录下“主机

C

是通过

eth2

网口接入的”。于是当

主机

A

C

发送报文时,

S1

只需要将报文转发到

 eth2

网口即可。而当主机

D

C

发送报文时,假设交换机

S2

将报文转发

到了

S1

eth2

网口(实际上

S2

也多半会因为地址学习而不这么做),则

S1

会直接将报文丢弃而不做转发(因为主机

C

是从

eth2

接入的)。

 

然而,网络拓扑不可能是永不改变的。假设我们将主机

B

和主机

C

换个位置,当主机

C

发出报文时(不管发给谁),交换

S1

eth1

口收到报文,于是交换机

 S1

会更新其学习到的地址,将原来的“主机

C

是通过

eth2

网口接入的”改为“主机

C

是通过

eth1

网口接入的”。

 

但是如果主机

C

一直不发送报文呢?

S1

将一直认为“主机

C

是通过

eth2

网口接入的”,于是将其他主机发送给

C

的报文都

eth2

转发出去,结果报文就发丢了。所以交换机的地址学习需要有超时策略。对于交换机

S1

来说,如果距离最后一次收

到主机

C

的报文已经过去一定时间了(默认为

5

分钟),则

S1

需要忘记“主机

C

是通过

eth2

网口接入的”这件事情。这样

一来,发往主机

C

的报文又会被转发到所有网口上去,而其中从

eth1

转发出去的报文将被主机

C

收到。

 

2.2  linux

的桥接实现

 

 linux

内核支持网口的桥接(目前只支持以太网接口)。但是与单纯的交换机不同,交换机只是一个二层设备,对于接收到

的报文,要么转发、要么丢弃。小型的交换机里面只需要一块交换芯片即可,并不需要

CPU

。而运行着

linux

内核的机器本

身就是一台主机,有可能就是网络报文的目的地。其收到的报文除了转发和丢弃,还可能被送到网络协议栈的上层(网络

层),从而被自己消化。

linux

内核是通过一个虚拟的网桥设备来实现桥接的。这个虚拟设备可以绑定若干个以太网接口设

备,从而将它们桥接起来。如下图

 

 

 

网桥设备

br0

绑定了

eth0

eth1

。对于网络协议栈的上层来说,只看得到

br0

,因为桥接是在数据链路层实现的,上层不需

要关心桥接的细节。于是协议栈上层需要发送的报文被送到

br0

,网桥设备的处理代码再来判断报文该被转发到

eth0

或是

eth1

,或者两者皆是;反过来,从

eth0

或从

eth1

接收到的报文被提交给网桥的处理代码,在这里会判断报文该转发、丢弃、

或提交到协议栈上层。

 

而有时候

eth0

eth1

也可能会作为报文的源地址或目的地址,直接参与报文的发送与接收(从而绕过网桥)。

 

2.3   

网桥的功能

 

概括来说,网桥实现最重要的两点:

 

1

 MAC

学习:学习

MAC

地址,起初,网桥是没有任何地址与端口的对应关系的,它发送数据,还是得想

HUB

一样,但是

每发送一个数据,它都会关心数据包的来源

MAC

是从自己的哪个端口来的,由于学习,建立地址

-

端口的对照表(

CAM

表)。

 

2

.报文转发:每发送一个数据包,网桥都会提取其目的

MAC

地址,从自己的地址

-

端口对照表

(CAM

)

中查找由哪个端口

把数据包发送出去。

 

3  

网桥的配置

 

Linux

里面使用网桥非常简单,仅需要做两件事情就可以配置了。其一是在编译内核里把

CONFIG_BRIDGE

CONDIG_BRIDGE_MODULE

编译选项打开;其二是安装

brctl

工具。第一步是使内核协议栈支持网桥,第二步是安装用户空间

工具,通过一系列的

ioctl

调用来配置网桥。下面以一个相对简单的实例来贯穿全文,以便分析代码。

 

Linux

机器有

4

个网卡,分别是

eth0~eth4

,其中

eth0

用于连接外网,而

eth1, eth2, eth3

都连接到一台

PC

机,用于配置网桥。

只需要用下面的命令就可以完成网桥的配置:

 

Brctl addbr br0 (

建立一个网桥

br0, 

同时在

Linux

内核里面创建虚拟网卡

br0) 

Brctl addif br0 eth1 

Brctl addif br0 eth2 

Brctl addif br0 eth3 (

分别为网桥

br0

添加接口

eth1, eth2

eth3) 

其中

br0

作为一个网桥,同时也是虚拟的网络设备,它即可以用作网桥的管理端口,也可作为网桥所连接局域网的网关,具

体情况视你的需求而定。要使用

br0

接口时,必需为它分配

IP

地址。为正常工作,

PC1, PC2

PC3

br0

IP

地址分配在同

一个网段。

 

网桥的实现

 

0 0
原创粉丝点击