计算机网络:数据链路层 - 点对点协议PPP

计算机网络:数据链路层 - 点对点协议PPP

    • PPP协议的帧格式
    • 透明传输
      • 字节填充法
      • 零比特填充法
    • 差错检测
      • 循环冗余校验


对于点对点链路,PPP协议是目前使用最广泛的数据链路层协议。比如说,当用户想要接入互联网,就需要通过因特网服务提供者ISP:
在这里插入图片描述
这些 ISP 已经从英特网管理机构申请到了一批 IP 地址,用户计算机只有获取到 ISP 所分配的合法 IP 地址后,才能成为因特网上的主机。而用户计算机与 ISP 之间进行通信时,所使用的数据链路层协议就是 PPP 协议。另外,点对点协议 PPP 也广泛应用于广域网路由器之间的专用线路。

PPP协议的帧格式

PPP协议的帧格式如下:

在这里插入图片描述
以上帧格式中,各区域功能如下:

F:出现于整个帧的首尾,都是标志字段,也就是PPP帧的定界符

帧定界符用于帮助接受方区分一个帧,这个标志字段规定为十六进制的0x7E,在ASCII码表中代表字符'~'

A:地址字段,没有实际意义
C:控制字段,没有实际意义

在设计PPP协议之初,考虑以后再对这两个字段的值进行其他定义,但至今也没有给出,因此这两个字段并不携带什么信息。其中A被规定为十六进制的0xFFC被规定为十六进制的0x03

协议:指明信息部分的类别

上图中,网络层把数据段交给数据链路层封装成帧,而协议这个字段的作用就是用于指明网络层传来的数据的种类。该字段占两个字节,当协议字段为十六进制0x0021,PPP中的信息字段就是IP数据报;当协议字段为十六进制0xC021,PPP中的信息字段就是LCP分组;当协议字段为十六进制0x8021,PPP中的信息字段就是NCP分组

FCS:用于差错检测

此处使用的时CRC循环冗余校验,这个在博客后文会讲解。

信息部分:即上层传递下来的,被封装成帧的数据

这个信息字段的长度不是固定的,但是如果信息字段太长,就会导致分组的效率变低,因此规定信息字段的长度不超过1500 byte

数据链路层的三大问题在于:封装成帧透明传输差错检测

现在我们已经了解了PPP协议是如何封装成帧的,接下来我们再来看看PPP协议是如何完成透明传输的。


透明传输

字节填充法

当PPP使用异步传输时,以字节为单位传输数据,采用字节填充法来实现透明传输,字节填充法采用转义字符实现对数据段中的0x7E的转义。
在这里插入图片描述
比如上图中,如果我们只考虑两个帧定界符,不考虑地址字段控制字段FCS。帧定界符的十六进制为0x7E,但是如果数据段中也出现了0x7E,这该怎么办?

这就会导致一个问题,那就是对帧的拆分错误,比如上图中,第一个粉色的0x7E是帧开始符,最后一个粉色的0x7E是帧结束符。但是数据段中还有三个0x7E,因此接收方就有可能把第一个粉色的符号当作帧的开始,而第二个绿色的符号当作帧的结束。这就会造成错误的帧划分,以及错误的数据接收。因此我们要对数据段中的0x7E数据段进行特殊处理,让接收端可以区别数据段中的0x7E帧定界符

处理方式为字节填充,规则如下:

在这里插入图片描述

当在数据段中遇到0x7E,先将0x7E的第五个比特位取反变成0x5E,再在其前面插入0x7D

在数据段中遇到0x7E,就把0x7E第五位取反,为0x5E,然后再在其前面插入一个0x7D。这样只要接收方在读取数据的时候,只要遇到了0x7D这个转义字符,就把这个转义字符丢弃,再将其后一位字节的第五位取反,就得到了原先的数据。

但是我们还有一个问题,如下:

在这里插入图片描述

如果原本的数据段中就有转义字符0x7D,那么接收方又要如何识别这是一段数据,而不是一个转义字符呢?

当在数据段中遇到0x7D,先将0x7D的第五个比特位取反变成0x5E,再在其前面插入0x7D

在这里插入图片描述
用和之前相同规则,当接收方遇到0x7D,就把0x7D丢弃,然后把后面的0x5E的第五位取反,得到原始数据。

另外的,PPP协议对数据段还有额外的处理,在所有字符中,还有一些控制字符,即ASCII码表中的0 - 32号字符,以及第127号字符。这些字符才数据段中也要处理:

当在数据段中遇到控制字符,将该字符的第五个比特位取反,再在其前面插入0x7D

和之前一模一样的方法,不再赘述了。

字节填充汇总如下:

一旦遇到0x7E帧定界符,0x7D转义符,以及控制字符,就将其第五位取反,再在其前面插入一个0x7D转义

接收方受到数据后,只要遇到0x7D转义符,就把该符号丢弃,然后将其后一个字节的数据,第五位取反


零比特填充法

当PPP使用同步传输时,以比特为单位传输数据,采用零比特填充法来实现透明传输。

零比特填充法规则如下:

在这里插入图片描述

当在数据段中遇到连续的五个1,就在其后面插入一个0

PPP协议中,帧定界符是0x7E,转为2进制就是01111110,其中出现了连续的六个1。为了保证数据部分中的数据不会被判断为定界符,于是只要数据段中出现连续的五个1就插入一个0,这样就只有帧定界符中会出现连续的六个1

当接收方接收时,只需要在遇到五个1时,看其后面的一位,如果第六位为1,说明这是帧定界符。如果第六位为0,说明这个0是插入的,把它删除后还原出原始数据。


差错检测

再来看差错检测,发送方将封装好的帧通过物理层发送到传输媒体。帧在传输过程中遭遇干扰后,可能会出现误码,也就是比特 0 可能变成了比特 1,反之亦然

在一段时间内,传输错误的比特占所传输比特总数的比率,称为误码率。

但是接收方主机如何判断帧在传输过程中是否出现了误码呢?

这可以通过检错码来发现。发送方在发送帧之前基于待发送的数据和检错算法计算出检错码,并将其封装在帧尾。接收方主机收到帧后,通过检错码和检错算法就可以判断出帧在传输过程中是否出现了误码

循环冗余校验

在PPP协议中,使用了循环冗余校验 CRC 的检错技术。

在这里插入图片描述
假定发送端发送的原始数据为k个比特,对原始数据进行CRC运算,产生了n位冗余码FCS,把n位冗余码FCS放入帧的末尾一起发送出去。

那么我们现在就来讲解一下这个冗余码FCS是如何计算的:

  1. 在原始k位数据后面加n0
  2. 用指定的n + 1位除数p,对这个k + n位的数据段做模2除法
  3. 最后得到的n位除数就是冗余码FCS,用冗余码FCS替换最后的n0

假设我们现在的原始数据为101001,约定的除数p1101

在这里插入图片描述

除数p为4位数,那么n就是4 - 1 = 3位,因此在101001后面添上3位0:

在这里插入图片描述

现在就可以开始进行模2除法了:

在这里插入图片描述

所谓模2除法,就是每次进行相除操作时,上下按位异或,比如以上式子中10101101按位异或就是0111,在后面补一位0就是1110。以此类推,一直计算下去:

在这里插入图片描述
由于我们的除数pn + 1位,所以最后的余数一定是小于等于n位的,如果不够n位就在前面补0,补到n位。然后把这n位除数替换掉原数据中的n位0,得到101001 001

101001 001这一段数据中,101001是原始的数据, 001就是冗余码FCS

一开始我们拿p除以101001 000,余数为001。我们把001补上去后,数据变成了101001 001,那么p除以101001 001就应该是0。因此如果接收端用p除以k + n位数据等于0,就说明数据没有出问题,是正常的。但是如果结构非0,说明有比特位出现了差错,那么接收端就可以知道传输出问题,进行后续操作了。

要注意的是,这个除数p是一开始双方就约定好的,因此双方都是知道拿p去除以这个数据段。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/513482.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高分卫星助力台湾省花莲县地震应急救援

4月3日7时58分,在台湾省花莲县海域(北纬23.81度,东经121.74度)发生7.3级地震,震源深度12公里。接中国地震局地震预测研究所应急需求,国家航天局对地观测与数据中心(以下简称“中心”&#xff09…

Kubernetes探索-Pod面试

本篇及此系列文章只针对面试相关问题做了简单总结,后续会出比较详细的系列文章.... 1. 创建Pod的底层逻辑 1)创建单个Pod时:组件间的交互流程和描述如下图,该过程中controller-manager组件不工作。 流程描述 ① 客户端提交创建请…

揭开AI编程语言Mojo比Pyhon快6.8万倍的5个秘密!

最近(2024年3月29日),号称比Python快6.8万倍的Mojo编程语言开源啦!6.8万倍?你敢相信这个数字是真的吗?不过,就连Mojo官网都把这个结果贴了出来(见下图),这就很…

怎样在Linux搭建NTP服务器

搭建 NTP(Network Time Protocol)服务器可以帮助你在局域网内提供时间同步服务,让网络中的设备都使用统一的时间。以下是在 Linux 系统上搭建 NTP 服务器的基本步骤: 安装 NTP 服务器软件: 在终端中执行以下命令安装 N…

Webpack部署本地服务器

Webpack部署本地服务器 目录 Webpack部署本地服务器目的认识模块热替换(HMR)什么是 HMRHMR 通过如下几种方式, 来提高开发的速度如何使用 HMRhost 配置 目的 完成自动编译 常用方式: webpack-dev-server webpack-dev-server 是一个用于开发环境的 Web 服…

Class类

1. Class类的理解 针对于编写好的 .java 源文件进行编译(使用 javac.exe),会生成一个或多个 .class 字节码文件。接着,我们使用 java.exe 命令对指定的 .class 文件进行解释运行。这个解释运行的过程中,我们需要将 .class 字节码文件加载到内…

本地储存、jQuery

文章目录 1. 本地储存1. window.sessionStorage2. window.localStorage案例:记住用户名 2. jQuery入门jQuery 的概念jQuery 的入口函数jQuery 的顶级对象 $jQuery 对象和 DOM 对象 3. jQuery 常用API1. jQuery 选择器1.基础选择器2.层级选择器隐式迭代(重…

C++(set和map详解,包含常用函数的分析)

set set是关联性容器 set的底层是在极端情况下都不会退化成单只的红黑树,也就是平衡树,本质是二叉搜索树. set的性质:set的key是不允许被修改的 使用set需要包含头文件 set<int> s;s.insert(1);s.insert(1);s.insert(1);s.insert(1);s.insert(2);s.insert(56);s.inser…

Vue.js---------Vue基础

能够说出Vue的概念和作用能够使用vue/cli脚手架工程化开发能够熟练Vue指令 一.vue基本概念 1.学习vue Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 渐进…

2024 ccfcsp认证打卡 2022 09 01 如此编码

2022 09 01 如此编码 题解1题解2 题解1 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt(); // 天数int m sc.nextInt(); // 科目数int[] b new int[n 1]; // 存放结果的数…

笔记: JavaSE day15 笔记

第十五天课堂笔记 数组 可变长参数★★★ 方法 : 返回值类型 方法名(参数类型 参数名 , 参数类型 … 可变长参数名){}方法体 : 变长参数 相当于一个数组一个数组最多只能有一个可变长参数, 并放到列表的最后parameter : 方法参数 数组相关算法★★ 冒泡排序 由小到大: 从前…

Paddle实现人脸对比

人脸对比 人脸对比&#xff0c;顾名思义&#xff0c;就是对比两个人脸的相似度。本文将用Paddle实现这一功能。 PS&#xff1a;作者肝了整整3天才稍微搞明白实现方法 数据集准备 这里使用百度AI Studio的开源数据集&#xff1a; 人脸数据_数据集-飞桨AI Studio星河社区 (b…

【React】vite + react 项目,配置项目路径别名 @

vite react 项目&#xff0c;配置项目路径别名 1 安装 types/node2 在 vite.config.ts 中添加配置&#xff1a;3 配置路径别名的提示 使用 vite 开发 react 项目时&#xff0c;可以通过一下步骤配置路径别名&#xff1a; 1 安装 types/node npm i -D types/node2 在 vite.con…

Lumos学习王佩丰Excel第一讲:认识Excel

最近发现自己在操作excel的一些特殊功能时会有些不顺手&#xff0c;所以索性找了一个比较全的教程&#xff08;王佩丰excel24讲&#xff09;拿来学习&#xff0c;刚好形成文档笔记&#xff0c;分享给有需要但没有时间看视频的朋友们。整体笔记以王老师授课的知识点去记录&#…

Spring拓展点之SmartLifecycle如何感知容器启动和关闭

Spring为我们提供了拓展点感知容器的启动与关闭&#xff0c;从而使我们可以在容器启动或者关闭之时进行定制的操作。Spring提供了Lifecycle上层接口&#xff0c;这个接口只有两个方法start和stop两个方法&#xff0c;但是这个接口并不是直接提供给开发者做拓展点&#xff0c;而…

算法基础--递推

&#x1f600;前言 递推算法在计算机科学中扮演着重要的角色。通过递推&#xff0c;我们可以根据已知的初始条件&#xff0c;通过一定的规则推导出后续的结果&#xff0c;从而解决各种实际问题。本文将介绍递推算法的基础知识&#xff0c;并通过一些入门例题来帮助读者更好地理…

力扣 392. 判断子序列

题目来源&#xff1a;https://leetcode.cn/problems/is-subsequence/description/ C题解1&#xff1a;在t中按顺序一个一个寻找s的元素。 class Solution { public:bool isSubsequence(string s, string t) {bool flg false;int m s.size(), n t.size();if(m 0) return tr…

vue项目打包优化之-productionSourceMap设置

productionSourceMap 是一个用于配置生产环境下是否生成 source map 文件的选项。在 webpack 中&#xff0c;source map 文件是一种映射关系文件&#xff0c;可以将编译后的代码映射回原始源代码&#xff0c;方便开发者在调试时定位问题。 在生产环境中&#xff0c;通常不建议暴…

线程池小项目【Linux C/C++】(踩坑分享)

目录 前提知识&#xff1a; 一&#xff0c;线程池意义 二&#xff0c;实现流程 阶段一&#xff0c;搭建基本框架 1. 利用linux第三方库&#xff0c;将pthread_creat线程接口封装 2. 实现基本主类ThreadPool基本结构 阶段二&#xff0c;完善多线程安全 1. 日志信息打印…

大模型放进推荐系统怎么玩?微软亚研全面总结

在大模型时代&#xff0c;似乎任何自然语言处理任务在大模型加持下都完成了一轮升级改造&#xff0c;展现出前所未有的高效与效果。语义理解、情感分析还是文本生成这些常规任务自然是不必说&#xff0c;但也有一些任务比如推荐&#xff0c;简单粗暴的训练LLMs的思路并非明智之…