数据链路层属于计算机网络的低层。数据链路层使用的信道主要有以下两种方式:
1.点对点信道:使用一对一的点对点通信信道。
2.广播信道:使用一对多的广播通信方式,必须使用专门的共享信道协议协调主机的数据发送。
使用点对点信道的数据链路层
链路:从一个结点到相邻结点的一段物理线路(有线或无线),中间没有其他的交换结点。
数据链路:把实现通信协议的硬件和软件加到链路上,就构成了数据链路。现在最常用的方法是使用网络适配器(既有硬件也有软件)来实现这些协议。
数据链路层的协议数据单元:帧。数据链路层把网络层交下来的数据构成帧发送到链路上,以及把接收到的帧中的数据取出上交给网络层。
点对点信道的数据链路层在进行通信时的主要步骤:
1.结点 A 的数据链路层把网络层交下来的IP数据报添加首部和尾部封装成帧。
2.结点 A 把封装好的帧发送给结点 B 的数据链路层。
3.若结点 B 的数据链路层收到的帧无差错,则从收到的帧中提取出IP数据报交给上面的网络层;否则丢弃这个帧。
数据链路层的协议有许多种,但是三个基本问题是相同的:封装成帧、透明传输、差错检测。
1.封装成帧
封装成帧就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧,首部和尾部的一个重要作用就是确定帧的界限。每一种链路层协议都规定了所能传送的帧的数据部分最大长度上限(最大传送单元MTU)。(网络层的IP数据报传送到数据链路层就成为帧的数据部分)
控制字符SOH放在一帧的最前面,表示帧的首部开始,控制字符EOT表示帧的结束。
2.透明传输
当数据数据部分中的某个字节的二进制代码恰好和SOH或EOT这种控制字符一样时,数据链路层会错误地“找到帧的边界”,把部分帧收下。
透明传输:无论什么样的比特组合的数据,都能按照原样没有错误地通过数据链路层。
解决透明传输,采用的方法是发送端在控制字符"SOH"和"EOT"的前面插入转义字符“ESC”,接收端则删除这个插入的转义字符,这种方法称为字节填充(字符填充)。如果转义字符也出现在数据中,则在转义字符前面插入一个转义字符。
3.差错检测
比特差错:比特在传输过程中可能产生差错,1变成0,0变成1。
为了保证数据传输的可靠性,数据链路层广泛使用了循环冗余检测CRC的检测技术。
循环冗余检测原理:
在发送端,先把数据划分为组,假定每组 k 个比特。现假定待传送的数据 M=101001(k=6)。CRC运算就是在数据M后添加供差错检测用的 n 位冗余码,然后构成一个帧发送出去,一共发送 k+n 位。
这 n 位冗余码可以用以下方法得出。用二进制的模2运算进行 2^n 乘 M 的运算,这相当于在 M 后面添加 n 个0。得到的 k+n 位的数除以收发双方事先商定的长度位 n+1 位的除数 P,得出商是 Q 而余数是 R(n位,比P少一位)。
这个余数 R 就作为冗余码拼接在数据 M 的后面发送出去。这种为了进行检错而添加的冗余码常称为帧检验序列 FCS。因此加上 FCS 后发送的帧是101001001,共有 k+n 位。
CRC是一种检错方法,FCS是添加在数据后的冗余码。
在接收端把接收到的数据以帧位单位进行CRC检验:把收到的每一个帧都除以相同的除数 P(模2运算),然后检查得到的余数 R。如果无差错,那么余数 R 肯定是0。若余数 R 等于0,接收端就接收是个帧;否则,就丢弃这个帧(无法确定哪一位或哪几位出现了差错)。
请注意,数据链路层并没有向网络层提供“可靠传输”服务。所谓“可靠传输”就是:数据链路层的发送端发送什么,在接收端就收到什么。传输差错有两种,一种是比特差错,另一种没出现比特差错,但是出现了帧丢失、帧重复或帧失序,这三种都属于“出现传输差错”,但都不是这些帧里有“比特差错”。
点对点协议PPP
PPP协议有三个组成部分:
1.一个将IP数据报封装到串行链路的方法。
2.一个用来建立、配置和测试数据链路连接的链路控制协议LCP。
3.一套网络控制协议NCP。
PPP协议的帧格式:
1.各字段的意义
PPP帧的首部和尾部分别位四个字段和两个字段。首部的第一个字段和尾部的第二个字段都是标志字段F,规定位0x7E,标志字段表示一个帧的开始或结束。PPP首部的第四个字段是字节的协议字段。当协议字段是0x0021,则PPP帧的信息字段是IP数据报。尾部的第一个字段(2字节)是使用CRC的帧检测序列FCS。
2.字节填充
PPP使用异步传输(逐个字符地传送)时,把转义符定义为0x7D,并使用字节填充:
1.把信息字段中出现的每一个0x7E字节变成2字节序列0x7D,0x5E。
2.把信息字段中出现的每一个0x7D字节变成2字节序列0x7D,0x5D。
3.把信息字段中出现的数值小于0x20的字符,例如0x03,改成2字节序列0x7D,0x23。
3.零比特填充
PPP使用同步传输(一连串的比特连续传送)时,采用零比特填充方法来实现透明传输:先扫描整个信息字段,只要发现5个连续1,则立即填入一个0。
使用广播信道的数据链路层
1.局域网的数据链路层
局域网可按网络拓扑进行分类:
计算机与外界局域网的连接是通过通信适配器进行的,适配器的一个重要功能就是进行数据串行传输和并行传输的转换。由于网络上的数据率和计算机总线上的数据率并不相同,因此适配器中必须装有对数据进行缓存的存储芯片。
2.CSMA/CD协议
为了通信的简便,以太网采取了以下两种措施:
1.采用无连接的工作方式。适配器对发送的数据帧不进行编号,也不要求对方发回确认,因此,以太网提供的服务是尽最大努力的交付,即不可靠的交付。对有差错帧是否需要重传则由高层来决定。我们知道,总线上只要有一台计算机在发送数据,总线的传输资源就被占用,因此,同一时间只能允许一台计算机发送数据。以太网使用的协议是CSMA/CD,意思是载波监听多点接入/碰撞检测。
2.以太网发送的数据都使用曼彻斯特编码的信号。
下面介绍CSMA/CD协议的要点:
“多点接入”:说明这是总线型网络,许多计算机以多点接入的方式连接在一跟总线上。
“载波监听”:检测信道,不管在发送前,还是在发送中,每个站都必须不停地检测信道。
“碰撞检测”:边发送边监听。任何一个正在发送数据的站,一旦发现总线上出现了碰撞,其适配器就要立即停止发送。
因为电磁波在总线上是以有限的速率传播的,电磁波在1km电缆的传播时延约为5μs。因此A向B发送的数据要在5μs后才能传送到B,若在数据到达B之前,B就发送自己的帧,则一定会与A发送的帧发生碰撞。在局域网的分析中,常把总线上的单程端到端的传播时延记为Υ。那么,A发送数据后最迟经过2Υ才能知道自己发送的数据是否发生碰撞。显然,在使用CSMA/CD协议时,一个站不可能同时进行发送和接受(但必须边发送边监听信道)。每一个站在自己发送数据之后的一小段时间内,存在着遭遇碰撞的可能性。这一小段时间是不确定的,它取决于另一个发送数据的站到本站的距离。因此,以太网不能保证某一时间之内一定能够把自己的数据帧成功地发送出去。
从图中可以看出,最先发送数据帧的A站,在发送数据帧后至多经过2Υ就可知道所发送的数据帧是否遭受到了碰撞。因此以太网的端到端往返时间2Υ称为争用期,经过争用期这段时间还没有检测到碰撞,才能肯定这次发送不会发生碰撞。
以太网使用截断二进制指数退避算法来确定碰撞后重传的时机。这种算法让发生碰撞的站在停止发送数据后,不是等待信道变为空闲后就立即再发送数据,而是推迟一个随机的时间。具体的退避算法如下:
1.协议规定了基本的退避时间为争用期2Υ,具体的争用期时间是51.2μs。对于10Mbit/s的以太网,在争用期内可发送512bit即64字节,也可以说争用期是512比特时间,1比特时间就是发送1比特所需要的时间。
2.k=Min[重传次数,10],从离散的整数集合[0,1,……,(2^k-1)]中随机取一个数,记为r。重传应推后的时间就是r倍的争用期。
3.当重传达16次不成功则丢弃该帧,并向高层反应。
适配器每发送一个新的帧,就要执行一次CSMA/CD算法。以太网规定了一个最短帧长64字节即512bit。如果要发送的数据非常少,那必须加入一些填充字节,使帧长不小于64字节。以太网在发送数据时,如果在争用期没有发生碰撞,那么后续发送的数据就一定不会发生冲突。凡长度小于64字节的帧都是由于冲突而异常中止的无效帧。
强化碰撞:当发送数据的站一旦发现发生了碰撞时,除了立即停止发送数据外,还要再继续发送32比特或48比特的人为干扰信号,以便于让所有用户都知道现在已经发生了碰撞。
以太网还规定了帧间9.6μs,是为了使刚刚收到数据帧的站的接受缓存来得及清理,做好下一帧的准备。
综上所述,可以把CSMA/CD协议的要点归纳如下:
1.准备发送:适配器从网络层获得一个分组,加上以太网的首部和尾部,组成以太网帧,放入适配器的缓存中。但在发送之前,必须先检测信道。
2.检测信道:若检测到信道忙,则应不停地检测,一直等待信道转为空闲。若检测到信道空闲,并在96比特时间内信道保持空闲,就发送这个帧。
3.在发送过程中仍不停地检测信道,即网络适配器要边发送边监听。这里存在两种可能:
(1)发送成功:在争用期内一直未检测到碰撞。这个帧肯定能够发送成功。发送完毕后,什么都不做,然后回到步骤1。
(2)发送失败:在争用期内检测到碰撞。这是立即停止发送数据,并按规定发送人为干扰信号。适配器执行指数退避算法,等待r倍512比特时间后,返回到步骤2,继续持续检测信道。若重传16次仍不成功,则停止重传而向上报错。
以太网每发送完一帧,一定要把已发送的帧暂时保留一下。如果在争用期内检测到碰撞,推迟一段时间后重传这个暂时保留的帧。
3.以太网的MAC层
MAC层的硬件地址