计算机网络:数据链路层 - 封装成帧 透明传输 差错检测
计算机网络:数据链路层 - 封装成帧 & 透明传输 & 差错检测
- 数据链路层概述
- 封装成帧
- 透明传输
- 差错检测
数据链路层概述

从数据链路层来看,主机 H1 到 H2 的通信可以看成是在四段不同的链路上的通信组成的,所谓链路就是从一个节点到相邻节点的一段物理线路,中间没有任何其他的交换节点。要在链路上传输数据,仅有链路还不够,还需要一些通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。

在数据链路层上传输的数据包又称为帧,也就是说数据链路层以帧为单位传输和处理数据。
接下来我们介绍数据链路层的三个重要问题,他们是封装成帧、透明传输、差错检测。
封装成帧
所谓封装成帧,就是指数据链路层给上层交付下来的协议数据单元添加帧头和帧尾,使之成为帧,例如下图所示:

在帧头和帧尾中包含有重要的控制信息。
接收方的数据链路层如何从物理层交付的比特流中提取出一个个的帧呢?实际上帧头和帧尾的作用之一就是帧定界。若忽略与帧定界无关的控制信息,帧可以如下表示:

帧定界一般用特殊的控制字段:
SOH:帧开始符,16进制表示为01H
EOT:帧结束符,16进制表示为04H
不过要注意,不是所有的帧都使用SOH和EOF。
假设发送端由于故障,某一个帧发送到一半停止,然后重新发送:

由于帧定界符的存在,第一个SOH没有匹配的EOT,接收方就知道这不是一个完整的帧,于是把它丢弃。第二次再收到一个同时带有SOH和EOF的帧,才算收到一个完整的帧。
现在考虑这样一个问题:如果一个分组的数据段太短,那么首部和尾部的占比就很大,传输效率低;如果一个分组的数据部分太长,此时就削弱了分组的优点。
因此,每一种数据链路层协议都规定了能传输的数据部分上限,及最大传送单元MTU 。

一般来说,MTU的默认值是1500 byte,也就是说网络层交给数据链路层的数据部分,不能超过1500 byte。
透明传输
接下来我们介绍透明传输的问题。透明传输是指数据链路层对上层交付的传输数据并没有任何限制,就好像数据链路层不存在一样。
我们来举例说明。这是发送方数据链路层收到其上层交付的协议数据单元,给其添加帧头SOH和帧尾EOT,使其成为帧:

但是我们的数据部分中也存在和EOT一样的数据段,那么就会发送以下情况:

数据段中的EOT被错误的认为是一个帧尾,此时把前面一段误以为是一个帧,后面的的数据因为缺少SOH而被丢弃。
也就是说,数据链路层对上层交付的协议数据单元有限制,其内容不能包含帧定界符。那么此时数据链路层就不能算作透明传输,因为网络层传输的数据会受到数据链路层的影响,不能传输SOH,EOT这样的字段,不能当作数据链路层不存在。
实际上,各种数据链路层协议一定会想办法来解决这个问题。
规则如下:
在发送帧之前对帧的数据部分进行扫描,每出现一个帧定界符
EOT或SOH,就在其前面插入一个转义字符ESC

接收方数据链路层在物理层交付的比特流中提取帧,遇到第一个帧定界符SOH时,认为这是帧的开始。当遇到转移字符ESC时,就知道其后面的一字节内容虽然是SOH或者EOT,但它是数据而不是定界符。剔除转移字符后,将其后面的内容作为数据继续提取。
大家再来思考一下这种情况。在上层交付给数据链路层的协议数据单元中,既包含了帧定界符,又包含了转义字符ESC:

这应该怎么处理呢?方法仍然是在发送帧之前对帧的数据部分进行扫描,每出现一个帧定界符或转义字符就在其前面插入一个转义字符:

当接收方遇到ESCESC这样的数据后,就知道第一个ESC是转义字符,第二个ESC是数据,于是剔除第一个ESC,保留第二个ESC。
需要说明的是,转义字符是一种特殊的控制字符,其长度为一个字节,十进制值为27,而并不是 ESC这三个字符。
以上我们讲述的方式叫做字节填充,在PPP协议中还存在一中比特填充的方式来进行透明传输,这个在PPP协议的博客中讲解。
差错检测
再来看差错检测,发送方将封装好的帧通过物理层发送到传输媒体。帧在传输过程中遭遇干扰后,可能会出现误码,也就是比特 0 可能变成了比特 1,反之亦然。
在一段时间内,传输错误的比特占所传输比特总数的比率,称为误码率。
但是接收方主机如何判断帧在传输过程中是否出现了误码呢?
这可以通过检错码来发现。发送方在发送帧之前基于待发送的数据和检错算法计算出检错码,并将其封装在帧尾。接收方主机收到帧后,通过检错码和检错算法就可以判断出帧在传输过程中是否出现了误码。
在数据链路层传输的帧中,广泛使用了循环冗余校验 CRC 的检错技术。

假定发送端发送的原始数据为k个比特,对原始数据进行CRC运算,产生了n位冗余码FCS,把n位冗余码FCS放入帧的末尾一起发送出去。
那么我们现在就来讲解一下这个冗余码FCS是如何计算的:
- 在原始
k位数据后面加n个0- 用指定的
n + 1位除数p,对这个k + n位的数据段做模2除法- 最后得到的
n位除数就是冗余码FCS,用冗余码FCS替换最后的n位0
假设我们现在的原始数据为101001,约定的除数p为1101:

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

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

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

由于我们的除数p是n + 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去除以这个数据段。
相关文章:
计算机网络:数据链路层 - 封装成帧 透明传输 差错检测
计算机网络:数据链路层 - 封装成帧 & 透明传输 & 差错检测 数据链路层概述封装成帧透明传输差错检测 数据链路层概述 从数据链路层来看,主机 H1 到 H2 的通信可以看成是在四段不同的链路上的通信组成的,所谓链路就是从一个节点到相邻…...
Open3D (C++) 计算点云的特征值特征向量
目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 针对整个点云 P = { p i } i...
Java | Leetcode Java题解之第8题字符串转换整数atoi
题目: 题解: class Solution {public int myAtoi(String str) {Automaton automaton new Automaton();int length str.length();for (int i 0; i < length; i) {automaton.get(str.charAt(i));}return (int) (automaton.sign * automaton.ans);} …...
BL200耦合器数据采集模块
BL200耦合器数据采集模块是一个数据采集和控制系统,基于强大的32 位ARM926EJ-S™ 微处理器设计,采用Linux操作系统,支持Modbus TCP协议,可以快速接入现场PLC、MES、Ignition和SCADA以及ERP系统,同时也能快速连接到AWS云…...
基于Uni-app的体育场馆预约系统的设计与实现
个人介绍 hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的…...
1.Spring Boot框架整合
Spring Boot项目创建(约定大于配置) 2.1.3.RELEASE版本示例 idea创建 从官网下载(https://start.spring.io/)单元测试默认依赖不对时,直接删除即可 Web支持(SpringMVC) <dependency>&…...
如何在 Debian VPS 上添加、删除和授予用户 sudo 权限
简介 当你启动一个新的服务器时,会创建一个名为 root 的默认账户。这个用户拥有完全的系统访问权限,应该仅用于管理任务。作为 root 用户,你基本上可以对系统做任何操作,这很强大,但也极其危险。Linux 没有“撤销”按…...
openlayers 入门教程(九):overlay 篇
还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,ech…...
基于Python的高考志愿辅助填报系统
基于Python的高考志愿辅助填报系统是一个利用数据分析和机器学习技术帮助高考生进行志愿填报决策的工具。该系统可以根据考生的分数、兴趣、专业偏好、历史录取数据等因素,为考生提供科学合理的志愿填报建议。以下是设计这样一个系统的步骤和要点。 ### 1. 数据收集…...
使用CMake搭建简单的Qt程序
目录结构 代码 CMakeLists.txt: cmake_minimum_required(VERSION 3.15)set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON)# set the project name project(xxx)# 设置Qt的路径 # 例如 E:/Qt/Qt/aaa/msvc2019_64 # aaa 为Qt的版本号 set(QT_PATH…...
Qt + VS2017 创建一个简单的图片加载应用程序
简介: 本文介绍了如何使用Qt创建一个简单的图片加载应用程序。该应用程序可以打开图片文件并在界面上显示选定的图片,并保存用户上次选择的图片路径。 1. 创建项目: 首先,在VS中创建一个新的Qt Widgets应用程序项目,并…...
Linux文件搜索工具(gnome-search-tool)
opensuse下安装: sudo zypper install gnome-search-tool 操作界面:...
c++20协程详解(三)
前言 前面两节我们已经能够实现一个可用的协程框架了。但我们一定还想更深入的了解协程,于是我们就想尝试下能不能co_await一个协程。下面会涉及到部分模板编程的知识,主要包括(模板偏特化,模板参数列表传值,模板函数…...
LLM--提示词Propmt的概念、作用及如何设计提示词
文章目录 1. 什么是提示词?2. 提示词的作用3. 如何设计提示词?3.1. 提供详细的信息3.2. 指定角色3.3. 使用分隔符和特殊符号3.4. 提供示例3.5. 少量示例的思维链(COT)模型3.6. 思维树(TOT)模型3.7. 自洽性 …...
59 使用 uqrcodejs 生成二维码
前言 这是一个最近的一个来自于朋友的需求, 然后做了一个 基于 uqrcodejs 来生成 二维码的一个 demo package.json 中增加以依赖 "uqrcodejs": "^4.0.7", 测试用例 <template><div class"hello"><canvas id"qrcode&qu…...
Leetcode 3097. Shortest Subarray With OR at Least K II
Leetcode 3097. Shortest Subarray With OR at Least K II 1. 解题思路2. 代码实现 题目链接:3097. Shortest Subarray With OR at Least K II 1. 解题思路 这一题是题目3095的一个进阶版本,但也就是增加了序列的复杂度而已,要求我们能够在…...
算法系列--递归,回溯,剪枝的综合应用(2)
💕"对相爱的人来说,对方的心意,才是最好的房子。"💕 作者:Lvzi 文章主要内容:算法系列–递归,回溯,剪枝的综合应用(2) 大家好,今天为大家带来的是算法系列--递归,回溯,剪枝的综合应用(2) 一.括号…...
Docker搭建LNMP环境实战(09):安装mariadb
1、编写mariadb部署配置文件 在文件夹:/mnt/hgfs/dockers/test_site/compose下创建文件:test_site_mariadb.yml,内容如下: version: "3.5" services:test_site_mariadb:container_name: test_site_mariadbimage: mari…...
基于Python的微博舆论分析,微博评论情感分析可视化系统,附源码
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
Flutter iOS上架指南
本文探讨了使用Flutter开发的iOS应用能否上架,以及上架的具体流程。苹果提供了App Store作为正式上架渠道,同时也有TestFlight供开发者进行内测。合规并通过审核后,Flutter应用可以顺利上架。但上架过程可能存在一些挑战,因此可能…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
