数据链路层之所以要把比特流组合成帧为单位传输, 是为了在出错时只重发出错的帧而不
必重发所有数据, 从而提高效率. 为了使接收方能正确地接收并检查所传输的帧, 发送方必须依
据一定的规则把网络层递交的分组封装成帧( 称为组帧) .
组帧主要解决帧定界、帧同步、透明传输等问题. 通常有以下4 种方法实现组帧.
3.2 .1 字符计数法
字符计数法是指在帧头部使用一个计数字段来表明帧内字符数. 目的结点的数据链路层收
到字节计数值时, 就知道后面跟随的字节数, 从而可以确定帧结束的位置( 计算字段提供的字节
数包含自身占用的一个字节)
这种方法最大的问题在于如果计数字段出错即失去了帧边界划分的依据, 那么接收方就无
法判断所传输帧的结束位和下一帧的开始位, 收发双方将失去同步, 从而造成灾难性后果.
3.2 .2 字符填充的首尾定界符法
字符填充法使用一些特定的字符串来定界一帧的开始与结束. 为了使信息位中出现的特殊
字符不被误判为帧的首尾定界符, 可以在特殊字符前面填充一个转义字符( DLE) 来加以区分, 以
实现数据的透明传输. 接收方接收到转义字符后, 就知道其后面紧跟的是数据信息, 而不是控制
信息.
如图所示的字符帧, 帧的数据段中出现DLE字符, 发送方在每个DLE字符前再插入一个DLE字
符, 接收方收到数据后会自己删除这个插入的DLE字符, 结果仍得到原来的数据. 这也正是字符
填充法名称的由来
( a) 网络层发出的数据 DLE STX| A DLE B| DLE ETX
( b) 经数据链路层填充后的数据 DLE STX| A DLE DLE B| DLE ETX
( c) 接收方传送给网络层的数据 DLE STX| A DLE B| DLE ETX
3.2 .3 零比特填充的首尾标志法
如图所示, 零比特填充法允许数据帧包含任意这个数的比特, 也允许每个字符的编码包含
任意个数的比特. 它使用一个特定的比特模式, 即01111110 来标志一帧的开始和结束. 为了不
使信息位中出现的比特流01111110 被误判为帧的首尾标志, 发送方的数据链路层在信息位中
遇到5 个连续的"1" 时, 将在其后自动插入一个"0" ; 而接收方做该过程的逆操作, 即每收到5 个
连续的"1" 时, 自动删除后面紧跟的"0" , 以恢复原信息.
零比特填充法很容易由硬件来实现, 性能优于字符填充法
3.2 .4 违规编码法
在物理层进行比特编码时, 通常采用违规编码法. 例如, 曼彻斯特编码方法将数据比特"1"
编码成“高- 低”电平对, 将数据比特"0" 编码成“低- 高”电平对, 而“高- 高”电平对和“低- 低”电
平对在数据比特中是违规的( 即没有采用) . 可以借用这些违规编码序列来定界帧的起始和终止
违规编码法不需要采用任何填充技术, 便能实现数据传输的透明性, 但它只适用于采用冗
余编码的特殊编码环境.
由于字节计数法中计数字段的脆弱性个字符填充法实现上的复杂性与不兼容性, 目前较
常用的组帧方法是比特填充法和违规编码法.