链路层概述
将运行链路层协议的任何设备均称为节点(node)。节点包括主机、路由器、交换机和WiFi接入点。把沿着通信路径连接相邻节点的通信信道称为链路(link)。为了将一个数据报从源主机传输到目的主机,数据报必须通过沿端到端路径上的各段链路传输。
链路层提供的服务
任一链路层的基本服务都是将数据报通过单一通信链路从一个节点移动到相邻节点,但所提供的服务细节能够随着链路层协议的不同而变化。链路层协议能够提供的可能服务包括:
- 成帧。在每个网络层数据报经链路传送之前,几乎所有的链路层协议都要将其用链路层帧封装起来,一个帧由一个数据字段和若干首部字段组成,其中网络层数据报就插在数据字段中。
- 链路接入。媒体访问控制(Medium Access Control,MAC)协议规定了帧在链路上传输的规则。无论何时链路空闲,发送方都能够发送帧。
- 可靠交付。当链路层协议提供可靠交付服务时,它保证无差错地经链路层移动每个网络层数据报。链路层的可靠交付服务通常是通过确认和重传取得的。
- 差错检测和纠正。通过让发送节点在帧中包括差错检测比特,让接收节点进行差错检查。
链路层在何处实现
下图显示了一个典型的主机体系结构。链路层的主体部分是在网络适配器中实现的, 网络适配器也称为网络接口卡(Network Interface Card,NIC)。位于网络适配器核心的是链路层控制器,该控制器通常是一个实现了许多链路层服务的专用芯片,(链路层控制器的许多功能是用硬件实现的)
在发送端,控制器取得了由协议栈较高层生成并存储在主机内存中的数据报,在链路层帧中封装该数据报(填写该帧的各个字段),然后遵守链路接入协议将该帧传进通信链路中。在接收端,控制器接收了整个帧,抽取出网络层数据报。
尽管大部分链路层都是在硬件中实现的,但部分链路层是在运行于主机CPU上的软件中实现的。链路层的软件组件实现了高层链路层功能。链路层是硬件和软件的结合体。
差错检测和纠正技术
前面我们提到了比特级差错检测和纠正, 即对从一个节点发送到另一个物理上连接的邻近节点的链路层帧中的比特损伤进行检测和纠正。
下图是我们研究的场景,
在发送节点,为了保护比特免受差错,使用差错检测和纠正比特(Error-Detection and Correction,EDC)来增强数据D。通常,要保护的数据不仅包括从网络层传递下来需要通过链路传输的数据报,而且包括链路帧首部中的链路级的寻址信息、序号和其他字段。链路级帧中的D和EDC都被发送到接收节点,在接收节点,接收到比特序列D'和EDC',D'和EDC'可能与初始的D和EDC不同。
我们现在研究在传输数据中检测差错的3种技术:奇偶校验(它用来描述差错检测和纠正背后隐含的基本思想)、检验和方法(通常更多地应用于运输层)和循环冗余检测(通常更多地应用在适配器中的链路层)
奇偶校验
差错检测最简单的方式就是用单个奇偶校验位。 假设在下图中要发送的信息D有d比特。在偶校验方案种,发送方只需要包含一个附加的比特,使得这d+1比特(初始信息加上一个校验比特)中1的总数是偶数,(对于奇校验方案,选择校验比特值使得有奇数个1)。下图描述了一个偶校验的方案,单个校验比特被存放在一个单独的字段
采用单个奇偶校验位方式,接收方的操作也很简单,接收方只需要数一数接收的d+1比特中1的个数,
如果接收方发现了奇数个值为1的比特,接收方知道至少出现了一个比特差错(奇数个比特差错)
如果出现了偶数个比特差错,这将导致一个未检出的差错。这样是不够的,需要一个更健壮的差错检测方案
下图显示了单比特奇偶校验方案的二维一般化方案。这里的D中的d个比特被划分为i行j列。对每行和每列计算奇偶值。产生的i+j+1奇偶比特构成了链路层帧的产错检测比特
现在假设在初始d比特信息中出现了单个比特差错,使用这种二维奇偶校验方案,包含比特值改变的行和列的校验值都将会出现差错,因此接收方不仅可以检测到出现了单个比特差错的事实,而且还可以利用存在奇偶校验差错的列和行的索引来实际识别发生差错的比特并纠正它。
接收方检测和纠正差错的能力被称为前向纠正(Forward Error Correction,FEC)。
检验和方法
在检验和技术中,图6-4中的d比特数据被作为一个k比特整数的序列处理。一个简单检验和方法就是将这k比特整数加起来,并用得到的和作为差错检测比特。检验和方法需要相对小的分组开销。
循环冗余检测
计算机网络中广泛应用的差错检测技术基于循环冗余检测(Cyclic Redundancy Check,CRC)编码 。CRC编码也称为多项式编码,因为该编码能够将要发送的比特串看作为系数是0和1的一个多项式,对比特串的操作被解释为多项式算术。
CRC编码操作如下。
考虑d比特的数据D,发送节点要将它发送给接收节点,发送方和接收方首先必须协商一个r+1比特模式,称为生成多项式,将其表示为G,要求G的最高有效位比特(最左边)是1。CRC编码的关键思想如下图所示
对于一个给定的数据段D,发送方要选择r个附加比特R,并将它们附加到D上,使得得到的d+r比特模式(被解释为一个二进制数)用模2算术恰好能被G整除
用CRC进行差错检测的过程很简单:接收方用G去除接收到的d+r比特,如果余数非0,接收方知道出现了差错,否则认为数据正确而被接收
(模2算术,乘法和除法与在二进制中是相同的,在加法中不进位,在减法中不借位,加法和减法等价于操作数的按位异或(XOR))
那么发送方如何计算R?对于n,R需要满足D*2^r XOR R=nG,也就是说需要选择R使得G能够除以D*2^r XOR R而没有余数。对上式等式的两边都用R异或将得到D*2=nG XOR R,这个等式告诉我们,如果用G来除D*2^r,余数值刚好是R。可以这样计算R
R=remainder(D*2^r/G)
多路访问链路和协议
前面提到了两种类型的网络链路:点对点链路和广播链路。点对点链路由链路一端的单个发送方和链路另一端的单个接收方组成。广播链路能够让多个发送和接收节点都连接到相同的、单一的、共享的广播信道上。
如何协调多个发送和接收节点对一个共享广播信道的访问?即就是多路访问问题。
传统的电视是一种一个方向的广播(即一个固定的节点向许多接收节点传输),而计算机网络广播信道上的节点既能够发送也能够接收。计算机网络的多路访问协议来规范它们在共享的广播信道上的传输行为。
因为所有的节点都能够传输帧,所以多个节点可能会同时传输帧。当发生这种情况时,所有节点同时接到多个帧,这就是说,传输的帧在所有的接收方处碰撞。通常当碰撞发生时,没有一个接收节点能够有效地获得任何传输的帧,在碰撞时间间隔中的广播信道被浪费了。为确保广播信道执行有用的工作,以某种方式协调活跃节点的传输是必要的,这种协调由多路访问协议负责:信道划分协议,随机接入协议,轮流协议
信道划分协议
时分多路复用(TDM)和频分多路复用(FDM)是两种能够用于在所有共享信道节点之间划分广播信道带宽的技术
假设一个支持N个节点的信道且信道的传输速率为Rbps。TDM将时间划分为时间帧(time frame),并进一步划分每个时间帧为N个时隙。然后把每个时隙分配给N个节点中的一个,无论何时某个节点在有分组要发送的时候,它在循环的TDM帧中指派给它的时隙内传输分组比特(通常选择的时隙长度应使一个时隙内能够传输单个分组)
TDM消除了碰撞而且非常公平:每个节点在每个帧时间内得到了专用的传输速率R/N bps。
然而也有两个主要缺陷,首先节点被限制于R/N bps的平均速率,即使当它是唯一有分组要发送的节点时。其次,节点必须总是等待它在传输序列中的轮次,即使它是唯一一个有帧要发送的节点。
TDM在时间上共享广播信道,而FDM将R bps信道划分为不同的频段(每个频段具有R/N带宽),并把每个频率分配给N个节点中的一个,FDM的主要缺点是限制一个节点只能使用R/N的带宽。
第三种信道划分协议是码分多址(Code Division Multiple Access,CDMA)。TDM和FDM分别为节点分配时隙和频率,而CDMA对每个节点分配一种不同的编码。然后每个节点用它唯一的编码来对它发送的数据进行编码。
随机接入协议
在随机接入协议中,一个传输节点总是以信道的全部速率(即R bps)进行发送。当有碰撞时,涉及碰撞的每个节点反复地重发它的帧(也就是分组),到该帧无碰撞地通过为止。但是当一个节点经历一次碰撞时,它不必立刻重发该帧。相反,它在重发该帧之前等待一个随机时延。 涉及碰撞的每个节点独立地选择随机时延。
常用的随机接入协议:ALOHA协议和载波侦听多路访问(CSMA)协议
时隙ALOHA
假设
- 所有帧由L比特组成
- 时间被划分为长度L/R秒的时隙(即一个时隙等于传输一帧的时间)
- 节点只在时隙起点开始传输帧
- 节点是同步的,每个节点都知道时隙何时开始
- 如果在一个时隙中有两个或多个帧碰撞,则所有节点在该时隙结束之前检测到该碰撞事件
p是一个概率,在每个节点中,时隙ALOHA的操作是简单的:
- 当节点有一个新帧要发送时,它等到下一个时隙开始并在该时隙传输整个帧
- 如果没有碰撞,该节点成功地传输它的帧,从而不需要考虑重传该帧
- 如果有碰撞,该节点在时隙结束之前检测到这次碰撞。该节点以概率p在后续的每个时隙中重传它的帧,直到该帧被无碰撞地传输出去
与信道划分不同,当某节点是唯一活跃的节点时(一个节点如果有帧要发送就认为它是活跃的),时隙ALOHA允许该节点以全速R连续传输,时隙ALOHA也是高度分散的,因为每个节点检测碰撞并独立地决定什么时候重传。
当有多个活跃节点时,一部分时隙将有碰撞,因此将被“浪费”掉了;时隙的另一部分将是 空闲的,因为所有活跃节点由于概率传输策略会节制传输。
唯一“未浪费的”时隙是那些刚好有一个节点传输的时隙,称为成功时隙。时隙多路访问协议的效率定义为:当有大量的活跃节点且每个节点总有大量的帧要发送时,长期运行中成功时隙的份额。
当有N个活跃节点时,时隙ALOHA的效率是Np(1-p)^(N-1)。该协议的最大效率为1/e
ALOHA
时隙ALOHA协议要求所有的节点同步它们的传输,以在每个时隙开始时开始传输。
第一个ALOHA协议实际上是一个非时隙、完全分散的协议。在纯ALOHA中,当一帧首次到达(即一个网络层数据报在发送节点从网络层传递下来),节点立刻将该帧完整地传输进广播信道。如果一个传输的帧与一个或多个传输经历了碰撞,这个节点将立即(在完全传输完它的碰撞帧之后)以概率p传输该帧。否则该节点等待一个帧传输时间。纯ALOHA协议的最大效率为1/2e,是时隙ALOHA的一半
载波侦听多路访问(CSMA)
在时隙和纯ALOHA中,一个节点传输的决定独立于连接到这个广播信道上的其他节点的活动。特别是一个节点不关心在它开始传输时是否有其他节点碰巧在传输,而且即使有另一个节点开始干扰它的传输也不会停止传输。
- 载波侦听。即一个节点在传输前先听信道。如果来自另一个节点帧正向信道上发送,节点则等待直到检测到一小段事件没有传输,然后开始传输
- 碰撞检测。当一个传输节点在传输时一直在侦听此信道。如果它检测到另一个节点正在传输干扰帧,它就停止传输,在重复”侦听-当空闲时传输“循环之前等待一段随机时间
这两个 规则包含在载波侦听多路访问(Carrier Sense Multiple Access,CSMA )和具有碰撞检测的CSMA协议族中。
下图显示了连接到一个线状广播总线的4个节点(A,B,C,D)的时空图,横轴表示每个节点在空间的位置,纵轴表示时间
在t0时刻,节点B侦听到信道是空闲的,因为当前没有其他节点在传输。因此节点B开始传输,沿着广播媒体在两个方向上传播它的比特,B的比特传输实际所需要的时间不是0。在t1时刻,节点D有一个帧要发送。尽管节点B在时刻t1正在传输,但B传输的比特还没有到达D,因此D在t1侦听到信道空闲。根据CSMA协议,从而D开始传输它的帧,一个短暂的时间之后,B的传输开始在D干扰D的传输。广播信道的端到端信道传播时延在决定其性能方面起着关键的作用。
具有碰撞检测的载波侦听多路访问(CSMA/CD)
在上图中,节点没有进行碰撞检测,即使已经出现了碰撞,B和D都将继续完整地传输它们的帧。当某节点执行碰撞检测时,一旦检测到碰撞将立即停止传输,下图显示了这种情况,只是这两个节点在检测到碰撞后很短的时间内都放弃了它们的传输
从与广播信道相连的适配器(在节点中)的角度总结它的运行:
(1)适配器从网络层获得数据报,准备链路层帧,并将其放入帧适配器缓存中
(2) 如果适配器侦听到信道空闲,它开始传输帧;如果侦听到信道正忙,它将等待,直到侦听到没有信号时才开始传输
(3)在传输过程中,适配器监视来自其他使用该广播信道的适配器的信号能量的存在。
(4)如果适配器传输整个帧而未检测到干扰,该适配器就完成了该帧;如果检测到了干扰,它终止传输
(5)终止传输后,适配器等待一个随机时间量,然后返回步骤2
等待一个随机(不是固定)的时间量。如果两个节点同时传输帧,然后它们等待固定的相同时间,它们将持续碰撞下去
轮流协议
多路访问协议的两个理想特性是:① 当只有一个节点活跃时,该活跃节点具有R bps的吞吐量;②当有M个节点活跃时,每个活跃节点的吞吐量接近R/M bps。ALOHA和CSMA协议具备第一个特性,但不具备第二个特性。
讨论两种比较重要的协议:轮询协议和令牌传递协议
轮询协议要求这些节点之一要被指定为主节点。主节点以循环的方式轮询每个节点。主节点首先向节点1发送一个报文,告诉它(节点1)能够传输的帧的最多数量。在节点1传输了某些帧后,主节点告诉节点2它(节点2)能够传输的帧的最多数量。(主节点能够通过观察信道上是否缺乏信号来决定一个节点何时完成了帧的发送),以上过程以这种方式继续进行,主节点以循环的方式轮询了每个节点 轮询协议消除了困扰随机接入协议的碰撞和空时隙
令牌传递协议。这种协议没有主节点,一个称为令牌的小的特殊帧在节点之间以某种固定的次序进行交换。当一个节点收到令牌时,仅当它有一些帧要发送时,它才持有这个令牌;否则它立即向下一个节点转发该令牌。令牌传递是分散的并且有很高的效率。但是一个节点的故障可能会使整个信道崩溃。
交换局域网
链路层寻址和ARP
MAC地址
实际上并不是主机或路由器具有链路层地址,而是它们的适配器(网络接口)具有链路层地址。因此具有多个网络接口的主机或路由器将具有与之相关联的多个链路层地址。链路层交换机并不具有与它们的接口(这些接口是与主机和路由器相连的)相关联的链路层地址。这是因为链路层交换机的任务是在主机与路由器之间承载数据报;
链路层地址有各种不同的称呼:LAN地址、物理地址或MAC地址 。
MAC地址的一个有趣性质是没有两块适配器具有相同的地址
适配器的MAC地址具有扁平结构(与层次结构相反),而且不论适配器到哪里用都不会变化。与之形成对照的是,前面说过的IP地址具有层次结构(即一个网络部分一个主机部分),而且当主机移动时,主机的IP地址需要改变(改变到它所连接到的网络)
当某适配器要向某些目的适配器发送一个帧时,发送适配器将目的适配器的MAC地址插入到该帧中,并将该帧发送到局域网上。一台交换机偶尔将一个帧广播到它的所有接口,当适配器接收到一个帧时,将检查该帧中的目的MAC地址是否与它自己的MAC地址匹配,如果匹配,该适配器提取出封装的数据报,并将数据报沿协议栈向上传递;如果不匹配,该适配器丢弃该帧,而不会向上传播该网络层数据报。
有时某发送适配器的确要让局域网上所有其他适配器来接收并处理它发送的帧,此时,发送适配器在该帧的目的地址字段中插入一个特殊的MAC广播地址。(对于使用6字节地址的局域网,广播地址是48个连续的1组成的字符串(即16进制表示法表示的FF-FF-FF-FF-FF-FF))
地址解析协议
因为存在网络层地址(如IP地址)和链路层地址(MAC地址),所以需要在它们之间进行转换。这是地址解析协议的任务(Address Resolution Protocol,ARP)的任务
在下面的例子中,每台主机和路由器有一个单一的IP地址和单一的MAC地址。IP地址以点分十进制表示,MAC地址以16进制表示,假设交换机广播所有帧
假设IP地址为222.222.222.220的主机要向主机222.222.222.222发送IP数据报,源和目的均位于相同的子网中,为了发送数据报,源不仅需要向它的适配器提供IP数据报,还要提供目的主机222.222.222.222的MAC地址,然后发送适配器将构造一个包含目的地的MAC地址的链路层帧,并把该帧发送进局域网。
主机如何确定IP地址为222.222.222.222的目的主机的MAC地址?
使用ARP。在发送主机中的ARP模块将取在相同局域网上的任何IP地址作为输入,然后返回相应的MAC地址。
一个ARP将一个IP地址解析为一个MAC地址。在很多方面它与DNS类似,DNS将主机名解析为IP地址。然而这两种解析器之间的一个重要区别是,DNS为在因特网中任何地方的主机解析主机名,而ARP只为在同一个子网上的主机和路由器解析IP地址。
ARP是如何工作的?
每台主机或路由器在其内存中具有一个ARP表,这张表包含IP地址到MAC地址的映射关系,也包含了一个寿命(TTL)值,它指示了从表中删除每个映射的时间
如果发送方的ARP表具有目的节点的表项,则很容易发送;假如ARP表中没有目的主机的表项该怎么办呢?
发送方用ARP协议来解析这个地址。首先发送方构造一个特殊分组---ARP分组,一个ARP分组包括发送和接收IP地址已经MAC地址。ARP查询分组和响应分组都具有相同的格式。ARP查询分组的目的是询问子网上所有其他主机和路由器,以确定对应于要解析的IP地址的那个MAC地址。
222.222.222.220向它的适配器传递一个ARP查询分组,并且指示适配器应用该MAC广播地址(FF-FF-FF-FF-FF-FF)来发送这个分组。适配器在链路层帧中封装这个ARP分组,用广播地址作为帧的目的地址,并将该帧传输进子网中。包含该ARP查询的帧能被子网上的所有其他适配器接收到,并且(由于广播地址)每个适配器都把在该帧中的ARP分组向上传递给ARP模块,这些ARP模块中的每个都检查它的IP地址是否与ARP分组中的目的IP地址相匹配。与之匹配的一个给查询主机发送回一个带有所希望映射的ARP分组,然后查询主机222.222.222.220能够更新它的ARP表,并发送它的IP数据报,该数据报封装在一个链路层帧中,并且该帧的目的MAC就是对先前ARP请求进行响应的主机或路由器的MAC地址
查询ARP报文是在广播帧中发送的,而响应ARP报文在一个标准帧中发送
发送数据报到子网以外
子网中的某主机要向子网以外(跨越路由器的另一个子网)的主机发送网络层数据报的情况。
下图展示了一个由一台路由器互联两个子网所组成的网络
关于上图,每台主机仅有一个IP地址和一个适配器,但是一台路由器对它的每个接口都有一个IP地址,也有一个ARP模块和一个适配器
子网1中的一台主机如何向子网2中的主机发送数据报?
为了使数据报从111.111.111.111到子网2上的主机,该数据报必须首先发送给路由器接口111.111.111.110,它是通往最终目的地路径上的第一条路由器的IP地址,因此对于该帧来说,适当的MAC地址是路由器接口111.111.111.110的适配器地址(发送主机通过ARP得到),有了这个MAC地址,它创建一个帧(包含寻址到222.222.222.222的数据报),并把该帧发送到子网1中,子网1上的路由器适配器把该帧传递到路由器的网络层,路由器通过查询转发表转发到222.222.222.222接口,然后该接口把数据报传递给它的适配器,适配器把该数据报封装到一个新的帧中,并将该帧发送到子网2中。
以太网
以太网几乎占领着现有的有线局域网市场。
以太网帧结构
以太网帧结构如下图所示
考虑从一台主机间向另一台主机发送一个IP数据报,且这两台主机在相同的以太局域网上。设发送适配器(即适配器A)的MAC地址是AA-AA-AA-AA-AA-AA,接收适配器(即适配器B)的MAC地址是BB-BB-BB-BB-BB-BB。发送适配器在一个以太网帧中封装了一个IP数据报,并将该IP数据报传递给网络层。现在考察上图所示的以太网的6个字段:
- 数据字段(46~1500字节)。这个字段承载了IP数据报,以太网的最大传输单元(MTU)是1500字节。
如果IP数据报超过了1500字节,则主机必须将该数据报分片;数据字段的最小长度是46字节,如果IP数据报小于46字节,则数据报必须被填充到46字节。当填充时,传递到网络层的数据包括IP数据报和填充部分。网络层使用IP数据报首部中的长度字段来去除填充部分
- 目的地址(6字节)。这个字段包含目的适配器的MAC地址。当适配器收到一个以太网帧,帧的目的地址无论是目的适配器的MAC地址还是MAC广播地址,它都将该帧的数据字段的内容传递给网络层;如果收到了具有其他任何MAC地址的帧,则丢弃
- 源地址(6字节)。这个字段包含了传输该帧到局域网上的适配器的MAC地址
- 类型字段(2字节)。类型字段允许以太网复用多种网络层协议。主机能够使用除了IP以外的其他网络层协议,因此当以太网帧到达适配器B,适配器B需要知道它应该将数据字段的内容传递给哪个网络层协议。
- CRC(4字节)。CRC(循环冗余检测)字段的目的是使得接收适配器(适配器B)检测帧中是否引入了差错
- 前同步码(8字节)。以太网帧以一个8字节的前同步码字段开始。该前同步码的前7字节用于“唤醒”接收适配器,并将它们的时钟和发送方的时钟同步。第8个字节的最后两个比特警告适配器B,“重要的内容”要来了
链路层交换机
交换机的任务是接收入链路层帧并将它们转发到出链路
交换机转发和过滤
过滤是决定一个帧应该转发到某个接口还是应当将其丢弃的交换机功能。转发是决定一个帧应该被导向哪个接口,并把该帧移动到那些接口的交换机功能。 交换机的过滤和转发借助于交换机表完成。该交换机表包含某局域网上某些主机和路由器的但不必是全部的表项。交换机中的一个表项包含:①一个MAC地址②通向该MAC地址的交换机接口③表项放置在表中的时间
假定目的地址为DD-DD-DD-DD-DD-DD的帧从交换机接口x到达。交换机用MAC地址DD-DD-DD-DD-DD-DD索引它的表,有三种可能的情况
- 表中没有对于DD-DD-DD-DD-DD-DD的表项。在这种情况下,交换机向除接口x外的所有接口前面的输出缓存转发该帧的副本。换句话说,如果没有对于目的地址的表项,交换机广播该地址
- 表中有一个表项将DD-DD-DD-DD-DD-DD与接口x联系起来。在这种情况下,该帧从包括适配器DD-DD-DD-DD-DD-DD的局域网网段中到来。
- 表中有一个表项将DD-DD-DD-DD-DD-DD与接口y≠x联系起来。在这种情况下,该帧需要被转发到与接口y相连的局域网网段。交换机通过将该帧放到接口y前面的输出缓存完成转发功能
自学习
交换机的表是自动、动态和自治地建立的,换句话说,交换机是自学习的。
交换机是即插即用设备,因为它们不需要网络管理员或用户干预。
链路层交换机的性质
- 消除碰撞
- 异质的链路。交换机将链路彼此隔离,因此局域网中的不同链路能够以不同的速率运行并且能够在不同的媒体上运行
- 管理 。易于进行网络管理
交换机和路由器比较
路由器是使用网络层地址转发分组的存储转发分组交换机,交换机是用MAC地址转发分组。
交换机是第二层的分组交换机,路由器是第三层的分组交换机。