下面我们把关注点放在数据链路层,如果没有数据链路层,计算机网络也就不复存在;这就好比大楼没有了地基,人没有了腿;所以,数据链路层的知识也固然重要,不少小伙伴只把关注点放在 TCP 和 IP 这两个协议上,这是一种狭隘的思想,需要及时纠正,计算机网络可不只有 TCP 和 IP。下面 cxuan 就和你聊聊计算机中的数据链路层。

数据链路层

数据链路层,按照 OSI 七层模型来划分的话,就属于物理层的上层

数据链路层是一种协议层,它有很多协议。数据链路层用于跨物理层在网段节点之间传输数据,通常指以太网、无线局域网等通信手段。数据链路层提供了在网络的两个实体之间传输数据的功能,并且提供了差错检测用于纠正物理层中发生的错误。

关键概念

在数据链路层中,链路层地址有很多中不同的称谓:LAN 地址、物理地址或者 MAC 地址,因为 MAC 地址是最流行的术语,所以我们一般称呼链路层地址指的就是 MAC 地址。

下面我们就来认识一下数据链路层的几个关键概念

打包成帧

打包成帧(framing): 在每个网络层数据报在传输之前,几乎所有的链路层协议都会将数据报用链路层封装起来。数据链路层从网络层获取数据后将其封装成为 ,如果帧太大的话,数据链路层会将大帧拆分为一个个的小帧,小帧能够使传输控制和错误检测更加高效。

帧就是 0 1 序列的封装。

一个帧由 Header、Payload Field、Trailer 组成,网络层数据报就封装在 Payload Field 字段中。根据不同的物理介质,每个帧的结构也不同。帧的组成如下

帧中主要涉及的内容如下

  • 帧头(Frame header):它包含帧的源地址和目的地址。
  • 有效载荷(Payload Field):它包含要传递的数据和信息。
  • 尾部标记(Trailer):它包含错误检测和错误纠正位。
  • 标记(Flag):它标记了帧的开始和结束。

Flag 位位于帧的开头和结尾,两个连续的标志指示帧的结束和开始

帧的类型主要有两种,固定大小的帧和可变大小的帧。

  • 固定大小的帧(Fixed-sized Framing):表示帧的大小是固定的,帧的长度充当帧的边界,因此它不需要额外的边界位来标识帧的开始和结束。
  • 可变大小的帧(Sized Framing):表示每个真的大小是不固定的,因此保留了其他机制来标记一帧的结束和下一帧的开始。它通常用于局域网,在可变大小的帧中定义帧定界符的两种方法是
    • 长度字段(Length Field): 使用长度字段来确定帧的大小。它用于以太网(IEEE 802.3)
    • 结束定界符(End Delimiter): 经常用于令牌环

链路接入

链路接入主要指的是 MAC 协议,MAC(Medium Access Control) 协议规定了帧在链路上的传输规则。我们知道,数据链路层是 OSI 标准模型的第二层,数据链路层向下还能够细分,主要分为 The logical link control (LLC) 层和The medium access control (MAC) 层。

LLC 层又叫做逻辑控制链路层,它主要用于数据传输,它充当网络层和数据链路层中的媒体访问控制(MAC)子层之间的接口。LLC 层的主要功能如下

  • LLC 的主要功能是发送时在 MAC 层上多路复用协议,并在接收时同样地多路分解协议。
  • LLC 提供跳到跳的流和差错控制,像是路由器和路由器之间这种相邻节点的数据传输称为 一跳
  • 它允许通过计算机网络进行多点通信。

MAC 层负责传输介质的流控制和多路复用,它的主要功能如下

  • MAC 层为 LLC 和 OSI 网络的上层提供了物理层的抽象。
  • MAC 层负责封装帧,以便通过物理介质进行传输。
  • MAC 层负责解析源和目标地址。
  • MAC 层还负责在冲突的情况下执行冲突解决并启动重传。
  • MAC 层负责生成帧校验序列,从而有助于防止传输错误。

在 MAC 层中,有一个非常关键的概念就是 MAC 地址。MAC 地址主要用于识别数据链路中互联的节点,如下图所示

MAC 地址长 48 bit,在使用网卡(NIC) 的情况下,MAC 地址一般都会烧入 ROM 中。因此,任何一个网卡的 MAC 地址都是唯一的。MAC 地址的结构如下

MAC 地址中的 3 – 24 位表示厂商识别码,每个 NIC 厂商都有特定唯一的识别数字。25 – 48 位是厂商内部为识别每个网卡而用。因此,可以保证全世界不会有相同 MAC 地址的网卡。

MAC 地址也有例外情况,即 MAC 地址也会有重复的时候,比如你可以手动更改 MAC 地址。但是问题不大,只要两个 MAC 地址是属于不同的数据链路层就不会出现问题。

可靠交付

网络层提供的可靠交付更多指的是端系统到端系统的交付,而数据链路层提供的可靠交付更多指的是单端链路节点到节点地传送。当链路层协议提供可靠交付时,它能保证无差错地经链路层移动每个网络层数据报。链路层提供可靠交付的方法和 TCP 类似,也是使用 确认重传 取得的。

链路层的可靠交付通常用于出错率很高的链路,例如无线链路,它的目的是在本地纠正出错的帧,而不是通过运输层或应用层协议强制进行端到端的数据传输。对于出错率较低的链路,比如光纤、同轴电缆和双绞线来说,链路层的交付开销是没有必要的,由于这个原因,这些链路通常不提供可靠的交付

差错检测和纠正

链路层数据以帧的形式发送,在发送的过程中,接收方节点的链路层硬件可能会由于信号干扰或者电磁噪音等原因错误的把 1 识别为 0 ,0 识别为 1。这种情况下没有必要转发一个有差错的数据报,所以许多链路层协议提供一种机制来检测这样的比特差错。通过让方节点在帧中包括差错检测比特,让接收节点进行差错检查,以此来完成这项工作。

运输层和网络层通过因特网校验和来实现差错检测,链路层的差错检测通常更复杂,并且用硬件实现。差错纠正类似于差错检测,区别在于接收方不仅能检测帧中出现的比特差错,而且能够准确的确定帧中出现差错的位置。

差错检测和纠正的技术主要有

  • 奇偶校验:它主要用来差错检测和纠正
  • 校验和:这是一种用于运输层检验的方法
  • 循环冗余校验:它更多应用于适配器中的链路层

地址映射

因为存在网络层地址(IP 地址)和 数据链路层地址(MAC 地址),所以需要在它们之间进行转换和映射,这就是地址解析协议所做的工作,更多关于地址解析协议的理解,请查阅

深入理解 ARP 协议

数据链路层的作用

数据链路层中的协议定义了互联网络的两个设备之间传输数据的规范。数据链路层需要以通信介质 作为传输载体,通信媒介包含双绞铜线、光纤、电波等红外装置。在数据分发装置上有 交换机、网桥、中继器 等中转数据。链路层中的任何设备又被称为节点(node),而沿着通信路径相邻节点之间的通信信道被称为 链路(link)。实际上,在链路层上传输数据的过程中,链路层和物理层都在发挥作用。因为在计算机中,信息是以 0 1 这种二进制的形式进行传输,而实际的链路通信却是以电压的高低、光的闪灭以及电波的频谱来进行的,所以物理层的作用就是把二进制转换成为链路传输所需要的信息来进行传输。数据链路层传输也不只是单个的 0 1 序列,它们通常是以 为单位进行的。

现在我们知道了数据链路层大概是干啥的,那么只有理论不行,你还得有硬通货,也就是硬件,一切的理论都离不开硬件的支撑。

硬件就可以简单理解为通信介质,在通信介质上会有不同种类的信息传递方式,不过总的来说可以概括为两种:一种是共享介质型网络,一种是非共享介质型网络,下面我们就要聊一聊这两种通信类型。

通信类型分类

共享介质型网络

共享介质型网络故名思义就是多个设备共同使用同一个通信介质的网络。共享介质型网络的类型主要有以太网(Ethernet)光纤分布式数据接口(Fiber Distributed Data Interface,FDDI)

共享说的是,多个设备会使用同一个载波信道进行发送和接收,这是一种半双工的设计。

什么是半双工?

半双工指的是数据可以在一个信道上的两个方向上相互传输,但是不能同时传输,举个简单的例子,就是你能给我发消息,我也能给你发消息,但是不能你给我发消息的同时我也在给你发消息。

既然多个设备会共同使用一个信道,那么就可能存在多个数据传输到同一个介质上导致的数据争用问题,为此,共享介质型网络有两种介质访问控制方式:争用和令牌传递

争用

争用是发生在共享介质,载波监听多路访问(CSMA) 上的数据访问方式。在这种访问方式下,网络中各个介质会采用先到先得的方式占用载波信道发送数据。如果多个介质同时发送帧,就势必会产生冲突,继而导致通信性能的下降和网络拥堵。下面是争用的处理方式

如上图所示,假如 A 想要给 C 发送数据,那么介质 A 会在确认周围没有其他介质要给 C 发送数据后,也就是经过一段时间后,A 会把数据马上发送给 C。

每个介质在接受到 A 发送的数据后,会从 A 报文中解析出来 MAC 地址判断是否是发送给自己的数据包,如果不是的话就是丢弃这条数据。

上面这种方式会使用在一部分以太网中,但是另外一部分以太网却使用了 CSMA 的改良方式 – CSMA/CD 。CSMA/CD 会要求每个介质提前检查一下链路上是否有可能产生冲突的现象,一旦发生冲突,那么尽可能早地释放信道。它的具体工作原理大致如下:

  • 监听载波信道上是否会有数据流动,如果没有的话,那么任何介质都可以发送数据。
  • 介质会检查是否发生冲突,一旦发生冲突就会丢弃数据,同时立即释放载波信道。
  • 放弃数据后,会经过一段时间重新争用介质。

下面是 CSMA/CD 的改良版

上图这个过程是 CSMA(Carrier Sense Multiple Access),首先介质会监控载波信道上是否有数据存在,如果没有再发送,如果有,等一段时间再发送。

下面是 CD(Collision Detection) 的示意图

  • 在发送数据 -> 发送完成后,如果电压一直处于规定范围内,就会认为数据已经正常发送。
  • 发送途中,如果电压超过了一定范围,就会认为是数据冲突。
  • 发生冲突时会先发送一个阻塞报文,继而放弃数据,在延迟一段时间后再次发送

令牌环

第二种共享介质型网络的传输方式就是令牌环了,令牌环顾名思义就是有一个令牌一样的东西,以环为一圈进行令牌传输,那么令牌是啥呢?你想啊,我们最终的目的不就是为了传输数据吗?那么这个令牌,它可不可以作为数据呢?

其实,在这种传输方式中,令牌环是作为一种特殊报文来传输的,它是控制传输的一种方式,在数据传输的过程中同时会将令牌进行传递,只有获得令牌的介质才能够传输数据。这种方式有两个优点,即

  • 持有令牌的介质才能够传输数据,这样能够保证不会有报文冲突情况。
  • 每个介质都有平等获取令牌的机会,这样保证了即使网络拥堵也不会导致性能下降。

但是这种令牌环的传递方式也是有缺点的,因为只有持有令牌的介质才能发送数据,所以即使在网络不太拥堵的情况下,其利用率也达不到 100%。

下面是令牌的传递示意图

最一开始,令牌位于介质 A 处,此时介质 A 拥有数据传输的能力,然后介质 A 把令牌传递给介质 B。

此时 B 持有令牌,所以介质 B 具有发送数据的能力。

这个数据最终会由 D 接收,然后 D 就会设置一个已接收数据的标志位,然后数据会继续向下发送。

令牌环是一项很成功的技术,尤其是在公司环境中使用,但后来被更高版本的以太网所取代。

在了解完共享网络之后,我们来探讨一波非共享网络

非共享介质型网络

如果说共享介质型网络是共享介质的话,那么非共享介质型网络就是不共享介质,那么如何通信呢?在这种方式下,网络中的每个介质会直接连上交换机,由交换机来转发数据帧。发送端和接收端不会共享通信介质,共享通信介质的意思就是介质之间直接通信。这种网络传输方式一般采用的是全双工通信。

非共享介质型网络比较适合应用于搭建虚拟局域网(VLAN),但是这种通信方式有一个及其致命的弱点:一旦交换机发生故障,那么与交换机相连的所有计算机都无法通信。

下面是非共享介质型网络的通信示意图

如图所示,主机 A 发送了一个目标地址为 B,源地址为 A 的交换机,由交换机负责将数据转发给介质 B,如下图所示

非共享型网络是一种全双工通信的方式,每个介质在发送数据的同时也能够接受来自交换机传递过来的数据。

交换集线器

交换集线器是一种共享型网络通信介质,它是使用同轴电缆作为传输介质,通常用于以太网中,交换集线器也叫做以太网交换机

以太网交换机中的各个端口会根据介质的 MAC地址来转发数据,那么转发数据肯定得有所依靠啊,这时可以参考的表就叫做转发表(Forwarding Table),转发表中记录着每个介质的 MAC 地址。转发表当然不需要我们手动维护,交换机会自动维护转发表。交换机会自学每个数据包的经过介质的 MAC 地址,如下图所示

由于不知道主机 B 的 MAC 地址,所以主机 A 发送的数据会经过交换机广播给以太网内的其他主机,主机 B 接收到数据后,会给主机 A 回送消息。

在主机 B 给主机 A 回送消息后,交换机就知道主机 A 和主机 B 的 MAC 地址了,从此以后双方通信会在各自相连的端口之间进行。

由于 MAC 地址没有层次性,转发表中的记录个数与所有网络设备的数量有关,当设备增加时,转发表的记录也会越来越多,检索时间会逐渐增加。所以如果需要连接多个终端时,需要将网络分成多个数据链路,采用类似 IP 地址一样对地址进行分层管理。

在网络通信的过程中,由于网络链路的冗余或者路由线路冗余可能会造成闭环,也就是我们所称的环路。环路会导致数据报文在网络中不断重复复制,最终导致网络设备负载过重,无法正常运行。影响的范围可能会扩散至整个局域网,导致整个局域网里的计算机无法正常使用网络。

那么如何检测网络中出现的环路呢?

环路检测方法

目前有两种检测环路的方式,一种是生成树,一种是源路由法

生成树:生成树指的是每个网桥必须在 1 – 10 秒内相互交换生成树协议单元包,以此来判断哪些接口使用,从而消除环路,一旦发生故障后就会立刻切换线路,利用没有被使用的端口进行传输。

源路由法:源路由法通常是用来解决令牌环路。这种方式可以判断发送数据的源地址是通过哪个网桥实现传输的,并将帧写入 RIF,网桥会根据这个 RIF 信息发送给目标地址,即使网桥中出现了环路,数据帧也不存在被反复转发的可能。

虚拟局域网 VLAN

网络通信过程中经常会遇到网络负载过高,通信性能下降的情况,往往遇到这种情况,就需要分散网络负载,变换部署网络设备的位置等。在虚拟局域网出现之前,往往需要管理员手动变更网络的拓扑结构,比如变更主机网段,进行硬件线路改造等,但是使用了虚拟局域网,就可以不用再做如此复杂的操作了,只需要修改网络结构即可。

那么虚拟局域网究竟是什么呢?

如上图所示,交换机按照端口区分了多个网段,从而区分了广播数据的传播范围,提高网络安全性。然而异构的两个网段之间,需要利用具有路由功能的交换机才能实现通信。

由于交换机端口有两种 VLAN 属性,一个是 VLANID,一个是 VLANTAG,分别对应 VLAN 对数据包设置 VLAN 标签和允许通过的 VLANTAG(标签)数据包,不同 VLANID 端口,可以通过相互允许 VLANTAG,构建 VLAN。

以太网

以太网提了这么多次,那么以太网到底是什么?

数据链路层有很多分类,包括以太网、无线通信、PPP、ATM、POS、FDDI、Token Ring、HDMI 等,其中最著名的通信链路就是以太网了。

以太网最开始的时候,一般使用的是以同轴电缆为传输介质的共享介质型连接方式,这也是以太网的第一种方式,叫做经典以太网。而现在,随着互联设备的处理能力和传输速度的提高,现在都采用终端和交换机之间连接方式,这也是第二种方式,叫做交换式以太网。以太网使用的是 CSMA/CD 的总线技术,我们前面也介绍过了。

以太帧格式

在以太网链路上的数据包被称为以太帧,以太帧开头有一个叫做前导码(Preamble) 的部分,它是由 0、1 数字交替组合而成。前导码的末尾最后是一个叫做 SFD(Start Frame Delimiter) 的域,值为 11。前导码与 SFD 共同占用 8 个字节。

以太网最后 2 bit 称为 SDF,而 IEEE802.3 中将最后 8 bit 称为 SDF。

IEEE802.3 是电气和电子工程师协会 (IEEE)标准的集合制定的标准。

这是以太帧的前导码部分,下面是以太帧的本体部分

以太帧体格式也有两种,一种是以太帧格式,一种是 IEEE802.3 标准以太帧格式。

在以太帧格式中,以太帧的本体的前端是以太网的首部,总共占用 14 字节,分别是 6 字节的目标 MAC 地址、6 字节的源 MAC 地址和 2 字节的上层协议类型,后面是数据部分,占用 46 – 1500 字节,最后是 FCS(Frame Check Sequence,帧检验序列) 4 个字节。FCS 用于检查帧是否有所损坏,因为在通信过程中由于噪声干扰,可能会导致数据出现乱码位。

IEEE802.3 以太帧的格式有区别,一般以太帧中的类型字段却在 IEEE802.3 表示帧长度,此外新增加了 LLC 和 SNAP 字段。

数据链路层在细化的话可以分为两层,介质访问控制层和逻辑链路控制层

介质访问会根据以太网等不同链路特有的首部信息进行控制,逻辑链路层则根据以太网等不同链路共有的帧头信息进行控制。

LLC 和 SNAP 就是逻辑链路控制的首部信息,那么现在你应该明白怎么回事儿了吧。