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

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.mzph.cn/news/828258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动手模拟 java Flux

MyFluxTest.java&#xff1a; import java.util.ArrayList; import java.util.List;public class MyFluxTest {public static void main(String[] args) {List<String> names new ArrayList<>();names.add( "张三" );names.add( "李四" );nam…

Jenkins集成Terraform实现阿里云CDN自动刷新

在互联网业务中&#xff0c;CDN的应用已经成了普遍&#xff0c;SRE的日常需求中&#xff0c;CDN的刷新在前端需求逐渐中占了很大比例&#xff0c;并且比较琐碎。做为合格的SRE&#xff0c;把一切自动化是终极使命&#xff0c;而今天就分享通过JenkinsTerraform实现阿里云的CDN自…

CISSP通关学习笔记:共计 9 个章节(已完结)

1. 笔记说明 第 0 章节为开篇介绍&#xff0c;不包括知识点。第 1 - 8 章节为知识点梳理汇总&#xff0c;8 个章节的知识框架关系如下图所示&#xff1a; 2. 笔记目录 「 CISSP学习笔记 」0.开篇「 CISSP学习笔记 」1.安全与风险管理「 CISSP学习笔记 」2.资产安全「 CISSP…

机器学习/算法工程师面试题目与答案-深度学习部分1

机器学习/算法工程师面试题目与答案-深度学习部分 BatchNormalization的作用梯度消失循环神经网络&#xff0c;为什么好?什么是GroupConvolution什么是RNN神经网络中权重共享的是&#xff1f;神经网络激活函数&#xff1f;为什么在深度学习中常进行finetuning画GRU结构图什么是…

自己在hadoop中会输错的命令

&#xff08;01&#xff09; hdfs dfsadmin -report -live 仅查看集群在线节点的基本信息可以使用&#xff1a; &#xff08;02&#xff09; hdfs dfs mkdir -C /Tipdm/Hadoop 使用这个命令可以在hdfs上面创建一个 /Tipdm/Hadoop&#xff0c;自己错误的点就是&#xff1a;-C&…

Flink CDC详解

文章目录 Flink CDC一 CDC简介1.1 CDC定义1.2 CDC应用场景1.3 CDC实现机制1.4 开源CDC工具对比 二 Flink CDC简介2.1 Flink CDC介绍2.2 Flink CDC Connector(连接器)2.3 Flink CDC && Flink版本2.4 Flink CDC特点 三 Flink CDC发展3.1 发展历程3.2 背景Dynamic Table &…

51单片机入门_江协科技_35~36_OB记录的自学笔记_AD与DA转换(XPT2046)

35. AD_DA 35.1. AD/DA介绍 •AD&#xff08;Analog to Digital&#xff09;&#xff1a;模拟-数字转换&#xff0c;将模拟信号转换为计算机可操作的数字信号 •DA&#xff08;Digital to Analog&#xff09;&#xff1a;数字-模拟转换&#xff0c;将计算机输出的数字信号转换…

系统设计 --- E2E Test System

系统设计 --- E2E Test System 什么是E2EE2E Architecture Example 什么是E2E E2E&#xff08;端到端&#xff09;测试是一种软件测试方法&#xff0c;旨在模拟真实的用户场景&#xff0c;测试整个应用程序或系统的端到端功能和交互流程。E2E 测试涵盖了从用户界面到后端系统的…

已解决java.util.concurrent.CancellationException: 取消异常的正确解决方法,亲测有效!!!

已解决java.util.concurrent.CancellationException: 取消异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 检查任务状态 使用适当的异常处理 提供取消的反馈 管理并发任务的生命周期 总结 博…

【Flutter 面试题】 为什么Flutter中的Widget使用const注解?

【Flutter 面试题】 为什么Flutter中的Widget使用const注解? 文章目录 写在前面口述回答补充说明示例代码说明写在前面 🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主,51CTO专家博主。2023博客之星TOP153。 👏🏻 正在学 Flutter 的同…

智能合约语言(eDSL)—— 测试

1、准备合约 如何写合约&#xff0c;与编译之前的文章已经写过了&#xff0c;准备好.wasm文件。 2、测试程序 xwasm/wasm/tests at main XuHugo/xwasm GitHub 2.1 读取合约 let modules fs::read("./tests/wasmfile/contract.wasm").unwrap(); 2.2预编译合约…

Java23种设计模式-结构型模式之外观模式

外观模式&#xff08;Facade Pattern&#xff09;&#xff1a;为复杂的系统提供了一个简单的统一接口&#xff0c;使得系统更易于使用和理解&#xff08;对外提供一个统一的方法&#xff0c;来访问子系统中的一群接口&#xff09; 外观模式三个核心角色&#xff1a; 角色1.外观…

信息系统项目管理师论文考察范围预测

在2023年下半年实施机考之前&#xff0c;论文的范围还是比较好预测的&#xff0c;因为从历年考题来看&#xff0c;可以说十大管理领域考察的概率接近100%&#xff0c;而且有一定规律&#xff0c;比如说某个管理领域很久没考了&#xff0c;那么考察的概率就相对大一点&#xff0…

力扣爆刷第126天之动态规划五连刷(斐波那契、爬楼梯、不同路径)

力扣爆刷第126天之动态规划五连刷&#xff08;斐波那契、爬楼梯、不同路径&#xff09; 文章目录 力扣爆刷第126天之动态规划五连刷&#xff08;斐波那契、爬楼梯、不同路径&#xff09;一、509. 斐波那契数二、70. 爬楼梯三、746. 使用最小花费爬楼梯四、62. 不同路径五、63. …

前端算法

4大算法&#xff1a; 贪心算法&#xff1a;局部最优解分治算法&#xff1a;将一个问题分成多个小模块动态规划&#xff1a;每一个状态都是过去历史的总结回溯算法&#xff1a;不是最优选择的时候退回重新选 一、排序算法 1. 冒泡排序&#xff1a;数字越大越往上 第一次循环 比…

Docker创建enrollment token错误异常

问题 部署完kibana&#xff0c;需要通过enrollment token方式来连接elasticsearch&#xff0c;此时需要在elasticsearch中创建enrollment token。 执行创建命令时&#xff0c;报如下错误&#xff1a; elasticsearch-create-enrollment-token --scope kibanaERROR: [xpack.se…

IDEA 全局查找 ctrl + shift + F 快捷键失效

全局查找&#xff1a;ctrl shift F 需要关闭微软输入法简体/繁体切换&#xff0c;不然被占用了无效 (装了搜狗输入法的同理,找一下是不是这个快捷键冲突了 ) 另外还有 IDEA 中 重构变量名 &#xff1a;shift F6 需要关闭微软输入法最新版本 ( 使用以前版本的微软输入法就没…

CSS渐变色理论与分类、文字渐变色方案、炸裂渐变色方案以及主流专业渐变色工具网站推荐

渐变色彩可以增加视觉层次感和动态效果&#xff0c;使网页界面更加生动有趣&#xff0c;吸引用户注意力。另外&#xff0c;相较于静态背景图片&#xff0c;CSS渐变无需额外的HTTP请求&#xff0c;减轻服务器负载&#xff0c;加快页面加载速度&#xff1b;同时CSS渐变能够根据容…

Qt——QGridLayout

1. 设置单元格比例 在Qt中&#xff0c;如果你想设置网格布局&#xff08;QGridLayout&#xff09;中单元格的比例&#xff0c;你需要使用QGridLayout的拉伸系数&#xff08;stretch factors&#xff09;来控制行和列的相对大小。你可以通过调用setRowStretch和setColumnStretch…

windows下git提交修改文件名大小写提交无效问题

windows系统不区分大小写&#xff0c;以及git提交忽略大小写&#xff0c;git仓库已存在文件A.js&#xff0c;本地修改a.js一般是没有提交记录的&#xff0c;需要手动copy一份出来A.js&#xff0c;再删除A.js文件提交仓库删除后&#xff0c;再提交修改后的a.js文件。 windows决…