🛣️ 数据链路层
📖 概述
数据链路层的主要任务是什么?
数据链路层的主要任务是实现帧在一段链路上或一个网络中进行传输的问题。
在以下示例中,局域网1中的主机H1经过路由器R1、局域网2、路由器R2、广域网1和路由器R3连接到局域网3中的主机H2。其中,主机H1和H2都有完整的网络协议栈,而路由器在转发数据包时仅使用协议栈的物理层、数据链路层和网络层。H1向H2发送数据的流程如下。
- 待发送的数据在主机H1中按网络体系结构自上而下逐层封装,物理层将数据链路层封装好的协议数据单元看作比特流,并将其转换为相应的电信号发送出去。
- 路由器接收到数据包后,将从物理层开始向上逐层解封,直至获得网络层协议数据单元PDU。随后,路由器会从PDU的首部中提取目的地址,根据目的地址在转发表中查询相应的下一跳地址,将PDU逐层封装并通过物理层发送出去。
- 主机H2在接收到数据包后,按网络体系结构自下而上对其逐层解封,直至获得从H1发出的数据。
从网络体系结构的角度来看,数据的传输如下所示。
仅从数据链路层的角度来看,主机H1到H2的通信由四段不同的数据链路组成,分别为H1→R1
、R1→R2
、R2→R3
和R3→H2
。需要注意的是,这四段数据链路可能采用不同的数据链路层协议。
链路和数据链路有什么区别?
链路和数据链路之间存在一定的区别,以下是对它们的描述。
- 链路(Link):指一个节点到相邻节点的一段物理链路(有线或无线),而中间没有任何其他的交换节点。网络中各主机之间的通信一般由多段链路构成。在以下示例中,主机H1与H2之间的通信路径共包含
H1→R1
、R1→R2
、R2→R3
和R3→H2
四段链路。
- 数据链路(Data Link):数据链路是基于链路的。当数据在链路上传输时,需要一些特定的通信协议来控制数据的传输,把实现这些协议的硬件和软件加到链路上,就构成了数据链路。计算机中的网络适配器(俗称网卡)和其相应的软件驱动程序就实现了这些协议。需要注意的是,一般的网络适配器只包含物理层和数据链路层这两层的功能。
三个重要问题
尽管数据链路层的协议多种多样,但它们通常都涉及三个重要问题,分别为封装成帧和透明传输、差错检测、可靠传输。
封装成帧和透明传输是什么?
封装成帧
封装成帧是指数据链路层在接收到来自上层(网络层)的协议数据单元PDU后,为该PDU添加一个首部和一个尾部,从而构成一个帧。帧是数据链路层对等实体之间在水平方向进行逻辑通信的协议数据单元PDU。
帧的组成
帧的首部和尾部中包含一些重要的控制信息。
以太网V2的MAC帧的首部包含目的地址、源地址以及类型三个字段,尾部仅包含帧检验序列FCS字段。
PPP协议帧的首部包含标志、地址、控制和协议四个字段,尾部包含帧检验序列FCS和标志两个字段。
帧定界
数据链路层将封装好的帧向下交付给物理层,物理层将其看作是比特流,并转换成相应的电信号发送给接收方。那接收方的数据链路层是如何从物理层交付上来的比特流中提取出一个个的帧呢?
其实,帧首部和尾部的一个重要作用就是帧定界。例如,点对点协议PPP帧的首部和尾部各包含一个1字节的标志字段,标志字段的取值为01111110
。这样一来,接收方的数据链路层就可以从比特流中识别出一个个的帧了。
需要说明的是,并不是每一种数据链路层协议的帧都包含有帧定界的标志字段。例如,以太网V2的MAC帧的首部和尾部中都没有帧定界标志。它的帧定界方法为:发送方的数据链路层会将封装好的MAC帧交付给下面的物理层,物理层会在MAC帧前添加8个字节的前导码,然后再将其相应的比特流转换成电信号发送。前导码中的前7个字节为前同步码,作用是使接收方的时钟同步,后1个字节为帧开始定界符,表明其后面紧跟着的就是MAC帧。
另外,以太网还规定了帧间间隔时间为96比特的发送时间。因此,MAC帧并不需要帧结束定界符。
MTU
为了提高数据链路层传输帧的效率,各数据链路层协议应当使帧的数据载荷的长度尽可能地大于首部和尾部的长度。同时,考虑到缓存空间及差错检测等诸多因素,这些协议都规定了帧的数据载荷的长度上限,即最大传输单元(Maximum Transfer Unit, MTU)。例如,以太网的MTU为1500个字节。
透明传输
透明传输是指数据链路层对上层交付下来的协议数据单元PDU没有任何限制,就好像数据链路层不存在一样。
如果发送方数据链路层封装的帧的数据载荷中恰好存在帧定界符,那么就会造成接收方数据链路层出现帧定界错误。这种问题会使得数据链路层对上层交付下来的协议数据单元PDU的内容有所限制,即PDU中不能包含帧定界符。
显然,这样的数据链路层并未实现透明传输,也没有什么应用价值。一般情况下,数据链路层实现透明传输的方法有两种:字节填充和比特填充。
字节填充
当使用面向字节的物理链路时,数据链路层使用字节填充的方法实现透明传输,主要解决的问题是识别帧定界符在字节流中的表示方式。
发送方的数据链路层在把帧交付给物理层之前会对帧的数据载荷进行扫描。当发现帧定界符或转义字符"ESC"
时,就会在其前面加入一个转义字符。需要说明的是,转义字符是一种特殊的控制字符,其十六进制编码为1B,占一个字节。
接收方的数据链路层在物理层交付上来的比特流中提取帧时,如果遇到一个转义字符,会将其后面的一个字节内容作为数据并继续提取。当接收方的数据链路层在把数据载荷向上交付给网络层之前,也会删除先前发送方数据链路层插入的转义字符。
比特填充
当使用面向比特的物理链路时,数据链路层使用比特填充的方法实现透明传输,主要解决的问题是识别帧定界符在比特流中的表示方式。
例如1字节的帧定界符的比特表示为01111110
。
发送方的数据链路层在把帧交付给物理层之前会对帧的数据载荷进行扫描,当发现5个连续的比特1时,就会在其后面加入一个比特0,这确保了数据载荷中不包含帧定界符。
由于数据载荷中不包含帧定界符,因此接收方的数据链路层只需正常提取帧即可。当接收方的数据链路层在把数据载荷向上交付给网络层之前,也会对数据载荷进行扫描,当发现5个连续的比特1时,就会把其后面的比特0删除。
需要说明的是,字节填充法和比特填充法只是实现透明传输的一般原理性方法。各种数据链路层协议都有其实现透明传输的具体方法,其中有的基于字符填充法或比特填充法实现,而有的并未采用这两种方式实现。
例如,高级数据链路控制协议(HDLC, High-level Data Link Control)协议采用了零比特填充法来实现透明传输。在HDLC协议中,其定界符标志为01111110
,遇到5个连续的比特1则在其后面补0。
再例如,以太网的数据链路层协议没有采用字节填充法和比特填充法来实现透明传输。正如上文所述,以太网MAC帧的首部和尾部中并没有帧定界符字段,因此其不存在透明传输的问题。
差错检测是什么?
阿松大
可靠传输是什么?
打撒十大