bridge

1.什么是桥接
   简单来说,桥接就是把一台机器上的若干个网口"连接"起来。
   这样,其中一个网口收到的报文会被复制给其他网口并发送出去。
   以使得网口之间的报文能够相互转发。

2.概念
   二层
   虚拟的网络设备

3.功能
   转发:依赖FDB
   学习:生成FDB

4.扩展
4.1网卡四种工作模式

  • 广播模式(BroadCast Model):接收广播帧
  • 多播模式(MultiCast Model):接收多播帧
  • 直接模式(Direct Model):只接收目的地址是自己 mac 地址的帧
  • 混杂模式(Promiscuous Model):接收流过网卡的所有帧

   网卡缺省模式包含广播模式和直接模式
   添加到网桥的物理网口,会被设为混杂模式(将物理网口添加到网桥时,内核会做此工作)
   处于混杂模式下网卡的IP无效

4.2 网卡的五种状态

  • #define BR_STATE_DISABLED 0 // 什么功能都没有,只有一个逻辑设备。
  • #define BR_STATE_LISTENING 1 // 可以接收和发送网络传输的BPDU,但不能进行数据帧的转发、不能学习。
  • #define BR_STATE_LEARNING 2 // 可以接收和发送BPDU,可以学习,但是不能进行数据帧的转发。
  • #define BR_STATE_FORWARDING 3 // 可以接收和发送BPDU、可以学习、可以进行数据帧的转发。
  • #define BR_STATE_BLOCKING 4 // 只能接收BPDU,不能发送BPDU,不能学习,不能转发数据帧。

4.3 bridge的MAC地址

  • 新创建的bridge,获得一个随机MAC地址
  • 添加Port后,指定其中一个Port的MAC作为bridge的MAC
  • 如果没有手动指定,br0 会根据 bridge 中 port 的变化,自动选择(是否规范规定?) port 最小的一个 MAC 作为自身 MAC 地址

4.4 bridge的IP地址

  • 给网桥设置一个 IP 地址,这个地址可以作为其下主机的网关。作为网关时,还要有路由和nat功能。
  • 给网桥一个地址,这样就能远程管理网桥了。

4.5 bridge 在内核中的位置
   源码:/linux-kernel/net/bridge
   相对简单独立的module
   make -C /lib/modules/4.15.0-101-generic/build/ M=/usr/src/linux-headers-4.15.0-101-generic/net/bridge modules
   rmmod bridge
   insmod bridge.ko

4.6 用户空间操作bridge
   命令:brctl
   添加网桥(br0)

$ brctl addbr br0

   将物理网口加入网桥(br0)

$ brctl addif br0 enp3s0
$ brctl addif br0 enp4s0

   linux内核支持网口的桥接(目前只支持以太网接口)。???

$ sudo brctl addif br0 enp3s0
$ sudo brctl addif br0 wlp5s0
can't add wlp5s0 to bridge br0: Operation not supported

在这里插入图片描述

5.一次局域网内的ping过程
在这里插入图片描述
6.二层数据包转发过程
在这里插入图片描述
在这里插入图片描述
7.补充
   7.1老化时间
      需要定时忘记之前的记录。
在这里插入图片描述
C向B发送一条报文,S1记录下了C对应的端口是eth2,如果之后C与B对调位置,B向C发送报文时,S1从eth2口收到目的地址是C的MAC地址时,会丢弃报文,因为它认为C本来就在eth2端口上。这样通信便会受阻,所以需要引入超时机制,如果某个端口一段时间(默认5min)没有收到某个源MAC的信息,bridge便会去除此条记录。

7.2 bridge模型
在这里插入图片描述
网桥设备br0绑定了eth0和eth1。对于网络协议栈的上层来说,只看得到br0,因为桥接是在数据链路层实现的,上层不需要关心桥接的细节。于是协议栈上层需要发送的报文被送到br0,网桥设备的处理代码再来判断报文该被转发到eth0或是eth1,或者两者皆是;
反过来,从eth0或从eth1接收到的报文被提交给网桥的处理代码,在这里会判断报文该转发、丢弃、或提交到协议栈上层。

7.3 生成树协议
在这里插入图片描述
   7.3.1冗余链路的必要性
      在复杂网络中,需要对链路做一定的冗余,以便当其中一条链路或者某台交换机出现故障时,整个网络还能保持通畅。
   7.3.2冗余链路的弊端
      有可能形成环路,造成网络风暴。
      假设两台交换机都刚刚启动,C向B发送一个报文,S2由于地址表为空,所以要对其他口进行广播,S1会从eth2和eth3口都受到此广播报文,并且同时会向其他口转发,由此形成环路。并且非环路接口也会因此一直收到广播报文,造成网络风暴。
   7.3.3解决办法——生成树协议
      环形–>树形
      a)先找树根
         规定,只有树根节点才能向外发送BPUD报文,用来协调其它交换机
         上电后,都认为自己是树根,向各个网口发BPUD报文,BPUD报文包含root_id,由网络管理员指定,越小优先级越高,一般是性能较好的交换机。相同时,再比较MAC地址。
      当收到比自己优先级更高的BPUD时,停止自己的BPUD发送,转而转发更高优先级的BPUD报文。
      b)确定唯一上行端口
         到树根开销最小的那个网口
      c)确定要被阻塞的下行端口

### Bridge Domain在网络配置中的概念 Bridge域(Bridge Domain),通常是指一组端口之间的二层广播域,在这些端口中,数据帧可以相互转发而不需要通过三层设备如路由器。这有助于隔离不同类型的流量并提高网络性能和安全性。 在虚拟化环境中,桥接域允许创建多个独立的逻辑网络段,即使它们位于同一物理交换机上也能保持分离状态。对于容器平台而言,自定义桥接接口能够更好地控制进出容器的数据流方向以及如何与其他外部资源交互[^1]。 当希望完全不让Docker负责创建自己的以太网桥时,可以在启动之前建立个人专属桥梁,并利用`dockerd`命令行参数`--bridge=BRIDGE`指定给定名称的现有Linux网桥作为默认网桥来替代默认设置下的`docker0`网桥。 ```bash sudo ip link add name my_bridge type bridge sudo ip addr add 192.168.1.1/24 dev my_bridge sudo ip link set dev my_bridge up ``` 上述脚本展示了怎样手动构建一个新的名为`my_bridge`的Linux网桥实例,并分配IP地址以便后续操作中将其指派为Docker守护进程使用的默认网桥。 为了使新设立好的网桥生效于Docker服务之中,则需编辑Docker配置文件或是在重启Docker前临时修改环境变量: ```bash export DOCKER_OPTS="--bridge=my_bridge" service docker restart ``` 此过程确保了所有新建容器都将自动连接到所设定的新建网桥之上而不是原有的`docker0`网桥
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Li-Yongjun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值