链路层的功能
链路:两个结点之间的物理通道 ,链路的传输介质分为有线链路和无线链路,主要有双绞线,光纤,微波。
数据链路:两个结点之间的逻辑通路 ,把实现数据数据传输协议的硬件和软件加到链路上就构成数据链路。
结点:路由器,主机
帧:链路层的数据协议单元。封装网络层的数据报
数据链路层负责从一个结点搬运数据报到另一个结点。
- 功能一: 为网络层提供服务。主要作用是加强物理层传输原始比特流的功能 ,使得物理层提供的可能出错的物理连接 在数据链路层的加持下,改造成逻辑上无差错的链路。 对物理层的数据负责起来。
可以给网络层提供的服务有以下三种:
①无确认无连接服务:主要用于实时通信。只是为了快而快。正如字面意思,目的主机收到数据后也不会发送确认信号,源主机也不会专门建立一个链路的连接。即使帧丢失,数据链路层也不会负责重发。误码率比较低
②有确认无连接服务:仍然不会建立一条连接。但是收到数据后会发给发送主机一个确认。发送端要是没有收到确认信号,就会发送下一个。适合误码率比较低的通信信道,比如无线信道。
③有确认面向连接服务:最安全,最可靠。建立连接再发送下一个帧,直到收到确认信号,继续发送下一个信号。
有连接一定是有确认的,所以不存在 无连接面向连接服务。
- 功能二:在面向连接时,负责连接的建立、维持、释放
- 功能三:组帧
给网络层传输下来的IP数据报前后分别添加帧首部和帧尾部 。接收端可以根据帧的首部和尾部的标记,就可以识别出这一段帧的开始和结束
首部和尾部含有非常多重要的信息,差错控制信息,流量控制信息,物理地址信息,还有就是帧定界信息。
帧同步:接收方能够从接受的二进制比特流中识别出帧的起始和终止
组帧: 发送方 添加帧首部尾部信息
不同数据链路层协议,最大传输单元MTU的长度不同。但是发送的时候还是都要遵守帧的数据部分要小于帧的MTU
透明传输:不管所传数据是什么样子的比特组合,随便发,都能传输。不存在传不了的。好像看不见传输的内容一样(按道理逻辑讲,数据链路层是能看到传输的比特,毕竟经过数据链路层✋,无奈数据链路层透明传输!!)
发送端组帧过程有四种方法:
①字符(字节)计数法
缺点:要是第一个字符在发送的时候发生错误,那么就gg了,会导致后续全部移位,无法识别。比如上图中,第一个帧的第一个字符"5"变成"4"。这种错误发生是灾难性的,所有帧都无法帧同步!!不常用。
帧的帧首部的第一个字节SOH(start of head) ,帧的帧尾部的最后一个字节EOH(end of head) ,不同协议的定界符SOH、EOH是不同的。
理想的是上面图中所示,但是这种常规方法只适合传输文本文件,因为传输文本文件意味着每一个敲进去的字符对应的ASCII码都不会和协议中提前设定的定界符产生交集,即 在帧中不会有定界符,可以放心大胆的传输。
但是!要是传输图片、程序文件,可就数据部分可就不一定会没有帧定界符,因此需要采取下面👇的几种方法,解决数据部分含有帧定界符的方法。
后面几种都要提前添加定界符,定界符通常由一个字节组成,题目会说明
②(转义)字符填充法
先给数据前后添加首位定界符:然后对定界符之间的内容,再遇到定界符或者转移字符就在前面统一添加转义字符
发送端的时候数据部分遇到帧定界符,就给帧定界符前面添加转义字符;接收端的时候遇到转义字符+定界符或者转义字符+转义字符 的时候,去掉转义字符就OK
③零比特填充法
扫描比特流,在发送端,遇到5个1,就无脑后面添加0;
在接收端,遇到5个1,就给后面的0无脑删除
④违规编码法
使用高-高,低-低电平做定界符 ,目前的局域网802.1X就是使用的这样一种组帧方式
- 功能四:流量控制 限制发送方速度,让慢点发
- 功能五:差错控制(帧错/位错)
差错是由于噪声的存才才产生的。
噪声分类:
全局性噪声:线路本身,信道固有的随机 (热)噪声
解决办法:提高信噪比 减少噪声 (信号的强度就相对于噪声的强度就非常大) 对传感器下手可以提高信噪比
局部性噪声:短暂原因造成的冲击噪声 ,是产生差错的主要原因。
解决办法:利用编码技术来解决
差错的分类:
一、位错 比特位出错1变0,0变1
二、帧错 帧错分为3种:丢失、重复、失序
现代由于通信线路已经比较大的改善,数据链路层的重传、确认机制已经不一定要进行。
无确认无连接服务 适合通信质量好,有线传输链路。因为这种服务方式下,可以说没有、减少了差错检测,所以如果发生了差错,差错控制就交给上一层(传输层来进行小规模差错控制足矣)
有确认无连接
有确认面向连接 后面这两种 适合进行通信线路比较差的无线传输链路 。所以属于比较可靠的数据链路层服务,对网络层来说提供的数据信息比较可靠。
数据链路层的差错控制
给数据链路层的安排差错控制功能可以比较早的发现错误,这样可以避免后面发送错误数据,从而节省资源。
数据链路层更多的是发生差错里面的比特错;
所以数据链路层的差错控制(比特错控制更多的是)分为:
-
检错编码 只知道发生错误
-
奇偶校验码
添加一位校验位以后,数据加校验码所有位数中,奇校验码有奇数个1,偶校验码有偶数个1. 当使用奇校验码时,接收端接收的数据如果是偶数个1,那么一定可以判定数据发生了错误;要是接收的数据是奇数个1,就不能判定发送过来的数据是一定发生了错误,因为可能没错,也可能错了2位。
特点:
只能检查奇数个比特的错误 ,检错能力为50%
原数据1100101 奇校验码11100101 ,要是发生一位错11100100可以检测出错或者11100111也可以检测出错;三位错,五位错也一样可以检查出来;
但是要是偶数个比特发生错误,奇校验码11100101,要是发生2位错11100110发现此时1的个数还是奇数,这就不能检查出错误了
- 循环冗余码
帧检验序列(冗余码)的位数就是二进制下的生成多项式的位数-1
生成冗余码之后,把冗余码添加到原始数据之后再发送到信宿,信宿拿着收到的序列除以生成多项式,如果没有余数(没有冗余码),证明发送过程非常OK,没有发生比特差错,就接收; 要是余数不为0,那么就判断发送过程中帧出了问题,但是还是无法纠错。只能丢弃帧,让信源重发
值得注意的是:FCS的生成以及接收端CRC检验都是由硬件实现,处理很迅速,没有传输数据的额外延迟
-
"可靠传输":数据链路层发送方发送什么,接收方就接收什么
所以CRC检验和奇偶校验码是无比特差错的传输,但这还不是可靠传输,因为有一些帧丢弃了,没有被接受方接收,达不到可靠传输
-
纠错编码 还知道具体哪一位发生错误
- 海明码
发现双比特错,纠正单比特错
海明码的冗余码(校验码)是内嵌在原始数据中,这个就和前面的检错码不一样了。海明校验码会间隔一些位数内嵌在原始比特流中。每一个检错码都会作用于这个校验码之后的原始数据位数,因此靠后的比特位数大概率是被前面的所有校验码作用影响的,也正因如此,后面的数据如果发生错误,就会牵一发而动全身影响前面好几位海明校验码。
①确定校验码的位数
使用一个海明不等式就行了
\(2^r-1\ge k+r\) \(r\)是冗余码的信息,\(k\)是传送数据位数
②确定校验码和数据的位置
海明码放在\(2^n\)的位置上;
数据位从左到右依次插空;
计算海明码位置对应的海明码值
1#校验码对应的二进制第一位(从右往左)是1,所以1#海明码校验的数据对应的二进制数的第一位也是1,图中可以看得出是\(D_1,D_2,D_4,D_5\) ;海明码的值应该满足的是 \(P_1\oplus D_1\oplus D_2\oplus D_4\oplus D_5=0\) ,可以计算出 \(P_1=0\)
2#校验码对应的二进制第二位是1,所以2#海明码校验的是二进制位数第二位是1的数据位,有\(D_1,D_3,D_4,D_6\) ;海明码的值是\(P_2\oplus D_1\oplus D_3 \oplus D_4\oplus D_6=0\) 可以计算出\(P_2=0\)
3#校验码也是同理……
检错并纠错:已经接收到了的数据进行纠错
异或每一个校验码以及校验码影响的数据位得到结果。
比如:由已知校验码以及数据位,计算\(P_1\oplus D_1\oplus D_2\oplus D_4\oplus D_5\) =1; 再计算 \(P_2\oplus D_1\oplus D_3 \oplus D_4\oplus D_6\)=0; 再计算 \(P_3 \oplus D_2\oplus D_3 \oplus D_4\) =1; 再计算 \(P_4 \oplus D_5\oplus D_6\) =0
出错位置是 0101(按照倒序排列,可以这样理解倒序排列的原因:最后一位是对应第一个海明码控制的范围,而且第一个海明码控制的影响范围比较大,可以对最后全局作出深远影响,对应到序列,就是最后一位对全局的影响比较大)
纠错:取反码即可
物理层编码:针对单个比特的对应的电平形式
数据链路层编码:针对一组比特进行差错检测(使用的是冗余码技术)
冗余码技术:发送数据之前,给原数据添加一定的冗余位 ,到达信宿后检查接收到的数据和冗余位之间的关系是否仍然满足之前的关系。