查看数据链路级标准,例如 PPP通用帧格式 http://www.tcpipguide.com/free/t_PPPGeneralFrameFormat.htm or Ethernet http://en.wikipedia.org/wiki/Ethernet_II_framing,尚不清楚如果校验和无效会发生什么。协议如何知道下一帧从哪里开始?
它是否只扫描下一次出现的“标志”(在 PPP 的情况下)?如果是这样,如果数据包有效负载恰好包含“标志”本身,会发生什么?我的观点是,无论使用数据包成帧还是“长度”字段,目前尚不清楚如何从无效数据包中恢复,其中“长度”字段可能已损坏,或者“成帧”字节可能恰好是数据包的一部分。数据包有效负载。
UPDATE:我通过查找“GFP CRC-based framing”找到了我正在寻找的内容(严格来说这并不是我所问的内容)。根据
GFP 接收器通过三态过程与 GFP 帧边界同步。接收器最初位于狩猎状态它一次检查四个字节,看看前两个字节计算出的 CRC 是否等于接下来两个字节的内容。如果没有找到匹配,则 GFP 向前移动一个字节,因为 GFP 假定物理层给出的八位字节同步传输。当接收者找到匹配时,它会移动到预同步状态。在此中间状态下,接收器使用暂定 PLI(有效负载长度指示符)字段来确定下一帧边界的位置。如果目标数N成功的帧检测已经实现,然后接收器进入同步状态。同步状态是正常状态,其中接收器检查每个 PLI,使用 cHEC(核心标头错误检查)对其进行验证,提取有效负载,然后继续下一帧。
简而言之,每个数据包都以“length”和“CRC(length)”开头。不需要转义任何字符,并且数据包长度提前已知。
数据包成帧似乎有两种主要方法:
- 编码方案(位/字节填充、曼彻斯特编码、4b5b、8b10b 等)
- 未修改的数据 + 校验和 (GFP)
前者更安全,后者更高效。如果有效负载恰好包含有效数据包并且线路损坏导致后续字节包含“帧开始”字节序列,则两者都容易出错,但这听起来极不可能。很难找到 GFP 稳健性的确切数字,但许多现代协议似乎都在使用它,因此人们可以假设它们知道自己在做什么。
PPP 和以太网都有成帧机制,即将比特流分解为帧,这样,如果接收器失去了对内容的跟踪,它可以在下一帧开始时拾取。它们位于协议栈的底部;协议的所有其他细节都建立在帧的思想之上。特别是前导码、LCP、FCS级别较高,not用于控制取景。
PPP 通过串行链路(如拨号)使用类HDLC帧 https://www.rfc-editor.org/rfc/rfc1662。字节值 0x7e(称为标志序列)表示帧的开始。该帧持续到下一个标志字节。帧内容中任何出现的标志字节都会被转义。转义是通过写入 0x7d(称为控制转义字节)来完成的,后跟要转义的字节与 0x20 进行异或。标志序列转义为0x5e;控制转义本身也必须转义到 0x5d。如果其他值的存在会扰乱调制解调器,则也可以转义它们。因此,如果接收器失去同步,它只能读取并丢弃字节,直到看到 0x7e,此时它知道自己再次处于帧的开头。然后,帧的内容被结构化,包含一些奇怪的小字段,这些字段并不真正重要,但从早期的 IBM 协议中保留下来,以及 PPP 数据包(称为协议数据单元,PDU)以及帧检查序列(FCS)。
以太网使用逻辑上类似的方法,具有可识别为帧开始和结束标记而不是数据的符号,但它没有保留字节加上转义机制,而是使用能够表达不同的特殊控制符号的编码方案来自数据字节 - 有点像使用标点符号来分解字母序列。所使用的系统细节随速度而变化。
标准 (10 Mb/s) 以太网使用称为曼彻斯特编码 http://en.wikipedia.org/wiki/Manchester_code,其中要传输的每个位都表示为线路上的两个连续电平,这样每个位的电平之间总是存在转换,这有助于接收器保持同步。帧边界是通过违反编码规则来指示的,导致有一点没有过渡(我几年前在一本书上读过这个,但在网上找不到引用 - 我对此可能是错的)。实际上,该系统将二进制代码扩展为三个符号 - 0、1 和违规。
快速(100 Mb/s)以太网使用不同的编码方案,基于5b/4b 代码 http://en.wikipedia.org/wiki/4B5B,其中四个数据位组(nybbles)在线路上表示为五个位组,并直接传输,无需曼彻斯特方案。扩展到五位可以选择十六种必要的模式来满足频繁电平转换的要求,再次帮助接收器保持同步。然而,仍然有空间选择一些额外的符号,这些符号可以被传输,但不对应于数据值,实际上,将半字节集扩展到二十四个符号——半字节0到F,以及称为Q、I的符号、J、K、T、R、S 和 H。以太网使用 JK 对来标记帧开始,使用 TR 来标记帧结束。
千兆位以太网与快速以太网类似,但具有不同的编码方案 - 光纤版本使用8b/10b 代码 http://en.wikipedia.org/wiki/8b/10b_encoding而不是 5b/4b 代码,双绞线版本使用一些非常复杂的五进制代码排列,我不太理解。两种方法产生相同的结果,即能够传输数据字节或一小组附加特殊符号之一,并且这些特殊符号用于成帧。
在这个基本帧结构之上,有一个固定的前导码,后面跟着一个帧定界符,以及一些不同的无意义的控制字段(你好,LLC/SNAP!)。这些字段的有效性可用于验证框架,但它们不能用于自行定义框架。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)