一篇文章带你搞懂数据链路层

数据链路层,简称链路层。两个主机之间的数据传输,总是在一段一段的链路上面传送的,也就是说,在两个相邻结点之间(主机与路由器之间 或者 两个路由器之间)传送数据是直接传送的(点对点)。这时,就需要使用专门的链路层的协议。在两个相邻结点之间传送数据时,能够保证数据链路层将网络层交下来的IP数据报组装成帧(framing),在两个相邻结点间的链路上“透明”地传送帧(frame)中的数据。

在物理层我们了解到数据在信道上通过信号进行传输,为了提高信道的利用率产生了复用技术:时分复用、频分复用、波分复用、码分复用、统计时分复用。而数据链路层将完成相邻节点之间的数据传输,但是数据链路层如何利用物理层提供的服务?数据传输中会产生那些问题?问题又是如何解决 ?在物理层中同一时刻不能有两个数据同时传输,数据连路层允许吗?它是怎么处理这个问题的?我们一一来探索。

在了解数据链路层之前,我们来看看初期两台计算机之间到底是怎么样连接起来的。下图显示的是基本的网络拓扑结构,我们具体来分析一下:

图1 计算机连接的几种方式

如上图,每一个结点我们都想象为一台计算机,每一条黑色的线我们都能理解为两台计算机之间连接的数据线,我们在这个基础上再来考虑数据到底是怎么样传输的。

我们再看网络的拓扑结构多种多样,但是在两台计算机之间的基本的连接方式不过就是两种:图1 中Star的计算机之间的直接相连方式,或则类似Bus的总线连接方式,由于连接方式的不同,我们在传输数据时需要注意的点也会不同。在数据链路层中,我们将Star中的连接信道称之为点对点信道,对于Bus中的信道称之为广播信道。 在了解了上述基本概念的基础上,我们再来了解数据链路层到底怎么传输数据。

在此基础上我们分析数据链路层需要解决的问题与将要面临的问题:数据链路层需要解决不同网络拓扑的情况下,相邻(或间接相邻,通过总线)的计算机数据传输问题。不论是直接相连还是通过总线相联,我们都需要解决一下问题:在传输时怎么利用物理层提供的服务?如果将传输的数据想象为一个信件,存不存在信封与内容的差别?如何判断一段数据的开始与结尾?传输过程中出错怎么办?

0 感性理解数据链路层

图2 数据的传输

如图显示了数据从主机 H 1 H_1 发送到主机 H 2 H_2 的示意图,在上部分显示中,数据从 H 1 H_1 出发,经过好几个路由器转发、经过了电话网、局域网、广域网等多个网络到达了主机 H 2 H_2 ,从计算机层次结构的角度来看,就如下部分的红线所示,反复在不同的乘此结构间穿行,最终到达主机 H 2 H_2

本章我们重点研究数据链路层,所以从上图中蓝色箭头部分我们就要考虑从主机 H 1 H_1 的数据链路层如何发送数据到路由器 R 1 R_1 的数据链路层。从协议而言主机的数据链路层需要接收来自网络层的数据包,然后交给物理层转换为信号之后才能发送。

0.1 基本概念的理解

数据链路与帧

所谓链路(link)就是从一个结点到相邻结点的一段物理线路(有线或无线),而中间没有任何其他的交换结点。在进行数据通信时,两台计算机之间的通信路径往往要经过许多段这样的链路。可见链路只是一条路径的组成部分。
数据链路(data link)则是另 一个概念。这是因为当需要在一条线路上传送数据时,除了必须有一条物理线路外,还必须有一些必要的通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。现在最常用的方法是使用网络适配器实现这些协议。
简单理解就是 = + 数据链路 = 物理链路 + 协议
在数据链路层传输的基本的数据单元是,在网络层基本的传输的基本数据单元是IP数据报,在数据连路层就需要解决如何将IP数据包封装成为帧。下图显示的就是点对点通讯的示意图:

图3 点对点数据链路

点对点信道的数据链路层在进行通信时的主要步骤如下:

  • 1、结点A的数据链路层把网络层交下来的IP数据报添加首部和尾部封装成帧。
  • 2、结点A把封装好的帧发送给结点B的数据链路层。
  • 3、若结点B的数据链路层收到的帧无差错,则从收到的帧中提取出IP数据报交给上面的网络层;否则丢弃这个帧。

数据链路层不必考虑物理层如何实现比特传输的细节。我们甚至还可以更简单地设想好像是沿着两个数据链路层之间的水平方向把帧直接发送到对方,如图(b)所示。

0.2 三个基本问题

0.2.1 封装成帧

在物理层发送的信号是没有起始与结束标志的,如果我我们需要传数据就需要为数据添加首位,同时数据链路层又需要将IP数据报也添加到帧中,这个问题综合而言就是封装成帧的问题。

将IP数据报封装成帧很简单,就像寄快递一样,将需要寄出去的东西存放在一个包裹中,在这里就是帧的数据部分中。如何解决起始与结束的标志问题呢?也很简单,添加一个帧开始符( S O H SOH ),添加一个帧结尾符( E O T EOT )就好了,在接收数据时如果遇到了帧开始符就表示需要开始接收数据了,如果没有遇到就说明前面收到的可能都是噪声不用做处理。然后在此遇到帧结束符就说明数据传输结束,后面的部分数据不同在处理,数据封装示意图如下:

图4 PPP封装成帧

0.2.2 透明传输

透明传输是指不管所传数据是什么样的比特组合,都应当能够在链路上传送。当所传数据中的比特组合恰巧与某一个控制信息完全一样时,就必须采取适当的措施,使接收方不会将这样的数据误认为是某种控制信息。这样才能保证数据链路层的传输是透明的。

上面这段话摘自百度百科,怎么理解这样一段话呢?简单就是我发送一段数据,你接收到的也是这样的一段数据,没有产生二义性 。那为什么数据连理层会产生这个问题呢?在数据链路层将网络层协议封装成帧时,会在首部和尾部分别添加SOH以及EOT这两个特殊字符,接收方是根据这两个字符来确定帧首和帧尾的(产生了二义性),如果上层协议发送过来的数据(即链路层的数据部分)包含EOT,那么接收方在解析这个帧的时候就会误以为数据已经结束,这种情况下传输数据就会产生问题。所以,如果链路层对这种情况没有特殊处理,那么就可以理解链路层为非透明传输(因为无法传输EOT这个字符)。

通常情况下解决这个问题可以在数据部分的 S O H SOH E O T EOT 字符前添加一转义字符 E S C ESC ,在传输时如果直接接收到 S O H SOH E O T EOT 字符还是表示为帧的开始与结束标志,但是如果接收时接收到了 E S C ESC 然后接收到 S O H SOH E O T EOT ,就说明这两个字符不是帧的开始与结束标志,是帧数据的一部分。这样就完成了透明传输的问题,具体怎么操作我们在后面会继续深入的了解。

0.2.3 差错控制

在物理层中我们就讨论过,现实的通信链路都不会是理想的。这就是说,比特在传输过程中可能会产生差错:1可能会变成0,而0也可能变成1。这就叫做比特差错。很显然我们不希望产生比特差错,但是如果已经出现了比特差错我们又要怎么办呢?如何控制差错?

在数据链路层采用了校验码的方式,在传输前生成校验码同数据一起发送,接受后通过校验码校验数据是否正确,如果校验出错就直接丢弃该帧,如果没有出错就直接保存,解析,并将数据部分上交给网络层。在使用中使用最为广泛的就是CRC循环冗余校验。

CRC循环冗余校验

  1. 在发送端,先把数据划分为组。假定待传送某组数据M,其长度为k 位,在M的后面再添加差错检测用的n位冗余码一起发送。
  2. 冗余码的生成(计算过程)
    • 将M左移n位,右边填零,变成(k+n)位。这相当于在M后面添加n个0
    • 用左移后的数除以(n+1)位除数P(模二除法,两种理解1、只有加减运算一样,进位不进,借位不借,2、异或运算。),得到商Q,及n位余数R
    • 将 n 位余数R 作为冗余码,拼接在数据 M 后面,发送出去
  3. 在接收端将收到的数据进行模二除法,若得到的余数为0,则表示收到的数据没有发生错误,否则数据在传输中输错,丢弃该数据。
  4. 数据校验,对接收到的数据进行模二除法得到余数,余数为0 ,表示没有差错,若存在差错,丢弃该帧。

在上面的计算过程中我们有一个是不知道的,就是除数P到底怎么获取,一般情况下我们采用多项式表示这样一个除数,用多项式 P ( X ) = x 3 + x 2 + 1 P(X)=x^3+x^2+ 1 表示上面的除数 P = 1101 P= 1101 (最高位对应于 x 3 x^3 ,最低位对应于 x 0 x^0 )。多项式 P ( X ) P(X) 称为生成多项式。现在广泛使用的生成多项式 P ( X ) P(X) 有以下几种:
C R C 16 = x 16 + x 15 + x 2 + 1 CRC-16=x^{16} +x^{15}+x^2+ 1
C R C C C I T T = x 16 + x 12 + x 5 + 1 CRC-CCITT= x^{16}+x^{12}+x^{5}+ 1
C R C 32 = x 32 + x 26 + x 22 + x 16 + x 12 + x 11 + x 10 + x 8 + x 7 + x 5 + x 4 + x 2 + x + 1 CRC-32= x^{32} +x^{26} +x^{22} +x^{16} +x^{12} +x^{11} +x^{10} +x^{8} +x^{7} +x^{5} +x^{4} +x^{2} +x +1

例如:要发送数据为1101011011, 生成多项式为 P ( X ) = X 4 + X + 1 P(X)=X^4+X+1 ,CRC的校验过程

  1. 由生成多项式得到除数为10011,将发送数据左移4位得到1101011011 - 0000,并做模二除法计算过程如下:
2. 发送数据1101011011 - 1110

上述的差错控制只能用于帧内的数据是否发生了变化,对于帧之间的关系是难以保证的,其中就包括了:

  • 帧乱序
  • 帧丢失
  • 帧重复

在上面我了解了数据链路层的基本概念与基本问题,我们知道了数据链路层中有点对点信道,也有广播信道,这两种信道传输数据的控制方式是不一样的,所以在下面我们分为两种信道,分别讨论数据链路中存在的基本问题进行讨论。
在点对点信道中采用的是PPP协议,广播信道中使用的是CSMA/CD协议,在接下来的学习中我们就必须知道这两个协议到底是怎么处理数据链路层的三个基本问题–封装成帧、透明传输、差错控制。我们还是将数据链路层的数据传输比作收发快递,但是我们怎么表示地址?我们继续探究。

1点对点协议 PPP

1.1 PPP帧格式

1.1.1 封装成帧

为解决封装成帧的问题一般都是采用规定帧格式,按照帧的格式组装数据就能够封装成帧。在PPP协议是这样的,其他协议也是。接下来我们具体看看PPP帧的格式:

图5 PPP协议帧格式

PPP 帧首部4个字段,尾部2个字段

  • 1个字节的标志字段F = 0x7E ,作为帧定界符,解决了封装成帧的问题

  • 1个字节的地址字段A 必须为 0xFF,目前没什么作用

  • 1个字节的控制字段C 常置为 0x03,目前没什么作用

  • 2 个字节的协议字段:

    • 若为 0x0021,则信息字段是IP 数据报
    • 若为 0x8021,则信息字段是网络控制数据
    • 若为 0xC021,则信息字段是链路控制数据
    • 若为 0xC023,则信息字段是鉴别数据
  • PPP 是面向字节的,所有 PPP 帧的长度都是整数字节,最长1500字节的信息字段,承载有效负载

  • 2个字节的 FCS 字段,为 CRC 校验得到的余数 R

至此封装成帧的问题就解决了。但是为什么有地址字段但是不使用呢?这个地址字段的意义在哪里?其实也很好解释,点对点的链路只有两个点,没有其他的地址可以传输,只能A->B,或则B->A,地址字段也就不适用, 但是为了保证协议帧的可扩展性就保留了这个字符,提供后期协议变化,适应新环境而设置的。

1.1.2 透明传输

在0.2.2 透明传输,我们讨论了解决透明传输的一般方案,就是使用转义字符,在PPP协议中为解决透明传输问题,就需要将控制字符与一般的字符区分开来,于是产生了字符填充方式与比特填充方式两种:

  • 字符填充方式:发送端的数据链路层在数据中出现控制字符“SOH”或“EOT”的前面插入一个转义字符“ESC”,在接收端的数据链路层在把数据送往网络层之前删除这个转义字符,这就是字符填充方式。
  • 零比特填充方式:在发送端,只要发现有5个连续的1,则立即在其后填入 1个0,接收端对帧中的比特流进行扫描,每当发现5个连续的1,就删除其后的1个0.
字符填充方式

PPP 协议用在异步链路时,使用字符填充方法来实现透明传输,具体操作如下:

  • 将信息字段中出现的每一个 0x7E 字节转变成为 2 字节序列 (0x7D, 0x5E)
  • 若信息字段中出现一个 0x7D 字节, 则将其转变成为 2 字节序列 (0x7D, 0x5D)
  • 若信息字段中出现 ASCII 码的控制字符(即数值小于 0x20 的字符),则在该字符前面要加入一个 0x7D 字节,同时将该字符的编码加以改变,如:将 0x03 变为 (0x7D, 0x23)

数据链路层要发送的数据是 A2 5F 7 E 7E 8B 7 D 7D 54 5C 02 02 20
实际交给物理层发送的应该是 A2 5F 7 D    5 E 7D \,\, 5E 8B 7 D    5 D 7D \,\, 5D 54 5C 7 D    22 7D \,\, 22 20
接收端收到上述数据后应该还原成 A2 5F 7 E 7E 8B 7 D 7D 54 5C 02 02 20

在上述的字节填充中存在三种转义

  1. 0x7E的转义 => 0x7D, 0x5E
  2. 0x7D的转义 => 0x7D, 0x5D
  3. 0xab<0x20的转义 => 0x7D, 0x(a+20)b

在每次的转义中每次的转义都会添加一个字符的大小,如果转义的字符较多,则传输的数据中添加的转义序列也会较多,就产生了较大的带宽浪费。为解决这个问题,就产生了零比特传输方式

零比特填充方式

PPP 协议用在同步链路(SONET/SDH)时,采用零比特填充方法来实现透明传输

  • 由于0x7E = 0b01111110,中间存在连续的六个1,如果在数据部分打破了这个序列就不存在0x7E这个字符序列
  • 在发送端,只要发现有 5 个连续的 1,则立即在其后填入 1 个 0
  • 接收端对帧中的比特流进行扫描,每当发现 5 个连续的 1,就删除其后的 1 个 0

图6 零比特填充方式

传输链路按同步方式分两种:

  • 异步传输:对字节进行同步,而没有比特同步
  • 同步传输:对比特进行同步

两种填充方法:

  • 当 PPP 用在异步传输链路时,使用软件进行特定字符填充
  • 当 PPP 用在同步传输链路时,采用硬件进行零比特填充

1.1.3 差错检测

PPP协议的差错检测就是使用CRC循环冗余校验,在0.2.3 差错控制我们讨论了差错检测的能够使用CRC循环冗余校验且讨论了具体的计算方法,在PPP格式中PPP帧的格式倒数第二个字段就是FCS存放帧校验序列,也就是CRC 校验得到的余数 R。

顺便说一下, 循环冗余检验CRC和帧检验序列FCS并不是同一个概念。CRC是一种检错方法,而FCS是添加在数据后面的冗余码,在检错方法上可以选用CRC,但也可不选用CRC.

1.2 PPP协议的特点

1.2.1 显著特点

  • 简单 —— 没必要比IP协议功能更多。
  • 基本能力,解决三个基本问题
    • 封装成帧:规定特殊的字符作为帧定界符
    • 透明传输:保证传输数据中帧定界符的透明性
    • 差错检测:能检测收到的帧是否有错,立即丢弃有差错的帧
  • 向下:能运行在多种类型的串行链路上,如:同步链路、异步链路;普通链路、宽带链路(使用PPPoE)
  • 向上:能在一条物理链路上同时支持多种网络层协议,如:IP、IPX/SPX、NetBEUI、AppleTalk、Decnet等
    检测连接状态:能自动检测链路是否处于正常工作状态
  • 最大传送单元:能对每一种类型的点对点链路设置最大传送单元 MTU 的标准默认值,促进各种实现之间的互操作性
  • 网络层地址协商:能使通信的两个网络层实体通过协商,明确或配置彼此的网络层地址
  • 数据压缩协商:能让通信的两个网络层实体协商是否数据压缩算法及使用何种数据压缩算法

1.2.2 不具备的能力

  • 可靠传输
  • 流量控制
  • 序号
  • 多点线路
  • 单工或半双工链路

在上述基础上需要强调的就是PPP协议支持同步传输异步传输

1.3 PPP协议的组成

PPP协议有三个组成部分:

  1. 一个将IP数据报封装到串行链路的方法。PPP 既支持异步链路(无奇偶检验的8比特数据),也支持面向比特的同步链路。IP数据报在PPP帧中就是其信息部分。这个信息部分的长度受最大传送单元MTU的限制。
  2. 一个用来建立、配置和测试数据链路连接的链路控制协议LCP(LinkControl Protocol)。通信的双方可协商一一些选项。在RFC 1661中定义了11 种类型的LCP分组。
  3. 一套网络控制协议NCP (Network Control Protocol) ,其中的每一个 协议支持不同的网络层协议,如IP、OSI 的网络层、DECnet, 以及AppleTalk等。

PPP协议工作过程如下:

  • 当用户拨号接入 ISP 时,路由器的调制解调器对拨号做出确认,并建立物理链路
  • 通过一系列LCP 分组(封装成PPP 帧),协商PPP链路层参数,如:是否省略不用的地址和控制字段、鉴别协议、最大帧长等,建立LCP链路
  • 通过LCP 分组(封装成PPP 帧),进行用户身份鉴别
  • 通过一系列NCP 分组(封装成PPP 帧),配置PPP网络层参数,如:使用何种网络层协议、是否压缩TCP 及IP 首部、给新接入的 PC 机分配临时 IP 地址,建立完整的数据链路,为网络层提供本层服务

此时数据链路层的配置完毕,可投入使用,当数据链路层取消链接时会进行如下操作

  • 通过NCP 分组释放网络控制链路,收回原来分配出去的 IP 地址
  • 通过LCP 分组释放链路控制链路
  • 释放物理连接

总结就是由下向上逐层建立,由上到下逐层释放。图解可表示为:

图7 PPP协议工作过程

至此,我们就讨论完了点对点信号的PPP协议,在其中我们并没有使用地址这个东西,虽然在PPP帧格式中存在这个保留字段。这个部分除了解决了三个基本问题:封装成帧(按照帧格式组织数据)、透明传输(字节填充、字符填充)、差错检测(CRC循环冗余校验)。接下来我们讨论广播信道的CSMA/CD协议。

2 使用广播信道的数据链路层

单纯的点对点通信存在众多局限,难以应用到大范围上。一般使用的局域网有如下优点:

  • 具有广播功能,从一个站点可很方便地访问全网。局域网上的主机可共享连接在局域网上的各种硬件和软件资源。
  • 便于系统的扩展和逐渐演变,各设备的位置可灵活调整和改变。
  • 提高了系统的可靠性(reliability)、可用性(availability)和生存性(survivability)。

在通常情况下局域网的网络结构都是拓扑结构,如下图。这种情况下的点对点通信就不在适用,应该使用能够广播的相应的协议。

图8 网络拓扑结构

在早期IEEE802委员会就把局域网的数据链路层拆成两个子层,即逻辑链路控制LLC (Logical Link Control)子层媒体接入控制 MAC Medium Access Control)子层。 与接入到传输媒体有关的内容都放在MAC子层,而LLC子层则与传输媒体无关,不管采用何种传输媒体和MAC子层的局域网对LLC子层来.说都是透明的(如下图所示)。

图9 早期的数据链路层

DIX Ethernet V2 是世界上第一个局域网产品(以太网)的规约IEEE 802.3 是第一个 IEEE 的以太网标准。DIX Ethernet V2 标准与 IEEE 的 802.3 标准只有很小的差别,因此可以将 802.3 局域网简称为“以太网”。严格说来,“以太网”应当是指符合 DIX Ethernet V2 标准的局域网。

由于 TCP/IP 体系经常使用的局域网只有 DIX Ethernet V2 ,而不包括 802标准中的其它几种局域网,因此现在 802 委员会制定的逻辑链路控制子层 LLC(即 802.2 标准)的作用已经不大了很多厂商生产的适配器上就仅装有 MAC 协议而没有 LLC 协议。 所以在接下来的讨论中我们不讨论LLC协议。

2.1 适配器与MAC地址

2.1.1 适配器

通常情况下所说的网络适配器就是指网卡,适配器的重要功能包括:

  • 进行串行/并行转换
  • 对数据进行缓存
  • 在计算机的操作系统安装设备驱动程序
  • 实现以太网协议

请注意,虽然我们把适配器的内容放在数据链路层中讲授,但适配器所实现的功能却包含了数据链路层及物理层这两个层次的功能。现在的芯片的集成度都很高,以致很难把一个适配器的功能严格按照层次的关系精确划分开。

适配器在接收和发送各种帧时,不使用计算机的CPU.这时计算机中的CPU可以处理其他任务。当适配器收到有差错的帧时,就把这个帧直接丢弃而不必通知计算机。当适配器收到正确的帧时,它就使用中断来通知该计算机,并交付协议栈中的网络层。当计算机要发送IP数据报时,就由协议栈把IP数据报向下交给适配器,组装成帧后发送到局域网。

图10 网络适配器结构示意图

2.1.2 MAC地址

在广播信道中,我们就需要使用到地址这个东西了,有了地址我们才能知道信息从哪里来,到哪里去。在局域网中,硬件地址又称为物理地址或MAC地址。我们来详细了解一下。

IEEE 802 标准规定 MAC 地址字段可采用 6 字节 ( 48位) 或 2 字节 ( 16 位) 这两种中的一种。由IEEE 的注册管理机构 RA 负责向厂家分配地址字段 6 个字节中的前三个字节 (即高位 24 位),称为组织唯一标识符。地址字段 6 个字节中的后三个字节 (即低位 24 位) 由厂家自行指派,称为扩展唯一标识符。必须保证生产出的适配器没有重复地址。

图11 MAC地址结构示意图

请注意,如果连接在局域网上的主机或路由器安装有多个适配器,那么这样的主机或路由器就有多个“地址”。更准确些说,这种 48 位“地址”应当是某个接口的标识符。

MAC地址的使用

IEEE 规定地址字段的第一字节(最高地址)的最低位为 I/G 位。I/G 表示 Individual / Group

  • 当 I/G位 = 0 时,地址字段表示一个单站地址
  • 当 I/G位 = 1 时,表示组地址,用来进行多播(以前曾译为组播)

可见,IEEE 只分配地址字段前三个字节中的 23 位。当 I/G 位分别为 0 和 1 时,一个地址块可分别生成 2 23 2^{23} 个单个站地址和 2 23 2^{23} 个组地址。所有 48 位都为 1 时,为广播地址。只能作为目的地址.

使用IEEE 把地址字段第一字节(最高地址)的第2 低位规定为 G/L 位,表示 Global / Local

  • 当 G/L位 = 0 时,是全球管理(保证在全球没有相同的地址),厂商向IEEE购买的 OUI 都属于全球管理
  • 当 G/L位 = 1 时, 是本地管理,这时用户可任意分配网络上的地址

适配器从网络上每收到一个 MAC 帧就首先用硬件检查 MAC 帧中的 MAC 地址:

  • 如果是发往本站的帧则收下,然后再进行其他的处理
  • 否则就将此帧丢弃,不再进行其他的处理

“发往本站的帧”包括以下三种帧:

  • 单播 (unicast) 帧(一对一)
  • 广播 (broadcast) 帧(一对全体)
  • 多播 (multicast) 帧(一对多)

所有的适配器都至少能够识别前两种帧,即都能够识别单播地址和广播地址,有的适配器可用编程方法识别多播地址,只有目的地址才能使用广播地址和多播地址,以混杂方式 (promiscuous mode) 工作的以太网适配器只要“听到”有帧在以太网上传输,不管是否与自己地址相匹配都会接收下来.

在上述说明之后,我们重点需要了解的就是以下几点:

  1. 主机或路由器可以安装多个适配器,相对应的就是MAC应当是某个接口的标识符
  2. MAC地址前24位为组织唯一标识,后24位为符扩展唯一标识符MAC地址的使用在初学阶段可以了解一下,暂不做为重点,了解就好了(个人建议)

2.2 三个基本问题

2.2.1 封装成帧

在封装成帧的问题中按照给定帧的格式组织帧,如下图:

图12 MAC帧结构

  • 目的地址字段 6 字节
  • 源地址字段 6 字节
  • 长度/类型字段 2 字节,注意这个字段不能够单纯的理解为长度字段或则类型字段,他是有条件的。类型字段用来标志上一层使用的是什么协议,以便把收到的 MAC 帧的数据上交给上一层的这个协议
    • < 0x0600:长度
    • > 0x0600:类型
      • 0x0800:IP协议
      • 0x8137:IPX
  • 数据字段 46 ~ 1500 字节。数据字段的正式名称是 MAC 客户数据字段。
    • 最小长度 64 字节 - 18 字节的首部和尾部 = 数据字段的最小长度(46字节)
    • 当数据字段的长度小于 46 字节时,应在数据字段的后面加入整数字节的填充字段,以保证以太网的 MAC 帧长不小于 64 字节。

我们与PPP协议帧对比之后发现,MAC帧没有帧开始定界符,没有帧结束定界符,那MAC帧如何解决这个接收的问题呢?

实际上帧的定界工作交给了物理层完成,如上图所示,在发送帧之前需要将发送7个字节的帧同步码与1个字节的帧开始定界符,表示帧可以开始接收了,等到数据发送完毕之后就会有一段时间的空闲期,表示数据发送完毕。这样就保证了数据的开始与结束。

在此基础上我们需要知道,那些帧是无效帧呢?

  • 数据字段的长度与长度字段的值不一致
  • 帧的长度不是整数个字节
  • 用收到的帧检验序列 FCS 查出有差错
  • 数据字段的长度不在 46 ~ 1500 字节之间
  • 有效的 MAC 帧长度为 64 ~ 1518 字节之间

对于检查出的无效 MAC 帧就简单地丢弃。以太网不负责重传丢弃的帧.

2.2.2 透明传输 | 差错检测

由于传输的数据中没有需要转义的字符,不存在透明传输问题。同PPP协议,在帧格式中保留了FCS帧校验序列字段,同样能够使用CRC 循环冗余校验实现差错控制。

2.3 以太网的 CSMA/CD协议

2.3.1 以太网的服务

最初的以太网是将许多计算机都连接到一根总线上。当初认为这样的连接方法既简单又可靠,因为总线上无有源器件

图13 总线传输结构

在发送数据时,总线上的每一个工作的计算机都能检测到 B 发送的数据信号,由于只有计算机 D 的地址与数据帧首部写入的地址一致,因此只有 D 才接收这个数据帧,其他所有的计算机(A, C 和 E)都检测到不是发送给它们的数据帧,因此就丢弃这个数据帧而不能够收下来,在具有广播特性的总线上实现了一对一的通信 。

为了通信的简便,以太网采取了两种重要的措施:

  • 采用较为灵活的无连接的工作方式。不建立连接,就可以直接发送数据对发送的数据帧不进行编号,对于对方是否收到,也不要求确认。这样做的理由是局域网信道质量很好,因信道质量产生差错的概率是很小的。以太网提供的服务是不可靠的交付,即尽最大努力交付。当目的站收到有差错的数据帧时就丢弃此帧,其他什么也不做。差错纠正由高层来决定如果高层发现丢失了一些数据而进行重传,但以太网并不知道这是不是重传帧,而是一视同仁地当作新数据帧来发送。
  • 以太网发送的数据都使用曼彻斯特 (Manchester) 编码

在物理层我们讨论过信道上不能够同时有两个信号进行传递,于是能够使用时分复用、统计时分复用、频分复用、波分复用、码分复用等复用技术实现两点信道的冲突问题,PPP协议就是利用了物理层提供的这个服务也就不需要解决这给问题,而在广播信道中这个问题就需要再次的提出并且解决。

共享信道要着重考虑的一个问题就是如何使众多用户能够合理而方便地共享通信媒体资源。这在技术上有两种方法:

  • 静态划分信道,如在第2章的2.4节中已经介绍过的频分复用、时分复用、波分复用和码分复用等。用户只要分配到了信道就不会和其他用户发生冲突。但这种划分信道的方法代价较高,不适合于局域网使用。

  • 动态媒体接入控制,它又称为多点接入(multiple acess),, 其特点是信道并非在用户通信时固定分配给用户。这里又分为以下两类:
    随机接入:随机接入的特点是所有的用户可随机地发送信息。但如果恰巧有两个或更多的用户在同一时刻发送信息,那么在共享媒体上就要产生碰撞(即发生了冲突),使得这些用户的发送都失败。因此,必须有解决碰撞的网络协议。

    受控接入 :受控接入的特点是用户不能随机地发送信息而必须服从一定的控制。这类的典型代表有分散控制的令牌环局域网和集中控制的多点线路探询(polling),或称为轮询。

2.3.2 CSMA/CD协议

CSMA/CD 含义:载波监听多点接入 / 碰撞检测 (Carrier Sense Multiple Access with Collision Detection)

  • “多点接入”表示许多计算机以多点接入的方式连接在一根总线上

  • “载波监听”是指每一个站在发送数据之前先要检测一下总线上是否有其他计算机在发送数据,如果有,则暂时不要发送数据,以免发生碰撞。

    总线上并没有什么“载波”。因此,“载波监听”就是用电子技术检测总线上有没有其他计算机发送的数据信号。“碰撞检测”就是计算机边发送数据边检测信道上的信号电压大小当几个站同时在总线上发送数据时,总线上的信号电压摆动值增大(互相叠加)当一个站检测到的信号电压摆动值超过一定的门限值时,就认为总线上至少有两个站同时在发送数据,表明产生了碰撞所谓“碰撞”就是发生了冲突。因此“碰撞检测”也称为“冲突检测”。在发生碰撞时,总线上传输的信号产生了严重的失真,无法从中恢复出有用的信息来每一个正在发送数据的站,一旦发现总线上出现了碰撞,就要立即停止发送,免得继续浪费网络资源,然后等待一段随机时间后再次发送。

由于电磁波在总线上的传播速率是有限的,当某个站监听到总线是空闲时,也可能总线并非真正是空闲的。如图 A 向 B 发出的信息,要经过一定的时间后才能传送到 B。B 若在 A 发送的信息到达 B 之前发送自己的帧 (因为这时 B 的载波监听检测不到 A 所发送的信息),则必然要在某个时间和 A 发送的帧发生碰撞。碰撞的结果是两个帧都变得无用,所以需要在发送期间进行碰撞检测,以检测冲突 。

图14 冲突检测

实例分析

图15 冲突检测

在发送端会在发送数据时进行碰撞检测,我们分析上图情况,如果A能够检测出碰撞,时间则A发送数据的时间必须大于 t = 2 τ δ t=2 \tau - \delta ,如果发送时间小于该值,也就是说数据已经发送完毕了,才收到碰撞的消息,而此时并不能够检测到已经发生了碰撞,碰撞检测失败。

如何解决这个问题呢?我们来看看如果发生了碰撞,转递回来最长需要多久。信号由A发送到B,碰撞越远离A,发送阶段耗时越长,回传的时间也越长,如果取极限:
t = lim δ 0 2 τ δ = 2 τ t =\lim_{\delta \rightarrow 0}2 \tau - \delta=2 \tau
也就是说,如果发送时间大于 2 τ 2 \tau ,就能够检测到碰撞,否则不能够检测到碰撞。

也就说最先发送数据帧的站,在发送数据帧后经过至多 2 τ 2 \tau 时间(两倍的端到端往返时延)就可知道发送的数据帧是否遭受了碰撞。以太网的端到端往返时延 2 τ 2 \tau 称为争用期,或碰撞窗口,经过争用期这段时间还没有检测到碰撞,才能肯定这次发送不会发生碰撞

随后我们一起来看看几个名词,及其解释

争用期的长度

10 M b i t / s 10 Mbit/s 以太网,发送 64 64 字节= 64 × 8 b = 512 b 64×8b=512b ,需要 512 / 10 M = 51.2 μ s 512/10M = 51.2 \mu s .要保证在发完一帧后不可能出现冲突,就要保证 2 τ < 51.2 μ s 2 \tau < 51.2 \mu s ,即 τ < 25.6 μ s \tau < 25.6 \mu s

τ \tau 的大小取决于传播距离和传播速度,所以一旦传播方式确定了,传播距离 必然不能大于某个恒定值,该值就是以太网的最大链路长度.

强化碰撞

当发送数据的站一旦发现发生了碰撞时:

  • 立即停止发送数据
  • 再继续发送若干比特的人为干扰信号,以便让所有用户都知道现在已经发生了碰撞

添加了强化碰撞后的发送数据就是如下样子的:

图16 添加人为干扰信号

二进制指数类型退避算法

如果发生碰撞后立即重传吗?显然不是。那什么时候需要重传呢?二进制指数型退避算法就能够解决这个问题。

发生碰撞的站在停止发送数据后,要推迟(退避)一个随机时间才能再发送数据。

  1. 从整数集合 [ 0 , 1 , , ( 2 k 1 ) ] [0, 1, … , (2^{k -1})] 中随机取一个数: r r
  2. 基本退避时间为争用期: 2 τ 2\tau ,重传所需时延为r倍的基本退避时间: r 2 τ r*2\tau
  3. 参数 k 按下面的公式计算:
    • k = M i n [ , 10 ] k = Min[重传次数, 10]
    • k < 10 k <10 时,参数 k 等于重传次数
    • 当重传达 16 次仍不能成功时即丢弃该帧,并向高层报告

以上就是二进制指数类型退避算法。

以太网还规定了帧间最小间隔为 9.6 μ s 9.6 μs ,相当于 96 96 比特时间。这样做是为了使刚刚收到数据帧的站的接收缓存来得及清理,做好接收下一帧的准备。

CSMA/CD 协议

经过上述的解释后,我们来看看CSMA/CD协议实现操作过程如下:

  1. 准备发送
  2. 检测信道:若检测到信道忙,则应不停地检测,一直等待信道转为空闲。若检测到信道空闲,并在 96 比特时间内信道保持空闲(保证了帧间最小间隔),就发送这个帧
  3. 检查碰撞:在发送过程中仍不停地检测信道,即网络适配器要边发送边监听。这里只有两种可能性:
    • 在争用期内一直未检测到碰撞:这个帧肯定能够发送成功。发送完毕后,其他什么也不做。然后回到 (1)
    • 在争用期内检测到碰撞:这时立即停止发送数据,并按规定发送人为干扰信号。适配器接着就执行指数退避算法:等待 r 倍 512 比特时间后,返回到步骤 (2),继续检测信道。但若重传达 16 次仍不能成功,则停止重传而向上报错

2.4 性能分析

在了解了CSMA/CD算法以后,我们来看看信道的利用率、最短帧、以及参数 α \alpha 与信道的关系

最短帧

为了保证发送数据的碰撞检测及其在发送期中能够检测到是否发生了碰撞限制了帧的长度、链路长度。
发送时间 T 0 = T_0= \frac{帧长}{带宽} 时延
τ = \tau= \frac{链路长度}{传播速度}
在发送中为了检测到是否发生了碰撞,所以发送时长应该大于争用期(两倍的时延) T 0 > τ T_0 > \tau ,即:
= T 0 > 2 τ = 2 (*) \frac{帧长}{带宽} = T_0 > 2*\tau = 2*\frac{链路长度}{传播速度} \tag{*}

在通常情况下传输速度是固定的,不参与讨论。结合上式就存在如下结论:

  • 在带宽一定的条件下,帧的长度收到链路长度限制,链路长度越长,最短帧长也就越长;
  • 在链路长度一定的条件下,带宽越大,最短帧长也就越长;
  • 在最短帧长一定的条件下,带宽越大,链路长度越短。

在上述推导之后: > 2 = 帧长 > 2* \frac{链路长度 * 带宽}{传播速度} = 传播延迟*带宽

按照标准,冲突周期是 51.2 u s 51.2us 传播速率是 10 M b p / s 10Mbp/s
= 51.2 u s 10 M b p / s = 512 b i t = 64 B 最短帧长 = 51.2us * 10Mbp/s = 512bit = 64B

利用率 与 参数 α \alpha

图17 发送一帧的平均时间

一个站在发送帧时出现了碰撞。经过一个争用期 2 τ 2\tau 后,可能又出现了碰撞。这样经过若干个争用期后,一个站发送成功了。假定发送帧需要的时间是 T 0 T_0 .利用率

U = T 0 + τ T 0 + τ + 2 n τ = T 0 + τ + 2 n τ 2 n τ T 0 + τ + 2 n τ = 1 2 n τ T 0 + τ + 2 n τ = 1 2 n T 0 τ + 1 + 2 n \begin{aligned} U =& \frac{T_0 + \tau}{T_0 + \tau + 2*n*\tau} \\ = & \frac{T_0 + \tau + 2*n*\tau - 2*n*\tau}{T_0 + \tau + 2*n*\tau} \\ = & 1 - \frac{2*n*\tau}{T_0 + \tau + 2*n*\tau} \\ = & 1- \frac{2*n}{\frac{T_0}{\tau}+ 1 + 2*n} \end{aligned}

要提高以太网的信道利用率,就要减小 2 n T 0 τ + 1 + 2 n \frac{2*n}{\frac{T_0}{\tau}+ 1 + 2*n} ,也就是要提高 T 0 τ \frac{T_0}{\tau} .在以太网中定义了参数 α = τ T 0 \alpha = \frac{\tau}{T_0} .为提高利用率,以太网的参数α应尽可能小.

信道利用率的最大值 S m a x S_{max}

在理想化的情况下,以太网上的各站发送数据都不会产生碰撞(这显然已经不是 C S M A / C D CSMA/CD ,而是需要使用一种特殊总线一旦空闲就有某一个站立即发送数据的调度方法发送一帧占用线路的时间是 T 0 + τ T_0 + \tau ,而帧本身的发送时间是 T 0 T_0 。于是我们可计算出理想情况下的极限信道利用率 S m a x S_{max} 为:
S m a x = T 0 T 0 + τ = 1 1 + τ T 0 = 1 1 + α S_{max} = \frac{T_0}{T_0 + \tau} = \frac{1}{1+ \frac{\tau}{T_0}} =\frac{1}{1+ \alpha}
从这里也能够看出, α \alpha 越小,利用率越大。

3 扩展的以太网

3.1 物理层扩展以太网

光调制解调器

主机使用光纤(通常是一对光纤)和一对光纤调制解调器连接到集线器。很容易使主机和几公里以外的集线器相连接。

图18 光调制解调器扩展

铜线中的电信号传播速度大约为 2.3 1 0 8 m / s 2.3*10^8 m/s ,光速按照 3 1 0 8 m / s 3*10^8 m/s
= T 0 > 2 τ = 2 (*) \frac{帧长}{带宽} = T_0 > 2*\tau = 2*\frac{链路长度}{传播速度} \tag{*}
按照这样计算,帧长与带宽不变的情况,传播速度变快了,链路长度就可以变长,这就是为什么能够很容易使主机和几公里以外的集线器相连接的原因。

集线器

使用多个集线器可连成更大的、多级、星形结构的以太网
例如,一个学院的三个系各有一个 10BASE-T 以太网,可通过一个主干集线器把各系的以太网连接起来,成为一个更大的以太网

图19 使用集线器扩展

3.2 数据链路层扩展以太网

扩展以太网更常用的方法是在数据链路层进行。早期,使用网桥,现在,使用以太网交换机

它根据 MAC 帧的目的地址对收到的帧进行转发和过滤。当网桥收到一个帧时,并不是向所有的接口转发此帧,而是先检查此帧的目的 MAC 地址,然后再确定将该帧转发到哪一个接口,或把它丢弃。

以太网交换机的自学习过程

以太网交换机运行自学习算法自动维护交换表
开始时,以太网交换机里面的交换表是空的

图 以太网交换机示意图

自学习

  • 交换机收到一帧后,先查找交换表,看其中有无与所收帧源地址匹配的项目
  • 如没有,就在交换表中增加一个项目(源地址、进入的接口和有效时间)
  • 如有,则把原有的项目进行更新(进入的接口或有效时间)

转发帧

  • 交换机要转发帧之前,查找交换表,看其中有无与所收帧目的地址匹配的项目
  • 如没有,则向所有其他接口转发(进入的接口除外)
  • 如有,则按交换表中给出的接口进行转发
  • 若交换表中给出的接口就是该帧进入交换机的接口,则应丢弃这个帧(因为这时不需要经过交换机进行转发)

交换机使用了生成树协议

按交换机自学习和转发方法,该帧的某个走向如下:离开交换机 #1 的接口 3 → 交换机 #2 的接口 1 → 接口 2 → 交换机 #1 的接口 4 → 接口 3 → 交换机 #2 的接口 1 →……这样就无限制地循环兜圈子下去,白白消耗了网络资源

图20 在两个交换机之间兜圈子的帧

IEEE 802.1D 标准制定了一个生成树协议 STP (Spanning Tree Protocol) 其要点是:不改变网络的实际拓扑,但切断某些逻辑链路,使得从一台主机到所有其他主机的路径是无环路的树状结构,从而消除了兜圈子现象.这里我们就不详细讨论。

4 总结

  • 链路是从一个结点到相邻结点的一段物理线路,数据链路则是在链路的基础上增加了一些必要的硬件(如网络适配器)和软件(如协议的实现)。
  • 数据链路层使用的信道主要有点对点信道广播信道两种。
  • 数据链路层传送的协议数据单元是帧。数据链路层的三个基本问题则是:封装成帧透明传输差错检测
  • 循环冗余检验CRC是一种检错方法,而帧检验序列FCS是添加在数据后面的冗余码。
  • 点对点协议PPP是数据链路层使用最多的一种协议,它的特点是:简单;只检测差错,而不是纠正差错;不使用序号也不进行流量控制;可同时支持多种网络层协议。
  • PPPoE是为宽带上网的主机使用的链路层协议。局域网的优点是:具有广播功能,从一个站点可很方便地访问全网;便于系统的扩展和逐渐演变;提高了系统的可靠性、可用性和生存性。
  • 共享通信媒体资源的方法有二
    • 一是静态划分信道(各种复用技术),
    • 二是动态媒体接入控制,又称为多点接入(随机接入或受控接入)。
  • IEEE802委员会曾把局域网的数据链路层拆成两个子层,即逻辑链路控制(LLC)子层(与传输媒体无关)和媒体接入控制(MAC)子层(与传输媒体有关)。但现在LLC子层已成为历史。
  • 计算机与外界局域网的通信要通过通信适配器(或网络适配器),它又称为网络接口卡或网卡。计算机的硬件地址就在适配器的ROM中。以太网采用无连接的工作方式,对发送的数据帧不进行编号,也不要求对方发回确认。目的站收到有差错帧就把它丢弃,其他什么也不做。
  • 以太网采用的协议是具有冲突检测的载波监听多点接入CSMA/CD.协议的要点是:发送前先监听,边发送边监听,一旦发现总线上出现了碰撞,就立即停止发送。然后按照退避算法等待一段随机时间后再次发送。因此,每一个站在自己发送数据之后的一小段时间内,存在着遭遇碰撞的可能性。以太网上各站点都平等地争用以太网信道。
  • 传统的总线以太网基本上都是使用集线器的双绞线以太网。这种以太网在物理上是星形网,但在逻辑上则是总线形网。集线器工作在物理层,它的每个接口仅仅简单地转发比特,不进行碰撞检测。
  • 以太网的硬件地址,即MAC地址实际上就是适配器地址或适配器标识符,与主机所在的地点无关。源地址和目的地址都是48位长
  • 以太网的适配器有过滤功能,它只接收单播帧、广播帧或多播帧。
  • 使用集线器可以在物理层扩展以太网(扩展后的以太网仍然是一个网络)。.
  • 交换式集线器常称为以太网交换机或第二层交换机(工作在数据链路层)。它就是一个多接口的网桥,而每个接口都直接与某台单主机或另一个集线器相连,且工作在全双工方式。以太网交换机能同时连通许多对的接口,使每一对相互通信的主机都能像独占通信媒体那样,无碰撞地传输数据。
  • 高速以太网有100 Mbit/s的快速以太网、吉比特以太网和10 Gbit/s 的10吉比特以太网。最近还发展到100吉比特以太网。在宽带接入技术中,也常使用高速以太网进行接入。

猜你喜欢

转载自blog.csdn.net/qq_40791129/article/details/105827868