1.计算机网络模型
2.数据链路层概念机作用
链路:从一个结点到相邻结点的一段物理线路(有线或无线),而中间没有其他的交换结点,可见一条链路只是一条路径的一个组成部分。物理通道
数据链路:在链路通信中我们不仅仅需要物理层面上的链路,还需要各种协议来支撑,这些协议以及为了实现协议所安装的硬件和软件,再加上物理链路总的就叫做数据链路。 逻辑通道
数据链路层:在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。
数据链路层功能:
2.1封装成帧:
帧:数据链路层报文包,封装成帧是指网络层数据报文的前后添加帧首部和帧尾部。
帧传输时会添加前导码和帧定界符,用于区分一个帧的开始和结束,但是在抓包的时候不会抓到这些字符,是因为已经在物理层剥离,如下所示
2.2 链路管理和向上提供服务
数据链路是由数据链路层中的LLC子层通过相应的通信规程(也就是通常所说的协议)建立并管理的。而不同协议建立的数据链路,提供的服务类型也不同。 数据链路层提供的服务类型: (1)有确认的面向连接服务 提供服务时,必须先建立好双方通信连接;提供服务时,必须要求对方确认后才进行。独占链路,只有在当前数据传输完成,释放了链路后,其他用户才可能与同一个接收端进行数据传输。 (2)有确认的无连接服务 不需要建立专门的数据链路接收端在接收到的每一个数据帧时都向发送端确认事实上是因为这类服务所用的数据链路已建立起来,而且是永久存在的,所以不用另外建立连接,接收时需要发送确认,若发送方在规定时间没有收到确认,则重发丢失的帧。适用于误码率较高的信道,如无线通信 (3)无确认的无连接服务 不需要建立专门的数据链路接收端在接收到的每一个数据帧时不需要向发送端确认这种服务类型看似不可靠,但它是建立在可靠的通信线路基础之上的,所以数据传输仍然是非常可靠的。对丢失或错误的帧,数据链路层不负责重发而是交给上层处理。适用于实时通信或误码率较低的信道,如以太网。上层协议如果检测到数据丢失会进行重传,对于链路层重传的数据是一个新的帧。 LLC子层的链路管理功能主要是针对前面所介绍的有确认的面向连接服务类型 它包括三个主要阶段:链路建立、链路保持、链路释放。 数据链路层的这种链路连接的建立、维持和释放过程就是数据链路层的链路管理功能。目的是实现数据在不可靠的物理链路上实现可靠的传输。
2.3差错控制
差错来源: 1.噪声: 全局性噪声:通信信道自身的电气特性,由于导体内部电子的热运动导致的,具有随机性和持续性,是信道固有属性,难以完全避免。通常采取提高信噪比的方法减少影响,例如使用更好的物理介质、增强信号强度或采用更先进的信号处理技术。 局部性噪声:这类噪声是由于外部环境中的短暂事件引起,如电磁干扰(EMI)、闪电、电源波动或其他瞬态现象产生的冲击噪声。这类噪声往往突发性强,可能会导致短时间内大量数据位发生错误。 2.硬件故障:包括但不限于电缆破损、接头松动、接口失效、传输设备老化等问题导致信号失真或错误。 3.信号衰减与畸变:随着信号在传输过程中的距离增加,特别是在长距离传输和无线传输时,其振幅、频率和相位可能逐渐衰减或发生改变,从而导致接收端解码出错。 4.多径效应:对于无线通信而言,信号可能经过多个路径到达接收端,各个路径的信号相互叠加,可能会引入差错。 差错类型: 单比特错误(Single-Bit Error):指在数据传输过程中,单个比特(bit)由于噪声或者其他原因发生了反转,即1变成了0或者0变成了1。 多比特错误(Multiple-Bit Error):指在一个数据单元内(如一个字节、一个码字)同时有两个或更多比特发生了错误。 突发错误(Burst Error):在数据流中相邻的一段比特序列中出现连续的错误。突发错误经常由传输通道中的突发噪声或信号暂时失去同步等原因造成。 帧丢失(Frame Loss):整个数据帧在传输过程中未能成功到达接收端,可能是由于严重的信号干扰、硬件故障或网络拥塞等原因导致。 帧重复(Frame Duplication):同一数据帧在传输过程中被意外地重复发送多次。 帧乱序(Frame Misordering):序列传输的数据帧在接收端收到了正确的帧,但它们的顺序与发送时的顺序不一致。 数据位滑动(Bit Slipping):在同步传输系统中,如果接收端与发送端的时钟频率稍有差异,可能会导致接收端采样点发生偏移,进而产生位滑动错误。
2.3.1 奇偶校验
2.3.2 循环冗余校验
循环冗余校验: (Cyclic Redundancy Check, CRC) 是一种基于多项式运算,通过生成一个校验码(冗余码),在数据传输或存储过程中检查数据是否发生错误的检错方法。CRC 的核心思想是通过多项式除法对数据进行处理。它将数据视为一个长的二进制数,通过特定的生成多项式(称为生成多项式)对数据进行除法运算,所得的余数就是校验码。在传输数据时,发送端会将计算得到的 CRC 校验码附加到数据的末尾,并将数据和校验码一同发送。接收端再通过相同的算法验证收到的数据,判断数据是否被损坏。
1.发送端和接收端约定多项式 2.发送端根据多项式计算出冗余码附在发送数据后 3.接收端验证冗余码
示例,假定约定的多项式为X^4+X+1 (最低位必须为1) 得到除数10011。假设需要发送数据1101011011 最终发送数据 11010110111110 生成余数如果位数不够,在最前面补0
2.3.3 海明码
海明码(Hamming Code)是一个可以有多个校验位,具有检测并纠正一位错误代码的纠错码。 海明码的检错、纠错基本思想是将有效信息按某种规律分成若干组,每组安排一个校验位进行奇偶性测试,然后产生多位检测信息,并从中得出具体的出错位置,最后通过对错误位取反(也是原来是1就变成0,原来是0就变成1)来将其纠正。 要采用海明码纠错,需要按以下步骤来进行:计算校验位数→确定校验码位置→确定校验码→实现校验和纠错。下面来具体介绍这几个步骤。本文先介绍除最后一个步骤的其它几个步骤。 要使用海明码纠错,首先就要确定发送的数据所需要要的校验码(也就是“海明码”)位数(也称“校验码长度”)。它是这样的规定的:假设用N表示添加了校验码位后整个信息的二进制位数,用K代表其中有效信息位数,r表示添加的校验码位,它们之间的关系应满足:N=K+r≤2r-1。 如K=5,则要求2r-r≥5+1=6,根据计算可以得知r的最小值为4,也就是要校验5位信息码,则要插入4位校验码。如果信息码是8位,则要求2r-r≥8+1=9,根据计算可以得知r的最小值也为4。根据经验总结,得出信息码和校验码位数之间的关系如表5-1所示。
校验码不是直接附加在信息码的前面、后面或中间的,而是分开插入到不同的位置。但不用担心,校验码的位置很容易确定的,那就是校验码必须是在2n次方位置,如第1、2、4、8、16、32,……位(对应20、21、22、23、24、25,……,是从最左边的位数起的),这样一来就知道了信息码的分布位置,也就是非2n次方位置,如第3、5、6、7、9、10、11、12、13,……位
假设现有一个8位信息码,即b1、b2、b3、b4、b5、b6、b7、b8,由表5-1得知,它需要插入4位校验码,即p1、p2、p3、p4,也就是整个经过编码后的数据码(称之为“码字”)共有12位。根据以上介绍的校验码位置分布规则可以得出,这12位编码后的数据就是p1、p2、b1、p3、b2、b3、b4、p4、b5、b6、b7、b8
(1)计算p1的值,因为整个码字长度为12所以可以得出本示例中p1校验码校验的位数是1、3、5、7、9、11共6位。这6位中除p1位不能确定外,其余5位的值都是已知的,分别为:1、0、1、1、0。现假设采用的是偶校验从已知的5位码值可知,已有3个“1”,所以此时p1位校验码的值必须为“1”,得出p1=1。 (2)计算p2的值,p2校验码校验的位数是2、3、6、7、10、11,一共6位。其余5位的值都是已知的,分别为:1、0、1、1、0。现假设采用的是偶校验,从已知的5位码值可知,也已有3个“1”,所以此时p2位校验码的值必须为“1”,得出p2=1。 (3)计算p3的值,p3校验码校验的位数是4、5、6、7、12,一共5位。其余4位的值都是已知的,分别为:0、0、1、1。现假设采用的是偶校验,从已知的4位码值可知,也已有2个“1”,所以此时p2位校验码的值必须为“0”,得出p3=0。 (4)计算p4的值,p4校验码校验的位数是8、9、10、11、12,一共5位。其余4位的值都是已知的,分别为:1、1、0、1。现假设采用的是偶校验,从已知的4位码值可知,已有3个“1”,所以此时p2位校验码的值必须为“1”,得出p4=1
2.4透明传输
透明传输是指不管所传数据是什么样的比特组合,都应当能够在链路上传送。因此,链路层就“看不见”有什么妨碍数据传输的东西。 由于帧的开始和结束的标记使用了专门的控制字符,因此,所传输的数据部分中的任何8比特的组合一定不能出现像帧定界的控制字符一样的比特编码,否则就会出现帧定界的错误。 当传送的帧是用文本文件组成的帧时(文本文件中的字符都是从键盘上输入的),其数据部分显然不会出现像SOH或EOT这样的帧定界控制字符,于是使用SOH和EOT用作帧定界控制字符时就不会出现帧定界错误。可见,不管从键盘上输入什么字符都可以放在这样的帧中传输过去,这样的传输就是透明传输。 但是当数据部分是非ASCII码的文本文件时(如二进制格式的计算机程序或图像等),情况就不同了。这是因为如果数据中的某个字节的二进制代码恰好和SOH或EOT这种控制字符一样,数据链路层就会错误地认为“已经找到了帧的边界”。为解决该问题,有以下处理方法:
1.字符计数法:在帧的头部使用一个计数字段标明帧的长度,如果接收端收到第一帧数据长度错误了,后续收到的帧可能都是错误的。
2.字节填充:为了解决透明传输的问题,就必须设法使数据中可能出现的控制字符“SOH”和“EOT在接收端不被解释为控制字符。具体的做法是: 发送端的数据链路层在数据中出现的控制字符“SOH”或“EOT”的前面插入一个转义字符“ESC”(其十六进制编码是1B,二进制是0001011)。而在接收端的数据链路层上,在把数据送往网络层之前删除这个插入的转义字符。这种方法称为字节填充(byte stuffing)或字符填充( character stuffing)。如果转义字符也出现在数据当中,那么解决方法仍然是在转义字符的前面插入一个转义字符。因此,当接收端收到连续的两个转义字符时,就删除其中前面的一个。
3.零比特填充:使用一个特定的序列01111110来表示一个帧的开始与结束,为了不使数据字段中出现01111110而被误判为帧的首尾标志,发送方先扫描整个数据字段,每遇到连续的5个1,就在后面插入一个0。然后接收方每遇到连续的5个1,就将其后面的0删去,以恢复原始数据。