【计算机网络】 —— 数据链路层(壹)

文章目录

前言

 一、概述

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)总结


前言

上篇文章中,对于计算机网络的物理层相关内容进行了整理和总结,今天开始数据链路层的学习,还请多多支持!

回顾上期内容:计算机网络 ——【物理层】icon-default.png?t=O83Ahttps://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. 提高效率

为了提高帧的传输效率,应当使帧的数据部分的长度尽可能大一些

最大传输单元MTUMaximum Transfer Unit):考虑到差错控制等多种因素,每一种数据链路层协议都规定了帧数据部分的长度上限

三、差错检测

1. 概念

  • 比特差错:比特在传输过程中可能产生产错(0变为1,1变为0)
  • 误码率BER(Bit Error Rate):在一段时间内,传输错误的比特占传输的比特总数的比率,BER = 错误的比特 / 总的比特
  • 差错检测:使用差错检测码来检测数据在传输过程中是否产生了比特差错
  • 差错检测码:

其中FCS字段就是帧检验序列,让接收方的数据链路层检查帧在传输过程中是否产生了差错

2. 奇偶校验

在待发送的数据后添加一位奇偶校验位,使整个数据(包括添加的校验位)中1的个数为奇数(奇校验)或偶数(偶校验)

缺点:如果传输过程中比特1的奇偶性没有发生变化,就检测不出是否发生差错

3. 循环冗余校验CRC

循环冗余校验CRC —— Cyclic Redundancy Check

1. 步骤

  1. 收发双方约定好一个生成多项式G(x)
  2. 发送方基于待发送的数据和生成多项式计算出差错检测吗(冗余码),将其添加到待传输数据的后面一起传输
  3. 接收方通过生成多项式来计算是否产生了误码

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帧协议:在流水线传输的基础上,通过发送窗口来限制发送方可连续发送的数据分组个数

发送窗口W_T{}尺寸:1< W_{T}\leqslant 2^{n}-1(n为数据分组的比特位)

当发送窗口W_T{}=1时,就是停止等待协议

(1)无差错情况

发送方的发送窗口序号落在0~4号分组,一次发送给接收方

接收方依次进行接收,每接收一个数据分组,接收窗口向后滑动一个位置,并返回一个对应的ACK分组

发送方每接收一个ACK分组,发送窗口就向后滑动一个位置

发送方就可将收到确认的数据分组就可以从缓存中删除了

(2)累积确认

接收方没必要对接收到的数据分组逐个发送确认分组,接收方在接收到一批数据分组后,可以对按序到达的最后一个数据分组发送确认ACK_{n}

ACK_{n}表示:序号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,以便接收方先收下失序到达但无误码并且序号落在接收窗口内的那些数据分组,等到所缺分组收齐后一并提交上层。

此时!为了使发送方仅重传出现差错的分组,接收方不能再使用累积确认的方式,而需要对每个正确接受的数据分组进行逐一确认

发送窗口W_{T}1< W_{T}\leqslant 2^{n-1}

接收窗口W_{R}W_{R} = W_{T}

(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)窗口尺寸超出上限

假设:将W_{T}W_{R}都设置为5

发送方将发送窗口的数据进行发送

接收方正确接收数据,并返回对应ACK分组,接收窗口向后滑动

假设确认分组返回过程中,ACK0丢失

发送方接收到1-4号ACK分组,并记录已经接收,过一段时间,重传计时器超时,就会重传0号数据分组

接收方无法分辨新旧数据分组,就会接收这个0号数据分组,就会出现分组重复的差错

(4)总结

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

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

相关文章

敏捷开发之路

1. 引言 最近有个企业软件开发项目&#xff0c;用户要求采用敏捷开发的方法实施项目。以前也参加过敏捷方法的培训&#xff0c;结合最近找的敏捷开发材料&#xff0c;形成了下面的敏捷实施过程内容。 以下采用了QAD量化敏捷开发方法&#xff0c;关于此方法详细参考内容见最后…

Linux-音频应用编程

ALPHA I.MX6U 开发板支持音频&#xff0c;板上搭载了音频编解码芯片 WM8960&#xff0c;支持播放以及录音功能&#xff01;本章我们来学习 Linux 下的音频应用编程&#xff0c;音频应用编程相比于前面几个章节所介绍的内容、其难度有所上升&#xff0c;但是笔者仅向大家介绍 Li…

电影院订票选座小程序+ssm

题目&#xff1a;电影院订票选座小程序的设计与实现 摘 要 由于APP软件在开发以及运营上面所需成本较高&#xff0c;而用户手机需要安装各种APP软件&#xff0c;因此占用用户过多的手机存储空间&#xff0c;导致用户手机运行缓慢&#xff0c;体验度比较差&#xff0c;进而导致…

【网络】网络基础知识(协议、mac、ip、套接字)

文章目录 1. 计算机网络的背景2. 认识网络协议2.1 协议分层2.2 OS与网络的关系 3. 网络传输基本流程3.1 局域网通信流程3.2 跨网络通信流程 4. Socket 编程预备4.1 理解源IP地址和目的IP地址4.2 端口号与Socket4.3传输层的典型代表4.4 网络字节序 5. socket 编程接口5.1 介绍5.…

Kubernetes(K8S) + Harbor + Ingress 部署 SpringBoot + Vue 前后端分离项目

文章目录 1、环境准备2、搭建 K8S3、搭建 Harbor4、搭建 MySQL5、构建 SpringBoot 项目镜像6、构建 Vue.js 项目镜像7、部署项目 7.1、配置 NameSpace7.2、配置 Deployment、Service7.3、配置 Ingress-Nginx7.4、访问测试 1、环境准备 本次整体项目部署使用的是阿里云ECS服…

自回归模型(AR )

最近看到一些模型使用了自回归方法&#xff0c;这里就学习一下整理一下相关内容方便以后查阅。 自回归模型&#xff08;AR &#xff09; 自回归模型&#xff08;AR &#xff09;AR 模型的引入AR 模型的定义参数的估计方法模型阶数选择平稳性与因果性条件自相关与偏自相关函数优…

学习Python的笔记--面向对象-继承

1、概念 多个类之间的所属关系&#xff0c;即子类默认继承父类的所有属性和方法。 注&#xff1a;所有类默认继承object类&#xff0c;object类是顶级类或基类&#xff1b; 其他子类叫做派生类。 #父类A class A(object):def __init__(self):self.num1def info_print(self)…

2024数字科技生态大会 | 紫光展锐携手中国电信助力数字科技高质量发展

2024年12月3日至5日&#xff0c;中国电信2024数字科技生态大会在广州举行&#xff0c;通过主题峰会、多场分论坛、重要签约及合作发布等环节&#xff0c;与合作伙伴共绘数字科技发展新愿景。紫光展锐作为中国电信的战略合作伙伴受邀参会&#xff0c;全面呈现了技术、产品创新进…

基于STM32的智慧宿舍系统(DAY5)_光照传感器、MQ2、电流传感器、紫外线传感器

注意上述右图的配置需要根据我们实际所使用的通道来&#xff0c;239.5这个是采样时间&#xff0c;根据需要调整&#xff0c;然后我们打到DMA配置项&#xff0c;如下图 这个地方只有DMA模式需要调整&#xff0c;完成上述配置后我们就可以生成代码了&#xff0c;然后我们按照如下…

NDK编译(使用Android.mk)C/C++程序和库

1、编译可执行目标文件 1.1、编写源代码 源代码可以是c或cpp文件&#xff0c;但一定要包含main函数&#xff0c;否则会报错。例如&#xff1a; //test.c #include <stdio.h> int main() {printf("Hello,NDK!"); } 1.2 编写Android.mk文件 编写Android.mk文…

使用Excel 对S型曲线加减速算法进行仿真

项目场景&#xff1a; 项目场景&#xff1a;代码中写了S型加减速算法&#xff0c;相查看生成的加减速数组&#xff0c;直观的展示出来&#xff0c;USB通信一次64字节&#xff0c;对于我几个个32位的频率值不太方便&#xff0c;于是采用Excel进行仿真。 代码中如何生成S加减速曲…

SwiftUI 列表(或 Form)子项中的 Picker 引起导航无法跳转的原因及解决

概述 在 SwiftUI 的界面布局中&#xff0c;列表&#xff08;List&#xff09;和 Form 是我们秃头码农们司空见惯的选择。不过大家是否知道&#xff1a;如果将 Picker 之类的视图嵌入到列表或 Form 的子项中会导致导航操作无法被触发。 从上图可以看到&#xff1a;当在 List 的…

【Elasticsearch入门到落地】3、es与mysql的概念对比

接上篇《2、正向索引和倒排索引》 上一篇我们学习了什么是正向索引和倒排索引。本篇我们来学习Elasticsearch与Mysql的概念与区别。 一、文档 Elasticsearch是面向文档存储的&#xff0c;可以是数据库中的一条商品数据&#xff0c;一个订单信息。文档数据会被序列化为json格式…

云服务器部署upload-labs-docker(文件上传靶场)环境 以及相关报错问题

环境的搭建 准备&#xff1a;云服务器&#xff08;本地的linux服务器&#xff08;版本最好不要是老的不然不兼容docker&#xff09;&#xff09; f8x配置docker环境&#xff1a; https://github.com/ffffffff0x/f8x 一键配置 docker拉取file-labs靶场 https://github.com…

HAMR技术进入云存储市场!

2024年12月3日&#xff0c;Seagate宣布其Mozaic 3系列HAMR&#xff08;热辅助磁记录&#xff09;硬盘获得了来自一家领先云服务提供商&#xff08;可能AWS、Azure或Google Cloud其中之一&#xff09;以及其他高容量硬盘客户的资格认证。 Seagate的Mozaic 3技术通过引入热辅助磁…

【错误记录】Android Studio 开发环境内存占用过多 ( 记录内存使用情况 )

文章目录 一、报错信息二、AS 内存记录分析 一、报错信息 使用 Android Studio 一段时间后 , 内存爆了 , 占用了 10G 的内存 ; 二、AS 内存记录分析 AS 刚启动时 , 只占 2014M 内存 ; 编译运行程序后 , 内存变为 2800M 左右 ; 设置显示的运行程序对应的日志 , 占用内存 就会稳定…

BERT模型的实现

本文用 pytorch 实现一个BERT模型。 食用方法&#xff1a; 直接下载完整实现&#xff0c; 在自己本地跑一遍&#xff0c;保证不报错。先完成数据预处理阶段&#xff08;1-4&#xff09;的代码阅读&#xff0c;然后按照如下关键点的描述完成代码的实现。自己看着代码手写后续部…

VSCode GDB远程嵌入开发板调试

VSCode GDB远程嵌入式开发板调试 一、原理 嵌入式系统中一般在 PC端运行 gdb工具&#xff0c;源码也是在 PC端&#xff0c;源码对应的可执行文件放到开发板中运行。为此我们需要在开发板中运行 gdbserver&#xff0c;通过网络与 PC端的 gdb进行通信。因此要想在 PC上通过 gdb…

Hadoop3集群实战:从零开始的搭建之旅

目录 一、概念 1.1 Hadoop是什么 1.2 历史 1.3 三大发行版本&#xff08;了解&#xff09; 1.4 优势 1.5 组成&#x1f497; 1.6 HDFS架构 1.7 YARN架构 1.8 MapReduce概述 1.9 HDFS\YARN\MapReduce关系 二、环境准备 2.1 准备模版虚拟机 2.2 安装必要软件 2.3 安…

RK3568笔记0:环境搭建

第1章 安装NFS服务器 NFS可以让不同的机器、不同的操作系统之间彼此共享文件 服务器安装NFS sudo apt-get install nfs-kernel-server服务器创建一个共享目录 sudo mkdir -p /home/lmz/workspaces/shared_directory配置共享目录到服务器中的配置文件中 sudo vim /etc/export…