数据链路层负责称为帧的东西,它是将来自网络层的比特流划分为可管理的单元(称为帧)。每个帧由发送者的地址和目标地址组成。目标地址定义了数据包的去向,发件人的地址帮助收件人确认收到。帧可以是固定大小或可变大小。在固定大小的帧中,不需要定义帧的边界,因为大小本身可以用来定义帧的结束和下一帧的开始。但是,在可变大小的帧中,我们需要一种方法来定义帧的结束和下一帧的开始。
为了将一帧与下一帧分开,在帧的开头和结尾添加一个 8 位(或 1 字节)标志。但问题在于,用于标志的任何模式也可能是信息的一部分。所以,有两种方法可以解决这个问题:

  • 使用字节填充(或字符填充)
  • 使用位填充

字节填充

当存在与标志具有相同模式的字符时,将具有预定义位模式的字节(通常是转义字符(ESC))添加到帧的数据部分。 每当接收器遇到 ESC 字符时,它就会从数据部分中删除并将下一个字符视为数据,而不是标志。

但是当文本包含一个或多个转义字符后跟一个标志时,就会出现问题。 为了解决这个问题,作为文本一部分的转义字符由另一个转义字符标记,即,如果转义字符是文本的一部分,则添加一个额外的字符以表明第二个是文本的一部分。
例子:

注:点对点协议 (PPP) 是一种面向字节的协议。

位填充

大多数情况下,标志是一个特殊的 8 位模式“01111110”,用于定义帧的开始和结束。
标志的问题与字节填充的情况相同。 因此,在这个协议中,我们所做的是,如果遇到 0 和五个连续的 1 位,则在这些位之后添加一个额外的 0。 这个额外的填充位被接收器从数据中删除。

无论下一位的值如何,在一个 0 之后添加额外的位,然后是五个 1 位。 此外,由于发送方总是知道哪个序列是数据,哪个是标志,它只会在数据序列中添加这个额外的位,而不是在标志序列中。
例子:

位填充