精炼计算机网络——数据链路层(一)
文章目录
- 前言
- 3.1 数据链路和帧
- 3.1.1 数据链路和帧
- 3.1.2 三个基本问题
- 3.2 点对点协议PPP
- 3.2.1 PPP协议的特点
- 3.2.2 PPP协议
- 3.2.3 PPP协议的工作状态
- 总结
前言
上篇文章,我们一同学完了物理层的全部内容,在本篇文章中,我们初步学习数据链路层,理解数据链路和帧的相应概念,知晓封装成帧,透明传输,差错检测的含义。
3.1 数据链路和帧
3.1.1 数据链路和帧
链路是从一个节点到相邻节点的一段物理线路,而中间没有任何其他的交换节点。
数据链路则不同。这是因为当需要在一条线路上传送数据时,除了必须有一条物理线路外,还必须有一些必须要的通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路,现在最常用的方法是使用网络适配器来实
现这些协议。
也有人采用另外的术语。这就是把链路分为物理链路和逻辑链路。物理链路就是链路,逻辑链路就是数据链路,是物理链路加上必要的通信协议。
早起的数据通信协议层叫做通信规程。
点对点信道的数据链路层的协议数据单元——帧。
数据链路层把网络层交下来的数据构成帧发送到链路上,以及把接收到的帧中的数据取出并上交给网络层。在互联网中,网络层协议数据单元就是IP数据报(或简称为数据报、分组或包)。
点对点信道的数据链路层在进行通信时的主要步骤如下:
(1) 节点A的数据链路层把网络层交下来的IP数据报添加首部和尾部封装成帧。
(2) 节点A把封装好的帧发送给节点B的数据链路层。
(3) 若节点B的数据链路层收到的帧无差错,则从收到的帧中提取出IP数据报交给上面的网络层;否则丢弃这个帧。
3.1.2 三个基本问题
三个基本问题是:封装成帧、透明传输和差错检测
1、封装成帧
封装成帧就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。
图中表示用帧首部和帧尾部封装成帧的一般概念
网络层的IP数据报传送到数据链路层就称为帧的数据部分。在帧的数据部分的前面和后面分别添加上首部和尾部,构成一个完整的帧。这样的帧就是数据链路层的数据传送单元。一个帧的帧长等于帧的数据部分长度加上帧首部和帧尾部的长度。首部和尾部的一个重要作用就是进行帧定界。此外,首部和尾部还包括许多必要的控制信息,在发送帧时,是从帧首部开始发送的。各种数据链路层协议都对帧首部和帧尾部的格式有明确的规定。
为了提高帧的传输效率,应当使帧的数据部分长度尽可能地大于首部和尾部的长度。但是,每一种链路层协议都规定了所能传送的帧的数据部分长度上限——最大传送单元MTU。
当数据是由可打印的ASCII码组成的文本文件时,帧定界可以使用特殊的帧定界符。
由于使用了帧定界符,接收端就知道前面收到的数据是个不完整的帧。
2、透明传输
由于帧的开始和结束的标记使用专门指明的控制字符,因此,所传输的数据中的任何8比特的组合一定不允许和用作帧定界的控制字符的比特编码一样,否则就会出现帧定界的错误。
如图:如果数据中的某个字节的二进制代码恰好和SOH或EOT这种控制字符一样,数据链路层就会错误地“找到帧的边界”,把部分帧收下,而把剩下的那部分数据丢弃。
透明表示:某一个实际存在的事物看起来却好像不存在一样
“在数据链路层透明传送数据”表示无论什么样的比特组合的数据,都能够按照原样没有差错地通过这个数据链路层。因此,对所传
送的数据来说,这些数据就“看不见”数据链路层有什么妨碍数据传输的东西。或者说,数据链路层对这些数据来说是透明的。
为了解决透明传输问题,就必须设法使数据中可能出现的控制字符“SOH”和“EOT”在接收端不被解释为控制字符。具体的方法是:发送端的数据链路层在数据中出现控制字符“SOH”或“EOT”的前面插入一个转义字符“ESC”,而在接收端的数据链路层在把数据送到网络层之前删除这个插入的转义字符。这种方法称为字节填充或字符填充。如果转义字符也出现在数据当中,那么解决方法仍然是转义字符的前面插入一个转义字符。因此当接收端收到连续的两个转义字符时,就删除其中前面的一个。
3、差错检测
比特在传输过程中可能会产生差错:1可能会变成0,0也可能会变成1。这就叫做比特差错。
在一段时间内,传输错误的比特占传输比特总数的比率称为误码率。
误码率与信噪比有很大的关系。提高信噪比,就可以使误码率降低。
为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。目前在数据链路层广泛使用了循环冗余检验CRC的检错技术。
在发送端,先把数据划分为组,假定每组K个比特。现假定待传送的数据M = 101001 (k = 6)。CRC运算就是在数据M的后面添加供差错检测用的n位冗余码,然后构成一个帧发送出去,一共发送(k+n)位。
n位冗余码如此得出:用二进制的模2运算进行2n乘M的运算,这相当于在M后面添加n个0。得到的(k+m)位的数除以收发双方事先商定的长度(n+1)位的除数P,得出商是Q而余数是R(n位)。
余数R就作为冗余码拼接在数据M的后面发送出去。这种为了进行检错而添加的冗余码常称为帧检验序列FCS。
在接收端把接收到的数据以帧为单位进行CRC检验:把收到的每一个帧都除以同样的除数P(模2运算),然后检查余数R、
(1) 若得出R = 0,则判定这个帧没有差错,就接受。
(2) 若余数R ≠ 0,则判定这个帧有差错,就丢弃。
用多项式P(X) = X3 + X2 + 1可代表除数P = 1101 P(X)称为生成多项式。
在数据链路层若仅仅使用循环冗余检验CRC差错检测技术,则只能做到对帧的无差错接受,即:“凡是接收端数据链路层接收的帧,我们都能以非常接近于1的概率认为这些帧在传输过程中没有差错“。接收端丢弃的帧虽然曾收到了,但最终还是因为有差错被丢弃,即没有接受。上述所述的可近似地表述为:“凡是接收端数据链路层接受的帧均无差错。”
传输差错可分为两大类:一类就是最基本的比特差错,另一类是收到的帧并没有出现比特差错,但却出现了帧丢失、帧重复或帧失序。
在数据链路层使用CRC检验能够实现无比特差错的传输,但这还不是可靠传输。
在CRC检错的基础上,增加了帧编号、确认和重传机制。收到正确的帧就要想发送端发送确认。发送端在一定的期限在CEC检错的基础上,增加了帧编号、确认和重传机制。收到正确的帧就要向发送端发送确认。发送端在一定的期限内若没有收到对方的确认,就认为出现了差错,因此就进行重传,直到收到对方的确认为止。
现在的通信线路的质量已经大大提高了,由通信链路不好引起差错的概率已经大大降低。因此,现在互联网就采取区别对待的方法。
对于通信质量良好的有线传输链路,数据链路层协议不使用确认和重传机制,即不要求数据链路层向上提供可靠传输的服务。如果在数据链路层传输数据时出现了差错并且需要进行改正,那么改正差错的任务就由上层协议来完成。
对于通信质量较差的无线传输链路,数据链路层协议使用了确认和重传机制,数据链路层向上提供可靠传输的服务。
这样做可以提高通信效率。
3.2 点对点协议PPP
高级数据链路控制HDLC成为通信线路质量较差的年代比较流行的数据链路层协议。
而现在,对于点对点的链路,简单得多的点对点协议PPP则是目前使用得最广泛的数据链路层协议。
3.2.1 PPP协议的特点
PPP协议是用户计算机和ISP进行通信时所使用的数据链路层协议。
1、PPP协议应满足的需求:
(1) 简单
这种数据链路层的协议非常简单:接收方每收到衣蛾帧,就进行CRC检验。如CRC检验正确,就收下这个帧;反之,就会丢弃这个帧,其他什么也不做。
(2) 封装成帧
PPP协议必须规定特殊的字符作为帧定界符。
(3) 透明性
PPP协议必须保证数据传输的透明性。
(4) 多种网络层协议
PPP协议必须能够在同一条物理链路上同时支持多种网络层协议的运行。
(5) 多种类型链路
除了要支持多种网络层的协议外,PPP还必须能够在多种类型的链路上运行。
(6) 差错检测
PPP协议必须能够对接收端收到的帧进行检测,并立即丢弃有差错的帧。
(7) 检测连接状态
PPP协议必须具有一种机制能够及时自动检测出链路是否处于正常工作状态。
(8) 最大传送单元
PPP协议必须对每一种类型的点对点链路设置最大传送单元MTU的标准默认值。MTU是数据链路层的帧可以载荷的数据部分的最大长度,而不是帧的总长度。
(9) 网络层地址协商
PPP协议必须提供一种机制使通行的两个网络层的实体能够通过协商知道或能够配置彼此的网络层地址。
(10) 数据压缩协商
PPP协议必须提供一种方法来协商使用数据压缩算法。
在TCP/IP协议簇中,可靠传输由运输层的TCP协议负责,因此数据链路层的PPP协议不需要进行纠错,不需要设置序号,也不需要进行流量控制。PPP协议不支持多点线路(即一个主站轮流和链路上的多个从站进行通信)。而且支持点对点的链路通信。此外,PPP协议只支持全双工链路。
2、PPP协议的组成
PPP协议有三个组成部分:
(1) 一个将IP数据报封装到串行链路的方法。
(2) 一个用来建立、配置和测试数据链路连接的链路控制协议ICP。
(3) 一套网络控制协议NCP。
3.2.2 PPP协议
1、各字段的意义
如图,PPP帧的首部和尾部分别为四个字段和两个字段。
首部的第一个字段和尾部的第二个字段都是标志字段F,规定为0x7E(符号0x表示十六进制,十六进制的7E表示01111110)。
标志字段表示一个帧的开始或结束,因此标志字段就是PPP帧的定界符。连续两帧之间只需要用一个标志字段。如果出现连续两个标志字段,就表示这是一个空帧,应当丢弃。
首部中的地址字段A规定为0xFF(即11111111),控制字段C规定为0x03(即00000011)。这两个字段实际上并没有携带PPP帧的信息。
PPP首部的第四个字段是2字节的协议字段。当协议字段为0x0021时,PPP帧的信息字段就是IP数据报。若为0xC021,则信息字段是PPP链路控制协议LCP的数据,而0x8021表示这是网络层的控制数据。
信息字段的长度是可变的,不超过1500字节。
尾部中的第一个字段(2字节)是使用CRC的帧检验序列FCS。
2、字节填充
当信息字段中出现和标志字段一样的比特(0x7E)组合时,就必须采取一系列措施使这种形式上和标志字段一样的比特组合不出现在信息字段中。当PPP使用异步传输时,它把转义符定义为0x7D,并使用字节填充。
RFC1662规定了如下的填充方法:
(1) 把信息字段中出现的每一个0x7E字节转变成为2字节序列(0x7D,0x5E)
(2) 把信息字段中出现一个0x7D的字节(即出现了和转义字符一样的比特组合),则把0x7D转变为2字节序列(0x7D,0x5D)。
(3) 把信息字段中出现ASCII码的控制字符(即数值小于0x20的字符),即在该字符前面要加入一个0x7D字节,同时将该字符的编码加以改变。
由于在发送端进行了字节填充,因此在链路上传送的信息字节数就超过了原来的信息字节数,但接收端在收到数据后再进行与发送端字节填充相反的变换,就可以正确地恢复出原来的信息。
3、零比特填充
PPP协议用在SONET/SDH链路时,使用同步传输(一连串的比特连续传送)而不是异步传输(逐个字符地传送)。在这种情况下,PPP协议采用零比特填充方法来实现透明传输。
零比特填充的具体做法是:在发送端,先扫描整个信息字段,只要发现有5个连续1,则立即填入一个0。因此经过这种零比特填充后的数据,就可以保证在信息字段中不会出现6个连续1。接收端在收到一个帧时,先找到标志字段F以确定一个帧的边界,接着再用硬件对其中的比特流进行扫描。每当发现5个连续1时,就把这5个连续1后的一个0删除,以还原成原来的信息比特流。这样就保证了透明传输:在所传送的数据比特流中可以传送任意组合的比特流,而不会引起对帧边界的错误判断。
3.2.3 PPP协议的工作状态
PPP链路初始化如图所示
PPP链路的起始和终止状态永远是“链路静止”状态,这时在用户个人电脑和ISP的路由器之间并不存在物理层的连接。
当用户个人电脑通过调制解调器呼叫路由器时,路由器就能够检测到调制解调器发出的载波信号。在双方建立了物理层连接后,PPP就进入“链路建立”状态,其目的是建立链路层的LCP连接。
这时LCP开始协商一些配置选项,即发送给LCP的配置请求帧,这时PPP帧,其协议字设置为LCP对应的代码。而信息字段包含特定的配置请求。链路的另一端可以发送以下几种响应中的一种。
(1) 配置确认帧:所有选项都接受
(2) 配置否认帧:所有选项都理解但不能接受
(3) 配置拒绝帧:选项有的无法识别或不能接受,需要协商
LCP配置选项包括链路上的最大帧长、所使用的鉴别协议的规约,以及不使用PPP帧中的地址和控制字段。
协商结束后双方就建立了LCP链路,接着就进入“鉴别状态”。这一状态,只允许传送LCP协议的分组、鉴别协议的分组以及监测链路质量的分组。若使用口令鉴别协议RAP,则需要发起通信的一方发送身份标识和口令。系统可允许用户重试若干次。如果需要有更好的安全性,则可使用更加复杂的口令握手鉴别协议CHAP。若鉴别身份失败,则转到“链路终止”状态。若鉴别成功,则进入“网络层协议”状态。
在“网络层协议”状态,PPP链路两端的网络控制协议NCP根据网络层的不同协议互相交换网络层特定的网络控制分组。这个步骤是很重要的,因为现在的路由器都能够同时支持多种网络层协议。总之,PPP协议两端的网络层可以运行不同的网络层协议,但仍然可使用同一个PPP协议进行通信。
如果在PPP连路上运行的是IP协议,则对PPP链路的每一端配置IP协议模块时就要使用NCP中支持IP的协议——IP控制协议IPCP。IPCP分组也封装成PPP帧在PPP连路上传送。在低速链路上运行时,双方还可以协商使用压缩的TCP和IP首部,以减少在链路上发送的比特数。
当网络层配置完毕后,链路就进入可进行数据通信的“链路打开”状态。链路的两个PPP端点,可以彼此向对方发送分组。两个PPP端点还可发送回送请求LCP分组和回送回答LCP分组,以检查链路的状态。
数据传输结束后,可以由链路的一端发出终止请求LCP分组请求终止链路连接,在收到对方发来的终止确认LCP分组后,转到“链路终止”状态。如果链路出现故障,也会从“链路打开”状态转到“链路终止状态”。当调制解调器的载波停止后则回到“链路静止”状态。
PPP协议已不是纯粹的数据链路层协议,它还包含了物理层和网络层的内容。
总结
当读者耐心读完本篇文章后,可以初步理解数据链路和帧的一些基本概念,重点需要理解封装成帧,透明传输,差错检验的原理。此外,读者仍然需要仔细阅读点对点协议PPP的相关知识点,深入理解其原理。
相关文章:

精炼计算机网络——数据链路层(一)
文章目录 前言3.1 数据链路和帧3.1.1 数据链路和帧3.1.2 三个基本问题 3.2 点对点协议PPP3.2.1 PPP协议的特点3.2.2 PPP协议3.2.3 PPP协议的工作状态 总结 前言 上篇文章,我们一同学完了物理层的全部内容,在本篇文章中,我们初步学习数据链路…...

猿创征文|Spring系列框架之面向切面编程AOP
⭐️前面的话⭐️ 本篇文章将介绍一种特别重要的思想,AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。 …...
IoT架构设计
当前有一个支持5000万用户并发访问的网站,每个用户都有一个IOT设备,用户可以查看设备状态,接受设备通知 1.架构设计 针对不同的业务量模型,可以采用不同的架构设计,如下: 低业务量模型 针对低业务量模型…...

EasyRecovery16电脑硬盘数据恢复软件功能讲解
硬盘是很常见的存储数据的设备,硬盘中很多重要的数据一旦丢失会很麻烦,不过现在有硬盘数据恢复软件可以自行在家恢复数据。今天的文章就带大家来看看硬盘恢复数据的软件EasyRecovery。 EasyRecovery 是一款专业的数据恢复软件,支持恢复不同存…...

信道通信基础 - 传输介质(双绞线、光纤)
文章目录 1 概述2 传输介质2.1 双绞线2.2 光纤 3 扩展3.1 网工软考真题 1 概述 2 传输介质 2.1 双绞线 双绞线:8 根铜导线每 2 根扭在一起(百兆用 4 根,千兆必须用 8 根)分类 2.2 光纤 光纤:利用光在 玻璃或塑料纤…...

黑马Redis原理篇
黑马Redis原理篇 1、数据结构1.1、动态字符串SDS1.2、IntSet1.3、Dict1.4、ZipList1.5、QuickList1.6、SkipList1.7、RedisObject1.8、五种数据结构1. String(小EMBSTR,大RAW (SDS),少量整数INT)2. List(Redis3.2之后使用QuickList实现&#…...
Sql Server增加字段、修改字段、修改类型、修改默认值
1、修改字段名: alter table 表名 rename column A to B 2、修改字段类型: alter table 表名 alter column 字段名 type not null 3、修改字段默认值 alter table 表名 add default (0) for 字段名 with values 如果字段有默认值,则需要…...

计算机网络第一章(谢希仁第8版学习)
作者:爱塔居 专栏:计算机网络 作者简介:大三学生,希望和大家一起加油 文章目录 目录 文章目录 一、网络、互连网、互联网(因特网)的概念 二、因特网的组成 三、交换方式 3.1 电路交换 3.2 分组交换 3.3 电路…...
Java反射机制
文章目录 Java反射机制一、反射的用处二、获取字节码文件对象的三种方式1.Class.forName形式2.class属性获取形式3.Student对象获取形式 三、获取构造方法四、获取成员变量五、获取成员方法六、反射的好处(面试题)七、反射的实例1.泛型擦除2.修改字符串的…...

New:dbForge Edge 2023 4in1 Enterprise Edition Crack
dbForge Edge 2023 4in1 Enterprise Edition 赋予自己开发和管理 SQL Server、MySQL、Oracle 和 PostgreSQL 数据库的广泛能力 dbForge Edge:您的终极多数据库解决方案 让我们来看看。您需要处理多个数据库管理系统。同时,您希望能够灵活有效地处理范围广…...

基于高效率IP路由查找的内容
访问【WRITE-BUG数字空间】_[内附完整源码和文档] 实现最基本的前缀树查找,调研并实现某种IP前缀查找方案,- 基于forwarding-table.txt数据集(Network, Prefix Length, Port) - 本实验只考虑静态数据集,不考虑表的添加或更新- 以前缀树查找结果为基准,检…...

【VLAN如何划分?6个方法帮你解决!好用又简单!】
如何选择交换机?如何根据项目确定网络结构?交换机做为大家工作中最常用的设备之一,关于它的选择,不得不知。 在做项目时都有这样的疑问,因为参数决定了项目预算,常用的园区组网技术也是多种多样。 我们来…...

网络通信概述 -了解网络编程,什么是ip和端口,url
网络:网络就是一种辅助双方或者多方能够连接到一起的工具。 左:单机游戏(无网络) 右:网络游戏 网络编程:网络编程就是,让在不同的电脑上的软件能够进行数据传递,即进程之间的通信。…...

【Windows线程开发】Windows线程同步技术
我们在上一章节中讲解了关于Windows的线程基础,相信大家已经对线程有了基本的概念。这一章节中,我们来讲讲线程同步技术,包括加锁技术(原子锁和互斥体)和事件,信号量。 文章目录 一.原子锁二.互斥体三.事件…...

【数据结构与算法】- 期末考试
课程链接: 清华大学驭风计划 代码仓库:Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的,其分为四门课,包括: 机器学习(张敏教授) , 深度学习(胡晓林教授), 计算…...

股票?看我用python采集数据制作成交量图表
前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 开发环境 & 第三方模块: 解释器版本: python 3.8 代码编辑器: pycharm 2021.2 requests: pip install requests 爬虫 pyecharts: pip install pyecharts 数据分析 pandas: pip install pandas 数据分析 基本流…...

C++中的多态,以及多态的实现、以及实现多态的两个特例。
一、 多态是什么? 通俗点说,就是多种形态。具体点就是不同对象完成某种事情,会产生不一样的状态。 举个例子:就好比:买票的时候,普通人、学生、军人等等,他们买票有不同的结果,普通人…...

ESP32-C2系列开发板简介
C2是一个芯片采用4毫米x 4毫米封装,与272 kB内存。它运行框架,例如ESP-Jumpstart和ESP造雨者,同时它也运行ESP-IDF。ESP-IDF是Espressif面向嵌入式物联网设备的开源实时操作系统,受到了全球用户的信赖。它由支持Espressif以及所有…...

AI在狂飙,ChatGPT-4可直接在iPhone上使用啦
今天凌晨,OpenAI 正式在 App Store 推出了 ChatGPT 的 iOS app,瞬间冲上苹果商店免费榜第二名,效率榜第一名。 于是兴致勃勃的去下载体验了一番。整体不错,以后手机使用官方的 ChatGPT 更方便啦!而且使用 GPT4 不再麻…...
【计算机操作系统学习资源汇总】
引言 做优秀资源的搬运工!阅读经典,传承经典! 每个人的水平和理解不同,因此总结的水平也不同,推荐阅读一手资源,有时间尽量啃书。 发现好的资源会持续更新… 看书的一点小建议 1. 《深入理解计算机系统》…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...