【计算机网络】 —— 数据链路层(壹)
文章目录
前言
一、概述
1. 基本概念
2. 数据链路层的三个主要问题
二、封装成帧
1. 概念
2. 帧头、帧尾的作用
3. 透明传输
4. 提高效率
三、差错检测
1. 概念
2. 奇偶校验
3. 循环冗余校验CRC
1. 步骤
2. 生成多项式
3. 例题
4. 总结
四、可靠传输
1. 基本概念:
2. 可靠传输的实现机制
1. 停止等待协议 SW
(1)否定分组NAK
(2)超时重传
(3)分组重复
(4)确认迟到
(5)SW协议的信道利用率
2. 回退N帧协议GBN
(1)无差错情况
(2)累积确认
(3)有差错情况
(4)发送窗口尺寸超过上限
(5)总结
3. 选择重传协议SR
(1)SR协议工作过程
(2)SR协议的窗口尺寸
(3)窗口尺寸超出上限
(4)总结
前言
上篇文章中,对于计算机网络的物理层相关内容进行了整理和总结,今天开始数据链路层的学习,还请多多支持!
回顾上期内容:计算机网络 ——【物理层】https://blog.csdn.net/2401_86777036/article/details/143993284?sharetype=blogdetail&shareId=143993284&sharerefer=APP&sharesource=2401_86777036&sharefrom=link
一、概述
1. 基本概念
链路(Link):从一个节点到相邻节点的一段物理线路,中间没有任何其他的交换节点
数据链路(Data Link):把实现通信协议的硬件和软件加到链路上,就构成了数据链路
数据链路层以帧为单位传输和处理数据
2. 数据链路层的三个主要问题
封装成帧:数据链路层给网络层交付的协议数据单元添加帧头和帧尾
差错检测:接收方主机收到帧后通过检错码和检错算法判断帧在传输过程中是否产生误码
可靠传输:可以简单理解为发送方发送什么,接收方就接收到什么
二、封装成帧
1. 概念
数据链路层对上层交付的协议数据单元添加帧头和帧尾使之成为一个帧
2. 帧头、帧尾的作用
1. 包含重要的控制信息
2. 帧定界
PPP帧:帧头、帧尾各有一字节的标志字段
接收方主机的数据链路层依据帧定界标志,从物理层交付的比特流中提取出一个个帧
BUT!并不是每一个数据链路层协议的帧中都有帧定界标志!
例如:以太网V2的MAC帧中:帧头和帧尾中并没有帧定界标志
接收方如何提取出以太网帧呢???
发送方数据链路层封装好以太网帧后交付给物理层,物理层收到后,会在以太网帧前添加8字节的前导码
前导码:
前7个字节为前同步码 —— 作用:是接受方的时钟同步
最后一个字节为帧开始定界符 —— 表名其后面紧跟的为以太网MAC帧
以太网还规定了帧间间隔为96比特时间 ——> MAC帧不需要帧结束定界符
3. 透明传输
数据链路层对上层交付的传输数据没有限制,就好像数据链路层不存在一样
帧定界标志也是一个特殊的数值
如果上层交付的协议数据单元中,也包括这个数值
接收方还能正确接收这个帧么?答案明显是错误的,接收方会对帧是否结束产生误判,这种情况下就不能称为透明传输!
数据链路层的处理办法:
在发送帧之前,对帧的数据部分进行扫描,每发现一个帧定界符,就在前面插入一个转义字符
接收方识别到转义字符时,就可以识别之后的一个字符为数据,从而剔除转义字符后提取数据
转义字符ESC:特殊的控制字符,长度为一字节,十进制数值为27
同样!!转义字符也是特殊的数值,如果数据中也存在转义字符的数值呢???
处理方法同上,在发送帧之前,对帧的数据部分进行扫描,每发现一个帧定界符和转义字符,就在前面插入一个转义字符
对于面向比特的物理链路 ——> 比特填充法
——> 零比特填充法:在发送帧之前,对帧的数据部分进行扫描,每5个连续的1后插入一个0
——> 接收方接收时剔除0即可
4. 提高效率
为了提高帧的传输效率,应当使帧的数据部分的长度尽可能大一些
最大传输单元MTU(Maximum Transfer Unit):考虑到差错控制等多种因素,每一种数据链路层协议都规定了帧数据部分的长度上限
三、差错检测
1. 概念
- 比特差错:比特在传输过程中可能产生产错(0变为1,1变为0)
- 误码率BER(Bit Error Rate):在一段时间内,传输错误的比特占传输的比特总数的比率,BER = 错误的比特 / 总的比特
- 差错检测:使用差错检测码来检测数据在传输过程中是否产生了比特差错
- 差错检测码:
其中FCS字段就是帧检验序列,让接收方的数据链路层检查帧在传输过程中是否产生了差错
2. 奇偶校验
在待发送的数据后添加一位奇偶校验位,使整个数据(包括添加的校验位)中1的个数为奇数(奇校验)或偶数(偶校验)
缺点:如果传输过程中比特1的奇偶性没有发生变化,就检测不出是否发生差错
3. 循环冗余校验CRC
循环冗余校验CRC —— Cyclic Redundancy Check
1. 步骤
- 收发双方约定好一个生成多项式G(x)
- 发送方基于待发送的数据和生成多项式计算出差错检测吗(冗余码),将其添加到待传输数据的后面一起传输
- 接收方通过生成多项式来计算是否产生了误码
2. 生成多项式
常用的生成多项式:
生成多项式必须包含最低次项1
3. 例题
发送方:
接收方:
4. 总结
- 检错码只能检测帧在传输过程中是否出现差错,但不能定位错误,因此无法纠错;
- 可以使用冗余信息更多的纠错码进行前向纠错,但纠错码的开销比较大,在计算机网络中很少使用;
- 循环冗余校验CRC有很好的检错能力,虽然计算比较复杂,但易于硬件实现,因此被广泛适用于数据链路层;
- 计算机网络中通常使用检错重传的方式来纠正传输中的错误,或者丢掉检测到差错的帧,这取决于数据链路层向其上层提供的是否是可靠传输。
四、可靠传输
1. 基本概念:
对于检测到差错的数据:
不可靠传输:丢弃产生差错的帧
可靠传输:想办法实现发送方发送什么,接收方就收到什么
传输差错:
分组丢失
分组失序
分组重复
2. 可靠传输的实现机制
1. 停止等待协议 SW
SW —— Stop-and-Wait
(1)否定分组NAK
接收方接收到数据之后,会对数据进行差错检测:
- 如果检测没有产生误码,则返回确认分组ACK
- 如果检测到存在误码,则丢弃该分组,并返回否定分组NAK
发送方接收到否定分组NAK之后,会重新发送一份数据分组,直至接收到确认分组ACK,之后才会将数据从缓存中删除
(2)超时重传
如果发送方发送数据后,数据在传播过程中丢失,接收方接收不到数据,就不会给发送方返回ACK或者NAK,发送方就会一直阻塞等待;
超时重传:发送方中存在一个重传计时器,重传计时器中设置有一个重传时间,发送方发送数据后,如果在规定的重传时间内没有收到ACK,就会重传上一份数据。
如果接收方接收到数据之后,检测到存在误码:
可以不立即返回NAK,而是等待发送方的超时重传;
但对于误码率较高的点对点链路,为了使对方尽快重传,也可选择发送NAK
(3)分组重复
接收方正确接收数据后,返回ACK确认分组,ACK在传播过程中丢失,触发了发送方的超时重传机制,此时就会导致接收方接收到两份一样的数据,而接受方无法判断是否是重复分组
为避免分组重复问题,就需要给每个数据分组添加序号,对于停止等待协议,每次发送一个数据分组后就会停止等待,所以只需要保证每次发送的数据序号和上一次发送的数据序号不同即可,因此只需要一个比特位来编号即可
(4)确认迟到
接收方正确接受数据之后,返回ACK,但ACK在传输过程中因某些原因,未能及时到达发送方,从而触发了发送方的超时重传,重传0号数据分组,之后才接收到ACK,此时就会立即发送1号数据分组
接收方再次收到0号数据分组之后,发现是重复的数据分组,就会丢弃并返回一个ACK,于是发送方就收到了对0号分组的重复确认,发送方无法正确辨别ACK
此时需要才取的措施就是,对确认分组ACK也进行编号,只需要保证每次的ACK序号和上一次发送的ACK序号不同即可,因此也只需要一个比特位来编号即可
发送方在接收到重复的确认分组ACK0时,会直接忽略该确认分组,等待正确的确认分组
(5)SW协议的信道利用率
信道利用率U计算公式:
由此可见,我们可以得出
当往返时延RTT远大于数据的发送时延时(例如卫星链路),信道的利用率就会非常低
如果出现重传,信道的利用率还会进一步降低
于是为了解决停止等待协议信道利用率低的问题,就出现了回退N帧协议和选择重传协议
2. 回退N帧协议GBN
GBN —— Go-Back-N
对于停止等待协议,每次发送一个数据分组后就会停止等待,所以每发送一个数据分组就至少需要等待一个收发双方的往返时间,信道利用率很低
此时如果采用流水线传输:
回退N帧协议:在流水线传输的基础上,通过发送窗口来限制发送方可连续发送的数据分组个数
发送窗口尺寸:
(n为数据分组的比特位)
当发送窗口=1时,就是停止等待协议
(1)无差错情况
发送方的发送窗口序号落在0~4号分组,一次发送给接收方
接收方依次进行接收,每接收一个数据分组,接收窗口向后滑动一个位置,并返回一个对应的ACK分组
发送方每接收一个ACK分组,发送窗口就向后滑动一个位置
发送方就可将收到确认的数据分组就可以从缓存中删除了
(2)累积确认
接收方没必要对接收到的数据分组逐个发送确认分组,接收方在接收到一批数据分组后,可以对按序到达的最后一个数据分组发送确认
表示:序号n之前的所有数据分组都已经正确接收
此时,就算ACK1丢失了,发送方只接受到了ACK4,就会知道0~4号分组被正确接收
(3)有差错情况
5号数据分组检测到存在误码,丢弃该数据分组
前四个数据分组也不会被接受,也会被丢弃,此时,每丢弃一个数据分组,就会返回一个上一批接收到的最后一个数据分组对应的确认分组
发送方接收到重复的确认分组,就知道之前发送的数据分组存在差错,就可以立即重传这批数据,至于收到几个重复的就会立即重传和具体实现有关
如果不足以立即重传,就会在重传计时器超时时,对发送窗口内的数据全部重传
此时,可以看出,在第一次发送中,就算6,7,0,1号数据分组没有产生差错,也会受到牵连不会被接收,发送方依旧需要重传这些数据
所以,当网络质量不好时,回退N帧协议并不一定比停止等待协议高
(4)发送窗口尺寸超过上限
接收方正确按序接收后,给发送方返回累计确认ACK7
此时,如果ACK7在返回过程中丢失......发送方就会接收不到确认分组,于是在重传计时器超时后,就会重传之前的全部分组
重传的0~7到达接收方,接收方无法分辨新旧分组,会再次接收,于是就会发生分组重复的现象
(5)总结
回退N帧协议是在流水线传输的基础上,通过发送窗口来限制发送方可连续发送的数据分组个数,是一种连续的ARQ协议,在协议工作的过程中,发送窗口和接收窗口不断向后滑动,于是这类协议又被称作滑动窗口协议。
3. 选择重传协议SR
SR —— Selective-Request
为了进一步提高性能,可以设法只对产生误码到的数据分组进行重传。因此,接收方的接收窗口不应只为1,以便接收方先收下失序到达但无误码并且序号落在接收窗口内的那些数据分组,等到所缺分组收齐后一并提交上层。
此时!为了使发送方仅重传出现差错的分组,接收方不能再使用累积确认的方式,而需要对每个正确接受的数据分组进行逐一确认
发送窗口:
接收窗口:
=
(1)SR协议工作过程
假设:发送方对落在发送窗口的数据分组进行发送:
传播过程中,2号数据分组丢失,接收方接收到0、1号数据时,接收窗口向后滑动,并返回对应的ACK分组;接收3号数据时,窗口不向后移动,但返回对应ACK分组(3号不是按序到达的分组);并将0、1号数据交给上层
接收方接收到0、1号ACK分组,窗口向后滑动,发送方可以将0、1号数据从缓存中删除;此时4、5号数据分组出现在发送窗口中,发送方对其进行发送;接收到ACK3,发送窗口不向后滑动,因为不是按序到达的ACK分组,同时记录已经收到ACK3,确保不会超时重传3号数据分组;
发送方接收4、5号数据,并返回对应ACK分组,但是窗口不向后滑动;发送方接收到4、5号ACK分组,记录已经收到4、5号数据
等重传计时器超时,对2号数据分组进行重传
接收方正确接收2号数据分组,返回对应ACK,接收窗口向后滑动
发送方接收到ACK2,发送窗口也向后滑动
(2)SR协议的窗口尺寸
(3)窗口尺寸超出上限
假设:将和
都设置为5
发送方将发送窗口的数据进行发送
接收方正确接收数据,并返回对应ACK分组,接收窗口向后滑动
假设确认分组返回过程中,ACK0丢失
发送方接收到1-4号ACK分组,并记录已经接收,过一段时间,重传计时器超时,就会重传0号数据分组
接收方无法分辨新旧数据分组,就会接收这个0号数据分组,就会出现分组重复的差错
(4)总结
相关文章:

【计算机网络】 —— 数据链路层(壹)
文章目录 前言 一、概述 1. 基本概念 2. 数据链路层的三个主要问题 二、封装成帧 1. 概念 2. 帧头、帧尾的作用 3. 透明传输 4. 提高效率 三、差错检测 1. 概念 2. 奇偶校验 3. 循环冗余校验CRC 1. 步骤 2. 生成多项式 3. 例题 4. 总结 四、可靠传输 1. 基本…...

AcWing 93. 递归实现组合型枚举
文章目录 前言代码思路 前言 今天晚上还有三个小时,写一晚上简单题。划水。 代码 #include<bits/stdc.h> using namespace std; int n,m; void dfs(int u,int sum,int state){if(sumn-u<m){return;//sum 表示当前选了 sum 个数字,假设把所有…...

vscode 折叠范围快捷键
vscode 折叠范围快捷键 问答 原文网址:https://www.n.cn/search/c830b29cb76146d08cae5074acfd4785 VSCode 折叠范围快捷键 在使用Visual Studio Code(VSCode)进行代码编辑时,掌握一些快捷键可以大大提高工作效率。以下是关于VSCode中折叠和…...

RabbitMQ 实现分组消费满足服务器集群部署
实现思路 使用扇出交换机(Fanout Exchange):扇出交换机会将消息广播到所有绑定的队列,确保每个消费者组都能接收到相同的消息。为每个消费者组创建独立的队列:每个消费者组拥有自己的队列,所有属于该组的消…...

Chromium网络调试篇-Fiddler 5.21.0 使用指南:捕获浏览器HTTP(S)流量(二)
概述 在上一篇文章中,我们介绍了Fiddler的基础功能和如何安装它。今天我们将深入探讨如何使用Fiddler来捕获HTTP请求,这是Fiddler的一个核心能力,对于前端开发者、测试人员以及安全研究人员来说非常有用。捕获HTTP请求可以帮助我们更好地理解…...

个人IP建设:简易指南
许多个体创业者面临的一个关键挑战是如何为其企业创造稳定的需求。 作为个体创业者,您无法使用营销团队,因此许多人通过推荐和他们的网络来产生需求。因此,扩大您的网络是发展您的业务和产生持续需求的最佳策略。 这就是个人IP和品牌发挥作…...

智能指针【C++11】
文章目录 智能指针std::auto_ptr std::unique_ptrstd::shared_ptrstd::shared_ptr的线程安全问题std::weak_ptr 智能指针 std::auto_ptr 管理权转移 auto_ptr是C98中引入的智能指针,auto_ptr通过管理权转移的方式解决智能指针的拷贝问题,保证一个资源…...

【Linux 篇】Docker 启动和停止的精准掌舵:操控指南
文章目录 【Linux篇】Docker 启动和停止的精准掌舵:操控指南前言docker基本命令1. 帮助手册 2. 指令介绍 常用命令1. 查看镜像2. 搜索镜像3. 拉取镜像4. 删除镜像5. 从Docker Hub拉取 容器的相关命令1. 查看容器2. 创建与启动容器3. 查看镜像4. 启动容器5. 查看容器…...

Cursor vs VSCode:主要区别与优势分析
Cursor - The AI Code Editor 1. AI 集成能力 Cursor的优势 原生AI集成: # Cursor可以直接通过快捷键调用AI # 例如:按下 Ctrl K 可以直接获取代码建议 def complex_function():# 在这里,你可以直接询问AI如何实现功能# AI会直接在编辑器中…...

从单体到微服务:如何借助 Spring Cloud 实现架构转型
一、Spring Cloud简介 Spring Cloud 是一套基于 Spring 框架的微服务架构解决方案,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。 Spring Cloud 提供了诸如服务发现、配置管理、负载均衡、断路器、消息总线…...

RocketMq基础学习+SpringBoot集成
学习贴:参考https://blog.csdn.net/zhiyikeji/article/details/138286088 文章目录 普通消息顺序消息延迟消息批量消息事务消息 SpringBoot整合RocketMQ 3.1 NameServer NameServer是一个简单的路由注册中心,支持Topic和Broker的动态注册和发现。作用主…...

分布式cap
P(分区安全)都能保证,就是在C(强一致)和A(性能)之间做取舍。 (即立马做主从同步,还是先返回写入结果等会再做主从同步。类似的还有,缓存和db之间的同步。&am…...

mybatis-xml映射文件及mybatis动态sql
规范 XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)。 XML映射文件的namespace属性为Mapper接口全限定名一致。 XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致…...

计算机网络复习——概念强化作业
物理层负责网络通信的二进制传输 用于将MAC地址解析为IP地址的协议为RARP。 一个交换机接收到一帧,其目的地址在它的MAC地址表中查不到,交换机应该向除了来的端口外的所有其它端口转发。 关于ICMP协议,下面的论述中正确的是ICMP可传送IP通信过程中出现的错误信息。 在B类网络…...

用友BIP与旺店通数据集成方案解析
用友BIP与旺店通企业奇门的供应商集成同步方案 在现代企业的数据管理中,跨平台的数据集成是实现高效业务运作的关键环节。本文将分享一个实际案例:如何通过轻易云数据集成平台,将用友BIP系统中的供应商数据无缝对接到旺店通企业奇门…...

string类函数的手动实现
在上一篇文章中,我们讲解了一些string类的函数,但是对于我们要熟练掌握c是远远不够的,今天,我将手动实现一下这些函数~ 注意:本篇文章中会大量应用复用,这是一种很巧妙的方法 和以往一样,还是…...

Oceanbase离线集群部署
准备工作 两台服务器 服务器的配置参照官网要求来 服务器名配置服务器IPoceanbase116g8h192.168.10.239oceanbase216g8h192.168.10.239 这里选oceanbase1作为 obd机器 oceanbase安装包 选择社区版本的时候自己系统的安装包 ntp时间同步rpm包 联网机器下载所需的软件包 …...

transformers生成式对话机器人
简介 生成式对话机器人是一种先进的人工智能系统,它能够通过学习大量的自然语言数据来模拟人类进行开放、连贯且创造性的对话。与基于规则或检索式的聊天机器人不同,生成式对话机器人并不局限于预定义的回答集,而是可以根据对话上下文动态地…...

WPF中的VisualState(视觉状态)
以前在设置控件样式或自定义控件时,都是使用触发器来进行样式更改。触发器可以在属性值发生更改时启动操作。 像这样: <Style TargetType"ListBoxItem"><Setter Property"Opacity" Value"0.5" /><Setter …...

C#设计模式--状态模式(State Pattern)
状态模式是一种行为设计模式,它允许对象在其内部状态发生变化时改变其行为。这种模式的核心思想是将状态封装在独立的对象中,而不是将状态逻辑散布在整个程序中。 用途 简化复杂的条件逻辑:通过将不同的状态封装在不同的类中,可…...

〔 MySQL 〕索引
目录 1. 没有索引,可能会有什么问题 2. 认识磁盘 MySQL与存储 先来研究一下磁盘: 在看看磁盘中一个盘片编辑 扇区 定位扇区编辑 结论 磁盘随机访问(Random Access)与连续访问(Sequential Access) 3. MySQL 与磁盘交互基本单位 4. 建立共识…...

计算机网络研究实训室建设方案
一、概述 本方案旨在规划并实施一个先进的计算机网络研究实训室,旨在为学生提供一个深入学习、实践和研究网络技术的平台。实训室将集教学、实验、研究于一体,覆盖网络基础、网络架构、网络安全、网络管理等多个领域,以培养具备扎实理论基础…...

韩企研学团造访图为科技:共探人工智能创新前沿
今日,一支由韩国知名企业研学专家组成的代表团莅临图为科技深圳总部,展开了一场深度技术交流与研讨活动。 此次访问旨在通过实地探访中国领先的科技企业,促进中韩两国在科技创新领域的深入合作与交流。 韩国游学团合影 图为科技作为一家在人…...

html button 按钮单选且 高亮
<DIV class"middle"> <div class"containerTarget"> <span class"hover-target1" οnclick"btn(1);">韵达 </span> <span class"hover-target2" οnclick"btn(2);">中通 </span…...

图片上传HTML
alioss sky:jwt:# 设置jwt签名加密时使用的秘钥admin-secret-key: itcast# 设置jwt过期时间admin-ttl: 7200000# 设置前端传递过来的令牌名称admin-token-name: tokenalioss:endpoint: ${sky.alioss.endpoint}access-key-id: ${sky.alioss.access-key-id}access-key-secret: $…...

C++学习-函数
C 函数 目录 函数默认参数引用传参函数重载 数量不同类型不同 内联函数 函数默认参数 #include<iostream>using std::cout; using std::endl;int power(int n, int x2); // x2 是默认参数int main() {cout << power(5) << endl; // 没有传 x 的值&#x…...

spring boot 测试 mybatis mapper类
spring boot 测试 mybatis mapper类 针对 mybatis plus不启动 webserver指定加载 xml 【过滤 “classpath*:/mapper/**/*.xml” 下的xml】, mapper xml文件名和mapper java文件名称要一样,是根据文件名称过滤的。默认情况加载和解析所有mapper.xml 自定义 MapperT…...

远程游戏新体验!
在这个数字化的时代,游戏已经不仅限于家里的电视或书房的电脑了。远程游戏,也就是通过远程控制软件在不同地点操作游戏设备,给玩家带来了前所未有的自由和灵活性。RayLink远程控制软件,凭借其出色的性能和专为游戏设计的功能&…...

Let up bring up a linux.part2 [十一]
之前的篇幅中我们已经将 Linux 内核 bringup 起来了,不知道大家有没有去尝试将根文件系统运行起来,今天我就带领大家完成这个事情,可以跟着下面的步骤一步步来完成: 在这里我们使用 busybox 构建 rootfs: 下载 busyb…...

调用大模型api 批量处理图像 保存到excel
最近需要调用大模型,并将结果保存到excel中,效果如下: 代码: import base64 from zhipuai import ZhipuAI import os import pandas as pd from openpyxl import Workbook from openpyxl.drawing.image import Image from io i…...