计算机网络(四)数据链路层
1 数据链路层概述
2 点对点通信数据链路层最基本、最重要的三个问题
2.1 封装成帧
-
封装成帧是指数据链路层给上层交付的
协议数据单元
添加帧头
和帧尾
使之成为帧 -
帧头和帧尾含有重要的控制信息
如以太网V2的MAC帧:
PPP的帧格式:
-
数据链路层将上层交付的协议数据单元封装成帧后,交付给物理层将构成帧的各比特转化为电信号发送到传输媒体,帧头和帧尾的作用还有帧定界
-
如果发送方发送的是上面的
PPP帧
,则帧头和帧尾的标志字节
就起到帧定界的作用,接收方的数据链路层就可以依照帧定界标志从物理层交付的比特流中提取中帧 -
而发送方发送的是
MAC帧
,则在帧头和帧尾中并没有帧定界标志。这就需要数据链路层封装成MAC帧后交付给物理层的时候,物理层会在MAC帧前面添加8字节的前导码
,并在发送比特流的时候设置96比特时间的帧间间隔
,因此MAC帧不需要帧结束定界符
-
-
透明传输
:数据链路层对上层交付的传输数据没有任何限制,就好像数据链路层不存在一样转义问题:帧定界符本质上就是特定的数值,因此数据链路层上层的协议数据单元中可能也碰巧含有这些特定的数值,那么接收方在接收数据的时候就会对帧的起始做出误判,导致提取帧失败
而如果数据链路层规定上层的协议数据单元不能包含帧定界符,就不能叫做透明传输了
① 面向字节传输的数据链路的解决的方法是使用字节填充(或字符填充)的方法实现透明传输,即数据链路层在封装成帧的时候,对上层协议的数据单元部分进行扫描,对帧定界符添加转义字符,防止接收方的数据链路层对帧起始造成误判
而对于上层协议数据单元既出现帧定界符、又出现转义字符的情况,也是一样在前面添加转义字符
转义字符的长度为1字节,十进制值为27,并不是ESC这三个字符
② 面向比特传输的数据链路的解决的方法是使用比特填充的方法实现透明传输,如零比特填充法:没五个连续的1填充一个0
-
为了提高传输效率,应当使帧的数据部分的长度尽可能大一些,因为数据部分才是主要想传输的部分
2.2 差错检测
- 实际的通信链路不是理想的,比特在传输过程中可能出现错误:1变成0、0也可能变成1,这称为比特错误
- 在一段时间内,传输错误的比特占所传输比特总数的比特率称为误码率BER(Bit Error Rate)
- 使用差错检测码来检测数据在传输过程中是否产生了比特差错,如
帧检测序列FCS字段
-
奇偶校验:在待发送数据后面添加一位奇偶校验位,使整个数据包含“1”的个数为奇数(奇校验)或者偶数(偶校验)
- 如果有奇数个位数发生比特错误,则奇偶性变化可以检查出错误
- 但是如果有偶数个位数发生比特错误,则奇偶性不会发生变化,检查不出错误(漏检)
-
循环冗余检测CRC(Cyclic Redundancy Check):
- 双方约定好一个生成多项式G(x)
- 发送方基于待发送的数据和生成多项式计算出差错检测码(冗余码),将其添加到待传输数据的后面一起发送
- 接收方通过生成多项式计算传输的数据是否产生误码
2.3 可靠传输
-
使用差错检测技术(如循环冗余检验CRC),接收方的数据就可以检测出帧在传输过程中是否出现了误码(比特错误),接收方主要是通过帧尾的
FCS字段
的值即检错码来 -
接收方的数据链路层在检测到比特差错之后采取怎样的措施,取决于数据链路层向上提供的服务类型
- 不可靠传输服务:仅仅丢弃有误码的帧,其他什么也不做
- 可靠传输服务:想办法实现发送端发送什么,接收端就接收什么
一般情况下,有线链路的误码率比较低,为了减小开销,并不要求数据链路层向上提供可靠传输服务。即使出现误码,可靠传输的问题由上层处理
但是如果是无线链路,误码率就比较高,因此数据链路层必须向生成提供可靠传输服务
-
比特错误只是传输错误的一种,传输错误还包括:
分组丢失
、分组失序
和分组重复
,这三种错误一般不会出现在数据链路层,而是出现在其上层 -
可靠传输服务并不仅仅局限于数据链路层,其他层均可选择实现可靠传输
- 数据链路层如果是以太网,则不要求实现可靠数据传输,如果是无线网则要求可靠数据传输
IP协议
向上提供的是无连接
的不可靠
传输服务- TCP向上提供
面向连接
的可靠
传输协议,UDP向上提供的是无连接
的不可靠
传输服务
3 可靠传输的实现机制
这三种可靠传输机制的基本原理并不局限于数据链路层,也可用于上面计算机网络体系结构的各层协议中。
3.1 停止-等待协议 SW
如下发送方和接收方基于互联网进行通信,而不是点对点的通信
-
发送方首先向接收方发送数据分组,接收方进行
差错检测
,如果没有误码则接收该分组,并给发送方发送确认分组
,简称ACK
;如果差错检测
出现了误码,则向发送方发送否认分组,简称NAK
-
发送方在接收到
确认分组
后,才能发送下一个数据分组;如果收到否认分组
,则重传发送的数据分组因此发送方并不能立即将该数据分组从缓存中删除,防止出现误码重传。只有在接收到数据分组的确认分组后才能将数据分组删除
-
超时重传:当数据分组发送过程中出现
分组丢失
,接收方收不到数据分组也不会发送ACK或者NAK。如果不采取其他所示,发送方就会一直处于等待确认、否认分组的状态。超时重传指的是发送方在发送完一个数据分组后,就会启动一个超时计时器,如果到了超时计时器所设置的重传时间但是仍然收不到接收方的任何ACK或者NAK,则就会重传原来的数据分组,这个就叫超时重传。
一般重传时间选为略大于“从发送方到接收方的平均往返时间”
-
确认丢失:如果接收方的确认、否认分组丢失的话,会导致发送方进行超时重发,进而导致
分组重复
的错误,解决的方法就是对发送数据进行添加序号,然后保证每发送一个新的数据分组,它的序号和上次不同就可以了,所以使用一个比特来编号就够了,接收方在发现序号相同重传后直接丢弃即可 -
确认迟到:对确认和否认分组也进行编号,主要是为了让发送方能够判断所收到的ACK分组是否重复,如果重复则直接忽略。(数据链路层一般不会出现ACK分组迟到的情况,因此在数据链路层可以不用给确认分组编号)
- 当往返时延RTT远大于发送时延TD的时候(如使用卫星链路),信道的利用率特别低
- 若出现重传,则对于有用数据来说,信道的利用率还要降低
- 为了克服 停止-等待协议 SW 信道利用率很低的特点,就产生了下面的两种协议
3.2 回退N帧协议 GBN(也叫滑动窗口协议)
在停止等待协议中,发送方每发送一个数据分组就停止发送,并等待接收方的确认分组,等接收到确认分组后才能继续发送下一个数据分组,如此反复进行;但是,
- 发送方每发送一个数据分组,就需要等待一个收发双方之间的往返时间,往返时间较大的时候,信道利用率就会很低
- 如果出现超时重传,则信道利用率就会更低
但是如果采用流水线式地传输,即可以同时发送多个数据分组,则可大大提高信道利用率
回退N帧协议,就是
-
在流水线传输的基础上,利用发送窗口来限制发送方可连续发送数据分组的个数
-
在数据分组之间采用固定的比特数n对分组进行编号,比如下面用3个比特编号,分组序号为0-7
-
则发送窗口的大小取值为1 < Wt <= 2^n - 1,本例取Wt=5
-
如果窗口取值为1,则回退N帧协议退化为停止等待协议
-
如果大于2^n - 1,则会导致接收方无法辨别新旧数据分组:
如下图的例子,采用三位比特编号,发送窗口为8,发送0-7号分组给接收方,如果此时接收方返回的确认分组丢失了,则发送方超时重传0-7号数据分组的时候,接收方是没有办法判断这是新的数据分组还是重传的旧的数据分组的
-
-
接收方窗口大小Wr固定为1
-
没有差错的情况下,
- 发送方将落在发送窗口的发送分组依次连续发送出去,没有出现乱序和误码的情况下到达了接收方
- 接收方按序接收这些数据分组,每接收一个接收窗口就向前滑动一个位置,并给发送方发送针对所接收分组的确认分组
- 确认分组准确无误到达发送方后,发送方每接收一个就向前滑动一个位置,并将收到确认的数据分组在缓存中删除,这样就有新的数据分组落入发送窗口进行下一次的传输
- 接收方在此过程中也可以择机将已经接收到的数据交付给上层处理
-
累计确认:接收方不需要对收到的每一个数据分组逐一发送确认分组,只需要对按序到达的最后一个分组发送确认即可,接收方收到后就能知道确认分组及之前的分组都传输完成,因此累计确认还可以解决确认丢失的问题,不必再进行超时重发
累计确认的缺点就是不能即时向发送方反映出接收方已经正确接收的数据分组的信息
-
有差错的情况,
- 发送方将落在发送窗口的发送分组依次连续发送出去,但是数据分组出现了误码
- 接收方通过数据分组的检验码发现了错误,于是丢弃该数据分组
- 后续到达的数据分组与接收窗口出现序号不匹配,接收方也丢弃这些分组,并对之前接收到的最后一个分组进行确认(这里是ACK4),并且每丢弃一个数据分组就会发送一次确认分组(这里发送4次ACK4)
- 接收方收到已经接收数据分组的确认分组后,就能够知道之前发送的数据分组出现了错误,可以不等待超时计时器超时就立刻重传,具体收到几个确认分组进行重传由具体实现决定
- 发送方将发送窗口的数据分组重传再次发送
尽管6 7 0 1号数据分组没有发生错误到达了接收方,但是由于5号数据分组误码导致不被接收而超时重传,这就是所谓的回退N帧
C
3.3 选择重传协议 SR
- 回退N帧协议的接收窗口的大小只能为1,因此只能按序接收正确到达的数据分组;一旦出现错误就会导致后续的数据分组即使正确到达也会被接收方丢弃,从而导致发送方超时重发
- 选择重传协议可以设法只发送出现误码的分组:接收窗口的大小Wr应该大于1,这样接收方就能先接收失序到达但是没有误码且序号落在接收窗口内的数据分组,等到所缺分组收齐后一并送交上层
- 选择重传协议不能采用累计确认的方式确认数据分组,而是采用逐一确认
4 广播通信的数据链路层
4.1 点对点协议PPP
-
点对点协议PPP(Point-to-Point Protocol)是目前使用最广泛的点对点数据链路层协议
-
ISP(Internet Service Provider)首先从因特网管理机构申请到一批IP地址,用户计算机只有通过获取到ISP提供的合法IP后才能成为因特网的主机,而用户计算机与ISP通信采用的数据链路层协议就是PPP协议
PPPoE
:即PPP Over Ethernet
在1999年公布的在以太网运行的PPP协议,它使得ISP可以通过DSL、电路调制解调器、以太网等宽带接入技术以以太网接口的形式为用户提供接入服务 -
点对点协议PPP也广泛应用于局域网路由器之间的专用线路
-
点对点协议PPP为点对点链路传输各种协议数据报提供了一个标准方法,主要由三部分组成:
- 对各种协议报封装成帧的方法
- 链路控制协议LCP:用于建立、配置以及测试数据链路层的连接
- 网络控制协议NCPs:其中的每个协议支持不同的网络层协议
-
点对点协议PPP帧格式:
- 标志字段(Flag):PPP帧的定界符,取值0x7E
- 地址字段(Address):取值0xFF,预留位
- 控制字段(Control):取值0x03,预留位
- 协议字段(Protocol):指明帧的数据部分应该送交哪个协议处理
- 如取值0x0021表示帧的数据部分为IP数据报
- 如取值0xC021表示帧的数据部分为链路控制LCP分组
- 如取值0x8021表示帧的数据部分为网络控制协议NCP分组
- ...
- 帧检验字段(FCS):采用循环冗余CRC计算出的校验位,校验帧传输过程是否出现误码
-
点对点协议PPP实现透明传输的方法:
- 对面向字节的异步链路,使用字节填充法,即在数据部分的帧定界符前面插入转义字符
- 对面向比特的同步链路,使用比特填充法,插入比特0
5 媒体接入控制
5.1 静态划分信道
5.2 随机接入—CSMA/CD协议
6 数据链路层的互连设备
6.1 集线器
集线器的演变:
-
早期的总线型以太网采用细同轴电缆(我都没见过
-
后来使用
双绞线电缆
和集线器HUB
的星型以太网,双绞线的RJ-45插头即水晶头,实践证明,使用双绞线和集线器要比使用大量接口的无源电缆要可靠得多,并且价格便宜、使用方便
集线器简介:
-
使用集线器的以太网在逻辑上仍然是一个总线网,各站共享总线资源,使用的还是CSMA/CD协议
-
集线器只工作在
物理层
,它的各个接口仅简单地转发比特,不进行碰撞检测(由各站的网卡自行检测) -
集线器一般都有少量的容错能力和网络管理能力。比如若网络中某个网卡出了故障,不停地发送帧,集线器检测到这个问题后就会在内部断开与这个故障网卡的链接,使整个以太网正常工作
-
在使用集线器HUB在物理层扩展以太网的时候,由于总线特性,主机发送的数据帧会被传输到整个网络中的其他主机
6.2 交换机(与集线器的不同)
-
交换机和集线器都工作在数据链路层,使用集线器的以太网主机在发送
单播帧
的时候,会通过共享总线传输到总线的其他各个主机;而使用交换机的以太网则是由交换机根据帧交换表
将单播帧
直接发送给目的主机,而不是每个主机(忽略ARP过程并且假定帧交换表学习完成);而对于广播帧
交换机和集线器的效果是一样的- 具体做法是交换机在收到帧后,在帧交换表中查找帧的目的MAC地址对应的交换机接口,然后通过该口发送帧
- 以太网交换机是一种即插即用的设备,其内部的
帧交换表
是通过自学习算法
建立起来的
-
对于使用集线器扩展的以太网,即扩大了广播域也扩大了碰撞域;而使用交换机扩展的以太网,只扩大广播域而不会扩大碰撞域
-
使用集线器的以太网在逻辑上是共享主线的,需要使用CSMA/CD协议来协调主机竞争总线,因此只能工作在
半双工模式
,即收发帧不能同时进行;而交换机通常有多个接口,每个接口都可以直接与一台主机或者另一台以太网交换机相连,一般工作在全双工模式
-
以太网交换机具有并行性,能够同时连通多对接口,使多对主机能够同时通信,无信号碰撞,不使用CMSA/CD协议
-
以太网交换机的两种帧转发方式:
- 存储转发:将帧缓存后再进行转发
- 直通转发:不进行缓存直接转发,不检查帧是否出错
6.3 交换机的工作原理:自学习和转发帧的流程
- 以太网交换机工作在数据链路层(也包括物理层)
- 交换机在收到帧后,在
帧交换表
中查找帧的目的MAC地址对应的交换机接口,然后通过该接口转发该帧,具体流程如下:- 交换机所在的以太网的主机向交换机的某个接口发送帧的时候,交换机首先进行
登记工作
,将发送主机的源MAC地址
和进入的接口号
记录到帧交换表
中,这一步也被称作交换机的自学习 - 然后交换机对该帧进行
转发
,在帧交换表中查找帧的目的MAC地址,如果找不到则对该帧进行盲目转发,也成为泛洪
,直到目的主机收到该帧,确认帧首部的目的MAC地址为主机MAC地址后接收该帧
- 交换机所在的以太网的主机向交换机的某个接口发送帧的时候,交换机首先进行
- 以太网交换机是一种即插即用的设备,其内部的
帧交换表
是通过自学习算法
建立起来的
6.4 虚拟局域网 VLAN
广播风暴:
- 随着交换式局域网规模的扩大,广播域也随之扩大,这时候的广播帧和多帧的发送就会造成
广播风暴
,即以太网中的所有主机都会收到广播帧,广播风暴会浪费网络资源和网络中各主机的CPU资源 - 所以除非必要应尽量少地使用广播,但是广播又是频繁出现的
- ARP地址解析协议(在以太网中已知IP查找MAC地址)
- RIP路由信息协议
- DHCP动态主机配置协议(自动配置IP地址)
- ...
解决方法,隔离广播域:
-
使用路由器隔离广播域,因为路由器工作在第三层网络层,默认情况下不对数据链路层的广播数据包进行转发,但是路由器成本较高
-
使用虚拟局域网VLAN,将局域网内的设备划分成与物理位置无关的、有某些共同需求的逻辑组的技术,不同VLAN之间是无法进行通信的
7 MAC地址、IP地址与ARP协议
-
MAC地址是以太网的MAC子层所使用的协议
-
IP地址是TCP/IP结构网际层使用的协议
-
ARP协议属于TCP/IP结构网际层,作用是已知设备所分配的IP地址,使用ARP协议可以根据IP地址获取到设备的MAC地址
-
MAC地址属于数据链路层,IP地址和ARP协议属于网际层范畴
7.1 MAC地址简介
-
首先,使用点对点信道的数据链路层是不需要使用地址的;而如果是使用广播信道(共享信道)的数据链路层,要想实现两个主机之间的通信,则必须使用一个
数据链路地址
作为唯一标识
来区分链路上的主机 -
在每个主机通信发送的帧中必须携带标识发送主机和接收主机的地址,由于这类地址是用于媒体介入控制MAC(Media Access Control),因此这类地址被称为MAC地址
-
这样链路上的主机接收到帧后,就能根据帧中的接收主机MAC地址和自己的是否匹配来选择接收获取丢弃该帧
-
MAC地址一般被固化在网卡(网络适配器)的电可擦编程只读存储器EEPROM中,因此MAC地址也被称作
硬件地址
、物理地址
,但是MAC地址不属于物理层而是属于数据链路层 -
一般情况用户都包含两个网络适配器:无线网卡和有线网卡。每个网络适配器都有全球唯一的MAC地址,而交换机和路由器往往拥有更多的网络接口,所以具有更多的MAC地址,因此严格来说,MAC地址是对网络上各接口的唯一标识,而不是对设备的唯一标识
7.2 MAC地址结构
-
MAC地址结构,由48个比特即6个字节组成,可以用48/4=12个16进制表示
-
MAC地址的第一个字节的b0位表示单播(0)或多播(1);第一个字节的b1位表示全球管理(0)或者本地管理(1);因此MAC总共可以分为如下四类,各站1/4:
-
MAC地址的发送顺序:字节发送顺序为第一字节到第六字节;比特发送顺序为b0-b7
7.3 单播MAC地址
- 主机通信构建单播帧的时候,首先在帧首部的目的地址字段填入目的主机的MAC地址,源地址字段填入自己的MAC地址
- 其他主机接收到该帧后,检查主机MAC地址与帧首部的目的MAC地址是否匹配来判断接收还是丢弃该帧
7.4 广播MAC地址
- 主机通信构建广播帧的时候,首先在帧首部的源地址字段填入当前主机的MAC地址,然后在目的地址填入FF-FF-FF-FF-FF-FF表示该帧是一个广播帧
- 其他主机在收到帧后检查帧首部的目的地址,发现是一个广播帧,则接收该帧交付给上层处理
7.5 多播MAC地址
-
主机通信构建多播帧的时候,首先在帧首部的源地址字段填入当前主机的MAC地址,目的地址填入多播地址
判断MAC地址是单播还是多播的方法是看第一个字节的16进制数能够被二整除
-
其他主机在收到帧后检查目的地址是否存在于自己的多播组列表中,存在则接收该帧,否则丢弃
7.6 IP地址
-
IP地址是因特网上的主机和路由器所使用的地址,用于标识两部分信息:
- 网络编号:用于标识因特网中的网络
- 主机编号:用于标识同一网络中的不同主机或者路由器的各接口
如上图黄色部分标识网络编号,剩下的一位表示主机号
-
和MAC地址的区别在于:
-
MAC地址不能够划分网络,如果只是一个单独的网络不接入因特网,则可以仅使用MAC地址
-
如果接入因特网,则IP和MAC地址都要使用
-
从网络体系结构来看,IP目的地址和源地址封装在网络层首部,MAC目的地址和源地址封装在数据链路层首部中
-
在数据包转发过程中,各层之间可以看做是水平的逻辑通信,通信过程中,网络层的IP的源地址和目标地址始终没有变,而数据链路层的MAC源地址和MAC目的地址随着网络和链路的变化而变化
路由器的每个接口都被视作一个网络设备,因此拥有独立的IP和MAC地址
-
7.7 ARP协议
在上面的数据包转发过程中,数据链路层是怎么知道各个链路的目的MAC地址的呢?回答是可以通过目的IP地址查找目的主机的MAC地址:
-
首先主机会先从自己的ARP高速缓存中查找目的IP地址对应的MAC地址,如果命中则直接返回
-
否则主机需要以广播帧的形式(即目的MAC地址为FF-FF-FF-FF-FF-FF)发送一个请求报文,包含自身的IP和MAC地址以及目的主机的IP地址
-
其他主机在接收到请求帧后,如果发现主机IP和目的IP地址匹配,则将帧交付上层处理,上层ARP进程在解析ARP请求报文后发送响应报文(包含IP和MAC地址)以
单播帧
的形式进行响应,并将主机的MAC地址记录到自己的ARP高速缓存中 -
最初发送ARP请求报文的主机接收到单播帧后,检验发现目的IP和主机IP匹配,则将帧交付给上层ARP进程解析ARP响应报文,得到报文记录的目的主机的IP和MAC地址,并记录到主机的ARP高速缓存