Bootstrap

协议森林 | 6W字,120张图,20个实验让你吃透网络协议 !

了解 TCP/IP 的工作原理

如今,在工作中使用互联网已变得很普遍。但你真的知道当你的网络设备连接到互联网时会发生什么吗?

同样,现今社会几乎所有家庭都配备了大量的IT设备:ADSL盒、台式电脑、笔记本电脑、打印机等。但很少有人真正知道如何让所有这些机器相互通信!

通过本文,我们将了解如何创建我们所说的网络,知道信息在互联网上传播的流程和方式,也会明白当我们在浏览器地址栏中输入网站名称到收到答案之间发生的事情。这是在几毫秒内完成的,但中间经历了许多步骤…!

您还可以在家中创建自己的本地网络并对其进行正确管理。本文会让那些计划从事系统和网络领域职业的人更清楚地看到网络的本质;让那些喜欢编程的人更好地理解网络。

互联网的历史

我们已准备好深入学习互联网的工作原理了!但在这之前,先让我们了解互联网是如何走到今天这一步,这对后续我们理解网络各层的设计是有帮助的。

在 20 世纪 50 年代,通信是“点对点”的,如下图所示,这种通信方式有很大的局限性:

  • 可扩展性差:随着网络中节点数量的增加,管理每个节点之间的连接变得非常复杂。每个节点都需要维护与其他所有节点的直接连接,这会导致大量的网络开销和管理难度。
  • 可靠性差:在点对点网络中,如果一个节点出现故障或离线,可能会影响依赖该节点的通信路径。

因此,他们寻求一种新的通信方式,这种方式不再是集中式点对点通信模式,而是网状的,如下图所示。

这意味着所有信息都可以通过不同的机器节点,即使某些节点出现问题,也不会阻止信息的流通。在上图中您会看到,在网状通信网络中,如果某些通信节点不再正常工作,信息仍然可以通过不同的路径传递。

既然想法提出了,那就要落实啦!真正将这个想法落实源于20 世纪 60 年代研究人员为军队建立一个网络。

20世纪60年代末,互联网的鼻祖ARPANET只有四台机器!当时使用的协议无法实现既定目标-使来自不同网络的机器使用不同的通信技术进行通信。

就在那时,研究人员创建出了其他通信协议,特别是 TCP/IP。多年来,互联网持续发展,但直到1990 年,一场革命才使其真正发展起来:HTML 语言和 HTTP 协议的诞生使得创建和访问网页变得简单而方便,任何人都可以通过编写HTML来发布信息,任何用户都可以通过HTTP访问这些信息。这种信息共享和传播的模式推动了互联网的迅速发展。

随着第一个能够显示图像的浏览器的诞生以及域名使用的自由,一切都将加速。我们可以从下图中看到 1990-2000 年互联网的惊人发展。

今天的互联网

如今,互联网拥有几十亿互联网用户和数十亿台服务器。
在这些互联网用户中,我们可以看到世界各地网民的差异:

  • 42%的互联网用户来自亚洲!
  • 互联网化程度最高的国家是……韩国;
  • 94% 的美国人拥有互联网,而非洲人只有 15%;
  • 世界上三分之二的人可以上网;
  • 2000年至2010年间,互联网用户数量增加了4.5倍;
  • 2000 年至 2010 年间,非洲互联网增长了 2360%!

尽管这些数字令人惊讶,但我不会继续用数字轰炸你,相反,让我们看看下图,它代表了互联网机器之间的连接。拿起你的放大镜!

但是,我们不要忘记我们的主要目标:了解互联网的工作原理。所以别再做白日梦了,让我们开始正题吧!

现在我们已经了解了互联网的部分历史,是时候深入研究它的运作方式。

OSI 模型

互联网是一个巨大的蜘蛛网,目前有 上百 亿台网络设备连入了互联网。如何让这么多机器之间进行通信?如何避免通信过程中信息在这迷宫中迷失方向?在阅读完本文后,这些疑问都能得到解答。

如何沟通?

能够随时随地与世界上的任何人进行交流!这就是互联网为我们提供的服务。

先让我们快速盘点一下我们人类的通信方式:

  • 演讲 ;
  • 电话 ;
  • 邮件 ;
  • 信鸽 ;

现在让我们思考一下,在这些沟通方式中,我们需要准备些什么?

对于语音,我们需要:

  • 发射机;
  • 接收器;
  • 传输介质(空气)。

对于电话来说,情况有点相同,只是我们还需要一个转换设备,它是语音信号和电子信号之间的中介。在发送端,语音被转换成电信号,到达接收端,然后再次转换成单词。在这里,我们看到存在信息的封装。

然后我们将看到研究人员如何设法从人类通信原理转向计算机通信原理。他们将所有互联网连接的研究结果归为大家都必须遵守的标准。这就是OSI模型!OSI模型诞生于1984年。你可能已经注意到,它是在互联网诞生之后诞生的!

好了,铺垫了这么多,那么OSI 模型到底是什么?简单来说,OSI 模型是一个规范计算机如何相互通信的标准。

所以,如果你想让你的计算机与你们公司的计算机进行通信,你就必须遵循 OSI 模型,或者至少尽可能地从中汲取灵感。尤其是分层的思想。

OSI 模型是一个分层模型。这意味着它被分为几个称为层的部分,如下图所示:

在这里我们看到 OSI 模型有七层。每层都有不同的名字。OSI 模型的每一层都将发挥自己的作用,它们结合在一起相互协作完成数据从一台计算机到另一台计算机的通信。

对于OSI模型,还有两点需要清楚:

  • 每层都是独立的:任何一层使用的信息不能被另一层使用,例如,作为第3层地址的IP地址不能被其他层使用,否则将不尊重OSI模型。这样做的好处是可扩展性更好了:想象一下,如果如果将第三层的 IPv4 协议改为IPv6 协议,如果有其它层也使用了IP地址,那么其它层也必须做出修改。
  • 每层只能与相邻层通信:例如在发送信息时,从第 7 层开始,规则告诉我们一层只能与相邻层通信。因此,第 7 层只能与其正下方的第 6 层进行通信,然后是第6层与第5层进行通信,依次遍历OSI模型的所有层。

下面让我们更详细地探讨这些层,我们主要只关注1-4层,为什么忽略第5层和第6层了?这是因为OSI模型是一个理论模型,今天 Internet 所基于的模型是 TCP/IP 模型,而TCP/IP模型不使用第 5 层和第 6 层。至于第7层,它代表我们将要实现通信的应用程序。因此,我们要研究的不是这一层本身,而是为其提供服务并传递信息的各层,即第 1 层到第 4 层。

第 1 层:物理层

首先是第 1 层。来吧,做一点体力工作,让我们攻克第 1 层!

正如我们在 OSI 模型中看到的那样,在整个通信过程中,每一层都负责一部分功能,那这个第一层能用来做什么呢?第一层的主要作用是提供通信的传输介质。

第一层物理层的作用是传输电信号,就是在物理介质上传输二进制信号 0 和 1。此外,这里为什么是 0 和 1,而不是 5 或 564?这是因为二进制信号在传输过程中更容易实现和维护,抗干扰能力更强。

那么有哪些物理介质可用于二进制信号 0 和 1?

传输信号的物理介质

电缆

从历史上看,我们使用的电缆现在已经过时,但有时您仍然可以在以前网络中遇到,下图是同轴电缆的样子。

正是因为它已经过时了,因此这里不介绍它的原理了,知道它究竟长了个什么样子,下次见到它能认出就可以了。

双绞线

双绞线电缆由八根电线组成,两两成对地绞合,如下图所示:

但为什么要用8根线呢?原则上,只需要两根电线来传递电位差,然而,我们不知道未来会发生什么,也许明天我们会想在同一条电缆上传递几条信息了。如今,在大多数网络中,我们使用 2 对(4 根)电线,因为我们使用一对来发送数据,一对来接收数据。所以我们现在使用了 8 根电线中的 4 根。

因此,双绞线电缆虽然由 8 根线组成,尽管两根线就足够了,现今也只用到了4根,但多余的几根线是为了以后扩展,从两根到4根的使用不正好验证了这点吗?

此外,我们为什么要扭曲这些电线?因为这样可以更好地保护电信号。事实上,通过以这种方式绞合电线,电缆可以减少电磁干扰(不要问我为什么!电测学太难了我也不懂)。

双绞线有类似同轴电缆10B2这样复杂的名字吗?答案是有的,你可以看到双绞线体10BT、100BT 或 1000BT这样的命名,这取决于所使用的速度(10 Mbps、100 Mbps、1000 Mbps),其中 T 表示“twisted”(扭曲),我们有时会在其后面添加一个 x,表示网络设备能够自动选择最适合的传输速率…但们会在第 2 层中看到这一点。

举个例子,如果我告诉你网络是 100BTx,你就知道我使用双绞线,速度是 100 Mbps,并且连接在该网络的网络设备能够自动选择最适合的传输速率。

同轴电缆目前几乎不再使用,但是双绞线呢?嗯,我们在任何地方都能使用到双绞线,90% 的情况下!

另外,如何将机器与它连接起来?它们使用 RJ45 插座连接。下图是一个RJ45插座。我们可以看到 8 个小铜连接器连接到 8 根电线。

前面我们说了,我们只使用了双绞线8根电线中的的4根,可以任选4根电线吗?不 !必须使用特定的电线,即电线1、2、3和6。下图是电缆的连接和所使用的电线(有颜色)。

光纤

有了光纤,我们不再用电而是用光来传输 0 和 1 !相比于传统的铜线,光纤具有更高的传输速度和更长的传输距离,已经广泛应用于现代通信网络中。

光纤有2种类型:

  • 单模光纤:单模光纤具有较细的纤芯,传输单一光模式,适合长距离和高带宽的传输。
  • 多模光纤纤:多模光纤纤芯较粗,传输多种光模式,适合短距离和中等带宽的传输,如局域网和校园网。

网络拓扑结构

在网络中,拓扑结构是指机器之间的连接方式,主要有三种拓扑结构:

  1. 总线型拓扑
  2. 环型拓扑
  3. 星型拓扑

下面的图示展示了这些拓扑结构,其中圆圈代表机器,线条代表布线。

总线型拓扑

在总线型拓扑中,所有机器都连接在同一根电缆上。这种连接方式通常使用的是同轴电缆 10B2 或 10B5。

在总线上,由于只有一根电缆,一次只能有一台机器传递数据。因此每台机器都会监听总线是否有其它机器在传递数据,如果没有,自身就可以开始传递数据!

是否可以在总线上连接无限数量的机器?不可以!因为我们只有一根电缆供所有机器使用。一次只能有一台机器传递数据。因此,机器越多,我们通信的机会就越少。这就像你和其他人在一个房间里,人数越多,你得到说话和发言的机会就越少。

通常认为,当机器数量超过 50 台时,同时通信的概率比单独通信的概率更高,因此网络将无法正常工作…

环型拓扑

在环型拓扑中,所有机器都连接到同一根电缆上,但这根电缆自身环绕成一个圆圈。这种拓扑结构的网络很少。

环上的通信方式有所不同。环上有一个“令牌”不断循环,机器拿到令牌就可以发送数据。这有点像你和朋友围坐成一圈,唯一的通信方式是传递一个篮子。要说话时,你需要拿到篮子并将消息放入其中。然后你将篮子传给邻座,他会查看消息的地址。如果是他,他会读取消息,否则他会将篮子传给下一位,以此类推。

是否可以在环上连接无限数量的机器?不可以!因为和总线一样,所有机器共享一个令牌,扩展机器数量存在和总线拓扑一样的问题。

星型拓扑

在星型拓扑中,所有机器都连接到一台中央机器上,这台中央机器能够将信息发送到特定的机器。

在星型拓扑中,所有通信都通过中央节点。我们将信息发送给中央节点,附上接收者的名字,然后中央节点将信息传送到目标机器。这有点像快递驿站(不过速度更快……)。

是否可以在星型拓扑中连接无限数量的机器?可以……也不可以!实际上,这取决于中央节点的处理能力。中央节点是限制因素。如今,交换机可以处理数千台机器。

使用哪种拓扑?

这似乎不难选择,只有星形拓扑允许您方便的扩展网络规模和机器数量。而且总线或环型拓扑的网络如今正在消失。

CSMA/CD

在介绍第二层之前,我们还需要了解一下 CSMA/CD!

CSMA/CD 是 Carrier Sense Multiple Access/Collision Detection 的缩写。为了理解这个缩写,我们需要回到总线型拓扑网络上,并了解如何在总线上通信。

在总线型拓扑中,只有一根电缆,因此一次只能有一台机器在电缆上传递数据。如果两台机器同时传递数据,就会发生冲突。

那么,如何避免冲突?我们无法完全避免冲突,但可以尝试减少冲突的次数。这就是 CSMA/CD 的作用。它的目标是通过组织协调减少冲突的次数。具体做法是制定一条规则,尽量减少冲突。

具体怎么做呢?连接在总线上的每台机器都会监听总线,以确定总线是否空闲以及是否有其他机器在传递数据进行通信,只有当总线空闲时自己才能传递数据。

举个例子,两台机器 A 和 B 同时传递数据,它们检测到冲突,它们都等待一个随机时间。A 等待 2 秒,B 等待 3 秒。2 秒后,A 开始传递数据。3 秒后,B 看到 A 在传递数据,并等待。一旦 A 完成数据传递,B 可以开始传递数据了。最终机器A和B都成功传递数据了!

总结一下 CSMA/CD:

  1. 每台机器会一直监听总线,看看是否有其它机器在通信或是否有冲突。
  2. 只有当总线空闲时才能通信。
  3. 如果发生了冲突(因为有其它机器在同时发送信息),必须停止通信。
  4. 等待一个随机时间。
  5. 再次尝试通信。

虽然我们不能完全消除总线上的冲突(这不可能),但我们找到了一种方法来减少冲突,并成功地共享总线进行通信。

第一层物理层的介绍已经完了,相信您已经对第 1 层有了一个很好的了解,现在准备好进入第 2 层的学习了。

第 2 层:数据链路层

经过上面的介绍,第 1 层物理层不再对您有任何秘密,您掌握了第一层物理层涉及到的相关硬件并知道如何连接网络。

是时候踏出第二层学习的脚步了。

您将看到,在本层和下一层的探讨中,将介绍许多对您在网络方面有用的概念。掌握好这些概念非常重要,所以不要忽视它们。

第2层的角色

第 2 层称为链路层,或更准确地说,称为数据链路。然而,重点不在于名字,而在于它在网络通信中所扮演的角色。

这一层的作用是连接局域网上的计算机。更准确地说,其目标是使连接在一起的计算机能够进行通信。因此,后续我们将了解必须执行哪些操作才能在两台或多台机器之间建立通信。

第 2 层还有另一个重要作用,那就是传输错误的检测。这里说的是检测,而不是校正,因为第 2 层会看到错误,但是会对它们视而不见。

第2层标志:MAC 地址

想象两个人聊天时,一个人说,另一个听(至少大多数时候…),这种场景很简单,没有必要说的每句话都带上对方的名字。

一旦参与聊天的人数增加,事情就会变得复杂,因为我们可能希望将信息传递给特定的人,这时话语中就需要带上对方的名字了,要不然对方根本不知道你是在和他聊天。

在网络中也是一样,有时您的机器想与特定的某台机器通信。为了能够与特定机器对话,您的机器必须能够识别它。因此,研究人员在第 2 层创建了一个特定的标识符,可以让机器彼此区分,这就是MAC 地址!,类似于聊天场景的名字。

那么一台机器只有一个MAC地址吗?不是的。MAC 地址实际上就是是网卡(NIC)的地址。一台机器可能有多个网卡,因此可能有多个MAC地址。

MAC地址表示

在介绍MAC地址是如何表示的之前,让我们先来看一看二进制相关的运算。

注意,准备好你的大脑,我们需要进行一些二进制计算。在网络中,我们会做很多很多这样的计算,所以现在开始吧!

什么是二进制?二进制是一种以2为基数的计数系统。这意味着我们只能使用 1 和 0 进行计数,不像我们习惯使用的十进制系统使用的是0到9的数字。

如果我从0开始以二进制计数,其结果如下:

0
1
10
11
100
101
110
111
1000

这相当于十进制:

0
1
2
3
4
5
6
7
8

但为什么用二进制呢?因为在前面我们看到电信号以0V或5V的形式传递,这对应于两种不同的状态:0或1。

那么如何用二进制计算?有几种方法,我将介绍一种相对容易使用的方法。

你习惯于十进制工作。那么你需要知道的是,所有十进制数都可以写成二进制形式。

更确切地说,所有十进制数都可以写成2的幂的和,让我们以数字45为例。它可以写成:

45 = 32 + 8 + 4 + 1
= (1 * 2^5) + (0 * 2^4) + (1 * 2^3) + (1 * 2^2) + (0 * 2^1) + (1 * 2^0)

因此我们可以将 45 写成二进制:101101。

太好了,现在知道如何将十进制转换为二进制了,但这暂时 MAC 地址的理解没有帮助…

因为MAC地址是用十六进制书写的…但是一旦理解了二进制,十六进制就不是很复杂了。与我们只有 0 和 1 作为可用数字的二进制不同,在十六进制中我们有 16个数字可用。

我只知道数字 0 到 9,但是还有其他数字吗?是的,事实上我们可以使用字母表的第一个字母表示9 之后10,依次类推,在十六进制中我们有:

0、1、2、3、4、5、6、7、8、9...a、b、c、d、e 和 f

换句话说,十六进制基于16个符号:0到9,以及A到F,分别代表10到15。

如何用十六进制表示十进制的45?让我们回顾一下前面的例子,前面已经计算出45的二进制形式是101101,可以将其从低位开始(右边),每4位一组,最高的一组如果不满4位补0。得到:10110101
低4位0101对应十进制的5,也就是16进制的5;高4位1011对应十进制的11,也就是16进制的b,因此45的十六进制表示是B5。

MAC地址编码

前面做了那么多铺垫,现在正式进入MAC地址的介绍了。

MAC地址用于唯一标识网络接口卡(NIC),每个网络接口(如网卡)都有一个唯一的 MAC 地址,在世界上是唯一的。

MAC 地址是一个48位的标识符,通常用六个十六进制对表示,中间用冒号或破折号分隔。例如:00:23:5e:bf:45:6a。

MAC 地址的前 24 位(3 字节)标识设备的制造厂商,后 24 位(3 字节)是由设备制造商分配的唯一标识。因此,当网卡制造商想要生产网卡时,他需要购买三个字节,这些字节将允许他们为其生产的网卡分配地址。例如,A网卡厂商购买三个字节的序列:00:01:02。那么其生产的所有网卡都将以这三个字节开头,例如:00:01:02:00:00:01;然后:00:01:02:00:00:02 ;

特殊的MAC地址

在MAC地址中,有一个特殊的地址,它是所有位都为1的地址,即ff:ff:ff:ff:ff:ff,这个地址称为广播地址,当一个设备发送数据包到广播地址时,这个数据包会被网络中的所有设备接收,从而实现了广播通信。

第3层协议:以太网

网络通信的目标是两台计算机之间能够交换信息,而这些机器本身安装的操作系统(Windows、Mac OS、Linux 等)可能不同,因此我们必须提供一种通用的通信语言来相互理解。这是协议。

站在第一层物理层的角度,我们看到 0 和 1 将在我们的电缆上或光纤上传输。所以我们会收到这样的信息:001101011110001100100011111000010111000110001…但这没有多大意义,谁知道它代表什么了……因此我们需要就它们的含义在发送端和接收端达成一致。因此,协议将定义将发送哪些信息,按什么顺序组织。

第二层的协议我们只介绍以太网协议,以太网协议不是唯一的第2层协议,但它是目前使用最多的,其数据格式如下:

其中以太网帧头部总共有18 个字节。

下面主要介绍太网帧结构头部中的类型CRC这2 部分。

类型

前面已经提到过,发送信息时,数据会从上到下逐层进行处理,因此,数据在进入发送方第 2 层之前先经历了第 3 层。这个类型字段就是用来说明第三层的协议是什么。

什么是CRC?

CRC(循环冗余校验,Cyclic Redundancy Check)是一种用于检测数据传输或存储错误的校验方法。

假设机器 A 向机器 B 发送一条消息。

  1. 发送时,A 计算 CRC(一个 X 值)并将其放在帧的末尾。
  2. B 接收消息并使用接收到的帧(Y 值)进行与 A 相同的计算。
  3. B 将她计算的值 (Y) 与 A 计算并放在帧末尾的值 (X) 进行比较。

如果它们相等,说明数据在传输过程中没有发生错误;如果不相等,说明传输过程中出现错误。

现在我们已经了解了有关以太网帧的一切!让我们通过观察两台机器 A 和 B 之间的数据交换来回顾总结一下。

  • 机器 A 上的应用程序想要将数据发送到机器 B 上的另一个应用程序。
  • 消息从上到下穿过 OSI 模型的各层。
  • 第 3 层告诉第 2 层使用了哪种协议。
  • 然后,第 2 层可以形成帧并通过网络发送。
  • 机器 B 接收该帧并查看目标 MAC 地址。
  • 机器B发现以太网帧的目标MAC地址确实是自己的MAC地址 !因此,机器B接收该数据,数据沿着 OSI 模型的各层向上传输并到达机器 B 上的应用程序。

现在我们已经迈出了重要的一步,我们知道如何在本地网络上的机器之间进行通信!

但是我们还没有看到如何将多台机器连接在一起,而这需要使用一些特殊的硬件来完成…

第2层硬件

交换机是一种二层设备,可让我们将多台机器连接在一起。英文也称为switch 。

有时您会听到人们用英语谈论“pont”或“bridge”。bridge网桥只不过是一个只有两个端口的交换机。因此,如果您了解交换机,您就了解了网桥!

交换机是一个盒子,上面有多个 RJ45 母插座,允许使用双绞线电缆连接机器。

我们可以将我们的计算机连接到交换机,甚至将其他交换机连接到我们的交换机(下图)。

如果多个设备都连接到交换机上,交换机如何知道将一个数据帧该发送给谁?

CAM 表

为了将帧发送到正确的机器,交换机使用数据帧中的目的 MAC 地址。

交换机中会包含一个表,该表将交换机的端口(母头 RJ45 插座)与MAC 地址进行关联。该表称为CAM 表。

我们举个例子,下图中。

交换机上的 CAM 表可能如下:

当机器 23 想要向机器 25 发送数据帧时,交换机将读取目的MAC地址,通过查询CAM 表就知道将该帧发送到哪个端口,因此,交换机会将数据帧发送到端口 3,然后由端口3 到达连接到该端口的机器 25。

因此交换机通过 CAM 表和数据帧的目的MAC地址就知道如何将帧定向到正确的机器。

这个CAM表是如何生成的?如果我在交换机上连接上新机器,交换机如何知道?这涉及到如何更新CAM 表。

以前面的例子为例,假设交换机的 CAM 表刚开始是空的,并且我们刚刚连接了三台机器到交换机上(见下图)。

现在假设机器 23 向机器 25 发送一个数据帧,此过程如下:

  • 帧到达交换机。
  • 交换机读取数据帧中的源 MAC 地址并查看机器 23 的 MAC 地址。
  • 由于该帧来自端口 1,因此它在其 CAM 表中将端口 1 与机器 23 的 MAC 地址相关联。

这个过程交换机更新了他的 CAM 表,新增了一条记录:端口1->机器23的记录,如下所示:

但是,目标 MAC 地址不存在于其 CAM 表中,因此它不知道将数据帧发送到哪里。为了确保目标计算机能够收到该数据帧,交换机只需将数据帧发送给连接到它上面的每台计算机,

但请注意:尽管这里数据帧被发送给每台计算机,但这不是广播,因为帧中的目标MAC地址是机器 25 的 MAC 地址,而不是ff:ff:ff:ff:ff:ff。

最后,只有机器25 收到数据帧后,解析出该数据帧的目的MAC地址确实是发送给自己的,因此能够响应回机器23,其余计算机收到后直接丢弃了。在机器25回响应给机器23的过程中,大致经历了以下几步:

  • 数据帧到达交换机。
  • 交换机读取数据帧的源 MAC 地址(就是机器 25 的 MAC 地址)。
  • 由于该帧来自端口 3,因此它在其 CAM 表中将端口 3 与机器 25 的 MAC 地址相关联。

这个过程交换机也更新了CAM 表,新增了一条记录:端口3->机器25的记录。

好的,我们现在已经了解了交换机是如何工作的,但是如按照前面的理解,CAM 表将永远不会停止增长,因为我们可能会不断新增机器连接到交换机上?而CAM表的大小由于受到交换机存储的限制肯定有个上限的,那怎么解决 这个问题?

CAM表的TTL

在计算机世界中,我们会非常非常频繁地谈论 TTL,例如缓存的TTL。

TTL在英文中是Time To Live的意思。因此它代表一个持续时间,意思是数据在一定时间内有效,超过这个时间就不再有效。

这有点像酸奶的保质期:只要没有过保质期,酸奶就可以食用。

对于CAM表中的信息来说,也存在TTL的概念。我们会认为这些记录在一定时间内有效,但是一旦过了这个时间,我们就会从 CAM 表中删除该记录。因此,CAM表将定期更新,并且最旧的记录将被删除。

我们看之前的 CAM 表:

我们将在表中添加一列 TTL :

我们看到交换机有两条记录,第二条记录保存的时间会更久,因为它的 TTL 较大。

在91s内,如果23号机器没有和其它机器进行通信(25号机器也没有和其它机器进行通信),CAM表将变成如下这样:

现在,如果机器 25 发送一个数据帧,则 TTL 将被更新,因为交换机知道“机器 25 连接到端口 3”的信息是最近的信息:

这样,交换机的CAM表在每接收到一帧后就会被填充或更新,而当长时间没有接收到帧时它会被清空。

补充问题

交换机有MAC地址吗?答案是否定的。因为没有机器需要与交换机进行通信,因此交换机不需要 MAC 地址。

CAM表实例

下图是我学校交换机的CAM表…很漂亮,不是吗?

我们可以注意到一件有趣的事情:至少有 6 台机器连接到这台交换机的端口 19!

这种现象是可能发生的,实际上,虽然不能在一个端口上连接多台机器,但可以在一个交换机的端口上连接另一个交换机。因此,连接到这个交换机上的所有机器的MAC地址都会出现在第一个交换机的端口上。

因此,我们可以猜测,上图中有另一个交换机连接在我们观察的交换机的19号端口上。

小技巧(破坏性的…)

现在知道了交换机的工作原理,如果我们愿意的话,如果有人想恶作剧搞破坏,可以做什么来干扰它正常工作?做这件事有很多种方法。

方法1:向不存在的MAC地址发送大量数据帧

如果我们向不存在的MAC地址发送大量数据帧,会发生什么?

交换机不知道应该将这些帧发送到哪个端口,它会将这些帧发送到所有的活动端口上……这样很快就会导致交换机饱和!

方法2:通过填满CAM表进行饱和

如果我们每次发送数据帧时都使用不同的源MAC地址,会发生什么?

交换机的CAM表会逐渐被填满。表格越满,交换机读取表格所需的时间越长,从而导致显著的延迟……直到交换机崩溃。当表格被完全填满并且交换机没有时间读取CAM表时,它会直接将数据帧发送到所有端口。这使得攻击者可以看到交换机上的所有流量……

然而,我们稍后会看到一些更强大的方法来监视交换机上的流量。

交换机带来的革命(全双工模式)

你还记得前面介绍的CSMA/CD吗,CSMA/CD允许我们在总线网络中避免碰撞问题。

但是在交换机上还会有碰撞吗?

让我们仔细看看可能的情况(见下图)。

假设机器23和25同时相互通信:会发生碰撞吗?可以认为,由于消息同时发送,它们会重叠。但在双绞线中,我们使用不同的线进行发送和接收,因此消息会在不同的线中交叉!

更真实的交换机图如下图所示。

我们可以在这里清楚地看到不同的接收和发送对。因此,在这种情况下不存在碰撞。

让我们观察另一种情况:在上图中,假设机器 23 和 25 同时与机器 24 通信。在这种情况下,这两个消息会同时到达机器24的接收线,是否会发生碰撞?

这个情况已经被预见到并且交换机已经为此做了设计。

实际上,交换机有一个内存,可以在接收到数据帧时存储一个或多个数据帧。它只有在目标机器的发送线空闲时才会发送这些数据帧。因此,当它有两个帧要发送到同一发送线时,它会先发送第一个,然后发送第二个。因此,不会发生碰撞。

如果没有碰撞,就不需要CSMA/CD了吗?是的!不再需要CSMA/CD!以前,机器在发送数据帧之前需要监听总线以确认总线是否空闲,现在,机器只要想发送数据帧就可以发送,不必担心会发生碰撞,因为交换机保证它们不会发生碰撞!

这种不再使用CSMA/CD的方法被称为全双工模式。相反,当在集线器或同轴电缆上使用CSMA/CD时,网络接口卡工作在半双工模式。

交换机革命了网络,特别是引入了全双工模式。但请注意,全双工模式既可以提高性能,也可能会带来破坏。

全双工很棒!但它需要被正确使用,而这并不总是容易做到。如果使用不当有时它会带来灾难性的后果……

假设我们在集线器上连接了10台机器。我们处于集线器中,因此是总线拓扑,机器需要处于半双工模式并使用CSMA/CD。

如果其中一台机器的网络接口卡配置为全双工,会发生什么?

这将非常、非常麻烦。其他九台机器在讲话前需要等待总线空闲,如果有自身之外的机器同时在传输数据,它们会认为发生了碰撞,等待总线空闲。

而全双工模式的这台机器则无视这些,它想什么时候讲话就什么时候讲话,不检测任何发生的碰撞。简直是灾难!更糟的是,如果这台机器正在下载一个大文件,它会持续传输数据,阻止其他所有机器的通信。我们的九台机器的网络将变得无法使用!

因此,任何连接到集线器的机器必须自动将其网络接口卡配置为半双工模式。

不过我从来没有配置过我的网络接口卡?你很幸运!或者说我们很幸运,网络接口卡非常智能,能够自行确定需要使用的双工模式。因此,当网络接口卡连接时,它能够确定自己应该工作在全双工模式还是半双工模式。连接到集线器时,它会设置为半双工;连接到交换机时,它会设置为全双工。

了解VLAN

除了交换功能(即将数据帧引导到某个端口)外,随着时间的推移,交换机还增加了新的功能来改善网络的运行。其中一个非常普遍且有趣的功能就是VLAN。

VLAN是虚拟局域网(Virtual LAN)的缩写。了解局域网(LAN)是一个本地网络(Local Area Network),VLAN就是一个虚拟的本地网络。这对我们理解它是什么没有太大帮助……但实际情况要简单得多。

VLAN是将交换机的端口划分到不同网络中的能力。这相当于将交换机的某些端口分隔开。它们将不再能够相互通信,完全不能。

让我们看一个例子,如下图所示。

我们有一个10端口的交换机,上面连接了6台机器,我们希望分成两组:前3台机器之间可以相互通信,后三台机器之间也可以相互通信,但是组与组之间的机器不能互相通信,比如第1台机器和第5台机器就不能通信。VLAN可以帮助我们做到这一点!

VLAN的思想就是把我们的交换机切成几块,就好像我们有几台交换机一样。在我们的例子中,我们将创建两个VLAN。一个VLAN用于左边的三台机器,另一个VLAN用于右边的三台机器。

下图显示了这一效果。

在上图我们看到这里用绿色和红色表示的两个VLAN。连接到属于绿色VLAN端口的机器只能与同样连接到绿色VLAN的其它机器通信;红色VLAN也是如此。而连接到绿色VLAN的机器无法与连接到红色VLAN的机器通信。这就像我们将交换机分成了两个小交换机,每个都有自己的CAM表,如下图所示。

那么VLAN存在的意义是什么?

在我们选择的例子中,意义并不明显,但假设我们要管理一所学校的网络,这个学校有一个行政部门、100名教师和1000名学生。我们有多个256端口的大交换机分布在学校里。

能够对这些交换机进行分段以将三个群体的网络进行隔离是有意义的,这样学生就无法访问行政网络或教师网络(修改成绩),而教师也无法访问行政网络(例如更改他们的工资单)。这样就不用购买25个48端口的小交换机,而是购买5个256端口的大交换机就可以了,这在成本和管理上更加高效

现在,实践吧!

计算机学科是一门实践性很强的学科,而网络方面的学习更强调这一点,现在,我们将尝试将前面所学到的知识付诸实践:会有练习和小型实践练习。练习的目的是了解网络概念是如何实际实现的。这将使您巩固和加深理解前面所学的知识,所以不要忽视这个实用的部分!

在Windows下

我不太了解最新情况,出于性能原因,我选择在 Windows XP SP2 下进行演示。不过,无论您使用的是哪种Windows系统,这里需要做的事情都其实是一样的:如何获取机器的网卡信息?

在Windows中,大多数时候提供了两种操作方式:使用图形界面或命令行。一般而言,这两种方法中只要一种就可以达到我们想要的效果。

这里我们选择使用命令行的方式获取网卡信息,首先打开命令提示符-点击开始,运行,输入cmd,然后点击确定。一个黑色的窗口出现,类似于你在下图中看到的这样:

获取有关网卡信息的基本命令是ipconfig。但是,为了获得我们想要的信息,我们可能需要配合命令提供的选项一起使用,如下图所示,这里使用ipconfig /all:

命令执行后,在屏幕输出中,我们看到很多信息,但我们感兴趣的是我们的网卡地址,即MAC地址。我们看到它的值为00-0C-29-E6-4B-D2。太好了,我们找到了 MAC 地址!我们还看到了很多其他信息,但我们暂时对此不感兴趣。

现在让我们看看如何在 Linux 中获取这些信息。

在Linux下

Linux尽管也支持图形化界面的操作,但很少有人这么做,所以这里还是使用命令行的方式获取网卡信息。

Linux 中获取网卡信息的命令与 Windows 中的命令几乎相同,除了一个字母之外。其命令ifconfig:

homer:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:08:02:3f:ee:bb  
          inet addr:10.8.98.235  Bcast:10.8.111.255  Mask:255.255.240.0
          inet6 addr: fe80::208:2ff:fe3f:eebb/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:12845408 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11301576 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:2224032469 (2.0 GiB)  TX bytes:3324151145 (3.0 GiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:4872863 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4872863 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2719670180 (2.5 GiB)  TX bytes:2719670180 (2.5 GiB)

这里我们看到 HWaddr 后面的数字00:08:02:3f:ee:bb就是 MAC 地址。这个数字与 Windows 中的不一样,但这很正常,因为它们不是同一台机器,网卡不一样,MAC地址肯定就不一样。

在这里,如果我们的网卡支持的话,我们可以修改我们的MAC地址。

homer:/# ifconfig eth0 hw ether 00:01:02:03:04:05
homer:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:01:02:03:04:05  
          inet addr:10.8.98.235  Bcast:10.8.111.255  Mask:255.255.240.0
          inet6 addr: fe80::208:2ff:fe3f:eebb/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:12848026 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11303193 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:2224386740 (2.0 GiB)  TX bytes:3324387978 (3.0 GiB)

如果您对ifconfig命令感兴趣,您可以使用man ifconfig查看更多的帮助文档。

好了,我们很快就看到了第 2 层是如何在我们的机器上实现的。在此之前我们还要做一些练习!

实验 1:交换环路

就这样,您已经完成了系统和网络管理员培训,并且刚刚被一家小公司雇用。

这个公司所使用的网络拓扑图(见下图)。

可以看到,有三个交换机,三个交换机相互连接,每个交换机上连接了了几台机器。

问题:上周,中间的交换机5出现故障,导致交换机1和9上的计算机无法互相通信!

因此,主管要求您找到一种解决方案,以便即使其中一台交换机发生故障,网络也可以继续运行。

你立即想到应该将交换机1和9连接起来,这样即使任何一台交换机故障,另外两台仍然相连……

但糟糕的是,连接交换机后不到一个小时,网络崩溃了,没有人可以访问互联网,我们甚至无法再与本地网络上的其它机器进行通信。

这到底是怎么回事 ?您刚刚创建了所谓的交换环路,这非常严重!因为它提供了两条可能的路径来到达目的地。

当发送一个数据帧到一台机器时,交换机将沿着这两条路径转发帧,导致数据帧到达目的地两次。这没有什么大不了的!

然而,在广播的情况下,这变得非常麻烦!

事实上,在广播的情况下,我们的数据帧会在两条路径上传播,然后在到达下一个交换机时,继续通过两条可能的路径重新发送,依此类推,直到交换机们同时处理了太多广播而完全饱和。

这种现象被称为广播风暴(或者英文的 broadcasts storm),它的破坏了惊人,甚至可以摧毁最大的网络。我曾见过一个拥有15000台计算机的网络因为这种问题崩溃了好几天。切记永远不要在交换机上或交换机之间创建环路!

好吧,那么如何解决最初的问题呢?目前我们的知识水平还没有解决方案… 至少目前没有。对于那些想进一步寻找答案的朋友,您可以在网上了解生成树、快速生成树和802.1d技术。

实验 2:网络模拟器

有些网络教师非常出色,A教师就是其中之一。这位教师写了一款网络模拟软件,以便更好地教学生们了解网络的工作原理。

假设我们已经将网络模拟软件安装完毕,现在舒适地坐在网络模拟器前。

第一步:使用集线器

首先,你将尝试配置一个由三个集线器连接的网络,不使用集线器最右边的端口!在每个集线器上添加一台机器,配置完成后,你应该得到一个如下的网络拓扑:

现在尝试将两个未直接连接的集线器连接起来,然后尝试发送广播帧(右键单击网卡,发送帧,OK)。

你会看到一个错误消息,指出存在一个环路!前面已经介绍过了。

现在移除一根电缆,再次尝试发送广播数据帧,然后向另一台机器发送单播数据帧。你观察到的两种情况有何不同?其实两者是没有区别的!实际上,我们在使用集线器时,数据帧无论如何都会像广播一样发送给所有人。

第二步:使用 交换机

我们要切换到交换机了!用一台交换机和三台机器组成一个网络,如下图所示。

右键点击交换机并清空MAC/端口表。现在机器1上在向另外两台机器之一发送一个单播帧。s思考下将会发生什么?交换机会向所有机器发送数据帧,因为它的CAM表中还没有任何信息。

如果我们再次从机器1发送相同的数据包,会发生什么?还是一样交换机会向所有机器发送数据帧, !尽管交换机已获知机器 1 在端口 1 上,但它仍然不知道目标机器在哪个端口上。

现在我们已经了解了OSI模型的第1层物理层和第2层数据链路层,是时候进入第3层的学习了,它将为我们打开新的视野。

第3层的学习将在下一篇文章中开始!!!

更多高质量原创技术文章可扫码关注公众号:“非科班大厂码农”

在这里插入图片描述
知乎主页:https://www.zhihu.com/people/dcxmn

;