YB体育计算机网络基础(二) 数据链路层之封装成帧、透明传输、差错检测、交换机和局域网广播
发布时间:2024-02-01 09:13:18

  YB体育计算机网络基础(二) 数据链路层之封装成帧、透明传输、差错检测、交换机和局域网广播

  上一节我们介绍了计算机网络的基本概念以及协议栈分层,我们知道按照TCP/IP协议来说,协议栈可以分为物理层、数据链路层、网络层、传输层和应用层。接下来的章节里我们将自底向上的介绍每一层的功能、特点和与之相关的协议。由于物理层过于硬件化YB体育,对于IT从业者来说基本接触不到,因此我们跳过,本节将介绍数据链路层。

  对网络层数据报的前后添加首部和尾部构成一个帧(部分类型的帧只有帧首没有帧尾,如MAC帧),首部尾部作用是进行帧定界,有了首部和尾部,网卡才能从一长串01电信号中确认帧的界限。

  帧首部和帧尾部本质是2个控制字符,控制字符SOH(start of header)放在一帧的最前面表示帧的首部开始(第一个字符),控制字符EOT(end of transmission)表示帧的结束(最后一个字符)。

  不同类型的帧,其SOH和EOT是不同的,例如PPP协议帧,其帧首部的第一个字符是0x7E(0111 1110),而尾部字符也是0x7E。MAC帧的首部第一个字符是 1010 1011

  我们知道帧的头部和尾部有SOH或者EOT字符用来界定一长串01比特流中帧的开始和结束,但是如果帧中间的数据部分也有SOH/EOT字符,那么这个帧就可能被误判边界而被截断。

  如果帧中间的数据部分有SOH或者EOT字符的二进制(尤其是图片视频等,是什么二进制串都可能出现的),接收方也不会把数据部分的SOH和EOT错认为是帧的边界,导致数据丢失。

  字节填充解决:字节填充是指发送端的数据链路层在数据中发现SOH或EOT时,在它前面插入一个转义字符ESC,如果转义字符ESC也出现在数据中,就在ESC前面再插入一个ESC。

  字节填充只是用来实现透明传输的其中一种方法,其实不同的协议会有不同的解决方法

  ,例如PPP协议,它的首尾控制字符都是 0x7E(01111110)。一方面PPP协议在异步传输(也就是逐个字符的传送方式下)会使用字节填充的方法,在同步传送(也就是一连串的比特连续传送的传送方式下)时,PPP协议会使用零比特填充,具体做法是对于帧数据部分,只要发现有5个连续的1就在5个1后面填入0,这么一来就可以保证数据部分不存在 01111110 这个控制字符,在接收端则反操作即可还原原来的比特。差错检验

  比特差错,说简单点就是由于电压不稳定导致1可能变成0,0可能变成1。传输错误的比特占所传输比特总数的比率称为

  假设待传输的一组数据 M = 101001 (k = 6),我们要在M的后面再添加供差错检验用的n位冗余码(FCS)一起发送。

  冗余码FCS的计算如下:进行 2^n 乘 M的运算,这相当于在M后面加n个0,得到一个 k+n 为的数X,后面的这n位就是待会儿要被FCS冗余码填充的n位。

  用X除以(使用模2除法)一个事先定好的长为 n+1 位的除数 P,得到商和余数分别是 Q 和 R, R长为n位。R就是冗余码FCS。

  M + R会放在帧首和帧尾之间一起传输。接收端会以帧为单位进行CRC检验:具体做法是把收到的帧的 M + R 部分使用模2除法除以相同的P,检验得到的余数R2是否为0(我们知道 M除以P的余数是R,那么 (M+R)除以P的余数肯定就是0)。如果R2大于0,说明出现了比特差错(R2为0的话,不一定就没有比特差错,不过这个概率会非常小,只要P够大,这个概率就会小到可以忽略不计)。

  使用CRC循环冗余检测的开销是每个帧都要多传输n位比特,n多大取决于P多大。

  通过硬件完成的,因此处理很快,不会延误数据的传输。另外,链路层只保证无比特差错(帧内比特从0变成1或者从1变成0),但不保证无传输差错。什么意思呢,意思是说数据链路层只保证帧内的比特没有差错(有差错就会丢掉这个帧),但丢包、帧重复和帧失序这样的问题数据链路层不负责,而是会交给传输层来解决。因此总的来说,链路层并不提供可靠传输。

  一对多广播特性的网络。以太网是局域网的代名词,可以认为以太网就是局域网。局域网的主要特点是:网络为一个单位所拥有,且地理范围和站点数目有限。局域网内的所有主机可共享该局域网的所有硬件和软件资源。

  局域网按网络拓扑可分为如下几种:总线网(早期的局域网)、星型网(现在的局域网)和环形网。

  适配器装有处理器和存储器(包括RAM和ROM),适配器和局域网的通信是通过电缆以串行传输方式进行,适配器和计算机的通信是通过计算机主板的IO总线以并行传输方式进行。因此适配器的重要功能是要实现数据串行传输和并行传输的转换。

  由于网络上的数据速率和计算机总线的数据速率不相同,因此适配器中必须有对数据进行缓存的缓冲区。计算机还要安装控制该适配器的设备驱动程序。

  适配器在接收和发送各种帧的时候不使用CPU,当适配器收到有差错的帧或目标MAC地址与本机MAC地址不同的帧时,就丢弃这个帧而不必通知CPU

  。当收到正确的帧时,适配器会将数据交付给协议栈的网络层,并中断CPU(网卡设备发起的中断),调用中断处理程序来接收和处理这些数据。计算机的硬件地址MAC就在适配器的ROM中,而计算机的软件地址IP则在计算机的RAM存储器(在内存)中。

  当局域网中的某个主机想发送分组给局域网的另一个主机的时候,只需将分组发送到这个局域网中,局域网会将这个分组广播给总线上其他所有的主机。

  如上图,B向局域网内的D发送数据信号,该信号会被广播给总线上所有的主机,所有主机会检查帧首部的目标MAC地址,只有D的硬件地址和这个MAC地址一致,D接收成功,其他主机检测后会丢弃这个帧。通过这种方式

  在具有广播特性的总线上实现了一对一的通信。为了实现一对一通信,发送方需要把接收方的硬件地址写入帧首部的目的地址字段中。

  缺点是如果多个设备在共享的广播信道上同时发送数据,会造成彼此干扰冲突导致发送失败。

  :指每一个设备在发送数据前要先检测一下信道上是否有其他计算机在发送数据,有则暂时不发送数据避免信号碰撞。多点接入(MA)

  :指计算机边发送数据边检测信道上的信号电压大小,如果多个计算机同时在总线上发送数据,总线上的信号会互相叠加导致电压增大。如果设备检测到信号电压超过一个门限值就认为有多个设备在发送数据,即产生碰撞。一旦发现碰撞,设备会立刻停止发送,以免继续浪费网络资源,然后等待一段时间后再发。CSMA/CD协议由主机上的适配器执行。

  CSMA/CD协议总结起来有句顺口溜:先听后说、边说边听、冲突停止、延迟重发。

  半双工通信,也是以前传统局域网的设计。之后局域网的拓扑从总线型改为星形网络,它和总线型局域网相比不同:增加了具有多个端口的集线器,局域网的所有设备都会连接到这个集线器。

  使⽤集线器的以太⽹在物理上是一个星形网,但逻辑上仍是⼀个总线⽹,依旧使用半双工通信,会发生信号碰撞,⼯作站使⽤ CSMA/CD 协议,并共享逻辑上的总线,同一时刻只允许一个站发送数据;

  一个集线器的端口有限,而且由于会发生碰撞,因此无法扩大网络(因为一旦扩大网络,碰撞的情况会更严重)。为了能将以太网扩展,交换式集线器就出现了,又称为以太网交换机。

  首先需要提出碰撞域的概念,任何一台设备发送数据时其他设备再发送数据就会与之产生冲突,这些设备的集合称为碰撞域。例如上面用一个集线器连接而成的多个设备就是一个碰撞域。

  交换机可以将多个主机、集线器YB体育、路由器和另外的交换机连接起来,交换机上的每一个端口连接着一个碰撞域,从而实现以太网的扩展。如下所示:

  1、交换机没有碰撞问题(帧在碰撞域和碰撞域之间经过交换机时不会发生碰撞,这是因为交换机是全双工通信的,通信的主机都是独占信道的,而每个碰撞域内部才会有碰撞),不使用CSMA/CD协议;集线器连接的多个主机组成的碰撞域会有碰撞问题,会用CSMA/CD协议。

  3、交换机是工作在数据链路层的设备,能够识别帧。集线器是工作在物理层的设备,只能传输比特,无法识别帧(无法识别帧边界和MAC地址、无法做FCS检验)。

  4、集线器收到信号之后会转发给所有连接在集线器上的主机,而交换机收到一个帧后会先根据目的MAC地址查MAC转发表,如果存在对应记录则直接发送到目的主机,否则才广播。

  5、交换机的每个接口有存储器,能在输出端口繁忙时把帧缓存,解决了不同碰撞域之间传输速率不匹配的问题。

  6、交换机将多个碰撞域隔离开来,它在扩大了以太网的同时没有扩大碰撞域。这是交换机的一个优点,试想一下,如果把这个交换机换成一个集线器,那么A~N就会组成一个庞大的碰撞域。如果A~N是一整个大的碰撞域,那么A发数据给H,B想要发数据也要进行碰撞检测。

  不会,首先这两个帧从主机到交换机用的是独立的信道(各自有网线连到交换机的不同端口),而且帧到达交换机后,这两个帧不会同时输入到通往B的输出信道上,而是会先放入交换机的输出缓存队列,一个一个帧的发送,因此不存在信道冲突,就像在缓冲队列排队发送那样。

  一个设备发送的报文能通过广播到达的所有设备的集合就是一个广播域,例如上面的A~N就是一个广播域。如果有两个交换机相连,那么这两个交换机的所有设备都是一个广播域。

  数据到达后先缓存,检测正确性(FCS检验)再转发。所以延迟大,但可靠性高。支持不同速率的端换。

  检查数据帧的⽬的 MAC 地址之后⽴即转发(查转发表转发,但不做FCS校验),延迟⼩,可靠性 低,不⽀持不同速率的端⼝交换;有可能转发⼀些⽆效的帧查转发表

  一个硬件地址作为一个适配器(网卡)的唯一标识。如果连接在局域⽹上的主机或路由器安装有多个适配器,那么这样 的主机或路由器就有多个“地址”。

  IEEE 的注册管理机构 RA 负责向⼚家分配MAC地址的前三个字节 (即⾼位 24 位),称为组织唯⼀标识符;

  MAC地址的后三个字节 (即低位 24 位) 由⼚家⾃⾏指派,称为扩展 唯⼀标识符,必须保证⽣产出的适配器没有重复地址。

  数据链路层的网络有多种类型,如以太网、PPP、无线通信网等等,每种网络在链路层上都有着属于自己的链路层协议和帧类型。

  其中类型字段标识上一层使用什么协议(0x0800是IP协议)。MAC帧的最小长度为64字节,因此数据部分最小为 64 - 18 = 46字节,如果小于46字节会在数据后面加一个整数字节的填充字段。

  前导码是为了让接收方的时钟与到达的比特流达成同步,简单的说是告诉接收方,帧已经到达,请提前准备好接收,否则接收方会错过帧前面的若干位。

  3. C之外的主机收到A的帧后检查目的MAC地址后丢弃这个帧,只有C接收成功。C发送数据帧给A,交换机根据帧的目的MAC地址(MAC-A)查MAC表并从接⼝ 1 转发给A, 并记下C的MAC地址及连接的接⼝3。

  4. 之后的帧经过这个交换机都会去查表直接找到转发接口,如果找到有记录则无需广播,直接转发。

  · 如有,则把原有的对应行进⾏更新并转发帧,同时查找交换表中 有无⽬的MAC地址相匹配的行:

  · 若交换表中给出的接⼝就是该帧进⼊交换机的接⼝,则应丢 弃这个帧(因为这时不需要经过交换机进⾏转发,已经在自己的碰撞域中广播了,如下图中A发送帧给M就是这种情况)。

  考虑到交换机的端口可能会更换主机,就需要更改MAC表的记录字段,所以每生成一个MAC记录就记下当时的时间,如果该记录超过有效期(如300秒)则自动删除。MAC表的第三列应该是写入时间。

  交换机之间可能会增加冗余链路,以保证网络的可靠性,防止一条交换机或者一个端口故障导致通信瘫痪。但是如果两个交换机中有多条链路可以连通就可能发生

  如下图所示:有两台交换机,用两条链路相连接(#1的端口1和#2的端口1,#1的端口8和#2的端口8)。

  假如A要发送一个帧给D,而且#1和#2的MAC地址表都没有记录D的记录,就会无限循环的转发。

  1、假设A是连着#1的1号端口,D是连着#2的7号端口,A的帧在#1中把帧广播给2~8号端口。

  2、帧从#1的8端口进入#2,#2把帧广播给#2的1~7号端口,D收到了帧YB体育。但是之前广播的帧又从端口1进入到#1,并重复上述的过程,无限广播。

  如果是3个交换机A,B,C,A连向B,B连向C,C连向A,也会发生这个问题。

  为了解决这个问题,提出了生成树协议,其原理是:不改变网络的实际拓扑(不改变物理链路),但在逻辑上切断某些链路,使所有路径是无环路的树状结构,不再成环。交换机转发的时候只往生成树留下的那条链路发送。

  例如上面的图,我在逻辑上让交换机广播时只能通过#1-1把帧传到#2,而#1-8端口不传,但在物理上#1-8和#2-8依旧相连,#1-1故障时,#1-8就能顶替其工作。

  答案是会的,只要D发送帧数据到#1交换机的主机上就会记录,发送方的帧只要路过这个交换机就会记录到这个交换机上。

  如果一个广播域中的设备太多,就会出现大量的广播帧(尤其是当MAC表是空的情况下),会消耗大量的网络资源,并造成链路拥塞。

  另外,如果不同主机的用途和机密程度不同,也需要将一个局域网内的设备划分为多个虚拟局域网以隔离通信。

  VLAN技术的出现可以将一个较大的广播域分隔为多个小的广播域,将一个大的局域网分隔为多个小的虚拟局域网。广播只会发生在同一个虚拟局域网之内,不同虚拟局域网的主机通信需要经过路由器。

  为了支持支持VLAN协议,允许在以太⽹的帧格式中插⼊⼀个4字节的标识符,称为 VLAN 标记 (tag),⽤来指明发送该帧的计算机属于哪⼀个虚拟局域 ⽹;

  插⼊ VLAN 标记得出的帧称为 802.1Q 帧 或 带标记的以太⽹帧。

  VLAN字段长4个字节,其中前两个字节固定为 0x8100,我们只需关注最后的12位,它标志了这个帧属于哪一个虚拟局域网,即虚拟局域网的ID。

  普通的MAC帧和802.1Q帧的区别在于后者比前者多了一个VLAN标志字段。

  需要注意,同一个VLAN下的不同主机可能连接不同的交换机,如下图:A1~A4是同一个虚拟局域网的主机,但他们分别连接着3个不同的交换机。

  并且假设是基于交换机端口来划分的局域网,此时三个交换机需要有一个维护交换机端口和虚拟局域网ID(简称VID)的配置表(不是MAC表,因为MAC表为空的情况下也要有这样的一个配置表)。

  1、现在如果A1向A2发送帧,如果交换机1的MAC转发表有A2的表项,交换机1能直接依据帧首部的目的MAC地址(同时也会检查帧的VLAN ID知道A1的虚拟局域网是哪个)单点转发普通的MAC帧给A2。

  如果交换机1的MAC转发表没有A2的表项,交换机1检查帧的VLAN ID知道A1位于ID为1的虚拟局域网,因此会向这个虚拟局域网转发这个帧(帧会被发到A2~A4,而不会发到B1、B2这样的主机,因为交换机可以根据帧的VLAN ID控制广播的对象)。

  2、如果A1向A3发送帧,交换机1查配置表查到A3不在本交换机中,于是向A1两个交换机广播(帧首部带了VLAN ID字段 = 1)。交换机2根据帧的VLAN ID = 1 向本交换机的VID=1的虚拟局域网下所有主机广播帧,而不会向其他虚拟局域网这个广播帧。

  3、如果A1向B1或者B2发送帧,由于A和B1/B2处于两个不同的局域网,于是需要交给路由器转发。

  ⼴播⻛暴。减少了不必要的⽹络流量。主机网卡的压力也减轻,无需接收和检验大量的广播帧。

  交换机的出现将一个大的碰撞域划分为多个小的碰撞域,减少了信号碰撞从而提高了局域网内主机的并行通信。

  虚拟局域网的出现将一个大的广播域划分为多个小的广播域,减少了广播的范围和次数,节省网络资源,且增强了网络安全。