数据链路层(计算机网络,待完善)

0、前言

本文大多数图片都来自于 B站UP主:湖科大教书匠 的教学视频,对高军老师及其团队制作出这么优质的课程表示感谢。文章增加了部分个人理解,内容并不是对视频的静态化翻译。

1、概述

1.1、数据链路层在计算机网络体系中的位置

在这里插入图片描述

1.2、对 MAC 地址的理解

MAC 地址并不是针对主机(或路由器)而言的,而是针对网卡(或路由器的接口)而言的,每一张网卡都有一个MAC地址:

  • 一台主机一般有以太网卡(有线网卡,Ethernet)和无线网卡(WLAN,Wireless LAN),在 Windows 系统上可以通过 ipconfig /all 进行查看
    在这里插入图片描述
  • 路由器的每一个接口可以认为是一张网卡(暂时这么认为),下图是通过 Packet Tracer 查看 Router1941 的配置项
    在这里插入图片描述

1.3、认识网卡(网络适配器)

在这里插入图片描述

  • 核心芯片:其中有 数据缓冲区,用于缓冲发送或接收到的数据
  • PCI 接口:Linux 系统中可以通过 lspci 来查看 PCI 设备,可以认为是 ls pci 的组合命令。
    曾在个人笔记本上安装 CentOS 7、Kali Linux、Ubuntu等,但无论怎么重装,都出现 WiFi 不可用的问题,也就是无线网卡的问题。在寻找解决方案的过程中,会遇到一些文章中提到 lspci | grep net 来查看网卡
  • EEPROM:可编程电可擦除只读芯片,存储 MAC 地址

除了物理网卡,还要一些虚拟网卡,例如:

  • 在 Linux 系统上使用 ip address 可以查看到有一张名为 lo 的网卡,这就是用于本地回环测试1的网卡
  • 在使用 VMWare 等虚拟机软件后,可以看到操作系统中会多出一些 VMnet8VMnet1 这些用于和虚拟机通信的虚拟网卡


二、数据链路层的机制(理论)

数据链路层要解决的三个问题:

  1. 封装成帧和透明传输
  2. 差错检测
  3. 可靠传输

2.1、封装成帧和透明传输

2.1.1、封装成帧

要考虑的问题是:上层传递过来的数据最终以 bit 流(面向比特的链路) 或 byte 流(面向字节的链路),需要一种机制使得接收方能够区分数据的开始和数据结束

方式一:插入帧定界符
PPP 协议采用该方案,存在缺陷的原理如下:

  1. 约定起始符号和终止符号(可以是同一个,记为 FLAG,PPP 协议中该值是 0x7E,二进制形式为 01111110)
  2. 遇到第一个 FLAG 认为是数据开始,遇到第二个 FLAG 认为是数据结束

方式二:采用帧间间隔
以太网协议采用该方案,原理如下:

  1. 插入前导码(同步+起始符的功能)
  2. 传输完一个帧后,等待一个帧间间隔(28us)后再传输下一个帧。

相当于采用 NULL 来作为终止符,即一段时间不传输数据,来接收方来确定帧结束

2.1.2、透明传输(完善的帧定界符方案)

帧定界符方案存在一个问题:如果上层传递过来的数据中存在 FLAG 这个值,那么就会发生误判,如下图所示
在这里插入图片描述

透明传输要解决的正是这个问题:让数据荷载中可以包含任意数据。上层不需要关系底层细节,即透明。

相似问题:

  • 如何在一个字符串中包含 " 符号?

基于字节的解决方案:使用转义字符(ESC,PPP协议中该值为 0x7D)

综上所述,使用透明传输需要发送方和接收方都对数据进行额外的处理(开销),具体过程如下:

  1. 发送方发送数据时,扫描帧的数据荷载部分,对其中的 FLAGESC 都进行转义(细节),即在前面插入 1B 的 ESC 字符
  2. 接收方接收数据时,扫描帧的数据荷载部分,当发现 ESC 时,就不对下一个字节的数据进行判断,直接提取即可。当需要判断的时候发现 FLAG,那么说明数据结束。

基于比特的解决方案:改造数据荷载,让数据荷载中不出现 FLAG(01111110) 这个序列,且接收方能够还原
FLAG 中间出现连续 6 位 1,因此只需要遍历数据荷载中的每一比特,当发现 5 个连续比特位为 1 时,再其后插入 1 位 0,5110

  1. 41103110211011100110 这些方案都是可行的,都可以保证数据荷载中不会出现 FLAG 这个序列。之所以选择 5110,是因为它的开销最小,假如采用 0110,那么相当于在原来数据的基础上扩充了一倍的数据长度,那么 1500 B 的数据荷载就需要分成两次进行发送,增加了开销。
  2. PPP 协议中发送除了插入转义字符外,还会将其后的数据(待转义的字节数据,即 FLAG 和 ESC)和 0x20 进行异或。接收方在提取该字符时,会再和 0x20 进行异或来还原。这本质上也是保证数据荷载中不会出现 FLAG 字符,和基于比特的解决方案在本质上异曲同工,但个人这里有点疑惑,因为感觉这个步骤是可以没有的,不理解为什么 PPP 协议要这么做?

2.2、差错检测

2.2.1、奇偶校验

奇校验:添加一个比特位,使得数据中比特 1 的总数为奇数
偶校验:添加一个比特位,使得数据中比特 1 的总数为偶数

2.2.2、CRC 循环冗余校验

以太网(Ethernet)、PPP 协议中均采用该方式进行差错检测,且以太网中如果出现帧错误,会直接丢弃帧,而不会重传

帧错误的情况

  • MAC 帧的长度不是 8k bit(其中 k = 1,2,…)。即字节流
  • MAC 帧长度不在 [64, 1518] 之间
  • FCS 帧检测错误

FCS 的计算过程

  1. 发送方和接收方约定生成多项式,例如,G(X) = X^4 + X^2 + X + 1
    在这里插入图片描述

  2. 发送方:数据对齐、模二除法(异或)
    若生成多项式 是 n 阶多项式,则在待发送数据后面补 n-1 个 0。最后得到的余数即为 FCS(帧检验序列,n-1 位)
    在这里插入图片描述

  3. 接收方:模二除法(异或)
    接收数据后,用约定的生成多项式进行模二除法,如果最后能够整除,则认为没有出现错误,否则一定出现错误。

2.2.3、海明码(纠错码)

以太网(Ethernet)并没有使用,成本太高,效率低。

原理:TODO

2.3、可靠传输



三、相关协议

3.1、以太网协议(802.3标准)

3.1.1、MAC 帧

在这里插入图片描述
帧的数据荷载部分不宜过长或过短,其优缺点分别为:

长的数据载荷,控制字段的占比低,相当于提高了数据的发送效率(正常情况)。但帧比特位的增加也意味着帧发生错误的概率增加了,且出错后的重传开销也增加,需要发送更多的数据。(异常情况)

短的数据荷载,控制字段的占比高,相当于降低了数据的发送效率(正常情况)。但帧比特位的减少也意味着帧发生错误的概率降低了,且出错后的重传开销也降低,只需要发送很少的数据。(异常情况)

此外,帧不能过短似乎还和帧间间隔?载波监听碰撞检测有关,有待进一步补充(TODO)

3.1.2、MAC 地址

MAC 地址是一个 48 bit 的数字,假设自左向右地址依次增大 (注意是假设),如下图所示
在这里插入图片描述

其中,bits[0] 表示单播(0)或多播(1)地址,bits[1] 表示全球管理(0)或本地管理(1)。

蛋疼的点:MAC 地址的表示逻辑和 IP 地址的表示逻辑并不统一。 原因在于,MAC 地址在表示的时候,是以字节为单位进行表示的,左边是字节低位,右边是字节高位。因此在表示上,上面的比特数组变成了下面的形式

在这里插入图片描述

在这里插入图片描述

3.2、PPP 协议

在这里插入图片描述

3.3、无线局域网协议(802.11标准)

四、局域网(LAN)的实现

4.1、以太网(Ethernet)

4.2、无线局域网(Wireless LAN)

五、虚拟局域网(VLAN)

六、待解决的问题

  1. 查看虚拟网卡 VMnet1,发现其 MAC 地址为 00-50-56-C0-00-01,为什么 bits[1] 是 0 而不是 1 呢?
  2. CRC 检测的数学原理是什么?是100%正确的吗?FCS 错误,一定错误这是容易理解的。但 FCS 检验正确,但实际发生错误,是否存在这种可能性呢?

  1. 目的 IP 地址为 127.x.y.z 的都称为回环地址,不仅仅是 127.0.0.1,这只是该 A 类地址中最小的一个。而 localhost 常在 host 文件中被解析为 127.0.0.1 而已。 ↩︎

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

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

相关文章

第58篇:创建Nios II工程之Hello_World<四>

Q:最后我们在DE2-115开发板上演示运行Hello_World程序。 A:先烧录编译Quartus硬件工程时生成的.sof文件,在FPGA上成功配置Nios II系统;然后在Nios II Eclipse窗口右键点击工程名hello_world,选择Run As-->Nios II …

离线语音模块初步学习——LSYT201B(深圳雷龙发展)

一 、产品简介 首先简单介绍下该离线语音模块,官方给出的介绍是:YT2228 是根据智能语音交互市场需求及思必驰算法的发展方向定义开发的 “芯片算法”人工智能人机语音交互解决方案,具有高性能、低功耗等特点。该芯片通过软硬融合的方法&…

搭建web服务器需要哪些步骤?

首先跟大家简单普及一下什么是web服务器? Web服务器也称为WWW(WORLD WIDE WEB)服务器,一般指网站服务器,是指驻留于因特网上某种类型计算机的程序。WEB服务器主要功能是提供网上信息浏览服务,可以处理浏览器等Web客户端的请求并返…

婴儿洗衣机有必要买吗?四款好评婴儿洗衣机性能大对比

由于宝宝的日常衣物是经常需要换洗的,而且有时候一天好几套衣服,遇上尿湿了、吐奶了,换洗就更勤。每次一点点衣物就放进家庭用的大容积洗衣机清洗,会相对的比较容易耗水耗电。而如果把宝宝的换洗衣物堆积一阵子,汇总了…

重磅!!!监控分布式NVIDIA-GPU状态

简介:Uptime Kuma是一个易于使用的自托管监控工具,它的界面干净简洁,部署和使用都非常方便,用来监控GPU是否在占用,非常美观。 历史攻略: docker应用:搭建uptime-kuma监控站点 win下持续观察…

VSCODE自定义代码片段简述与基础使用

目录 一、 简述二 、 基础使用说明2.1 新建一个代码块工作区间2.2 语法 三、 示例四、 参考链接 一、 简述 VSCode的自定义代码片段功能允许开发者根据自己的需求定义和使用自己的代码片段,从而提高编码效率。 优点: 提高效率: 自定义代码片段能够减少…

08 内核开发-避免冲突和死锁-mutex

08 内核开发-避免冲突和死锁-mutex 课程简介: Linux内核开发入门是一门旨在帮助学习者从最基本的知识开始学习Linux内核开发的入门课程。该课程旨在为对Linux内核开发感兴趣的初学者提供一个扎实的基础,让他们能够理解和参与到Linux内核的开发过程中。 …

JAVA实现easyExcel模版导出

easyExcel文档 模板注意&#xff1a; 用 {} 来表示你要用的变量 &#xff0c;如果本来就有"{“,”}" &#xff0c;特殊字符用"{“,”}"代替{} 代表普通变量{.}代表是list的变量 添加pom依赖 <dependency><groupId>com.alibaba</groupId&g…

记一次数据查询问题

背景: 有一个数据表,适用原始查询就能查到数据 select * from t_easy_barcode where FP01 = panel_jitaix32_2024_04_25_10_29_57 当我把表中数据列重命名之后sql如下: 因此 我先统计了一下数据表中数据有多少,查询发现有 2482872条 因此首先想到的问题是查询一…

【机器学习】特征筛选实例与代码详解

机器学习中的特征筛选 一、特征筛选的重要性与基本概念二、特征筛选的方法与实践1. 基于统计的特征筛选2. 基于模型的特征筛选3. 嵌入式特征筛选 三、总结与展望 在机器学习领域&#xff0c;特征筛选作为预处理步骤&#xff0c;对于提高模型性能、简化模型结构以及增强模型解释…

是时候了解替代FTP传文件的最优传输方案了

目前越来越多的企业在寻找替代FTP传文件的方案&#xff0c;主要原因在于其固有的一些弊端&#xff0c;在现代企业数据传输需求中可能导致安全性、效率和可靠性方面的问题。以下是FTP的一些主要弊端&#xff1a; 1.数据传输不加密&#xff1a;FTP在传输过程中不加密数据&#xf…

Mybatis入门(入门案例,IDEA配置SQL提示,JDBC介绍,lombok介绍)

目录 一、Mybatis入门案例介绍整体步骤创建SpringBoot项目pom依赖准备测试数据新建实体类配置Mybatis数据库连接信息新建接口类,编写SQL代码单元测试 二、IDEA配置SQL提示三、JDBC是什么案例JDBC和Mybatis对比 四、数据库连接池介绍如何实现一个数据库连接池切换数据库连接池 五…

commvault学习(6):备份oracle(包括oracle的安装)

1.环境 CS、MA&#xff1a;一台windows server2012 客户端&#xff1a;2台安装了oracle11g的windows server2008 1.1 windows server2008安装oracle11g &#xff08;1&#xff09;右击安装包内的setup&#xff0c;以管理员方式运行 &#xff08;2&#xff09;取消勾选接收安…

前端学习<四>JavaScript——48-jQuery动画详解

前言 jQuery提供的一组网页中常见的动画效果&#xff0c;这些动画是标准的、有规律的效果&#xff1b;同时还提供给我们了自定义动画的功能。 显示动画 方式一&#xff1a; <span style"background-color:#f8f8f8"><span style"color:#333333"…

Qt 把.exe打包成安装文件形式

目录 1.下载工具 Qt Installer Framework2.将bin文件添加到环境变量3.拷贝startmenu示例-备用4.准备Qt Release打包好的程序5.把Release打包好的程序放到packages\org.qtproject.ifw.example\data文件夹下6.生成安装包7.修改安装包图标8.修改主程序程序安装引导-创建快捷键9.添…

【重磅】刚刚,《学位法》通过!!!2025年1月1日起施行!

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

JetBot手势识别实验

实验简介 本实验目的在JetBot智能小车实现手势识别功能&#xff0c;使用板卡为Jetson Nano。通过小车摄像头&#xff0c;识别五个不同的手势&#xff0c;实现小车的运动及灯光控制。 1.数据采集 连接小车板卡的Jupyterlab环境&#xff0c;运行以下代码块&#xff0c;配置数据…

rust 卸载重新安装 安装

原因&#xff1a;接触区块链时报错 linking with x86_64-w64-mingw32-gcc failed: exit code: 1 Rust编译需要C环境&#xff0c;如果你没有&#xff0c;Rust也能安装成功&#xff0c;只是无法编译代码 C的编译工具有两个&#xff0c;一个是msvc&#xff0c;也就是visual studi…

pytest-xdist:远程多主机 - 分布式运行自动化测试

简介&#xff1a;pytest-xdist插件使用新的测试执行模式扩展了pytest&#xff0c;最常用的是在多个CPU之间分发测试以加快测试执行&#xff0c;即 pytest -n auto同时也是一个非常优秀的分布式测试插件&#xff0c;分别支持ssh和socket两种方式实现master和worker的远程通讯。…

【ensp实验】路由过滤与引入

要求&#xff1a; 1、按照图示配置IP地址&#xff0c;R1, R3&#xff0c;R4上使用loopback 口模拟业务网段&#xff1b; 2、R1和R2运行RIPv2&#xff0c;R2&#xff0c;R3和R4运行OSPF&#xff0c;各自协议内部互通&#xff1b; 3、在RIP和OSPF间配置双向路由引入&#xff0c;要…