PPP 或以太网如何从错误中恢复?

2023-12-26

查看数据链路级标准,例如 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(使用前将#替换为@)

PPP 或以太网如何从错误中恢复? 的相关文章

随机推荐

  • JPA 和 Hibernate Cascade DELETE OneToMany 不起作用

    我一直在阅读一篇又一篇的文章 试图让级联删除与最新的 Spring Boot 版本中的 JPA Hibernate 一起使用 我读过您必须使用 Hibernate 特定的级联 但我读过您不需要 我读到它们只是不起作用 但它似乎是一个混合包
  • Android Studio导入项目错误

    我在网上下载了一些示例 Android 项目 导入 android studio 但不起作用 举个例子http developer android com training implementing navigation terior ht
  • JPA 2 Criteria API:为什么 isNull 在与 equal 结合使用时被忽略?

    我有以下实体类 继承自持久对象支持类 Entity public class AmbulanceDeactivation extends PersistentObjectSupport implements Serializable pri
  • Chrome 扩展 - 未捕获的 ReferenceError:$ 未定义

    我使用 chrome tabs API 在每次更新选项卡时运行脚本 该脚本在页面中搜索关键字 如果找到 它会提醒您 但如果没有 它会刷新页面 每当我测试扩展时 控制台都会告诉我 清单 json name keyword checker ve
  • 将 excel 时间导入 Pandas(带小数秒)

    我有一个包含时间列的 Excel 电子表格 xls 时间在 Excel 中显示为分钟 秒 十分之一秒 例如 50 59 2 50 59 4 原始数据包含小时 分钟 秒 十进制秒 当我将数据导入 pandas 时 我损失了十分之一秒 inda
  • Android 导航组件活动意图标志

    我已经创建了从片段到活动的导航操作 但我无法清除后堆栈 当我执行从片段到新活动的导航操作并按下后退按钮时 我将返回到上一个活动和上一个片段 我无法使用导航图设置意图标志来从返回堆栈中清除先前的活动
  • 从组件的“style”属性中获取 CSS 属性值

    我正在为一个库编写一个 React Native 组件 我希望用户能够使用style财产 就像React View和其他内置组件 但是 由于我的组件实际上是由一些嵌套视图组成的 因此我需要进行一些计算来确定要在组件上放置什么样式inner那
  • 使用帧检测标记的增强现实视频播放

    我想在使用网络摄像头检测到标记 HIRO 时播放视频 当我删除它时 它应该暂停 当检测到标记时 视频应该使用 A 框架播放 我已经编写了代码 但它不起作用 谁能帮我 我尝试了所有可能的方法 但它不起作用 所以任何人都可以发布代码或发送示例
  • C# 或 VB.NET - 迭代所有公共枚举

    我们的源代码中有一个通用组件 其中包含非常大的应用程序的所有枚举 大约 300 个 有没有什么方法可以使用 C 或 VB NET 来遍历所有这些 以便对每一个执行操作 问题如何迭代 net 类中的所有 公共字符串 属性 https stac
  • Azure 逻辑应用、SQL 更新行 v2

    我正在尝试添加一个额外的任务来在通过 sendgrid 发送电子邮件后更新 SQL Server 中的行 用于更新行的选项似乎缺少列名称和值 唯一可以添加的附加参数称为 原始输入 该参数不在 MS 文档中 完成可用字段并运行该进程 它可以正
  • 如何在无线设置中添加 return=true [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在做一个项目 但我卡住了 我想要的是启用 wifi 或互联网后 后退按钮 硬件按钮 应该让我回到SplitScreen xml不要关闭应
  • 使用 ndk-build 构建 android 共享库,无需 jni 文件夹

    仅当我的所有 src 都在 jni foler 中时 我才能使用 ndk build 构建一个 android 共享库 但是 我想使用 ndk build 构建一个共享库而不需要 jni 文件夹 因为我的项目没有java代码 那么我该怎么做
  • 字典为相同的键添加值

    我有一个字典列表 name Jay value 1 name roc value 9 name Jay value 7 name roc value 2 我希望它是 name Jay value 8 name roc value 11 我尝
  • 从Artifactory下载依赖项时npm错误403

    我正在尝试使用 Node js 项目运行作业 步骤之一是rtnpminstall它运行npm install命令 这rtnpminstall命令由 Jenkins 上的 Artifactory 插件运行 错误说 npm ERR code E
  • 如何在 Swift 中以编程方式将 HeaderView 从 nib 添加到 UiTableView

    好吧 我是一个使用 swift 语言的天真的 IOS 开发人员 我有一个显示酒店功能列表的表格视图 现在我想在表格视图中添加标题信息 其中包含酒店图像 酒店名称位于表格视图上方 以便标题信息也随着表格视图内容滚动 产品功能列表 问题是 带有
  • 如何在 Rust 中正确包装 C 函数指针? [复制]

    这个问题在这里已经有答案了 我有一个 C 结构体Foo带有函数指针 在我的 Rust 绑定中 我希望允许用户设置此函数指针 但我希望避免用户必须处理 FFI 类型 foo h struct Foo void internal uint8 t
  • NSTextView 的 insertText 方法在 OS X v10.11 中已弃用。替代品是什么?

    我在 AppKit API 参考中看到insertTextOS X v10 11 中已弃用该方法 我应该用什么来代替 文档说 void insertText id aString 该方法是用户输入文本的方法NSTextView 请参阅NSI
  • 对 UITextView 应用字数限制

    如何在 Objective C interface builder 中对 UITextView 应用字数限制 我已经搜索了一段时间 发现了字符数 但没有找到字数 有谁能给我指点一下吗 您可以只计算空格数并对其进行限制 这是一个 hack 但
  • 如何在 WP7 上挂钩硬件搜索按钮

    我有一个带有搜索页面的 WP7 应用程序 我更愿意挂钩硬件搜索按钮 而不是必须将搜索图标添加到菜单栏 有谁知道如何做到这一点 当前版本中的第三方应用程序无法使用硬件搜索按钮 请参考此线程已回答类似问题 https stackoverflow
  • PPP 或以太网如何从错误中恢复?

    查看数据链路级标准 例如 PPP通用帧格式 http www tcpipguide com free t PPPGeneralFrameFormat htm or Ethernet http en wikipedia org wiki Et