first commit

This commit is contained in:
张乾
2024-10-16 13:06:13 +08:00
parent 2393162ba9
commit c47809d1ff
41 changed files with 9189 additions and 0 deletions

View File

@ -0,0 +1,173 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
02 万丈高楼平地起- 物理层 + 数据链路层
物理层
本来是想要一层层的来介绍。但是物理层确实没有太多你需要知道的内容。你可以理解为就是物理连接如果面试问你网线怎么做的话转身就跑这是要让你去干苦力呀。还好TCP/IP模型也为我开了这个后门把这两层放到了一起叫做数据链路层所以我就可以冠冕堂皇的说我是按照TCP/IP来讲解的。
即使没有太多要讲的,还是要讲,存在即合理。说明物理层肯定是做了一些有作用的工作(只是作为工程师的你没有必要知道这些细节)。不然也就没有存在的必要了对不对,我们来试想一下,每一层是不是都有它的作用,物理层也必然如此。它的主要功能是什么呢?有以下几点。
硬件规格的定义:你能随便拿一根线就插在你的电脑上和网络连接吗?电脑和电脑之间连接用什么线呢?这些是不是都需要有规定,你能想到的常见硬件设备有什么?电缆,连接器,无线电收发器,网络接口卡和其他硬件设备的操作详细信息通常是物理层的功能。
编码和信号处理。其实我的本科主要学的就是信号处理(何为处理就是数学计算我那个时候高等数学玩的贼溜甚至选了一门课就是去证明高等数学里面教的这些公式是不是对的。郭德纲说过雅到极致就没饭吃了这个东西你算的再好不是做研究你觉得有必要吗我当年要不就是读博士要不就是读个硕士就工作了别问我为什么不是本科就工作因为我有追求呀其实是本科毕业的我只会算高等数学。其实我读博的话是去研究5G但是我太俗气了想赶紧工作。哈哈有点扯远了我就是为了告诉你们这个东西知道就好了你如果不是博士毕业的话或者是做硬件的信号处理这辈子基本不太会碰到这玩意。
数据收发数据说白了是什么就是一个个的信号。主要作用是传输比特流比特流就是01转化为电流然后到了目的地时候在转换回来但是错了怎么办呢不好意思物理层解决不了它只能传输
拓扑和物理网络设计物理层也被认为是许多与硬件相关的网络设计问题的领域例如LAN和WAN拓扑。
既然是物理层,就会涉及到实体,比如说双绞线呀,铜线呀,光纤呀,肯定不同的设备和材料传输的速度就是不同,但是这个专栏是针对程序员的,不是针对纯网络工程师,在这里就不多加赘述了。
数据链路层
我们上面提到的数据收发,只能传输,那出错了怎么办?谁来处理?正是因为可能出现的传输错误,数据接收者可能需要调节数据到达的速率, 处理同步以及接口交接的问题。所以需要一层来处理比如错误检测,流量控制,错误控制等,而这一层也就是我们要讲的数据链路层。
链路层还包括两小层(逻辑连接控制层(LLC)和媒体访问控制层也就是我们常说的MAC)。
MAC层在下面我们先说。
媒体访问控制MAC子层提供用于访问传输介质的控制。它负责通过共享的传输介质将数据包从一个网络接口卡NIC移动到另一个。物理寻址在MAC子层进行。 MAC也在这一层进行处理。这是指用于为计算机分配网络访问权限并防止它们同时传输从而导致数据冲突的方法。常见的MAC方法包括以太网网络使用的载波侦听多路访问/冲突检测CSMA / CDAppleTalk网络使用的载波侦听多路访问/冲突避免CSMA / CA和令牌环和光纤使用的令牌传递分布式数据接口FDDI网络。这里就不展开讲解了。
然后在向上就是逻辑连接控制层。如IEEE-802 LAN规范所述LLC子层的作用是控制各种应用程序和服务之间的数据流并提供确认和错误通知机制。然后LLC子层可以与许多IEEE 802 MAC子层进行对话。
下面我们来看一下这些功能
Flow Control(流量控制)
Flow Control是为了确保数据流的传输不会使接收方不堪重负。接收方通常会分配一些最大传输长度的数据缓冲区当数据收到了接收方必须要在传给上一层之前对一定的数据进行处理。 我们先来看一下正常的传输和有错误的是什么样子的。
那Flow Control是怎么来保证他的工作的有什么算法来解决这些问题呢
首先第一个叫做 Stop-and-Wait Flow Control(这些简单的英文我就不翻译了).
这是一个最简单的算法。从起点发送一个Frame到终点如果收到了就返回一个Ack。起点会等待收到上一个Frame的ack才会去发送下一个Frame。当然如果这个Frame比较大的话一般会分成多个小Frame。仔细想一下你能想到是什么原因吗
缓冲的大小是有限制的。
越大的文件越容易出错,越小的文件可以越早发现错误,当然也更容易重新传送。
还有一个就是在共用的媒介上比如LAN, 你如果发送一个越大的文件,是不是占用的资源时间就越长,你好意思自己霸占着不放吗,当然会有一个限时,时间太长,就会被踢走。那是不是不管重试多少次都没用。
第二个算法是Sliding-Window Flow Control.
第一种算法一次只能传送一个Frame很明显效率很低是不是一次性多传送几个会快很多呢就好像多线程一样记住知识都是相通的
好像上图所示比如一次性发送4个作为一个window。收到了两个可以ack两个然后起点再发两个始终保持一个窗口有四个Frame在发送中。这个算法我们后面还会用到而且面试中也会考Sliding Window的算法题感兴趣的同学自己试一下
Error- Control(错误控制)
我们当然希望一切都是那么的美好可以按照设定好的来走但是发生错误是再正常不过的事情了。那错误发生了应该怎么办重新发送就好了就好像你点外卖美团小哥给你弄撒了那咋办从做一份然后再送给你不就好了。这种方法叫做ARQ(automatic repeat request) 自动重发。
Stop-and-wait ARQ
这个就是基于Stop-and-wait Flow Control的算法。起点直到收到ack才会发下一个Frame. 当然终点收到Frame的时候会去检测出没出错误。通常会有两种错误。一种是到达终点的Frame已经损坏了。接收方通过某些方法知道出错了别问我怎么知道我就是知道。还是比如你点外卖我收到外卖后不和外卖小哥交流。也不告诉外卖小哥外卖坏了我就是傲娇我直接把外卖扔了。那卖家怎么知道出错了呢。他有一个时间表当到时间了发现还没有买家留评价说收到那就意识到出现问题了卖家会重新发送一份外卖。
那第二种的错误可能是什么仔细想一下。买家收到了外卖也完好无损但是当留评价的时候美团当机了或者买家自己的网断了发不出去评价了。那卖家那边的timer到时间了没有收到评价卖家怎么办它就要再发一份那买家收到第二份之后怎么告诉卖家呢他会留评价叫做ack0和ack1. 当ack1收到的时候是不是就可以发送下一份外卖了。这种情况只有Sliding-window flow control需要自己想一下为什么)。 当然这种算法最大的优点就是简单,缺点是什么,还是没有效率。
Go-Back-N ARQ
这是基于滑动窗口流量控制的最常用的算法。当没有错误的时候接收方会回应RR=receive ready。如果接收方发现Frame里面有错误比如FrameA会回复一个消极的ack。也就是REJ=reject。 接收方会扔掉这个坏掉的Frame以及在那之后所有的Frame直到收到正确的FrameA。所以发送方当他收到一个REJ的时候必须要立即重新发送FrameA。
根据我们第一种算法我们知道会有两种情况一种是Damaged Frame(出错的帧另一种是出错的RR。试想一下这个场景Frame (i - 1) 以及之前的所有Frame都没有问题现在开始传送Frame i了但是发生了错误。甚至这个错误可能导致接收方B 都没有感觉自己收到了这个Frame。
对于Damaged Frame a. 如果没有超时的问题接收方首先收到了Frame i+1发送回REJ给发送方发送方必须要重新发送i以及所有i之后的Frame。
b. 超时发生了那就是B什么都没有收到所以既没有发送RR也没有发送REJ. 那双方僵持的时间长了是不是就会发生超时这时候发送方就像暖男一样发送一个诚意满满的“道歉包”RR (包括玫瑰花也就是P bit 也就是1). B也不是小气的人对吧会回复一个RR 暗示A我们和好了你可以发送Frame i了。当A收到了就会重新发送Frame i了。
对于Damaged RR
a. B 收到了Frame i发送回RR(i + 1), 但是发生了错误比如RR 4的话说明所有的帧直到4都已经收到了A很有可能会收到下一个不同的RR可能是RR 5 可能是RR1,然后根据不同的RR来进行不同的处理 b. 如果A的timer超时了。效仿a2的情况。
对于Damaged REJ, 如果REJ丢了情况和a2相同。
Seletive-Reject ARQ
这种算法中唯一需要重新传的Frame是收到了一个SREJ的回复或者是超时这种算法比上一种要更高效因为减少了需要重传的量。具体可以看一下下面的图。
希望到这里你没有看睡着呀细心的朋友是不是发现我漏了什么我讲了发生了错误怎么办但是却没有讲怎么发现错误对不对哈哈那让我们来看一下错误是怎么被发现的。首先我们要知道什么是错误如果没有一个标准来定义对与错那怎么去找呢。我们知道物理层传输的是比特也就是0和1那么我要传送0但是你收到了1或者相反传送1你收到了0这就是错误。
常见的错误检测方式分为
奇偶校验Parity Check: 偶校验用于同步传输,奇校验用于异步传输
循环冗余校验Cyclic Redundancy check这是最常用也是最有效的方式利用的是XOR也就是异或运算。这里我先卖个关子在第二大章的二进制计算里面会帮你们彻底弄明白这个运算。算法面试也会考到哦
Frame 帧
我们这一章从头到尾都在使用一个名字那就是Frame你肯定会想知道Frame的格式是什么。
记住一点这很重要你试想一下在网络中传输的数据都是0和1那怎么来区分哪个是哪个呢这就是每一个packet或者说Frame或者说IP等等都会有的一个东东那就是header这些header里包含着我是谁我要去哪等等重要的信息。
Flag Filed
好我们来看一下Frame的头。从图上可以看到左右头和尾都有一个Flag的区域这个Flag使用的是01111110来作为唯一的模式。在用户网络接口的两侧接收器不断寻找Flag的序列来进行帧的同步。在接收帧的同时会继续搜寻该序列以确定帧的结尾这个结尾就是上面提到的那个标识01111110。因为该协议允许存在任意位模式你不能保证01111110这个模式不会被用到别的地方也就是说在Information区域可能会出现01111110的信息。这里害怕你迷糊来多说两句这个01111110没有什么特殊的只是选它作为标识你可以选择00111100作为标识或者是二狗子作为标识。这只是一个定义所以你不能限制这个标识不出现在其他的地方。但问题是如果这个01111110出现在别的地方是不是就破坏了帧的同步因为接收方只知道寻找01111110作为头和尾。那这个问题怎么解决呢这里使用的解决方法叫做bit suffing
bit suffing 比特填充的首尾标志法
对于开始标志和结束标志之间的所有位发送器在帧中每出现5个1后插入一个额外的0位。当出现五个1的模式时第六位被检查。如果该位为0则将其删除。如果第六位和第七位均为1则发送方指示中止条件。通过使用位修饰可以将任意位模式插入帧的数据字段。此属性称为数据透明属性。看一下下面这个例子。
Address Filed 地址字段标识
好看完了Flag位下面是Address位。地址字段标识作为已发送或将要接收帧的辅助位。点对点链接不需要此字段但为了统一起见始终包含此字段。地址字段通常为8位长。但可以使用扩展格式如图其中实际地址长度为7位的倍数。每个八位位组的最左位是1或0这取决于它是否是地址字段的最后一个八位位组。每个八位位组的其余7位构成地址的一部分。 1111111的单字节地址被解释为基本格式和扩展格式的全站地址。它用于允许主要节点广播帧以供所有辅助节点接收。
Control Filed 控制位标识
HDLCHigh-level Data Link Control)定义了三种类型的Frame。每一种Frame都有自己独有的控制位标识。
信息帧 Information Frames):携带要为用户传输的数据。另外流和错误控制数据根据arq机制被附加在信息帧上。
管理帧 (Supervisory Frames) : 不使用搭载时提供arq机制。
无编号帧 Unnumbered Frames):提供补充的链接控制功能。
Inforamtion Field 消息标识
这个消息标识只在信息帧和一些无编号帧上存在。该字段可以包含任何位序列,但必须包含整数个八位位组。信息字段的长度是可变的,可以大到系统的最大值。
Frame Check Sequence Field 帧检查序列字段
帧检查序列字段是从帧的其余位(不包括标志)计算出的错误检测代码。
总结一下。数据链路层的主要功能就是以下几点。
处理比特传输发生的错误。
它确保数据流的传输速度不会使发送和接收设备不堪重负。
它允许将数据传输到网络层的第3层并在其中进行寻址和路由。
我个人是希望你们可以把这些原理理解的很透彻,但是如果不能,也不用强求,面试的时候,可以和面试官把几种算法讲出来,哪种好,好在哪里就可以了,因为你的面试官也不一定会。好,我们下一节再见。

View File

@ -0,0 +1,202 @@
因收到Google相关通知网站将会择期关闭。相关通知内容
07 1+1 = 2吗 - 二进制的计算
Hello, 大家好希望上一节课的基础大家都已经掌握了。那我们就来继续这一小节的学习来看一下1+1=2这一道永远的难题。
二进制的运算 - 加法和减法
加法
加法从基础来说和普通数字的加法也没有什么太大的区别。加法都是从右向左一次一个数。在每一个点上都会生成一个和的数字以及一个要进位的数字。当然我们这里不是每到9才产生一个进位而是每到2就会产生一个进位。那我们现在来做一道小小的加法11 + 3 = 你肯定知道是14吧。哈哈。那让我们来看一下在二进制里是怎么做呢
11 的二进制表达式 -> 01011
3 的二进制表达式 -> 00011
相加的结果 -> 01110
复制
01110 = 什么呢? 1 * 8 + 1 * 4 + 1 * 2 = 14。我们来验证一下上面的加法从右向左1+1是不是要进位所以最右是一个0然后第二位有三个1那就留下一个1在进位1个1就成为了10然后1+0等于1 - > 110之后又是一个1 + 0 = 1所以结果就是1110了是不是很简单。
减法
下面我们再来看一下减法减法实际上就是加法的变种只不过就是A + -B。好我们来看一下这个例子14 - 9。在这里我们要插播一下补码和反码的小知识要不然你完全无法理解-9是怎么用二进制来表示
小知识课堂
原码
什么叫原码可能提到原码你能想到的是底层源码比如java的源码是什么spring的源码是什么但是因为我们中文的博大精深所以会造成这个误解但是你看字的话很明显有不同是不是。那这里的原码是指什么呢话语千遍不如一个实例。
对于正数来说,原码就是自己,比如
我们来用9来作为实例。00000000 00000000 00000000 00001001是9的原码
那-9的原码呢其实就是在最高位加一个1。
这里1表示负数0表示正数 100000000 00000000 00000000 00001001是-9的原码
复制
这里的最高位是你自己来选择是作为数值还是作为符号比如一个byte类型的话有8个字节。0000 0000如果不使用符号位的话数值就是从0到2550就是0000 0000255就是1111 1111。如果使用符号位的话范围就是-127 到 127。1111 1111 因为第一位是符号位所以表示负数然后后面的7个1表示127所以值是-127。然后0111 1111也就是正数的最大位等于127。所以范围就是-127到127。
我相信聪明的你这时候会有一个疑问,为什么负数不能直接用原码,而有什么之后要讨论的反码,补码?
那是因为原码有它的弱点
首先0是两个那就是会有两个0,也就是+0和-000000000和10000000
当要进行异号相加或同号相减时,方法比较笨拙- 先要判断2个数的绝对值大小然后进行加减操作最后运算结果的符号还要与大的符号相同。于是,反码产生了。(每一个概念的出现都是为了解决一个问题,对不对)
反码
反码也是属于数值存储的一种多应用于系统环境设置如linux平台的目录和文件的默认权限的设置umask就是使用反码原理。在计算机内定点数有3种表示法原码、反码和补码。
对于正数来说,反码与原码相同(正数是多么善良和正义的存在)。
负数的反码是对该数的原码各位取反(符号位除外)。比如
100000000 00000000 00000000 00001001 的反码
111111111 11111111 11111111 11110110
复制
因为反码 还是有+0和-0这个问题。但是不修改的话就会被时代所淘汰反码就成为了过滤产物,也就是, 后来补码出现了。
补码
首先是谁也不怎么认真读的概念:补码表示统一的符号位和数值位,使得符号位可以和数值位一起直接参与运算,这也为后面设计乘法器除法器等运算器件提供了极大的方便。
对于正数来说,补码与原码相同(正数才是正道的光)。
负数的补码是对该数的原码各位取反符号位除外。然后在最后一位加1。比如
100000000 00000000 00000000 00001001 的补码加一之前是
111111111 11111111 11111111 11110110 然后再加上一
111111111 11111111 11111111 11110111
复制
现在让我们再回归到上面讲的那个减法。我们的例子是14 - 9。好现在让我们来分析以下。
14是一个正数所以基本上不太会有任何的trick。
00000000 00001110
下面让我们来分析一下-9。
首先是9 -> 00000000 00001001
-9 10000000 00001001
反码 11111111 11110110
补码 11111111 11110111
+00000000 00001110 这个是之前的14
00000000 00000101 这个是最后的结果。不用我说你也能算出来结果是5吧。
复制
所以我们做减法的顺序是
把要减的数的正数算出来
把第一个最高位变成符号位1
把这个数的反码写出来
把这个数的补码写出来
把这个补码和之前的正数进行相加。
最后的结果就是相减的结果
希望你读到这里,头还没有晕
二进制的运算 - 逻辑计算
AND运算
AND是二进制的逻辑运算法这意味着它需要两个输入的数值。也可以认为AND需要两个来源。它的运算很简单。基本的原则是
A B AND
0 0 0
0 1 0
1 0 0
1 1 1
复制
从上图你可以看出只有A和B同时都是1的时候AND的结果才是1。你可以把它想象成一个串行电路。一前一后两个电路。只有两个电路同时通的时候整体才会通电有任何一个不能通电的话那就不成功。虽然很简单还是给你们一个例子吧。我要做一个严谨的人。
00111010 01101001 A
01011001 00100001 B
00011000 00100001 And之后的结果
复制
OR运算
OR是二进制的另一个重要的逻辑运算法它的需求和AND一样需要两个输入的数值。它的运算也很简单。基本的原则是
A B OR
0 0 0
0 1 1
1 0 1
1 1 1
复制
从上图你可以看出只要A和B任意一个是1的时候OR的结果就是是1。你可以把它想象成一个并行电路。上下两个电路。只要有一个电路通的时候整体就会通电只有两个都不通电的时候才会不成功。同样是一个小例子
00111010 01101001 A
01011001 00100001 B
01111011 01101001 OR之后的结果
复制
NOT运算
OR是二进制的另一个重要的逻辑运算法它只需要一个输入就可
A NOT
0 1
1 0
复制
Exclusive-OR运算
Exclusive-OR通常也简写成XOR。当然它也是一个逻辑运算符。同样需要两个输入。当然它的结果可能是有一点和你平时的计算不同。只有当两个输入不同的时候才会是1。相同的话就会是0。
A B XOR
0 0 0
0 1 1
1 0 1
1 1 0
复制
这几种逻辑运算符中最最复杂的可能就是这个。我们还是看一个小案例
00111010 01101001 A
01011001 00100001 B
01100011 01001000 XOR之后的结果
复制
其实这一小节还是属于基础只不过不是二进制的基础而是二进制计算的基础。我们讲了原码反码和补码加法减法以及逻辑运算。小朋友你是不是有很多问号你的小脑瓜一定在想这些有什么用我可以负责任的告诉你。IP的计算会用到。电路的计算会用到。因为二进制归根到底就是电流。那个就有点扯远了。还有一个最重要的就是算法的考试和面试也会问到。而往往二进制的算法题不长但是不练习或者不知道基础的你往往想不到。我们下一节来看一下16进制然后我会给你们举一些面试的时候会问到问题。