数据链路层概述
数据链路层位于计算机网络的低层,且在物理层之上,数据链路层使用的信道主要有以下两种类型。
(1)点对点通信。在信道上使用一对一的点对点通信。
(2)广播信道。这种信道使用一对多的广播通信方式,因此过程比较复杂,广播信道上可以连接多个计算机,因此必须使用共享信道协议来协调这些计算机的数据发送。(如CSMA/CD等等)
本章重点:
(1)数据链路层的三个重要问题:封装成帧、差错检测、可靠传输
(2)互联网点对点协议实例
(3)广播信道的特点和媒体接入控制的概念,以及以太网的媒体介入控制协议(CDMA/CD)
(4)适配器(网卡)、转发器、集线器、网桥、以太网交换机的作用以及使用场合
链路就是从一个节点到相邻节点的一段物理链路,并且中间没有任何其他的交换节点。链路对应的是物理层
数据链路是指把实现通信协议的硬件和软件加在链路上,就构成了数据链路数据链路层在物理层的基础上加上了软件协议和硬件设备,实现了封装成帧、差错检测、可靠传输等等功能,就构成了数据链路层。
因此,总结下来:
链路 = 一个结点到相邻结点的一段物理链路(有线或无线)
数据链路 = n条链路 + 协议 + 软硬件构成的从头到尾的传输链路
数据链路和帧
帧是数据链路层的协议数据单元,数据链路层把网络层交下来的数据,按照不同的协议构成帧,然后发送到链路上。
反过来,也会将帧转为数据上交给网络层
两台主机通过数据链路互联(物理连接+协议),双方都会对对方所发送或者接收数据包进行封包或者解包操作。
注意,这里简化了通信过程,只用了点对点的模型,即同一条链路上只有收发的两台主机。
(1)结点A的数据链路层把网络层交下来的IP数据报添加首部和尾部封装成帧。
(2)结点A把封装好的帧发送给结点B的数据链路层。
(3)若结点B的数据链路层收到的帧无差错(CRC通过),则结点B的数据链路层从收到的帧中提取出IP数据报,上交给上面的网络层,否则丢弃这个帧(CRC失败)。
数据链路层的三个重要问题(前置概述)
- 封装成帧
两台主机通过数据链路互联(物理连接+协议),双方都会对对方所发送或者接收数据包进行封包或者解包操作。
- 差错检测(收到帧后进行校验(硬件级计算,不占用太多性能))
在帧传输的过程中,数据会受到各种干扰,很容易出现0变成1,1变成0的问题。这一现象被称之为误码。
那么这个误码怎么才能被判断出来呢,可以通过检错码发现。发送方在发送帧之前,基于待发送的数据以及算法,算出检测码封装在帧尾部。
接收方接到数据帧之后,根据检错码以及检错算法,就可以判断出这个数据帧在传输过程中是否出现了误码。如果出现了误码就会将其丢弃。
丢弃了以后怎么办?就需要重传,重传就需要依靠可靠传输。
- 可靠传输
多机广播的一些问题
找目的地址的问题
这个问题依靠地址来解决
抢占信号总线的问题
这个问题依靠接入以太网接入协议CSMA/CD
总线型(依赖网桥、集线器等等)现在用的不多,主要是以交换机为主
无线局域网也要依靠CSMA/CD协议。
但是有线网连接依靠交换机就不需要了,交换机可以自行的完成分配工作
总结一下
封装成帧
数据链路层以帧为单位传输和处理数据
之前已经说明了为什么要封装成帧了,帧的功能有哪些?
注意这里为什么说,数据载荷不能超过1500字节,是因为过长的数据会在CRC差错检测环节造成负担,因此需要控制数据载荷长度。
实现帧定界有很多方法,这里举例:固定时间间隔定界和控制字符定界
固定时间间隔
当数据链路层把帧给封装好之后,物理层会在帧前添加8字节的前导码(前7字节是同步码用于时钟同步,最后一个字节是帧开始定位符)。注意,前导码内部只有开始符,没有结束符,因为规定帧间间隔时间为96比特(发送96个比特走过的时间)的发送时间(固定间隔时间),所以想区分帧与帧之间和后面的帧岔开96个比特时间就可以了。
帧定界符方案
这种很好理解,就是通过插入特定字符来实现对帧首尾的开始和结束的界定
在ASCII码中,一共有128种,其中有95中可打印,而不可打印的控制字符有33个(关键字)。在这33个中,就预留了帧定界的关键字。
由于帧开始标志和帧结束标志使用了专门的控制字符,所以在传输的数据中不能出现与之相同的字节(和关键字一样的比特组合),否则就会出现定界错误(比如提前结束等等问题)
但是有一种情况,网络层传来的报文里,就是有关键字的比特流组合,总不能不让传吧?
所以,如果没有处理就会出一些问题。如果对传来的帧不做任何处理,其中部分数据就有可能被识别为特殊的标志位
针对这种情况,便引出了透明传输的概念。
透明传输
透明传输是指数据链路层对上层交付的传输数据没有任何限制,上层只管调用数据链路层,至于数据链路层怎么实现的,不需要上层去关心,上层是完全察觉不到这个转义 -> 还原
的过程,也察觉不到转义字符的存在。该操作均在数据链路层完成,对上层来说就好像不存在一样,即为透明传输。
转义字符处理方案
如果flag位在帧中间,如果不加处理,就可能会导致帧传输提前结束
所以要对帧进行一定的处理,对帧进行扫描,每次遇到与flag位相同的比特流部分,就进行处理。加转义字符标志。这里我们假设这个转义字符叫ESC,就插到 帧定界字符的前面实现转义。
这样在接收端的数据链路层收到帧的时候,就不会将转义字符后面的标记给解释成帧定界符。并且在向上交付给网络层之前,就删除这个插入的转义字符。这样就实现了透明传输。
那如果,转义字符还在帧内部怎么办?
还是老办法,给转义字符加转义字符。这样在接收端收到了两个同样的转义字符时,就删掉前面的一个。
比特流处理方案
当物理链路提供的是面向比特的传输服务时,此时因为传输内容只有0和1,那么帧定界符就可以是某个特殊的比特组合。如点对点协议PPP规定使用01111110
作为边界Flag。那么针对这个Flag的转义操作,也叫 零比特填充法
那么在0比特填充法下,因为01111110是Flag,所以在数据部分,就不能出现6个连续的1,那么在针对数据进行扫描、转义的过程中,只要发现有5个连续的1,就立即插入一个0。
同理,在接收端收到数据后,也会对其数据部分进行扫描,当数据部分发现有5个连续的1之后,就会立即删除5个连续的1后的那个0
帧效率提升
控制MTU的长度,也是为了保证在后续的差错检测的过程中(CRC),其计算过程不至于太长,将其控制在一个合理的范围内。同时,考虑到链路上的硬件也有缓存转发等等操作,其受限于硬件规格,因此也不能将MTU部分设置的过大。
差错检测
传输过程中不可能一点错误都没有,所以要有差错检测来检测是否传输过程中造成了错误。
比特差错的产生原因
奇偶校验
循环冗余校验(CRC)
这种就是,通过生成的算法,来根据发送之前的数据计算出一个校验码(冗余码)。等待接收方接收到之后,根据这个算法再对接收到的数据进行计算。算出的校验码和发来的校验码一致就代表没错。反之就是发生了比特差错。
因为其计算过程是通过硬件级别进行计算的,且因为数据部分的长度一般会限制在1500的长度,因此CRC过程对于性能的影响微乎其微。
生成多项式举例(也是校验算法生成过程)
差错检测的过程
总结
如若CRC校验出现差错,那么就会丢弃该帧,我们假设,数据链路层对上层提供可靠传输服务(即百分百正确),那么就需要通过可靠传输协议来实现可靠传输服务。
值得一提的是,针对有线网络,随着物理层介质质量的不断提高,其传输质量越来越好,数据链路层的重传方面的可靠传输就越来越没那么重要,现在的网络中(比如以太网(局域网)),数据链路层更倾向于通过CRC来进行收到帧的差错检测,如果错了就直接丢弃,至于可靠传输部分则交给再上一层的协议来实现。但是无线网路,因为其通信质量波动非常大,因此仍然要依赖可靠传输。
可靠传输
可靠传输概述
可靠传输由这些协议来实现
- 停止-等待协议SW
- 回退N帧协议GBN
- 选择重传协议SR
这三种可靠传输实现机制的基本原理并不仅限于数据链路层。而是可以应用到计算机网络体系结构的各层协议中。
基本概念
一般来说,有线连接是不需要实现可靠传输的。但是无线连接一般要求可靠传输。
停止-等待协议(SW)
也叫SW协议(Stop And Wait)
先看一些名词:
- ACK (Acknowledgment):确认分组,向对方确认它已成功接收。
- NAK(Negative Acknowledgment):否认分组,向发送方发送否认分组,简称为NAK位。
理想情况,依靠确认位就可以
发送方丢失帧的情况的情况
针对上面的情况,还能用NAK位来要求重传,那如果半路被截胡了,连发现数据帧损毁的机会都没有的情况。怎么办?
这个时候要靠发送端超时重传
超时重传时间略大于平均往返时间的原因:因为在数据链路层,点对点的往返时间比较确定,因此才会设置成略大于从发到收的平均往返时间。
接收方发送确认位丢失
假如接收方确认位ACK丢失了,那么接收方就会触发超时重传,这个时候接收方就会收到多个数据帧,如何让接收方识别出来重复发送的内容呢?
为什么确认分组ACK是可以没有序号的?
因为数据链路层出现迟到确认的情况很少,而且就算出现了迟到确认,也不会造成致命性影响,后面再正确到达的ACK就会纠正发送的顺序,顶多就浪费了一次往返传输。
- 注意事项
停止等待协议信道利用率
那么这种发送方法,信道利用率是多少?
注意,这种停止等待的协议,通过确认位的这种重传机制实现的可靠传输协议,常常成为 自动重传协议(Automatic Repeat-reQuest,ARQ)
根据上面的停止等待协议来看,这种协议他效率和信道利用率确实是比较低的。比如卫星通信,大量的时间都花在分组确认的发送上了(等待ACK的时间),信道利用率太低了。如果重传了那就更低了。可以通过在同一个时间内发送更多的数据分组来提高利用率。
回退N帧协议(GBN)
基于上面SW的信道低利用率这种情况,推出了回退N帧协议
以滑动窗口的形式来进行帧的传输
无差错情况流程
发送方将序号落在发送窗口内的0~4号数据分组,依次连续发送出去
他们经过互联网传输正确到达接收方,就是没有乱序和误码,接收方按序接收它们,每接收一个,接收窗口就向前滑动一个位置,并给发送方发送针对所接收分组的确认分组,在通过互联网的传输正确到达了发送方
发送方每接收一个ACK、发送窗口就向前滑动一个位置,这样就有新的序号落入发送窗口,发送方可以将收到确认的数据分组从缓存中删除了,而接收方可以择机将已接收的数据分组交付上层处理
滑动窗口的意义是为了保证发送方发出的分组个数,不能无限制的去发送分组,保证分组数量在接收方的处理范围内。
因此,发送窗口内的分组,就是允许发送方已发送但还没有接收到确认分组序号的范围,窗口大小就是发送方已发送但还没有确认的最大分组数量(简单来说,待在窗口内的分组都是没有收到确认的分组,收到确认后就往后滑动了)
所以如果把滑动窗口的大小改成1,那么就变成上面的SW协议了。
不过这是没有差错的情况,有差错了怎么办?
先说一个累计确认
累计确认
接收方在接收到数据之后,不需要对每一个数据帧都进行确认,因为这样消耗也比较大,可以等多收到几个数据之后,将最后一个到达的确认分组发回就可以了。假如ACK1丢失了,但是ACK4到达了,那么发送方就认为0~4都是成功的。
优点:
- 即使确认分组丢失,发送方也可能不必重传。比如发送窗口足够大时,接收方发送的ACK丢了也没关系,因为发送方已经开始发送窗口内下一部分的分组,此时,这下一块的分组到了接收方后,累计并确认,就会把之前未ACK的分组一起ACK了(发送方还没来得及Time Out),所以某一次的ACK丢失了也没关系,下一次及时ACK即可
- 减小接收方的开销
- 减小对网络资源的占用
缺点:
- 不能向发送方及时反映出接收方已经正确接收的数据分组信息
有差错情况
例如
在传输数据分组时,5号数据分组出现误码,接收方通过数据分组中的CRC检错发现了错误
于是丢弃该分组,而后续到达的这剩下四个分组与接收窗口的序号不匹配(因为接收窗口只有1的大小)。头部分组对不上之后,后续的帧也跟窗口的内容就对不上了,索性一起丢弃了
光丢弃也不行,丢弃也得把最近一次帧的ACK(5号分组失败,最近的一次就是4号分组)进行重发,来请求后续的内容。
接收方同样也不能接收它们,将它们丢弃,并对之前按序接收的最后一个数据分组进行确认,发送ACK4,每丢弃一个数据分组,就发送多个ACK4,要求发送方进行重传
如果收到这4个重复的确认并不会触发发送立刻重传(比如ACK丢失了),一段时间后,发送方等到超时计时器超时,也会将发送窗口内以发送过的这些数据分组全部重传。这一点体现了Go Back N的思想,即一旦出错,就需要退回去重传已发送过的N个分组
一些特殊情况:比如滑动窗口的大小如果超限了会怎么样?
发送方和接收方进行对比
GBN也是有缺陷的
- 回退N帧协议在流水线传输的基础上利用发送窗口来限制发送方连续发送数据分组的数量,是一种连续ARQ协议
- 在协议的工作过程中发送窗口和接收窗口不断向前滑动,因此这类协议又称为滑动窗口协议
- 由于回退N帧协议的特性,当通信线路质量不好时,其信道利用率并不比停止-等待协议高,因为要反复重传
从上面这三点也不难看出,GBN协议相比于SW协议,仅仅在发送方的算法上进行了修改,在接收方的算法没有太大变化。比如窗口内1,2,3,4个帧,第一帧错了,后面2,3,4帧不管对不对都要重传。这显然是非常浪费的。所以仍然需要优化。
选择重传协议(SR)
由于GBN协议在某些情况下,通信线路质量不好时,其信道利用率并不比停止-等待协议高,因为要反复重传整个发送窗口内的帧(即使其中只有某一个帧错了),就会造成浪费。其效率和SW协议的效率差不多,所以引出了选择重传协议(SR)
选择重传协议出现的背景:
相比于GBN协议,SR协议最大的改动在于接收方改用接收窗口,并且采用逐一确认。
SR是针对GBN进行的改进,改进的点就出现在出错重传的时候,仅重传错误的数据分组。并且在确认的时候不用累计确认,采用逐一确认。在接收方滑动窗口,一个窗口内不接收完全是不能向下滑动的,必须等待当前窗口内都传输完毕才能继续往下推进
这个时候只重传2号分组,3、4、5都已经发送完毕了,并且已经发送了确认位。如果发送方接收了确认位,就知道3、4、5已经接受了,只剩2没有确认,等待重传计时器时间一到。针对2重传一下就好了。
等待2重传好了,滑动窗口内就都完成了,接收方窗口在接收完毕之后,将窗口内的帧全部向上层交付,接收方窗口向下滑动。
滑动窗口的大小探讨:
如果滑动窗口超过了上限值会怎么样?
和之前的效果基本一致,还是无法区分新旧数据。
对比一下SR机制的发送方和接收方
点对点协议(PPP)
为什么会有点对点协议PPP?因为,现在的有线连接的物理层更加可靠了,很多时候各种ARQ协议,会导致利用率下降,本身出错的概率也很低,所以就把是否可靠传输的决定权交给上层,而不一定在数据链路层来实现。
- 点对点协议PPP(Point-to-Point Protocol)是目前使用最广泛的点对点数据链路层协议
- PPP协议是因特网工程任务组IEIF在1992年制定的。经过1993年和1994年的修订,现在的PPP协议已成为因特网的正式标准[RFC1661,RFC1662]
- 数据链路层使用的一种协议,它的特点是:简单;只检测差错,而不是纠正差错;不使用序号,也不进行流量控制;可同时支持多种网络层协议
- PPPoE 是为宽带上网的主机使用的链路层协议
帧格式
使用PPP协议进行传输的时候,必须使用特殊的格式,以及必须规定特殊的字符作为帧定界符。
所谓透明传输就是必须保证数据传输的透明性
实现透明传输的手段
- 面向字节的异步链路:字节填充法(插入“转义字符”)
- 面向比特的同步链路:比特填充法(每5个连续1 插入“比特0”)
透明传输
再复习一下之前的透明传输中的相关内容
只不过这次是用在PPP协议的帧中是怎么使用的,基本上没有太大差别。
举例说明:
-
字节填充法是怎么转义的
-
比特填充法是怎么转义的
因为把帧间隔Flag定义为01111110,所以数据部分就不可以出现连续6个1,因此当数据部分出现连续5个1的时候,就在其后面插一个0实现转义。反过来接收端也是一样的。
差错检测
工作流程解析
媒体接入控制
基本概念
随着技术的发展,交换技术的成熟和成本的降低,具有更高性能的使用点对点链路和链路层交换机的交换式局域网在有线领域已完全取代了共享式局域网,但由于无线信道的广播天性,无线局域网仍然使用的是共享媒体技术。
静态接入控制
信道复用
常见的信道复用的技术有,物理层章节已经有详细说明了,可以简单看下
计算机网络(物理层)
频分复用、时分复用、波分复用、码分复用
频分复用FDM (Frequency Division Multiplexing)
-
将整个带宽分为多份,用户在分配到一定的频带后,在通信过程中自始至终都占用这个频带。
-
频分复用的所有用户在同样的时间占用不同的带宽资源(请注意,这里的“带宽”是频率带宽而不是数据的发送速率)。
时分复用TDM (Time Division Multiplexing)
- 时分复用则是将时间划分为一段段等长的时分复用帧(TDM帧)。每一个时分复用的用户在每一个 TDM 帧中占用固定序号的时隙。
- 每一个用户所占用的时隙是周期性地出现(其周期就是TDM帧的长度)的。
- TDM 信号也称为等时 (isochronous) 信号。
- 时分复用的所有用户在不同的时间占用同样的频带宽度。
波分复用 WDM(Wavelength Division Multiplexing)
- 波分复用就是光的频分复用,使用一根光纤来同时传输多个光载波信号
- 光信号传输一段距离会衰减,所以要用 掺铒光纤放大器 放大光信号
码分复用 CDM (Code Division Multiplexing)
动态接入控制
一般接入控制有两种,无非就是有线接入和无线接入
不同的接入方式对应的接入协议也各不相同
这里先介绍有线网络的CSMA/CD协议
随机接入CSMA/CD(有线网络)
- 多址接入MA
多个主机连在一根总线上,各个主机随机发送帧。
- 载波监听CS
是指每一个站在发送数据之前先要检测一下总线上是否有其他计算机在发送数据,如果有,则暂时不要发送数据,以免发生碰撞。
- 碰撞检测CD
“碰撞检测”就是计算机边发送数据边检测信道上的信号电压大小。
当几个站同时在总线上发送数据时,总线上的信号电压摆动值将会增大(互相叠加)。
一个站检测到的信号电压摆动值超过一定的门限值时,就认为总线上至少有两个站同时在发送数据,表明产生了碰撞。也就是多个主机在同时发送,这对于总线来说是不合理的。
所谓“碰撞”就是发生了冲突。因此“碰撞检测”也称为“冲突检测”。
在发生碰撞时,总线上传输的信号产生了严重的失真,无法从中恢复出有用的信息来。
- 每一个正在发送数据的站,一旦发现总线上出现了碰撞,就要立即停止发送,免得继续浪费网络资源,然后等待一段随机时间后再次发送。
这里着重介绍用于有线网络的CSMA/CD协议
一般无线网络都是CSMA/CA协议,这里不做详细介绍
CSMA/CD 协议工作流程
CSMA/CD 协议工作——争用期(碰撞窗口)
之前说过,当等待了96比特位的总线空闲时间后,两台主机同时发送了数据帧怎么办,这种情况是一定会发生碰撞的,所以我们这里提供了判断这种时间的方式,通过时间的长度对是否发生了碰撞发生判定。
CSMA/CD 协议工作——最小帧长
CSMA/CD 协议工作——最大帧长
CSMA/CD 协议工作——截断二进制指数退避算法
CSMA/CD 协议工作——信道利用率
CSMA/CD 协议工作——帧收发流程
CSMA/CD协议曾经用于各种总线结构以太网和双绞线以太网的早起版本中。
现在的以太网基于交换机和全双工连接,不会有碰撞,因此没有必要使用CSMA/CS协议
下面看看无线协议CSMA/CA
随机接入CSMA/CA(无线网络)
所以为什么要用这个协议?说白了有线网络的协议不适用于无线网络的环境。
帧间间隔IFS(InterFrame Space)
可以着重看一下SIFS和DIFS的区别
简单来说就是SIFS更短(28微秒),DIFS更长(128微秒)
CSMA/CA协议的工作原理
源站为什么在检测到信道空闲后还要再等待一段时间(DIFS)?
- 考虑到可能有其他的站有高优先级的帧要发送。若有,就要让高优先级帧先发送
目的站为什么正确接收数据帧后还要等待一段时间SIFS才能发送ACK帧?
- SIFS 最短的帧间间隔,用来分隔开属于一次对话的各帧,在这段时间内,一个站点应当能够从发送方式切换到接收方式
信道由忙转为空闲且经过DIFS时间后,还要退避一段随机时间才能使用信道?
CSMA/CA协议的退避算法
防止多个站点同时发送数据而产生碰撞,所以会使用退避算法
退避算法在信道发送的时候直观图
具体的讲解可以看课程,这里就不赘述了课程链接
CSMA/CA协议的虚拟载波监听
虽然AC互为隐蔽站,但是A发送给B RTS帧的时候,B会向所有能连接的基站发送CTS帧,来告知当前信道即将被占用以及占用多长时间。所以即使A、C互相不知道彼此的存在,也可以避免在A与B发信息的时候C发生碰撞问题。
MAC协议
前面我们说过,使用点对点信道的是数据链路层不需要使用地址,因为就收发双方两个结点,所以不需要地址,但到了多个站点连接在同一个广播信道上,要想实现两个站点的通信,则每个站点就必须有一个唯一的标识,这个标识就是MAC(Media Access Control)地址
- 使用点对点信道的数据链路层不需要使用地址
- 使用广播信道的数据链路层必须使用地址来区分各主机
广播信道的数据链路层必须使用地址(MAC)
总线型网络一般是这样的MAC地址,头部用目的地址和原地址进行构造
这些MAC信息会固化在适配器(网卡)中,网卡就长这个样子
MAC地址又称为硬件地址或物理地址。请注意:不要被 “物理” 二字误导认为物理地址属于物理层范畴,物理地址属于数据链路层范畴
IEEE 802局域网的MAC地址格式
组织唯一标识符OUI
- 生产网络设备的厂商,需要向IEEE的注册管理机构申请一个或多个OUI
网络接口标识符
- 由获得OUI的厂商自行随意分配
EUI-48
- 48是这个MAC地址的位数
无效的MAC帧
无效的MAC帧都有哪些情况?
- 数据字段的长度与长度字段的值不一致;
- 帧的长度不是整数个字节;
- 用收到的帧检验序列 FCS 查出有差错;
- 数据字段的长度不在 46 ~ 1500 字节之间。
- 有效的 MAC 帧长度为 64 ~ 1518 字节之间。
对于检查出的无效 MAC 帧就简单地丢弃。以太网不负责重传丢弃的帧。
MAC帧发送顺序
这里需要单独提一下,MAC帧以及其内部字节的发送顺序
单播MAC地址举例
B想给C发送数据帧,单播是点对点的接收
主机B给主机C发送单播帧,主机B首先要构建该单播帧,在帧首部中的目的地址字段填入主机C的MAC地址,源地址字段填入自己的MAC地址,再加上帧首部的其他字段、数据载荷以及帧尾部,就构成了该单播帧
因为是总线型,所以总线上的所有主机都会收到数据帧,收到之后会对帧的目的地址与自己的MAC地址匹配,匹配到了代表是发给自己的,这样才接受。
主机B将该单播帧发送出去,主机A和C都会收到该单播帧
主机A的网卡发现该单播帧的目的MAC地址与自己的MAC地址不匹配,丢弃该帧
主机C的网卡发现该单播帧的目的MAC地址与自己的MAC地址匹配,接受该帧
并将该帧交给其上层处理
PS:
通常,网卡会有一种混杂的工作方式,即只要听到共享信道上有帧,就把他偷偷拿下来,不管是不是发送给自己的帧,这种窃听其他站点的通信,便称为网卡的混杂方式。黑客常用这种方式来监听用户口令,运维人员也会用这种方式来辅助定位网络问题,因此该模式是把双刃剑。
广播MAC地址举例
广播帧就是大家都要收到,所以目的地址的位置全填入F即可
假设主机B要发送一个广播帧,主机B首先要构建该广播帧,在帧首部中的目的地址字段填入广播地址,也就是十六进制的全F,源地址字段填入自己的MAC地址,再加上帧首部中的其他字段、数据载荷以及帧尾部,就构成了该广播帧
主机B将该广播帧发送出去,主机A和C都会收到该广播帧,发现该帧首部中的目的地址字段的内容是广播地址,就知道该帧是广播帧,主机A和主机C都接受该帧,并将该帧交给上层处理
多播MAC地址举例
通俗来讲,多播帧就是指发出的这个地址是否在接收方的多播组表中,如果在就保留,不在就舍弃
假设主机A要发送多播帧给该多播地址。将该多播地址的左起第一个字节写成8个比特,第一个字节的最低比特位是1,这就表明该地址是多播地址。
快速判断地址是不是多播地址,就是上图所示箭头所指的第十六进制数不能整除2(1,3,5,7,9,B,D,F),则该地址是多播地址
假设主机B,C,D支持多播,各用户给自己的主机配置多播组列表如下所示
主机B属于两个多播组,主机C也属于两个多播组,而主机D不属于任何多播组
主机A首先要构建该多播帧,在帧首部中的目的地址字段填入该多播地址,源地址点填入自己的MAC地址,再加上帧首部中的其他字段、数据载荷以及帧尾部,就构成了该多播帧
发送方发送帧之后,接收方看发来的帧首部和所在的多播组进行匹配,匹配上了就保留,匹配不到就丢弃
共享式以太网
以太网是一种网络技术,包括将台式机或笔记本电脑插入局域网 (LAN) 所需的协议、端口、电缆和计算机芯片,通过同轴或光纤电缆快速传输数据。
以太网是Xerox在1970年开发的一种通信技术,它通过有线连接,连接网络中的计算机。它连接局域网(LAN) 和广域网(WAN)系统。借助 LAN 和 WAN,打印机和笔记本电脑等多种设备可以跨建筑物、住宅甚至小型社区连接。
早期的以太网简单来说就是一种,利用共享传输媒体的局域网。我们先对其进行一个狭义的定义,在后面的进化中,随着交换机的出现,逐渐进化成全双工的通信。
集线器-在物理层扩展以太网
- 传统以太网最初是使用粗同轴电缆,后来演进到使用比较便宜的细同轴电缆,最后发展为使用更便宜和更灵活的双绞线。
- 采用双绞线的以太网采用星形拓扑,在星形的中心则增加了一种可靠性非常高的设备,叫做集线器 (hub)。
- 集线器是也可以看做多口中继器,每个端口都可以成为一个中继器,中继器是对减弱的信号进行放大和发送的设备
- 集线器的以太网在逻辑上仍是个总线网,需要使用CSMA/CD协议来协调各主机争用总线,只能工作在半双工模式,收发帧不能同时进行
集线器HUB在物理层扩展以太网
使用集线器扩展:将多个以太网段连成更大的、多级星形结构的以太网
但其本质上,不过是用了n个集线器,构成了一个更大的总线以太网,集线器只有纯转发作用(还有信号放大等等辅助转发的功能)
- 优点
- 使原来属于不同碰撞域的以太网上的计算机能够进行跨碰撞域的通信。
- 扩大了以太网覆盖的地理范围。
- 缺点
- 碰撞域增大了,但总的吞吐量并未提高。
- 如果不同的碰撞域使用不同的数据率,那么就不能用集线器将它们互连起来。
- 且两个站点之间如果是铜线连接的情况下,不可以离的太远,过远会造成信号失真,导致连最基本的载波监听都做不到(因为信号衰减到太弱了)
在数据链路层扩展以太网(网桥、交换机)
概念
- 扩展以太网更常用的方法是在数据链路层进行。
- 早期使用网桥,现在使用以太网交换机。
那么就先从网桥开始了解,然后再进化到交换机。
重要概念:
碰撞域(collision domain)
- 碰撞域又称为冲突域,是指网络中一个站点发出的帧会与其他站点发出的帧产生碰撞或冲突的那部分网络。这一部分网络称为冲突域
- 碰撞域越大,发生碰撞的概率越高。
广播域(broadcast domain)
- 指在一部分网络中,其中任何一台设备发出的广播帧都能被该部分网络中的所有其他设备所接收。这一部分网络成为广播域。
网桥
网桥
- 网桥工作在数据链路层。采用存储转发的方式
- 它根据 MAC 帧的目的地址对收到的帧进行转发(按照转发表内容转发)和过滤(CRC)。
- 当网桥收到一个帧时,并不是向所有的接口转发此帧,而是先检查此帧的目的MAC 地址,然后通过查询表,来再确定将该帧转发到哪一个接口,或CRC校验失败把它丢弃。
- 其工作方式为半双工
-
网桥工作在数据链路层,将两个LAN连起来,根据MAC地址来转发帧,可以看作一个“低层的路由器”(路由器工作在网络层,根据网络地址如IP地址进行转发)。
-
网桥的工作原理:
将两个相似的网络通过网桥连接起来,就可以成为一个覆盖范围更大的以太网,而原来的每个以太网,就可以成为一个 网段,同时,每个网段都是一个小局域网(即之前的独立冲突域)
网桥可以将冲突域隔离开来(非广播帧的情况下),比如主机H1到H2的帧,网桥B1就会将共享信道上的冲突,控制在H1和H2的网段上,而不会影响到其他网段,后面马上就会有详细的说明。
转发流程举例:
网桥依靠转发表来转发帧。转发表也叫作MAC地址表,记录了每个接口所能到达(连接或间接连接)的各站点的MAC地址。至于转发表如何得出,我们将在后面讨论。网桥若从接口1收到A发给E的帧,则在查找地址表后,把这个帧送到接口2转发到另一个网段,使E能够收到这个帧
网桥若从接口1收到A发给B的帧,就会丢弃这个帧,因为转发表指出,转发给B的帧应当从接口1转发出去,而现在正是从接口1收到这个帧,这说明B和A处在同一个网段上,B能够直接收到这个帧而不需要借助于网桥的转发。
当网桥收到一个广播帧时(目的MAC地址为全1的广播地址),会向除了接收接口以外的其他接口转发。
网桥的优点:
- 因为隔离了冲突域,所以可以过滤通信量,增大吞吐量。
- 扩大了物理范围
- 增加了可靠性,因为网络一旦出现故障仅仅影响个别网段,而不会影响所有网段
- 可适配不同类型的物理连接,不同的MAC子层和不同速率
网桥的缺点:
- 因为有存储转发的过程,所以增加了处理的时延
- 没有流量控制的功能,一旦负载过大,等待队列放不下了就得丢弃
- 因为网桥会直接转发广播帧,所以可能会导致传播过多的广播信息而造成拥塞从而导致广播风暴
透明网桥概念
简单来说,就是网桥的地址表的建立过程!!网桥MAC地址表在不断地转发帧的过程中来完善这个转发表。而上层的调用方是不需要关心这个过程的。因此网桥这个设备是即插即用的设备
目前使用最多的网桥是透明网桥,所谓透明网桥,是指局域网上的站点,并不知道发送的帧会经过几个网桥。对其经过的网桥不需要关心,因此就有了透明网桥概念。
因为这个过程,和后面交换机的自学习和转发帧的过程非常相似,思想上几乎一致,所以这里不再赘述,后面会详细解读。
交换机
交换机
- 1990 年问世的交换式集线器 (switching hub) 可明显地提高以太网的性能。
- 交换式集线器常称为以太网交换机 (switch) 或第二层交换机 (L2 switch),强调这种交换机工作在数据链路层。
- 以太网交换机实质上就是一个多接口的网桥
- 其工作方式为全双工
集线器HUB与交换机SWITCH区别
使用集线器互连而成的共享总线式以太网上的某个主机,要给另一个主机发送单播帧,该单播帧会通过共享总线传输到总线上的其他各个主机
使用交换机互连而成的交换式以太网上的某个主机,要给另一个主机发送单播帧,该单播帧进入交换机后,交换机会将该单播帧转发给目的主机,而不是网络中的其他各个主机
这个例子的前提条件是忽略ARP过程,并假设交换机的帧交换表已经学习或配置好了
以太网交换机的交换方式
- 存储转发方式
- 把整个数据帧先缓存后再进行处理。
- 直通 (cut-through) 方式
- 接收数据帧的同时就立即按数据帧的目的 MAC 地址决定该帧的转发接口,因而提高了帧的转发速度。
- 缺点是它不检查差错就直接将帧转发出去,因此有可能也将一些无效帧转发给其他的站。
这个例子的前提条件是忽略ARP过程,并假设交换机的帧交换表已经学习或配置好了
对比集线器和交换机(单个网段)
后续例子的前提条件是忽略ARP过程,并假设交换机的帧交换表已经学习或配置好了
单台主机给另一台主机发送单播帧
集线器以太网:会在整个共享信道上,把单播帧广播给所有的主机。目的主机正常接收,非目的主机收到后丢弃
交换机以太网:会将它们缓存起来,然后逐个转发给目的主机,不会产生碰撞
单台主机给信道上的所有主机发送广播帧
集线器以太网:可以正常完成广播帧的发送
交换机以太网:可以正常完成广播帧的发送
多台主机同时给另一台主机发送单播帧
集线器以太网:会产生碰撞,遭遇碰撞的帧会传播到总线上的各主机
交换机以太网:会将它们缓存起来,然后逐个转发给目的主机,不会产生碰撞
对比集线器和交换机(多个网段)
集线器扩展以太网和交换机扩展以太网区别
单播
广播
多个单播
总结:
以太网交换机自学习和转发帧的流程
以下例子假设各主机知道网络中其他各主机的MAC地址(无需进行ARP)
A地址向B地址发送数据帧
流程如下:
- A 先向 B 发送一帧。该帧从接口 1 进入到交换机1
- 交换机1收到帧后,先查找(图中左边)交换表。没有查到应从哪个接口转发这个帧给 B
- 交换机1把这个帧的源地址 A 和接口 1 写入(图中左边)交换表中
- 交换机1向除接口 1 以外的所有的接口广播这个帧
- 广播帧从交换机1的接口 4到交换机2的接口 2,交换机2收到帧之后,先查自己的交换表。没有查到应从哪个接口转发这个帧给 B
- 交换机2把这个帧的源地址 A 和接口 1 写入(图中右边)交换表中
- 除B主机之外与该帧的目的地址不相符,将丢弃该帧
- 回到交换机1的视角,主机B发现是给自己的帧,接受该帧
B地址向A地址发送数据帧
流程如下:
- B 向 A 发送一帧。该帧从接口 3 进入到交换机1
- 交换机1收到帧后,先查找(图中左边)交换表。发现(图中左边)交换表中的 MAC 地址有 A,表明要发送给A的帧应从接口1转发出去。于是就把这个帧传送到接口 1 转发给 A。(就不需要再把这个帧广播了)
- 主机 A 发现目的地址是它,就接受该帧
- 交换机1把这个帧的源地址 B 和接口 3 写入(图中左边)交换表中
E地址向A地址发送数据帧
流程如下:
- E 向 A发送一帧
- 交换机2收到帧后,先查找自己的交换表(图中右边)。发现(图中右边)交换表中的 MAC 地址有 A以及A对应的接口,表明要发送给A的帧应从接口2转发出去。于是就把这个帧传送到接口 2 转发给 接口 4。(因此不必再在交换机2内部进行广播了)
- 交换机2把这个帧的源地址 E 和接口 3 写入自己的交换表中(图中右边)。
- 交换机1的接口 4 接收到帧,先查找(图中左边)自己的交换表。发现(图中左边)交换表中的 MAC 地址有 A,表明要发送给A的帧应从接口1转发出去。于是就把这个帧传送到接口 1 转发给 A。
- 交换机1把这个帧的源地址 E 和接口 4 写入(图中左边)交换表中
- 主机 A 发现目的地址是它,就接受该帧
G地址向A地址发送数据帧
流程如下:
主机 A、主机 G、交换机1的接口 1就共享同一条总线(相当于总线式网络,A、G、接口1 都以总线型连接在一起,相当于在一个网段上)
- 主机 G 发送给 主机 A 一个帧,但因为 A、G、接口1 都以总线型连接在一起。所以在这个总线上,相当于广播帧
- 主机 A 和 交换机1接口 1都能接收到
- 主机 A 的网卡收到后,根据帧的目的MAC地址A,就知道是发送给自己的帧,就接受该帧
- 交换机1收到该帧后,首先进行登记工作
- 然后交换机1对该帧进行转发,该帧的MAC地址是A,在(图中左边)自己的交换表里查找MAC 地址有 A
- MAC 地址为 A的接口号是1,但是该帧正是从接口 1 进入交换机的,交换机1不会再从该接口 1 将帧转发出去,因为这没有必要,原因:**(该帧源地址是G,经由接口是1,目的地址是A,经由接口也是1),所以交换机可以判断这个帧来自于同一个网段,而同一个网段下帧都是广播的。**于是丢弃该帧
随着网络中各主机都发送了帧后,网络中的各交换机就可以学习到各主机的MAC地址,以及它们与自己各接口的对应关系
考虑到可能有时要在交换机的接口更换主机,或者主机要更换其网络适配器,这就需要更改交换表中的项目。为此,在交换表中每个项目都设有一定的有效时间。过期的项目就自动被删除。自动删除后,仍然可以再学习。
以太网交换机的这种自学习方法使得以太网交换机能够即插即用,不必人工进行配置,因此非常方便。
举个例子:
以太网交换机的生成树协议STP
这玩意的出现时为了提高以太网可靠性的
在使用透明网桥的过程中,是不可以有链路产生环路的,否则可能会导致帧在链路中不停兜圈子
这里用两个网桥将两个局域网LAN1和LAN2互连起来。设站点A发送一个帧F,它经过网桥B1和B2(见箭头❶和箭头❷)。
假定帧F的目的地址均不在这两个网桥的转发表中,因此B1和B2都转发帧F(见箭头❸和箭头❹)。经B1和B2转发的帧F到达LAN2,我们将其分别记为F1和F2。接着F1传到网桥B2(见箭头❺),而F2传到网桥B1(见箭头❻)。网桥B2和网桥B1分别收到F1和F2后,又将其转发到LAN1。结果,帧在网络中不停地兜圈子,从而使网络资源不断地被白白消耗。
引出问题
试想一下,如果以太网有链路断掉了怎么办,直接就断网了
有没有什么办法?有,添加冗余链路。
这种情况就得靠添加冗余链路来实现。
当然,一味地添加冗余链路也不是万能的
一旦网络构成环路就会造成网络风暴问题,也就是最开始举的网桥例子,会造成不停兜圈子的情况,而后面的帧越压越多,就会导致网络风暴
网络风暴:由于网络拓扑的设计和连接问题,或其他原因导致广播在网段内大量复制(不停反复广播已经广播过的帧),传播数据帧,导致网络性能下降,甚至网络瘫痪。这就是网络风暴。
生成树协议STP
生成树协议会保证,任何两个站点之间,只有一条路径(直接连接也好,跨交换机到达也罢,总之就是只有一条路),所以这也是为什么叫生成树协议
一旦生成树确定了,网桥或者交换机,就会关闭不在生成树上的那些端口(这些端口不在收发帧),保证其不会产生环路,即STP协议来让交换机自行阻塞端口,从而避免出现环形网络。
虚拟局域网VLAN
注意:VLAN技术的实现通过交换机实现的,并且VLAN只是局域网给用户提供的一种服务,而不是一种新型局域网
为什么要有虚拟局域网VLAN
广播风暴
广播风暴就是广播帧传遍整个广播域,这种情况太浪费资源。假设不隔离广播域,某台主机发出了一个广播帧,那么上百台主机都要接收你的广播帧,而实际上为了找一个目的主机来广播风暴式发送是非常占资源的。所以广播风暴的玩法应该避免。或者说,可以把广播局限在一个必要的小范围内部。不让广播通信大范围传播,来间接限制广播风暴的资源占用。
为了分割广播域,所以虚拟局域网VLAN技术应运而生,在逻辑上实现广播域的分割
分割广播域的方法
- 利用以太网交换机可以很方便地实现虚拟局域网 VLAN (Virtual LAN)。
- IEEE 802.1Q 对虚拟局域网 VLAN 的定义:
虚拟局域网 VLAN 是由一些局域网网段构成的与物理位置无关的逻辑组,而这些网段具有某些共同的需求。每一个 VLAN 的帧都有一个明确的标识符,指明发送这个帧的计算机是属于哪一个 VLAN,所以接收该帧的计算机,也得是该VLAN下的计算机。 - 同一个VLAN内部可以广播通信,不同VLAN不可以广播通信(因为隔离了广播域)
- 虚拟局域网其实只是局域网给用户提供的一种服务,而并不是一种新型局域网。
- 由于虚拟局域网是用户和网络资源的逻辑组合,因此可按需将有关设备和资源重新组合划分VLAN即可,其原有的物理布线几乎不用再动了。
虚拟局域网VLAN的实现机制
实际上还是对MAC帧加入了某些信息
虚拟局域网VLAN技术是在交换机上实现的,需要交换机能够实现以下功能
- 能够处理带有VLAN标记的帧——IEEE 802.1 Q帧
- 交换机的各端口可以支持不同的端口类型,不同端口类型的端口对帧的处理方式有所不同
端口类型
Access端口
交换机与用户计算机之间的互连
接口中的大A代表Access
当普通帧从A接口进入Access接口交换机的时候,它会对收到的未打标签的普通MAC帧进行打标签(插入VLAN标记字段),因为A标签的PVID是1,所以这个被打标记的帧的VID也是1。这个时候这个帧再广播的时候,这个帧只会经过PVID=1的端口,再经过PVID的时候,就会去标签转发。这样就可以通过PVID对VLAN进行划分。
注:这里PVID的P指的是Port
Access端口接收到代VID的会有两种处理方法
- 如果该帧的VID等于当前端口的VID(PVID),那么就会去掉这个帧已经打上的VID标签继续进行广播
- 如果该帧的VID等于当前端口的VID(PVID),那么则认为是不属于本VLAN的帧,就会直接丢弃该帧
同一个VLAN内部可以广播通信,不同VLAN不可以广播通信(发现不是自己VLAN的帧直接丢弃了)
Truck端口
交换机之间或交换机与路由器之间的互连
如果从ACCESS端口到Trunk端口进行转发,如果PVID和VID是不同的情况,那么这个时候不会对其PVID进行修改,直接进行转发。
从书上抄来的例子,解释的很好
如图所示,管理员可以将交换机的某个接口配置为Trunk接口,将两个VLAN交换机用一对Trunk接口互连,由于Trunk接口可以同时属于多个VLAN,因此多个VLAN可以共享同一条中继来传输各自的帧。
问题是交换机如何知道从一个Trunk接口上接收到的一个帧是属于哪个VLAN的呢?答案还是用VLAN标记(Tag),用来指明该帧来自于哪一个VLAN
当交换机需要将普通帧从Trunk接口转发出去时,VLAN标记被插入帧;当插入VLAN标记的帧要从非Trunk接口转发出去时,要将该VLAN标记删除。
因此,802.1Q标准虽然修改了以太网的帧格式,但对所有连接非Trunk接口的用户站点是完全透明的(完全感觉不到Trunk打标记的过程,拿到手和普通帧是一样的),802.1Q标记帧仅在交换机间各VLAN复用的Trunk链路上使用。
如果某个帧,在通过Trunk端口时,发现以及打过VID了,依旧会对其进行放行(不丢弃),且不改变其VID
小例题
华为交换机私有的Hybrid端口类型