1. 数据链路层的三个基本问题
1.1 数据链路和帧
(1)链路(Link):指从一个节点到相邻节点的一段物理线路(有线或无线),而中间没有任何其他交换节点。
①注意:集线器不是交换节点,因此计算机A和路由器1之间是一条链路。
②交换机是一个交换节点,因此,计算机B和路由器3之间的链路有链路4和链路5两条。
(2)数据链路(Data Link):物理线路+通信协议。数据链路层的协议数据单元被称为帧。
①数据链路层把网络层交下来的数据(被称为IP数据报、数据报、分组或包)添加首部和尾部封装成帧发送到链路上,以及把接收到的帧中的数据取出来并上交给网络层。
②数据链路层封装的帧,在物理层变成数字信号在链路上传输。如果不考虑物理层的传输细节,就可以认为数据帧通过数据链路由从节点A发送到节点B(如上图虚线所示)
1.2 3个基本问题
(1)封装成帧
①数据链路层将IP的数据报的前后分别添加首部和尾部,构成一个帧。但因该层的协议很多,不同协议的帧的首部和尾部信息所有不同。
②帧的首部和尾部有帧开始符和结束符,被称为帧定界符。
③每一种数据链路层协议都规定了所能传送帧的数据部分的长度上限——最大传输单元(MTU),以太网的MTU为1500个字节。注意,MTU指的是数据部分长度。
(2)透明传输
①帧定界符:可以选用ASCII码表中的SOH(0x01)作为帧开始定界符,EOT(0x04)为帧结束定界符。
②如果数据部分出现“EOT”或“SOH”时要进行字节填充。(具体方法:发送端的数据链路层在数据中出现控制字符“EOT”、“SOH”以及“ESC”,则在前面插入一个转义字符“ESC”的编码。接收端的数据链路层在收到删除这个插入的转义字符。这样用字节填充法解决透明传输的问题)。
(3)差错检测
①现实的通信链路都不会是理想的,在传输过程中可能会产生差错。为了保证数据传输的可靠性,必须采用各种差错检验技术(如循环冗余检验,CRC)。
②要让接收端能够判断帧在传输过程中是否有差,需要在帧中包含用于检测错误的信息,这部分信息称为“帧校验序列(FCS)”
③以CRC技术为例计算FCS。假设要检测的数据为M=101001(注意,不仅包含帧的数据部分,还包含了数据链路层的首部),要想得到n位FCS。则计算过程如下:
A.要得到n位的FCS,则必须先在M后面添加n位(这里假设n为3)的0,得到被除数101001 000。再除以收发双方事先商定好的n+1位除数P(设为1101),得到商Q,余数R(n位,比除数少一位),这个R(001)就是要计算的FCS。
B.接收方收到后,会使用M和FCS合成一个二进制数(即101001001),再除以P(1101),如果余数为0,表示该帧没有差错。否则表示传输有差错,就会丢弃从而出现丢包现象(这个得由传输层的TCP协议通过丢包重传来实现可靠传输)
④帧检验序列FCS包含了帧的数据部分(来自网络层)和数据链路层的首部。这意味着,如果通信经过多条链路时,IP数据报的源和目标地址会被修改或者经过路由器时网络层首部的TTL(生存时间减1),这些会造成IP数据报的变化。而当通信由一条链路到下一条链路时由于协议不同,会造成数据链路层首部格式不同,帧开始和结束符也不同,这都需要将帧进行重新封装,重新计算FCS。幸运的是,这些都是由硬件完成的,处理速度很快,不会延误数据的传输。