最近建立了一个知识库,里面很多相关知识,欢迎来访:https://www.yuque.com/zhumulangmafeng-5sdfr
前言
之前我们已经学习了原理体系结构中的物理层,也写了非常详细的博客。如果没有看可以先去学习一下,这样有助于我们对数据链路层的学习。
接下来我们正式开始学习数据链路层!
目录
数据链路层的基本概念
之前我们学习的原理体系结构中,一共分为五层。上次学习了第一层物理层,这次来学习一下物理层的直接上层——数据链路层。
(1) 链路:就是从一个结点到相邻结点的一段
物理线路
,而中间没有任何其他交换结点。
(2)数据链路:是指把实现通信协议的硬件和软件加到链路
上,就构成了数据链路。
例如从一台主机传输到另一台主机过程为:
而具体的需要经过:
我们在学习数据链路层的时候,可以把消息传递看作是数据链路层上面的横向传播。如下:
而数据链路层的主要功能就是用于两个设备(同一种数据链路节点)之间进行信息传递。
数据链路层以帧为单位传输和处理数据。
数据链路层的重要问题
在点对点信道的数据链路层进行传输我们需要考虑以下问题。
封装成帧
之前说过了数据链路层以帧为单位传输和处理数据,那么我们就会牵扯到如何把上层传输过来的数据变成帧呢?
封装成帧:在数据的头部和尾部加上标记(
加上帧头和帧尾
),确定帧的范围。
差错检测
传输过程中可能会产生比特差错: 1可能会变成0而0也可能变成1。
误码率BER(BitErrorRate):在一段时间内,传输错误的比特占所传输比特总数的
比率
。误码率与信噪比有很大的关系
。
为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。
可靠传输
使用差错检错技术,接受方的数据链路层就可以检测出帧在传输过程中是否出现误码。
不可靠传输:
仅仅丢弃有误码的帧
,其他的什么也不做。
可靠传输:想方法实现发送端发送什么,接收端就收到什么
。
是否是可靠传输这取决于数据链路层向上层提供的服务类型。
一般来说,有线链路的误码率比较低,为了减小开销,并不要求数据链路层向上提供可靠传输服务,即使出现了误码,可靠传输的问题由其上层处理。
无线链路易收到干扰,误码率比较高,因此要求数据链路层必须向上层提供可靠传输。
在使用广播信道的数据链路层和数据链路层的互联设备上我们还要考虑其他的一些问题。
这些就是我们本次要解决的问题,接下来我们进行详细的学习。
封装成帧
封装成帧:是指数据链路层给上层交付的协议数据单元
添加帧头和帧尾
使之成为帧。
如下两种都是常见的两种帧的格式:
要知道帧头和帧尾中包含有重要的控制信息。
数据在经过数据链路层之后,会在经过物理层,物理层再把数据进行传输之前会把数据转换为比特流,如下:
那么接收方的数据链路层如何从物理层交付的比特流中提取出一个一个的帧呢?
其实帧头和帧尾的作用之一就是帧定界。
其实也不是所有的帧都有帧定界符的,比如以太网V2的MAC帧就没有帧定界符,它是通过前导码和帧间间隔来识别一个一个的帧的。
ASCII控制字符SOH
表示帧首部开始,EOT
表示帧的结束。
透明传输
我们在传输信息中会遇到这么一个问题:
如果说我们对传输的信息有要求,要求信息中不能存在帧定界符,这其实就是不透明传输。
不透明传输其实没有什么意义的,对于传输的信息内容都有要求的话,那么我们还能传输什么信息呢?
所以我们就要求透明传输。
透明传输:是指数据链路层对上层交付的传输数据
没有任何限制
,就好像数据链路层不存在一样。
也就是说:数据链路层传送的比特组合必须是不受限制的。
那么我们怎么样才能实现透明传输的问题呢?
(1)面向
字节的物理链路
使用字节填充(或称字符传输)的方法实现透明传输。
(2)面向比特的物理链路
使用比特填充的方法实现透明填充。
例如使用采用字节填充法解决透明传输的问题
(1)字节填充或字符填充——发送端的数据链路层在数据中出现控制字符“SOH”或“EOT”的前面
插入一个转义字符“ESC”
。
(2)接收端的数据链路层在将数据送往网络层之前删除插入的转义字符
。
(3)如果转义字符也出现数据当中,那么应在转义字符前面插入一个转义字符
。当接收端收到连续的两个转义字符时,就删除其中前面的一个。
为了提高帧的传输效率,我们应当使帧的数据部分的长度尽可能大些
。
又考虑到差错控制等多种因素,每一种数据链路层协议都规定了帧的数据部分的上限长度,即:最大传输单位MTU
。
差错检测
实际的通信链路都不是理想的,比特在传输过程中可能会产生差错:1可能会变成0,而0也可能会变成1。这称为比特差错。
误码率BER(BitErrorRate):在一段时间内,传输错误的比特占所传输比特总数的
比率
。误码率与信噪比有很大的关系
。
使用差错检测码
来检测数据在传输过程中是否产生了比特差错,是数据链路层索要解决的重要问题之一。
奇偶校验
奇偶校验:在待发送的
数据后面添加1位奇偶校验位
,使得整个数据(包括所添加的校验码
位在内)中的“1”的个数为奇数(奇校验)或偶数(偶校验)。
如果有奇数个位发生误码
,则奇偶性发生变化,可以检查出误码
;
如果有偶数个位发生误码
,则奇偶性不发生变化,不能检查出误码(漏检)
;
可见漏检率比较高所以一般不使用这种检测方法。
循环冗余校验CRC
循环冗余校验CRC
(1)收发双方约定好一个
生成多项式G(x)
.
(2)发送方基于待发送的数据生成多项式计算出差错检测码(冗余码)
,将其添加到带传输数据的后面一起传输
。
(3)接收方通过生成多项式来计算
收到的数据是否产生了误码
。
接下来看个例题来理解一下这个过程。
发送方:
接收方:
检错码只能检测出真在传输中是否出现了差错,并不能定位错误,因此无法纠正错误。
要想纠正传输中的差错,可以使用冗余信息更多的纠错码进行前向纠错。但纠错码的开销比较大,在计算机网络中较少使用。
循环冗余校验CRC有很好的交错能力(漏检率非常低),虽然计算比较复杂,但非常易于用硬件实现,因此被广泛应用于数据链路层。
可靠传输
使用差错检错技术,接受方的数据链路层就可以检测出帧在传输过程中是否出现误码。
不可靠传输:
仅仅丢弃有误码的帧
,其他的什么也不做。
可靠传输:想方法实现发送端发送什么,接收端就收到什么
。
是否是可靠传输这取决于数据链路层向上层提供的服务类型。
一般来说,有线链路的误码率比较低
,为了减小开销,并不要求数据链路层向上提供可靠传输服务
,即使出现了误码,可靠传输的问题由其上层处理。
无线链路易收到干扰
,误码率比较高,因此要求数据链路层必须向上层提供可靠传输
。
比特传输只是传输差错中的一种
。从整个计算机网络体系结构老看,传输差错还包括分组丢失
,分组失序
以及分组重复
等。
分组丢失
,分组失序
以及分组重复
这些传输差错,一般不会出现在数据链路层,而会出现在其上层。
同时可靠传输服务也并不局限于数据链路层,其他各层均可选择实现可靠传输。
可靠传输的实现比较复杂,开销也比较大,是否使用可靠传输取决于应用需求。
接下来我们来介绍三种可靠传输的实现机制分别是:
停止-等待协议SW
,回退N帧协议GBN
,选择重传协议SR
同样他们也并不局限于数据链路层,可以应用到计算机网络体系结构的各层协议中。
停止-等待协议SW
(1)首先,每次发送方都
只发一个数据分组
,接收方对数据分组进行差错检测,检验是否有误码
。
- 如果没有误码,那么给发送方
发送ACK确认分组
;- 如果有误码,则丢弃分组,并给发送方
发送NAK否认分组
;
(2)但其实,数据分组在传输过程中并不会那么一帆风顺,数据分组有可能在半路上遇到一个已经满了的路由器等情况,此时路由器会毫不犹豫地丢失该分组,如此便会产生数据分组被丢失,发送方等不到接收方的ACK或者NAK
。
所以,我们需要给每次的数据分组的传输提供一个超时计时器
,若到了超时计时器所设置的重传时间,而发送方仍收不到接收方的ACK或NAK,则重传原来的数据分组
。
(3)在传输的过程中接收方的确认可能会丢失或者迟到
。这样就会导致发送方误判重新传一个重复的数据
,而接受方也无法判断这个数据是不是接受过。或者来了一个重复的确认
不能判断这个ACK是哪个消息的。
所以我们需要给发送方发送的消息和接受方发送的ACK进行编号使他们相互对应
来避免这些问题的发生。
在停止等待协议中我们还要注意:
- 一般可将重传时间选为略大于“从发送方到接收方的平均往返时间”。
- 在数据链路层点对点的往返时间比较确定,重传时间比较好设定。
- 但是在运输层,由于端到端往返时间非常不确定,设置合适的重传时间有时并不容易。
停止等待协议的信道利用率
在传输过程如下:
所以由上图,信道利用率U为:
由公式我们可以知道:
(1)当
往返时延RTT远大于数据的发送时延时
(例如使用卫星链路),信道利用率就会非常低
。
(2)如果出现重传
,对于传送有用的数据信息来说,信道利用率还要低
。
所以为了解决信道利用率低的问题,就产生了另外的两种协议。
回退N帧协议GBN
停止等待协议的信道利用率比较低,那么我们该如何去解决这个问题呢?
停止等待协议在传输中都是单个信息进行传输的,其实我们可以一次传输多条信息,这样就可以解决信道利用率低的问题了。接下来我们学习回退N帧协议。
我们在发送方和接收方分别定义设置一个发送窗口与接收窗口。
(1)采用比特给数组编序号,即序号0~7;
(2)发送窗口的尺寸的取值为1~7(2的三次方减一)
;
(3)接收窗口的尺寸的取值为1
;
我们这里设置发送窗口的尺寸为5。
我们这里发送的消息就是一串编号从0到7的信息,一直0~7循环。
每次我们容许传输的就是在发送窗口有内的数据。我们将这些数据一次传输到接收方去。
而接收窗口的大小为1,所以接受窗口会一个一个进行差错检测,是否出错。
到检查完发送过来的分组之后,接收窗口就会在等待发送窗口发送消息过来。
同时在接收窗口检查完没有出错之后,发送窗口就会进行前移。
接收方不一定要对收到的数据分组逐个发送确认,可以等到收到几个数据分组后对按序到达的最后一个分组发送确认。
对于发送方:
(1)发送窗口尺寸
T
的取值范围是:
1 < T < = 2 n − 1 1<T <=2^n-1 1<T<=2n−1
其中n
是构成分组序号的比特数量
(种类数)。
当W=1时就是停止等待协议
当 T > 2 n − 1 T >2^n-1 T>2n−1接收方无法辨析新旧数据分组
。
(2)发送方可在未收到接收方确认分组的情况下,将序号落在发送窗口内的多个数据分组全部发送出去;
(3)发送方只有收到
对已发送数据分组的
确认时,
发送窗口才能向前相应滑动;
(4)发送方收到多个重复确认
时,可在
重传计时器超时前尽早开始重传
,由具体实现决定。
(5)发送方发送窗口内某个已发送的数据分组产生超时重发时
,其后续在发送窗口内的分且已发送的数据分组也必须重传
,这就是回退N帧协议。
对于接收方:
(1)接收方的的
接收窗口取值R为1
,因此接收方只能按序接收分组
。
(2)接收方只接受序号落在接收窗口内且无误码
的数据分组,并且将接收窗口向前滑动一个位置
,为此同时给发送方发回相应的确认分组,为了减少开销接收方不一定要对收到的数据分组逐个发送确认。
- 而是可以在连续收到好几个按序到达且无误码的数据分组后,在针对最后一个数据分组发回确认分组,这也称为
累计确认
。- 或者可以在自己有数据分组发送时才对之前按序接收且无误码的数据分组进行
捎带确认
。(3)接收方
收到未按需到达的数据分组
,除丢弃外,还要对最近按序接收的数据分组进行确认
。
在协议工作中发送窗口与接收窗口不断向前滑动,因此这类协议又称为滑动窗口协议
。
由于回退N帧协议的特性,当通信线路质量不好时,其信道利用率并不比停止等待协议高。
选择重传协议
回退N帧协议的接收窗口尺寸R只能等于1
,因此接收方只能按序接收正确到达的数据分组
。
一个数据分组的误码就会导致其后续多个数据分组不能被接收方按序接收而丢弃(尽管他们无乱序和误码)。这势必会造成发送方对这些数据分组的超时重传,显然这是对通信资源的极大浪费。
为了进一步提高性能,可以设法只重传出现误码的数据分组。因此,接收窗口的尺寸R不应再等于1(应该大于1)
,以便接收方先收下失序到达但无误码并且序号落在接收窗口内的那些数据分组
,等到所缺分组收起在一并送交上层
,这就是选择重传协议。
注意:选择重传协议为了使发送方仅重传出现差错的分组,接收方不能再使用累计确认,而需要对每一个正确接收到的数据分组进行逐一确认。
(1)采用比特给数组编序号,即序号0~7;
(2)发送窗口的尺寸的取值T
:T=1~7(2的三次方减一);
(3)接收窗口的尺寸的取值R
:R=T;
对于发送方:
(1)发送窗口尺寸
T
的取值范围是:
1 < T < = 2 n − 1 1<T <=2^n-1 1<T<=2n−1
其中n
是构成分组序号的比特数量
(种类数)。
当W=1时就是停止等待协议
当 T > 2 n − 1 T >2^n-1 T>2n−1接收方无法辨析新旧数据分组
。
(2)发送方可在未收到接收方确认分组的情况下,将序号落在发送窗口内的多个数据分组全部发送出去;
(3)发送方只有按序收到对已发送数据分组的确认时
,发送窗口才能向前相应滑动
;若收到未按序到达的确认分组时
,对其进行记录
,以防止其相应数据分组的超时重发,但发送窗口不能向前滑动
;
对于接收方:
(1)接收窗口尺寸R的取值范围是 1 < R < = T 1<R<=T 1<R<=T
- R = 1时,与停止等待协议相同
- R > T时,无意义。
(2)接收方
可接受未按序到达但没有误码并且序号落在接收窗口内的数据分组
。
- 为了使发送方仅重传出现差错的分组,接收方不能在采用累计确认,而需要
对正确接收到的分组逐一确认!
(3)接收方只有在
按序接收到数据分组之后
,接收窗口才能向前相应滑动
。
点对点PPP协议
点对点协议PPP是目前
使用最广泛的
点对点数据链路层协议。
PPP协议为在点对点链路传输各种协议数据报提供了一个标准方法,主要由以下三部分构成:
(1)对各种协议数据报的
封装方法
(封装成帧);
(2)链路控制协议LCP
:用于建立,配置以及测试数据链路的连接;
(3)一层网络控制协议NCPs
:其中每一个协议支持不同的网络层协议;
帧格式:
PPP帧的首部和尾部分别为四个字段和两个字段。
首部
首部中的标志字段F(Flag),规定为0x7E(符号0x表示它后面的字符是用十六进制表示的。十六进制的7E的二进制表示是01111110),标志字段表示一个帧的开始。
首部中的地址字段A规定为0xFF(即11111111)。
首部中的控制字段C规定为0x03(即00000011)。
首部中的2字节的协议字段:
-
当协议字段为0x0021时,PPP帧的信息字段就是IP数据报。
-
当协议字段为0xC021时,PPP帧的信息字段就是PPP链路控制协议LCP分组。
-
当协议字段为0x8021时,PPP帧的信息字段就是网络层的控制数据NCP分组。
信息字段
信息字段的长度是可变的,不超过1500字节
尾部
尾部中的第一个字段(2个字节)是使用CRC的帧检验序列FCS。
尾部中的标志字段F(Flag),规定为0x7E(符号0x表示它后面的字符是用十六进制表示的。十六进制的7E的二进制表示是01111110),标志字段表示一个帧的结束。
当信息字段中出现和标志字段一样的比特(0x7E)组合时,就必须采取一些措施使这种形式上和标志字段一样的比特组合不出现在信息字段中。也就是之前提到过的实现透明传输
。
我们针对面向字节的异步链路和面向比特的同步链路进行不一样的处理。
面向字节的异步链路
当PPP使用异步传输时,它把转移符定义为0x7D,并使用
字节填充
。
RFC1662规定了如下填充方法:
-
把信息字段中出现的每一个0x7E字节转变为2字节序列(0x7D,0x5E)。
-
若信息字段中出现一个0x7D的字节(即出现了和转义字符一样的比特组合),则把转义字符0x7D转变为2字节序列(0x7D,0x5D)。
-
若信息字段中出现ASCII码的控制字符(即数值小于0x20的字符),则在该字符前面要加入一个0x7D字节,同时将该字符的编码加以改变。例如,出现0x03(在控制字符中是“传输结束”ETX)就要把它转变为2字节序列的(0x7D,0x31)。
由于在发送端进行了字节填充,因此在链路上传送的信息字节数就超过了原来的信息字节数。但接收端在接收到数据后再进行与发送端字节填充相反的变换
,就可以正确地恢复出原来的信息。
面向比特的同步链路
面向比特的同步链路我们一般使用
比特填充法
插入比特0。
零比特填充的具体方法:
-
在发送端先扫描整个信息字段(通常使用硬件实现,但也可以用软件实现,但是会慢一些)。
-
只要发现有5个连续的1,则立即填入一个0。
-
接收端在收到一个帧时,先找到标志字段F以确定帧的边界,接着再用硬件对其中的比特流进行扫描,每当发现5个连续1时,就把5个连续1后的一个0删除,以还原成原来的信息比特流。
工作状态
媒体接入控制
共享信道要着重考虑的一个问题就是如何协调多个发送和接受站点对一个共享传输媒体的占用,即媒体媒体接入控制
MAC
。
媒体接入控制分为静态划分信道
和动态接入控制
。具体如下:
随着技术的发展,交换技术的成熟和成本的降低,具有更高性能的使用点对点链路和链路层交换机的交换式局域网
在有线领域已完全取代了共享式局域网
,但由于无线信道的广播天性,无线局域网仍然使用的式共享媒体技术
。
静态划分信道
信道复用是通信技术中的一个重要概念。复用就是通过一条物理线路同时传输多路用户的信号。
当网络中传输媒体的传输容量大于多条的单一信道传输的总通信量
时,可利用复用技术在一条物理线路上建立多条通信信道来充分利用传输媒体的带宽。
信道复用又分为:
频分复用FDM
,时分复用TDM
,波分复用WDM
,码分复用CDM
频分复用FDM
频分复用的所有用户
占用不同的频带资源并行通信
。
时分复用TMD
时分复用的所有用户
在不同的时间占用同样的频带宽度
波分复用WDM
波分复用其实就是
光的频分复用
码分复用CDM
与FDM和TDM不同,CDM的每一个用户
可以在相同的时间使用同样的频带进行通信
。
由于各用户使用经过特殊挑选的不同码型,因此各用户之间不会造成干扰
。
码分复用CDM是另一种共享信道的方法,实际上,由于该技术主要用于多址接入,人们更常用的名词是码分多址CDMA。
在CDMA中,每一个比特时间在划分为m个短的间隔,称为
码片
。
使用CDMA的每一个站被指派一个唯一的m bit码片序列 。
- 一个站如果要发送比特1,则发送它自己的m bit码片序列;
- 一个站如果要发送比特0,则发送他自己的m bit码片序列的二进制反码
码片挑选原则如下:
- 分配给每一个站的码片序列必须各不相同,实际常采用伪随机码序列。
- 分配给每个站的码片序列必须相互正交(规格化内积为0)。
规格化内积为0,参考:
令向量S表示站S的码片序列,令向量T表示其他任何站的码片序列。
两个不同站S和T的码片序列正交,就是向量S和T的规格化内积。
应用举例
动态接入控制
动态接入控制中的受控接入已经被淘汰,我们直接学习随机接入。
随机接入又分为两种:载波监听多址接入/碰撞检测 CSMA/CD
和载波监听多址接入/碰撞避免 CSMA/CA
载波监听多址接入/碰撞检测 CSMA/CD
首先要清楚几个概念:
(1)多址接入MA:多个站连接在一条总线上,竞争使用总线。
(2)载波监听CS:每一个站在发送帧之前先要检测一下总线上是否有其他站点在发送帧(先听后说)。
- 若检测到总线空闲96比特时间,则发送这个帧;
- 若检测到总线忙,则继续检测并等待总线转为空闲96比特时间,然后再发送这个帧;
(3)碰撞检测CD:每一个正在发送帧的站边发送边检测碰撞(边说边听)。
- 一旦发现总线上出现碰撞,立即停止发送,退避一段时间再次发送。
最大帧长
为什么要有最大帧长?
如果一个帧的长度过大,一个站点不停地发送帧,让其他站点一直无法无法使用信道;另外如果帧的长度过大,接收方的缓冲区可能也装不下该帧产生溢出。
最小帧长
为什么要有最小帧长?
因为如果帧的长度过小,站点A在极短时间内将帧a全部发送成功。因为发送动作完成,A不再进行碰撞检测。那么当其他站点发送帧时,和该帧产生了碰撞。接收端检测帧a后,将其丢弃。此时站点A即不能知道帧a发生了碰撞也不会重传该帧。
最小帧长的作用?
保证了站点在帧在发送过程中,能够检测到帧是否发生了碰撞。
- 若在争用期内没有检测到碰撞,那么后续发送的数据就一定不会发生碰撞(因为争用期中没有发生碰撞,表明无其他站点争用主线,那么只有单个站点进行数据帧的发送。)
- 若在争用期内检测到碰撞,停止发送数据。(之前发送的帧被接收方进行插错检测后丢弃)
争用期
当帧发生碰撞后会向其发送站点返回碰撞信号,设该帧发送时间为t,则检测到碰撞信号的时间为2t,则在整个信道上,取该时间的最大值为2T为争用期。T为单程端对端的传播时延。
截断二进制指数
当发生碰撞时立即停止发送帧。隔一段时间后重新发送。那么需要隔多长时间呢?
退避时间 = 争用期(2t)* 随机次数r
CSMA/CD协议曾经用于各种总线结构以太网和双绞线以太网的早期版本中。
现在的以太网基于交换机和全双工连接,不会有碰撞,因此没有必要使用CSMA/CD协议。
载波监听多址接入/碰撞避免 CSMA/CA
在无线局域网中,不能使用检测碰撞CD,原因如下:
(1)由于无线信道的传输条件特殊,其信号强度的动态范围非常大,无线网卡上接收到的信号强度往往会远远小于发送信号的强度(可能相差百万倍)。如果要在无线网卡上实现碰撞检测CD,
对硬件的要求非常高
。
(2)即使能够在硬件上实现无线局域网的碰撞检测功能,但由于无线电波传播的特殊性,进行碰撞检测的意义不大
。
802.11无线局域网使用SCMA/CA协议,在CSMA的基础上增加了一个碰撞避免CA功能,而不再实现碰撞检测功能。
帧间间隔IFS
为了尽量避免碰撞,802.11规定,所有的站在
完成发送后,必须再等待一段很短的时间
(继续监听)才能发送下一帧。这段时间的通称是帧间间隔IFS
。
帧间间隔的长短取决于该站要发送的帧的类型:
- 高优先级的帧需要等待的时间较短,因此可以优先获得发送权。
- 低优先级帧就必须等待较长的时间。若低优先级帧还没来得及发送而其他高优先级帧已发送到媒体,则媒体变为忙态因而低优先级帧就只能再推迟发送了。这样就减少了发生碰撞的机会。
至于各种帧间间隔的具体长度,这取决于使用的物理层特性。
IFS提供对
无线介质访问的不同优先级
来进行划分的,不同优先级按照IFS的时间长短来进行划分,时间越短,表示其对应的优先级越高
,常见的帧间间隔的时间从小到大列出如下:
- SIFS:短帧间间隔——
SIFS是最短的时间区段
,用来间隔需要立即响应的帧,如控制帧(RTS/CTS/ACK)等。在帧交换顺序地两次传输之间使用最短间隔,可以防止其它正在等待介质的站点试图使用介质。 - DIFS:分布协调功能帧间间隔——
只能够由工作于DCF模式的站点来使用
。
CSMA/CA工作原理
当一个终端节点要向另一个终端节点发送数据时,
先进行通道的预约
。
当终端A想要给终端B发送数据的时候,在侦听到信道空闲的前提下:
- 终端A先向终端B发送一个控制帧RTS(Request To Send);
- 终端B可以在可以接收数据的情况下:就会发送一个响应控制帧CTS(Clear To Send);
- 终端A接收到终端B发送的帧就开始发送要发的数据帧;
- 终端B接收到终端A发送的数据帧后,经过一段时间,就会向终端A发送一个确认帧。
CSMA/CA协议只能避免数据帧的冲突,不能避免控制帧的冲突。
虚拟载波监听机制
当其他节点通过源终端向目的终端发送的ACK帧以及目的终端对于源终端回应的CTS帧得知在某一时间段,这两个终端将要进行会话,则其他终端节点会停止侦听,进入休眠状态(节省能量),直到会话结束,则又开始侦听。这种机制就称做虚拟载波侦听。
CSMA/CA的退避算法
在有众多的终端节点都想发送数据并且信道空闲时:先经过一个DIFS的时长,然后,每一个节点都产生一个随机的争用窗口(计时器),进行倒计时,当先结束计时结束的节点进行数据的发送,其他节点冻结争用窗口,停止计时,并且记住剩余的时间,当该节点的数据发送完成,在经过一个DIFS的时间,其他节点的争用窗口重新启动并且开始计时,依次下去,直到所有的节点发送完毕。
若节点在争用窗口计时结束后发送数据与其他节点发生冲突,则发生冲突的节点都随机产生一个争用窗口,继续进行倒计时。
MAC地址、IP地址以及ARP协议
首先介绍一下它们:
(1)MAC地址是以太网的MAC子层所使用的地址(
数据链路层
);
(2)IP地址是TCP/IP体系结构网际层
所使用的地址;
(3)ARP协议属于TCP/IP体系结构的网际层
,其作用是已知设备所分配到的IP地址,使用ARP协议可以通过该IP地址获取到设备的MAC地址;
其中有两条是不在数据链路层的,但是它们三个之间联系紧密我们一起进行学习。
首先使用点对点信道的数据链路层不需要使用地址,我们接下来都是以共享性局域网为示例进行的。
MAC地址
当多个主机连接在同一个广播信道上,想要实现两个主机之间的通信,则每个主机都必须有一个唯一的标识,即一个数据链路层地址。
在每个主机发送的
帧中必须携带标识发送主机和接受主机的地址
。由于这类地址适用于媒体接入控制MAC,因此这类地址被称为MAC地址
。
MAC地址一般被固化在网卡(网络适配器)的电可擦可编程只读存储器EEPROM
中,因此MAC地址也被称为硬件地址;
MAC地址有时也被称为物理地址(但是一定记住MAC地址并不属于物理层)。
MAC地址格式
在数据链路层,数据帧通常依赖于MAC地址来进行数据交换,它如同公网IP地址一样要求具有全球唯一性,这样才可以识别每一台主机。那么MAC地址如何做到这点?它的格式又是什么?
MAC地址,英文全称Medium Access Control
,直译为介质访问控制,它通常被固化在每个以太网网卡(NIC,Network Interface Card)。MAC(硬件)地址长48位(6字节),采用十六进制格式,下图说明了48位的MAC地址及其组成部分。
对于MAC地址格式,我发现了一篇博客写的很详细,推荐大家看这个。
传送门:MAC地址格式详解
IP地址
IP地址是因特网上的主机和路由器所使用的地址,用于标识两部分信息:
网络编号
:标识因特网上数以百计的网络
主机编号
:标识同一网络上不同主机
(或路由器各接口)
之前介绍的MAC地址不具备区分不同网络的功能。
那么:
- 如果只是一个简单的网络,不接入因特网,可以只使用MAC地址(但是用户一般不会不接入因特网)。
- 如果主机所在网络需要接入因特网,则IP地址和MAC地址都需要使用。
数据包转发过程中IP地址和MAC地址的变化情况
下图是一个数据包从H1发到H2的过程图,途中经过了两个路由器R1与R2.
可见数据包在转发过程中源IP地址和目的IP地址保持不变;
数据包转发过程中源MAC地址和目的MAC地址逐个链路改变;
结论:MAC地址在同一个广播域传输过程中是不变的,在跨越广播域的时候会发生改变的;而IP地址在传输过程中是不会改变的(除NAT的时候),总结为路由转发
MAC不变,IP变
。
ARP协议
此处参考:ARP协议详解
1.ARP出现原因
ARP协议是“
Address Resolution Protocol
”(地址解析协议)的缩写。其作用是在以太网环境中,数据的传输所依懒的是MAC地址而非IP地址,而将已知IP地址转换为MAC地址的工作是由ARP协议来完成
的。
在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以太网中,一个主机和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。
2.ARP映射方式
2.1. 静态映射
静态映射的意思是要手动创建一张ARP表,把逻辑(IP)地址和物理地址关联起来。这个ARP表储存在网络中的每一台机器上。例如,知道其机器的IP地址但不知道其物理地址的机器就可以通过查ARP表找出对应的物理地址。这样做有一定的局限性,因为物理地址可能发生变化:
(1)机器可能更换NIC(网络适配器),结果变成一个新的物理地址。
(2)在某些局域网中,每当计算机加电时,他的物理地址都要改变一次。
(3)移动电脑可以从一个物理网络转移到另一个物理网络,这样会时物理地址改变。
要避免这些问题出现,必须定期维护更新ARP表,此类比较麻烦而且会影响网络性能。
2.2. 动态映射
动态映射时,每次只要机器知道另一台机器的逻辑(IP)地址,就可以使用协议找出相对应的物理地址。已经设计出的实现了动态映射协议的有ARP和RARP两种。ARP把逻辑(IP)地址映射为物理地址。RARP把物理地址映射为逻辑(IP)地址。
3. ARP原理及流程
在任何时候,一台主机有IP数据报文发送给另一台主机,它都要知道接收方的逻辑(IP)地址。但是IP地址必须封装成帧才能通过物理网络。这就意味着发送方必须有接收方的物理(MAC)地址,因此需要完成逻辑地址到物理地址的映射。而ARP协议可以接收来自IP协议的逻辑地址,将其映射为相应的物理地址,然后把物理地址递交给数据链路层。
3.1.ARP请求
任何时候,当主机需要找出这个网络中的另一个主机的物理地址时,它就可以发送一个ARP请求报文,这个报文包好了发送方的MAC地址和IP地址以及接收方的IP地址。因为发送方不知道接收方的物理地址,所以这个查询分组会在网络层中进行广播。(见图1)
3.2.ARP响应
局域网中的每一台主机都会接受并处理这个ARP请求报文,然后进行验证,查看接收方的IP地址是不是自己的地址,只有验证成功的主机才会返回一个ARP响应报文,这个响应报文包含接收方的IP地址和物理地址。这个报文利用收到的ARP请求报文中的请求方物理地址以单播的方式直接发送给ARP请求报文的请求方。(见图2)
4. ARP协议报文字段抓包解析
4.1. 报文格式
硬件类型:16位字段,用来定义运行ARP的网络类型。每个局域网基于其类型被指派一个整数。例如:以太网的类型为1。ARP可用在任何物理网络上。
协议类型:16位字段,用来定义使用的协议。例如:对IPv4协议这个字段是0800。ARP可用于任何高层协议
硬件长度:8位字段,用来定义物理地址的长度,以字节为单位。例如:对于以太网的值为6。
协议长度:8位字段,用来定义逻辑地址的长度,以字节为单位。例如:对于IPv4协议的值为4。
操作码:16位字段,用来定义报文的类型。已定义的分组类型有两种:ARP请求(1),ARP响应(2)。
源硬件地址:这是一个可变长度字段,用来定义发送方的物理地址。例如:对于以太网这个字段的长度是6字节。
源逻辑地址:这是一个可变长度字段,用来定义发送方的逻辑(IP)地址。例如:对于IP协议这个字段的长度是4字节。
目的硬件地址:这是一个可变长度字段,用来定义目标的物理地址,例如,对以太网来说这个字段位6字节。对于ARP请求报文,这个字段为全0,因为发送方并不知道目标的硬件地址。
目的逻辑地址:这是一个可变长度字段,用来定义目标的逻辑(IP)地址,对于IPv4协议这个字段的长度为4个字节。
4.2. ARP报文总长度
ARP报文的总长度为64字节。
首先要知道帧的概念 帧是在数据链路层传输的数据格式,比如以太网v2,以太网IEEE802.3和PPP等。
所以Wireshark抓到的帧是包含帧头的,即包含以太网v2的帧头,长14 bytes;
而ARP数据包的长度固定为28 bytes;
帧总长度 = 帧头 + 网络层包头 + 传输层报文头 + 应用数据;
而ARP请求中ARP包已经是最高层,之上没有传输层和应用层,所以总长度为:
帧总长度 = 帧头 + ARP包头 = 14 + 28 = 42 bytes;
而真正 发包的时为了保证以太网帧的最小帧长为64 bytes,会在报文里添加一个padding字段,用来填充数据包大小。
使用wireshark抓包时,抓到的包为60 bytes。比以太网帧的最小帧长扫了4 bytes,原因是因为wireshark抓包时不能抓到数据包最后的CRC字段。
CRC字段是为了校验以太网帧的正确性。在数据包填充完成后,回去通过算法计算一个值放到数据包的CRC字段中。当接受端收到数据包后,会同样使用算法计算一个值,然后和CRC字段的值进行对比,查看是否相同。如果不同则证明数据包被更改,如果相同则证明数据包并未被更改。
对于ARP响应包来说,源IP,目地IP,源MAC,目地MAC都是知道的。
集线器与交换机
集线器
集线器:(
Hub
)是指将多条以太网双绞线或光纤集合连接在同一段物理介质下的设备。发生在物理层
。
对于集线器我们要知道:
(1)集线器是早期以太网的
互连设备
。
(2)工作在OSI体系结构的物理层。
(3)对接收到的信号进行放大、进行盲目转发
。
(4)使用集线器作为互连设备的以太网仍然属于共享总线式以太网
,集线器互连起来的所有主机共享总线带宽,属于同一个碰撞域和广播域
。
这中设备已经过时了,已经被时代所淘汰。现在大多使用的是交换机。
交换机
交换机:(
Switch
)是一种用于电(光)信号转发的网络设备。它可以为接入交换机的任意两个网络节点提供独享的电信号通路,把传输的信息送到符合要求的相应路由上。发生在数据链路层
。
对于交换机我们要知道:
(1)交换机式目前在以太网中
使用最广泛
的互连设备。
(2)工作在OSI体系结构的数据链路层(也包括物理层)。
(3)与集线器不同的是交换机对帧进行转发是根据其MAC地址进行转发
的。
(4)使用交换机做为互联设备的以太网,称为交换式以太网。交换机可以根据MAC地址过滤帧,即隔离碰撞域
。
(5)交换机的每一个接口是一个独立的碰撞域
。
(6)交换机隔离碰撞域但不隔离广播域
(VLAN除外)。
交换机自学习和转发帧
(1)以太网交换机工作在
数据链路层
(也包括物理层)。
(2)以太网交换机收到帧后,在帧交换表中查找帧的目的MAC地址所对应的接口号,然后通过该接口转发帧
。
(3)以太网交换机是一种即插即用设备,刚上电启动时其内部的帧交换表是空的
,随着网络中各主机之间的通信,以太网交换机通过自学习算法自动逐渐建立起帧交换表
。
下面我们来举例说明以太网交换机自学习和转发帧的过程。
假设A给B发送帧,该帧从交换机1的接口1进入交换机1,交换机1首先进行登记的工作,将该帧的源MAC地址A记录到自己的帧交换表中。将该帧进入到自己的接口号1,相应的也记录到交换表中,上述登记工作就称为交换机的自学习。
之后交换机1对该帧进行转发,该帧的目的MAC地址是B。在帧交换表中查找该帧的目的交换地址B,找不到,于是对该帧进行盲目的转发,发到除进入接口的其它接口。可以看出交换机一开始还是比较笨的,他还没有足够的知识去明确转发帧。主机B的网卡收到该帧后,根据该帧的目的MAC地址知道是发送给自己的,于是接收。主机C发现不是自己的,无情丢弃。之后
交换机1通过接口4把帧发送到交换机2中,交换机2重复上面的流程。
我们现在来看看B给A传帧的情况,现在交换机1的帧交换表中已经有A的MAC地址和接口了,所以这次发送是明确的发送,不涉及其它主机。
接下来我们看看丢弃的情况:
G给A发的帧到达A和交换机1,交换机1查表发现是A1,但是该帧就是从1来的,不会再转发回去。于是丢弃。
需要注意的是:帧交换表中的每条记录都有自己的存活时间,到期自动删除。为什么呢?
MAC地址和接口对应关系会改变.
此处参考文章:以太网交换机自学习和转发帧的流程
交换机生成树协议STP
为了提高以太网的可靠性,我们添加了冗余链路。
但是冗余链路会生成网络链路。于是我们改用了生成树协议。
生成树协议(
spanning-tree-protocol,stp
),就是在具有物理环路的交换机网络上生成没有回路的逻辑网络的方法。
-
生成树协议使用生成树算法,在一个具有冗余路径的容错网络中
计算出一个无环路的路径
,使一部分端口处于转发状态,另一部分处于阻塞状态(备份状态),从而生成一个稳定的、无环路的生成树网络拓扑
。 -
一旦发现当前路径故障,生成树协议能立即激活相应的端口,打开备用链路,重新生成STP网络拓扑,从而保持网络的正常工作。
-
最终生成的树型逻辑拓扑要保证连通整个网络。
虚拟局域网VLAN
随着交换机以太网模式的扩大,广播域相应扩大。
但是巨大的广播域会带来很多弊端:广播风暴、难以管理和维护、潜在的安全问题。
那么我们就得对广播域进行分割,于是虚拟局域网VLAN技术应运而生。
虚拟局域网:是局域网向用户提供的一种服务,虚拟局域网是用户和局域网资源的一种逻辑组合,而交换式局域网技术是实现虚拟局域网的基础。
虚拟局域网的基本概念
虚拟局域网VLAN是由一些局域网网段构成的与物理位置无关的逻辑组
,而这些网段具有某些共同的需求。每一个 VLAN 的帧都有一个明确的标识符,指明发送这个帧的计算机属于哪一个VLAN
。
传统的局域网中的工作组通常在同一个网段上,多个工作组之间通过实现互联的网桥或者路由器来交换数据。当一个逻辑工作组的结点要转移到另一个逻辑工作组时,就需要将结点计算机从一个网段撤出,并将其连接到另外一个网段上,这时甚至需要重新进行布线。因此,逻辑工作组的组成受结点所在网段的物理位置限制。
1988年IEEE批准了802.3ac标准,这个标准定义了以太网的帧格式的扩展,以便支持虚拟局域网。虚拟局域网协议允许在以太网的帧格式中插入一个4字节的标识符(见图),称为VLAN标记(tag),用来指明发送该帧的计算机属于哪一个虚拟局域网。插入VLAN标记得出的帧称为802.1Q帧。显然,如果还使用原来的以太网帧格式,那么就无法区分是否划分了虚拟局域网。图3-27标注出在几个粗线链路上传输的帧是802.1Q帧。在其他链路上传输的仍然是普通的以太网帧。
802.1Q帧是由交换机来处理的不是用户主机来处理:
- 当交换机收到普通的以太网帧时,会插入4字节的VLAN标记转变为802.1Q帧,简称“打标签”。
- 当交换机转发802.1Q帧时,可能会删除其4字节的VLAN标记转变为普通以太网帧,简称“去标签”。
交换机的端口类型:Access、Trunk、Hybrid
结语
计算机网络层终于写完了花了好久好久,最近也比较忙。这部分内容还是蛮重要蛮多的,能够看到这里你也就成功了。
本专栏持续更新中…