Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

数据帧的边界

复习

  • 信号与传输介质:比特可借助电、光或无线电波传播,介质各有取舍
  • 带宽、时延与吞吐量:它们描述不同维度的“快”
  • 编码、时钟与噪声:比特要经过编码,才能变成可被采样判定的信号

TL;DR

  • 帧把连续比特流切成可独立处理的一段段数据
  • 边界可由长度字段、特殊标记或物理层约定表示
  • 划对边界,和内容本身正确,是两件不同的事

正文

  现在,接收方已经能一个接一个地读出比特了。但它面对的是一长串没有停顿的 0 和 1,怎么知道“这 100 位是一句话,下一位开始是另一句话”?

  它不能靠猜。通信双方必须把一段完整数据装进(frame),并约定好边界在哪里。

几种划边界的方法

  常见的做法有三种:

  • 在开头写明长度,接收方数够这么多位,就知道这一帧结束了
  • 使用特殊的开始、结束标记,一见标记就知道边界
  • 由物理层约定固定的节奏或间隔

  第二种方法有个隐患:如果那段“特殊标记”恰好出现在内容里,接收方会误以为提前结束了。于是还需要一套转义规则,让内容里出现的标记能和使用作边界的那一个区分开。这有点像写信时,如果想在正文里引用“此致敬礼”这四个字,得想办法让人知道它只是引用,而不是真的要结束。

划对边界不等于内容正确

  有了帧,接收方就能把一次传输当作一个单位来处理:先识别边界,再检查内容,最后交给上层。

  但这里要分清两件事:边界正确,不代表内容就正确。 信号误判仍可能在途中悄悄改变某一位,而我们刚刚划出来的边界,也许恰好围住了一段已经出错的数据。边界管的是“从哪里到哪里”,内容对不对是另一回事。

  所以下一步自然是:接收方怎样发现内容被改坏了?

思考题 1

若长度字段本身被噪声改坏,接收方可能发生什么?

思考题 2

用“长度字段”和用“特殊标记”来划边界,各有什么优缺点?

小结

知识点

  • 帧为连续比特流划出消息边界
  • 边界可用长度、标记或物理层约定表示
  • 边界规则也需要防止被内容或错误混淆

参考资料

  1. Wikipedia(zh):数据帧:链路层承载数据的基本单位
  2. Wikipedia(zh):帧同步:在比特流中识别帧的边界

思考题答案(仅供参考)

思考题 1

  它可能过早结束、把下一帧的一部分读进来,或者一直在等待一个根本不会到来的长度。边界一旦错位,后面读到的东西可能全部错位,所以长度字段本身通常也需要保护。

思考题 2

  长度字段实现简单、不必担心标记冲突,但长度字段一旦被改坏,后果可能很严重。特殊标记便于在流中即时识别边界,却需要处理“内容里也出现标记”的情况,通常要配合转义。两者各有取舍,实际协议会按需要选择或结合使用。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪