数据链路层:帧在不同链路的封装。
本章图例:
计算机通信时,数据包在网路层封装好后,数据链路层过不同的链路,重新封装成相应的帧
数据链路层的三个基本功能:
数据链路和帧
- 数据链路和数据链路的区别:
⚫ 链路(Link)是指的从一个节点到相邻节点的一段物理线路(有线或无线),而中间没有任何其他的交换节点。
⚫ 数据链路(Data Link)则是另一个概念,这是因为当需要在一条线路上传送数据时,除了必须有一条物理线路外,还必须有一些必要的通信协议来控制这些数据的传输。
- ◼数据链路层把网络层交下来的数据封装成帧发送到链路上,以及把接收到的帧中的数据取出并上交给网络层。
◼在因特网中,网络层协议数据单元就是IP数据报(或简称为数据报、分组或包)。数据链路层封装的帧,在物理层变成数字信号在链路上传输。
功能:封装成帧
⚫ 封装成帧,就是在将网络层的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是数据部分还是帧定界符,我们可以在数据部分出现的帧定界符编码前面插入转义字符:
◼如果传输的数据中,出现了帧开始字符和帧结束字符,要添加转义字符,告诉接收端后面是数据。
◼接收端收到后去掉转义字符,收到发送数据,这就是透明传输。
◼不同的数据链路层协议,定义的转义字符不一样。
注:
- 如果数据中存在二进制组合正好是ESC,则在ESC(二进制组合)前面再加个ESC
- 数据中存在两个相邻ESC,则按顺序插ESC(插2个,用于转义) ,接收时去掉这俩
- 接收时看到ESC(用于转义添加的)则确定SOH/ESC(由原始数据组成的)为数据一部分,则去掉ESC(用于转义添加的)
功能:差错检验
⚫ 现实的通信链路都不会是理想的。这就是说,比特在传输过程中可能会产生差错:1可能会变成0,而0也可能变成1,这就叫做比特差错。
⚫ 为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施目
前在数据链路层广泛使用了循环冗余检验CRC(Cyclic Redundancy Check)的差错检验术。
⚫ 要想让接收端能够判断帧在传输传输过程是否出现差错,需要在传输的帧中包含用于检测错误的信息,这部分信息就称为帧校验序列FCS(Frame Check Sequence)。
注:帧校验序列在传输中产生变化,也认为传输错误(接收端也能判断出错误来)
CRC运算示例:
◼ 首先在要校验的二进制数据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,这个商并没什么用途。