第三章、数据链路层
数据链路层信道的两种类型:
- 点对点信道:这种信道使用一对一的点对点的通信方式
- 广播信道:这种信道使用一对多的广播通信方式;广播信道上连接的主机很多,因此必须要使用共享信道协议
看一看两台主机通过互联网进行通信时数据链路层所处的地位
专门研究数据链路层的问题时,可以只关心水平方向的数据链路层
3.1、数据链路层的几个问题
3.1.1、数据链路和帧
###数据链路
链路只是节点到相邻节点的一条物理链路,中间没有任何其他的交换节点;而数据链路除了有这条链路之外,还需要一些必要的通信协议控制链路上数据的传输,若是把实现该协议的软件或者硬件加在这条链路上,就构成了数据链路,现在最常用的方法是使用网络适配器来实现这类协议(网络适配器一般都包含物理层和数据链路层这两层的协议)链路也可以叫做物理链路,而数据链路则可以叫做逻辑协议
###帧
数据链路层将网络层交下来的分组封装成帧,以及会把帧中的数据取出交给上层的网络层
点对点的数据链路层在进行通信考虑的主要问题:
- 节点A将上层网络层交递下来的IP数据报添加首部和尾部封装成帧
- 节点A将帧发送给节点B
- 若节点B收到的帧无差错,则将帧中的IP数据报提取出来交给上层的网络层;若是收到的帧有差错,则丢弃这个帧
3.1.2、三个基本问题
- 封装成帧
- 透明传输
- 差错检测
封装成帧
将网络层传下来的IP数据报添加首部和尾部构成帧,首部和尾部作用是标明一个帧的开始和结束,也就是进行帧定界,帧在物理层传输时,根据首部和尾部的二进制数据识别一份数据的开始和结束;
帧中的数据部分就是IP数据报,帧的长度是数据部分加上首部和尾部的长度
为了提高效率,建议的是数据部分要尽可能地大于首部和尾部的长度,但是每一层数据链路层都规定了数据部分长度上限——最大传送单元MTU
数据是由可打印的ASCLL码组成的文本文件时,帧定界可以使用特殊的帧定界符,ASCLL码中不可打印的控制字符有33个;控制字符SOH(start of header)标明帧的开始,EOF(end of transmission)标明帧的结束,十六进制分别为01、04
透明传输
当帧定界符采用控制字符时而数据部分是文本文件时,数据中不可能出现和帧定界符一样比特流的数据,这种情况当数据部分无论包含什么样的数据,都可以正常的传输过去,这就是透明传输
但是若是数据中在必要时传输的是非ASCLL的文本文件时,此时帧定界符的二进制表示就有可能和数据中的某部分二进制数据重复,此时数据链路层就会错误地找到帧的边界,把剩下的部分丢弃,这种情况就有问题,不是透明传输
透明传输就是一个实际存在的事物看起来好像不存在一样
为了解决这种非透明传输的问题,数据链路层的方法是在数据中出现和控制字符一样的数据前面插入转义字符ESC,十六进制为1B,接收端的数据链路层把数据交给网络层时会删除这个插入的转义字符;这种方法称为字节填充,若是数据中也存在和转义字符一样的二进制数据流,则在此之前再加上一个转义字符,接受时,只需要删除一个这样的比特流就行
差错检测
比特数据流中的比特可能由0变为1或者由1变为0,这就叫比特差错;数据链路层采用循环冗余检验CRC来检测这种差错;
循环冗余检测:在原本的数据比特流后面加上要求得帧检验序列FCS来进行检测;具体地:采用模2除得方法得到FCS。假设要传输得比特数据流以每个比特为一个单位,长度是k, 规定一个二进制除数长度为n+1,在传输得二进制数据后面加上n位0,用这个加上n位0得数据模2除除数,会得到一个n位得除数,这个除数就是n位冗余码。那么最终传输得数据就是原本得数据加上这个n位冗余码,也就是k+n位比特数据,接收端在接收到这个数据之后,用这个k+n位得数据模2除之前的哪个除数,若是余数位n位的0,那么就是没有差错,反之有差错
一般用生成多项式来表示一个除数,比如除数1101,就用P(X)=X^3+X^2+1表示
使用CRC来检测差错只能做到接近于1的无差错接收,也就是说,出错的数据会被丢弃。那么之后将数据交给网络层时,没有做到可靠传输服务,所谓的可靠传输就是数据链路层的发送端发送什么接收端就接收说明;可以理解为差错检测之后,有的数据被丢弃了,交给网络层时,并不是完整的数据,即不可靠
传输差错可以分为两类,一类是上述的比特差错,还有一种是帧丢失、帧重复和帧失序
过去OSI观点:要实现数据链路层提供可靠服务,在CRC的基础上还要加上帧编号、确认和重传机制;但是现在由通信质量不好引起的差错率降低,故不使用这种方法。现在的处理方法:区别对待,对于通信质量良好的有线传输链路,数据链路层不适用这些机制,即不向上提供可靠服务,将这些差错留给上层来完成,对于通信质量差的无线传输链路,则使用这种机制
3.2、点对点协议PPP
3.2.1、PPP协议的特点
PPP协议就是用户计算机和ISP进行通信时所使用的数据链路层协议
###1、PPP协议应满足的需求
简单、封装成帧、透明性、多种网络层协议、多种类型链路、差错检测、检测连接状态、最大传输单元、网络层地址协商、数据压缩协商
###2、PPP协议的组成
三个部分:一个将IP数据报封装到串行链路的方法、一个用来建立、配置和测试数据链路连接的链路控制协议LCP、一套网络控制协议NCP
3.2.2、PPP协议的帧格式
###1、各字段的意义
标志字段F,十六进制为7E,标志一个帧的开始或者结束;
A、C没有明确意义;
协议字段2个字节,当为0x0021时,PPP帧的信息字段就是IP数据报。若为0xC021,则为链路控制协议LCP的数据。若为0x8021表示这是网络层的控制数据
FCS帧检验序列,用来进行差错检测
###2、字节填充
当信息字段出现和标志字段一样的比特(0x7E)时,采用字节这种手段。
当PPP进行异步传输,出现这种情况,将0x7E转义为0x7D,并使用字节填充:
(1)0x7E先变为0x7D转义,之后填充 0x5E
(2)若信息字段出现转义字符0x7D,填充0x5D
(3)当出现ASCLL码的控制字符,先添加转义字符0x7D,同时将字符的编码进行改变
###3、零比特填充
信息字段连续出现5个1,则在这5个1后面添加0比特,实现透明传输;接收端扫描出5个连续1,删除后面的0
3.2.3、PPP协议的工作状态
开始时链路静止,首先建立物理链路,之后再建立LCP链路(LCP协议设置PPP的一些参数),之后建立NCP链路(进行网络层的配置);通信完毕后,NCP释放网络层连接,回收IP地址,然后释放数据链路层连接,最后释放物理层连接
3.3、使用广播信道的数据链路层
3.1.1、局域网数据链路层
局域网的特点:网络为一个单位所拥有,且地理范围和站点数目有限
局域网的优点:具有广播功能:从一个站点可以很方便的访问全网,局域网上的主机可以共享局域网上各种硬件和软件功能
局域网的拓扑:星形网(由于集线器的出现和大量的双绞线使用于局域网中,这种拓扑得网络获得了非常广泛得应用);环形网;总线网:各站连接在总线上,总线两端的电阻吸收总线上传播的电磁波信号避免有害的电磁波反射
共享信道:
(1)静态划分信道:频分、时分、波分、码分复用;价格较高
(2)动态媒体接入控制(多点接入):特点是信道并非在用户固定通信时分配给用户,分为两大类:
- 随机接入:特点是所有用户可以随机的发送信息。若是有多个用户同时发送信息就会发生碰撞。因此随机接入需要有必要的网络协议
- 受控接入:特点是用户不能随机的发送信息,需要受一定的控制;例如探询或者轮询
1、以太网的两个标准
以太网可以理解为就是局域网;
局域网的数据链路层被划分为两个子层:逻辑链路控制LLC、媒体接入控制MAC。与接入到传输媒体相关的内容都放在MAC子层;LLC子层则与传输媒体无关,传输媒体对于LLC子层来说是透明的
2、适配器的作用
计算机与局域网的连接通过适配器完成。适配器是在主机箱内插入的一块网络接口板(或者是笔记本电脑中插入的一块PCMCIA卡——个人计算机存储器接口适配器)。这种接口板又称为网络接口板NIC或简称为网卡。
这种通信适配器上有处理器和存储器(包括RAM和ROM)。适配器和局域网之间的通信是通过电缆或者双绞线以串行传输的方式进行的,而计算机与适配器之间的通信则是以计算机主板上的IO总线以并行传输的方式进行的。因此,适配器一个重要的功能就是数据进行串行和并行的转换。由于局域网和计算机上数据的传输速率不一样,因此适配器内部还要安装进行缓存的存储芯片。
适配器在接收和发送各种帧时,不适用计算机的CPU,此时的CPU可以处理其他的任务。当接收到的数据有差错时,适配器丢弃;当没有差错时,适配器使用中断来通知计算机,并且交付协议栈的网络层。当计算机要发送IP数据报时,就由协议栈将IP数据包交给适配器,组装成帧之后交给局域网。
计算机的硬件地址在适配器的ROM中,软件地址(IP地址)在适配器的存储器中
3.3.2、CSMA/CD协议
总线的特点:当一台计算机发送数据时,总线上所有的计算机都能检测到这个数据,这就是广播通信方式。但是为了在总线上进行一对一的通信,可以使每台计算机的适配器都拥有一个单独的地址,在进行通信时,在数据帧首部标明地址。
为了通信的方便,以太网采用以下两种措施:
第一,采用较为灵活的无连接的工作方式,就是不先建立连接直接发送数据。适配器对于发送的数据不编号,也不要求对方发回确认。这样做可以使得以太网工作起来很简单,而因为局域网信道质量好,因此产生差错的概率很小。因此,以太网提供的服务是尽最大努力的交付,即不可靠的交付。当目的站收到有差错的数据帧时,丢弃;是否要重传由高层决定。重传时以太网不知道这是重传的帧,而是当作新的数据帧来进行发送。总线上通信,只要有一台计算机发送数据,总线的资源就被占用,因此,在同一时间只能允许一台计算机发送数据。为了多个计算机同时发送数据造成冲突,以太网使用协议CSMA/CD(载波监听多点接入/碰撞检测);
第二,以太网发送的数据都使用曼彻斯编码的信号
CSMA/CD协议的要点:
- 多点接入:表明这是总线型网络,就是多个计算机接到一条总线上
- 载波监听:边发送边检测;无论是在数据发送前还是数据发送中,都要不停的检测信道:在发送前检测到总线中有信号,那就暂时不要发送信号,在数据发送中检测到信号就立即终止数据的发送
- 碰撞检测:在发送数据中检测信道上电压的变化,超过一定阙值就认为此时多个信号碰撞在一起
由于传播有一定时延,因此计算机不知道在此时发送出去的信号之前有无其他计算机发送信号(这个时间内载波监听检测不到有无信号),因此可能会产生碰撞;电磁波在一千米电缆的传播时延为5us;总线上单程端到端的传播时延记为t,假设一个计算机发送信号,那么最多要多长时间才能检测到发生了碰撞,答案是2t
显然,CSMA/CD协议在进行通信时不能一边发送一边接收(但必须边发送边监听),因此使用这个协议的以太网不可能使用全双工通信而是使用半双工通信
争用期:2t;也成为碰撞窗口,只有在一个争用期之后还没有检测到碰撞,此时才能肯定发送数据时不会产生碰撞
以太网使用截断二进制指数退避算法来确定碰撞之后重传的时机 :
比特时间:传输一个比特位需要的时间
k = Min[重传次数,10],从[0,1,2,3,4……(2^k-1)]中取出一个数记为r,重传后推后的时间就是r倍的t
假设发送一个很短的帧,发送到目的站途中和别的帧发生碰撞,因而目的站最终收到的是一个有差错的帧,丢弃,但是此时源站不知道发生了碰撞,因而不会重传这个帧。因此以太网中规定帧最短为64字节,凡是小于64字节的帧都是由于冲突而异常终止的无效帧
3.3.3、使用集线器的星形拓扑
使用集线器的以太网在逻辑上仍是一个总线网,各站共享逻辑上的总线,使用的还是CSMA/CD协议(具体地说,是各站的适配器使用这个协议);集线器很想一个多端口的转发器;集线器工作在物理层,每个端口仅仅简单的转发比特
3.3.4、以太网的信道利用率
在经过若干个争用期之后,一个站开始发送数据,发送时延为T0,t为数据从端到端传播的时间;所以成功发送一个帧需要的时间为T0+t;可知要提高以太网的信道利用率,必须减小t/T0这个比值;令参数a=t/T0,这个是以太网单程端到端时延t与帧的发送时间之比,当a->0时表明只要一发生碰撞就能立即检测,这样信道资源被浪费的很少,若是a很大,表明争用期很大,这就使得发生碰撞之后就浪费了不少资源,信道利用率减少;因此a的值要尽可能小一点,这就是说,以太网长度受到限制,以太网帧的长度不能太短
现在考虑一种理想化的情况,没有碰撞,有空闲就发送(显然不是CSMA/CD协议),此时成功发送一个数据时间为T0+t,发生时间为t;信道的极限利用率Smax=T0/(T0+t)=1/(1+a)。虽然这不可能,但是指出了只有当a足够小时才能尽可能地提高信道利用率
3.3.5、以太网的MAC层
1、MAC层的硬件地址
硬件地址又称物理地址或MAC地址;
现在局域网适配器实际上使用的都是6字节的MAC地址;前三个字节为组织唯一标识符OUI,后三个字节为扩展的唯一标识符EUI,购买一个OUI,就可以生成2^24次方个不同的字节;
这中6字节的MAC地址被固化在适配器的ROM中,因此MAC地址也叫硬件地址或物理地址;当这种适配器被嵌入到某台计算机或者手机上,就成了具体电子设备上的MAC地址了;
MAC帧包括一下三种帧:
- 单播帧(一对一):收到的帧的MAC地址与本站的MAC地址相同
- 广播帧(一对全体):发送给本局域网上所有站点的帧(全1地址)
- 多播帧(一对多):发送给本局域网上一部分站点的帧
2、MAC帧的格式
这里讨论以太网V2的MAC帧
网络层将IP数据报交给数据链路层,封装为MAC帧:
2字节的类型表明的是数据是什么类型的;
数据字段长度在46~1500字节之间,MAC帧最小长度为64个字节,减去首部和尾部就是48字节了;若是数据长度小于46字节,则填充;
尾部的FCS帧检验序列检验的是MAC帧也就是MAC帧的五个字段,不包括在物理层添加的前同步码和帧开始定界符;前同步码的作用是使得MAC帧和发送端得时钟同步;
注意:以太网传输数据时是按照帧为单位传输的,也就是说,各帧之间必须要有间隙,可见以太网不需要帧结束定界符,也不需要插入字节保证透明传输
以下三种为无效的MAC帧,若是接收这三种MAC帧则丢弃:
- 帧的长度不是整数个字节
- FCS检测到差错
- MAC帧长度不在64~1518之间
3.4、扩展的以太网
3.4.1、在物理层扩展以太网
###延长以太网上两台主机通信距离
以太网两台主机之间不能距离太远,某种以太网规定两台主机之间距离不超过100米,否则主机之间通过铜线发送的信号会衰减使得CSMA/CD协议不能正常工作;可使用转发器连接两个网段解决这个问题,但是随着双绞线成为主流,扩展以太网的覆盖范围很少使用转发器了
现在使用光纤:
##扩展为更大的以太网
使用集线器连接多个以太网可以形成多级星型结构的以太网,成为一个更大的以太网
这样做的好处:
1、使得不同系的可以进行通信
2、使得两台主机通信距离更远,比如两台主机之间最远100米,和集线器也是100米,那么通过集线器连接之后,这两台主机之间最远可以像个200米
缺点:
1、增加了碰撞域:在任意时刻只能用一个站能发送数据,也就是说当某个系的站发送数据,会在整个大的以太网机型转发,这样使得其他的系都不能通信了;另外,一个系的以太网最大吞吐量为10Mbit/s,用集线器连接起来理应说是30Mbit/s,但是由于碰撞域,此时最大吞吐量仍是10Mbit/s
3.4.2、在数据链路层扩展以太网
之前使用网桥,网桥对收到的帧根据MAC帧的目的地址进行转发和过滤;当网桥收到一个帧之后并不是向所有端口发送此帧,而是根据此帧的目的地址查找网桥中的地址表,然后确定转发到哪个端口,或是直接丢弃
后来,出现了交换式集线器,淘汰了网桥,交换式集线器成为以太网交换机或者第二层交换机,强调这种交换机在数据链路层使用
1、以太网交换机的特点
实际上是一个多端口的网桥,通常有十几个端口,和物理层转发器、集线器区别很大,每个端口都连接一个主机,并且一般使用全双工的通信方式;相互通信的主机都独立占用传输媒体,无碰撞的传输数据,每个端口到连接此端口的主机就构成一个碰撞域而不是整个构成一个大的碰撞域
以太网交换机是一种即插即用设备,其内部的帧交换表(地址表)是通过自学习算法自动地建立起来的,实际上中交换表就是一个内容可寻址存储器CAM
以太网交换机最大优点的体现:传统的共享式以太网带宽为10Mbit/s,连接10个用户,那么每个用户分到1Mbit/s的带宽,若是使用以太网交换机,那么因为可以隔离碰撞域,此时每个用户都能使用10Mbit/s的带宽,那么在以太网交换机内部相当于就是100Mbit/s的带宽了
虽然很多以太网交换机采用存储转发的方式进行转发,但是还有以太网交换机采用直通的交换方式来提高转发速度
2、以太网交换机的自学习功能
交换表中存放发送信息的源地址和对应的端口
假设现在A向B发送数据,先将(A,1)记录在交换表中表示端口1对应的就是A站并且查找交换表看有没有B目的地址对应的端口号,发现没有,那么先进行广播(即向所有端口转发此数据),最终找到B则数据传输完毕(数据MAC帧前6个字节为目的地址),C和D收到数据之后丢弃(过滤的体现);之后B向A发送数据,在交换表中记录(B,3)并且查找交换表发现A端口为1,那么就直接发送到端口1即可;
考虑到交换机端口会更换主机或者主机更换网络适配器,那么就要及时更改交换表中的项目(存储的信息超过一段时间之后就会立即删除)
有一种情况:
A向B发送数据,开始进行广播,到端口3,再到交换机2的端口1,再进行广播,到端口2再到交换机1的端口4,再进行广播,这样就会死循环
针对于这种情况使用生成树协议STP进行解决,在逻辑上切断某些链路,使得一台主机到其他所有主机的路径是无环路的树状结构,消除兜圈子的现象
3、从总线以太网到星形以太网
开始使用的是总线的以太网,但是由于以太网上的站点数目的增多,使得总线结构的以太网可靠性下降,与此同时,大规模集成电路以及专用芯片的发展,使得星形结构的以太网交换机既便宜有又可靠,这样采用以太网交换机的星形结构以太网成为以太网的首选拓扑
使用以太网交换机的以太网不采用共享,也就是没有碰撞,也就是不适用CSMA/DA协议,那么这样的以太网为什么还称为以太网呢,使因为MAC帧格式没有变化
3.4.3、虚拟局域网
当一个以太网中包含的计算机很多时,会带来两个问题
1、广播风暴,浪费资源
2、信息安全存在隐患
针对于此,若是每个小部门都拥有自己较小的局域网,那么不但可以使广播范围缩小,也可以提高局域网的安全性;在以太网交换机出现之后,我们可以很灵活的建立虚拟局域网VLAN(virtual LAN),这样就把较大的局域网分成了一个个较小的局域网并且较小的每一个局域网都是一个独立的广播域
虚拟局域网是一些局域网网段构成的与物理位置无关的逻辑组,而这些网段具有某些共同的需求。每个VLAN帧都有一个明确的标识符,指明这个帧属于哪一个虚拟局域网
虚拟局域网只是局域网给用户提供的一种服务,并不是一种新型局域网
虚拟局域网帧就是在以太网MAC帧中间插入一个VLAN标签,这样就是802.1Q帧了
前两个字节为802.1Q标签,表明这个帧是一个VLAN帧,后两个字节的前4个比特位没用,后面12个比特位为VALN标识符VID(VLAN ID),标明这个VLAN帧属于哪个VLAN虚拟局域网;VLAN帧最长为1522字节;
这样的802.1Q帧在哪些地方使用呢?举个例子
A1向A2发送数据,因为在一个以太网交换机上面并且属于一个VLAN,那么这种情况就是普通的发送信息
A1向A3发送数据,不在一个以太网交换机,此时会给这个数据封装成VLAN帧,第二层的以太网交换机收到A1发送的VALN帧之后会先去掉VLAN标签,再交给A3
若是A1向B1发送信息,这涉及到不同网络之间的通信,虽然它们在一个交换机中,但是由于属于不同的VLAN。这涉及到网络层的问题。