首先,链路层必须处理四件事情:成帧、差错监测、纠正和可靠数据传输。其中,成帧和差错监测是传输中必考虑的因素。
首先我们要知道在分组交换网络中,结点交换的是数据块而不是比特流。我们主要采取面向比特的协议(PPP)和面向字节的协议两种方式进行成帧。
1、面向字节的协议------字节填充
说白了就是通过在帧的两端加一个首位结束符。
当然,如果我输入的数据里包含这个起止结束符怎么办?-------------------------------------那么我们就需要引入转义字符。
相信大家都学过C语言,我们常常会用到"\n","\n"其实就是转义字符,将我们要输出的内容进行换行处理。那么如果我们想要输出"/n"这个字符怎么办呢?
通常我们会采用在/n前再加一个/加以区分,这就是字节填充法。
但是字节填充存在的问题是如果我们传的数据一直和首位定界符撞怎么办?那就要一直进行转义,太麻烦了,所以字节填充这个方法在现在已经被淘汰了,那么我们来说一下另外一种成帧方式。
2、面向比特的协议------比特填充(用于发送前和接收后)
我们采用7E的二进制数"01111110"作为首位结束符。
发送方:当数据出现5个1时我们就在后面加一个0
接收方:当我收到5个1的时候----如果后面是0,那么我就采取去0操作,如果后面是1,则证明是结束符,那么这个帧结束。(因为发送方每5个1就加了一个0,所以数据中不会存在6个1的情况,6个1只能是结束符)
下图解释了加0减0的全过程:
PPP协议(采用零比特填充)
PPP协议:将IP数据报封装到串行链路的方法。
0111 1110 | 1111 1111 | 0000 0011 | 协议 | 信息 | 检验和 | 0111 1110 |
标志字段,1字节 | 地址字段,1字节 | 控制字段,1字节 | 1或2字节 | 长度可变 | 2或4字节 | 标志字段,1字节 |
|-------------------------------------------------------------------------------|
差错控制范围
PPP协议的帧格式是面向字节的,与HDLC格式相同,无符号帧。
标志字段:每个PPP数据帧都是用值为0111 1110的1字节标志字段作为开始和结束。
地址字段:全1为点到点广播通信(<==PPP),全0为本地通信。
控制字段:PPP固定采用0000 0011,PPP允许发送方不发送地址和控制字节,这样可以节省两个字节的开销。
信息:包含上层协议(例如IP)在经过PPP链路发送的分组数据,默认最大长度:1500字节。
检验和:用于检测经过传输的数据帧可能存在的比特差错,它使用2或4字节的HDLC标准循环冗余码。
协议字段:网络层协议数据域类型。(0021:IP报文;C021:PPP的LCP;8021:PPP的NCP;0023:OSI;0027:DEC)
差错检测不是百分百可靠,一般用于消息认证和数字指纹。
1、奇偶校验(检错重发,向前纠错)
校验依据:判断传输的一组二进制数据中"1"的个数是奇数还是偶数
奇校验:如果以二进制数据中1的个数是奇数为依据,则是奇校验
偶校验:如果以二进制数据中1的个数是偶数为依据,则是偶校验
说明:采用何种校验必须事先规定好的,通常传输的数据会专门设置一个奇偶校验位,用它来确保发送出去的二进制数据 中“1”的个数为奇数或偶数。
1)接收端收到这组二进制数据后,则校验“1”的个数是否为奇数,从而确定传输代码的正确性
2)偶校验以此类推
3)奇偶校验只能检测出错误而无法确定错误数据位具体是哪一位,因此进行修正,同时虽然2位及以上的偶数位同时发生 错误的概率相当低,但奇偶校验却无法检测出偶数个数据位错误。
4)奇偶校验实现简单,具有相对理想的检错能力,因此得到广泛使用。
5)较大的EDC(差错检测码)字段能产生更好的检测和纠正--------->可定位、成本高。
2、检测和方法(开销小但能力弱)(回卷)
使用与软件协议,一般用于基于可靠连路的高层协议中。
3、循环冗余校验(CRC)(硬件)
发送信息 | 冗余码 |
CRC检验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列;附加在数据序列之后的这个检验码与数据序列的内容之间存在着某种特定的关系。如果因干扰等原因使数据序列中的某一位或某些位发生错误,这种特定关系就会被破坏。因此,通过检查这一关系,就可以实现对数据正确性的检验。
(1) 注意:1)数据不存在进位、借位,对数据进行模2运算,只有0、1两个状态
2)加减法都遵循异或原则
3)够不够只与除数和被除数长度是否相等有关,与数值大小无关
4)用硬件实现,用于链路层协议
5)CRC只能用于检测小于k位(k=生成多项式G长度-1)的错误(100%)
6)发送方:补0求余;接收方:直接除多项式G看是否能整除
(2)计算:
设信息字段为K位,校验字段为R位,则码字长度为N(N=K+R)。设双方事先约定了一个R次多项式g(x),则CRC码:
V(x)=A(x)g(x)=xRm(x)+r(x)
其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式。
这里r(x)对应的代码即为冗余码,加在原信息字段后即形成CRC码。
r(x)的计算方法为:在K位信息字段的后面添加R个0,再除以g(x)对应的代码序列,得到的余数即为r(x)对应的代码(应为R-1 位;若不足,而在高位补0)。
举个栗子:设需要发送的信息为M = 1010001101,产生多项式对应的代码为P = 110101,R=5。在M后加5个0,然后对P做 模2除法运算,得余数r(x)对应的代码:01110。故实际需要发送的数据是101000110101110
1、理想信道数据传输模型(信道可靠+信道无限大)
发送方:取data---->data放到buffer---->buffer中data发送(物理层与链路层共用buffer)
接收方:wait---->有data---->把data接收到buffer---->把buffer中data向主机发送(链路层与网络层共用buffer)
但是!------信道不能保证与处理机速度匹配——>引入确认采用反馈机制调节发送速度——>停止等待协议----SW0协议
2、SW0协议(出错重传)
如果数据能够正常发送,正常接收,正常确认,正常收到确认那么就是一种无差错的情况,也是最理想,最好的一种状态。
如果数据丢在路上了或者确认丢路上了(容易引发死锁)怎么办呢?------------------------->加一个超时定时器---->SW1协议
3、SW1协议(解决死锁,超时重传)
1)A在发送完一组数据后,必须暂时保留自己已发送的数据的副本(供超时重传使用)。只有收到确认后,才会删除该副 本。
2)每一组数据和确认数据都必须编号。这样才能明确是哪一个发送出去的数据收到了确认,哪一个没有收到。
3)超时计时器设定的时间一般为2倍的传播时延+一段时间。
可是如果认没有丢,只是在路上玩了一会,这个时候计时器超时重发了,那接收方接收到两个确认信息都收下了(出现冗余),怎么办呢?------>把发送也加上序号---->SW2协议
4、SW2协议(解决冗余)
每发送一个新的分组就把它的发送序号加1
1)A收到重复的确认后,直接丢弃。
2)B收到重复的M1后,也直接丢弃重复的M1。
可是如果确认不加编号好像也会导致冗余------->那就ack和数据都加上编号---->SW3协议
5、SW3协议(可靠的传输协议)(自动请求重传)
SW3协议=差错检测+接收方确认+重传+定时器+序号(分组+确认)
1)ARQ协议效率≈信道利用率
2)协议效率=工作时间内协议实际发送的数据量/工作时间内网络理论可以传输的数据量
6、流水线可靠传输协议
7、滑动窗口协议
1)滑窗大小根据接收方缓存大小决定
2)窗口越大,序号字段越大
8、接收数据协议:①回退N步协议(GBN)(正确数据也会重传,出错率高性能差)
GBN协议对失序的分组直接丢弃,但是当丢弃的分组很多时,该协议的效率就很低,每当一个分组损坏, 发送方就要重传所有的没有被确认的分组,即使分组中的一部分已经被接受了。
WT(发送方)+WR(接收方)=
1)发送窗口长度:-1
2)ACK=N表示对N-1之前的所有数据进行确认(不丢不乱序不重复不出错)
3)每个传输中的分组用同一定时器
GBN特点:①仅按序接收②失序后全重传(正确也重传)③超时机制④累计确认⑤接收窗口长度为1
缺点:①(扔的太多)影响协议效率②极端情况下可能低于停-等ARQ
提高效率--->扩大窗口---->让发送方仅传丢失/出错组,等到全到后一起提交---->选择性重传(SR)
②选择性重传(SR)(仅重传出错数据,更快)
仅重传失序点后错误的数据,窗口长度N-1