计算机网络: 链路层里的 Switch/Bridge

图解

首先我们来看看链路层+网络层的结构

Repeater

一般用于连接多个以太网络(如下图),还有一个功能就是放大信号的作用,包括错误信号和冲突的信号。

Bridge/Switch

Bridge 就是我们所说的网桥,是 Switch 的前身,这里就把他们看成是同一个东西啦。这个东西的主要作用是

  1. 用于连接多个不同类型的网络,如下图所示
  2. 用于传输链路层的数据,这里的数据传输主要依赖于 MAC 地址

Router

路由器一般在网络层操作。它的作用是连接不同的子网,并使用路由表和 IP 地址来传输数据。

从上面三个东西来看,就是连接网络一个比一个高级,这里不讨论以太网和路由器,主要说说 Switch,或者说 Bridge 的传数据机制。

Switch 特性

  • 是主要处理链路层的设备,有像前面说到的数据传输的功能
    • 它会检测发送方的 MAC 地址
    • 然后选择性地将数据送到不同端口
  • 对主机不可见
  • 开箱即用,有自主学习能力。你可以不需要配置路由表,Switch 自己会维护一张转发表(看起来很像路由器里的路由表)

设备之间的数据传输

当一个 Switch 连接了多台设备后,Switch 自己会维护一个 Buffer 用于缓冲 Packet。主机和 Switch 一般都是直连的,而且设备之间还可以实现双工,不会出现冲突。当然在 Incoming Link 时也会出现冲突,这里说不冲突是指双向传的时候不会。

Switch 的转发表

Switch 的转发表和路由表差不多,只是路由表的目的地是某个主机或者网络,转发表的目的地是 MAC 地址。具体包含有:

  1. 设备的 MAC 地址
  2. 每个设备的网关
  3. 时间戳

之前我上计网实验的时候就手动配置过静态路由表,一旦设备多了真的配到爆炸,Switch 转发表就很聪明了,它可以自主学习,然后更新这个转发表。

自主学习

其实什么自主学习也不是什么高大上的东西,作为连接多台设备的 Switch,每次收到数据时都会去看发送发是谁,然后记录在这个转发表里就完了。

相当于你来我邮局里送信,邮局对每个送信的人都查一次水表,记录在案。下次别人发给你的时候我就知道要要送去的地址了。

举个例子,下面是 Port 3 发Src=x, Dest=y 到 Switch,这时候 Switch 就知道 x 在 Port 3,完了。

到这,你可能会问那第一次的数据呢?或者说第一次我送信邮局也不知道往哪发呀,难道随便发么?哎,对还真是随便发。对于不知道地址的数据包,Switch 会全部人都发,也就是广播一次。如果目的地和发送方地址一样,那就不发这个数据。伪代码可以写成这样:

// 记录发送方的 MAC 地址
if (data received):
    forwardingTable.push(data.destination, data.source.MACAddr)

// 找接收方的 MAC 地址
found = forwardingTable.indexOf(data.destination)

// 如果找到了
if (found):
        // 如果目的地和发送方地址一样,就扔掉
    if (data.destination == data.source):
        drop(data)
        // 不一样则 Forward
    else:
        forward(data, interface)
// 找不到就广播,这里叫 flood
else:
    flood(data)

题目

再举个例子,假如现在要 C -> I,然后I -> C`,每个 Switch 的转发表会变成什么样呢?

结果如下:

注意,第一次的时候因为每个 Switch 都不知道 I 在哪,所以会一直广播这个信息,这时间 S2 会记录到 C 为 Port 1。但是第二次 I -> C 的时候,大家都知道 C 在哪,所以不会经过 S2。

循环问题

还记得刚刚说的广播机制么?在找不到目的地 MAC 地址会广播数据,好像真的解决了第一次发数据的问题了。但是如果 Switch 之间是环结构就麻烦了。

如果 K 发到 I,这就出现了上图的循环:

S5 -> S6 -> S1 -> S2 -> S5

虽然最终 S4 会将信息发到 I 手上,但是因为信息都是复制一遍再广播的,别人根本不知道是否接收方已经收到的,所以还会继续循环广播。

解决循环问题

下面的 Bridge 和 Switch 看作一样

我们可能会想到 Counter 计数大法,可以设定一个 Counter 值,每过一个Switch 就减一,减到 0 就扔掉这个数据包。但是 Counter 的最大值也很难找呀,所以网络程序员想了个更好的方法——生成树。

刚刚那个小例子就是一棵树,我们可以去掉 S5 - S6 这条边就可以破除这个环了,难道拔掉网线?No no no,Switch 之间是使用端口来连接的,我们只需要将这个端口设置成 Block 就相当于切断 S5 和 S6 的连接了。

相关术语

在开始说怎么造好这棵生成树之前先说说一些相关术语。

Switch:

  • Root Switch: 根 Switch,相当于树里的 Root 节点
  • Designated Switch: 不是 Root 就是别的了呗,这个 Switch 会通过最短路径到达 Root。如果 LAN 里有多个 Switch,那么选择 ID 最小那个。

端口类型:

  • Root Port,这个端口通过最短路径可以到达 Root
  • Designated Port,Switch 通过这些指定的端口来传输 packet
  • Blocked Port,数据不能通过,相当于切断连接

BPDU: Configuration Bridge Protocol Data Unit,这是一种数据包用于构造这棵树的。生成树不是说构造好了再投入运作的,而是靠每个 Switch 互相交换信息不断去更新这个棵树,最终构造出一棵最优的生成树。而这些用于交换的信息就是 BPDU。

BPDU 详细信息字段是这样的:

不过我们主要就看里面的 RootID,Cost,BridgeID,Port ID。

怎么造树

造树步骤

  1. 确定 Root Switch,一般为 ID 最小的
  2. 确定每个 Switch 上的 Root Port,这些 Root Port 可以通过最短路径到达 Root Switch
  3. 最后确定每个 Switch 上的 Designated Port,用于数据传输

是不是感觉很简单?要是人来做的话,给你一堆的 Switch 和主机,相信你很快做完,毕竟你是看到了全局,所以你能很快排好。

但是 Switch 是没有全局这个东西的,每个 Switch/Bridge 都是独立,要知道别人的信息只能通过发 BPDU。所以现在深入去看这三个步骤是怎么完成的。

如何确定 Root Switch

一开始每个 Switch 都会发信息到自己的 LAN,信息如下

每次接收和发送 BPDU 信息时,这个 Switch 就会去看自己的 ID 和 接收到的 BPDU 的 Switch ID/Bridge ID 哪个小,如果别人的 Switch ID/Bridge 小,那么别人就是 Root Switch,反之亦然。不断更新,直到算法确定 Root Switch。

如何计算 Cost

这棵树有个特点就是每个 Switch 到 Root Switch 的路径都要最短,所以 Cost 也是要计算的。

在确定了哪个 Root Switch 后,假如 Root Switch 叫 R,当前 Switch 叫 S。在接收到别人的 BPDU 后,会去计算最短路径。

如果 S == R,说明自己就是 Root,最短路径为 0。否则,去看接收到信息中最小的 cost,然后 + 1,代码如下:

if (S == R):
    cost = 0
else if (B ≠ S):
    cost = min(cost of BPDU) + 1

如何更新和共享BPDU

每个 Switch 都会发如下格式的信息:Root ID, Cost, Bridge ID, Port ID

  • 只有相邻节点发送一个不太优的 BPDU 时,当前才会发自己的这条 BPDU 给这个相邻的节点,告诉它我 BPDU 的可能会更好
  • 如果相邻节点发送了更优的 BPDU 时,当前节点会用这条信息更新自己的 BPDU,然后将更新后的 BPDU 广播给自己 non-root port,让别人也去更新

以上就是全部的造树过程。

不断更新生成树

虽然我们通过造树方式来解决循环问题,但是如果某个主机掉线了,那就要重新造一次树呀。网络工程师也想到这个问题了,所以 Root Switch 会每隔一段时间发送一个 Hello 信息,让 Switch 去更新一下这棵树。

举个例子,假如下面的树 S5 -> S2 走不通了,那么 Root 会发一个 Hello 信息到全部的节点,重新计算这个生成树。

如果某个节点在 3 次 Hello 信息都接收不到,那么就会重启自己的端口,然后假设自己是 Root 并发送 BPDU 来更新整个树,相当于再把自己加回去。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容

  • 第一章 网络工程基础 网络工程的含义 计算机网络:是指将有独立功能的多台计算机,通过通信设备线路连接起来,在网络软...
    Azur_wxj阅读 2,238评论 0 6
  • 为了提高网络可靠性,交换机网络中通常会使用冗余链路,冗余链路会给交换机带来环路风险,并导致广播风暴以及MAC地址表...
    酱紫冻阅读 20,609评论 2 18
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,789评论 2 89
  • 0×1.冗余链路中存在的问题这一部分使用下面这个拓扑图(图1)来讲解一下链路冗余容易造成的三个问题: 如图1所示S...
    Zero___阅读 1,401评论 0 2
  • 网络层提供的两种服务 在计算机网络领域,网络层应该向运输层提供怎样的服务(面向连接还是无连接)曾引起了长期的争论,...
    srtianxia阅读 3,717评论 0 12