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

从数据链路层来看,主机 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应用可以顺利上架。但上架过程可能存在一些挑战,因此可能…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
