数据链路层,简称链路层。两个主机之间的数据传输,总是在一段一段的链路上面传送的,也就是说,在两个相邻结点之间(主机与路由器之间 或者 两个路由器之间)传送数据是直接传送的(点对点)。这时,就需要使用专门的链路层的协议。在两个相邻结点之间传送数据时,能够保证数据链路层将网络层交下来的IP数据报组装成帧(framing),在两个相邻结点间的链路上“透明”地传送帧(frame)中的数据。
在物理层我们了解到数据在信道上通过信号进行传输,为了提高信道的利用率产生了复用技术:时分复用、频分复用、波分复用、码分复用、统计时分复用。而数据链路层将完成相邻节点之间的数据传输,但是数据链路层如何利用物理层提供的服务?数据传输中会产生那些问题?问题又是如何解决 ?在物理层中同一时刻不能有两个数据同时传输,数据连路层允许吗?它是怎么处理这个问题的?我们一一来探索。
在了解数据链路层之前,我们来看看初期两台计算机之间到底是怎么样连接起来的。下图显示的是基本的网络拓扑结构,我们具体来分析一下:
图1 计算机连接的几种方式
如上图,每一个结点我们都想象为一台计算机,每一条黑色的线我们都能理解为两台计算机之间连接的数据线,我们在这个基础上再来考虑数据到底是怎么样传输的。
我们再看网络的拓扑结构多种多样,但是在两台计算机之间的基本的连接方式不过就是两种:图1 中Star的计算机之间的直接相连方式,或则类似Bus的总线连接方式,由于连接方式的不同,我们在传输数据时需要注意的点也会不同。在数据链路层中,我们将Star中的连接信道称之为点对点信道,对于Bus中的信道称之为广播信道。 在了解了上述基本概念的基础上,我们再来了解数据链路层到底怎么传输数据。
在此基础上我们分析数据链路层需要解决的问题与将要面临的问题:数据链路层需要解决不同网络拓扑的情况下,相邻(或间接相邻,通过总线)的计算机数据传输问题。不论是直接相连还是通过总线相联,我们都需要解决一下问题:在传输时怎么利用物理层提供的服务?如果将传输的数据想象为一个信件,存不存在信封与内容的差别?如何判断一段数据的开始与结尾?传输过程中出错怎么办?
图2 数据的传输
如图显示了数据从主机 H 1 H_1 H1发送到主机 H 2 H_2 H2的示意图,在上部分显示中,数据从 H 1 H_1 H1出发,经过好几个路由器转发、经过了电话网、局域网、广域网等多个网络到达了主机 H 2 H_2 H2,从计算机层次结构的角度来看,就如下部分的红线所示,反复在不同的乘此结构间穿行,最终到达主机 H 2 H_2 H2。
本章我们重点研究数据链路层,所以从上图中蓝色箭头部分我们就要考虑从主机 H 1 H_1 H1的数据链路层如何发送数据到路由器 R 1 R_1 R1的数据链路层。从协议而言主机的数据链路层需要接收来自网络层的数据包,然后交给物理层转换为信号之后才能发送。
所谓链路(link)就是从一个结点到相邻结点的一段物理线路(有线或无线),而中间没有任何其他的交换结点。在进行数据通信时,两台计算机之间的通信路径往往要经过许多段这样的链路。可见链路只是一条路径的组成部分。
数据链路(data link)则是另 一个概念。这是因为当需要在一条线路上传送数据时,除了必须有一条物理线路外,还必须有一些必要的通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。现在最常用的方法是使用网络适配器实现这些协议。
简单理解就是 数 据 链 路 = 物 理 链 路 + 协 议 数据链路 = 物理链路 + 协议 数据链路=物理链路+协议
在数据链路层传输的基本的数据单元是帧,在网络层基本的传输的基本数据单元是IP数据报,在数据连路层就需要解决如何将IP数据包封装成为帧。下图显示的就是点对点通讯的示意图:
图3 点对点数据链路
点对点信道的数据链路层在进行通信时的主要步骤如下:
数据链路层不必考虑物理层如何实现比特传输的细节。我们甚至还可以更简单地设想好像是沿着两个数据链路层之间的水平方向把帧直接发送到对方,如图(b)所示。
在物理层发送的信号是没有起始与结束标志的,如果我我们需要传数据就需要为数据添加首位,同时数据链路层又需要将IP数据报也添加到帧中,这个问题综合而言就是封装成帧的问题。
将IP数据报封装成帧很简单,就像寄快递一样,将需要寄出去的东西存放在一个包裹中,在这里就是帧的数据部分中。如何解决起始与结束的标志问题呢?也很简单,添加一个帧开始符( S O H SOH SOH),添加一个帧结尾符( E O T EOT EOT)就好了,在接收数据时如果遇到了帧开始符就表示需要开始接收数据了,如果没有遇到就说明前面收到的可能都是噪声不用做处理。然后在此遇到帧结束符就说明数据传输结束,后面的部分数据不同在处理,数据封装示意图如下:
图4 PPP封装成帧
透明传输是指不管所传数据是什么样的比特组合,都应当能够在链路上传送。当所传数据中的比特组合恰巧与某一个控制信息完全一样时,就必须采取适当的措施,使接收方不会将这样的数据误认为是某种控制信息。这样才能保证数据链路层的传输是透明的。
上面这段话摘自百度百科,怎么理解这样一段话呢?简单就是我发送一段数据,你接收到的也是这样的一段数据,没有产生二义性 。那为什么数据连理层会产生这个问题呢?在数据链路层将网络层协议封装成帧时,会在首部和尾部分别添加SOH以及EOT这两个特殊字符,接收方是根据这两个字符来确定帧首和帧尾的(产生了二义性),如果上层协议发送过来的数据(即链路层的数据部分)包含EOT,那么接收方在解析这个帧的时候就会误以为数据已经结束,这种情况下传输数据就会产生问题。所以,如果链路层对这种情况没有特殊处理,那么就可以理解链路层为非透明传输(因为无法传输EOT这个字符)。
通常情况下解决这个问题可以在数据部分的 S O H SOH SOH、 E O T EOT EOT字符前添加一转义字符 E S C ESC ESC,在传输时如果直接接收到 S O H SOH SOH、 E O T EOT EOT字符还是表示为帧的开始与结束标志,但是如果接收时接收到了 E S C ESC ESC然后接收到 S O H SOH SOH、 E O T EOT EOT,就说明这两个字符不是帧的开始与结束标志,是帧数据的一部分。这样就完成了透明传输的问题,具体怎么操作我们在后面会继续深入的了解。
在物理层中我们就讨论过,现实的通信链路都不会是理想的。这就是说,比特在传输过程中可能会产生差错:1可能会变成0,而0也可能变成1。这就叫做比特差错。很显然我们不希望产生比特差错,但是如果已经出现了比特差错我们又要怎么办呢?如何控制差错?
在数据链路层采用了校验码的方式,在传输前生成校验码同数据一起发送,接受后通过校验码校验数据是否正确,如果校验出错就直接丢弃该帧,如果没有出错就直接保存,解析,并将数据部分上交给网络层。在使用中使用最为广泛的就是CRC循环冗余校验。
CRC循环冗余校验
- 在发送端,先把数据划分为组。假定待传送某组数据M,其长度为k 位,在M的后面再添加差错检测用的n位冗余码一起发送。
- 冗余码的生成(计算过程)
- 将M左移n位,右边填零,变成(k+n)位。这相当于在M后面添加n个0
- 用左移后的数除以(n+1)位除数P(模二除法,两种理解1、只有加减运算一样,进位不进,借位不借,2、异或运算。),得到商Q,及n位余数R
- 将 n 位余数R 作为冗余码,拼接在数据 M 后面,发送出去
- 在接收端将收到的数据进行模二除法,若得到的余数为0,则表示收到的数据没有发生错误,否则数据在传输中输错,丢弃该数据。
- 数据校验,对接收到的数据进行模二除法得到余数,余数为0 ,表示没有差错,若存在差错,丢弃该帧。
在上面的计算过程中我们有一个是不知道的,就是除数P到底怎么获取,一般情况下我们采用多项式表示这样一个除数,用多项式 P ( X ) = x 3 + x 2 + 1 P(X)=x^3+x^2+ 1 P(X)=x3+x2+1表示上面的除数 P = 1101 P= 1101 P=1101 (最高位对应于 x 3 x^3 x3,最低位对应于 x 0 x^0 x0)。多项式 P ( X ) P(X) 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 CRC−16=x16+x15+x2+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 CRC−CCITT=x16+x12+x5+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 CRC−32=x32+x26+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
例如:要发送数据为1101011011, 生成多项式为 P ( X ) = X 4 + X + 1 P(X)=X^4+X+1 P(X)=X4+X+1,CRC的校验过程
- 由生成多项式得到除数为10011,将发送数据左移4位得到1101011011 - 0000,并做模二除法计算过程如下:
2. 发送数据1101011011 - 1110
上述的差错控制只能用于帧内的数据是否发生了变化,对于帧之间的关系是难以保证的,其中就包括了:
在上面我了解了数据链路层的基本概念与基本问题,我们知道了数据链路层中有点对点信道,也有广播信道,这两种信道传输数据的控制方式是不一样的,所以在下面我们分为两种信道,分别讨论数据链路中存在的基本问题进行讨论。
在点对点信道中采用的是PPP协议,广播信道中使用的是CSMA/CD协议,在接下来的学习中我们就必须知道这两个协议到底是怎么处理数据链路层的三个基本问题–封装成帧、透明传输、差错控制。我们还是将数据链路层的数据传输比作收发快递,但是我们怎么表示地址?我们继续探究。
为解决封装成帧的问题一般都是采用规定帧格式,按照帧的格式组装数据就能够封装成帧。在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,地址字段也就不适用, 但是为了保证协议帧的可扩展性就保留了这个字符,提供后期协议变化,适应新环境而设置的。
在0.2.2 透明传输,我们讨论了解决透明传输的一般方案,就是使用转义字符,在PPP协议中为解决透明传输问题,就需要将控制字符与一般的字符区分开来,于是产生了字符填充方式与比特填充方式两种:
PPP 协议用在异步链路时,使用字符填充方法来实现透明传输,具体操作如下:
数据链路层要发送的数据是 A2 5F 7 E 7E 7E 8B 7 D 7D 7D 54 5C 02 02 02 20
实际交给物理层发送的应该是 A2 5F 7 D 5 E 7D \,\, 5E 7D5E 8B 7 D 5 D 7D \,\, 5D 7D5D 54 5C 7 D 22 7D \,\, 22 7D22 20
接收端收到上述数据后应该还原成 A2 5F 7 E 7E 7E 8B 7 D 7D 7D 54 5C 02 02 02 20
在上述的字节填充中存在三种转义
- 0x7E的转义 => 0x7D, 0x5E
- 0x7D的转义 => 0x7D, 0x5D
- 0xab<0x20的转义 => 0x7D, 0x(a+20)b
在每次的转义中每次的转义都会添加一个字符的大小,如果转义的字符较多,则传输的数据中添加的转义序列也会较多,就产生了较大的带宽浪费。为解决这个问题,就产生了零比特传输方式
PPP 协议用在同步链路(SONET/SDH)时,采用零比特填充方法来实现透明传输
图6 零比特填充方式
传输链路按同步方式分两种:
- 异步传输:对字节进行同步,而没有比特同步
- 同步传输:对比特进行同步
两种填充方法:
- 当 PPP 用在异步传输链路时,使用软件进行特定字符填充
- 当 PPP 用在同步传输链路时,采用硬件进行零比特填充
PPP协议的差错检测就是使用CRC循环冗余校验,在0.2.3 差错控制我们讨论了差错检测的能够使用CRC循环冗余校验且讨论了具体的计算方法,在PPP格式中PPP帧的格式倒数第二个字段就是FCS存放帧校验序列,也就是CRC 校验得到的余数 R。
顺便说一下, 循环冗余检验CRC和帧检验序列FCS并不是同一个概念。CRC是一种检错方法,而FCS是添加在数据后面的冗余码,在检错方法上可以选用CRC,但也可不选用CRC.
在上述基础上需要强调的就是PPP协议支持同步传输与异步传输。
PPP协议有三个组成部分:
PPP协议工作过程如下:
此时数据链路层的配置完毕,可投入使用,当数据链路层取消链接时会进行如下操作
总结就是由下向上逐层建立,由上到下逐层释放。图解可表示为:
图7 PPP协议工作过程
至此,我们就讨论完了点对点信号的PPP协议,在其中我们并没有使用地址这个东西,虽然在PPP帧格式中存在这个保留字段。这个部分除了解决了三个基本问题:封装成帧(按照帧格式组织数据)、透明传输(字节填充、字符填充)、差错检测(CRC循环冗余校验)。接下来我们讨论广播信道的CSMA/CD协议。
单纯的点对点通信存在众多局限,难以应用到大范围上。一般使用的局域网有如下优点:
在通常情况下局域网的网络结构都是拓扑结构,如下图。这种情况下的点对点通信就不在适用,应该使用能够广播的相应的协议。
图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协议。
通常情况下所说的网络适配器就是指网卡,适配器的重要功能包括:
请注意,虽然我们把适配器的内容放在数据链路层中讲授,但适配器所实现的功能却包含了数据链路层及物理层这两个层次的功能。现在的芯片的集成度都很高,以致很难把一个适配器的功能严格按照层次的关系精确划分开。
适配器在接收和发送各种帧时,不使用计算机的CPU.这时计算机中的CPU可以处理其他任务。当适配器收到有差错的帧时,就把这个帧直接丢弃而不必通知计算机。当适配器收到正确的帧时,它就使用中断来通知该计算机,并交付协议栈中的网络层。当计算机要发送IP数据报时,就由协议栈把IP数据报向下交给适配器,组装成帧后发送到局域网。
图10 网络适配器结构示意图
在广播信道中,我们就需要使用到地址这个东西了,有了地址我们才能知道信息从哪里来,到哪里去。在局域网中,硬件地址又称为物理地址或MAC地址。我们来详细了解一下。
IEEE 802 标准规定 MAC 地址字段可采用 6 字节 ( 48位) 或 2 字节 ( 16 位) 这两种中的一种。由IEEE 的注册管理机构 RA 负责向厂家分配地址字段 6 个字节中的前三个字节 (即高位 24 位),称为组织唯一标识符。地址字段 6 个字节中的后三个字节 (即低位 24 位) 由厂家自行指派,称为扩展唯一标识符。必须保证生产出的适配器没有重复地址。
图11 MAC地址结构示意图
请注意,如果连接在局域网上的主机或路由器安装有多个适配器,那么这样的主机或路由器就有多个“地址”。更准确些说,这种 48 位“地址”应当是某个接口的标识符。
IEEE 规定地址字段的第一字节(最高地址)的最低位为 I/G 位。I/G 表示 Individual / Group
可见,IEEE 只分配地址字段前三个字节中的 23 位。当 I/G 位分别为 0 和 1 时,一个地址块可分别生成 2 23 2^{23} 223 个单个站地址和 2 23 2^{23} 223个组地址。所有 48 位都为 1 时,为广播地址。只能作为目的地址.
使用IEEE 把地址字段第一字节(最高地址)的第2 低位规定为 G/L 位,表示 Global / Local
适配器从网络上每收到一个 MAC 帧就首先用硬件检查 MAC 帧中的 MAC 地址:
“发往本站的帧”包括以下三种帧:
所有的适配器都至少能够识别前两种帧,即都能够识别单播地址和广播地址,有的适配器可用编程方法识别多播地址,只有目的地址才能使用广播地址和多播地址,以混杂方式 (promiscuous mode) 工作的以太网适配器只要“听到”有帧在以太网上传输,不管是否与自己地址相匹配都会接收下来.
在上述说明之后,我们重点需要了解的就是以下几点:
- 主机或路由器可以安装多个适配器,相对应的就是MAC应当是某个接口的标识符
- MAC地址前24位为组织唯一标识,后24位为符扩展唯一标识符,
MAC地址的使用在初学阶段可以了解一下,暂不做为重点,了解就好了(个人建议)。
在封装成帧的问题中按照给定帧的格式组织帧,如下图:
图12 MAC帧结构
我们与PPP协议帧对比之后发现,MAC帧没有帧开始定界符,没有帧结束定界符,那MAC帧如何解决这个接收的问题呢?
实际上帧的定界工作交给了物理层完成,如上图所示,在发送帧之前需要将发送7个字节的帧同步码与1个字节的帧开始定界符,表示帧可以开始接收了,等到数据发送完毕之后就会有一段时间的空闲期,表示数据发送完毕。这样就保证了数据的开始与结束。
在此基础上我们需要知道,那些帧是无效帧呢?
对于检查出的无效 MAC 帧就简单地丢弃。以太网不负责重传丢弃的帧.
由于传输的数据中没有需要转义的字符,不存在透明传输问题。同PPP协议,在帧格式中保留了FCS帧校验序列字段,同样能够使用CRC 循环冗余校验实现差错控制。
最初的以太网是将许多计算机都连接到一根总线上。当初认为这样的连接方法既简单又可靠,因为总线上无有源器件
图13 总线传输结构
在发送数据时,总线上的每一个工作的计算机都能检测到 B 发送的数据信号,由于只有计算机 D 的地址与数据帧首部写入的地址一致,因此只有 D 才接收这个数据帧,其他所有的计算机(A, C 和 E)都检测到不是发送给它们的数据帧,因此就丢弃这个数据帧而不能够收下来,在具有广播特性的总线上实现了一对一的通信 。
为了通信的简便,以太网采取了两种重要的措施:
在物理层我们讨论过信道上不能够同时有两个信号进行传递,于是能够使用时分复用、统计时分复用、频分复用、波分复用、码分复用等复用技术实现两点信道的冲突问题,PPP协议就是利用了物理层提供的这个服务也就不需要解决这给问题,而在广播信道中这个问题就需要再次的提出并且解决。
共享信道要着重考虑的一个问题就是如何使众多用户能够合理而方便地共享通信媒体资源。这在技术上有两种方法:
静态划分信道,如在第2章的2.4节中已经介绍过的频分复用、时分复用、波分复用和码分复用等。用户只要分配到了信道就不会和其他用户发生冲突。但这种划分信道的方法代价较高,不适合于局域网使用。
动态媒体接入控制,它又称为多点接入(multiple acess),, 其特点是信道并非在用户通信时固定分配给用户。这里又分为以下两类:
● 随机接入:随机接入的特点是所有的用户可随机地发送信息。但如果恰巧有两个或更多的用户在同一时刻发送信息,那么在共享媒体上就要产生碰撞(即发生了冲突),使得这些用户的发送都失败。因此,必须有解决碰撞的网络协议。
● 受控接入 :受控接入的特点是用户不能随机地发送信息而必须服从一定的控制。这类的典型代表有分散控制的令牌环局域网和集中控制的多点线路探询(polling),或称为轮询。
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 t=2τ−δ,如果发送时间小于该值,也就是说数据已经发送完毕了,才收到碰撞的消息,而此时并不能够检测到已经发生了碰撞,碰撞检测失败。
如何解决这个问题呢?我们来看看如果发生了碰撞,转递回来最长需要多久。信号由A发送到B,碰撞越远离A,发送阶段耗时越长,回传的时间也越长,如果取极限:
t = lim δ → 0 2 τ − δ = 2 τ t =\lim_{\delta \rightarrow 0}2 \tau - \delta=2 \tau t=δ→0lim2τ−δ=2τ
也就是说,如果发送时间大于 2 τ 2 \tau 2τ,就能够检测到碰撞,否则不能够检测到碰撞。
也就说最先发送数据帧的站,在发送数据帧后经过至多 2 τ 2 \tau 2τ 时间(两倍的端到端往返时延)就可知道发送的数据帧是否遭受了碰撞。以太网的端到端往返时延 2 τ 2 \tau 2τ称为争用期,或碰撞窗口,经过争用期这段时间还没有检测到碰撞,才能肯定这次发送不会发生碰撞
随后我们一起来看看几个名词,及其解释
10 M b i t / s 10 Mbit/s 10Mbit/s 以太网,发送 64 64 64字节= 64 × 8 b = 512 b 64×8b=512b 64×8b=512b,需要 512 / 10 M = 51.2 μ s 512/10M = 51.2 \mu s 512/10M=51.2μs.要保证在发完一帧后不可能出现冲突,就要保证 2 τ < 51.2 μ s 2 \tau < 51.2 \mu s 2τ<51.2μs,即 τ < 25.6 μ s \tau < 25.6 \mu s τ<25.6μs
τ \tau τ的大小取决于传播距离和传播速度,所以一旦传播方式确定了,传播距离 必然不能大于某个恒定值,该值就是以太网的最大链路长度.
当发送数据的站一旦发现发生了碰撞时:
添加了强化碰撞后的发送数据就是如下样子的:
图16 添加人为干扰信号
如果发生碰撞后立即重传吗?显然不是。那什么时候需要重传呢?二进制指数型退避算法就能够解决这个问题。
发生碰撞的站在停止发送数据后,要推迟(退避)一个随机时间才能再发送数据。
以上就是二进制指数类型退避算法。
以太网还规定了帧间最小间隔为 9.6 μ s 9.6 μs 9.6μs,相当于 96 96 96比特时间。这样做是为了使刚刚收到数据帧的站的接收缓存来得及清理,做好接收下一帧的准备。
经过上述的解释后,我们来看看CSMA/CD协议实现操作过程如下:
在了解了CSMA/CD算法以后,我们来看看信道的利用率、最短帧、以及参数 α \alpha α与信道的关系
为了保证发送数据的碰撞检测及其在发送期中能够检测到是否发生了碰撞限制了帧的长度、链路长度。
发送时间 T 0 = 帧 长 带 宽 T_0= \frac{帧长}{带宽} T0=带宽帧长时延
τ = 链 路 长 度 传 播 速 度 \tau= \frac{链路长度}{传播速度} τ=传播速度链路长度
在发送中为了检测到是否发生了碰撞,所以发送时长应该大于争用期(两倍的时延) T 0 > τ T_0 > \tau T0>τ,即:
帧 长 带 宽 = T 0 > 2 ∗ τ = 2 ∗ 链 路 长 度 传 播 速 度 (*) \frac{帧长}{带宽} = T_0 > 2*\tau = 2*\frac{链路长度}{传播速度} \tag{*} 带宽帧长=T0>2∗τ=2∗传播速度链路长度(*)
在通常情况下传输速度是固定的,不参与讨论。结合上式就存在如下结论:
在上述推导之后: 帧 长 > 2 ∗ 链 路 长 度 ∗ 带 宽 传 播 速 度 = 传 播 延 迟 ∗ 带 宽 帧长 > 2* \frac{链路长度 * 带宽}{传播速度} = 传播延迟*带宽 帧长>2∗传播速度链路长度∗带宽=传播延迟∗带宽
按照标准,冲突周期是 51.2 u s 51.2us 51.2us 传播速率是 10 M b p / s 10Mbp/s 10Mbp/s
最 短 帧 长 = 51.2 u s ∗ 10 M b p / s = 512 b i t = 64 B 最短帧长 = 51.2us * 10Mbp/s = 512bit = 64B 最短帧长=51.2us∗10Mbp/s=512bit=64B
图17 发送一帧的平均时间
一个站在发送帧时出现了碰撞。经过一个争用期 2 τ 2\tau 2τ后,可能又出现了碰撞。这样经过若干个争用期后,一个站发送成功了。假定发送帧需要的时间是 T 0 T_0 T0.利用率
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} U====T0+τ+2∗n∗τT0+τT0+τ+2∗n∗τT0+τ+2∗n∗τ−2∗n∗τ1−T0+τ+2∗n∗τ2∗n∗τ1−τT0+1+2∗n2∗n
要提高以太网的信道利用率,就要减小 2 ∗ n T 0 τ + 1 + 2 ∗ n \frac{2*n}{\frac{T_0}{\tau}+ 1 + 2*n} τT0+1+2∗n2∗n,也就是要提高 T 0 τ \frac{T_0}{\tau} τT0.在以太网中定义了参数 α = τ T 0 \alpha = \frac{\tau}{T_0} α=T0τ.为提高利用率,以太网的参数α应尽可能小.
在理想化的情况下,以太网上的各站发送数据都不会产生碰撞(这显然已经不是 C S M A / C D CSMA/CD CSMA/CD,而是需要使用一种特殊总线一旦空闲就有某一个站立即发送数据的调度方法发送一帧占用线路的时间是 T 0 + τ T_0 + \tau T0+τ,而帧本身的发送时间是 T 0 T_0 T0。于是我们可计算出理想情况下的极限信道利用率 S m a x S_{max} Smax 为:
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} Smax=T0+τT0=1+T0τ1=1+α1
从这里也能够看出, α \alpha α越小,利用率越大。
主机使用光纤(通常是一对光纤)和一对光纤调制解调器连接到集线器。很容易使主机和几公里以外的集线器相连接。
图18 光调制解调器扩展
铜线中的电信号传播速度大约为 2.3 ∗ 1 0 8 m / s 2.3*10^8 m/s 2.3∗108m/s,光速按照 3 ∗ 1 0 8 m / s 3*10^8 m/s 3∗108m/s。
帧 长 带 宽 = T 0 > 2 ∗ τ = 2 ∗ 链 路 长 度 传 播 速 度 (*) \frac{帧长}{带宽} = T_0 > 2*\tau = 2*\frac{链路长度}{传播速度} \tag{*} 带宽帧长=T0>2∗τ=2∗传播速度链路长度(*)
按照这样计算,帧长与带宽不变的情况,传播速度变快了,链路长度就可以变长,这就是为什么能够很容易使主机和几公里以外的集线器相连接的原因。
使用多个集线器可连成更大的、多级、星形结构的以太网
例如,一个学院的三个系各有一个 10BASE-T 以太网,可通过一个主干集线器把各系的以太网连接起来,成为一个更大的以太网
图19 使用集线器扩展
扩展以太网更常用的方法是在数据链路层进行。早期,使用网桥,现在,使用以太网交换机。
它根据 MAC 帧的目的地址对收到的帧进行转发和过滤。当网桥收到一个帧时,并不是向所有的接口转发此帧,而是先检查此帧的目的 MAC 地址,然后再确定将该帧转发到哪一个接口,或把它丢弃。
以太网交换机运行自学习算法自动维护交换表
开始时,以太网交换机里面的交换表是空的
图 以太网交换机示意图
自学习:
转发帧:
按交换机自学习和转发方法,该帧的某个走向如下:离开交换机 #1 的接口 3 → 交换机 #2 的接口 1 → 接口 2 → 交换机 #1 的接口 4 → 接口 3 → 交换机 #2 的接口 1 →……这样就无限制地循环兜圈子下去,白白消耗了网络资源
图20 在两个交换机之间兜圈子的帧