数据链路层:帧在不同链路的封装。
计算机通信时,数据包在网路层封装好后,数据链路层过不同的链路,重新封装成相应的帧
⚫ 封装成帧,就是在将网络层的IP数据报的前后分别添加首部和尾部,这样就构成了一个帧。
⚫ 不同的数据链路层协议的帧的首部和尾部包含的信息有明确的规定,帧的首部和尾部有帧开始符和帧结束符,称为帧定界符。接收端收到物理层传过来的数字信号读取到帧开始字符一直到帧结束字符,就认为接收到了一个完整的帧。
⚫ 在数据传输中出现差错时,帧定界符的作用更加明显。
⚫ 每一种数据链路层协议都规定了所能够传送的帧的数据部分长度的上限–即最大传输单元MTU(Maximum Transfer Unit),以太网的MTU为1500个字节。 (不包括插入的转义字符)
⚫ 帧开始符和帧结束符最好是不会出现在帧的数据部分的字符,通常我们电脑键盘能够输入的字符是ASCII字符代码表中打印字符,在ASCII字符代码表中,还有非打印控制字符,在非打印字符中有两个字符专门用来做帧定界符,代码SOH(Start Of Header)作为帧开始定界符,对应的二进制编码为00000001,代码EOT(End Of Transmission)作为帧结束定界符。
ASCII字符码表:
◼ASCII字符集中“头标开始”和“传输结束”是非打印控制字符。
◼避免在用户使用键盘输入帧开始字符和帧结束字符。
⚫ 当数据部分是非ASCII字符代码表的文本文件时(比如二进制代码的计算机程序或图像等),情况就不同了。如果数据中的某一段二进制代码正好和SOH或EOT帧定界符编码一样,接收端就会误认为这就是帧的边界。
⚫ 现在就要想办法让接收端能够区分帧中EOT或SOH是数据部分还是帧定界符,我们可以在数据部分出现的帧定界符编码前面插入转义字符:
◼如果传输的数据中,出现了帧开始字符和帧结束字符,要添加转义字符,告诉接收端后面是数据。
◼接收端收到后去掉转义字符,收到发送数据,这就是透明传输。
◼不同的数据链路层协议,定义的转义字符不一样。
注:
⚫ 现实的通信链路都不会是理想的。这就是说,比特在传输过程中可能会产生差错:1可能会变成0,而0也可能变成1,这就叫做比特差错。
⚫ 为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施目
前在数据链路层广泛使用了循环冗余检验CRC(Cyclic Redundancy Check)的差错检验术。
⚫ 要想让接收端能够判断帧在传输传输过程是否出现差错,需要在传输的帧中包含用于检测错误的信息,这部分信息就称为帧校验序列FCS(Frame Check Sequence)。
注:帧校验序列在传输中产生变化,也认为传输错误(接收端也能判断出错误来)
◼ 首先在要校验的二进制数据M=101001后面添加n位0,再除以收发双方事先商定好的n+1位的除数P,得出的商是Q,而余数是R(n位,比除数少一位),这个n位余数R就是计算出的FCS。
◼ 假如要得到3位帧校验序列,就要在M后面添加3个0,就成为101001000,假定事先商定好的除数P=1101(4位),如图4-10所示,做完除法运算后余数是001,001将会添加到帧的尾部作为帧校验序列FCS,得到商Q=110101,这个商并没什么用途。