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