【2021-08-05 修订】【梳理】计算机网络:自顶向下方法 第六章 链路层和LAN(docx)

编程知识 更新时间:2023-04-20 13:49:11

计算机网络

知 识 梳 理

(第一版)

建议先修课程:数据结构。
配套教材:
Computer Networking - A Top Down Approach, 7th edition James F. Kurose, Keith W. Ross
参考书目:
1、计算机网络(第8版) 谢希仁 编著 高等教育出版社


链接:https://pan.baidu/s/1ryAUfV0VCd9R1tJRF9Dbwg
提取码:0000

六 链路层和LAN

6.1 链路层简介
地理上局限在小范围的局域网虽然是个网络,但我们并不把它放在网络层讨论。因为网络层主要解决多个网络互连的问题:分组怎样从一个网络通过路由器转发到另一个网络。在本章,我们研究的是:在同一个局域网中,分组怎样从一台主机传送到另一台主机,但并不经过路由器转发。从整个互联网来看,局域网仍属于数据链路层的范围。

每台运行链路层(二层)协议的设备都可以称为结点(node)。于是,结点可以指主机、路由器、交换机、Wi-Fi访问点(见第7章)等设备。连接邻接结点的通信信道(物理线路,有线或无线)都称为链路(link)。数据报要从源主机传输到目标主机,就必须在端到端路径的每一条通信链路中移动。在通过特定的链路时,传输结点将数据报封装进链路层帧(link-layer frame),并将该帧传送到链路中。
链路和数据链路(data link)并不是一回事。链路只是一条路径的组成部分。当需要在一条线路上传送数据时,除了必须有一条物理线路外,还需要通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。不过,为了表达简便一些,将数据链路层简称链路层。
也有人采用另外的术语。这就是把链路分为物理链路和逻辑链路。物理链路就是上面所说的链路,而逻辑链路就是上面的数据链路,是物理链路加上必要的通信协议。

局域网最主要的特点是:网络为一个单位所拥有,且地理范围和站点数目均有限。局域网刚刚出现时,比广域网具有更高的数据率、更低的时延和更小的误码率。但随着光纤在广域网的应用,广域网也具有很高的数据率和很低的误码率。
局域网具有如下一些主要优点:
(1) 具有广播功能,从一个站点可很方便地访问全网。局域网上的主机可共享局域网上的各种硬件和软件资源。
(2) 便于系统的扩展和逐渐演变,各设备的位置可灵活调整和改变。
(3) 提高了系统的可靠性(reliability)、可用性(availability)和生存性(survivability)。

链路层提供的基本服务是:将数据报从一个结点通过一条通信链路传输到另一个邻接结点。此外,链路层还可能提供:
·封装成帧(framing)。每种链路层协议的帧都有一个数据字段,这部分填入数据报。至于帧结构的其它部分则与链路层协议有关。
·链路访问(link access)。媒体访问控制(medium access control,MAC)明确了帧如何发送到链路上。对于点到点链路,发送方和接收方都各只有一个,MAC协议很简单(甚至可以不存在):发送方可以在链路空闲的任何时刻发送帧。当一条广播链路连接有多个结点时,MAC协议将协调这些结点之间的帧传输。
·可靠传递(reliable delivery)。当链路层提供可靠传递服务时,它保证每份网络层数据报都能够准确无误地传送。链路层可靠传递服务也能通过确认与重传机制(3.4节)来实现。当使用错误率较高的链路(如无线链路)时,在链路层需要保证可靠传递,及时进行纠错,避免在运输层或应用层触发重传。当然,如果链路错误率很低,这种服务则没有必要。当前,光纤、同轴电缆、许多双绞铜线等介质都是可靠的,因此很多链路层协议都不提供可靠传输。
·错误检测与校正(error detection and correction)。由于信号衰减和电磁噪声等原因,链路层硬件可能接收到错误的帧。通过在帧中添加额外的错误检测位,接收结点可以凭此检错。链路层的错误检测更为复杂,因此由硬件来实现检测。错误校正则要求接收方检测出错误的位置并尝试纠正。

一个帧的帧长,等于帧的数据部分长度,加上帧首部和帧尾部的长度。首部和尾部的一个重要作用就是进行帧定界(确定帧的界限)。首部和尾部还包括许多必要的控制信息。在发送帧时,是从帧首部开始发送的。
当数据是由可打印的ASCII码组成的文本文件时,帧定界可以使用特殊的帧定界符。ASCII码是7位编码共128个:可打印的有95个,不可打印的控制字符有33个。控制字符SOH(Start Of Header)放在帧的最前面,表示帧的首部开始。另一个控制字符EOT(End Of Transmission)表示帧的结束。请注意,SOH和EOT都是控制字符的名称,编码分别是01h和04h。SOH(或EOT)并不是S、O、H(或E、O、T)三个字符。

传输出错时,帧定界符的作用更加明显。假定发送端尚未发送完一帧时突然故障,中断了发送;在恢复正常后,从头发送未发送完的帧。接收端发现该帧只有SOH没有EOT,就判定其不完整,必须丢弃。而后面收到的数据有明确的帧定界符(SOH和EOT),代表这是一个完整的帧,应当收下。
当数据是非ASCII码时,如果数据中的某个字节的二进制代码恰好和SOH或EOT这种控制字符一样,链路层就会错误识别帧边界,把部分帧收下(误认为是完整的帧),而把剩下的那部分丢弃(假如这部分没有SOH字符)。

透明(transparency),即一个实际存在的事物看起来好像不存在一样(例如,你看不见放在你前面的一块100%透明的玻璃)。链路层要完成透明传送数据的任务:无论什么样的位串组合的数据,都能够无差错地通过链路层。因此,对传送的数据来说,它们“看不见”链路层有什么妨碍数据传输的东西。或者说,链路层对这些数据是透明的。
为了使传输透明,必须设法使数据中可能出现的SOH和EOT在接收端不被解释为控制字符。具体的方法是:发送端的链路层在数据中的SOH或EOT的前面插入一个转义字符ESC(1Bh)。而接收端的链路层把数据送往网络层之前,删除插入的转义字符。这种方法称为字节填充(byte stuffing)或字符填充(character stuffing)。若ESC也出现在数据当中,解决方法是在ESC前也插入一个ESC。因此,当接收端收到连续两个ESC时,就删除前面的一个。


链路层在网络适配器(network adapter),即网卡中实现。网络适配器的核心是链路层控制器,通常是一颗专门的芯片,实现了很多链路层服务。链路层控制器的多数功能在硬件中实现,少数运行在主机的CPU上。目前,网卡多集成在主板上。对带宽与网络质量要求较高的场合,可以使用独立网卡。它们通常通过PCI-E总线与CPU相连。
在发送端,控制器取得上层协议生成的数据报,将其封装进链路层帧,并在帧首部填入必要信息,然后通过链路访问协议将帧发送到通信链路中。在接收端,控制器接收整个帧,提取出数据报。如果链路层提供错误检测,那么发送控制器会将校验码填入首部。接收控制器会进行错误检测,与首部中的校验码比对。信号在网卡处完成串行并行转换,网卡也可以对数据进行缓存。

链路层的软件部分主要负责高级链路层功能,比如,组装链路层地址信息和激活控制器硬件。网卡驱动属于软件部分。安装驱动后,驱动程序以后就会告诉适配器,应当从存储器的何处,把多长的数据块发送到局域网;或在存储器的何处,把局域网传来的数据块存储下来。在接收端,链路层软件响应控制器中断(例如,收到若干个帧时产生中断),处理错误,并将数据报上交给网络层。链路层是软件和硬件的组合,是协议栈中软件与硬件交汇的部分。

6.2 错误侦测和校正技术
需要保护的数据不仅仅是数据报,还包括链路层帧的首部。注意,错误检测并不保证检测出所有的错误。当链路层无法侦测到存在的错误时,出错的数据报会被传递给网络层。所以,应尽量压低检错手段无法检测错误的几率。
一般地,很多复杂的检错纠错算法会消耗大量的算力。

下面我们介绍3种检错手段:奇偶校验、校验和和循环冗余检查。

奇偶校验(parity check)是最简单的校验方法之一。奇偶校验可以仅用1个校验位实现:在参与检错的d位数据后附加1位奇偶校验位,总共得到d+1位数据。对于奇校验,当被校验数据分别含有奇数个1和偶数个1时,校验位分别为0和1,使得被校验数据连同校验位总是有奇数个1;对于偶校验,当被校验数据分别含有奇数个1和偶数个1时,校验位分别为1和0,使得被校验数据连同校验位总是有偶数个1。
在接收方,只需要统计数据位与校验位共有多少个1。当校验策略分别为奇校验和偶校验时,统计出来的1的数量分别必须是奇数个和偶数个,否则判定传输出错。
单个奇偶校验位可以检测出奇数个错误(1变0;0变1),但无法检测出偶数个错误。因为同时有偶数个位出错时,奇偶性不变。在可靠的链路中,出现1位错误的概率都很小;一段不太长的数据内出现2位错误的几率,就差不多可以忽略了。但是,如果链路不够可靠,统计表明,错误往往是大量出现的。这时候,单个奇偶校验位无法探测到的错误可以占到50 %。
如果将参与检错的数据分成i行×j列,那么需要i+j+1个校验位。这种二维奇偶校验不但可以定位错误的具体位置,还可以纠错。如果校验位本身出错,自然是可以校正的。二维奇偶校验可以校正任意1位或2位的错误。

接收方探测并纠正错误的能力叫做前向错误校正(forward error correction,FEC)。这种技术在音视频回放设备中很常见。在网络中,FEC可以单独使用,也可以与链路层ARQ(见第3章)配合。FEC是十分有用的,因为可以减少发送端重新传输的次数。它们为接收方提供了立即纠错的手段。此举可以大大提升将数据上交给上层的速率,而无需等待NAK报文或发送方重传的报文在链路中传播。这对实时应用和用到传播延迟较长的链路的情况非常重要。

在校验和(checksum)方法中,d位数据被视作由k位整数组成的数列。一个简单的校验和方法是:把这d位数据按k位分一组,把每组的k位加起来,用这个和作为错误检测位的内容。第3章和第4章已经讲过另一种校验和算法——Internet校验和算法了。除了TCP和UDP对整个报文段校验,IPv4仅对报头校验以外,快速运输协议(Xpress Transport Protocol,XTP)等协议也使用此算法。XTP对报头和整个分组各一个校验和。

校验和带来的额外数据量很小,但其纠错能力比CRC(见下文)要弱。校验和用于运输层,而CRC用于链路层。因为运输层一般是用软件实现的,作为主机操作系统的一部分;而链路层一般有专用的硬件来实现,能够以快得多的速率执行特定算法。因此,虽然CRC比校验和要复杂许多,但适配器中的ASIC足以胜任。当然,更快的软件实现的校验和和CRC等算法早已开发出来了。

今天的计算机网络中,常用循环冗余检查(cyclic redundancy check,CRC)码。下面对其进行讲解。
设有d位数据D参与检测。
首先,收发双方要约定一个生成元(generator)G,具有r+1位。G的最高位(最左侧)为1。
对给定的数据D,发送方会生成r个额外的位(冗余码,记作R)附在D后,得到的d+r位二进制数据D+R能被G整除(使用模2算术)。
使用CRC检错时,接收方只需要用接收到的d+r位除以G。如果余数不是0,则判定出错,否则判定数据正确。
在CRC中,所有的计算都在模2算术下进行,不进行进位和退位。于是,不难发现,加减都等效于异或。
乘除则仍然基于二进制算术的规则,只不过当需要加减的时候也要丢弃全部进位和退位。在一般的二进制算术中,乘以2^k就相当于把数左移k位。所以,给定D和R,算式

D·2rR
产生d+r位的结果。
接下来讲解发送方如何计算R。根据前述要求(得到的d+r位二进制数据D+R能被G整除),就是要给出R,使
D·2rR=nG, n∈N
两边异或R,得
D·2r=nGR
于是,如果用G去除D·2^r,余数就为R。即
R=(D·2^r) % G
到此为止,我们可以归纳出CRC的步骤(所有运算均为模2算术):
【发送方】
输入:二进制数据D,共d位。
步骤:
【1】收发双方协商冗余码位数r,以及一个r+1位的生成元G。
【2】计算冗余码
R=(D·2^r ) % G
【3】将冗余码R连接在D的末尾。
输出:原数据及冗余码D+R
注释:+表示字符串连接运算,且D+R=D·2rR。

【接收方】
输入:发送方发来的数据及冗余码D+R。
步骤:
【1】计算余数
R^’=(D+R) % G
输出:如果余数R^’=0,则数据正确;否则,数据出错。
注释:+表示字符串连接运算,且D+R=D·2rR。
国际标准已经定义好了不同位数的生成元。例如,对CRC-32(它被大量的链路层IEEE协议使用),其冗余码长度为32位,生成元为33位:1 0000 0100 1100 0001 0001 1101 1011 0111b(1 04C1 1D87h)。
每个CRC标准都能探测到不多于r位的错误。在特定的假设下,一段数据内出现超过r位错误的概率可以按1-〖1/2〗^r估计。每个CRC标准也都能探测到奇数位错误。但是,CRC无法定位到具体出错的位。

冗余码也称帧检验序列(frame check sequence,FCS)。CRC和FCS并不是同一个概念。CRC是一种检错方法,而FCS是添加在数据后面的冗余码。在检错方法上,可以选用CRC,也可以不选用CRC。

CRC码也叫多项式码(polynomial codes),这是因为二进制串可以被看作一个每个系数都为0或1的多项式,对二进制位字符串的操作也可以被解释为多项式算术。例如,如果生成元G=1101,则G可用多项式p(x)=x^3+x^2+1表示。这种多项式也称生成多项式。
用生成多项式表示CRC-32的生成元:

x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x^2+x+1
CRC-64-ECMA的生成多项式:
█(x64+x62+x57+x55+x54+x53+x52+x47+x46+x45+x40+x39+x38+x37+x35+x33+@x32+x31+x29+x27+x24+x23+x22+x21+x19+x17+x13+x12+x10+x9+x7+x4+x+1)
CRC-64-ISO的生成多项式:
x64+x4+x^3+x+1

不难看出,如果传送数据时不以帧为单位来传送,那么就无法加入冗余码以进行差错检验。因此,如果要在数据链路层进行差错检验,就必须把数据划分为帧,每一帧都加上冗余码,再一帧一帧地传送,然后在接收方逐帧检错。
必须强调,若在链路层仅仅使用CRC,则只能做到对帧的无差错接受,即:“凡是接收端数据链路层接受的帧,我们都能以非常接近于1的概率认为:这些帧在传输过程中没有出错”。接收端丢弃的帧虽然曾收到了,但最终还是因为出错而被丢弃。以上所述可近似表述为(通常都是这样认为):“凡是接收端数据链路层接受的帧均无差错”。

请注意,我们现在并没有要求数据链路层向网络层提供可靠传输的服务。所谓可靠传输就是:数据链路层的发送端发送什么,在接收端就收到什么。传输错误可分为两大类:一类就是前面所说的最基本的位错误,而另一类传输差错则更复杂些:收到的帧并没有出现位错误,但却出现了帧丢失、帧重复或帧失序。帧丢失很容易理解。此外,在讲解TCP的时候,大家已经接触过重复和失序的情况了。
过去,OSI的观点是:必须让数据链路层向上提供可靠传输。因此,在CRC检错的基础上,增加了帧编号、确认和重传机制。收到正确的帧,就要向发送端确认。若发送端在一定期限内没有收到确认,就认为出错,就重传,直到收到对方的确认为止。这种方法在历史上曾经起到很好的作用。但现在的通信线路的质量已经大大提高了,由通信链路质量不好引起差错的概率已经大大降低。因此,在现在,互联网就采取了区别对待的方法:
对于通信质量良好的有线链路,数据链路层协议不使用确认和重传机制:不要求数据链路层向上提供可靠传输的服务。如果在数据链路层传输数据时出错并且需要校正,那么校错的任务就由上层协议(例如TCP)来完成。对于通信质量较差的无线传输链路,数据链路层协议使用确认和重传机制,向上提供可靠传输的服务(见第7章)。

6.3 多路访问链路和协议
网络链路分为两种:
点对点链路(point-to-point link)在两端分别仅具有一个发送方或接收方。很多链路层协议都是针对点对点链路设计的。点对点协议(point-to-point protocol,PPP)和高级数据链路控制(high-level data link control,HDLC)便是这样的协议。HDLC是可靠传输协议,随着通信质量的提高,现在已很少使用了。
广播链路(broadcast link)两端可以具有多个发送方与接收方。使用“广播”一词,代表无论哪一台机传输一帧,对面的所有主机都能接收到该帧的一份副本。以太网(见下文)和无线局域网(见第7章)便是广播链路层技术。广播信道常常用于局域网。

PPP较为简单,是用户计算机和ISP进行通信时使用的链路层协议,也是目前使用得最广泛的链路层协议。
IETF认为,在设计PPP时,必须考虑以下多方面的需求[RFC 1547]:
(1)简单。IETF设计互联网时,把最复杂的部分放在TCP中,而IP则相对简单,提供不可靠的数据报服务。这时,数据链路层不必提供比IP更多的功能。因此,对数据链路层的帧,不需要纠错、序号与流量控制。IETF把“简单”作为首要需求。简单的设计还可使协议在实现时不容易出错,从而提高不同厂商在协议的不同实现上的互操作性。协议标准化的一个主要目的,就是提高协议的互操作性。总之,这种协议非常简单:接收方每收到一帧,就进行CRC。如检验正确,就收下这个帧;反之,就丢弃这个帧,其它什么也不做。
(2)封装成帧。必须规定特殊字符作为帧定界符(标志帧的开始和结束),以便使接收端从收到的比特流中,准确找出帧的开始和结束位置。
(3)透明性。PPP必须保证传输透明。如果数据中出现了和帧定界符一样的字符,就要采取有效措施区分。
(4)多种网络层协议。PPP必须在同一条物理链路上支持多种网络层协议(如IP和IPX)的运行。当点对点链路连接局域网或路由器时,PPP必须同时支持连接的局域网或路由器上运行的各种网络层协议。
(5)多种类型链路。除了要支持多种网络层的协议,PPP还必须能在多种类型的链路上运行。例如,串行的或并行的,同步的或异步的,低速的或高速的,电的或光的,交换的(动态的)或非交换的(静态的)点对点链路。
这里特别要提到1999年公布的以太网点对点协议,即PPP over Ethernet,PPPoE[RFC 2516],这是PPP适应多种链路的一个典例。PPPoE是宽带上网的主机使用的链路层协议,解决了以太网没有身份验证功能的问题。这个协议把PPP帧封装在以太网帧中(当然还要增加识别用户的功能)。宽带的速率较高,可以让以太网上的多个用户共享一条到ISP的宽带链路。现在,即使只有一个用户利用ADSL或光纤进行宽带上网(并不和其他人共享宽带),也是使用PPPoE:PC发送的以太网帧到了ADSL MODEM,就转换成ADSL使用的PPP帧。
(6)错误检测。PPP必须对收到的帧进行检测,并立即丢弃出错的帧。若不检错,那么出错的无用帧还要在网络中继续传输,白白浪费许多网络资源。
(7)检测连接状态。PPP必须及时(不超过几分钟)自动检测链路是否正常。故障链路恢复后,极需此功能。
(8)最大传送单元。PPP必须为每种点对点链路设置MTU的标准默认值,以促进各实现之间的互操作性。如果上层递交的分组长于MTU,PPP就要丢帧并报错。MTU是帧的数据段可以承载的最大长度,不是帧的总长度。
(9)网络层地址协商。PPP必须提供一种机制,使通信的两个网络层(例如,两个IP层)的实体能通过协商知道或配置彼此的网络层地址。协商算法应尽可能简单,并能在所有的情况下协商出结果。这对拨号连接的链路特别重要,因为如果仅仅在链路层建立了连接而不知道对方的网络层地址,则不能保证网络层可以传送分组。
(10)数据压缩协商。PPP必须提供协商使用数据压缩算法的机制。但PPP不要求将数据压缩算法进行标准化。

PPP不支持多点线路(一个主站轮流和链路上的多个从站通信)只支持点对点的链路通信。此外,PPP只支持全双工链路。

PPP的三个组成部分是:
(1) 一个将IP数据报封装到串行链路的方法。PPP既支持异步链路(无奇偶检验的8位数据),也支持面向位的同步链路。IP数据报在PPP帧中就是其信息部分。这个信息部分的长度受MTU的限制。
(2) 一个用来建立、配置和测试数据链路连接的链路控制协议(Link Control Protocol,NCP)。通信的双方可协商一些选项。RFC 1661定义了11种类型的LCP分组。
(3) 一套网络控制协议(Network Control Protocol,NCP),其中的每一个协议支持不同的网络层协议,如IP、OSI的网络层、DECnet,以及AppleTalk等。

PPP帧格式如下图。

首部的第一字段和尾部的第二字段都是标志字段F(Flag),固定为7Eh。标志字段表示帧的开始或结束,是PPP帧的定界符。连续2帧之间只需要1个标志字段。如果出现连续2个标志字段,就表示帧为空,应当丢弃。
首部的地址和控制字段分别为FFh和03h。最初曾考虑,以后再对这两个字段的值进行其它定义,但至今也没有给出。可见,这两个字段实际上并没有携带PPP帧的信息。
PPP首部的第四个字段是2字节的协议字段。若为0x0021,PPP帧的信息字段就是IP数据报。若为0xC021,则信息字段是PPP链路控制协议LCP的数据,而0x8021表示这是网络层的控制数据。
信息字段的长度是可变的,不超过1500字节。
尾部中的第一个字段(2字节)是使用CRC的帧检验序列。

当PPP使用异步传输时,转义符定义为7Dh,并使用字节填充。RFC 1662规定了如下的填充方法:
(1) 把信息字段出现的每一个7Eh字节转换为2字节序列<7Dh,5Eh>。
(2) 若信息字段出现一个7Dh的字节(和转义字符一样),则把7Dh转为2字节序列<7Dh,5Dh>。
(3) 若信息字段出现ASCII控制字符(< 20h),则在该字符前加入一个7Dh,同时可能需要改变该字符的编码。
填充后,链路上传送的信息长于原来的信息。但接收端在收到后再进行相反的变换,就可以正确恢复出信息。

当PPP用于同步传输链路时,协议规定:采用硬件来完成位填充(和HDLC的做法一样)。
PPP使用在SONET / SDH(同步光网络 / 同步数字体系)链路时,使用同步传输(一连串的位连续传送)而不是异步传输(逐个字符地传送)。在这种情况下,PPP采用零填充方法来实现透明传输。具体做法是:
在发送端,先扫描整个信息字段(通常用硬件实现,但也可用软件实现,只是会慢些)。只要发现5个连续的1,就在后面填入一个0。零填充后的数据,信息字段中一定不出现6个连续的l。接收端收到一帧时,先找到标志字段F确定边界,再用硬件扫描其中的比特流。每发现5个连续1,就把后面的一个0删除,还原出原来的信息比特流。这样就保证了透明传输:可以传送任意组合的比特流,而不会引起对帧边界的错误判断。

下面是PPP的状态图,描述了PPP的不同工作状态:

PPP链路的起始和终止状态永远是链路静止(Link Dead)状态:用户PC和ISP路由器之间不存在物理层连接。
当PC通过MODEM呼叫路由器时,路由器检测到MODEM发出的载波信号。在双方建立物理层连接后,PPP就进入链路建立(Link Establish)状态,其目的是建立链路层的LCP连接。
这时,LCP开始协商一些配置选项,即发送LCP的配置请求帧(Configure-Request)。这是个PPP帧,其协议字段置为LCP对应的代码,而信息字段包含特定的配置请求。链路的另一端可以发送以下几种响应中的一种:
(1) 配置确认帧(Configure-Ack),所有选项都接受。
(2) 配置否认帧(Configure-Nak),所有选项都理解但不能接受。
(3) 配置拒绝帧(Configure-Reject),有的选项无法识别或不能接受,需要协商。
LCP配置选项包括链路上的最大帧长、使用的鉴别协议(authentication protocol)的规约(如果有),以及不使用PPP帧的地址和控制字段(因为这两个字段的值固定,没有任何信息,可以在PPP帧首部省略这2字节)。
协商结束后,双方就建立了LCP链路,接着就进入鉴别(Authenticate)状态。在这一状态,只允许传送LCP协议的分组、鉴别协议的分组,以及监测链路质量的分组。若使用口令鉴别协议(Password Authentication Protocol,PAP),则需要发起通信的一方发送身份标识符和口令。系统可以允许用户重试若干次。如果需要更好的安全性,则可以使用更加复杂的口令握手鉴别协议(Challenge-Handshake Authentication Protocol,CHAP)。若鉴别身份失败,则转到链路终止(Link Terminate)状态。若鉴别成功,则进入网络层协议(Network-Layer Protocol)状态。
在网络层协议状态,PPP链路两端的网络控制协议根据网络层的不同协议互相交换网络层特定的网络控制分组。这个步骤是很重要的,因为现在的路由器都能同时支持多种网络层协议。总之,PPP两端的网络层可以运行不同的网络层协议,但仍然可以使用PPP通信。这是一个例外,因为相同的层次一般都要运行相同的协议。
如果在PPP链路上运行的是IP,则对PPP链路的每一端配置IP模块(如分配IP地址)时,就要使用NCP中支持IP的IP控制协议(IP Control Protocol,IPCP)。IPCP分组也封装成PPP帧(协议0x8021),在PPP链路上传送。在低速链路上运行时,双方还可以协商使用压缩的TCP和IP报头,减少传送的位数。
网络层配置完毕后,链路就进入可以进行通信的链路打开(Link Open)状态:两个PPP端点可以向对方发送分组。PPP端点还可发送回送请求LCP分组(Echo-Request)和回送回答LCP分组(Echo-Reply),以检查链路状态。
数据传输结束后,可以由链路的一端发出终止请求LCP分组(Terminate-Request),请求终止链路连接。在收到对方发song的终止确认LCP分组(Terminate-Ack)后,转到链路终止状态。如果链路出现故障,也会从链路打开状态转到链路终止状态。当调制解调器的载波停止后,则回到链路静止状态。
PPP已不是纯粹的数据链路层的协议,它还包含了物理层和网络层的内容。

广播这个概念并不少见。电视就是一种单路广播,由固定的结点对其它接收结点传输数据。不过,计算机网络中的各个结点都是既可以发送又可以接收的。与此同时,还有各种各样的规则对通信做出限制。所以,计算机网络中的广播复杂得多。

如果有多个帧直接不加处理地在同一条广播信道中传送,那么帧会发生碰撞(collision),导致最后所有结点都无法接收正确的信息,因为碰撞的帧互相干扰了对方携带的数据。为了避免碰撞,当多个结点需要使用同一条链路时,需要将它们配合好。这是多路访问协议(multiple access protocol)的责任。四十多年以来,数千篇论文是围绕多路访问协议撰写的。当新型链路(比如无线链路)出现时,多路访问协议仍要继续改进。

多路访问协议可以分为三种:信道划分协议(channel partitioning protocol)、随机访问协议(random access protocol)和轮流协议(taking-turns protocol)。

多路访问协议需要具备如下特性:
1、仅有1个结点需要发送数据时,该结点的吞吐率为v bps。
2、当有M个结点需要发送数据时,每个结点的平均吞吐率均为v/M bps。
3、协议是去中心化的,即:没有任何主结点的崩溃会导致整个网络的崩溃。
4、协议简单,实现成本不高。

常见的三种信道划分协议为TDM、FDM和CDMA,在“附录一  物理层与通信基础”中已经介绍过了。

在随机访问协议中,进行传输的结点总是以信道的满速率进行传输,即v bps。当发生碰撞时,波及到的所有结点都将重新传输碰撞掉的帧。不过,结点经历碰撞时,不会立刻重传因碰撞而损毁的帧,而是先延迟一段随机的时间,再重新发送。一般而言,这使得各个结点都能在重发时不再遭遇碰撞。

最简单的随机访问协议之一是时隙ALOHA协议(slotted ALOHA protocol,SA protocol)。假设:
·所有帧的长度都为L位。
·时间分成长为L/v秒的时隙,时隙是传输一帧的时间。
·结点仅在时隙的起始位置开始传输。
·结点是同步的,于是每个结点都知道时隙何时开始。
·如果一个时隙出现了两个或多个帧的碰撞,则所有结点都会在该时隙结束之前检测到碰撞。

设概率0<p<1。时隙ALOHA在每个结点需要进行的操作很简单:
·当有结点有新的帧需要发送时,它直接等待下一个时隙的开始,彼时将传送整个帧进入该时隙。
·如果未发生碰撞,结点无需重传,可以准备新的帧进行发送。
·如果发生碰撞,结点在本时隙结束之前侦测到碰撞。在接下来的每个时隙中,结点有p的概率重传该帧,直至该帧无碰撞地发送完毕。

时隙ALOHA具有许多优点。与信道划分不同,它允许一个结点在仅有它自己准备好需要传输的数据时满速传输。时隙ALOHA也是高度去中心化的,因为每个结点独立检测碰撞、各自决定是否重传。不过,要做到这点需要时隙对于各个结点是同步的。时隙ALOHA也是一个非常简单的协议。

如果仅有一个活动结点(已经准备好需要发送的帧的结点),时隙ALOHA效果很好。但如果活动结点有多个,则有两个效率问题。第一,当多个结点活动时,这些时隙的一部分将发生碰撞,于是被浪费了。第二,接下来的部分时隙也可能空闲:在这些时隙,所有活动结点都选择暂不重传。仅有一个结点决定重传时,对应的时隙才被利用了,这种时隙称为成功时隙。时隙多路访问协议的效率定义为:当具有大量活动结点,并且每个结点都有大量的帧准备发送时,成功时隙所占的比例。如果不进行访问控制,每个结点在碰撞后都立刻重传,效率就是零。

现在估计时隙ALOHA的效率。为了简便,在每个结点检测到发生碰撞后以p的概率决定重传的情况下,进一步假设:结点在每个时隙也有p的概率新准备一帧,即:在任意时隙,任意结点都以p的概率传输一帧。设有n个结点,若一个时隙是成功时隙,则要求仅有一个结点决定传输,而其它结点都不传输。于是,该时隙为成功时隙的概率为p(1-p)^(n-1)。如果n个结点都是活跃结点,那么决定传输的活跃结点可以是这n个结点中的一个。这时,该时隙为成功时隙的概率是np(1-p)^(n-1)。
当整数n>0时,设g(p)=np(1-p)^(n-1)。求一阶导

dg§/dp=n(1-p)^(n-2) (1-p-p(n-1))=n(1-p)^(n-2) h§

dh§/dp=-(n+2)p+1<0
若要使
dg§/dp=0
易得唯一解
p=1/n
可见,g§在p=1/n时取得最大值。
当广播信道的结点很多时,取n→+∞,对应的概率模型为泊松分布(Poisson distribution)
P(X=k)=C_n^k p^k (1-p)(n-k)≈λk/k! e^(-λ),k = 0,1,2,……,n
参数为λ=np=1。设X代表决定传输的结点数。该时隙为成功时隙,要求仅有一个结点决定传输,概率是
P(X=1)≈λ^1/1! e^(-1)=1/e≈0.368
因此,时隙ALOHA协议的理论最高效率约为37%。

时隙ALOHA要求所有结点同步。不过它的前身――ALOHA协议,则是无时隙、完全去中心化的。在纯ALOHA中,当一帧第一次到达(一份网络层数据报在发送端传下来)时,结点立刻将整个帧传输到广播信道上。如果传输的帧遇到碰撞,则发送该帧的结点以p的概率重传。当决定不重传时,结点等待一个帧需要的传输时间。等待完毕后,重传的概率仍为p。

现在估计纯ALOHA的效率。为了方便,同样假设:在任意时刻,任意结点都有p的概率传输一帧。假设这个帧在时间t_0传输,传输一帧需要t秒,则在时间段[t_0-t,t_0]内,其它结点都不得开始传输,此概率为(1-p)^(n-1)。而在该帧传输的时间段[t_0,t_0+t]内,其它结点也不得传输,此概率同样为(1-p)^(n-1)。当有n个活动结点时,决定传输的活跃结点可以是这n个结点中的一个。这时,该时隙为成功时隙的概率是np(1-p)^2(n-1) 。用同样的方法,求得ALOHA协议的理论最大效率为

1/2e≈0.184
可见,ALOHA协议的理论最高效率约为18%,正好是时隙ALOHA的一半。

无论是纯ALOHA还是时隙ALOHA,每个结点决定是否传输都是独立的,不受其它结点是否正在传输的影响。

以太网(Ethernet)发送的数据都使用Manchester编码(附录一)的信号。我们知道,二进制基带数字信号通常就是高、低电压交替出现的信号。使用这种信号的最大问题是:当出现一长串的连1或连0时,接收端就不易从收到的比特流中提取位同步信号。曼彻斯特编码把每个码元再分成两个相等的间隔。码元1是前一个间隔为低电压而后一个间隔为高电压。码元0则正好相反。也可以反过来,即:1是“前高后低”,0是“前低后高”,这样就保证了:在每个码元的正中间,出现一次电压转换。接收端利用这种跳变,很方便地把位同步信号提取出来。但是,从曼彻斯特编码的波形图,不难看出其缺点:它所占的频带宽度比原始的基带信号增加了一倍(每秒传送的码元数加倍了)。


最早的以太网,将许多计算机都连接到一根总线(bus)上。总线的特点是:当总线上的一台计算机发送数据时,总线上的所有计算机都能检测到这个数据。这种就是广播通信。但我们并不总是要在局域网上进行广播通信。为了在总线上一对一通信,可以使每个适配器拥有一个与其它适配器都不同的地址。在发送数据帧时,在帧的首部写明目标地址。现在的电子技术很容易做到:仅当帧的目的地址与适配器ROM中存放的硬件地址一致时,适配器才能接收这一帧。适配器对不是发送给自己的数据帧就丢弃。这样,具有广播特性的总线上就实现了一对一的通信。
总线上只要有一台计算机在发送数据,总线就被占用。因此,同一时间只允许1台计算机发送数据,否则各计算机之间就会互相干扰,使得发送数据被破坏。如何协调总线上各计算机的工作,就是以太网要解决的一个重要问题。

网络领域中,有两个重要的技术:
·载波侦听(carrier sensing):一个结点侦听需要使用的信道。如果其它结点正在传送帧,则该结点将等待,直到在一段(很短的)时间内,都没有侦听到任何正在进行的传输,再开始(继续)自己的传输。其实,总线上并没有什么“载波”,这里只不过借用一下“载波”这个名词而已。
·碰撞检测(collision detection):一个结点在传输过程中,也侦听正在使用的信道。当探测到其它结点正在传输时,停止传输并等待一个随机的延迟,再继续监听,直到链路空闲。当几个站同时在总线上发送数据时,总线上的电压变化增大(互相叠加)。适配器检测到的信号电压变化幅度超过阈值时,就认为总线上至少有两个站同时在发送数据,表明产生了碰撞。这时,总线上传输的信号严重失真,无法从中恢复出有用的信息来。因此,任何一个正在发送数据的站点,一旦发现总线上出现碰撞,其适配器就要立即停止发送,免得继续进行无效的传输,白白浪费资源。
这两个规则已经被纳入载波侦听多路访问(carrier sense multiple access,CSMA)及带碰撞检测的载波侦听多路访问(CSMA with collision detection,CSMA/CD)协议族。CSMA和CSMA/CD的许多变种已经出现。

信号在信道中传输是需要时间的。信道传播延迟(channel propagation delay)越大,载波侦听节点不能侦听到网络中另一个节点已经开始传输的机会就越大。电磁波在1 km电缆的传播时延约为5 μs(这个数字应当记住)。
在局域网的分析中,常把总线上的单程端到端传播时延记为τ。那么,主机发送数据后,最迟要经过2τ,才能判定自己发送的数据有没有遭受碰撞。显然,这种情况的构成条件是:总线一端的主机A发送的数据无限接近目标主机B但又未到达,B此时因为检测不到冲突而开始发送数据;B发送的数据到达A时,A仍未停止传输。这时候,A才能开始检测到信号电压过高,判定发生了碰撞。在下图中,这个极端条件对应δ→0。
局域网上任意两个站之间的传播时延有长有短,必须按最坏情况设计,即:取总线两端的两个站之间的传播时延(这两个站的距离最大)为端到端传播时延。

可见,每个站在发送数据之后,数据继续传输期间,存在碰撞的可能。遭遇碰撞的时间段长度,取决于另一个发送数据的站到本站的距离。因此,以太网不能保证,某一时间之内,一定能够把帧成功发送出去。这称为发送的不确定性。如果希望在以太网上发生碰撞的机会很小,必须使整个以太网的平均通信量远小于以太网的最高数据率。
最先发送数据帧的A站,在发送数据帧后,至多经过时间2τ,就能知道所发送的帧是否遭受了碰撞。所以,2τ也称争用期(contention period)或碰撞窗口(collision window)。一个站在开始发送数据后,只有通过争用期的“考验”,即:争用期以后还没有检测到碰撞,才能肯定不会遭到碰撞。这时,就可以放心把这一帧数据顺利发送完毕。

使用CSMA/CD网络适配器的大致工作过程是:
1、适配器从网络层获得一份数据报,生成一帧链路层帧,将其放入适配器的缓存中。
2、如果检测到信道空闲(未在信道中检测到有信号能量到达适配器)持续了96比特时间(帧间最小间隔),则开始(继续)传输帧。否则,等待至空闲为止。
3、传输过程中,适配器继续检测是否具有来自使用该信道的其它适配器的信号能量。
4、如果未检测到其它适配器的信号能量,并完成了整个帧的传输,则传输结束(回到1)。否则,放弃传输。
5、如果放弃了一帧的传输,适配器等待一段随机的时间,然后回到步骤2,继续发送该帧。当重传达16次仍不能成功时(同时发送数据的站太多,以致连续发生冲突),则丢弃该帧,并向高层报告。
10 Mbps以太网的帧间最小间隔为9.6 μs。以太网帧间隙的目的是:为了使刚收到数据帧的站的接收缓存来得及清理,做好接收下一帧的准备。
随机等待一段延迟的目的很明显:如果几个发生碰撞的站都在监听信道,那么都会同时发现信道变成了空闲。如果大家都同时再重新发送,那么肯定又会碰撞。不过,随机等待的时间不能太长,也不能太短。如果等待太长,信道将保持较多空闲;如果太短,则碰撞几率较大。
以太网每发送完一帧,一定要把已发送的帧暂时保留一下。如果在争用期内检测出碰撞,那么还要在推迟一段时间后,再把这个暂时保留的帧重传一次。

二进制指数后退(binary exponential backoff)算法在以太网和DOCSIS电缆网络多路访问协议(下文)中使用:
如果准备传输的帧已经遭遇了n次碰撞,则结点随机从2^n个值{0,   1,   2,…,   2^n-1}中选择一个K。在以太网中,结点实际等待的时间为:K×传送512位(最短帧长,见下文)到以太网需要的时间(争用期2τ),n最大为10。如果以太网的速率是10 Mbps,则争用期为51.2 μs。可见,当碰撞次数增多后,K的上限指数增长,使得等待的延迟也迅速增长。这便是该算法名称的由来。

当每个结点准备一个新的帧时,都会运行CSMA/CD算法,对过去发生过的碰撞并无记忆。因此,当其它适配器处于指数后退状态时,一个具有新帧的节点能够立刻进行一次成功的传输。使用CSMA/CD协议的结点无法同时发送和接收(但必须边发送边监听信道)。因此,使用CSMA/CD协议的以太网不能进行全双工通信,而只能进行双向交替(半双工)通信。

假使某个站发送了一个很短的帧,但在发送完毕之前并没有检测出碰撞。假定该帧在到达目的站之前和别的站发送的帧发生了碰撞,因而目的站将收到有差错的帧(当然会把它丢弃)。可是,发送站却不知道这个帧发生了碰撞,因而不会重传这个帧。这显然不是我们希望的。为了避免发生这种情况,10 / 100 M以太网规定了一个最短帧长64字节(从IEEE 802.3ae万兆以太网开始,不再使用CSMA/CD),即512-bit。如果发送的数据过少,那么必须加入一些填充字节,使帧长不小于64字节。对于10 Mbit/s以太网,发送512 bit的时间需要51.2 μs,也就是上面提到的争用期(512比特时间)。如果在争用期(共发送了64字节)没有发生碰撞,那么后续发送的数据就一定不会发生冲突。换句话说,碰撞一定在前64字节之内。由于一检测到冲突就立即中止发送,这时已经发送的数据一定小于64字节,因此,凡长度小于64字节的帧,都是由于冲突而异常中止的无效帧。只要收到了这种无效帧,就应当立即丢弃。
信号在以太网上传播1 km大约至少需要5 μs(光纤中的光速约为真空光速的2/3;使用双绞铜线传输信号,速率还会降低到光纤的2/3)。以太网上的最大端到端时延τ必须小于争用期的一半(即25.6 μs),由此可得:10 M以太网的理论最大端到端长度约为5 km。当然,实际上的以太网的覆盖范围远远没有这样大(相应的以太网标准也会限制电缆的最大长度)。因此,实用的以太网都能在争用期内检测到可能的碰撞。以太网的争用期的确定,不仅考虑了端到端时延,而且还包括其它许多因素,如:存在的转发器(见6.4节)增加的时延,强化碰撞(见下文)的干扰信号的持续时间,等等。

延迟碰撞(late collision)是指争用期之后发生的碰撞,不是合法的碰撞。在正常的以太网中,不应当出现延迟碰撞。出现延迟碰撞的常见原因有:
(1)电缆长度不符合标准,即:电缆过长。
(2)双工设置不正确。
(3)网卡存在硬件错误。

当发送数据的站一旦发现发生了碰撞,除了立即停止发送数据外,还要再继续发送32位或48位的人为干扰信号(jamming signal),以便让所有用户都知道现在已经发生了碰撞。这个过程称为强化碰撞。
如图,A站从发送数据开始,到发现碰撞并停止发送的时间间隔是T_B。A站得知碰撞已经发生时,所发送的强化碰撞的干扰信号的持续时间是T_J。B站在得知发生碰撞后,也要发送人为干扰信号。简单起见,没有画出B站所发送的人为干扰信号。发生碰撞使A浪费时间T_B+T_J。可是,整个信道被占用的时间还要增加一个单程的端到端传播时延τ(在τ时间内,虽然A已经暂停发送数据,但是暂停之前发送的数据还在链路上传播,这段时间内B不可以发送数据)。因此,总线被占用的时间至少是T_B+T_J+τ。


当仅有一个结点需要发送帧时,该结点能以信道的最大速率传输。对以太网,典型的速率为10 Mbps或100 Mbps或1 Gbps或10 Gbps或40 Gbps或100 Gbps或400 Gbps。未来,以太网将突破1 Tbps的速率。不过,如果有多个结点需要传输,实际的传输速率就会低得多。CSMA/CD的效率定义为:当具有大量活动结点,并且每个结点都有大量的帧准备发送时,无碰撞传输的时间所占的比例。
对CSMA/CD效率的推导超出了书本范围,这里只给出近似的式子:

η=1/(1+(5d_prop)/d_trans ),d_prop 是链路的传播延迟,d_trans 是链路的传输延迟
显然,当传播延迟为0时,效率达到1:发生碰撞时,结点会立刻检测到,并马上终止传输,不浪费信道。此外,当传播延迟不为0,但传输速率很低(传输延迟很高)时,效率也接近1。这意味着:一帧开始传输以后,将占用信道较长时间;信道在大多数时候都被利用了起来。

假定发送一帧需要时间T_0(帧长比发送速率)。但实际上,成功发送一帧占用信道的时间是T_0+τ。因为当发送完最后一位时,这一位还要在以太网上传播。在最极端的情况下,发送站在传输媒体的一端,数据传输到另一端所需的时间就是τ。因此,在T_0+τ时间后,以太网的媒体才空闲,才允许其它站发送数据。
可见,要提高以太网的信道利用率,就必须减小τ与T_0之比。以太网定义了单程端到端时延与帧发送时间之比

a=τ/T_0
当a→0,表示只要一碰撞,就立即可以检测出来,并马上停止发送,因而信道资源被浪费的时间非常非常少。反之,参数a越大,表明争用期所占的比例越大,这就使得每发生一次碰撞就浪费了不少的信道资源,使得信道利用率明显降低。因此,以太网的参数a的值应当尽可能小些。这就是说,当数据率一定时,以太网的连线的长度受到限制(否则τ的值会太大),同时,以太网的帧长不能太短(否则T_0会太小,使a太大)。
考虑一种理想化的情况。假定以太网上的各站发送数据都不会产生碰撞(这显然已经不是CSMA/CD,而是需要特殊的调度方法),并且能够非常有效地利用网络的传输资源,即:总线一旦空闲就有某一个站立即发送数据。这样,发送一帧占用线路的时间是T_0+τ,而发送一帧的时间是T_0,则极限信道利用率
η=T_0/(T_0+τ)=1/(1+a)
虽然实际的以太网不可能有这样高的信道利用率,但上式指出,只有参数a远小于1,才能得到尽可能高的极限信道利用率。反之,每发生一次碰撞,就要浪费相对较多的传输数据的时间,极限信道利用率就远小于1,实际的信道利用率就更小了。据统计,以太网的利用率达到30%就已经属于重载,很多网络容量被网上的碰撞消耗掉了。

ALOHA和CSMA都能具备多路访问协议的第一个特性,即:仅有单个结点传输时,结点能跑满链路的传输速率。但当多个结点活跃时,由于碰撞,每个结点分到的速率会低于理论上的平均值。于是,研究人员开发出了另一类协议——轮流协议。轮流协议也有至少数十种,每个这样的协议都有许多变体。

轮询协议(polling protocol)要求有一个结点设为主结点。主结点轮流告知其它结点,此时可以开始传输一定数量的帧。主结点可以观测信道是否空闲,以便决定是否可以令其它结点开始传输。
通过这样的方式,轮询协议避免了碰撞问题和空白时隙,这使得轮询协议的效率高得多。但它也有缺点。首先,轮询是有延迟的:通知其它结点开始传输这个过程也需要时间。如果仅有一个结点有数据需要传输,很明显,传输速率将远低于额定速率。因为其它非活跃结点收到通知以后并无数据可以发送,所以这些通知白白耗费了信道。其次,如果主结点故障,整个信道将不可用。

另一种轮流协议是令牌传递协议(token-passing protocol)。这种协议没有主结点。令牌(token)是一种特殊的帧,在结点之间以固定顺序传输。每个结点仅在有数据传输时才保留令牌,否则立即将令牌传递给下一个结点。当收到令牌的结点有数据传输时,将令牌传递给下一结点的同时,也会一并告知可以传输的最大帧数量。
令牌传递是去中心化的,效率也很高。但它也有自己的问题。如果一个结点故障,可以导致整个信道崩溃。如果一个结点忘记释放令牌,则需要额外的恢复过程来令令牌重新进入循环。

有线传输数据业务接口规范(Data Over Cable Service Interface Specifications,DOCSIS)规定了电缆数据网络的架构和协议。回忆1.2节,一个典型的电缆访问网络,将至少数千部居民电缆MODEM连接到一个位于网络头端的电缆MODEM终端系统(CMTS)。DOCSIS使用FDM来划分下行(CMTS到MODEM)和上行(MODEM到CMTS)信道为很多份,每条下行信道的宽度是6 MHz,带来最大40 Mbps的吞吐量;每条上行信道的宽度是6.4 MHz,最大吞吐量为30 Mbps。上下行信道都是广播信道。CMTS沿下行信道传输的帧会被所有连接的MODEM收到,但由于只有一个CMTS进行传输,因此没有多路访问问题。但上行则不同,多个MODEM可以同时通过同一条信道传输数据给CMTS,碰撞是可能发生的。

每条上行信道都被分为许多个时间间隔,类似TDM,每个时间间隔包含一系列微时隙序列。在微时隙期间,MODEM可以传输数据到CMTS。CMTS通过在下行信道上发送控制信息(MAP报文)来显式指定哪些MODEM可以在哪些微时隙发送数据。这能够确保在微时隙中不发生碰撞。
但CMTS如何知道一开始有哪些MODEM要发送数据呢?令MODEM在一组特殊的专用微时隙间隔内发送微时隙请求帧给CMTS就可以了。这些微时隙请求帧通过随机访问的方式来传输,所以可能碰撞。MODEM无法探测上行信道是否正忙,也无法探测碰撞。不过,如果MODEM未在接下来的下行控制报文中收到请求的响应,则判定发生了碰撞。此后,MODEM使用二进制指数回退来决定重传时间。如果上传信道的流量很少,MODEM可以在分配给微时隙请求帧的时隙中直接传输数据帧,避免等待微时隙分配。

6.4 交换式LAN
并不是主机和路由器本身具有链路层地址,而是它们的适配器(网络接口)具有链路层地址。如果主机或路由器具有多个网络接口,则每个接口各具有一个链路层地址。这与IP地址类似。但是,链路层交换机的接口不具有链路层地址。这是因为,链路层交换机的职责是:透明地在主机与路由器之间运输数据报,主机或路由器不必明确地将帧通过指明地址定向到特定的交换机。链路层地址有许多别称,如:LAN地址(LAN address)、物理地址(physical address)、硬件地址(hardware address)和MAC地址(MAC address)。链路层协议为以太网时,链路层地址也称以太网地址(Ethernet address)。
对许多LAN,MAC地址长48位(6字节)。IEEE 802标准虽然规定了MAC地址可以仅有2字节,但由于6字节的地址字段可使全世界所有的局域网适配器都具有不相同的地址,因此,现在的局域网适配器使用的都是6字节MAC地址。
虽然MAC地址被设计为永久性的,但现在已经可以通过软件修改适配器的MAC地址了。
MAC地址是扁平结构而不是层次的。并且,无论适配器位于哪个地理位置,一般都不改变。

IEEE 802.3标准将每字节的最低位记在最左侧。在地址记法中有两种标准:第一种记法是,最左边的最低位是第一位;第二种记法是,最左边的最高位是第一位。在发送数据时,两种记法都是按照字节序发送,但先发送字节内的哪一位则不同:第一种记法先发送最低位,第二种记法先发送最高位。
但要注意,这只是单个字节内的情况。TCP/IP中,所有长度大于8位的数据,都是按大端(big endian)方式传输的(RFC 1700),保证数据在主机之间传输时能够被正确解释。大端序也称网络字节序(network byte order)。

适配器的MAC地址是全球唯一的。IEEE的注册管理机构(Registration Authority,RA)负责管理MAC地址空间。当一家公司想要生产适配器时,购买一块容量为2^24的地址空间。IEEE将MAC地址的高24位即组织唯一标识符(Organizationally Unique Identifier,OUI)固定,然后将这块地址分配给公司。低24位(扩展唯一标识符,Extended unique identifier,EUI)可由公司自由使用。
地址字段的第一字节的最低位为I/G位。I/G表示Individual / Group。当I/G位为0时,地址字段表示单个站地址。当I/G位为1时表示组地址,用来进行多播(组播)。
IEEE还考虑到,可能有人并不愿意向IEEE的注册管理机构购买OUI。为此,地址字段第1字节的最低第2位规定为G/L位,表示Global / Local。当G/L位为0时是全球管理(保证在全球没有相同的地址),厂商向IEEE购买的OUI都属于全球管理。当G/L位为1时是本地管理,用户可任意分配网络上的地址。采用2字节地址字段时,全都是本地管理。但以太网几乎不理会这个G/L位。
这样,在全球管理时,每一个站的地址可用46位的二进制数字来表示(最低位和最低第2位均为0时)。剩下的46位组成的地址空间可以有246个地址,已经超过70万亿个,可以保证世界上的每一个适配器拥有一个唯一的地址。当然,非无限大的地址空间总有用完的时候。

当适配器要向其它适配器发送帧时,把目标适配器的MAC地址插入帧中,然后把帧发送到所在的LAN。交换机可能会把收到的帧广播给全部接口。即使帧首部没有写入目标地址,交换机也可以转发。适配器每在网络上接收到一帧,就将其目标地址与自己的MAC地址比对。如果不匹配,则丢弃该帧。如果匹配,则收下以后再进行后续处理。

网卡还可以设置为一种特殊的模式——混杂模式(promiscuous mode),是指网卡接收所有经过它的数据流,而不论其目的地址是否是它。这实际上是“窃听”其它站点的通信,而并不中断它们的通信。黑客常常利用这种方法非法获取口令。因此,用户一般不愿意网络上存在混杂方式的适配器。
但混杂模式有时却非常有用。例如,网络维护和管理人员需要这种模式监视和分析以太网上的流量,以便找出提高网络性能的具体措施。嗅探器(sniffer)就使用了设置为混杂方式的网络适配器。此外,这种嗅探器还能够帮助学习网络的人员更好地理解各种网络协议的工作原理。

所有的适配器都至少应当能够识别单播帧和广播帧。有的适配器可用编程方法识别多播地址。当操作系统启动时,它就把适配器初始化,使适配器能够识别某些多播地址。显然,只有目的地址才能使用广播地址和多播地址。
当目标MAC地址为广播地址(broadcast address,FF-FF-FF-FF-FF-FF)时,LAN中的全部适配器都将接收并处理该帧。
IANA拥有的以太网地址块的高24位为00-00-5E,因此,TCP/IP使用的以太网多播地址块,范围从00-00-5E-00-00-00到00-00-5E-FF-FF-FF。而IANA拥有的以太网多播地址的范围,从01-00-5E-00-00-00到01-00-5E-7F-FF-FF。不难看出,在每一个地址中,只有23位可用作多播。这只能和D类IP地址中的23位有一一对应的关系。D类IP地址可供分配的有28位(高4位1110),可见,这28位中的前5位不能用来构成以太网硬件地址。由于多播IP地址与以太网硬件地址的映射关系不是唯一的,因此,收到多播数据报的主机将以太网帧的数据部分上交给IP层后,还要在IP层利用软件进行过滤,把不是本主机要接收的数据报丢弃。

除了IP地址以外,主机和路由器同时具有MAC地址,理由主要有:
【1】LAN是被设计为可以使用任意的网络层协议的,并不仅仅针对IP和Internet。如果适配器也要求使用IP地址,那么在需要使用其它网络层协议(IPX、DECnet等)的场景,适配器就不能很好地支持了。
【2】如果适配器使用网络层地址,则网络层地址需要存储于适配器的RAM中,并且每次适配器加电时都要重新配置。如果不使用任何地址,而是令适配器直接将数据部分交给上层,由网络层检查网络层地址,则LAN每接收到一帧(包括同一广播LAN内目标地址不为本机的那些帧)时,主机都会被打断(因为帧总是被交给上层)。
总之,为了使各层尽量独立,每一层都需要有自己的地址策略。现在我们已经学习了三种类型的地址:应用层的主机名、网络层的IP地址和链路层的MAC地址。

那么,能不能够只是用MAC地址之类的硬件地址通信,而不使用IP地址呢?答案也是不可以的:
·全世界存在各种架构不同的网络,使用了不同的硬件地址。为了使这些异构网络之间可以通信,就必须进行非常复杂的硬件地址转换。这是几乎不可能做到的。
·有了IP地址,就可以唯一标记每台连接到Internet的主机,得以大大简化地址转换工作,使得原先复杂的地址转换中的绝大多数工作,既不需要用户在应用层面上自行实现或配合,也不需要实现在网络设备中。
·Internet的IP地址是统一编址的,与硬件地址没有直接联系。在IP网络上,用户或高层软件直接使用IP地址进行通信,不需要关心具体网络在低层的差异。

为了将网络层地址转换为链路层地址,Internet引入了地址解析协议(address resolution protocol,ARP)。ARP根据输入的IP地址,返回同一子网内的目标主机的MAC地址。与DNS不同,DNS将Internet上的任何主机解析为IP地址,而ARP仅能对所在子网的主机和路由器解析其IP地址为MAC地址。如果尝试解析其它子网的IP地址的MAC地址,则ARP报错。

每台主机和路由器的内存中,都有一张ARP表(ARP table),包含了从IP地址到MAC地址的映射。ARP表还包括TTL值,指示对应的条目何时过期,需要删除。ARP表不需要为每台主机和路由器记录表项。
一般而言,每个条目的有效期为10到20分钟。设置这种地址映射项目的生存时间是很重要的,以便当网络中的主机变化(例如,某主机的网卡故障,更换了新的网卡)时,将信息及时更新。
有的资料将ARP表称为ARP高速缓存(cache)。但要注意,ARP高速缓存是存储在内存中的。
ARP是即插即用的:ARP表会自动建立,无需系统管理员手动配置;如果主机与子网断开,则对应的条目在之后会从子网中的其它ARP表中删除。
在命令行下输入arp -a可以查看ARP表的全部内容。

当主机要向本局域网的另一主机发送IP数据报时,如果ARP表中已经具有目标IP地址对应的MAC地址,则一切照常;否则,发送方需要构造一个特殊的分组,称为ARP分组(ARP packet)。ARP分组的字段包括收发双方的IP和MAC地址。ARP请求和响应分组的格式是一样的。ARP请求分组的目的是:请求子网内的其它全部主机和路由器,给出需要解析为MAC地址的IP地址。
ARP分组的目标MAC地址为广播地址。适配器将ARP包封装进链路层帧中,目标地址设为FF-FF-FF-FF-FF-FF,然后将帧发送到子网中。包含ARP请求的帧会被子网内的所有其它适配器接收到,每个适配器都会将ARP包向上传递给ARP模块,ARP模块检查IP地址是否与ARP包中的目标IP地址匹配。如果匹配,则将响应ARP包送回给请求主机。请求主机根据应答中的IP地址,更新自己的ARP表,并开始发送需要发送的IP数据报,将数据报封装进链路层帧,其目标MAC是对先前ARP请求进行响应的主机或路由器的MAC。除了发起ARP请求的主机更新自己的ARP表以外,收到ARP请求的主机,也会将发送方的地址写入自己的ARP高速缓存中。
ARP请求报文是通过广播帧发送的,因为不知道哪一台主机才包含需要的MAC地址,只能请求子网内的所有主机;但ARP响应报文是通过标准帧发送的(单播),仅由一台源主机(自己的MAC地址被请求查询的主机)发送给一台目标主机(发起ARP请求的主机)。

ARP数据包被封装进链路层帧,所以ARP位于链路层之上;而ARP包既包含链路层地址,也包含网络层地址等字段,ARP是为了将IP地址解析为链路层的硬件地址。因此,最好将ARP视为位于链路层与网络层之间的协议。

路由器的每个接口都有一个IP地址、ARP模块和适配器。当向子网外发送数据报时,发送主机通过ARP获取第一跳路由器(默认网关)的MAC地址;数据报每经过一台路由器,路由器就通过ARP获取下一跳路由器的MAC地址;而下一跳为目标子网时,获取的目标MAC地址就是目标主机的MAC地址了。

以太网ARP定义于RFC 826,而TCP/IP教程RFC 1180则对ARP进行了很不错的介绍。除了ARP以外,还存在逆地址解析协议(RARP),将硬件地址转化为网络层地址。但DHCP已经包含了RARP的功能。
IPv6的邻居发现协议(neighbor discovery protocol,NDP)代替了ARP。

从IP地址到硬件地址的解析是自动进行的,主机的用户对这种地址解析过程是透明的。只要连接在同一网络上的主机或路由器进行通信,ARP就会自动将相应的IP地址解析为链路层需要的硬件地址。

下面小结一下需要使用ARP的四种典型情况:
[1]发送方是主机,要把IP数据报发送到同一个网络中的另一台主机。当发送主机的ARP表中不具有接收主机的MAC地址时,发送主机需要发送ARP广播,获得目标主机的MAC地址。
[2]发送方是主机,要把IP数据报发送到另一个网络中的另一台主机。当发送主机的ARP表中不具有默认网关的MAC地址时,发送主机需要发送ARP广播,获得默认网关的MAC地址。
[3]发送方是路由器,要把IP数据报转发到同一个网络中的主机。当路由器的ARP表不具有接收主机的MAC地址时,路由器需要发送ARP广播,获得目标主机的MAC地址。
[4]发送方是路由器,要把IP数据报转发到另一个网络中的主机。当路由器的ARP表不具有接收主机的MAC地址时,路由器需要发送ARP广播,获得下一跳路由器的MAC地址。

免费ARP(Gratuitous ARP)报文是一种特殊的ARP报文,源IP地址和目标IP地址都是本机IP地址,源MAC地址是本机MAC地址,目标MAC地址是广播地址。它不期望得到IP对应的MAC地址。设备通过对外发送免费ARP报文(请求自己的IP地址对应的MAC地址),来实现以下功能:
验证IP地址是否冲突。当其它设备收到免费ARP报文后,如果发现报文中的IP地址和自己的IP地址相同,则给发送免费ARP报文的设备返回一个ARP应答,告知该设备,IP地址冲突。
通知网络中的其它主机及时更新ARP缓存。若设备改变了硬件地址,通过发送免费ARP报文,可以通知其它设备更新ARP表。

以太网的成功有很多原因。首先,以太网是第一个广泛部署的高速局域网。因为它部署得早,网络管理员非常熟悉以太网。于是,当其它LAN技术问世时,他们不愿意切换到其它技术。其次,令牌环(802.5)、FDDI和ATM更复杂,且成本更高。此外,虽然新技术总是带来更高的速率,但以太网总是通过推出更快的版本,将后来者击败。交换以太网在1990年代早期出现后,进一步提升了有效传输速率。最终,以太网越来越流行,相关的硬件(适配器和交换机)也变得非常便宜了。

最初的以太网LAN于1975年由Xerox的Palo Alto研究中心发明,使用同轴总线互连结点。总线拓扑在1980年代到1990年代中期都保持不变。总线拓扑的以太网是广播LAN,总是将帧传输给总线上的所有适配器。总线两端的匹配电阻吸收在总线上传播的电磁波,避免总线上产生有害的电磁波反射。
1980年代和1990年代早期,以太网面临其它LAN技术的挑战,包括令牌环、FDDI和ATM。但后来,以太网逐渐成为了最流行的LAN技术,并一直保持垄断。以太网在LAN中的地位,正如Internet在全球网络中的地位。
1990年代后期,许多公司和大学都通过基于集线器(hub)的星形拓扑,用以太网装置替换了已有的局域网。在这种装置中,主机和路由器都通过双绞铜线直连到集线器。集线器是物理层设备,对位进行操作,而不是帧。当一个bit到达一个接口时,集线器仅仅重新创建这个bit,增强其能量,将其传递给所有其它接口。因此,基于集线器的星形拓扑的以太网也是广播LAN:当集线器从一个接口收到一位时,就将这个位复制给其它全部接口。如果集线器同时收到两个帧,就会发生碰撞,创建这些帧的结点需要重新传输相应的帧。
使用集线器的局域网,在物理上是一个星形网。但集线器使用电子器件来模拟电缆线,因此,整个系统仍像传统以太网那样运行,即:使用集线器的以太网在逻辑上仍是一个总线网,各站共享逻辑上的总线,各站中的适配器执行CSMA/CD协议。网络中的各站必须竞争对传输媒体的控制,并且,同一时刻至多只允许一个站发送数据。
随着时代的前进,原先为以太网使用的总线和集线器都已经被交换机取代:集线器能干的活,交换机干得更好;并且,交换机的价格足够便宜。
在2000年代早期,以太网经历了一次重大演化。虽然以太网装置继续使用星形拓扑,但集线器都被换成了交换机。这不仅避免了碰撞,而且实现了存储转发功能。与路由器和网络层交换机不同,链路层交换机工作在第二层。


如图,这是DIX Ethernet V2标准的以太网帧格式。DIX Ethernet V2是世界上第一个局域网产品规范,由DEC、Intel和Xerox联合制定。在此基础上,IEEE 802委员会的802.3工作组于1983年制定了第一个IEEE的以太网标准IEEE 802.3。802.3局域网对以太网标准中的帧格式做了很小的一点改动,但允许基于这两种标准的硬件实现可以在同一个局域网上互操作。以太网的两个标准DIX Ethernet V2与IEEE的802.3只有很小的差别,因此很多人也常常把802.3局域网简称为“以太网”。虽然严格说来,“以太网”应当是指符合DIX Ethernet V2标准的局域网。
以太网帧的各个字段分别是:
·前同步码(preamble)。以太网帧的头8个字节固定为AA AA AA AA AA AA AA ABh(AAh = 10101010,ABh = 10101011)。前7字节用于令接收、发送适配器进行时钟同步。发送适配器无法以精确的额定速率传输帧,相对于额定速率总有一些漂移,局域网上的其它适配器无法预知这种漂移。接收适配器只需通过前同步码的前7字节,来锁定发送适配器的时钟。最后2位连续的1对接收方起到警示作用,指示重要的内容马上就要到来。在使用SONET/SDH进行同步传输时,不需要前同步码,因为在同步传输时,收发双方的位同步始终保持。此外,以太网在传送帧时,各帧之间还必须有一定的间隙。因此,接收端只要找到帧开始定界符ABh,其后面的连续到达的比特流就都属于同一个MAC帧。由于帧间间隙的存在,以太网不需要帧结束定界符,也不需要使用字节插入保证透明传输。
·目标地址(destination address)。即目标适配器的MAC地址,6字节。当接收适配器收到以太网帧后,如果自身的MAC地址与帧的目标地址匹配,则将帧包含的上层数据呈递给网络层。如果不匹配,则丢弃该帧。
·源地址(source address)。即将数据发送到LAN的适配器的地址,6字节。
·类型(type)。2字节,允许以太网复用不同的网络层协议。根据类型字段的不同,适配器将数据部分交由相应的网络层协议(IP,Novell IPX,AppleTalk等)。不同的网络层协议具有不同的协议号。ARP也有自己的协议号。
·数据。46到1500字节。数据段包含了数据报。以太网的MTU为1500字节。如果IP数据报大于1500字节,则需要分片。数据段最小为46字节。如果IP数据报小于46字节,则多出来的空白会被填充。网络层通过IP数据报的长度字段,把数据报与填充内容区别开来。如果数据字段的长度不在这个范围,则此帧无效,将被丢弃。

链路层协议 MTU(字节)
Ethernet 1500
PPP 1500
IEEE 802.3 1492
FDDI 4352
·CRC码。4字节。允许接收方检验帧是否出错。传输媒体的误码率为10-8时,MAC可使未检测到的差错占比小于10-14。
以太网帧的帧头并没有长度字段。当发送方把一个以太网帧发送完毕后,就不再发送其它码元了(既不发送1,也不发送0)。而以太网采用Manchester编码。当接收端将数据全部接收完毕,网卡的接口上的电压也就不再变化了。这样,接收方就很容易确定以太网帧的结束位置。此外,如果帧长不是整数字节,那么这一帧无效,需要丢弃。

最后要提一下,802.3标准规定的MAC帧格式与上面所讲的以太网V2 MAC帧格式的区别就是两个地方。
第一,IEEE 802.3规定,MAC帧的第三个字段是“长度 / 类型”。字段值大于0600h(1536)时表示类型,这样的帧和以太网V2 MAC帧完全一样;字段值小于0600h时才表示长度,即MAC帧的数据部分长度。显然,此时若数据字段的长度与长度字段的值不一致,则该帧无效。以太网采用曼彻斯特编码,长度字段并无实际意义。
第二,当“长度 / 类型”值小于0600h时,数据字段必须装入LLC帧。在早期,出于有关厂商在商业上的激烈竞争,IEEE 802委员会未能形成一个统一、“最佳”的局域网标准,而是被迫制定了几个不同的标准:802.4令牌总线网、802.5令牌环网,等等。为使数据链路层更好地适应多种局域网标准,IEEE 802委员会把局域网的数据链路层拆成两个子层:逻辑链路控制(Logical Link Control,LLC)子层和媒体访问控制(Medium Access Control,MAC)子层。与接入到传输媒体有关的内容都放在MAC子层,而LLC子层则与传输媒体无关,采用任何传输媒体和MAC子层的局域网,对LLC子层来说都是透明的。不过,现在广泛使用的局域网只有以太网,因此LLC帧已经失去了原来的意义。当今市场上流行的都是以太网V2的MAC帧,但大家也常常把它称为IEEE 802.3标准的MAC帧。

以太网的全部技术,都为网络层提供了无连接服务。换句话说,当适配器A想发送数据报给适配器B时,A仅仅将数据报封装到以太网帧里,把帧发送到LAN中,而不在发送前先与B握手,也不对发送的帧编号,更不要求对方发回确认。这种二层无连接服务,类似于三层的IP和四层的UDP提供的无连接服务。
以太网为网络层提供不可靠服务。如果适配器B从适配器A接收到了帧,那么B对帧进行CRC,但不会回送检查结果。假如校验失败,则B直接丢弃出错的帧。不进行可靠传输,使得以太网简单而廉价。但代价是上交给网络层的数据报流可能存在缺失。不过,现在局域网信道的质量已经很好,因通信质量差而出错的概率是很小的。
如果因为以太网帧被丢弃而导致缺失出现,接收方B的应用会发现吗?这取决于应用层使用TCP还是UDP。如果是UDP,则B中运行的应用会发现数据缺少了一部分。如果是TCP,则B中的TCP未确认部分数据,导致A中的TCP重传。如果发送方A重传数据,则丢失的数据会重新回到以太网中。从这个角度,也可以说以太网重传了数据。但有一点很明确:以太网并不知道当前正在传输的数据是重传的还是全新的。

以太网具有一系列衍生的标准,如:10BASE-T,10BASE-2,100BASE-T,1000BASE-LX,10GBASE-T,40GBASE-T,等等。这些连同许多以太网技术,都被IEEE 802.3 CSMA/CD工作组标准化了。这些标准中,10、100、1000、10G和40G代表速率(10 M、100 M、1000 M、10 G和40 G);BASE代表基带以太网(baseband Ethernet),代表物理媒介仅运送以太网流量。几乎所有的802.3标准都适用于基带以太网。后缀指物理媒体类型。以太网既是链路层规范也是物理层规范,能在各种介质中传输数据。T代表双绞铜线(twisted-pair copper wires)。

历史上,以太网最初被构想为一段同轴电缆。早期的10BASE-2和10BASE-5都是针对基于两种类型的同轴电缆的10 Mbps以太网的,电缆长度不超过500米。而10BASE-T要求两台主机的距离不超过200米,否则,信号会衰减到使CSMA/CD协议无法正常工作。如果需要更长的运行距离,则使用转发器(repeater)。转发器是物理层设备,从输入端接收信号,在输出端重新生成信号。如今的以太网已经完全不同了:转发器早已被淘汰,结点通过点对点双绞铜线或光纤等物理线路连接到交换机。
在计算机网络发展的早期,有一个概念叫做网桥,也称桥接器(bridge)。网桥是连接两个局域网的一种存储转发设备。它将一个大的LAN分割为多个网段(network segment),或将两个以上的LAN互联为一个逻辑LAN,使LAN上的所有用户都可访问服务器。对收到的帧,网桥根据其MAC帧的目的地址进行转发和过滤。当网桥收到一个帧时,并不向所有的接口转发此帧,而是根据此帧的目的MAC地址,查找网桥中的地址表,确定将该帧转发到哪一个接口,或把它丢弃(过滤)。后来,网桥也被具有更多端口、同时也可隔离冲突域(见下文)的交换机所取代。

1990年代中期,以太网被标准化为100 Mbps。原先的以太网MAC协议和帧格式被保留了下来,不过也为铜线(100BASE-T,该标准也称快速以太网Fast Ethernet,IEEE 802.3u)、光纤(100BASE-FX,100BASE-SX,100BASE-BX)定义了高速物理层。使用双绞线时,100 M以太网的传输距离限制为100米;使用光纤时,限制放宽到数千米。
用户只要使用100 Mbit/s的适配器和100 Mbit/s的集线器或交换机,就可很方便地由10BASE-T以太网直接升级到100Mbit/s,而不必改变网络的拓扑结构。所有在10BASE-T上的应用软件和网络软件都可保持不变。100BASE-T的适配器有很强的自适应性,能够自动识别10 Mbit/s和100 Mbit/s(以及半双工和全双工)。
100BASE-T可使用以太网交换机提供很好的服务质量,可在全双工方式下工作而无冲突发生。因此,CSMA/CD协议对全双工方式工作的快速以太网是不起作用的(但在半双工方式工作时,则一定要使用CSMA/CD协议)。
在100 Mbps以太网中,保持最短帧长64字节不变。100 Mbps的以太网的争用期变为5.12 μs,帧间最小间隔为0.96 μs,都是10 Mbps以太网的1/10。

G级以太网(GbE)则是高度成功的10 M和100 M以太网标准的扩展。举例:40 G以太网对现有以太网设备保持了完全的兼容性。G级以太网标准IEEE 802.3z主要做了:
·使用标准的以太网帧格式,使得与10BASE-T和100BASE-T向后兼容。这令现有设备能快速迁移到GbE。
·允许点对点链路和共享广播链路。点对点链路使用交换机,广播链路使用集线器。在G级以太网的专用术语中,集线器也称缓冲分配器(buffered distributor)。
·对广播信道使用CSMA/CD协议。为了获得可以接受的效率,两个结点的最大距离必须严格限制。
·在半双工方式下使用CSMA/CD协议,而在全双工方式不使用CSMA/CD协议。
·对点对点信道,允许在40 Gbps的速率下全双工运行。
1000BASE-X(-SX,-LX,-CX)的标准是IEEE 802.3z,而1000BASE-T的标准是IEEE 802.3ab。
G级以太网工作在半双工方式时,必须进行碰撞检测。由于数据率提高了,因此,只有减小最大电缆长度或增大帧的最小长度,才能使参数a保持为较小的数值。若将吉比特以太网最大电缆长度减小过多,那么网络的实际价值就大大减小。而若将最短帧长提高得过大,则在发送短数据时开销又嫌太大。因此,G级以太网采用了载波延伸(carrier extension)的办法,使最短帧长仍为64字节(保证兼容性),同时将争用期增大为512字节。发送的MAC帧长不足512字节时,就用特殊字符填充在帧尾,使MAC帧的发送长度增大到512字节,这对有效载荷并无影响。接收端在收到以太网的MAC帧后,先把填充的特殊字符删除,再才向高层交付。填充的字节可能造成很大的开销。
为此,G级以太网还增加了一种功能,称为分组突发(packet bursting):当很多短帧要发送时,第一个短帧采用载波延伸的方法填充。但随后的一些短帧,则可一个接一个地发送,留有必要的帧间最小间隔即可。这样就形成一串分组的突发,直到达到1500字节或稍多些为止。G级以太网工作在全双工方式时,不使用载波延伸和分组突发。


10GE(10GbE)以太网并不只将速率简单提高10倍,因为还有许多技术问题要解决。10GE的帧格式与10 Mbit/s,100 Mbit/s和1 Gbit/s以太网的帧格式完全相同,并保留了802.3标准规定的最小帧长和最大帧长。这就使用户在升级以太网后,仍能方便地和较低速率的以太网通信。10GE只工作在全双工方式,因此不存在争用问题,当然也不使用CSMA/CD协议。这就使得10GE的传输距离大大提高了(不再受必须进行碰撞检测的限制)。

表中的前三项的标准是IEEE 802.3ae,在2002年6月完成。第四项的标准是IEEE 802.3ak,完成于2004年。最后一项的标准是IEEE 802.3an,完成于2006年。
以太网的技术发展得很快。10GE之后,又制定了40GE/100GE的标准IEEE 802.3ba-2010和802.3bm-2015。下表是40GE和100GE的物理层名称及传输距离,其中有两项带*号的是802.3bm提出的。
40GE/100GE同样只工作在全双工的传输方式(不使用CSMA/CD协议),并且仍然保持了以太网的帧格式以及802.3标准规定的以太网最小和最大帧长。100GE在使用单模光纤传输时,仍然可以达到40 km的传输距离,但这需要波分复用(使用4个波长复用一根光纤,每一个波长的有效传输速率是25 Gbit/s)。


总之,在使用总线拓扑和基于集线器的星形拓扑的早期,以太网是一条广播链路,可能发生帧碰撞。我们说,每一个以太网都是一个独立的碰撞域(collision domain,也称冲突域)。在任一时刻,每一个碰撞域中,只能有一个站发送数据。集线器会增大冲突域,且不能提高吞吐量。如果不同的碰撞域使用不同的数据率,那么就不能用集线器将它们互连起来。
为避免碰撞,以太网引入了CSMA/CD协议,协议对于小范围的有线广播局域网特别有效。今天广为使用的以太网使用基于交换机的星形拓扑,采用存储转发分组交换,是否还真正需要一种以太网MAC协议呢?交换机会协调传输,任何时候都决不会向相同接口转发超过一帧。此外,现代交换机是全双工的,这使得一台交换机和一个结点能够同时向对方发送帧而不发生干扰。可见,基于交换机的以太网中不会有碰撞,因此没有必要使用MAC协议了。

时至今日,以太网已与20世纪70年代中期的雏形有了非常大的不同:速率至少提升了三四个数量级;以太网帧能通过各种媒介传输;交换以太网已经具备统治性的地位;甚至MAC协议也经常不是必要的了。也许你会问:这还是以太网吗?答案很明确:从定义上说,是的。虽然前面说的这些方面都发生了翻天覆地的变化,但有一样东西在这三四十年以来一直保持不变:以太网帧格式。

“交换机”(switch)并无准确的定义和明确的概念。著名网络专家Perlman认为:“交换机”应当是一个市场名词,而交换机的出现的确使数据的转发更加快速了。有时我们也使用这个广泛被接受的名词一一以太网交换机。
以太网交换机,实质上就是一个多接口的网桥,通常有十几个或更多的接口,和工作在物理层的转发器、集线器有很大的差别。以太网交换机的每个接口,都直接与主机或另一台以太网交换机相连,并且一般都是全双工的。
以太网交换机还具有并行性,能同时连通多对接口,使多对主机同时通信(网桥只能一次分析和转发一个帧)。相互通信的主机都独占传输媒体,无碰撞地传输数据。也就是说,以太网交换机能极大增加网络的总容量。
以太网交换机的接口还有存储器,能在输出端口繁忙时,把到来的帧暂时缓存。因此,如果连接在以太网交换机上的两台主机同时向另一台主机发送帧,那么当这台主机的接口繁忙时,发送帧的这两台主机连接到的接口会把收到的帧暂存一下,以后再发送出去。
从共享总线以太网转到交换式以太网时,所有接入设备的软件和硬件都不需要做任何改动。帧结构不变。
虽然许多以太网交换机对收到的帧采用存储转发方式转发,但也有一些交换机采用直通(cut-through)的交换方式。直通交换不必把整个数据帧先缓存再处理,而是在接收帧的同时就立即按帧的目标MAC地址把帧转发出去,因而提高了转发速率。如果采用ASIC实现此功能,交换时延可以做到非常小。不过,直通交换的缺点是:不检查差错就直接转发帧,有可能将一些无效帧转发给其它站。某些情况下,仍需要采用基于软件的存储转发方式进行交换。例如,当需要进行线路速率匹配、协议转换或差错检测时。现在,有的厂商具备能支持两种交换方式的以太网交换机。
以太网交换机的发展,与使用交换机所在网络的建筑物结构化布线系统的普及应用密切相关。在结构化布线系统中,广泛地使用了以太网交换机。
以太网交换机的种类很多。例如,“具有第三层特性的第二层交换机”和“多层交换机”。前者具有某些三层功能,如:数据报的分片,以及对多播通信量的管理;而后者可根据第三层的IP地址对分组进行过滤。

交换机自身对子网中的主机和路由器是透明的:主机或路由器给帧标好另一台主机或路由器的地址(而不是特地把帧送到交换机),然后直接把帧丢进LAN里,并不会意识到:有交换机收到了此帧并转发。帧到达交换机输出接口的速率可以高于该接口的链路速率,因此,交换机和路由器一样,具有输出接口缓存,暂存准备发送出去的帧。

过滤(filtering)是一种交换机功能,决定哪些帧需要转发到哪些接口,而哪些帧应当直接丢弃。转发(forwarding),是指决定帧应当被导向哪些接口,并将帧转发到相应接口。过滤和转发功能都通过交换表(switch table,也称地址表)来完成。交换表包含LAN内的部分主机和路由器的信息。表项包含:MAC地址,对应的交换机接口,以及该项放入表中的时间。以太网交换机使用了ASIC,用硬件转发,转发速率比软件转发的网桥快得多。

如果有一个MAC地址为A的帧到达了接口x,那么分成三种情况:
·交换表中没有包含A的项。交换机将把此帧转发给除了x以外的全部接口。即:当交换表中没有目标MAC地址对应的记录时,交换机默认广播该帧(不然转发不出去)。
·交换表中具有包含A的项,且指示了转发到接口x,即与输入接口相同。此时无需转发,直接丢弃。
·交换表中具有包含A的项,但指示了转发到与接口x不同的接口y,则该帧需要转发到接口y。

交换表是由交换机自动构建和维护的,无需网管或配置协议的干预。这个特性称为自学习(self-learning)。自学习的实现方式是:
1、初始时,交换表是空的。
2、对某台主机H发来的帧,交换机会在表中存储源MAC地址(主机H的适配器MAC地址)、到达的接口和当前时间。于是,交换机在表中记录了发送端所在的LAN网段。如果LAN中的每一台主机都发送一帧,那么每台主机在表中都有记录。之后,如果接收到目标地址指向H的MAC地址的帧,交换机就可以在交换表中查找到相应的条目,于是直接向当时H发送的帧到达的接口进行转发。
3、经过一段时间(老化时间,aging time)后,如果没有接收到包含相应的源地址的帧,那么对应的项就从表中删除。如果LAN中的一台计算机被替换(适配器更换了),那么被代替的计算机在表中的记录最终会被删除。

交换机也是即插即用的设备,因为无需网管或用户的干预。网管想安装交换机时,只需要将LAN网段连接到交换机的接口上,不用做别的。在安装交换机或某主机从局域网网段之一被去除时,管理员也没有必要配置交换表。

有时,为了增加网络的可靠性,在使用以太网交换机组网时,往往会增加一些冗余的链路。在这种情况下,自学习的过程就可能导致以太网帧在网络的某个环路中无限制地兜圈子。802.1D标准制定了生成树协议(spanning tree protocol,STP)。要点就是不改变网络的实际拓扑,但在逻辑上切断某些链路,使得一台主机到所有其它主机的路径都是无环路的树状结构,从而消除了兜圈子现象。

使用交换机的优点有:
·高速、无碰撞。使用交换机而非集线器建立的LAN中,不会因碰撞而浪费带宽。交换机会把帧适时缓存起来,从不在网段上同时传输多个帧。与路由器一样,交换机的最大聚合带宽是其全部接口的速率之和。相比带广播链路的LAN,这是性能上的巨大飞跃。
·异构链路。交换机将链路之间彼此隔离,使得不同链路可以使用不同的媒介并具有不同的速率。这能使较旧的设备能与最新的设备在同一个局域网中使用。
·管理。除了提供更高的安全性,交换机也降低了网络管理的难度。例如,如果一张网卡故障并不断发送以太网帧,则交换机能检测到,并在内部断开异常适配器。网管便无需在网络故障的时候被单位的电话吵醒,开车回单位去手动修复问题。如果电缆断开,也只影响该电缆原先连接的主机。在同轴电缆时代,许多网管花费数小时沿线检修(爬地板),去查找导致整个网络瘫痪的断点。交换机还可以统计带宽使用、碰撞率、流量类型等数据,并将这些信息展示给网管,以便发现和修正bug,以及计划后续的LAN升级方式。

当主机与交换机相连时,通常仅接收目标地址指向它的帧。如果主机A通过交换机向B发送帧,那么虽然同一子网内的主机C也连接到该交换机,但是有了交换机的把关,C上的嗅探器无法嗅探到A发送B的消息。可见,与广播链路环境(如802.11 LAN与基于集线器的LAN)不同,在交换LAN中,攻击者更难嗅探到需要的帧。然而,当交换表中没有需要的条目时,交换机会将收到的相应的帧广播给整个LAN。这时候,子网内的任何其它主机C都可以嗅探到广播的帧。针对交换机的一种攻击叫做交换机毒化(switch poisoning),也称MAC洪水(MAC flooding),通过发送大量包含不同的伪造源MAC地址的分组给交换机,导致交换表被无效条目占满,无法为LAN内的合法主机记录相应的条目。这就导致交换机不得不广播从这些合法主机发送的帧,这些帧就可以用嗅探器捕获。不过,这种攻击只有技艺高超的攻击者才能做到,因此交换机比集线器和WLAN更难受到嗅探。

作为互连设备,路由器和交换机有什么区别?各有哪些优缺点?
首先是交换机的优点和缺点。
交换机是即插即用的,这一特性为全世界的网络管理员所喜爱。交换机也具有相对更高的过滤与转发速率。
然而,为了防止广播帧的循环,交换机的活动拓扑必须为树形。此外,一个大的交换网络需要主机与路由器记录一张大的ARP表,并且会产生非常多的ARP流量与处理量。交换机易受广播风暴(broadcast storm),即过多的广播信息的影响:如果一台主机故障,发送了过多的以太网广播帧,那么交换机会将这些帧转发,导致整个网络崩溃。
再来列举路由器的优点和缺点。
网络地址常常是层次性的,分组不会简单地在路由器之间循环,即便网络中存在冗余的路径。然而,如果路由表配置不正确,循环是可以发生的。IP数据报的报头具有TTL字段,限制了最大跳数。所以,分组就不会被限制到一棵生成树上,并可以使用源和目的地之间的最佳路径。由于路由器没有生成树限制,Internet的拓扑可以是各种各样的,例如,在欧洲和北美之间可以具有非常多的活动链路。另外,路由器为二层广播风暴提供了防火墙保护。可能路由器的最大缺陷是无法即插即用:路由器和主机必须配置IP地址,才能发挥路由功能。路由器处理每个包的时间通常也长于交换机,因为它们要在第三层处理包。
 “router”一词具有两种读音“rooter”和“rowter”。人们花费了很多时间争论哪种读法才是正确的。

对于几百台左右的主机与几个局域网网段规模的小型网络,仅使用交换机也是足够的,这样可以将流量本地化,提升总吞吐量,且不要求配置IP地址。但更大的网络一般需要路由器,以更好地隔离流量,控制广播风暴,并确定更优的路由。

一种比较简单的局域网结构是分层的:例如,一个机构的每个工作组(部门)拥有自己的交换LAN,通过交换机与其它交换LAN连接。这种网络是理想化的,实际使用时具有如下的不足:
·缺少流量隔离。虽然层次化令不同组的流量本地化于一台交换机,但广播流量(比如携带ARP与DHCP信息的帧,或者自学习交换机还没有学习的目的地对应的帧)还是会遍历整个机构的网络。限制广播流量的范围可以提升LAN性能,并增强安全性和对隐私的保护。比如,一个LAN是行政管理团队专用的,而其它LAN则由雇员使用,并开启了Wireshark分组嗅探器。这时候,行政团队可能希望自己的流量从不到达职工使用的主机。以上图的拓扑为例,如果将最中间的连接了6个接口的交换机换成路由器,这种隔离就可以实现了。当然,仅使用二层交换机的时候,也有实现这种隔离的方案。
·交换机的低效使用。如果机构里有很多组,每个组的主机数量又很少,那么会有大量的交换机的很多接口都用不到。如果一台接口足够多的交换机也能连接全部主机,又无法提供流量隔离功能。
·管理用户。例如,如果一个职工被调到了其它组,又不方便使用其它的主机而必须使用原有的主机,则必须改变物理布线,将该职工所用主机连接到其它交换机。如果有职工在多个组中工作,问题就更复杂了。

幸运的是,上述问题都可以通过支持虚拟局域网(virtual local area network,VLAN)的交换机解决。
支持VLAN的交换机允许在一个物理LAN上定义多个虚拟的LAN,当然也可以将多个LAN中的一些主机划分给一个VLAN。VLAN内的主机可以相互通信,就像连接到同一交换机那样。在基于端口的VLAN中,交换机端口(接口)被网络管理员分成若干个组,每一组构造一个VLAN,每个VLAN内的全部端口形成一个广播域(broadcast domain),又称网段。广播流量只能在VLAN内传输。
网络管理员使用交换机管理软件,声明一个端口属于某个给定的VLAN(未声明的端口属于默认的VLAN),在交换机中维护一张端口到VLAN的映射表;交换机仅在属于相同VLAN的端口之间交付帧。


那么,要在不同的VLAN之间通信时,怎么办?一种方案是:将VLAN交换机的一个端口与外部的路由器相连,并将该端口同时配置为属于这两个VLAN。于是,即便这两个VLAN中的主机使用相同的物理交换机,逻辑上也会将这些主机视作是通过不同的交换机连接到路由器的。从一个VLAN到另一个VLAN的IP数据报将先到达路由器,再从路由器传回同一交换机的不同端口。不过,交换机厂商已经想到办法使这种方案很容易被网管实施:有的设备既是VLAN交换机又是路由器,于是就不再需要额外的路由器了。

VLAN中继(VLAN trunking)可以互连VLAN交换机。使用VLAN中继时,每台交换机都要预留一个端口,将其配置为trunk端口。Trunk端口是属于所有VLAN的,发送到任何VLAN的帧都将通过trunk链路转发给其它交换机。IEEE定义了扩展以太网帧格式802.1Q(Dot1q),这是专门针对需要穿过VLAN中继的帧制定的。.1Q帧也包含标准以太网帧的内容,但还包括一个4字节的VLAN标签(VLAN tag),标记该帧所属的VLAN。在VLAN trunk的发送端,VLAN标签被加入帧内;在VLAN trunk的接收端,VLAN标签被移除。VLAN标签的2字节是标签协议标识符(tag protocol identifier,TPID),剩下2字节是标签控制信息,依次为:3-bit的优先级字段、1-bit的规范格式指示符(canonical format indicator,CFI)和12-bit的VLAN标识符。


除了基于端口的VLAN,VLAN还可以通过其它方式定义。在基于MAC的VLAN中,网关指定不同的MAC属于哪些VLAN。当设备连接到端口时,根据设备的MAC地址,端口连接到指定的VLAN。VLAN还可以根据网络层协议(IPv4、IPv6、AppleTalk等)、高层应用或服务或它们的组合,以及其它标准指定。VLAN还可以经过IP路由器进行扩展,允许LAN们通过单一的VLAN连接,甚至可以形成跨越全球的单一VLAN。

以太网的应用范围已经从局域网(校园网、企业网)扩大到城域网和广域网,从而实现了端到端的以太网传输。这种工作方式的好处是:
 (1) 以太网是一种经过实践证明的成熟技术,无论是互联网服务提供者ISP还是端用户都很愿意使用以太网。
 (2) 以太网的互操作性也很好,不同厂商生产的以太网都能可靠地进行互操作。
 (3) 在广域网中使用以太网时,其价格大约只有同步光纤网(SONET)的1/5,或异步传输模式(ATM)的1/10。以太网还能够适应多种传输媒体,如铜缆、双绞线以及各种光缆。这就使具有不同传输媒体的用户在进行通信时不必重新布线。
(4) 端到端的以太网连接使帧的格式全都是以太网的格式,而不需要再进行帧的格式转换,这就简化了操作和管理。但是,以太网和现有的其它网络,如帧中继或ATM网络,仍然需要有相应的接口才能进行互连。

以太网从10 Mbit/s到10 Gbit/s到100 Gbit/s再到未来的演进,证明了以太网是:
(1) 可扩展的(速率从10 Mbit/s到100 Gbit/s)。
(2) 灵活的(多种媒体、全/半双工、共享/交换)。
(3) 易于安装。
(4) 稳健性好。

6.5 链路虚拟化:网络作为链路层
多协议标签交换(multiprotocol label switching,MPLS)是在1990年代中后期综合了许多工业界的技术而诞生的,其目的是:通过增加定长标签,提高IP路由器的转发速率。“多协议”表示:在MPLS的上层可以采用多种协议。这并不代表要放弃基于目的地的IP数据报转发基础设施,而是要通过选择性标记数据报来增强它,并允许路由器在可能时通过定长标签立即转发数据报。这些技术与IP协同工作,通过IP来进行寻址和路由。MPLS协议由IETF颁布,已成为互联网的建议标准。
对标记的IP数据报进行硬件转发,称为标记交换。“交换”也表示在转发时不再上升到三层查找转发表,而是根据标签在二层使用硬件进行转发。MPLS可使用多种链路层协议,如PPP、以太网、ATM以及帧中继等。
人们经常把MPLS与异步传输模式(ATM)联系起来,这仅仅是因为它们都采用了面向连接的工作方式。以前很多人都曾认为,网络的发展方向是以ATM为核心的宽带综合业务数字网(B-ISDN)。然而,价格低得多的高速IP路由器仍然占领了市场,最终导致ATM技术和B-ISDN未能够成为网络的发展方向。

兼容MPLS的路由器处理的链路层帧中,数据部分的最前面是MPLS报头,紧随其后的才是IP报头和上层数据。使用这种封装技术的原因是:下层网络未必支持标签,而且IPv4数据报报头也没有多余的位置存放MPLS标签。RFC 3032定义了MPLS报头的格式,如下图。把带MPLS报头的IP数据报封装成以太网帧时,以太网的类型字段在单播时设置为8847h,在多播时为8848h。这样,接收方可以根据帧的类型判定,这个帧是携带了MPLS标签,还是一份常规的IP数据报。从层次的角度看,MPLS报头处在第二层和第三层之间。

MPLS报头一共4字节,包括4个字段:
(1)标签值(label)占20位。由于一个MPLS标记占20位,因此从理论上讲,可以同时容纳高达220条(1048576)条流。但是实际上,几乎没有哪个MPLS实例会使用很大数目的流,因为通常需要管理员人工管理和设置每条交换路径。
(2)试验(exp)占3位,目前保留用于试验。
(3)栈(S)占1位,在有“标记栈”时使用,用于标记一系列堆叠的MPLS报头,这里不予讨论。
(4)生存时间(TTL)占8位,用来防止MPLS分组在MPLS域的环路中循环。
这种MPLS增强帧只能在支持MPLS的路由器(标签交换路由器,label-switched router,LSR)间传送。不支持MPLS的路由器无法正确识别MPLS报头。MPLS域(MPLS domain)中所有的路由器都是标签交换路由器。


MPLS的基本工作过程是:
(1) MPLS域中的各LSR使用专门的标签分配协议(Label Distribution Protocol,LDP)交换报文,并找出和特定标记相对应的路径,即标签交换路径(Label Switched Path,LDP)。各LSR根据这些路径构造出转发表。这个过程和路由器构造自己的路由表相似[RFC 3031]。限于篇幅,这里不讨论转发表构造的详细步骤。MPLS是面向连接的,因为在LSP上的第一台LSR就根据IP数据报的初始标签确定了整个的标签交换路径。
(2) 当一份IP数据报进入到MPLS域时,MPLS入口结点(ingress node)就给它打上标签(插入MPLS报头),并按照转发表转发给下一台LSR。以后的所有LSR都按照标签进行转发。给IP数据报打标签的过程叫做分类(classification)。严格的第三层(网络层)分类只使用了IP报头中的字段,如源IP地址和目的IP地址等。大多数运营商实现了第四层(运输层)分类(除了要检查IP报头外,运输层还要检查TCP或UDP报头中的协议端口号),而有些运营商则实现了第五层(应用层)分类(更进一步地检查数据报的内部,并考虑其有效载荷)。
(3) 由于在全网统一分配全局标签是非常困难的,因此一个标签仅仅在两台LSR之间才有意义。分组每经过一台LSR,LSR就要做两件事:一是转发,二是更换新的标签,即:把入标签更换成为出标签。这就叫做标签对换(label swapping)。做这两件事所需的数据都已清楚地写在转发表中。例如:

标签交换路由器就知道应当把该IP数据报从出接口1转发出去,同时把标记改为l。当IP数据报进入下一台LSR时,这时的入标记就是刚才得到的出标记。下一台LSR在转发该IP数据报的时候,又把入标记1对换为另一个出标记,比如2。
(4) 当IP数据报离开MPLS域时,MPLS出口结点(egress node)就把MPLS的标签去除,把IP数据报交付非MPLS的主机或路由器,以后就按照普通的转发方法进行转发。
上述的这种“由入口LSR确定进入MPLS域以后的转发路径”称为显式路由(explicit routing),它和互联网中通常使用的“每一台路由器逐跳进行路由选择”(逐跳路由)有着很大的区别。

MPLS有个很重要的概念就是转发等价类(Forwarding Equivalence Class,FEC)。转发等价类,就是路由器按照同样方式对待的IP数据报的集合。“按照同样方式对待”表示:从同样接口转发到同样的下一跳地址,并且具有同样服务类别和同样丢弃优先级等。FEC的例子是:
(1) 目的IP地址与某一个特定IP地址的前缀匹配的IP数据报(这就相当于普通的IP路由器);
(2) 所有源地址与目的地址都相同的IP数据报;
(3) 具有某种服务质量需求的IP数据报。
总之,划分FEC的方法不受什么限制,这都由网络管理员来控制,因此非常灵活。入口结点并不是给每一个IP数据报指派一个不同的标记,而是将属于同样FEC的IP数据报都指派同样的标记。FEC和标记是——对应的关系。

下面举一个把FEC用于负载平衡的例子。有时候,传统的路由协议基于某些算法和策略(例如最短路径)进行路由选择,有可能令大量的流量都要经过同一条路径,导致局部过载,甚至成为整个网络的瓶颈。有了FEC,就可以批量将具有某些性质(比如都具有相同的源地址和目标地址,可以由网络管理员自定义)的数据报设置为转发到其它路径,进而使网络的负载较为平衡。

MPLS路由器在进行转发和路由器之间通信时,无需解析分组的IP报头。现存的链路状态路由算法(如OSPF)已经针对MPLS做了扩展,可以在MPLS兼容的路由器之间洪泛链路状态信息。在MSPF中,使用的路由算法没有统一标准,使用何种算法与设备厂商有关。

MPLS的一个更重要的优势是:提供了不能用IP做到的流量管理能力。网络管理员能够通过MPLS来覆盖一般的IP路由,强制某些流量沿着指定的路径流向目的地(无论是出于性能,还是出于一些特定策略的考虑)。这是基于MPLS的流量工程的一种简单情形。

MPLS还可用于其它目的。例如,当链路故障时,可以通过MPLS预先计算好的备用路径。来快速恢复网络的通信能力。MPLS还用于VPN。为了给顾客实现VPN,ISP使用启用了MPLS的网络来将顾客使用的网络互连。MPLS可以用于将客户的VPN使用的资源和地址与其它用户隔离。

6.6 数据中心网络
诸多IT行业的巨头,如Google、Microsoft、Facebook和Amazon等,都有自己的数据中心。每个这样的大型数据中心至少具备几十万台主机,支持不同的云应用,如,搜索、邮件、社交网络、电子商务和影音串流等。每个数据中心都拥有自己的数据中心网络,将Internet和数据中心内的计算机互连起来。

一座大的数据中心一个月的总运行成本要按数千万美元计。这些经济成本中,花在主机上的并不是绝大多数(例如45%)。基础设施的成本可以达到25%,包括变压器、不间断电源供应系统(UPS)、为长时间断电准备的发电机、冷却系统等。约15%的花销用于。网络的花费也可以占到15%,包括交换机、路由器、负载平衡器、外部链路和流量传输。当然,在这些费用中,设备费用是按使用期限均摊给每个月的,以便能和电费等持续性的开销一同计算。虽然网络不是成本最多的部分,但在网络上进行创新,可以减小总成本并提升性能。

数据中心的主机负责提供内容(网页和视频等)、存储邮件与文档、集体执行分布式计算(比如搜索引擎的索引)。主机常被做成刀片式的,堆叠在机架上。一个机架可以具有20到40台刀片服务器。机架顶部设有机架顶部交换机(top-of-rack(TOR) switch),互连机架中的主机和数据中心的其它交换机。机架中的所有主机都有自己的网络接口连接到TOR交换机,并被分配仅在数据中心内有效的IP地址;每台TOR交换机都有额外的接口连接到其它交换机。

数据中心网络支持两种流量:一种是与外部客户端的流量,另一种是与内部主机的流量。数据中心网络具有若干台边界路由器(border router),将数据中心网络连接到Internet。数据中心网络的不同机架也连接到边界路由器,从而加入整个数据中心网络。如何设计数据中心网络,已经成为了近年来计算机网络研究的一个重要分支。

为了运行各种应用,每个应用程序都被分配一个公共可见的IP地址,客户端将请求发送给相应的IP地址,相应应用通过自己的IP地址进行应答。在数据中心内部,外部请求先经过负载平衡器(load balancer),后者的工作是:在主机之间分配请求,根据主机当前的负载来平衡负载。大型数据中心经常具有多台负载平衡器,每台负责一组特定的应用。负载平衡器也称“四层交换机”,因为它根据目标端口号和目标IP地址做出决策。在收到对特定应用程序的请求后,负载平衡器将其转发给运行该应用程序的一台主机。主机可以自行处理,也可以调用其它主机的服务来处理请求。当请求处理完毕后,就被发送回负载平衡器,后者将其交付给外部客户端。负载平衡器不但进行负载均衡,还充当了类似NAT的作用,将公用的外部IP地址与内部IP地址互相转换。这也使得客户端不直接与主机通信,隐藏了内部的网络结构,增强了安全性。

当拥有的主机数量非常多时,数据中心通常将路由器和交换机分层。最顶层的边界路由器与访问路由器连接。每台访问路由器之下有三个层的交换机,并连接到顶层的交换机。每台顶层(Tier-1)交换机连接到Tier-2交换机;每台Tier-2交换机则通过TOR交换机(Tier-3交换机)连接机架。所有链路一般都使用以太网作为链路层和物理层协议,既可以使用铜线,也可以使用光纤。这种层次化的结构有利于扩大数据中心的规模。

为了增强可用性,网络部件一般都有冗余。例如,每台TOR交换机可以连接到多台Tier-2交换机,访问路由器和交换机都可以部署足够多的数量。每台访问路由器之下具有单个子网,以限制ARP广播流量的范围。这些子网会被进一步划分成若干个更小的VLAN子网,每个这样的VLAN子网可以具有数百台主机。

层次结构解决了数据中心规模难以扩大的问题,但还是会受到主机到主机的容量限制的影响。如果交换机之间的链路速率相对不足,那么不同机架的主机通信时,速率将受到制约,无法跑满主机网卡支持的最高速率。如果主机间的流量需要穿过更高层次的交换机或路由器,则需要交换机(路由器)之间具备更高的速率。而部署更高端口速率的交换机与路由器需要的花费是极其昂贵的。

为了降低运行成本和延迟并增强吞吐量,拥有数据中心的各大企业都在改进数据中心的网络设计。虽然这些设计是专有的,但也可以归纳出不少相同的趋势。
首先,新的互连架构和网络协议被用于克服传统层次化设计的缺点。一种方案是:将交换机和路由器之间采用完全连接拓扑:每台Tier-1连接到全部的Tier-2交换机;每台Tier-2交换机也连接到全部的Tier-1交换机。
其次,基于容器的模块化数据中心(modular data centers,MDC)也在大规模铺开。工厂组装好许多大型容器,容器内包含数据中心需要的各种硬件,然后将这些容器运送到数据中心所在的位置投入使用。每个这样的容器可以具备上千台主机,几十个机架。一旦这种容器在数据中心部署完毕,维修就比较困难了。因此,这种容器已经针对了性能下降的情况进行设计:当部件(服务器、交换机等)故障后,容器以降低的性能继续工作。如果损坏的部件数达到一个阈值,导致性能损失不可接受,则整个容器将被移除,替换新的容器。

在MDC中,有两类网络:容器内网络和容器间网络(核心网络)。在容器内,使用廉价的商用G级以太网交换机对几千台主机构造一个完全连接网络是可行的。但是,如果要将这些容器在满足主机到主机的速率足够的要求下连接起来,即便是针对典型负载而不是满载,也是非常具有挑战性的。
设计了互连拓扑,还要有配套的路由算法。可以使用随机路由,也可以为每台主机配置多个网卡,以此将每台主机连接到低成本商用交换机上,允许主机在交换机之间进行智能路由。这些方法的变种已经在当代的各种数据中心中投入使用。

大型云供应商已越发趋向于定制数据中心内的一切,包括网络适配器、交换机、路由器、软件和网络协议。

Amazon提出了“可用区域”(availability zone)的可靠性概念:数据中心被复制到多个附近(约几千米范围内)的建筑中,并将数据在同一可靠区域内同步,使得容错率增加。

迄今为止,仍然不断有更多的创新被提出来。有兴趣的读者可以参阅关于数据中心网络设计的近期论文和视频。

6.7 学园都市的一天
到目前为止,Internet协议栈的基本内容已经学习完毕。下面,我们通过一个例子,来回顾所学的知识。

注:
1、以下内容可能与相关作品的设定存在出入。
2、所用IP地址和域名皆为虚构。

Andy是学园都市(学園都市,Hepburn:Gakuen Toshi,lit. Academy City)的一名学生,是风纪委员第177支部(ジャッジメント第一七七支部,Jajjimento Dai Ichi Nana Nana Shibu,Judgment 177 Branch Office)的新成员。一日,他在巡查过程中,发现较大范围的异常情况。支部讨论决定:立即大范围通报此异象,并要求学园都市及周边地区第一时间做好防范,必要时可大规模疏散人员至指定的避难所。

Andy将他的便携式计算机从休眠状态恢复运行,通过177支部内的以太网电缆,连接到支部的以太网交换机;交换机连接到某路由器,路由器连接到一个ISP。该ISP具有DNS服务器d7.dns4.gakuen-toshi.ac.jp与d7.dns6.gakuen-toshi.ac.jp,服务器为第七学区(第七学区,Dai Nana Gakku,School District 7)提供DNS服务,不属于177支部。此外,连接的路由器也作为DHCP服务器(这是比较常见的情况)指派IPv4地址;亦可通过DHCPv6指派IPv6地址。

当Andy的计算机刚刚连接到网络时,他还不能做任何事情(比如下载网页),因为计算机还没有IP地址。计算机按其默认设置自动获取

IPv6地址 2400:8500:1302:0909:0000:0000:0000:0408/64
IPv6 DNS服务器 2400:8500:1302:0909:0000:0000:0000:0114
IPv6默认网关 2400:8500:1302:0909:0000:0000:0000:0001
为了访问学园都市以外的IPv4网络,计算机也运行DHCP获取IPv4地址:
【1】操作系统创建一份DHCP请求报文,报文放在一个UDP段内,目标端口67,源端口68。UDP段放在IP数据报内,目标地址为255.255.255.255,源地址为0.0.0.0,因为计算机还没有IPv4地址。数据报将广播给同一子网中的所有主机。
【2】包含DHCP请求报文的IP数据报被放在链路层帧里,目标MAC地址为FF-FF-FF-FF-FF-FF,帧会被广播给交换机连接的所有主机;源地址则为计算机的适配器物理地址00-16-D3-23-68-8A。
【3】帧被发送到177支部的以太网交换机,交换机将帧广播给全部出端口,包括连接到路由器的端口。
【4】路由器的一个物理地址为00-22-6B-45-1F-1B的接口接收到了包含DHCP请求报文的以太网广播帧。路由器提取出数据报,数据报的目标IP地址表明:该IP数据包需要由本结点的上层协议处理。之后,路由器将数据报的数据段交给UDP(分用),DHCP请求报文从UDP段的数据部分中被提取出来。DHCP服务器成功收到请求。
【5】路由器运行的DHCP服务器能够通过CIDR分配地址块27.132.9.0/24,最终分配了27.132.9.100给Andy的计算机。DHCP服务器发回DHCP ACK报文,报文包含
IPv4地址 27.132.9.100/24
IPv4 DNS服务器地址 27.132.8.8
IPv4默认网关 27.132.9.1
DHCP报文放在UDP段中,封装进IP数据报,再打包进以太网帧。通过路由器的接口00-22-6B-45-1F-1B发回给Andy的计算机00-16-D3-23-68-8A。
【6】包含DHCP ACK的以太网帧从路由器发送给交换机。由于交换机是自学习的,原先已经接收过来自Andy的计算机00-16-D3-23-68-8A的以太网帧,交换表中具有相应的条目,因此,该帧会被直接转发到Andy的计算机。
【7】现在,包含DHCP ACK报文的以太网帧到达了Andy的计算机。帧中的IP数据报被提出来,其包含的UDP段交给UDP,然后从UDP段中提取出DHCP ACK报文。Andy的计算机记录了自己的IP地址和DNS服务器地址,并将默认网关写入自己的IP转发表。接下来,Andy的计算机将会把目标地址指向子网27.132.9.0/24外的全部IPv4数据报都送至指定的默认网关。这时,Andy的计算机已经可以访问IPv4网页了。注意,这里把DHCP工作步骤的前2步(DHCP服务器发现、DHCP服务器提供)的描述省略了。

下面,Andy有两个任务:
(1)在书库(書庫,Shoko (Banku),lit. "Archive")中,尝试检索可能与异常现象相关联的能力及能力者。
(2)将现场视频发布至Instagram。
Andy在浏览器的两个标签页(选项卡)中分别键入“shoko.gakuen-toshi.ac.jp”和“instagram”,于是,浏览器创建了TCP Socket,用于发送HTTPS请求。为了创建Socket,Andy的PC必须知道两个站点的IP地址。
【8】Andy的便携式计算机的操作系统创建两份DNS请求报文,将字符串“shoko.gakuen-toshi.ac.jp”和“instagram”分别放入到问题区域。而后,DNS报文被放入UDP段,目标端口为53。UDP段被封装进IP数据报,目标IP地址分别为2400:8500:1302:0909:0000:0000:0000:0114和27.132.8.8,源IP地址就是本机地址,分别为2400:8500:1302:0909:0000:0000:0000:0001和27.132.9.100。
【9】包含DNS请求的数据报被放置到以太网帧里,分别送往默认网关2400:8500:1302:0909:0000:0000:0000:0001与27.132.9.1。默认网关运行了双协议栈,这两个地址实际上均指向它。由于不知道网关的MAC地址,因此分别需要运行邻点发现协议(NDP)和地址解析协议(ARP)。这里只继续列出运行ARP的过程。
【10】ARP请求报文的目标IP地址是IPv4默认网关的地址27.132.9.1。报文被放入一帧以太网帧,目标地址为广播地址(FF-FF-FF-FF-FF-FF)。该以太网帧被发送至交换机。交换机将把此帧广播给全部连接的设备。
【11】网关路由器的一个接口收到了包含ARP请求报文的帧,发现报文的目标IP地址与该接口的IPv4地址相符。于是,网关路由器发送ARP应答,指出该接口的MAC地址为00-22-6B-45-1F-1B。它将ARP应答报文放入一帧以太网帧,目标MAC地址为Andy的便携式计算机的网卡MAC地址00-16-D3-23-68-8A,该帧被送往交换机,交换机将其发送给Andy的计算机。
【12】Andy的计算机接收到包含ARP应答报文的帧,提取出网关路由器的MAC地址00-22-6B-45-1F-1B。
【13】现在,Andy的计算机终于能使用网关路由器的MAC地址,将包含DNS请求的以太网帧发送到网关路由器了。该帧被交换机收到后,交换机便将其递呈给网关路由器。

【14】网关路由器收到了包含DNS请求报文的帧,提出IP数据报,发现目标地址是DNS服务器的地址2400:8500:1302:0909:0000:0000:0000:0114和27.132.8.8。路由器查找转发表,确定该数据报应当被发送到路由器R。于是,数据报被放入一个链路层帧,发送到直连路由器R的链路里。
【15】路由器R收到了帧,提出IP数据报,检查目标地址,根据转发表确定应当发送到的接口。转发表是通过域内路由协议OSPF与Internet域间协议BGP(边界网关协议)填充的。
【16】携带了DNS请求的IP数据报终于到达了较近的这两台本地DNS服务器。服务器提取出请求信息,分别按名称“shoko.gakuen-toshi.ac.jp”和“instagram”查找缓存的DNS数据库,找到了一条AAAA资源记录和一条A资源记录,请求站点的IP地址分别为2001:02E8:0642:0000:0002:0001:0000:0011和74.86.12.172。这些缓存数据自然是来源于两个站点的权威DNS服务器了。本地DNS服务器生成两份DNS应答报文,包含主机名到IP地址的映射。报文被放入UDP段,UDP段被放入IP数据报,目标IP地址指向Andy的计算机。DNS应答报文会被传回到默认网关,然后经过直连的以太网交换机,最终到达Andy的便携式计算机。
【17】Andy的计算机从DNS报文中提出两个站点的IP地址。现在,已经可以与两个站点发起通信。

【18】Andy的计算机又创建一个TCP Socket,将发送HTTP GET等报文到两个站点。创建TCP Socket时,必须与两个站点的TCP Socket分别进行三报文握手。首先创建的是TCP SYN报文段,目标端口为443(HTTPS)。段被放入IP数据报,目标IP地址指向两个站点。IP数据报被打包到目标MAC地址为网关路由器的一个接口(00-22-6B-45-1F-1B)的链路层帧中,被发送到交换机。
【19】包含TCP SYN的数据报仿照步骤【14】到【16】,被发往两个站点。
【20】数据报到达了两个站点。TCP SYN报文被提取出来,传送给端口443。一个连接Socket就在目标站点的服务器端创建了,另一端自然是Andy的计算机。目标站点服务器生成TCP SYNACK报文段,将其放入数据报,目标地址指向Andy的计算机,数据报也被封装进链路层帧,指向目标站点直连的第一跳路由器。
【21】包含TCP SYNACK报文段的IP数据包来到了Andy的计算机。数据报被呈递给步骤【18】创建的TCP Socket,使Socket进入连接状态。
【22】现在,Andy的计算机已经准备好向两个站点发送字节流。Andy的计算机创建带有GET、PUT和POST等方法的HTTP请求,请求报文包含需要访问的URL。请求报文经过TLS(SSL)的加密后,写入到Socket。加密的HTTP请求变成了TCP段的有效载荷。TCP段将被放入IP数据报,仿照步骤【18】到【20】,传输给目标站点。
【23】目标站点的服务器端解密从TCP Socket读取到的请求报文后,用需要的数据创建HTTP响应报文。同样地,HTTP响应经过加密,传递到TCP Socket。
【24】包含加密的HTTP相应的数据报最终到达了Andy的计算机。终于,解密后的HTTP响应内容里的HTML文档,在Andy的计算机上被浏览器解释并显示出来了。由于Andy每天都使用Google,因此Google通过Cookie记住了登录状态。但书库对安全性的要求很高,一般不允许保持登录,而是要求Andy进行身份验证,否则将只能在高度受限的情形下使用。

学园都市的官方Instagram同时开启了直播。很快,学园都市发生的大范围异常现象就以流媒体的形式向全世界播出了。为保证多媒体速率,学园都市针对媒体建立了CDN。这些CDN服务器不但分布在学园都市的众多数据中心,还部署于一些ISP和IXP。CDN利用DNS,截获访问指定媒体机构的DNS请求,以CDN服务器地址作为DNS响应。在直播过程中,直播的音频和视频被使用不同编码与不同码率进行编码。客户端通过查看服务器上的Manifest File,获得不同版本的视频信息,并根据网络拥堵情况自动或手动调整码率,也可以根据自己的计算机上的解码器安装情况选择不同的编码。很快,一些区域的服务器就接近满载。负载平衡器及时介入,将不同的流量尽量分散到不同的服务器,避免局部过载。

随着左耳一阵麻痹,整栋楼都颤动了。Andy一边捂着左耳,一边闪到了桌子底下。177支部内的几人都缩了起来,护着自己的头。现在明明是早上,但外面像是被绵延数千米的积雨云压着,光线被死死地捂住。所有建筑物内都有无数的小块亮着,声控灯和紧急灯被悉数打开。在刚刚停止哗啦作响的窗户的右上角,橘黄的余波正在消逝。大街上的人们趴的趴、躺的躺、龟缩的龟缩;但相同的是,他们都好像要把耳朵压得嵌进脑袋里。远处有几个被震得摔倒的警备机器人,它们正尝试重新站起来。这栋楼号称能抗击超过9级的大地震,但也在刚才的爆炸中显得开始要招架不住。
台式计算机响起了警报。Andy抢先来到台前,上面是内部的紧急广播。这台机所在的网络,在物理上是与外网隔离的。紧急广播通过多播发送给各支部。177支部的IPv6多播组标识符是FF02:02B4:7A2F:9527::1008。FF?2::/16地址块相当于IPv4的D类地址224.0.0.0/24,都是针对本地子网的多播地址,路由器不能将目标地址(填入多播组标识符)处于这些范围内的IP数据报路由到其它网络,只能将其多播给本网络的计算机。为了使紧急广播或紧急通信的内容能被听清楚,学园都市要求音频的量化位数不低于16位;并且,采样率不低于44.1 kHz,以便采集到语音的高频成分;同时,也对有损编码的参数作出了最低限制。
接到全体出动的命令后,大家就开始迅速收拾物品。Andy以极快的速率换上了运动服。为了把吓出来的尿排空,Andy往厕所跑去。路过的学生从不远处的厕所里听到一声尖叫。
177支部办公室内的全体风纪委员同时来到了楼下。Andy用望远镜看到了爆炸中心,周围至少100米都被夷为平地。热浪仍然在向自己扑过来。车辆的防盗警报乱成一团。街上的店铺大都锁了门,店员四散。从爆炸中刚刚缓过来的路人们,也开始疯狂地向远离爆心的方向挤过去。
(待续)

更多推荐

【2021-08-05 修订】【梳理】计算机网络:自顶向下方法 第六章 链路层和LAN(docx)

本文发布于:2023-04-15 23:37:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/ed7125592be8a593baafe74ed0395e84.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:第六章   计算机网络   链路层   方法   LAN

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 79569文章数
  • 66阅读数
  • 0评论数