要在一条通信线路上传送数据,除了必须建立一条物理线路(物理层的功能)之外,还必须有一些规程或协议来控制这些数据的传输,以保证被传输数据的正确性。实现这些规程或协议的硬件和软件加上物理线路就构成了“数据链路层”。
链路层构建的是真正用于数据传输的逻辑通道,一般是非永久存在的(但局域网中的数据链路是永久的),仅当有数据传输时建立并存在,在数据传输完后自动拆除。
注意:
物理层的协议是用来构建物理传输线路、建立物理意义的网络通信,而不是用来控制数据传输的。
逻辑链路必须建立在物理链路之上
为什么不直接使用物理层传输?
1、物理层传输介质的多样性,通信规程也各不相同,性能不稳定,而数据链路层中构建的逻辑链路可以屏蔽物理层中传输介质的不同,从逻辑意义上构建一条性能稳定、不受传输介质类型影响的逻辑数据传输通道
2、在物理层中数据是一位位地单独传输的,不仅数据传输效率低下,而且容易出现数据传输差错(如出现某些数据位丢失或者错位),而链路层以“帧”为单位传输,传输效率高,还不容易出错
链路层的主要作用:
在原始的、有差错的物理传输线路的基础上,采取差错检测、差错控制与流量控制等方法,将有差错的物理线路改进成逻辑上无差错的数据链路,以便向网络层提供高质量的服务。
就像我们修好了路,还得制定一些交通法规,使路上行驶的车辆必须按照一定的规则行驶,否则可能会经常出现交通事故。这些“交通法规”也为了使这些车辆到达某个车站(这里所说的“车站”就相当于计算机网络体系结构中的“网络层”)时能有序进、出站,最终使这条数据通信之“路”发挥它本来的作用。
在数据链路层中,与它的下一层—物理层相邻的是MAC子层,与它的上一层—网络层相邻的是LLC子层。所以MAC子层接受物理层的服务,为LLC子层服务,而LLC子层则是接受MAC子层服务,为网络层服务。
而各层是通过各层间的SAP(Service Access Point,服务访问点)来提供或接受服务的
SAP是邻层实体(“实体”也就是对应层的逻辑功能)间实现相互通信的逻辑接口,位于两层边界处
作用:
与各种传输介质访问有关的问题都放在“MAC子层”来解决。其主要功能包括:数据帧的封装/卸装,帧的寻址和识别(通过MAC地址进行的),帧的接收与发送,帧的差错控制、介质访问冲突控制等。
数据链路层中与传输介质访问无关的问题都集中在LLC子层来解决,为网络层提供服务。其主要功能包括逻辑链路的建立和释放、提供与网络层的接口(也就是前面说到的SAP)、数据传输差错控制、给数据帧加上传输序列号等。
由于网络层上可能有许多种通信协议同时存在,而且每一种通信协议又可能同时与多个对象沟通,因此当LLC子层从MAC子层收到一个数据包时必须能够判断要送给网络层的是哪一个通信协议。为了达到这种功能,在LLC子层中提供了“数据链路层”的SAP,作为与“网络层”通信交互的接口
在数据链路层中要形成一条更有利于数据传输的数据链路,而不是直接利用下面物理层中建立的物理链路。
数据链路是由数据链路层中的LLC子层通过相应的通信规程(也就是通常所说的协议)建立并管理的。而不同协议建立的数据链路,提供的服务类型也不同。
(1)有确认的面向连接服务
这种服务类型存在三个阶段,即
1. 数据链路建立
2. 数据传输
3. 数据链路释放
就像我们打电话,我们打电话给某个人时,首先就是要拿起电话拨号(相当于建立连接的过程),然后对方拿起电话,问一下看是不是打错了(这就是一个“确认”过程)。确认不是打错的电话后,双方开始通话
(2)有确认的无连接服务
事实上是因为这类服务所用的数据链路已建立起来,而且是永久存在的,所以不用另外建立,如局域网中的链路
就像寄快递,送快递的路线早就建立好了,我们只需要寄出去,等收件人确认就好了,不用关心快递运送的路线
(3)无确认的无连接服务
这种服务类型看似不可靠,但它是建立在可靠的通信线路基础之上的,所以数据传输仍然是非常可靠的。
注意
LLC子层的链路管理功能主要是针对前面所介绍的有确认的面向连接服务类型
它包括三个主要阶段:链路建立、链路保持、链路释放。
数据链路层的这种链路连接的建立、维持和释放过程就是数据链路层的链路管理功能。
在多个站点共享同一物理信道的情况下(例如在局域网中),如何在要求通信的站点间分配和管理信道也属于数据链路管理的范畴
在发送端,数据链路层是接收来自网络层的数据分组,而在接收端它是接收来自物理层的比特流,所以数据链路层的成帧功能就包含两方面的含义:一是将来自网络层的数据分组封装成数据帧,二是将来自物理层的一个个比特流组装成数据帧
网络层的数据包到达数据链路层后加上数据链路层的协议头和协议尾就构成了一个数据帧。
在每个帧的前部加上一个帧头部,在帧的结尾处加上一个帧尾部,把网络层的数据包作为帧的数据部分,就构成了一个完整帧。其中帧有大小限制,不同网络类型下不同。
帧头和帧尾就是作为帧的起始和结束标志,也就是帧边界。
在发送端数据链路层中的帧到达物理层后就会以比特位为单位进行传输。发送端以比特位方式一位位地传输到接收端的物理层,然后接收端的物理层把比特流向数据链路层传输,到达后又要将比特流封装成数据帧,这就是数据链路层的帧组装方式了,其实也就是帧同步问题。帧同步的目的就是要使接收端的数据链路层对从物理层传输而来的一串串比特流以帧为单位进行区分。
帧同步方法:
(1)字节计数法
以一个特殊字符代表一个帧的起始,并以一个专门的字段来标识当前帧内字节数。接收端通过对该特殊字符的识别从比特流中区分出每个帧的起始,并根据字节数,判断帧的结尾
(2)字符填充的首尾定界符法(BSC协议)
用一些特定的控制字符来定界一个帧的起始与结束,如在帧的头部加上了两个SYN控制字符,用于标识该帧的开始,在结束位置加了ETX控制字符,用于标识该帧的结束。
为了实现透明传输,不使数据信息中与以上特定字符相同的字符被误判为帧的首尾定界符,可以在这种数据帧的帧头填充一个转义控制字符
(3)比特填充的首尾定界符法(SDLC、HDLC协议)
通过在帧头和帧尾各插入一个特定的比特串(如01111110)来标识一个数据帧的起始与结束。
而为了透明传输,也就是为了避免在信息位中出现的与帧起始和结束标志符相似的比特串时被误判为帧的首、尾标志,采用了比特填充的方法。比如上面采用的特定模式为“01111110”,则对信息位中的任何连续出现的5个“1”(因为帧标志符中是有5个连续“1”),发送端自动在其后插入一个“0”
(4)违法编码法
在物理层采用特定的比特编码方法时采用。
例如,曼彻斯特编码方法,将数据“1”编码成“高-低”电平对,将数据“0”编码成“低-高”电平对。而高-高电平对和低-低电平对在数据比特中是违法的,因此可以借用这些违法编码序列来定界帧的起始与终止。
(5)PPP同步传输协议(点对点链路)
面向字符传输,PPP帧结构如下
透明传输:
“成帧”功能解决了帧同步问题,也就是接收端可以区分每个数据帧的起始和结束了,但是还没有解决数据正确传输的两方面问题:一是如果有帧出现了错误怎么办?二是如果有帧丢失了怎么办?
(1)奇偶校验码(PCC)
一种校验代码传输正确性的方法,是根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验的。
具体做法是:在传输的二进制代码最后专门设置一个奇偶校验位,用它控制这组代码中1的个数为奇数或偶数(具体是偶数还是奇数,要视所采用的是偶校验还是奇校验),然后再在接收端进行校验,看里面的“1”的个数是否仍与原来一样的奇数或偶数,来确定数据传输的正确性。
但是奇偶校验方法只可以用来检查单个码元错误,检错能力较差,所以一般只用于本身误码率较低的环境
(2)循环冗余校验(CRC)
一是要预先确定一个发送端和接收端都用来作为除数的二进制比特串(或多项式);
二是把原始帧与上面选定的除进行二进制除法运算,计算出FCS。
假设比特串为n位,那么在原始帧后面加上n-1个0,并用二进制除法除以该比特串,最后的余数就是FCS校验码,将FCS校验码放在原始帧最后,接收端拿到数据后,用二进制除法除以比特串,若余数为0,则没有差错,反之有差错。
(1)反馈检测:
它要求接受端在接收到每一个数据帧后均要向发送端发送一个表示是否接收了该数据帧的反馈信息,且这个反馈信息就是原来由发送端发给接收端的原始数据帧。发送端在收到接收端发送的反馈信息后,通过对比保存在缓存中原来该帧的数据来判断接收端是否正确接收了该数据帧。
使用了计时器来避免帧丢失的情况。又给每个帧编号,防止由于传输线路较忙,误以为帧丢失了,发送端重新发送同一帧,而接收端重复接受的情况。
但无论如何每个数据帧实际上在信道中均被传输了两次,造成信道利用率降低,通常用于在面向字符的异步传输中
(2)自动重发请求(ARQ):
先让发送端将要发送的数据帧附加一定的冗余检错码(如上面介绍的PCC、CRC码)一起发送,接收端则根据检错码对数据帧进行错误检测,若发现错误,就返回请求重发的响应(不用返回全部的帧)。发送端收到请求重发的响应后,便重新传送该数据帧。
对于帧丢失的问题,发送端会在发送时引入计时器,发送帧的同时启动计时器,若在限定时间间隔内没有收到接收端的反馈信息,即计时器超时,则可认为传的对应帧已出错,或丢失,继而发送端知道要重新发送对应的数据帧。
具体实现方案:
1、空闲重发请求:
发送端每发送一帧后就要停下来,然后等待接收端发来的确认信息
2、连续重发请求:
发送端可以连续发送一系列数据帧(也不总是不断地发送,具体可以连续发送多少个帧,要视双方的缓存空间大小,即窗口大小而定),即不用等前一帧被确认便可继续发送下一帧,效率大大提高。
但如果有帧错误或丢失,有以下解决方案:
回退N帧策略
选择重发策略
(3)海明纠错码
可以有多个校验位,具有检测并纠正一位错误代码功能的纠错码。
将有效信息按某种规律分成若干组,每组安排一个校验位进行奇偶性测试,然后产生多位检测信息,若有一个或多个组产生错误,可以通过查表,得出具体的出错位置,最后通过对错误位取反(也是原来是1就变成0,原来是0就变成1)来将其纠正。
“流量控制”包括两方面的含义:
一是发送端的数据发送速度与接收端的数据接收速度要匹配,否则接收端来不及接收就会造成数据在传输过程中的丢失。
二是发送端的数据发送速度要与线路上的承载速率(与线路信道带宽有关)相匹配,否则也会造成数据在传输过程中的丢失
“流量控制”实际上是对发送端数据传输速率的控制,使其数据发送速率不超过接收端所能承受的数据接收能力。考虑到在接收端还需要对来自物理层的比特流进行一系列的处理,如帧封装,向发送端发送返回确认帧等,所以通常是要使发送端的发送速率略小于接收端的数据处理能力。
(1)基于反馈的流量控制方案:
差错控制中的“自动重发请求”就是基于反馈的流量控制。
XON/XOFF(继续/停止):
接收端认为不能继续接收数据时(也就是接收端的缓存空间满了或者接近满时),接收端会向发送端发送一个XOFF控制字符,当发送端收到对应的XOFF控制字符时就停止数据的继续发送;当接收端可以继续接收数据时,接收端会再向发送端发送一个XON控制字符,发送端收到这个控制字符后就知道可以恢复数据发送了,继续发送数据,一直这么循环下去。
(2)基于速率的流量控制方案:
基于窗口滑动机制的速率控制方案。
假设发送端缓存空间大小为3个帧,那么发送端连着发了3个帧后,缓存空间满了,就要停止,等待接收端的确认,当发送端收到接收端对前两个帧的确认后,发送端将前两个帧从缓存空间中删去,再发送两个帧,此时缓存空间又满了,又要等待确认.....如此循环下去。
注意
流量控制并不是数据链路层所特有的功能,许多高层协议中也提供流量控功能,只不过流量控制的对象不同而已。比如,对于数据链路层来说控制的是相邻两节点之间数据链路上的流量,而对于传输层来说控制的是从源到最终目的端之间的流量。
两端口二层网络设备,用来连接不同网段的计算机网络设备,同时它又可隔离冲突域,因为它的两个端口不是共享一条背板总线(分别有一条独立的交换信道),比当时的集线器(Hub)性能更好(集线器上各端口都是共享同一条背板总线的)。
网桥除了可以扩展网络的物理连接范围外,还可以对MAC地址进行分区。但因为网桥只有两个端口,故一般两个端口都是连接集线器,每个物理网段的主机都连接到各自的集线器上。
后来,网桥被具有更多端口、同时也可隔离冲突域的交换机(Switch)所取代。
物理网段:
指IP地址属于同一网络地址段(也就是IP地址中的网络ID一样),位于不同地理位置的不同LAN分段,是基于物理意义上的地理区域进行划分的。如连接的主机位于不同办公室或者不同办公楼中
交换机(Switch)可以说同时是集线器和网桥的升级换代产品,因为交换机具有集线器一样的集中连接功能,同时它又具有网桥的数据交换功能。
(1)具有多个交换端口
网桥通常只是两个交换端口,其设计目的主要就是用来连接两个距离超过单段网线传输限制的物理网段。
一台交换机可以有多个端口,而且与网桥一样,不仅每个端口可以连接一个不同的物理网段(交换机上一个端口对应一个物理网段),还可以有大量的端口来集中连接主机,这时交换机就可以同时担当集线器和网桥的双重角色
(2)数据转发效率更高
集线器发送数据是采用广播方式,所以信道中的无效载荷比例相当高
交换机因为大多数主机都是直接连接在交换机端口上,即使不是,也主要是连接在其他交换机端口,所以数据的转发基本上都是通过提取帧中的MAC地址直接发送到目的主机上的,而不是通过广播方式(仅在未知目的MAC地址时采用广播)
(3)更强的MAC地址自动学习能力
相比网桥,只有两个端口,所以一个网桥端口要与多个源主机MAC地址之间的映射,也就是一对多映射关系。
而交换机上的端口多数是直接连接主机的,所以在映射表中基本上都是一个源主机MAC地址与一个交换端口间的一对一映射。一对一的映射查找起来明显比一对多的映射效率要高
介质访问控制子层(MAC子层)是局域网体系结构中划分的子层,对于广播型网络(如以太局域网、WLAN)是非常重要的,因为它担负了两方面的主要职责:
一是如何在局域网内寻址(也就是找到目的节点)
二是如何解决多路通信中介质争用的现象。
MAC子层仅在广播型网络(如以太局域网、WLAN,以及其他无线网络)中有用,而对于点对点型网络中就没有存在的意义了,因为在点对点网络中不需要寻址,也不存在一般意义上的信道争用问题
数据链路层有两种不同的数据帧—LLC帧和MAC帧。不过,我们通常所说的“帧”一般是指MAC帧,而不是LLC帧。因为从上层来的数据包,进入到LLC子层后加上LLC子层的协议头和协议尾就形成了LLC帧,然后需要继续向下传输,到达MAC子层后同样再要加上MAC子层的协议头和协议尾,又要进行重新封装,最终形成MAC帧传输到物理层。
就是先侦听要访问的介质,当发现介质忙时先避让一段时间,不发送数据,仅当侦听到介质空闲时才进行数据发送。
要避让多长时间才再次侦听?这就是CSMA技术的退避算法。
(1)非-坚持算法
各站点不连续侦听总线介质是否空闲,即在发现介质忙时,先停止侦听,等过一段时间再来侦听
不足:
过一段时间再监听,可能这段时间中介质存在空闲状态,降低了信道利用率
(2)1-坚持算法
“1”有两层含义:
一是指发现总线介质忙时一直持续不间断侦听,直到发现介质处于空闲状态;
二是在侦听到介质处于空闲状态后一定(也就是100%)发送数据。
不足:
在网络中同时有多个站点在同一时间检测到介质空闲(因为中间没有一个延迟,也就是一直在侦听介质状态),而立即进行了数据发送,所以更容易发生冲突。
二是这种算法发现在介质忙时一直侦听,占用了大量网络和设备资源。
(3)P-坚持算法
P-坚持CSMA算法是前面介绍的非-坚持CSMA和1-坚持CSMA这两种算法的一种折中算法,取两者的长处,而尽量克服了两者的不足。
在侦听到介质处于忙状态时持续侦听,当侦听到介质处于空闲状态时,此时站点却不一定马上发送数据,根据概率P(这个P值是算法事先确定好的)来选择发送数据,而在另一个(1-P)概率的时候,即使介质处于空闲状态,也会延迟一段时间t(这个t是指端到端的传播延时)后再重新侦听介质状态。
当有两个或多个正在传输数据的站点检测到它们发送的数据发生了冲突时,它们都会通过发送一个阻塞帧(它是一个32位全为1的帧)来进行响应,用于强化碰撞,告知总线上的所有站点信道发生冲突。
由于信道传播延时的存在,即使通信双方的站点都没有侦听到载波信号,在发送数据时仍可能会发生冲突,因为他们可能会在检测到介质空闲时同时发送数据,致使冲突发生。尽管CSMA可以发现冲突,但它并没有先知的冲突检测和阻止功能。
侦听、发送、检测、冲突处理,可以用以下几句话来概括:
❏先听后说(“听”是指侦听,“说”是指发送数据,下同),边听边说;
❏一旦冲突,立即停说;
❏等待时机,然后再说。
(1)争用期:最先发送数据帧的站,在发送数据帧后至多经过时间 2τ (两倍的端到端往返时延)就可知道发送的数据帧是否遭受了碰撞。
以太网的端到端往返时延 2τ 称为争用期,或碰撞窗口。
(2)争用期的长度
1.以太网取 51.2 微秒 为争用期的长度。
2.对于 10 Mb/s 以太网,在争用期内可发送512 bit,即 64 字节。
3.以太网在发送数据时,若前 64 字节没有发生冲突,则后续的数据就不会发生冲突。
4.以太网规定了最短有效帧长为 64 字节,凡长度小于 64 字节的帧都是由于冲突而异常中止的无效帧。
(1)二进制指数类型退避算法
发生碰撞的站在停止发送数据后,要推迟(退避)一个随机时间才能再发送数据。
1.确定基本退避时间,一般是取为争用期 2τ。
2.定义重传次数 k, k <= 10,即
k = Min[重传次数, 10]
3.从整数集合[0,1,…, (2^k - 1)]中随机地取出一个数,记为 r。重传所需的时延就是 r 倍的基本退避时间。
当重传达 16 次仍不能成功时即丢弃该帧,并向高层报告。
避让后,若检测到信道空闲,还要再等待一个帧间发送间隙的时间(9.6μs),以使网络中所有接收站点有时间准备好接收下一个帧。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。