我是靠谱客的博主 火星上狗,最近开发中收集的这篇文章主要介绍【计算机网络系列】数据链路层③:使用广播信道的数据链路层(CSMA/CD协议和以太网的MAC帧)使用广播信道的数据链路层,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


数据链路层最重要的内容是:

  • 数据链路层的点对点信道广播信道的特点,以及这两种信道所使用的协议(PPP协议以及CSMA/CD协议)的特点。
  • 数据链路层的三个基本问题:封装成帧透明传输差错检测
  • 以太网MAC层硬件地址
  • 适配器转发器集线器网桥以太网交换机的作用以及使用场合。

本文主要讲解使用广播信道的数据链路层,这包括局域网的基本知识,CSMA/CD协议,以太网的信道利用率以及以太网的MAC层(MAC层的硬件地址及MAC帧格式)。


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

广播信道可以进行一对多的通信。下面要讨论的局域网使用的就是广播信道。局域网是在20世纪70年代末发展起来的。局域网技术在计算机网络中占有非常重要的地位

局域网的数据链路层

局域网最主要的特点是:网络为一个单位所拥有,且地理范围站点数目有限

在局域网刚刚出现时,局域网比广域网具有较高的数据率较低的时延较小的误码率。但随着光纤技术在广域网中普遍使用,现在广域网也具有很高的数据率和很低的误码率。

局域网具有如下的一些优点:

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

局域网可按网络拓扑进行分类。

  • 下图(a)是星形网。由于集线器(hub)的出现和双绞线大量用于局域网中,星形以太网以及多级星形结构的以太网获得了非常广泛的应用。
  • 下图(b)是环形网,下图©为总线网,各站直接连在总线上。总线两端的匹配电阻吸收在总线上传播的电磁波信号的能量,避免在总线上产生有害的电磁波反射。总线网以传统以太网最为著名,但以太网后来又演变成了星形网。

经过四十多年的发展,以太网的速率已大大提高。现在最常用的以太网的速率是1Gbit/s(家庭或中小企业)、10Gbit/s(数据中心)和100Gbit/s(长距离传输),且其速率仍在继续提高。

现在以太网已成为了局域网的同义词,因此从本节开始都是讨论以太网技术。
在这里插入图片描述

局域网可使用多种传输媒体。

  • 双绞线最便宜,原来只用于低速(1~2Mbit/s)基带局域网。现在从10Mbit/s至10Gbit/s的局域网都可使用双绞线。双绞线已成为局域网中的主流传输媒体。
  • 当数据率更高时,往往需要使用光纤作为传输媒体。

必须指出,局域网工作的层次跨越了数据链路层物理层。由于局域网技术中有关数据链路层的内容比较丰富,因此我们就把局域网的内容放在数据链路层中讨论。但这并不表示局域网仅仅和数据链路层有关。

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

  • 静态划分信道,如频分复用、时分复用、波分复用和码分复用等。用户只要分配到了信道就不会和其他用户发生冲突。但这种划分信道的方法代价较高,不适合于局域网使用。
  • 动态媒体接入控制,它又称为多点接入(multiple access),其特点是信道并非在用户通信时固定分配给用户。这里又分为以下两类:
    • 随机接入:随机接入的特点是所有的用户可随机地发送信息。但如果恰巧有两个或更多的用户在同一时刻发送信息,那么在共享媒体上就要产生碰撞(即发生了冲突),使得这些用户的发送都失败。因此,必须有解决碰撞的网络协议。
    • 受控接入:受控接入的特点是用户不能随机地发送信息而必须服从一定的控制。这类的典型代表有分散控制的令牌环局域网集中控制的多点线路探询(polling),或称为轮询。

属于随机接入的以太网将被重点讨论。受控接入则由于目前在局域网中使用得较少。

由于以太网的数据率已演进到每秒吉比特甚至高达400吉比特,因此通常就用“传统以太网”来表示最早流行的10Mbit/s速率的以太网。

以太网的两个主要标准

IEEE 802委员会的802.3工作组1983年制定了第一个IEEE的以太网标准IEEE 802.3,数据率为10Mbit/s。802.3局域网对以太网标准中的帧格式做了很小的一点更动,但允许基于这两种标准的硬件实现可以在同一个局域网上互操作。

为了使数据链路层能更好地适应多种局域网标准,IEEE 802委员会把局域网的数据链路层拆成两个子层,即逻辑链路控制LLC(Logical Link Control)子层媒体接入控制MAC(Medium Access Control)子层。与接入到传输媒体有关的内容都放在MAC子层,而LLC子层则与传输媒体无关,不管采用何种传输媒体和MAC子层的局域网对LLC子层来说都是透明的(如下图所示)。
在这里插入图片描述

事实上,IEEE 802委员会制定的逻辑链路控制子层LLC(即IEEE 802.2标准)的作用已经消失了,很多厂商生产的适配器上就仅装有MAC协议而没有LLC协议。

适配器的作用

首先我们从一般的概念上讨论一下计算机是怎样连接到局域网上的。

计算机与外界局域网的连接是通过适配器(adapter)。适配器本来是在主机箱内插入的一块网络接口板。这种接口板又称为网络接口卡NIC(Network Interface Card)或简称为“网卡”。在这种通信适配器上面装有处理器存储器(包括RAM和ROM)。

  • 适配器局域网之间的通信是通过电缆双绞线串行传输方式进行的,
  • 适配器计算机之间的通信则是通过计算机主板上的IO总线并行传输方式进行的。

因此,适配器的一个重要功能就是要进行数据串行传输和并行传输的转换。由于网络上的数据率和计算机总线上的数据率并不相同,因此在适配器中必须装有对数据进行缓存的存储芯片。在主板上插入适配器时,还必须把管理该适配器的设备驱动程序安装在计算机的操作系统中。这个驱动程序以后就会告诉适配器,应当从存储器的什么位置上把多长的数据块发送到局域网,或者应当在存储器的什么位置上把局域网传送过来的数据块存储下来。除此之外,适配器还要能够实现以太网协议

请注意,适配器所实现的功能包含了数据链路层物理层这两个层次的功能。现在的芯片的集成度都很高,很难把一个适配器的功能严格按照层次的关系精确划分开。

适配器在接收和发送各种帧时,不使用计算机的CPU。这时计算机中的CPU可以处理其他任务。

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

下图表示适配器的作用。注意,计算机的硬件地址就在适配器的ROM中,而计算机的软件地址(IP地址)则在计算机的存储器中。
在这里插入图片描述

CSMA/CD协议

最早的以太网是将许多计算机都连接到一根总线上。当初认为这种连接方法既简单又可靠,因为在那个时代普遍认为:“有源器件不可靠,而无源的电缆线才是最可靠的”。

总线的特点是:当一台计算机发送数据时,总线上的所有计算机都能检测到这个数据。这种就是广播通信方式。但我们并不总是要在局域网上进行一对多的广播通信。为了在总线上实现一对一的通信,可以使每一台计算机的适配器都拥有一个与其他适配器都不同的地址。在发送数据帧时,在帧的首部写明接收站的地址,仅当数据帧中的目的地址与适配器ROM中存放的硬件地址一致时,该适配器才能接收这个数据帧。适配器对不是发送给自己的数据帧就丢弃。这样,具有广播特性的总线上就实现了一对一的通信。

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

  1. 采用较为灵活的无连接的工作方式,即不必先建立连接就可以直接发送数据。适配器对发送的数据帧不进行编号,也不要求对方发回确认。这样做可以使以太网工作起来非常简单,而局域网信道的质量很好,因通信质量不好产生差错的概率是很小的。因此,以太网提供的服务是尽最大努力的交付,即不可靠的交付。当目的站收到有差错的数据帧时(例如,用CRC查出有差错),就把帧丢弃,其他什么也不做。对有差错帧是否需要重传则由高层来决定。例如,如果高层使用TCP协议,那么TCP就会发现丢失了一些数据。于是经过一定的时间后,TCP就把这些数据重新传递给以太网进行重传。但以太网并不知道这是重传帧,而是当作新的数据帧来发送。
  2. 以太网发送的数据都使用曼彻斯特(Manchester)编码的信号。二进制基带数字信号通常就是高、低电压交替出现的信号。使用这种信号的最大问题就是当出现一长串连续的1或连续的0时,接收端就无法从收到的比特流中提取位同步(即比特同步)信号。如下图所示,曼彻斯特编码的编码方法是把每一个码元再分成两个相等的间隔。码元1是前一个间隔为低电压而后一个间隔为高电压。码元0则正好相反,从高电压变到低电压(也可采用相反的约定,即1是“前高后低”而0是“前低后高”)。这样就保证了在每一个比特的正中间出现一次电压的转换,而接收端就利用这种电压的转换很方便地把位同步信号提取出来。但是从曼彻斯特编码的波形图也不难看出其缺点,这就是它所占的频带宽度比原始的基带信号增加了一倍(因为每秒传送的码元数加倍了)。
    在这里插入图片描述

总线上只要有一台计算机在发送数据,总线的传输资源就被占用。因此,在同一时间只能允许一台计算机发送数据,否则各计算机之间就会互相干扰,使得所发送数据被破坏。因此,如何协调总线上各计算机的工作就是以太网要解决的一个重要问题。以太网采用最简单的随机接入,但有很好的协议用来减少冲突发生的概率。以太网使用的载波监听多点接入/碰撞检测CSMA/CD(Carrier Sense Multiple Access with Collision Detection)协议来协调这种冲突。下面介绍CSMA/CD协议的要点。

  • 多点接入”就是说明这是总线型网络,许多计算机以多点接入的方式连接在一根总线上。协议的实质是“载波监听”和“碰撞检测”。
  • 载波监听”也就是“边发送边监听”。我们知道,无论是想要发送数据之前,还是在发送数据之中,每个站都必须不停地检测信道。在发送前检测信道,是为了避免冲突。如果检测出已经有其他站在发送,则本站就暂时不要发送数据。在发送中检测信道,是为了及时发现如果有其他站也在发送,就立即中断本站的发送。这就称为碰撞检测
  • 碰撞检测”是适配器边发送数据边检测信道上的信号电压的变化情况。当两个或几个站同时在总线上发送数据时,总线上的信号电压变化幅度将会增大(互相叠加)。当适配器检测到的信号电压变化幅度超过一定的门限值时,就认为总线上至少有两个站同时在发送数据,表明产生了碰撞。所谓“碰撞”就是发生了冲突。因此“碰撞检测”也称为“冲突检测”。这时,总线上传输的信号产生了严重的失真,无法从中恢复出有用的信息来。因此,任何一个正在发送数据的站,一旦发现总线上出现了碰撞,其适配器就要立即停止发送,免得继续进行无效的发送,白白浪费网络资源,然后等待一段随机时间后再次发送。

既然每一个站在发送数据之前已经监听到信道为“空闲”,那么为什么还会出现数据在总线上的碰撞呢?这是因为电磁波在总线上总是以有限的速率传播的。

这和我们开讨论会时相似。一听见会场安静,我们就立即发言,但偶尔也会发生几个人同时抢着发言而产生冲突的情况。

下图所示的例子可以说明这种情况。设图中的局域网两端的站A和B相距1km,用同轴电缆相连。电磁波在1km电缆的传播时延约为5us。因此,A向B发出的数据,在约5us后才能传送到B。换言之,B若在A发送的数据到达B之前发送自己的帧(因为这时B的载波监听检测不到A所发送的信息),则必然要在某个时间和A发送的帧发生碰撞。碰撞的结果是两个帧都变得无用。在局域网的分析中,常把总线上的单程端到端传播时延记为 t t t。发送数据的站希望尽早知道是否发生了碰撞。那么,A发送数据后,最迟要经过多长时间才能知道自己发送的数据和其他站发送的数据有没有发生碰撞?从下图不难看出,这个时间最多是两倍的总线端到端的传播时延( 2 τ 2tau 2τ),或总线的端到端往返传播时延。由于局域网上任意两个站之间的传播时延有长有短,因此局域网必须按最坏情况设计,即取总线两端的两个站之间的传播时延(这两个站之间的距离最大)为端到端传播时延。
在这里插入图片描述

显然,在使用CSMA/CD协议时,一个站不可能同时进行发送和接收(但必须边发送边监听信道)。因此使用CSMA/CD协议的以太网不可能进行全双工通信而只能进行双向交替通信半双工通信)。

下面是图中的一些重要的时刻。

  • t = 0 t=0 t=0时,A发送数据。B检测到信道为空闲。
  • t = τ − δ t = tau-delta t=τδ时(这里 τ > δ > 0 tau>delta>0 τ>δ>0),A发送的数据还没有到达B时,由于B检测到信道是空闲的,因此B发送数据。
  • 经过时间 δ / 2 delta/2 δ/2后,即在 t = τ − δ / 2 t= tau -delta/2 t=τδ/2时,A发送的数据和B发送的数据发生了碰撞,但这时A和B都不知道发生了碰撞。
  • t = τ t=tau t=τ时,B检测到发生了碰撞,于是停止发送数据。
  • t = 2 τ − δ t= 2tau- delta t=2τδ时,A也检测到发生了碰撞,因而也停止发送数据。

A和B发送数据均失败,它们都要推迟一段时间再重新发送。

由此可见,每一个站在自己发送数据之后的一小段时间内,存在着遭遇碰撞的可能性。这一小段时间是不确定的,它取决于另一个发送数据的站到本站的距离。因此,以太网不能保证在检测到信道空闲后的某一时间内,一定能够把自己的数据帧成功地发送出去(因为存在产生碰撞的可能)。以太网的这一特点称为发送的不确定性。如果希望在以太网上发生碰撞的机会很小,必须使整个以太网的平均通信量远小于以太网的最高数据率。

从上图可看出,最先发送数据帧的A站,在发送数据帧后至多经过时间 τ tau τ就可知道所发送的数据帧是否遭受了碰撞。这就是 δ → 0 delta→0 δ0的情况。因此以太网的端到端往返时间 2 τ 2tau 2τ称为争用期(contention period),它是一个很重要的参数。争用期又称为碰撞窗口(collision window)。这是因为一个站在发送完数据后,只有通过争用期的“考验”,即经过争用期这段时间还没有检测到碰撞,才能肯定这次发送不会发生碰撞。这时,就可以放心把这一帧数据顺利发送完毕。

以太网使用截断二进制指数退避(truncated binary exponential backoff)算法来确定碰撞后重传的时机。截断二进制指数退避算法并不复杂。这种算法让发生碰撞的站在停止发送数据后,不是等待信道变为空闲后就立即再发送数据,而是退避一个随机的时间。这点很容易理解,因为几个发生碰撞的站将会同时检测到信道变成了空闲。如果大家都同时重传,必然接连发生碰撞。如果采用退避算法,生成了最小退避时间的站将最先获发送权。以后其余的站的退避时间到了,但发送数据之前监听到信道忙,就不会马上发送数据了。

为了尽可能减小重传时再次发生冲突的概率,退避算法有如下具体的规定:

  1. 基本退避时间为争用期 2 τ 2tau 2τ,具体的争用期时间是51.2us。对于10Mbit/s 以太网,在争用期内可发送512比特,即64字节。也可以说争用期是512比特时间。1比特时间就是发送1比特所需的时间。所以这种时间单位与数据率密切相关。为了方便,也可以直接使用比特作为争用期的单位。争用期是512比特,即争用期是发送512比特所需的时间。

  2. 从离散的整数集合 [ 0 , 1 , ⋯   , ( 2 k − 1 ) ] left[0,1, cdots,left(2^k-1right)right] [0,1,,(2k1)]中随机取出一个数,记为 r r r。重传应推后的时间就是 r r r倍的争用期。上面的参数 k k k按下面的如下公式计算: k = Min ⁡ [ 重传次数 , 10 ] k=operatorname{Min}[text{重传次数}, 10] k=Min[重传次数,10]。可见当重传次数不超过10时,参数 k k k等于重传次数;但当重传次数超过10时, k k k就不再增大而一直等于10。

  3. 当重传达16次仍不能成功时(这表明同时打算发送数据的站太多,以致连续发生冲突),则丢弃该帧,并向高层报告。例如:

    • 在第1次重传时, k = 1 k=1 k=1,随机数 r r r从整数 { 0 , 1 } {0, 1} {0,1}中选一个数。因此重传的站可选择的重传推迟时间是0或 2 τ 2tau 2τ,在这两个时间中随机选择一个。
    • 若再发生碰撞,则在第2次重传时, k = 2 k= 2 k=2,随机数 r r r就从整数 { 0 , 1 , 2 , 3 } {0, 1,2, 3} {0,1,2,3}中选一个数。因此重传推迟的时间是在 0 , 2 τ , 4 τ 0,2τ,4τ 0,2τ,4τ 6 τ 6τ 6τ这4个时间中随机地选取一个。
    • 同样,若再发生碰撞,则重传时 k = 3 k=3 k=3,随机数 r r r就从整数 { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 } {0, 1,2,3, 4,5,6, 7} {0,1,2,3,4,5,6,7}中选一个数。依此类推。

若连续多次发生冲突,就表明可能有较多的站参与争用信道。但使用上述退避算法可使重传需要推迟的平均时间随重传次数而增大(这也称为动态退避),因而减小发生碰撞的概率,有利于整个系统的稳定。

我们还应注意到,适配器每发送一个新的帧,就要执行一次CSMA/CD算法。适配器对过去发生过的碰撞并无记忆功能。因此,当好几个适配器正在执行指数退避算法时,很可能有某一个适配器发送的新帧能够碰巧立即成功地插入到信道中,得到了发送权,而已经推迟好几次发送的站,有可能很不巧,还要继续执行退避算法,继续等待。

现在考虑一种情况。某个站发送了一个很短的帧,但在发送完毕之前并没有检测出碰撞。假定这个帧在继续向前传播到达目的站之前和别的站发送的帧发生了碰撞,因而目的站将收到有差错的帧(当然会把它丢弃)。可是发送站却不知道这个帧发生了碰撞,因而不会重传这个帧。这种情况显然是我们所不希望的。为了避免发生这种情况,以太网规定了一个最短帧长64字节,即512比特。如果要发送的数据非常少,那么必须加入一些填充字节,使帧长不小于64字节。对于10Mbit/s 以太网,发送512比特的时间需要51.2μs,也就是上面提到的争用期。

由此可见,以太网在发送数据时,如果在争用期(共发送了64字节)没有发生碰撞,那么后续发送的数据就一定不会发生冲突。 换句话说,如果发生碰撞,就一定是在发送的前64字节之内。由于一检测到冲突就立即中止发送,这时已经发送出去的数据一定小于64字节,因此凡长度小于64字节的帧都是由于冲突而异常中止的无效帧。只要收到了这种无效帧,就应当立即将其丢弃。

前面已经讲过,信号在以太网上传播1km大约需要5μs。以太网上最大的端到端时延必须小于争用期的一半(即25.6μs),这相当于以太网的最大端到端长度约为5km。实际上的以太网覆盖范围远远没有这样大。因此,实用的以太网都能在争用期51.2μs内检测到可能发生的碰撞。以太网的争用期确定为51.2μs,不仅考虑到以太网的端到端时延,而且还包括其他的许多因素,如存在的转发器所增加的时延,以及下面要讲到的强化碰撞的干扰信号的持续时间等。

下面介绍强化碰撞的概念。这就是当发送数据的站一旦发现发生了碰撞时,除立即停止发送数据外,还要再继续发送32比特或48比特的人为干扰信号(jamming signal), 以便让所有用户都知道现在已经发生了碰撞(如下图所示)。对于10Mbit/s 以太网,发送32(或48)比特只需要3.2(或4.8)μs。
在这里插入图片描述

从上图可以看出,A站从发送数据开始到发现碰撞并停止发送的时间间隔是 T B T_B TB。A站得知碰撞已经发生时所发送的强化碰撞的干扰信号的持续时间是 T J T_J TJ。图中的B站在得知发生碰撞后,也要发送人为干扰信号,但为简单起见,上图中没有画出B站所发送的人为干扰信号。发生碰撞使A浪费时间 T B + T J T_B+T_J TB+TJ。可是整个信道被占用的时间还要增加一个单程端到端的传播时延 τ tau τ。因此总线被占用的时间是 T B + T J + τ T_B+T_J+tau TB+TJ+τ

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

根据以上所讨论的,可以把CSMA/CD协议的要点归纳如下:

  1. 准备发送:适配器从网络层获得一个分组,加上以太网的首部尾部,组成以太网帧,放入适配器的缓存中。但在发送之前,必须先检测信道
  2. 检测信道:若检测到信道忙,则继续不停地检测,一直等待信道转为空闲。此时若在96比特时间内信道保持空闲(保证了帧间最小间隔),就发送这个帧。
  3. 在发送过程中仍不停地检测信道,即网络适配器要边发送边监听。这里只有两种可能性:
    • 发送成功:如果在争用期内一直未检测到碰撞,就认为发送成功(如果接收方收到了有差错的帧,就丢弃它,后续的工作由高层来处理)。发送完毕后,其他什么也不做。然后回到(1)。
    • 发送失败:在争用期内检测到碰撞。这时立即停止发送数据,并按规定发送人为干扰信号。适配器接着就执行指数退避算法,等待 r r r倍512比特时间后,返回到步骤(2),继续检测信道。但若重传达16次仍不能成功,则停止重传而向上报错。

以太网每发送完一帧,一定要把已发送的帧暂时保留一下。如果在争用期内检测出发生了碰撞,那么还要在推迟一段时间后再把这个暂时保留的帧重传一次。

使用集线器的星型拓扑

传统以太网最初使用粗同轴电缆,后来演进到使用比较便宜的细同轴电缆,最后发展为使用更便宜和更灵活的双绞线。这种以太网采用星形拓扑,在星形的中心则增加了一种可靠性非常高的设备,叫作集线器(hub), 双绞线以太网总是和集线器配合使用的。每个站需要用两对无屏蔽双绞线, 分别用于发送和接收。由于使用双绞线电缆的以太网价格便宜和使用方便,因此粗缆和细缆以太网现在都已成为历史,并已从市场上消失了。

性价比很高的10BASE-T双绞线以太网的出现,是局域网发展史上的一个非常重要的里程碑,从此以太网的拓扑就从总线型变为更加方便的星形网络,而以太网也就在局域网中占据了统治地位。
集线器的一些特点如下:

  1. 从表面上看,使用集线器的局域网在物理上是一个星形网,但由于集线器使用电子器件来模拟实际电缆线的工作,因此整个系统仍像一个传统以太网那样运行。也就是说,使用集线器的以太网在逻辑上仍是一个总线网,各站共享逻辑上的总线,使用的还是CSMA/CD协议(更具体些说,是各站中的适配器执行CSMA/CD协议)。网络中的各站必须竞争对传输媒体的控制,并且在同一时刻至多只允许一个站发送数据
  2. 一个集线器有许多端口,很像一个多端口的转发器
  3. 集线器工作在物理层,它的每个端口仅仅简单地转发比特(收到1就转发1,收到0就转发0,不进行碰撞检测)。若两个端口同时有信号输入(即发生碰撞),那么所有的端口都将收不到正确的帧。
  4. 集线器采用了专门的芯片,进行自适应串音回波抵消。这样就可使端口转发出去的较强信号不致对该端口接收到的较弱信号产生干扰。

集线器本身必须非常可靠。现在的堆叠式(stackable)集线器由4~8个集线器堆叠起来使用。集线器一般都有少量的容错能力网络管理功能。例如,假定在以太网中有一个适配器出了故障,不停地发送以太网帧。这时,集线器可以检测到这个问题,在内部断开与出故障的适配器的连线,使整个以太网仍然能够正常工作。

以太网的信道利用率

假定一个10Mbit/s以太网同时有10个站在工作,那么每一个站所能发送数据的平均速率似乎应当是总数据率的1/10(即1Mbit/s)。 其实不然,因为多个站在以太网上同时工作就可能会发生碰撞。当发生碰撞时,信道资源实际上是被浪费了。因此,当扣除碰撞所造成的信道损失后,以太网总的信道利用率并不能达到100%。

下图的例子是以太网的信道被占用的情况。一个站在发送帧时出现了碰撞。经过一个争用期 2 τ 2tau 2τ后(是以太网单程端到端传播时延),可能又出现了碰撞。这样经过若干个争用期后,一个站就发送成功了。假定发送帧需要的时间是 T 0 T_0 T0。它等于帧长(bit)除以发送速率(10Mbit/s)。
在这里插入图片描述

我们应当注意到,成功发送一个帧需要占用信道的时间是 T 0 + τ T_0+tau T0+τ, 比这个帧的发送时间要多一个单程端到端时延 τ tau τ。这是因为当一个站发送完最后一个比特时,这个比特还要在以太网上传播。在最极端的情况下,发送站在传输媒体的一端,而比特在媒体上传输到另一端所需的时间是 τ tau τ。因此,必须在经过时间 T 0 + τ T_0+tau T0+τ后以太网的媒体才完全进入空闲状态,才能允许其他站发送数据。
要提高以太网的信道利用率,就必须减小 τ tau τ T 0 T_0 T0之比。在以太网中定义了参数 a a a,它是以太网单程端到端时延 τ tau τ与帧的发送时间 T 0 T_0 T0之比:
a = τ T 0 a=frac{tau}{T_0} a=T0τ

a → 0 a→0 a0时,表示只要一发生碰撞,就立即可以检测出来,并立即停止发送,因而信道资源被浪费的时间非常非常少。反之,参数 a a a越大,表明争用期所占的比例越大,这就使得每发生一次碰撞就浪费了不少的信道资源,使得信道利用率明显降低。因此,以太网的参数 a a a的值应当尽可能小些。从上式可看出,这就要求分子 τ tau τ的数值要小些,而分母 T 0 T_0 T0的数值要大些。这就是说,当数据率一定时,以太网的连线的长度受到限制(否则的数值会太大),同时以太网的帧长不能太短(否则 T 0 T_0 T0的值会太小,使 a a a值太大)。

现在考虑一种理想化的情况。假定以太网上的各站发送数据都不会产生碰撞(这显然已经不是CSMA/CD,而是需要使用一种特殊的调度方法),并且能够非常有效地利用网络的传输资源,即总线一旦空闲就有某一个站立即发送数据。这样,发送一帧占用线路的时间是 T 0 + τ T_0+tau T0+τ,而帧本身的发送时间是 T 0 T_0 T0。于是我们可计算出极限信道利用率 S m a x S_{max} Smax为:
S max ⁡ = T 0 T 0 + τ = 1 1 + a S_{max }=frac{T_0}{T_0+tau}=frac{1}{1+a} Smax=T0+τT0=1+a1

上式的意义是:虽然实际的以太网不可能有这样高的极限信道利用率,但上式指出了只有当参数 a a a远小于1才能得到尽可能高的极限信道利用率。反之,若参数 a a a远大于1(即每发生一次碰撞,就要浪费相对较多的传输数据的时间),则极限信道利用率就远小于1,而这时实际的信道利用率就更小了。据统计,当以太网的利用率达到30%时就已经处于重载的情况。很多的网络容量被网上的碰撞消耗掉了。

以太网的MAC层

MAC层的硬件地址

在局域网中,硬件地址又称为物理地址MAC地址(因为这种地址用在MAC帧中)。

在所有计算机系统的设计中,标识系统(identification system)都是一个核心问题。在标识系统中,地址就是识别某个系统的一个非常重要的标识符。在讨论地址问题时,很多人参考如下定义:“名字指出我们所要寻找的那个资源,地址指出那个资源在何处,路由告诉我们如何到达该处。”

这个非形式的定义固然很简单,但有时却不够准确。严格地讲,名字应当与系统的所在地无关。这就像我们每一个人的名字一样,不随我们所处的地点而改变。为此IEEE 802标准为局域网规定了一种48位的全球地址(一般都简称为“地址”),这就是局域网上的每一台计算机中固化在适配器的ROM中的地址。因此,请特别注意下面两点:

  1. 假定连接在局域网上的一台计算机的适配器坏了,而我们更换了一个新的适配器,那么这台计算机的局域网的“地址”也就改变了,虽然这台计算机的地理位置一点也没有变化,所接入的局域网也没有任何改变。
  2. 假定我们把位于南京的某局域网上的一台笔记本电脑携带到北京,并连接在北京的某局域网上。虽然这台电脑的地理位置改变了,但只要电脑中的适配器不变,那么该电脑在北京的局域网中的“地址”仍然和它在南京的局域网中的“地址”一样。

由此可见,局域网上的某台主机的“地址”并不指明这台主机位于什么地方。因此,严格地讲,局域网的“地址”应当是每一个站的“名字”或标识符

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

当路由器通过适配器连接到局域网时,适配器上的硬件地址就用来标志路由器的某个接口。路由器如果同时连接到两个网络上,那么它就需要两个适配器和两个硬件地址。

我们知道适配器有过滤功能。当适配器从网络上每收到一个MAC帧就先用硬件检查MAC帧中的目的地址。如果是发往本站的帧则收下,然后再进行其他的处理。否则就将此帧丢弃,不再进行其他的处理。这样做就不浪费主机的处理机和内存资源了。这里“发往本站的帧”包括以下三种帧:

  • 单播(unicast)帧(一对一),即收到的帧的MAC地址与本站的MAC地址相同。
  • 广播(broadcast)帧(一对全体),即发送给本局域网上所有站点的帧(全1地址)。
  • 多播(multicast)帧(一对多),即发送给本局域网上一部分站点的帧。

所有的适配器都至少应当能够识别前两种帧,即能够识别单播和广播地址。有的适配器可用编程方法识别多播地址。当操作系统启动时,它就把适配器初始化,使适配器能够识别某些多播地址。显然,只有目的地址才能使用广播地址和多播地址。

以太网适配器还可设置为一种特殊的工作方式,即混杂方式(promiscuous mode)。工作在混杂方式的适配器只要“听到”有帧在以太网上传输就都悄悄地接收下来,而不管这些帧发往哪个站。请注意,这样做实际上是“窃听”其他站点的通信而并不中断其他站点的通信。网络上的黑客常利用这种方法非法获取网上用户的口令。因此,以太网上的用户不愿意网络上有工作在混杂方式的适配器。

但混杂方式有时却非常有用。例如,网络维护和管理人员需要用这种方式来监视和分析以太网上的流量,以便找出提高网络性能的具体措施。有一种很有用的网络工具叫作嗅探器(Sniffer)就使用了设置为混杂方式的网络适配器。此外,这种嗅探器还可帮助学习网络的人员更好地理解各种网络协议的工作原理。因此,混杂方式就像一把双刃剑,是利是弊要看你怎样使用它。

MAC帧的格式

常用的以太网MAC帧格式有两种标准,一种是DIX Ethernet V2标准(即以太网V2标准),另一种是IEEE的802.3标准。这里只介绍使用得最多的以太网V2的MAC帧格式(如下图所示)。图中假定网络层使用的是IP协议。实际上使用其他的协议也是可以的。
在这里插入图片描述

以太网V2的MAC帧较为简单,由五个字段组成。

  • 前两个字段分别为6字节长的目的地址源地址字段
  • 第三个字段是2字节的类型字段,用来标志上一层使用的是什么协议,以便把收到的MAC帧的数据上交给上一层的这个协议。例如,当类型字段的值是0x0800时,就表示上层使用的是IP数据报。
  • 第四个字段是数据字段,其长度在46到1500字节之间(46字节是这样得出的:最小长度64字节减去18字节的首部和尾部就得出数据字段的最小长度)。
  • 最后一个字段是4字节的帧检验序列FCS(使用CRC检验)。当传输媒体的误码率为 1 × 1 0 − 8 1×10^{-8} 1×108时,MAC子层可使未检测到的差错小于 1 × 1 0 − 14 1×10^{-14} 1×1014。FCS检验的范围就是整个的MAC帧,从目的地址开始到FCS为止的这五个字段,但不包括物理层插入的8字节的前同步码帧开始定界符

这里我们要指出,在以太网V2的MAC帧格式中,其首部并没有一个帧长度(或数据长度)字段。那么,MAC子层又怎样知道从接收到的以太网帧中取出多少字节的数据交付上一层协议呢?我们在前面讲述曼彻斯特编码时已经讲过,这种曼彻斯特编码的一个重要特点就是:在曼彻斯特编码的每一个码元(不管码元是1或0的正中间一定有一次电压的转换(从高到低或从低到高)。当发送方把一个以太网帧发送完毕后,就不再发送其他码元了(既不发送1,也不发送0)。因此,发送方网络适配器的接口上的电压也就不再变化了。这样,接收方就可以很容易地找到以太网帧的结束位置。在这个位置往前数4字节(FCS字段长度是4字节),就能确定数据字段的结束位置。

当数据字段的长度小于46字节时,MAC子层就会在数据字段的后面加入一个整数字节填充字段,以保证以太网的MAC帧长不小于64字节。我们应当注意到,MAC帧的首部并没有指出在数据字段中是否有填充字段。接收端的MAC子层在剥去MAC帧的首部和尾部后,就把剩下的部分交给上面的IP层。那么IP层怎样知道这里有没有填充字段呢?事实上,IP协议的首部有一个“总长度”字段。如果IP数据报的“总长度”超过或等于46字节,那么肯定就没有填充字段。反之,如果“总长度”小于46字节,那么就很容易把填充字段计算出。例如,若IP数据报的总长度为42字节,填充字段就应当是4字节。当MAC帧把46字节的数据上交给IP层后,IP层就把其中最后4字节的填充字段丢弃。

从上图可看出,在传输媒体上实际传送的要比MAC帧还多8个字节。这是因为当一个站在刚开始接收MAC帧时,由于适配器的时钟尚未与到达的比特流达成同步,因此MAC帧的最前面的若干位就无法接收,结果使整个的MAC成为无用的帧。为了接收端迅速实现位同步,从MAC子层向下传到物理层时还要在帧的前面插入8个字节(由硬件生成),它由两个字段构成。

  • 第一个字段是7个字节的前同步码(1和0交替码),它的作用是使接收端的适配器在接收MAC帧时能够迅速调整其时钟频率,使它和发送端的时钟同步,也就是“实现位同步”(位同步就是比特同步的意思)。
  • 第二个字段是帧开始定界符,定义为10101011。它的前六位的作用和前同步码一样,最后的两个连续的1就是告诉接收端适配器:“MAC帧的信息马上就要来了,请适配器注意接收。”MAC帧的FCS字段的检验范围不包括前同步码和帧开始定界符。顺便指出,在使用SONET/SDH进行同步传输时则不需要用前同步码,因为在同步传输时收发双方的位同步总是一直保持着的。

还需注意,在以太网上传送数据时是以帧为单位传送的。以太网在传送帧时,各帧之间还必须有一定的间隙。因此,接收端只要找到帧开始定界符,其后面的连续到达的比符流就都属于同一个MAC帧。可见以太网不需要使用帧结束定界符,也不需要使用字节插入来保证透明传输

IEEE 802.3标准规定凡出现下列情况之一的即为无效的MAC帧

  • 帧的长度不是整数个字节;
  • 用收到的帧检验序列FCS查出有差错;
  • 收到的帧的MAC客户数据字段的长度不在46~1500字节之间。考虑到MAC帧首部和尾部的长度共有18字节,可以得出有效的MAC帧长度为64~1518字节之间。

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

最后要提一下,IEEE 802.3标准规定的MAC帧格式与上面所讲的以太网V2 MAC帧格式的区别就是以下三点。

  • IEEE 802.3规定的MAC帧的第三个字段是“长度/类型”。由于以太网有效帧的最大长度是1518字节。因此当这个字段值大于0x0600时(相当于十进制的1536),这个字段就表示“类型”。这样的帧格式就和以太网V2 MAC帧格式完全一样。只有当这个字段值小于0x0600时才表示“长度”,即MAC帧的数据部分长度。显然,在这种情况下,若数据字段的长度与实际的长度字段的值不一致,则该帧为无效的MAC帧。实际上,前面我们已经讲过,由于以太网采用了曼彻斯特编码,长度字段本来并无实际意义
  • 当“长度/类型”字段值小于0x0600时,数据字段必须装入上面的逻辑链路控制LLC子层的LLC帧
  • 在802.3标准的文档中,MAC帧的帧格式包括了8字节的前同步码和帧开始定界符。

由于现在广泛使用的局域网只有以太网,因此LLC帧已经失去了原来的意义。现在市场上流行的都是以太网V2的MAC帧,但大家也常常把它称为IEEE 802.3标准的MAC帧。

最后

以上就是火星上狗为你收集整理的【计算机网络系列】数据链路层③:使用广播信道的数据链路层(CSMA/CD协议和以太网的MAC帧)使用广播信道的数据链路层的全部内容,希望文章能够帮你解决【计算机网络系列】数据链路层③:使用广播信道的数据链路层(CSMA/CD协议和以太网的MAC帧)使用广播信道的数据链路层所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部