520发送的”我爱你“在传输时咋没变成”我恨你“?计算机网络(三)之数据链路层

大家好,我是后来,我会分享我在学习和工作中遇到的点滴,希望有机会我的某篇文章能够对你有所帮助,所有的文章都会在公众号首发,欢迎大家关注我的公众号" 后来X大数据 ",感谢你的支持与认可。

又拖更了,说的昨天更,结果昨晚没写完。实在是尴尬!
最近关于计算机网络的文章,可能是比较长,而且术语比较多,几个朋友都和我说看不懂。

个人想法,也说给自己听:我们每天在碎片化时间阅读的公众号上文章,除了获取资讯外,关于知识类的文章,更多的是在消耗时间,并不能通过一篇文章就掌握这个知识点,所以如果我们能在这些文章中找到一些自己感兴趣的文章,并愿意付出时间去研究,才有可能真正的理解和掌握作者花了若干时间写的一篇文章。

所以,如果有想学习或了解计算机网络,那可以认真看一看我写的文章,我觉得已经过滤了很多难点。
在这里插入图片描述
接下来我们进入正题,数据链路层是干啥的?

关于数据链路层的概念

先来思考一个问题,我的文章转换为0和1在传输的过程中,会不会有个别0或者是1在传输过程中0变成1,1变成0,那不就导致数据错误了么?

数据链路层,属于在物理层之上,那具体什么是数据链路层呢?那有2个概念是需要清楚的

链路从一个结点到相邻结点的一段物理线路(有线或无线),而中间没有仼何其他的交换结点。在进行数据通信时,两台计算机之间的通信路径往往要经过许多段这样的链路。可见链路只是一条路径的组成部分。

数据链路:当需要在一条线路上传送数据时,除了必须有一条物理线路外,还必须有一些必要的通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。

那也就是说:数据链路=若干链路+协议(包含实现协议的硬件+软件)
在这里插入图片描述
现在最常用的方法是使用网络适配器(既有硬件,也包括软件)来实现这些协议。一般的适配器都包括了数据链路层和物理层这两层的功能----后面会着重讲适配器。

也有人把链路分为物理链路和逻辑链路。物理链路就是上面所说的链路,而逻辑链路就是上面的数据链路,是物理链路加上必要的通信协议。

数据链路层使用的信道主要是2种方式

  1. 点对点信道
  2. 广播信道

数据链路层的基本问题

搞清楚这个之后,那么我们就知道,在2台主机通信的时候,数据就是在若干段的链路上进行传输,但是比如我要发的是我爱你,机器怎么知道从哪到哪是一个字符呢?也就是说怎么检测我收到的数据是否无差错呢?

数据链路层协议有许多种,但有三个基本问题则是共同的。这三个基本问题是:封装成帧、透明传输和差错检测。下面分别讨论这三个基本问题。

封装成帧

帧:是点对点信道的数据链路层的协议数据单元
封装成帧就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。相当于做个首尾标记,也称为帧定界(确认帧的界限)那么帧的数据部分长度上限,也叫做最大传送单元MTU,相当于一个帧中数据部分的长度单元。在这里插入图片描述
那么问题来了,用什么标记做为定界符呢?

ASCII码一共有128位,其中可以打印的有95个,不可打印的占了33个。这样的话当我们的数据部分是由这可打印的95个字符构成时,使用不可打印的33个字符作为定界符就不会发生冲突了,这个主意太棒了。

我们把帧开始符称为SOH,帧结束符称为EOT
在这里插入图片描述
那么假如在帧的传输过程中,发送端没发完一个帧就终端了发送,但很快又恢复了正常,这样的话刚刚中断的哪个帧由于没收到帧结束符,就认为是不完整的帧,就会直接进行丢弃。

透明传输

我们上面说的太理想了,事实上,由于现在发送的很多数据都是二进制的,那么就可能会导致,数据部分中的部分字节的二进制代码恰好和帧的开始符与结束符一样,那么数据链路层就会错误的找到帧的边界,把部分帧收下,而剩下的那部分数据则会因为帧不完整直接丢弃,造成数据的错误。
在这里插入图片描述
这个问题怎么解决呢?核心目的是:数据中可能出现的控制字符在接收端不会被解释为控制字符。

解决方案就是:在数据中出现的控制字符前面加一个转义字符就可以了。 在接收端的数据链路层收到数据后把数据送到网络层时删除掉这个转义字符就可以了,这也称为字节填充或者字符填充。
在这里插入图片描述
那么如果这个转义字符也正好是数据的一部分怎么办,那就俄罗斯套娃,前面继续加一个转义字符,接收端收到连续2个转义字符时,就会删除其中前面的一个

差错检测

我们在上面只是对帧的控制字符进行了讨论,认为一个帧传送之后只要帧的开始符和结束符在就认为帧是完整的,那不太安全,万一其中的数据部分丢失了一个bit怎么办?,称为比特差错。
比如 你发给对象的“我爱你”在传输过程中不会因为个别0或者1的错误变成“我恨你”?

我爱你=111001101000100010010001 111001111000100010110001 111001001011110110100000
我恨你=111001101000100010010001 111001101000000110101000 111001001011110110100000

所以要进行检测,目前使用比较多的有循环冗余检验CRC检测技术,具体怎么实现的跳过。感兴趣的可以自己研究下。

但是,在数据链路层仅仅使用CRC技术检测,只能做到检测帧是不是有差错,但是如果说收到的帧是没错,但是出现了帧丢失、帧重复、帧乱序。比如我们例子中的“我爱你”的个别0或1丢了。

假如:发送方连续发送三个帧:[#1][#2][#3]。假定接收端收到的每一个帧都没有比特差错,但却出现下面的几种情况
​帧丢失:收到[#1][#3]。
帧重复:收到[#1]-[#2][#2]{#3](收到两个[#2])
帧失序:收到[#1][#3][#2](后发送的帧反而先到达了接收端)

这种情况我们在之后的运输层给大家解释,有人可能会疑问,这不应该就是数据链路层的事儿么,怎么还给了运输层,原因是,之前OSI认为必须让数据链路层向上提供可靠传输,所以就在CRC的基础上,还增加了帧编号、确认以及重传机制,试图来解决这个问题。

但是吧,现在的通信线路的质量基本上没啥差错,这么搞的话影响效率,所以现在就开始分情况实施只在通信线路质量差的地方采用确认和重传机制通信质量好的地方的话,如果数据传输出现差错,那么改正的任务由运输层的TCP协议来完成。这就是甩锅啊,哈哈,不过这样做确实提高了通信效率。所以我们目前的数据链路层大多都是不可靠传输,我们今天也是讨论的这种情况。

点对点协议PPP

接下来我们来说一个经典的点对点协议PPP,这是目前用的最广的数据链路层协议
在这里插入图片描述
我们来看它是怎么解决上面的3个问题的

PPP协议的帧格式

PPP协议有三个组成部分:

(1)一个将IP数据报封装到串行链路的方法。
(2)一个用来建立、配置和测试数据链路连接的链路控制协议LCP( ink controlProtocol)。通信的双方可协商一些选项。
(3)一套网络控制协议NCP( Network Control Protoco),其中的每一个协议支持不同的网络层协议,如IP、OSI的网络层、 DECnet,以及 AppleTalk等。

那我们看完专业术语,看不懂没关系,来一个一个分析

封装成帧

在这里插入图片描述

  1. 首部和尾部分别为4个字段和2个字段。首部的第一个和尾部的第二个都是标志字段F,规定为0x7E(16进制表示),用来表示一个帧的开始或结束。

  2. 首部中的地址字段A规定为0xFF(即11111111),控制字段C规定为0x03(即0000011)

  3. PPP首部的第四个字段是2字节的协议字段。当协议字段为0x0021时,PPP帧的信息字段就是IP数据报。若为0xC021,则信息字段是PPP链路控制协议LCP的数据,而0x8021表示这是网络层的控制数据。

  4. 信息字段的长度是可变的,不超过1500字节。

  5. 尾部中的第一个字段(2字节)是使用CRC的帧检验序列FCS

字节填充

异步传输时,转义字符定义为0x7D(即01111101)

  1. 数据中出现帧标志字段,0x7E字节,那就转变成为2字节序列(0x7D,0x5E)。
  2. 数据中出现一个转义字符,0x7D字节,则把0x7D转变成为2字节序列(0x7D,0x5D)
  3. 数据中出现ASCII码的控制字符,则在该字符前面要加入一个0x7D字节,同时将该字符的编码加以改变。

零比特填充

同步传输时,也就是一连串的比特连续传送,而不是逐个字符的传送。
这个时候只要发现5个乱序的1,就会填入1个0,这样就保证不会出现6个连续的1。
在这里插入图片描述

PPP协议的工作状态

那么来说一下PPP协议的工作状态,它一开始是怎么初始化的

我来说句人话:两台主机A和B本来呢各自安好,但是现在A非要勾搭B,那么就要在A和B之间建立物理链路,那我们就让他俩都联网,这个时候呢,A呢就开始发一句话给B,数据就打包成了PPP帧,这里面就包括LCP配置选项,于是建立链路层的LCP连接,接着就进入鉴别协议,没问题的话建立网络层协议NCP链路,然后交换数据。
在这里插入图片描述

广播信道的数据链路层

接下来说广播信道的数据链路层,广播这个词大家应该都清楚,就是一个人说,其他人听。

在这里我们指的是,在同一时刻,只能有1个用户对外发送信息。其实局域网使用的就是广播信道。

局域网:网络是一个单位所有的,地理范围和站点数目有限。

我这里举个例子,比如你家拉个网线,插到了路由器上,那么连接无线的人和直接电脑连路由器的人就属于是一个局域网,因为你们对外只有一个网络ip地址。

常用的局域网的网络拓扑有星形网、环形网(最典型的就是令牌环形网)和总线网,现在最流行的是星形网

在局域网发展的早期,人们都认为有源器件比较容易出故障,因而无源的总线结构一定会更加可靠。星形拓扑结构的中心使用了有源器件,人们就认为这比较容易出故障,而要使这个有源器件少出故障,必须使用非常昂贵的有源器件。然而实践证明,**连接有大量站点的总线式以太网,由于接插件的接口较多,反而很容易出现故障。**现在专用的ASIC芯片的使用可以把星形结构的集线器做得非常可靠。因此现在的以太网一般都使用星形结构的拓扑。
在这里插入图片描述
那么既然是广播信道,那么意味着这么多用户需要共享信道,那怎么分配资源呢?

  1. 静态划分信道:利用前面物理层我们学习的频分复用、时分复用、波分复用等,这样的话用户只要获取到了信道就不会和其他用户发生冲突。但是代价太大,不适合局域网使用。

  2. 动态媒体接入控制:

    1)随机接入:所有的用户都可以随时发消息,但要是恰好有多个用户在同一时刻发消息,那就会都失败,所有就必须要有一个协议来进行约定。

    2)受控接入:用户不能随机发消息,必须服从控制,比如说是轮询,我挨着问一遍。

目前用的最多的就是随机接入

传统以太网就是最早流行的10Mbit/s速率的以太网,不过现在的速率已经演变为了Gbit/s甚至100Gbit/s,我们这里说原理还是用传统以太网吧。

以太网的标准有2套,一套是DIX V2,一套是IEEE802.3,区别也不大,因此很多人也常把802.3 局域网简称为“以太网”。反正现在用的都是DIX V2的,具体的发展过程都是商业竞争,这里就不说了。所以最后的适配器上只有MAC协议,并没有IEEE802.2 标准的LLC协议。

适配器是干啥的,大家应该在各自电脑的网络控制中心那里见到过这个选项,但它到底是干啥的
在这里插入图片描述
其实之前吧,不叫适配器,是一块可插拔的网络接口卡,称为网卡,不过现在的主板集成度高了,不再使用单独的网卡了。现在主板上都嵌入了适配器,这个适配器上装有处理器和存储器,它的重要功能是要进行数据串行传输和并行传输的转换。它实现的功能包含了数据链路层和物理层。但是现在的芯片的集成度比较高,没法按照功能严格划分开,所以我们这里就全都讲了。
在这里插入图片描述
适配器在接收和发送各种帧时,不使用计算机的CPU。这时计算机中的CPU可以处理其他任务。当适配器收到有差错的帧时,就把这个帧直接丢弃而不必通知计算机。当适配器收到正确的帧时,它就使用中断来通知该计算机,并交付协议栈中的网络层。当计算机要发送IP数据报时,就由协议栈把IP数据报向下交给适配器,组装成帧后发送到局域网。上图表示适配器的作用。

我们特别要注意,计算机的硬件地址MAC地址就在适配器的ROM中,而计算机的软件地址——IP地址则在计算机的存储器中。

CSMA/CD协议

我们在上面说了这个随机接入可能会引起相互冲突的问题,那怎么处理?

  1. 无连接的工作方式
    我直接说人话吧,就是谁想发谁发,但要是冲突了,就等别人不发了你再发,称为载波监听多点接入/碰撞检测

    “载波监听”就是用电子技术检测总线上有没有其他计算机也在发送。不管在发送前,还是在发送中,每个站都必须不停地检测信道在发送前检测信道,是为了获得发送权。如果检测出已经有其他站在发送,则自己就暂时不许发送数据,必须要等到信道变为空闲时才能发送。在发送中检测信道,是为了及时发现有没有其他站的发送和本站发送的碰撞。这就称为碰撞检测。

    既然每一个站在发送数据之前己经监听到信道为“空闲”,那么为什么还会出现数据在总线上的碰撞呢?这是因为电磁波在总线上总是以有限的速率传播的。这和我们开讨论会时相似。一听见会场安静,我们就立即发言,但偶尔也会发生几个人同时抢着发言而产生冲突。而听见没声音这也需要时间
    电磁波在1KM同轴电缆的传播时延约为5μs,我们把总线上单程端到端的传播时延记为r(这个符号我是真的不会打)
    大家看下图
    在这里插入图片描述

    1. 在t=0时,A发送数据。B检测到信道为空闲。
    2. 在t=r-δ时(这里r>δ>0),A发送的数据还没有到达B时,由于B检测到信道是空闲的, 因此B发送数据。
    3. 经过时间δ/2后,即在t=r - δ/2时,A发送的数据和B发送的数据发生了碰撞。但这时A和B都不知道发生了碰撞。
    4. 在t=r时,B检测到发生了碰撞,于是停止发送数据。
    5. 在t=2x-δ时,A也检测到发生了碰撞,因而也停止发送数据
    6. A和B发送数据均失败,它们都要推迟一段时间再重新发送
      我们发现A最多需要2r的时间才能知道数据发生了碰撞,所以把这段时间称为争用期,也叫做碰撞窗口,只有通过争用期的“考验”,即经过争用期这段时间还没有检测到碰撞,才能肯定这次发送不会发生碰撞。这时,就可以放心把这一帧数据顺利发送完毕。

以太网使用截断二进制指数退避算法来确定碰撞后重传的时机。这种算法让发生碰撞的站在停止发送数据后,不是等待信道变为空闲后就立即再发送数据,而是**推迟(这叫做退避)**一个随机的时间。这点很容易理解,因为如果几个发生碰撞的站都在监听信道,那么都会同时发现信道变成了空闲。如果大家都同时再重新发送,那么肯定又会发生碰撞。所以退避算法可以使各站进行重传时再次发生冲突的概率减小。

但是这里面又有个问题,某个站发送了一个很短的帧,但在发送完毕之前并没有检测出碰
。假定这个帧在继续向前传播到达目的站之前和别的站发送的帧发生了碰撞,因而目的站将收到有差错的帧(当然会把它丢弃)。可是发送站却不知道这个帧发生了碰撞,因而不会重传这个帧。这种情况显然是我们所不希望的。为了避免发生这种情况,以太网规定了一个最短帧长64字节,即512bit。如果要发送的数据非常少,那么必须加入一些填充字节,使帧长不小于64字节。对于10Mbt以太网,发送512bt的时间需要512ps,也就是上面提到的争用期
因此凡长度小于64字节的帧都是由于冲突而异常中止的无效帧。只要收到了这种无效
帧,就应当立即将其丢弃。

同时以太网还规定了帧间的最小间隔是9.6μs,相当于是96比特时间,可以使得刚刚收到数据帧的站的接收缓存来得及清理,做好接收下一帧的准备。

  1. 曼彻斯特编码:
    在这里插入图片描述
    从高低压到低电压,代码1,从低电压到高电压代变0,这样就保证了在每一个码元的正中间出现一次电压的转换,而接收端就利用这种电压的转换很方便地把位同步信号提取出来。但是从曼彻斯特编码的波形图也不难看出其缺点,这就是它所占的频带宽度比原始的基带信号增加了一倍(因为每秒传送的码元数加倍了)。

使用集线器的星形拓扑

我们前面说了,现在主要使用的还是星形结构,之前是因为中间的源器件不稳定,但现在随着技术的进步,有了一种可靠性非常高的设备,那就是集线器。
在这里插入图片描述
1990年IEEE制定出星形以太网10 BASE-T的标准802.3i。“10”代表10Mbit/s的数据率,BASE表示连接线上的信号是基带信号,T代表双绞线。所以这种性价比很高的10BASE-T双绞线以太网的出现,是局域网发展史上的一个非常重要的里程碑。从此,以太网的拓扑从总线变成了星形。
那么这集线器这么牛逼,到底是咋玩的:
1、集线器使用了电子器件来模拟实现电缆线的工作,所以在逻辑上仍然是一个总线网,各站共享逻辑上的总线,使用的还是CSMA/CD协议。并且同一时刻最多只允许一个站发送数据。
2、一个集线器的接口多到8-16个,通过RJ-45插头与双绞线和适配器相连,所以,它像一个多接口的转发器。
3、集线器工作在物理层,他的每个接口只是转发比特,收到1就转发1,收到0就转发0,不进行碰撞检测。一旦碰撞,所有接口都收不到正确的帧。
4、专门的芯片进行自适应串音回波抵消。

以太网的MAC层:

硬件地址被称为物理地址或者是MAC地址,局域网的”地址“应该是每一个站的”名字“或标识符,这就相当于说A给B发消息,不会发给C,因为有B的mac地址。

现在IE的注册管理机构RA是局域网全球地址的法定管理机构,它负责分配地址字段的6个字节中的前三个字节(即高位24位)。世界上凡要生产局域网适配器的厂家都必须向IEEE购买由这三个字节构成的这个号(即地址块),这个号的正式名称是组织唯一标识符OUI,通常也叫做公司标识符。例如,3Com公司生产的适配器的MAC地址的前三个字节是0260-8c0。地址字段中的后三个字节(即低位24位)则由厂家自行指派。

说人话就是:MAC地址一共6个字节,每个字节8位,一共是48位,前24位是买的,每个企业一个,也可以买多个,但这个MAC地址不重复,后面的3个字节,企业自己分配,小企业可以团购前3位字节。

同时地址字段的第一个字节的最低位为I/G位,0代表单个站地址(个人),1代表组地址(企业、学校等单位)。

同时还担心有人不买OUI,就把第一字节的最低第二位规定位G/L位,0代表是全球管理,保证全球不重复,1是本地管理。

所以还剩下46位,也就以为这一共可以有2的46次个MAC地址,超过70万亿个,到目前为止还是可以保证每一个适配器都有一个唯一的地址。但是以后就不知道了。

下面的这就是MAC帧的格式,我们上面讨论的MAC地址,就是下图中的目的地址和源地址。
在这里插入图片描述
2字节的类型字段,用来标志上一层使用的是什么协议。最后一个字段是4字节的帧检验序列FCS(使用CRC检验)

扩展的以太网

刚刚说了上面的局域网其实覆盖范围是有限的,因为10BASE-T 以太网的两台主机之间的距离不超过200米,不然CSMA/CD协议没法正常工作,不过随着技术的发展,现在直接使用光纤连接2个光纤调制解调器,这样的话,扩大了以太网覆盖的地理范围,但是也带来了问题。
在这里插入图片描述
比如下图,大学里面的以太网,本来吧是因为线的问题覆盖不到,所以只能每个系一个以太网,现在可以使用光纤了,所以把多个集线器连起来,形成一个大的以太网,但是合起来后这3个系相当于处于了一个碰撞域,同一时刻还是只能由1个用户发消息,效率还是太低。
说明这个是错误操作。
在这里插入图片描述

以太网交换机

所以扩展以太网更常用的方法是使用以太网交换机,它具有并行性,因为他能把收到的帧暂存一下,以后再发送出去,这样就避免了碰撞,简称为存储转发方式
而且它还能自学习,就是用户使用交换机时,直接插上就可以,完全不需要设置,自己会去检测地址,然后记录下来。
在这里插入图片描述
那么我们发现以太网都没使用共享总线模式,所以没有碰撞问题,因此也不使用CSMA/CD协议,而是以全双工方式工作。那么为啥还叫以太网,是因为他的帧结构未改变,仍然采用以太网的帧结构。

虚拟局域网

使用以太网交换机后,技术又大变革,可以很方便的实现虚拟局域网VLAN,如下图,需要A1-4是一个局域网,这咋办呢?
在这里插入图片描述
直接在帧的首部插入一个4字节的标识符,称为VLAN标记,来指明发送该帧的计算机属于哪一个虚拟局域网。
在这里插入图片描述

高速以太网

我们前面说的是传统以太网,速率是10Mbit/s,现在常用的以太网都是速率为1Gbit/s的吉比特以太网,甚至是更快的以太网。

然而IEE802.3u的标准未包括对同轴电缆的支持。这意味着想从细缆以太网升级到快速以太网的用户必须重新布线。因此,现在10/100Mbs以太网都使用无屏蔽双绞线布线。

而使用以太网进行宽带接入,你们试过拨号上网么,就是这玩意,但现在也基本没人用,因为它也不属于是以太网上网,而是利用电话线宽带接入互联网的。

所以总结一下,虽然上述中关于局域网的技术发生了很大的变化,但有一个是一直延用的,那就是帧传输。

所以在题目中说到的,我发送的“我爱你”在传输的时候,它虽然被转换为了0 和1,同时也是按照帧传输的,传输结束后还会进行CRC等方式的检测,看是否完整及错误。至于发送的帧丢失以及乱序我们后续在网络层继续讲。

我在学习的过程中发现,技术的发展往往是通过1个点的突破而实现了整个技术的进步。我一直不喜欢用标题党的方式来命题,比如说什么 X天学会计算机网络等,因为这些个技术还真的是比较复杂的,不认真学习还真搞不懂。在技术领域,我们都要有一颗谦卑的心。

扫码关注”后来X大数据“,回复【电子书】,领取【超多本pdf java及大数据 电子书】

在这里插入图片描述

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值