计算机网络原理(六):链路层和局域网
- 链路层概述
- 差错检测和纠正技术
- 多路访问链路和协议
- 交换局域网
- 链路虚拟化:网络作为链路层
- 数据中心网络
- 回顾:Web页面请求的历程
一、链路层概述
为了方便讨论,将运行链路层协议的任何设备均称为节点(node),节点包括主机、路由器、交换机、WiFi接入点。把沿着通信路径连接相邻节点的通信信道称为链路(link),为了将一个数据报从源主机传输到目的主机,数据报必须通过延端到端路径上的各端链路传输,传输节点将数据报封装在链路层帧中,并将帧传输到链路中。
1.1链路层提供的服务
链路层的基本服务都是将数据报通过单一通信链路从一个节点移动到相邻节点,但所提供的服务细节能够随着链路层协议的不同而变化。链路层协议能够提供的可能服务包括:
成帧(framing):即将要传输的数据放到链路层帧的数据字段上,然后包括一些链路层协议的字段组成一个帧,这个链路层帧的封装操作称作成帧。
链路接入:媒体访问控制(Medium Access Control,MAC)协议规定了帧在链路上的传输规则。MAC协议既可以实现简单的点到点的传输,也可以实现多个节点之间的帧传输,即多个节点共享单个广播链路时的多路访问。
可靠交付:当链路层协议提供可靠交付服务时,它保证无差错地经链路层移动每个网络层的数据报。链路层的可靠交付服务通常是通过确认和重传实现的,还有链路层容易产生高差错率的链路的解决方法是通过纠正差错实现,而不是像运输层那样采用重传。
差错检测和纠正:当帧中的一个比特作为1传输时,接收方节点中的链路层硬件可能不正确地将其判断为0,反之亦然。这种比特差错是由信号衰减和电磁噪声导致的。通过发送节点在帧中包括差错检测比特,让接收点进行差错检查。差错检测不仅能检测比特的差错,还能准确的确定帧中差错出现的位置,因此可以在一定程度上准确的纠正这些差错。
链路层的主体部分是在网络适配器(network adapter)中实现的,网络适配器有时也称为网络接口卡(Network Interface Card,NIC)。位于网络适配器核心的是链路层控制帧,该控制器是一个实现了许多链路层服务(成帧、链路接入、差错检测等)的专用芯片,因此链路层控制器的许多功能是用硬件实现的。
尽管链路层的大部分是在硬件中实现的,但部分链路层功能是在运行于主机CPU上的软件中实现的。链路层的软件组件实现了高层链路层功能,如组装链路层寻址信息和激活控制器硬件。在接收端链路层软件响应控制器终端,处理差错条件和将数据报向上传递给网络层。所以链路层是硬件和软件的结合体。
二、差错检测和纠正技术
在前面提到过比特级差错检测和纠正,即对从一个节点到另一个物理连接的邻居节点的链路层帧中的比特损伤进行检测和纠正,它们通常是链路层提供的两种服务。
从上面的示图来说,在发送节点,为了保护比特免受差错,使用差错检测和纠正比特(Error-Detection and-Correction,EDC)来增强数据D。通常,要保护的数据不仅包括从网络从传递下来需要通过链路传输的数据报,而且包括链路帧首部中的链路级的寻址信息、序号、其他字段。链路级帧中的D和EDC都被发送到接收节点,在接收节点收到的比特D'和EDC‘。接收方的挑战是它只收到D'和EDC’的情况下,确定D'是否和初始的D相同,但需要注意即使采用差错比特检测也可能有未检出比特差错。因此采用一个差错检测方案都只能尽可能的使未检出比特差错概率减小,一般而言差错检测和纠错技术越复杂,导致的开销越大,这就需要更多的计算量及更多的差错检测和纠错比特。
传输数据中检测差错的3种技术:奇偶校验(它用来描述差错检测和纠正背后隐藏的基本思想)、检验和方法(它通常更多地应用于运输层)、循环冗余检测(它通常更多地应用在适配器中的链路层)。
2.1奇偶校验
所谓奇偶校验就是实现将数据和一个校验比特中的所有1的总数要么为奇数要么为偶数,如果是奇校验就保持数据和一个校验比特中的1的总数为奇数,如果是偶校验就保持数据和一个校验比特中的1的总数为偶数。
这个实现依据是因为每个比特要么为0要么为1,那么数据中的比特1的个数也就只有两个可能,要么是奇数个1要么是偶数个1,然后再在数据的末尾添加一个校验位。通过这个校验位来始终控制所有数据加上一个校验比特,其中的1的个数要么为偶数要么为奇数。来看下面这个比特偶校验示例:
在上面的示例中是一个16比特的数据和一个校验比特,数据比特中有9个1,因为是偶校验,所以校验比特位为1,这样就实现了数据比特于一位校验比特中的1的总数为10。
假设现在一个链路层发送方将这个数据和校验比特发送给相邻的节点,相邻的节点收到数据后检测数据和校验比特中的1的个数是否为偶数,如果为偶数它就会认为数据完整然后往下一个链路节点或传递给上层协议处理。如果是奇校验也是同理,这样的校验就存在一个风险,因为数据如果只出现一个比特出错,奇偶校验就可以百分百检测出来,但实际中是有可能出现多个比特损坏的,当发送生的比特错误为偶数个时就无法被检查出来,比如同时出现两个比特损坏这时候的校验也会被认为数据完整无误。
如果比特差错的概率小,而且比特之间的差错可以被看作是独立发生的,在一个分组中多个比特同时出错的概率将是极小,这种情况下奇偶校验位可能是足够的了。然而,测量已经表明了差错经常以“突发”方式聚集在一起,而不是独立地发生。在突发差错的情况下,使用单比特奇偶校验保护的一个帧未检测出差错的概率能够达到50%,显然这是不能接受的,为了解决这个问题单比特偶校验方案的二维一般化方案被提出来了,即二维奇偶校验(two-dimensional parity)方案。
二维奇偶校验:包含比特值改变的列和行的校验值都将会出现差错,因此接收方不仅可以检测到出现单个比特差错的列和行的索引来实际识别发生差错的比特并纠正它。
从概念上来看可能以下不能理解二维奇偶校验如何实现,实际上就是将数据比特分成多个行,然后分别在数的每个行列末尾添加一个校验比特,当一个比特出现错误时它所在的行列都可以识别出来并且还可以根据行列的索引知道是哪个数据出错了,那这时候就可实现数据纠正了,这是一举两得的事。
2.2检验和方法
关于检验和其实在计算机原理(三):运输层的3.2中就有详细的介绍了这里就不再重复介绍,检验和方法需要相对较小的分组开销,与下面马上要介绍的链路层CRC检测相比它的差错检测保护要弱一些。至于为什么在运输层使用检验和而链路层采用较复杂的CRC,这是因为运输层的差错检测采用软件实现,采用简单而快速的方案是重要的,而在链路层的差错检测在适配器中用专用的硬件实现,它能够快速执行更复杂的CRC操作。
2.3循环冗余检测:CRC
现今计算机网络中广泛应用的差错检测技术基于循环冗余检测(Cyclic Redundancy Check,CRC)编码,CRC编码也称为多项式编码(polynomial code),因为该编码能够将要发送的比特串看作为系数是0和1一个多项式,对比特串的操作被解析为多项式算术。
循环冗余检测也是检验和的一种方法,它是一种在二进制环境中更适合运算的方法。简单的来说循环冗余检测也是通过一种基于数据计算出一个值作为检验码,如果接收方基于数据计算出来的值与发送方在相对应字段中的值不一致,就表示数据出现了错误。虽然CRC有检测数据的能力,但并不能完全保证数据的完整性。实际中CRC广泛使用于以太网、802.11WiFi、ATM,下面就来看CRC的具体操作:
将数据比特D,看成是二进制的数据;
生成多项式G,双方协商r+1位模式(r次方),生成和检查所使用的位模式;
选择r位CRC附加位R,使得<D,R>正好被G整除(modulo 2),接收方知道G,将<D,R>除以G,如果非0余数表示检查出错,能检查出所有少于r+1位的突发错误。
关于上面这个数学公式建议先了解模2运算,可以直接参考相关资料,也可以参考我的一篇简单的模2运算解析博客:模2运算。然后再来看CRC的验证公式的推导原理:
对于数据检测来说,设备需要一个相对固定的值来对数据(即一个固定位数的二进制值,也是常说的多项式)进行检测,检测的方式就是实际发送的数据加上CRC的冗余位(基于约定的多项式算出来的一串二进制数据)除以约定多项式,如果整除就表示数据完整,如果不能整除就表示数据出错。
生成多项式在国际标准中定义了8、12、16、32位的二进制值,这个值满足以下条件即可:
生成多项式的最高位和最低位必须为1;
当传递信息(CRC码)任何一位发生错误时,被生成多项式做模2除后应该使其余数不为0;
不同位发生错误时,应该使余数不同;
对余数继续做模2除,应该使余数循环;
其实这些条件除了第一条说不说没啥意义,因为它就是前面讲的CRC检测的逻辑,下面来看CRC验证公式的具体推导:
①二进制数的位串表达式与二项式:假设现在一个二进制数为1011,它可以写成1*x3+0*x2+1x+1x0即1011的二项式表达式,即可以得到x3+x+1。
②生成多项式:假设链路层节点双方约定1001为多项式G的二进制值,那么同上可得它的多项式为G=x3+1。
③基于前面RCR的验证逻辑,发送数据D加上r位的冗余位除以一个生成多项式G要整除,那么就可以得到下面这个式子:
根据上面的约定那么就是期望D左移r位加上r位的冗余位R除以nG是成立的,简单的说就是G乘以n被等于D左移r位加上R,那么D左移r位可以表示为D*2r,即上面的式子可以写成D*2r➕R=nG。
如前面所属等式两边都用R异或(XOR,即模2加而没有进位)可得变换D*2r➕R XOR R=nG XOR R,因为模2加不进位即R XOR R就是0*x0,也就可以得到D*2r=nG XOR R,由这个式子就可以得到R就可以表示为D*2r除以G得余数,即R=remainder(D*2r/G)。
CRC发送方冗余位计算与接收方数据检测的示例演算过程:(如果前面的推导不理解可以直接看下面这个示例即可,但对于模2运算要有了解)
如果前面得推导不是很理解也没关系,可以直接来看下面这个例子,假设有数据D=101110,即d=6,约定r=3得情况下,那么R=remainder(D*23/1001),即R=remainder(101110000/1001),也就是说多项式G取r+1位得首位为1的二进制值就可以根据前面的公式得到一个r位的冗余位R,看下面的计算步骤:
三、多路访问链路和协议
广播链路(broadcast link):能够让多个发送和接收节点都连接到相同的、单一的、共享的广播信道上。“广播”表示当任何一个节点传输一个帧时,信道广播该帧,每个其他节点都收到一个副本。
多路访问问题(multiple access problem):即由于多个发送和接收点对一个共享广播信道的访问,形成的信道冲突与信道分配问题。
多路访问协议(multiple access protocol,即MAC协议):即节点通过这些协议来规范它们在共享广播信道上的传输行为,也被称为介质访问控制协议(即MAC)。采用分布式算法实现节点如何共享信道,即决定节点什么时候可以发送。关于共享控制的通信必须借助信道本身传输,没有带外的信道,个节点使用其协调信道使用,用于传输控制信息。
碰撞(collide):在广播链路中所有节点能够传输帧,所以多个节点可能会同时传输帧,当这种情况发生时所有节点同时接收到多个帧,这就是说传输的帧在所有的接收方发生碰撞了。
多路访问协议的类型:在以往的链路层技术发展中实现了几十种多路访问协议,这些协议可以划分为三种类型:
信道划分协议(channel partitioning proto-col):把信道划分成小片(时间、频率、编码),分配片给每个节点专用;
随机接入协议(random access protocol):信道不划分,允许冲突,冲突后恢复;
轮流协议(taking-turns protocol):节点依次轮流,但是有很多数据传输的节点可以获得较长的信道使用权;
在理想情况下,对于速率为R bps的广播信道,多路访问协议应该具有以下所希望的特性:
当仅有一个节点发送数据时,该节点具有R bps的吞吐量;
当有M个节点发送数据时,每个节点吞吐量为R/M bps。这不必要求M个节点中的每一个节点总是有R/M的瞬间速率,而是每个节点在一些适当定义的时间间隔内应该有R/M的平均传输速率;
协议是分散的,就是说不会因为某个节点故障使整个系统崩溃;
协议是简单的,使实现不昂贵;
3.1信道划分协议
在该系列博客的第一篇:计算机网络原理(一):计算机网络和因特网的分组交换中讨论过时分多路复用(TDM)、频分多路复用(FDM),这两种能够用于在所有共享信道节点之间划分广播信道,还有一种可以用于划分信道的是码分多址(Code Division Multiple Access,CDMA),下面逐个简介:
时分多路访问(Time Division Multiple Access,TDMA):
轮流使用信道,信道的时间分为周期;
每个站点使用每周期中固定的时隙(长度=帧传输时间)传输帧;
如果站点无帧传输,时隙空闲——浪费;
如:6站LAN,1、3、4有数据报,时隙2、5、6空闲
频分多路访问(Frequency Division Multiple Access,FDMA):
信道的有效频率范围被分成一个个小的频段;
每个站点被分配一个固定的频段;
分配给站点的频段如果没有被使用,则空闲;
如:6站LAN,1、3、4有数据报,频段2、5、6空闲
码分多路访问(Code Division Multiple Access,CDMA):所有站点在整个频段上同时进行传输,采用编码原理加以区分,完全无冲突。
3.2随机接入协议
在随机接入协议中,一个传输节点总是以信道的全部速率进行发送,当由碰撞时涉及碰撞的每个节点反复地重发它的帧(也就是分组),到该帧无碰撞地通过为止。但是当一个节点经历一次碰撞时,它不必立刻重发该帧。相反,它再重发该帧之前等待一个随机时延。涉及碰撞的每个节点独立地选择随机时延。随机MAC协议有很多,这里主要介绍其中三种:时隙ALOHA、ALOHA、CSMA(CSMA/CD、CSMA/CA)。
时隙ALOHA:时隙ALOHA跟前面信道划分的时分多路有点像,它也是将信道划分为固定的时隙,不同的是发送方和接收方不占用固定的时隙信道,而是不同的发送方在它需要发送数据时直接向链路发送数据,当遇到碰撞时在下一个时隙以一定概率重传。
时隙ALOHA的运行规则:当节点获取新的帧,在下一个时隙传输;传输时没有检测到冲突,即传输成功,节点能够在下一个时隙发送新帧;检测时如果检测到冲突,即传输失败,节点在每一个随后的时隙以概率p重传帧直到成功。
时隙ALOHA的优点:节点可以以信道带宽全速连续传输,可以实现高度分布的网络,仅需节点之间在时隙上的同步,实现简单。
时隙ALOHA的缺点:存在冲突,浪费时隙;即使有帧要发送仍然有可能存在空闲的时隙;节点检测冲突的时间要小于帧传输时间;需要时钟上同步。
时隙ALOHA的效率:当有很多节点,每个节点有很多帧要发送时,x%的时隙是成功传输帧的时隙。假设N个节点,每个节点都有很多帧要发送,在每个时隙中的传输概率是p;一个节点成功传输概率是p(1-p)N-1,即任何一个节点的成功概率是Np(1-p)N-1。那么N个节点的最大效率:求出f(p)=Np(1-p)N-1的最大p*,代入p*得到最大f(p*)=Np*(1-p*)N-1,N为无穷大时的极限为1/e=0.37,即时隙ALOHA的信道利用率为37%。
ALOHA:即无时隙ALOHA,当一帧首次到达,节点间立刻将该帧完整地传输进广播信道,如果一个传输的帧与一个或多个传输经历了碰撞,这个节点将立即以概率p重传该帧,否则该节点等待一个帧传输时间,在此之后它再以概率p传输该帧,或者以概率1-p在另一个帧时间等待。
ALOHA的运行规则(根据下图描述):当有帧需要传输时马上传输,如果冲突帧在t0发送,和其他在[t0-1,t0+1]区间内开始发送的帧冲突,和当前帧冲突的区间(其他帧在此区间开始传输)增大了一倍。
ALOHA的效率:P(指定节点成功)=P(节点传输),P(其他节点在[t0-1,t0]不传),P(其他节点在[t0,t0+不传]),P(指定节点成功)=p·(1-p)N-1·(1-p)N-1=p·(1-p)2(N-1)。选择最佳p、N趋向无穷大,P(指定节点成功)=1/(2e)=17.5%,效率比时隙ALOHA更差。
载波侦听多路访问(CSMA):在传输帧之前先侦听信道是否空闲,如果空闲传输帧,如果信道正在被使用则等待一个随机时间后再侦听信道直到确认信道空闲后传输帧。下面用载波侦听多路访问的两个规则来具体描述:
载波侦听:一个节点在传输前先侦听信道,如果来自另一个节点的帧正在信道上发送,节点则等待直到检测到一小段时间没有传输,然后开始传输。
碰撞检测:当一个传输节点在传输时一直在侦听此信道,如果它检测到另一个节点正在传输干扰帧,它就停止传输,再重复“侦听-当空闲时传输”循环之前等待一段随机时间。
信道传播时延:当一个节点向另一个节点传输数据时,当数据从发送节点全部流入信道,由于数据在信道上需要一段时间传输才能完全被接受节点全部接受,也就是说从发送节点全部发送完毕到接收节点全部接收之间有一个时间差,这个时间差就是信道传播的时延。
在上图中有四个节点,横轴表示每个节点的空间位置,纵轴表示时间。在时刻t0,节点B侦听到空闲,因为当前没有其他节点在传输,因此B节点开始传播;在B节点的比特沿着广播媒体向下传播比特时,在时刻t1D节点有一个帧要发送,尽管B节点在时刻t1时还正在传输,但B节点的比特还没有到达D,因此D节点在时刻t1侦听到信道是空闲的。这就是信道传播时延导致信道冲突。
具有碰撞检测的载波侦听多路访问(CSMA/CD):在上图中当B和D接收到了彼此的比特,此时它们都立即停止传输,这就是载波侦听多路访问协议中的碰撞检测机制,不传输一个无用的、损坏的帧有助于改善协议的性能,下面通过基于CSMA/CD的适配器的运行来了解碰撞检测的机制:
①适配器从网络层一条获得数据,准备链路层帧,并将其放入帧适配器缓存中;
②如果适配器侦听到信道空闲(即无信号能量从信道进入适配器),它开始传输帧。在另一方面,如果适配器侦听到信道正在忙,它将等待,直到侦听到没有信号能量时才开始传输帧;
③在传输过程中,是配置监视来自其他使用该广播信道的适配器的信号能量的存在;
④如果适配器传输整个帧而未检测到来自其他适配器的信道能量,该适配器就完成了该帧。在另一方面,如果适配器在传输时检测到来自其他适配器的信号能量,它中止传输;
⑤中止传输后,适配器等待一个随机时间量,然后返回步骤2;
CSMA/CD算法:即以太网以及DOCSIS电缆网络多路访问协议中的二进制指数后退算法,当传输一个给定帧时,在该帧经历了一连串的n次碰撞后,节点随机地从{0,1,2,...,2n-1}中选择一个K值。因此,一个帧经历的碰撞越多,K选择的间隔越大。
CSMA/CD效率:当有大量的活跃节点,且每个节点有大量的帧要发送时,帧在信道中无碰撞地传输的那部分时间在长期运行时间中所占的份额。为了给出效率的一个闭式的近似表示,令tprop表示信号能量在任意两个适配器之间传播所需的最大时间,令ttrans表示传输一个最大长度的以太网帧的时间(CSMA/CD效率推导超出本书的范围),下面是近似式:
当tprop变成0或当ttrans变成无穷大时效率接近1。
3.3轮流协议
轮流协议的具体实现协议也有很多种,这里主要讨论两种轮流协议:轮询协议、令牌传递协议。
轮询协议:要求节点之一被指定为主要节点,主要节点以循环的方式轮询每个节点。主节点首先向节点一发送一个报文告诉它能够传输的帧的最多数量,在节点1传输了某些帧后,主节点再告诉节点2能够传输的帧的最多数量,主节点以循环的方式轮询每个节点。其缺点是轮询本身消耗信道带宽,每个节点要等主节点轮询后开始传输,即使只有一个节点也需要等到轮询一周后才能够发送,而且节点失效时造成整个系统无法工作。
令牌传递协议:在这种协议中没有主节点,一个称为令牌的小的特殊帧循环从一个节点到下一个节点传递,当一个节点收到令牌时,仅当它有一些帧要发送时,它才持有这个令牌,否则它立即向下一个节点转发该令牌。令牌传递协议的缺点是本身也要消耗带宽,只有抓到令牌才可以传输,如果令牌在某个节点丢失整个系统无法传输,选哟等待复杂的机制重新生成令牌。
3.4DOCSIS:用于电缆因特网接入的链路层协议
一个电缆接入网通常在电缆网端将几千个住宅电缆调制解调器与一个电缆调制解调器端接系统(CMTS)连接,数据经电缆服务接口规范定义了电缆数据网络体系结构及其协议。DOCSIS使用FDM将下行和上行网络段划分为多个频率信道,CMTS在下行信道中传输的帧被所有信道上做接收的电缆调制器接收到,因为仅有单一的CMTS在下行信道上传输不存在多路访问,但在上行方向因为多个电缆调制解调器共享上行信道,需要处理多路访问的问题,采用时隙分配或竞争的方式来实现信道分配。
DOCSIS:TDM上行信道
采用TDM的方式将上行信道分成若干微时隙,由MAP指定;
站点采用分配给它的微时隙上行数据传输,在特殊的上行微时隙中,个站点请求上行微时隙,即竞争模式。竞争模式下各个站点对于时隙是随机访问的,一旦碰撞请求不成功,即在下行的MAP中没有为它分配,二进制退避等待选择时隙再上传。
四、交换局域网
4.1链路寻址与ARP
主机和路由器具有链路层地址,事实上更严格的说是主机或路由器的适配器(即网络接口)具有链路层地址,因此具有多网络接口的主机或路由器将具有与之相关联的多个链路层地址,就像它们具有与之相关联的多个IP地址一样。当要注意链路层交换机并不具有它们的接口相关链的链路层地址,这是因为链路层交换机的任务是在主机与路由之间承载数据报,交换机透明地执行该项任务,主机或路由器不必明确地将帧寻址到期期间的交换机。
4.1.1MAC地址
链路层地址有各种不同的称呼:LAN地址(LAN address)、物理地址(physical address)、MAC地址(MAC address),因为MAC地址最为流行,所以后面的内容将链路层地址称为MAC地址。对于大多数局域网而言,MAC地址长度6字节,共248个可能的MAC地址,这六个字节地址通常采用十六进制表示法,地址的每个字节被表示为一对十六进制数,每一位代表4比特。尽管MAC地址被设计为永久固定的,但用软件改变一块适配器的MAC地址是有可能的,但这里我们假设适配的MAC地址都是固定的。
没有给适配器的MAC地址都是唯一的,MAC地址空间统一由IEEE管理,各个产商购买组成224个地址一块空间为MAC地址的前24比特,让公司自己为每个适配器生成后24比特的唯一组合。
4.1.2地址解析协议
因为存在网络层地址(因特网IP地址)和链路层地址(MAC地址),所以它们之间需要进行转换。对于因特网而言,这是地址解析协议(Address Resolution Protocol,ARP)的任务。
在上图表示的局域网中,假设IP地址为137.196.7.78的A主机要向IP地址137.196.7.88的B主机发送IP数据报,如果要实现这一目标,A主机不仅要向它的适配器提供IP数据报,还要提供目的主机B的MAC地址,然后发送适配器将构造一个包含目的地的MAC地址的链路层帧,并把该帧发送进局域网,局域网内部通过基于MAC地址节点树传输到主机B的适配器,主机B的适配器再从链路层帧解析出IP分组交给主机B的网络层处理。
在上面的示例中重要的问题是主机A如何直到主机B的MAC地址,就是这部分内容要介绍地址解析协议(ARP),下面通过ARP的运行规则来了解:
在LAN上的每个IP节点都有一个ARP表,ARP表:包括一些LAN节点IP/MAC地址的映射,即<ip address; MAC address; TTL>,TTL时间是指地址映射失效的时间(一般是20min);
A要发送帧给B(B的IP地址已知),但B的MAC地址不在A的ARP表中;
A广播包含B的IP地址的ARP查询包:Dest MAC address = FF-FF-FF-FF-FF-FF,LAN上的所有节点都会收到该查询包;
B接收到ARP包,回复A自己的MAC地址:帧发送给A,用A的MAC地址(单播)。
A在自己的ARP表中,缓存IP-to-MAC地址映射关系,直到信息超时,这个超时机制一般采用定期刷新维持的系统状态,因为定期刷新周期之间维护的状态信息可能和原有系统不一致。
ARP是即插即用的,节点自己创建ARP表项,无须网络管理员干预。
4.1.3发送数据报到子网以外
前面讲的地址解析协议解决了一个子网内部的网络层与链路层的地址交换关系,如果一个子网要向另一个子网发送数据报呢?其实这个和简单,在之前的相关博客中介绍过路由器上的每个端口都对应着一个IP地址和一个MAC地址,当一个子网要向另一个子网发送数据包时,发送方先将数据包分装在链路帧中发送给于其对应的路由器的端口,当路由器对应发送方的端口收到链路帧以后,路由器从链路帧中提取数据包,然后再根据数据包中的IP地址交给接收方对应的交换机的端口,在接收方对应的交换机端口上将数据报封装到链路帧在发送给接收方,具体通过下面的例子来解析:
A主机要向B主机发送一个数据报,假设A直到B的IP地址;
在R交换机上有两个ARP表,分别对应两个LAN;
在源主机A的路由表中,发现到目标主机的下一跳是111.111.111.110,在源主机的ARP表中,发现其MAC地址是E6-E9-00-17-BB-4B;
A创建数据报,源IP地址:A,目标IP地址:B。A创建一个链路层帧,MAC地址是R,该帧包含A到B的IP数据报;
帧从A发送到交换机R,交换机R从中提取出IP分组,交给上层IP协议实体;
交换机R转发数据报,数据报源IP地址为A,目标IP地址为B。R创建一个链路层帧,目标MAC地址为B,帧中包含A到B的IP数据报。
4.2以太网
关于以太网的相关内容建议查看我的另一篇基于计算机网络原理(TCP/IP协议三)的相关内容,这一片介绍了很多关于以太网的技术细节,当前博客内容在这篇博客的基础上在这节做一些补充。
以太网的物理拓扑:包含两个结构模式,即总线、星型。
总线:所有节点在一个碰撞域内,依次只许一个节点发送。可靠性差,入宫介质破损,截面形成信号的反射,发送节点误认为是冲突(总是冲突)。这种模式在上个世纪90年代很流行。
星型:采用hub或switch方式连接,交换机在中心,每个节点以及相连的交换机端口使用以太网协议,不会和其他节点发生碰撞。
以太网帧结构:
在计算机网络原理(TCP/IP协议三)中已经对以太网各种帧结构和字段有详细的介绍了,这里补充一些在之前的博客中可能没有涉及或者没有具体介绍的内容。
前同步码:以太网以一个八字节的前同步码字段开始,该前同步码的前7个字节都是10101010,最后一个字节是10101011,前同步码字段前7个字节用于“唤醒”接收适配器,并且将它们的时钟和发送方同步。适配器的目的是根据以太网类型的不同,分别以10Mbps、100Mbps、1Gbps的速度传输帧,而不是以而定速率传输,相对于额定速率总有一些漂移,局域网上的其他适配器不会预先知道这种漂移。接收适配器只需要通过锁定前同步码7字节的比特,就能够锁定适配器的时钟。前同步码的第8个字节的最后两个比特告诉适配器重要的内就要到来了。
CRC:即冗余循环检测字段,在有的相关文档和资料中也用FCS表示,即帧校验序列,目的使得接受适配器检测帧中是否引入了差错,关于这个字段的用途在前面已经有详细的介绍了。
类型:类型允许以太网复用多种网络层协议,IP和其他链路层协议都由它们各自的标准化的类型编号,比如链路用来实现生成树的BPDU帧,还有前面介绍的用来实现地址解析的ARP帧,网络层协议Nocell IPX和Apple Talk等。
目的地址和源地址都是链路层的地址,即48位MAC地址。
以太网的服务是无连接、不可靠的,帧传输前发送方和接收方之间没有握手,接收方适配器不发送ACKs和NAKs,以太网采用二进制退步的CSMA/CD介质访问控制形式,虽然介质访问控制有重发机制,但会在超时时直接丢弃帧。
4.3链路层交换机
交换机自身对子网中的主机和路由器是透明的,也就是说某主机/路由器向另一个主机/路由器寻址一个帧,顺利地将该帧送进局域网,并不知道某交换机会接收该帧并将它转发到另一个节点。这些帧到达交换机的恩赫输出接口之一的速率可能暂时会超过该接口的链路容量,为了解决这个问题,交换机接口设有缓存,这非常类似于路由器接口为数据报设有缓存。
交换机转发与过滤:过滤是决定一个帧应该转发到某接口还是应该将其丢弃的交换功能,转发是决定一个帧应该被导向哪个接口,并将该帧移动到那个接口的交换功能。交换机的过滤和转发借助交换机表完成。该交换机表包含某局域网上某些主机和路由器的但不必是全部的表项。交换机表中一个表项包含:一个MAC地址、通向该MAC地址的交换机接口、表项放置在表中的时间。
自学习:交换机的表是自动、动态、自治地建立的,即没有来自网络管理员或来自配置协议的任何干预,也就是交换机的自学习功能。关于交换机的自学习细节可以参考计算机网络原理(TCP/IP协议三)中的3.3生成树协议,关于交换机的自学习实现方式下面做一些简单的介绍:
1.交换机表初始为空;
2.对于每个接口接收到的每个入帧,该交换机在其表中存储:该帧的源地址字段中的MAC地址、该帧到达的接口、当前时间,交换机以这种方式在它的表中记录了发送节点所在的局域网网段,如果在局域网上的每个主机最终都发送了一个帧,则每个主机最终将在这张表中留有记录;
3.如果在一段时间(老化期)后,交换机没有接收到以该地址作为源的帧,就在表中删除这个地址。以这种方式,如果一台PC被另一台PC替代,原来PC的MAC地址将最终从该交换机表中被清除掉。
交换机是即插即用设备,因为它们不需要网络管理员或用户的干预。
链路层交换机的性质:交换机相比总线或基于集线器的模式,其星型拓扑那样的广播链路有几个优点:
消除碰撞:在使用交换机构建的局域网中,没有因碰撞而浪费带宽。即交换机缓存帧且却不会在网段上同时传输多余一个帧,就像使用路由器一样,交换机的最大聚合带宽是该交换机所有接口速率之和,因此交换机提供了比使用广播链路的局域网高得多的性能改善。
异质的链路:交换机将链路彼此隔离,因此局域网中的不同链路能够以不同的速率运行并且能够在不同的媒体上运行。
管理:除了提供强化的安全性,交换机也易于进行网络管理。例如一个适配器工作异常并持续发送以太网帧,交换机能够检测到该问题,并在内部断开异常适配器。交换机可以收集带宽使用的统计数据、碰撞率、流量类型等信息,为网络管理者使用。这些信息能够用于调试和解决问题,并规划局域网在未来应当演化的方式。
交换机和路由器比较:路由器使用网络层地址转发分组的存储转发分组交换机,尽管交换机也是一个存储转发分组交换机,但它和路由器是根本不同的,因为他用MAC地址转发分组。交换机是第二层的分组交换机,而路由器是第三层的分组交换机。
现代交换机转发基于目的MAC地址的第二层帧,也能够转发使用数据报目的的IP地址的第三层数据报,交换机使用OpenFlow标准的交换机能够基于11个不同的帧、数据报、运输层首部字段执行通用的分组转发。
即使交换机和路由器从根本上是不同的,当在实际安装互联网设备时也经常必须在他们之间进行选择。网络管理员本来可以很容易地使用路由器而不是交换机来互联各系的局域网、服务器、互联网网关路由器,路由器的确使得各系之间不产生碰撞,既然交换机和路由器都是候选互联设备,那么这两种方式的优点和缺点是什么?
交换机的优缺点:
交换机是即插即用的;
交换机还能够具有相对高的分组过滤和转发速率,因为交换机因为交换机只需要处理第二层的帧,而路由器必须处理第三层的数据报;
为了防止广播帧的循环,交换网络的活跃拓扑限制为一棵树,另外一个大型交换网络将要求在主机和路由器中有大的ARP表,这将生成可观的ARP流量和处理量。而且交换机对广播风暴并不提供任何保护措施,即如果某主机出现了故障并传输没完没了的以太网帧流,该交换机将转发所有这些帧,使得整个以太网崩溃。
路由器的优缺点:
因为网络寻址通常是分层次的,即使当网络中存在冗余路径,分组通常也不会通过路由器循环;
对于广播分组做限制;
不是即插即用设备,需要配置网络地址(子网前缀);
交换机是网络结构中的第三层设备,效率相对于第二层的交换机要低。
4.4虚拟局域网(VLANS)
关于虚拟局域网在计算机网络原理(TCP/IP协议三)中的3.3.7中有详细的实现细节内容,当前这篇博客再来补充一些相关内容。
虚拟局域网构建的动机是建立在交换机局域网的缺点上的,在交换机局域网中有3个缺点:
缺乏流量隔离:尽管以太网交换机分级结构把组流量局域化到一个单一交换机中,但广播流量(如ARP、DHCP)仍然必须跨越整个机构的网络,这会导致流量的浪费也会存在安全隐患;
交换机的无效使用:比如96端口/10个有用,这给网络管理带来麻烦,也是流量的浪费;
管理用户:如果用户在不同的组间移动,必须改变物理布线。
以上的问题可以通过虚拟局域网(Virtula Local Network,VLAN)的交换机来处理,带有VLAN功能的交换机可以被配置成一个物理LAN基础设施,虚拟成多个LANs。即基于端口的VLAN,交换机端口成组,以至于单个交换机可以分成若干虚拟LANs,这些虚拟LANs就像一个独立的交换机。
下面概括性的总结VLAN的提供的功能:
流量隔离:在同一个交换机或者多个交换机之间,流量只通过其所属的虚拟LAN的端口;
动态成员:成员可以在VLANs之间动态分配;
在VLANs间转发:通过路由器进行转发(实际操作中,根据产商提供的设备而定);
五、链路虚拟化:网络作为链路层
将链路视为连接两台通信主机的物理线路,在多路访问协议中多台主机通过一条共享的线路连接起来,并且连接主机的“线路”能够是无线电频谱或其他媒体,这使得将链路更多的抽象为一条信道,而不是作为一条线路。在两台主机之间由拨号调制解调器连接的场合,连接这两台主机的链路实际上是电话网,这是一个逻辑上分离的、全球性的电信网络,他有自己的用于数据传输和信令的交换机、链路和协议栈。然而,从因特网链路层的观点看,通过电话网的拨号连接被看作一根简单的“线路”。在这个意义上,因特网虚拟化了电话网,将电话网看成为两台因特网主机之间提供链路层连接的链路层技术。
这里我们将考虑多协议标签交换(MPLS)网络,与电路交换的电话网不同,MPLS客观上讲是一种分组交换的虚拟电路网络,它们有自己的分组格式和转发行为。从因特网的观点看,认为MPLS像电话网和交换以太网一样,作为IP设备提供互联网的链路层技术,因此在链路层讨论MPLS。
多协议标签交换(Multiprotocol Label Switching,MPLS):它采用来自虚电路网络领域的一个关键概念:固定长度标签,其目的是基于固定长度标签和虚电路的技术,在不放弃基于目的地IP数据报转发的基础设施的前提下,当可能时通过选择性地标识数据报并允许路由器基于固定长度的标签转发数据报来增强其功能。重要的是这些技术与IP协同工作,使用IP寻址和路由选择,IETF在MPLS协议中统一了这些努力,有效地将虚电路技术综合进了路由选择的数据报网络。
MPLS的路由器处理的链路层帧格式:
从上图是一个MPLS使能的路由器之间传输的一个链路层帧,该帧具有一个小的MPLS首部,该首部增加到第二层(如以太网)首部和第三层(即IP)首部之间,RFC3032定义了用于这种链路的MPLS首部格式,用于ATM和帧中继网络的首部也定义在其他的RFC文档中。
MPLS首部中的字段是:标签、预留的3个比特实验字段、1比特S字段(用于指示一系列“成栈”的MPLS首部的结束)、寿命字段。
一个MPLS加强的帧仅能在两个均为MPLS使能的路由器之间发送,一个MPLS使能的路由器常被称作标签交换路由器(label-switched router),因为它通过在其转发表中查找MPLS标签,然后立即将数据报传递给适当的输出接口来转发MPLS帧。因此,MPLS使能的路由器不需要提取目的IP地址和在转发表中执行最长前缀匹配的查找,但路由器怎样才能知道它的邻居是否的确是MPLS使能呢?路由器如何知道哪个标签与给定IP目的地相联系呢?下面通过一组MPLS使能路由器之间的交换过程来理解:
在上图的示例中,路由器R1到R4都是MPLS使能的,R5和R6是标准的IP路由器。
R1向R2和R3通告它(R1)能够路由到目的地A,并且具有MPLS标签6的接收帧将要转发到目的地A;
路由器R3已经向路由器R4通告了它能够路由到目的地A和D,分别具有MPLS标签10和12的入帧将要朝着这些目标地交换;
路由器R2也向路由器R4通告了它(R2)能够到达目的地A,具有MPLS标签8的接收帧将朝着A交换;
注意路由器R4现在处于一个到达A且具有两个MPLS路径,经接口0具有出MPLS标签10,经接口1具有MPLS标签8。
在上面示例中的外围部分是IP设备R5、R6、A、D,它们经过具有一个MPLS基础设施连接在一起,这与一个交换局域网或ATM网络能够将IP设备连接到一起的方式十分相似。并且与交换局域网或ATM网络相似,MPLS使能路由器R1和R4完成这些工作时没有接触分组的IP首部。
这里不介绍MPLS使能路由器之间分布标签的特定协议,在IETF的MPLS工作组已经在RFC3468中定义了RSVP协议的一种扩展,称之为RSVP-TE[RFC3209],它将关注对MPLS信令所做的工作。
关于MPLS实际上如何计算在MPLS使能路由器之间分组的路径,以及它如何收集链路状态信息以用于这些路径计算中这里都讨论了,现有的链路状态路由选择算法已经扩展为向MPLS使能路由器“泛洪”,实际上路径计算算法没有标准化,而是各个厂商特定的算法。
实际应用中MPLS有被用于一种简单形式的流量工程,其中网络运行者能够超普通IP路由器选择,迫使某些流量沿着一条路径朝着某给定目的地引导,并且朝着相同目的地的其他流量沿着另一条路径流动。MPLS还有其他应用场景,比如能用于执行MPLS转发路径的快速恢复(经过一条预计算的无故障路径重路由流量来对链路故障做出反应),还能够并且已经用于实现所谓虚拟专用网(Virtual Private Network,VPN)。
在为用户实现一个VPNR的过程中,ISP使用它的MPLS使能网络将用户各种网络连接在一起,MPLS能被用于将资源和由用户的VPN使用的寻址方式相隔离,其他用户利用该VPN跨越该ISP网络,详细可以参考[DeClercq2002]。
六、数据中心网络
数据中心网络支持两种类型的流量:在外部客户与内部主机之间流动的流量,以及内部主机之间流动的流量,为了处理外部客户与内部主机之间流动的流量,数据中心网络包括一台或多台边界路由器(border router),它们将数据中心网络与公共因特网相连。数据中心网络因此需要将所有机架彼此互联,并将机架与边界路由器相连。数据中心网络设计和协议设计专注于机架彼此互联和与边界路由器相连。
6.1负载均衡
为了支持自外部客户的请求,每一个应用都与一个公开可见的IP地址关联,外部用户向该地址发送其请求并从该地址接收响应。载数据中心内部,外部请求首先被定向到一个负载均衡器(load balancer)。负载均衡的任务是向主机分发请求,以主机当前的负载作为函数来在主机之间均衡负载。
一个大型的数据中心通常会有几台负载均衡器,每台服务于一组特定的云应用。由于负载均衡器基于分组的目的端口号以及目的IP地址做决策,因此它们常被称作“第四层交换机”。一旦接收到一个对于特定应用程序的请求,负载均衡器将该请求分发到该应用的某一台主机上。当主机处理完该请求后,向负载均衡器回送响应,再由负载均衡器将其中继发回外部客户。
负载均衡器不仅平衡主机间的工作负载,还提供类似NAT的功能,将外部IP地址转换为内部适当主机的IP地址,然后将反方向流向客户的分组按照相反的转换进行处理。这防止客户直接接触主机,从而具有隐藏网络内部结构和防止客户直接与主机交换等安全性。
6.2体系结构
对于仅有数千台主机的小型数据中心,一个简单的网络也许就足够了,这种简单网络由一台边界路由器、一台负载均衡器和几十个机架组成,这些机架由单一以太网交换机进行互联。但当主机数量扩展到几万至十几万的时候,数据中心通常应用路由器和交换机等级结构。
对于数据中心网络这里做一个简单介绍,具体内容到后期的云服务大数据相关内容具体介绍。
(关于Web页面请求历程等网络层相关内容介绍完了再回来补充)