背景

最近接触docker的网络配置方式,发现其默认会创建一个docker0的Linux Bridge,宿主机上运行的容器可以通过连接该birdge实现与外网的通信,根据bridge这个命名很自然的认为这就是一个传统意义上的硬件网桥的软件实现,然而进一步探究后发现并非如此,Linux Bridge其实并不是一个虚拟网桥,而应该视为一个虚拟交换机更合适。

进一步的探究过程引发了一些缠绕在心中多年不甚清晰的网络交换设备知识问题,这里记录一下自己的思考总结,如有不对欢迎勘正。

网络交换设备之灵魂拷问

  1. 网桥是什么?
  2. 交换机是什么?
  3. 二层交换机、三层交换机有什么区别?
  4. 路由器是什么?
  5. 交换机、路由器有什么区别?

TCP/IP模型 && OSI七层模型

要解决上述问题,不可避免要先了解经典的TCP/IP模型与OSI七层模型这两个概念,如下为两个模型的图解:



左边的TCP/IP分层模型是现代网络协议栈的实际标准,但是讨论网络相关分层时,大家一般都采用右边的OSI参考模型分层,像是集线器、网桥、交换机、路由器都是工作在都是工作在一层(物理层)、二层(数据链路层)、三层(网络层)这下面三层,再比如nginx负责HTTP 协议的反向代理时我们说它是七层(应用层)负载均衡,而其作为TCP/UDP协议的反向代理时则说它是四层(传输层)负载均衡。

网络交换设备演进

这里以从下至上的角度梳理一下基础网络设备的发展与原理。

互联需求产生的集线器

上世纪70年代以太网被发明出来之后,多台计算机如果要互联需要一个统一的黑盒子负责中转互相之间的发送的数据,即所有需要联网的计算机均通过网线与这个黑盒子相连--经典的星型网络结构,这个黑盒子就是集线器,集线器只负责将任意端口收到的物理电信号广播到其他所有端口,完全不关心数据的具体内容与格式。

考虑下如果不采用星型结构,而是任意两台电脑要想通信则用网线将其网络端口直接相连,要实现N台电脑的相互连接需要N*(N-1)/2个连接,也就是说10台电脑要全部45条网线,每台计算需要9个网线接口,这明显是不现实的同时也是绝对不划算的。

而如果采用环型结构,虽然10台计算同样只需要9根网线,每台计算机也只需要一个网线接口,但是其中部分计算机之间的通信需要经过多次不必要的中转,且任意一台计算机故障、关机就会导致网络故障,任意两台故障、关机就会导致网络直接分裂为2个独立网络。

互联+隔离冲突域需求产生的网桥

随着以太网的流行,越来越多办公室开始接入它,网络通信的距离和计算机的数量都急剧增长,距离过长会导致信号衰减,这可以通过给集线器加入中继功能保证信号的可靠,但是每个办公室每台计算机发送的数据如果每个集线器都无脑转发,网络中会充斥大量无用数据。

比如办公室A内部两台计算机只是通过以太网互相传输一个内部文件,集线器却会最终将其广播到全球所有接入以太网的办公室,这明显是不可接受的。

于是网桥出现了,网桥看上去是只有两个端口的智能版集线器,首先其只会将两个端口收到的信息转发到彼此端口,但是在转发时网桥会开始关注数据链路层的MAC地址,其添加了MAC地址学习功能。当网桥收到端口0的数据时,其会检查数据目的MAC地址是否来自端口0连接的网络,如果是则过滤该数据不会转发到端口1,目的MAC明确属于端口1的网络或者没有对应MAC记录时才会转发数据到端口1,这样就可以避免一个办公室内网MAC之间通信的数据被无脑广播到全世界了。

网桥的连接模式图示(红色节点为集线器):

适用小型局域网的二层交换机

早期的二层交换机工作原理与网桥类似,其也是通过识别数据链路层的MAC地址实现源端口到目的端口的数据转发,早期的交换机不严格的说可以视为一个高度集成版的网桥,普通网桥只有两个端口能连接两台计算机,而交换机则有多个端口可以连接多台计算机,并且任意两个端口之间都可以实现数据的转发,N个端口的交换机可以简单视为提供了N*(N-1/)/2的彼此独立的网桥。

如下为交换机连接模式的图示:



早期的二层交换机,纯工作在数据链路层,因此无法隔离广播域--当交换机不知道数据目的MAC属于哪个端口时,会对所有其他端口广播对应数据造成广播风暴。要解决这个问题,也就出现了后面的三层交换机。

适用大型局域网的三层交换机

三层交换机在工作时会同时考虑数据链路层中的MAC地址与网络层中的IP地址,简单来说如果交换机中已经记录了数据的目的MAC对应端口,会直接走二层交换转发数据到对应端口,而如果没有目的MAC信息,不像二层交换机直接广播所有端口,而是通过识别网络层中的IP地址进行路由后选择指定端口转发数据,后面如果收到了目的MAC的回包,三层交换机会更新自己记录的MAC到端口映射表,在后面到目的MAC的数据包转发时就直接走二层的交换即可--即一次路由,多次转发。

三层交换机主要是用于大型局域网内切分多个小局域网的场景,因为对于一个大型局域网将其切分为多个小局域网能使一个大的广播域被分割成多个小的广播域,隔离了广播风暴,同时其一次路由多次转发的工作原理又能保证整个大型局域网内数据的高效交换。

连接局域网与广域网的路由器

路由器与三层交换机一样都会根据网络层中的目的IP地址按照路由策略转发数据,可以隔离所连接网络的广播域,单从这看上去和三层交换机好像没有区别,但是其实两者之间存在很多差异,根据查询资料及自我理解总结如下:

  1. 路由器选择转发端口时仅根据网络层IP路由策略,而三层交换机大部分时候都是走数据链路层转发,
  2. 路由器的IP路由策略比三层交换机复杂得多--可以处理复杂的路由路径和网络连接,具备选择最佳路由、负荷分担、链路备份以及与其他网络进行路由信息的交换等功能,而三层交换机的IP路由策略比较简单,甚至可以直接通过硬件实现
  3. 基于以上两点单就交换数据的性能上三层交换机的转发效率是高于路由器的
  4. 路由器可以连接很多不同类型的网络(如以太网、ATM网、FDDI网、令牌环网等),支持不同的连接介质(如以太网接口、令牌环接口、FDDI接口、E1/T1接口等),而交换机一般只支持以太网
  5. 综上,最最重要的,同样的转发效率下路由器比交换机贵得多_

转载请注明出处,原文地址:https://www.cnblogs.com/AcAc-t/p/hub_bridge_switch_router_summary.html

参考

https://segmentfault.com/a/1190000009491002

https://www.cnblogs.com/AcAc-t/p/hub_bridge_switch_router_summary.html

https://www.cnblogs.com/bakari/p/10529575.html

https://www.cnblogs.com/xiaolincoding/p/12638546.html

https://zhuanlan.zhihu.com/p/158219925

https://zhuanlan.zhihu.com/p/440970417

https://zhuanlan.zhihu.com/p/158219925

https://www.zhihu.com/question/67473683/answer/254496942

https://zhuanlan.zhihu.com/p/110427712

https://sites.google.com/site/emmoblin/linux-network-1/san-ceng-jiao-huan-ji-yu-lu-you-qi-de-qu-bie

https://m.hqew.com/tech/yqj_6414

https://www.51cto.com/article/708872.html

从Linux Bridge引发的网桥、交换机与路由器区别探究的更多相关文章

  1. TCP/IP协议原理与应用笔记16:交换机和路由器区别

    1.交换机和路由器区别 (1)交换机:     交换机是一种基于MAC(网卡的硬件地址)识别,能完成封装转发数据包功能的网络设备.交换机可以“学习”MAC地址,并把其存放在内部地址表中,通过在数据帧的 ...

  2. 4..部署场景2:带有遗留的Linux Bridge

    此场景描述了使用Linux bridge的ML2插件实现OpenStack网络服务的遗留(基本)实现. 遗留实现通过为常规(非特权)用户提供一种方法来管理一个项目中的虚拟网络,并包含以下组件:提供了自 ...

  3. 理解 neutron(15):Neutron linux-bridge-agent 创建 linux bridge 的简要过程

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  4. ebtables和iptables与linux bridge的交互

    本文为翻译文,不一定是逐字逐句的翻译,而且中间会加上自己的一点见解,如有理解错误的地方,还请大家指出,我定虚心学习.原文见链接 其中斜体字是自己的理解,建议和ebtables手册和iptables手册 ...

  5. 理解 neutron(15):Neutron Linux Bridge + VLAN/VXLAN 虚拟网络

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  6. linux下brctl配置网桥

    原文:http://zhumeng8337797.blog.163.com/blog/static/1007689142011643834429/ 先装好网卡,连上网线,这是废话,不用说了. 然后开始 ...

  7. Neutron 理解(14):Neutron ML2 + Linux bridge + VxLAN 组网

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  8. 一个关于Linux Bridge配置的吐嘈

    话说有些事情十分适合在放假前的一天折腾一天,但绝对不适合在你准备去吃饭前多看一眼...我上周就碰到了这么一件揪心的事,终于以低血糖收场.十分狼狈地四处觅食,却觅到了一包超级辣的鸡爪.吃完后感觉症状加重 ...

  9. Linux网卡设置为网桥模式

    Linux网卡设置为网桥模式 1.    添加网卡,并修改相关配置文件 1.1虚拟机添加网卡,并配置相关文件 如:eth2为新添加网卡 cd /etc/sysconfig/network-script ...

  10. 基于 Linux Bridge 的 Neutron 多平面网络实现原理

    目录 文章目录 目录 前言 前文列表 多平面网络 Local(本地网络) Flat(扁平网络) 配置 Flat 网络 VLAN 配置 VLAN 网络 VxLAN 配置 VxLAN 网络 GRE 前言 ...

随机推荐

  1. Java 中的接口还可以这样用,你知道吗?

    Java 程序员都知道要面向接口编程,那 Java 中的接口除了定义接口方法之外还能怎么用你知道吗?今天阿粉就来带大家看一下 Java 中的接口还可以有哪些用法. 基本特性 我们先看一下接口的基本特性 ...

  2. PyTorch复现VGG学习笔记

    PyTorch复现ResNet学习笔记 一篇简单的学习笔记,实现五类花分类,这里只介绍复现的一些细节 如果想了解更多有关网络的细节,请去看论文<VERY DEEP CONVOLUTIONAL N ...

  3. Lombok中@Builder和@SuperBuilder注解的用法

    @Builder 是 lombok 中的注解.可以使用builder()构造的Person.PersonBuilder对象进行链式调用,给所有属性依次赋值. Person person1 = Pers ...

  4. P1005 [NOIP2007 提高组] 矩阵取数游戏

    题目传送门 前言 今天依旧是不写高精的一天呢!(是的,这位作者又只拿了开 \(LL\) 的 \(\color{yellow}{60}\) 分) 思路描述 看到数据 \(n,m \le 80(30)\) ...

  5. 2023牛客寒假算法基础集训营1 ACDEFGHKLM

    比赛链接 A 题解 知识点:模拟. 显然. (用char输入到一半直接给答案跳出,WA了两小时,无话可说. 时间复杂度 \(O(1)\) 空间复杂度 \(O(1)\) 代码 #include < ...

  6. 刷题笔记——3002.买图书 & 2763.计算(a+b)/c的值

    题目1 3002.买图书 代码 while True: try: n,m=map(float,input().strip().split()) if(n==10 and m==1): print('{ ...

  7. SQLSERVER 事务日志的 LSN 到底是什么?

    一:背景 1. 讲故事 大家都知道数据库应用程序 它天生需要围绕着数据文件打转,诸如包含数据的 .mdf,事务日志的 .ldf,很多时候深入了解这两类文件的合成原理,差不多对数据库就能理解一半了,关于 ...

  8. 华为云发布冷启动加速解决方案:助力Serverless计算速度提升90%+

    摘要:本文介绍了华为云对冷启动优化这一业界难题的探索之路,创新提出了基于进程级快照的优化方案. 作者信息-- 子游:华为元戎高级工程师 平山:华为云中间件 Serverless 负责人 琪君:华为元戎 ...

  9. 【Redis场景3】缓存穿透、击穿问题

    场景问题及原因 缓存穿透: 原因:客户端请求的数据在缓存和数据库中不存在,这样缓存永远不会生效,请求全部打入数据库,造成数据库连接异常. 解决思路: 缓存空对象 对于不存在的数据也在Redis建立缓存 ...

  10. Array list练习

    Array list练习 数据添加到集合 生成6个1~33之间的随机整数,添加到集合,并遍历 public class Test01ArrayList { public static void mai ...