计算机网络——数据链路层-点对点协议(组成部分、PPP帧格式、透明传输、差错检测、工作状态)

本文主要是介绍计算机网络——数据链路层-点对点协议(组成部分、PPP帧格式、透明传输、差错检测、工作状态),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

介绍

组成部分 

PPP帧格式

透明传输

字节填充法 

比特填充法 

差错检测

工作状态


本篇我们介绍点对点协议PPP

介绍

点对点协议PPPPoint-to-Point Protocol)是目前使用最广泛的点对点数据链路层协议。

请大家想想看:一般的英特网用户,是如何接入到英特网的呢?

通常都是要通过连接到某个英特网服务提供者ISP(例如中国电信、中国联通、中国移动
这三大运营商)才能接入英特网。这些ISP已经从英特网管理机构申请到了一批IP地址,用户计算机只有获取到ISP所分配的合法IP地址后,才能成为英特网上的主机。

用户计算机与SP进行通信时所使用的数据链路层协议,通常就是PPP协议 。

这里需要说明的是:

在1999年公布的在以太网上运行的PPP协议,即PPP over Ethernet。简称为PPPoE。

它使得ISP可以通过DSL、电路调制解调器、以太网等宽带接入技术,以以太网接口的形式为用户提供接入服务。

另外,点对点协议PPP也广泛应用于广域网路由器之间的专用线路 。

PPP协议是因特网工程任务组IETF在1992年制定的。经过1993年和1994年的修订,现在的PPP协议已成为因特网的正式标准[RFC161,RFC1662]。

我们可以在ITF官方网站的相关页面,搜索并查看PPP协议的相关RFC文档。

小结 

  • 点对点协议PPPPoint-to-Point Protocol)是目前使用最广泛的点对点数据链路层协议。
  • PPP协议是因特网工程任务组IETF在1992年制定的。经过1993年和1994年的修订,现在的PPP协议已成为因特网的正式标准[RFC161,RFC1662]。

组成部分 

PPP协议为在点对点链路传输各种协议数据报提供了一个标准方法,主要由以下三部分构成:

  1. 对各种协议数据报的封装方法,也就是之前文章中介绍的封装成帧
  2. 链路控制协议LCP,用于建立、配置以及测试数据链路的连接
  3. 一套网络控制协议NCPs,其中的每一个协议支持不同的网络层协议

从网络体系结构的角度看,PPP是数据链路层的协议;它将上层交付下来的协议数据单元封装成PPP帧,为了支持不同的网络层协议,PPP协议包含了一套网络控制协议NCPs,其中的每一个协议支持不同的网络层协议。(例如TCP/IP中的IP、Novell NetWare网络操作系统中的IPX、Apple公司的AppleTalk等)。链路控制协议LCP用于建立、配置以及测试数据链路的连接PPP协议
能够在多种类型的点对点链路上运行(例如面向字节的异步链路、面向比特的同步链路)。

PPP帧格式

接下来我们来看看PPP协议的帧格式:

帧首部由四个字段构成,帧尾部由两个字段构成 ,各字段的长度以及帧的数据部分的最大长度如下图所示:

帧首和帧尾部中的标志字段(F,Flag)是PPP帧的定界符,取值为16进制的7E;

帧首部中的地址字段(A,Address)取值为十六进制的FF;

控制字段(C,Control)取值为十六进制的03(最初曾考虑以后再对A和C这两个字段的值进行其他定义,但至今也没有给出,可见这两个字段实际上并没有携带PPP针的信息);

帧首部中的协议字段(P,Protocol)指明了帧的数据部分应送交哪个协议处理。当协议字段取值为16进制的0021时,PPP帧的数据部分就是IP数据报、当协议字段取值为十六进制的C021时,PPP帧的数据部分就是链路控制协议LCP的分组、当协议字段取值为16进制的8021时,PPP帧的数据部分就是网络控制协议NCP的分组;

帧尾部中的帧检验序列FCS字段(Frame Check Sequence),其值是使用循环冗余校验CRC计算出的,校验位用于检查PPP帧是否存在误码。

透明传输

接下来我们来看看PPP协议是如何解决透明传输问题的。

当PPP帧的数据部分出现帧首和帧尾中的标志字段时,如果不采取措施,则会造成接收方对PPP帧是否结束的误判;因为标志字段是PPP帧的定界符,取值为十六进制的7E,也就是二进制的0111 1110。

PPP协议实现透明传输的方法取决于所使用的链路类型,如果是面向字节的异步链路,则采用字节填充法,也就是插入‘转义字符’。

如果是面向比特的同步电路,则采用比特填充法,也就是插入‘比特0’。

字节填充法 

举例说明字节填充法,也就是以字节7E作为PPP帧的定界符,以字节为单位来讨论问题。

发送方对PPP帧数据部分的处理应为:

将出现的每一个7E字节转变成两字节序列7D、5E。如图所示:

这相当于在7E字节前插入了转义字节7D,并将7E字节减去16进制的20;

将出现的每一个7D字节转变成两字节序列7D、5D。如图所示:

在出现的每一个ASCII码控制字符前插入一个7D字节,同时将该字符的编码加上16进制的20。例如图中所示:

对于PPT帧的接收方,只要进行反变化即可恢复出原来的PPT帧的数据部分。

比特填充法 

再来举例说明比特填充法,也就是以0111 1110作为PPP帧的定界符,以比特为单位来讨论问题。

假设PPP帧的数据部分如下图所示:

其中包含了两个帧定界符。

来看发送方对PPP帧数据部分的处理:

对帧的数据部分进行扫描(一般由硬件实现),只要发现5个连续的比特1,则立即填充一个比特0,如下图所示:

再来看接收方对PPP帧数据部分的处理:

对帧的数据部分进行扫描(一般由硬件实现),只要发现5个连续的比特1,就把其后的一个比特0删除。

差错检测

接下来我们来看看PPP协议是如何进行差错检测的。

PPP帧的尾部包含有一个两字节的帧检验序列FCS字段,使用循环冗余校验CRC来计算该字段的取值。

采用的生成多项式如下所示:

RFC1662文档的附录部分给出了FCS的计算方法的C语言实现,为了减少对CPU的占用
采用查表法来实现。

FCS的计算范围如下图所示:

接收方每收到一个PPP帧,就进行CRC检验。若CRC检验正确,就收下这个帧;反之就丢弃这个帧。使用PPP的数据链路层向上不提供可靠传输服务

工作状态

PPP链路的开始和结束状态都是静止状态,这时并不存在物理层的连接。

  • 当检测到调制解调器的载波信号,并建立物理层连接后,PPP就进入链路的建立状态,这时列入控制协议LCP开始协商一些配置选项。
  1. 若协商成功则进入鉴别状态
  2. 若协商失败,则退回到静止状态

所协商的配置选项包括最大帧长、鉴别协议等,可以不使用鉴别、也可以使用口令鉴别协议PAP或挑战握手鉴别协议CHAP。

  • 若通讯双方无需鉴别或鉴别身份成功,则进入网络状态;若鉴别失败则进入终止状态。

进入网络状态后进行NCP配置,PPP链路的两端通过相互交换网络层特定的NCP分组来进行NCP配置。如果在PPP链路上运行的是IP协议,则使用IP控制协议IPCP来对PPP链路的每一端配置IP模块(例如分配IP地址)。

  • 配置完成后就进入打开状态,只要链路处于打开状态就可以进行数据通信。
  • 当出现故障或链路的一端发出终止请求时,就进入终止状态。
  • 当载波停止后则回到静止状态。

END


学习自:湖科大——计算机网络微课堂

这篇关于计算机网络——数据链路层-点对点协议(组成部分、PPP帧格式、透明传输、差错检测、工作状态)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/532605

相关文章

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核