其实世上本没有路,走的人多了,也就成了路。
主要了解链路层相关协议,理解链路层是如何工作的,目录如下:
5.1 链路层概述
了解几个术语:
- 结点(node):将运行链路层协议(即第二层协议)的任何设备均称为结点,包括主机、路由器、交换机和WiFI接入点。
- 链路(link):沿着通信路径链接相邻结点的通信信道成为链路。比如WiFi链路、以太网链路等。
- 链路层帧(Framing):通过特定链路传送的数据报,也就是链路层的分组,一般不同的链路形成的帧也不太一样。
一般一个主机向另一个主机发送数据报需要经过多段链路。
5.1.1 链路层提供的服务
链路层能够提供的可能服务包括:
- 成帧(framing):将网络层数据报进行封装成帧(添加头部和尾部,结构由链路层协议规定)。有多种不同的帧格式。
- 链路接入:媒体访问控制(Mediem Access Control, MAC)协议规定了帧在链路上传输的规则。对于单发送单接收的链路,MAC协议比较简单,比较复杂的是多结点共享的广播链路,即多路访问问题。MAC协议用于协调多个结点的帧传输。
- 可靠交付:当链路层提供可靠交付服务时(因为在低比特差错的链路中可能不用),它保证无差错地经链路层移动每个网络数据报,用于易产生高差错率的链路上。在本地(出错链路上)进行纠错,而不是端到端的数据重传。
- 差错检验和纠正:通过让发送结点在帧中包括差错检验比特,让接收结点进行差错检验。链路层的差错检验通常比运输层和网络层的差错检查更为复杂,并且通过硬件来实现。
5.1.2 链路层在何处实现
链路层在何处实现?在书上这一章节只对端系统中的链路层实现进行了解释,二在路由器和交换机的实现却未解释,但老师有在课上专门讲解,经过一些资料对二层交换机有所了解,也整理在下面。
端系统上的链路层协议
在端系统上,链路层的主体部分是在网络适配器(network adapter)中实现的,网络适配器有时也被成为网络接口卡(Network Interface Card,NIC),位于网络适配器核心的是链路层控制器(还有一部分负责物理传输),该控制器通常是一个实现了许多链路层服务的专用芯片。见下图:
在主机中的结构:
从图中可以看到链路层分为了两部分,一部分是在硬件NIC部分实现的,另一部分在CPU中的软件实现,负责比较高级的链路层功能。
关于控制器的功能:在发送端,控制器取得了由协议栈较高层生成并存储在主机内存中的数据报,在链路层帧中封装该数据报,然后遵循链路接入协议将该帧传进通信链路中。在接收端,控制器接受了整个帧,抽取出网络层数据包。如果链路层执行差错检测,则需要发送控制器在该帧的首部设置差错检测比特,由接收控制器执行差错检测。
关于高层链路层功能:链路层的软件组件实现了高层链路层功能,如组装链路层寻址信息和激活控制器硬件。在接收端,链路层软件影响控制器中断,处理差错条件和将数据报向上传递给网络层。
总之,链路层是硬件和软件的结合体,即是协议栈中软硬件交接的地方。
二层交换机
以下内容参考链路层设备和二层交换机,复习时若觉得未讲述清楚可以参考这两个网址。
- MAC地址:每一个NIC上都有一个唯一的编码来标识,称为MAC地址,MAC地址是固化在NIC上的,一般不可改变,长度一般为48位,用12位16进制数来表示。
- 集线器(Hub):物理层设备,拥有多个端口,与其他物理层设备(比如电缆、光纤)的功能是一样的,直接连接主机,但Hub是同时将多个主机连接在一起,实行广播发送。即一个连接的主机发送了数据报,Hub会进行放大并发送给所有连接的端口。
- 网段:被同一物理层设备所连接的主机一般说是位于同一个网段。
网桥(Bridge):早期的两端口二层网络设备,用来连接不同网段的设备,可以同时隔离冲突域,因为它的两个端口不是共享一条总显得,比当时的Hub性能更好。后来被拥有更多端口同时也能隔离冲突域的交换机所取代。网桥的功能原理图如下:
同一个网段中是通过物理层设备(这里是Hub)连接的,Hub的一个端口与网桥的一个端口连接,物理层设备会将数据报进行广播,当网桥接收到数据报的时候会进行如下工作:
- 把数据包的源MAC地址和目的MAC地址与站表(缓存)中保存的MAC地址进行比较。
- 如果发现这两个MAC地址同属于一个网段,则网桥不会把该帧转发到下一个接口,即网段上的主机会直接丢弃数据帧。起到了隔离冲突域(即防止与另一个网段中的数据发生碰撞)的作用。
- 如果发现这两个MAC地址属于不同网段,则网桥就会把该帧转发到下一个端口,再通过集线器以复制的方式广播到网段2的所有主机以让目的MAC的主机收到数据帧。
- 如果缓存表中没有这两个对应的MAC地址,它会进行学习。
二层交换机:交换机可以说是集线器和网桥的升级换代产品,它既具有集线器一样的集中连接功能,又具有网桥的数据交换功能,所以交换机被成为多端口的网桥,其实也可以称作是带有交换功能的集线器。它的工作过程如下:
- 当交换机从某个端口接收到数据包,它先读取源MAC地址,从而知道它所连接的端口。
- 再去读取目的MAC地址,并在地址表中查找到相应的端口。
- 如果表中有与目的地址对应的端口,直接把数据包复制到该端口上。
如果表中找不到对应的端口,则把数据包广播到所有端口,当目的机器对源机器回应时,交换机又可以学习目的MAC地址与哪个端口对应,在下次传送数据时不再需要对所有端口进行广播。
我们可以看到它相比于网桥和集线器多了这几个优点:
具有多个交换接口,不仅每个接口可以连接一个不同的网段,还可以有大量的端口来集中连接主机,这样就同时担任了集线器和网桥的双重功能。
- 数据转发率提高了,集线器是使用广播方式发送数据,交换机是直接发送到目的MAC地址的端口。
- 更强的MAC地址自动学习能力,交换机的缓存也比网桥的大,适用于较大的网络。
5.2 差错检测和纠正技术
- 比特级差错检测和纠正:对从一个结点发送到另一个物理连接上的临近结点的链路层帧中的比特损伤进行检测和纠正。
- 差错检测和纠正比特(Error-Detection and Correction, EDC):用来增强数据D。通常要保护的数据不仅包括从网络层传递下来的数据报,也包括链路层帧首部的链路级寻址信息、序号和其他字段。
- 未检出比特差错(undetected bit error):差错检测和纠正技术并不总能找出比特差错。我们的差错检测方案只能尽可能地使这种事件的概率降低。一般而言,差错检测和纠正技术越复杂,则未检测出比特差错概率越小,导致的开销也就越大(需要更多的计算量和更多的差错检测和纠正比特)。
5.2.1 奇偶校验
奇偶校验准确来说是两种方式,奇校验方案和偶校验方案。在偶校验方案中,发送方只需要包含一个附加的比特,选择它的值,使得整个数据包含有偶数个1。奇校验方案则是包含奇数个1。
以偶校验方案为例,如果接收方检测到了奇数个1,则说明至少出现了一个比特差错,或者说出现了奇数个比特差错。若出现了偶数个比特差错,则该方案就检测不出错误。
如果一个分组中的比特差错是独立发生,互不相关的,则多个比特同时出错的概率是非常低的,但在实际情况中,比特出错往往是突发的,奇偶校验保护的一帧未检测出差错的概率高达50%。因此在实践中,我们会使用更高级的方法。
在研究其他差错检测方案之前,先继续考虑单比特奇偶校验方案的一个简单的二维一般化方案。二维奇偶校验把数据D的d个比特位划分为i行j列。对每行每列计算奇偶值,产生的 i+j+1 奇偶比特构成了链路层帧的差错检测比特,当出现一位差错的时候,会有2个校验位出错,从而能定位到具体是哪一位出错,进行纠错。如下图:
前向纠错(Forward Error Correction,FEC):接收方检测和纠正差错的能力被称为前向纠错。通常用于如音频CD这样的音频存储和回放设备。FEC技术价值在于它们可以减少所需的发送方重发的次数。
5.2.2 检验和方法
检验和技术:将d位比特数据作为一个k比特整数的序列处理,然后将这些k比特整数加起来。RFC 1070 中提供的因特网检验和(Internet checksum)的C程序:
1 | unsigned short csum(unsigned char *buffer, int count) |
核心思路是把数据的每组相邻字节对作为一个16位比特整数,进行相加得到16位结果(若有溢出则把进位在加到低位,迭代到没有溢出为止,即进位为0),将16位结果取反,并赋给检验和位。接收方收到帧后将数据和检验和位拿出来再进行上述求和过程,结果如果不是全 1(一个数和反码相加肯定得到的是全 1)则说明有差错。
在实际中,检验和方法常用于运输层(因为运输层差错检测就是用软件实现的,检验和用软件实现比较简单和方便),而链路层常用的是下述的CRC。
5.2.3 循环冗余检测
循环冗余检测编码(Cyclic Redundancy Check, CRC)也成为多项式编码,它的核心步骤如下:
- 发送方和接收方首先必须协商一个 r+1 比特模式,称为生成多项式(generator),将其表示为G(除数),要求G的最高有效位为1。
- 对一个给定的数据段D,发送方要选择r个附加比特R,将它附加到D上,得到了 d+r 比特模式。使得这 d+r 位的比特数字能被 G 整除。(使用模2算术)
解释一下模2算术:计算时不考虑进位和借位,如此下来加法和减法便是一样的,且与异或相同。
R的计算方式如下:
必须注意一点:上面的运算是模2运算,你可以仔细看上面每一步相减的过程都是异或,也就是不借位的减法。
5.3 多路访问链路和协议
有两种类型的网络链路:
- 点对点链路(point-to-point link):由链路一端的单发送方和另一端的单接收方组成。为该链路设计的协议如点对点协议(PPP)和高级数据链路控制(HDLC)。
- 广播链路(broadcast link):让多个发送方和接收方都连接到相同的、单一的、共享的广播信道上。当任何一个结点传输一个帧时,信道广播该帧,其他每个结点都会收到一个副本。以太网和无线局域网就是这样的例子。
从而引出以下几个概念:
- 多路访问问题(multiple access problem):如何协调多个发送和接收结点对一个共享广播信道的访问。
- 多路访问协议(multiple access protocol):结点通过这些协议来规范它们在共享的广播信道上的传输行为。
- 碰撞(collide):多个结点可能会同时传输帧,则接收方同时收到多个帧,称之为碰撞。通常碰撞发生时,没有一个接收结点能有效地获取任何传输的帧,因为碰撞帧的信号纠缠在一起,如果碰撞频繁发生的话,广播信道的大量宽带将被浪费掉。
- 任何多路访问协议都能划分为一下3种类型之一:
- 信道划分协议(channel partitioning protocol)。
- 随机接入协议(random access protocol)。
- 轮流协议(taking-turns protocol)。
- 多路访问协议应具有的特性:
- 当仅有一个结点发送数据时,该结点具有 R bps的吞吐量。
- 当有M个结点要发送数据是,每个结点吞吐量稳 R/M bps(平均而不强求是瞬时速率)。
- 协议是分散的,不会因为某主结点的故障而使整个系统崩溃。
- 协议是简单的,使实现不昂贵。
5.3.1 信道划分协议
协议对每个接入的结点分配某种资源,来实现将信道划分。书上主要涉及三种技术:TDM、FDM以及CDMA。
时分多路复用(TDM)
TDM将时间划分为时间帧(time frame),并将时间帧进一步划分为N个时隙(slot)。对于信道所连接的N个结点,每一结点都对应着一个时隙,即结点只有在轮到自己的时隙的时候才能发送数据。
优点是每个节点在每个帧时间内得到了专用的传输速率 R/N bps。缺陷是结点被限制于 R/N bps的平均速率,即使它是当前帧内唯一有分组发送的结点,该情况下信道的大部分时间都处于空闲状态,浪费了带宽。
频分多路复用(FDM)
FDM将 R bps信道划分为不同频段(每个频段具有 R/N bps带宽),并把每个频率分配给N个结点中的一个,所有结点可以同时传输分组。
优点是它避免了碰撞,在N个结点之间公平地划分了带宽,但缺点也和TDM相同,结点被限制于 R/N bps的平均速率。
码分多址(CDMA)
CDMA对每个结点分配一种不同的编码,然后每个结点用它唯一的编码来对数据进行编码。不同的结点能够进行同时发送数据,并且它们各自对应的接收方仍能正确地接收发送方编码的数据比特。而不在乎其他节点的干扰传输。
5.3.2 随机接入协议
在随机接入协议中,一个传输结点总是以信道的全部速率进行发送,当有碰撞时,涉及到碰撞的每个节点反复地重发它的帧,到该帧无碰撞的通过为止。但是当一个结点经历碰撞时,它不必立刻重发该帧,而是在重发该帧之前等待一个随机时延。随机接入协议有几十种,这里挑选简单的三个协议。
时隙ALOHA
在时隙ALOHA协议中,我们先做以下假设:
- 所有帧由 L 比特组成。
- 时间被划分成长度为 L/R 秒的时隙(即一个时隙等于传输一帧的时间)。
- 结点只在时隙起点开始传输帧。
- 结点是同步的,每个结点都知道时隙何时开始(要求每个结点有相同时钟)。
- 如果在一个时隙中有两个或多个帧发生碰撞,则所有结点在该时隙结束之前检测到该碰撞事件。
设p是一个概率。在每个结点中的时隙ALOHA操作是这样的:
- 当结点有一个新帧要发送,它等到下一个时隙开始并在该时隙传输整个帧。
- 如果没有碰撞,该结点成功传输它的帧,不需要考虑重传该帧。
- 如果有碰撞,该结点在时隙结束之前检测到这次碰撞。该结点以概率p在后续的每个时隙中重传它的帧,直到该帧被无碰撞地传输出去。
显然当某个结点是唯一活跃的结点时,时隙ALOHA允许该结点以全速率传输该帧。当有多个活跃结点时,它的效率是多少呢?首先定义效率:当有大量的活跃结点且每个节点总有大量的帧要发送时,长期运行中成功时隙的份额。如下图:
在第4、8、9时隙中成功发送了帧,所以效率为1/3。现在继续讨论时隙ALOHA最大效率,假设每个结点是如在每个时隙以概率p传输一帧(所有p相同),假设有N个结点,则任意一个结点成功传输的概率是Np(1-p)^(N-1)
,经过求导可知当p=1/N
时该概率有最大值,当N趋于无穷大的时候,这个概率的极限是1/e=0.37
,也就是如果有大量结点要传输数据时,有效的时隙仅有37%。故该信道的有效传输速率不是 R bps,而是 0.37R bps。
ALOHA
在纯ALOHA中,没有时隙的概念,即成帧后结点会立马传输该帧进入广播信道,如果发生了碰撞就立马(在完全传输完它的碰撞帧后)以概率p重传该帧,或者以概率1-p等待一个帧传输时间,然后重复该操作至无碰撞发送该帧为止。
关于纯ALOHA的最大效率推导过程这里不再叙述,可以参考书上的这部分内容,但结果需要知道,纯ALOHA的最大效率仅为1/(2e)
,刚好是时隙ALOHA的一半。
载波侦听多路访问(CSMA)
在时隙和纯ALOHA中,一个结点传输帧时是不会关心是否别的结点也在恰好传输帧,而且即使是碰撞了也不会停止传输帧。因此有了这两种规则:
- 载波侦听:一个结点在传输钱先听信道,如果有来自另一个节点的帧正在向信道上发送,则结点等待知道检测到一小段时间没有传输,然后开始传输。
- 碰撞检测:一个传输结点在传输时也在监听信道,如果检测到其他结点正在传输干扰帧,它就停止传输,再次回到载波监听的循环中。
只包含前者的就是载波侦听多路访问(Carrier Sense Multiple Access, CSMA),包含这两者的就是具有碰撞检测的CSMA(CSMA with Collision Detection, CSMA/CD)。
理论上有了第一条载波侦听规则时,应该不会有碰撞了(因为是等到空闲再发送帧),为什么还会有碰撞检测呢?这是因为有信道传播时延(channel propagation delay),即信号从一个结点传播到另一个结点所花费的时间。见如下时空图:
B侦听到此时信道处于空闲,于是先发送了一个帧,但由于有信道传播时延,所以D在t1时刻并不知道B已经发送了帧,所以它也开始发送帧,其结果就是两帧碰撞。
具有碰撞检测的载波侦听多路访问(CSMA/CD)
上面那张图中我们看到即使B、D已经知道发生碰撞了(在重合的时刻),但他们依旧不会停止发送帧。如果加上了碰撞检测,也就是CSMA/CD,则时空图应该是下面这个样子:
总结与广波信道相连的NIC的运行:
- NIC从网络层获得一条数据报,准备链路层帧,并将其放入帧适配器缓存中。
- 若果NIC侦听到新到空闲(即无信号能量从信道进入NIC),它开始传输帧。若侦听到信道在忙,它则等待,直到侦听到无信号能量时开始传输帧。
- 传输过程中,NIC监听来自其他使用该广播信道的NIC的信号能量。
- 如果NIC传输整个帧而未检测到来自其他NIC的信号能量,该适配器就完成了该帧。另一方面,若果传输时侦测到其他NIC的信号能量,则终止传输。
- 终止传输后,NIC等待一个随机时间量,然后返回步骤2。
等待随机时间量是必须的,因为如果等待时间量固定,那么碰撞双方等待相同时间后继续传输帧依然会碰撞。我们希望的等待时间间隔应该是这样的:当碰撞结点数量较少时,时间间隔较短,当碰撞结点数量较大时,时间间隔较长。下面介绍一种用于以太网及DOCSIS电缆网络多路访问协议中的简单的算法:
二进制指数后退算法(binary exponential backoff):当传输一个给定帧时,在该帧经历了一连串n次碰撞后,结点随机从 {0, 1, 2, …, 2^n-1} 中选择一个K值,因此,一个帧经历的碰撞次数越多,K选择的间隔越大。对于以太网,一个结点的等待的实际时间量是K*512比特时间(发送512比特所需时间的K倍),n取得最大值在10以内。
CSMA/CD效率
CSMA/CD效率:当有大量活跃结点,且每个结点有大量的帧要发送时,帧在信道中无碰撞传输的那部分时间在长期运行时间中所占的份额。
这里省略推导过程,只给出CSMA/CD效率的近似式,其中d(prop)表示信号能量在任意两个NIC间传输的最大时间(即侦听到信号能量所需的时间),d(trans)表示传输一个最大长度的以太网帧的时间:
从公式中可看到,当d(prop)接近0时(即侦听到信号能量的时间非常短),则效率趋近于1,符合我们的直觉。当d(trans)很大时,效率也接近与1(一个结点长时间占有信道,信道的效率当然非常高),同样符合直觉。
5.3.3 轮流协议
轮流协议(taking-turns protocol)是一种想满足当有M个活跃结点时,每个活跃结点的吞吐量接近 R/M bps。有几十种轮流协议,这里主要讨论重要的两种。
轮询协议(polling protocol)
该协议要求这些结点之一要被指定为主节点。主结点以循环的方式轮询(poll)每个节点。主节点首先向结点1发送一个报文,告诉他能够传输的帧的最大数量。在结点1传输了某些帧后,主结点告诉结点2它能够传输的帧的最大数量(主结点能够通过观察在信道上是否缺乏信号,来决定一个结点何时完成帧的发送)。
- 优点:消除了困扰随机接入协议的碰撞和空时隙。
- 缺点:主结点通知其他节点所需要的轮询时延,以及如果主结点出现故障,则整个信道不可操作。
令牌传递协议(token-passing protocol)
该协议中没有主结点,一个称为令牌(token)的小的特殊帧在结点之间以某种固定的次序进行交换,例如环形。当一个结点收到令牌的时候,如果它有帧要传输,它就发送最大数目的帧数,然后再向下一个结点传递令牌;否则它立即传递令牌。
- 优点:分散、高效。
- 缺点:一个结点故障可能会引起整个信道崩溃。如果一个结点偶然忘记释放令牌,则必须调用某些恢复步骤使令牌返回到循环中来。
5.3.4 DOCSIS:用于电缆因特网接入的链路层协议
在1.2.1 节讲过一个电缆接入网通常在电缆网头端将几千个住宅电缆调制解调器与一个电缆调制解调器端接系统(CMTS)连接。数据经电缆服务接口(Data-Over-Cable Service Interface, CMTS)规范(DOCSIS)定义了电缆数据网络体系结构及其协议。
DOCSIS使用FDM将下行(CMTS到调制解调器,图中向右的箭头)和上行(调制解调器到CMTS,图中向左的箭头)网络段划分为多个频率信道。每个上行和下行信道均为广播信道(因为连着很多住宅)。CMTS在下行信道中传输的帧被所有在信道上做接受的电缆调制解调器接收到,然而因为发送方只有CMTS,故在下行信道中不存在多路访问问题。
而在上行信道中,每一个频段都有多个电缆调制解调器共享,所以不可避免的会产生碰撞。DOCSIS采取的方案是将上行信道划分为多个时间间隔(类似于TDM,但不固定),每个时间间隔包含一序列微时隙,电缆调制解调器可在微时隙中向CMTS传输帧。CMTS显式地准许各个电缆调制解调器在特定的微时隙中进行传输。
CMTS在下行信道上通过发送称为MAP报文的控制报文,指定哪个电缆调制解调器(带有要发送的数据)能够在哪个微时隙中传输,通过这种明确分配从而避免了碰撞。
但CMTS如何知道哪个电缆调制解调器有数据要发送?通过让电缆调制解调器在专用于此目的的一组特殊微时隙间隔内(在图中的第一个时间区间),向CMTS发送微时隙请求帧来完成该任务。微时隙请求帧以随机接入方式传输,且无法检测碰撞,但如果在下一个下行控制报文中没有收到对请求的响应,电缆调制解调器就会推断出上一个请求帧发生了碰撞,然后使用二进制指数回退将其微时隙请求帧延缓发送。
因此电缆接入网应用了多种多路访问协议(即FDM、TDM、随即介入和集中分配时隙)。
5.4 交换局域网
这一部分主要学习关于链路层寻址、交换机局域网、著名的以太网协议,然后了解链路层交换机的工作方式,以及考察如何用交换机构建大规模的局域网。
5.4.1 链路层寻址和ARP
网络层中的主机和路由器具有网络层地址(IP地址),同样在链路层中也具有链路层地址。
MAC地址
链路层地址有各种不同的称呼:LAN地址(LAN address)、物理地址(physical address)或MAC地址(MAC address),因为MAC地址比较流行,所以通常都会将链路层地址称为MAC地址。
值得注意的是,并不是主机或路由器具有MAC地址,而是他们的NIC具有MAC地址,一个主机可以有多个MAC地址(比如同时拥有有线网卡和无线网卡的手机)。另外值得强调的一点是,通常来讲,交换机不具备MAC地址,只是它们的接口可能与具备MAC地址的主机相关联,这是因为交换机的任务就是负责主机与路由器之间承载数据报,交换机会透明地执行该任务,即主机和路由器不必明确地将帧寻址到其间的交换机。
MAC地址长度为6字节,共有2^48个可能的MAC地址。通常采用16进制表示法,如图所示。每一个MAC地址都是独一无二的,因为是IEEE在管理着MAC地址空间,分配方式是固定一个MAC地址的前24比特,让生产NIC的公司自己分配后24位来构成独一无二的组合。
MAC地址具有扁平结构(与层次结构相对),即无论具备这个适配器的主机物理位置是否改变,MAC地址都不会变(IP地址会发生变化)。
MAC地址在链路层中的应用:当一个适配器想发送数据给另一个适配器的时候,它会在从网络层下来的数据报的首部添加目的MAC地址来形成帧,并把该帧发送到局域网上。交换机接收到该帧会查看它的目的MAC地址是否与它的某个端口对应,如果对应发送给那个端口,否则就广播(即复制给所有端口)。所以当一个适配器接收到一个帧时,它会先检查这个帧的目的MAC地址是否与自己的MAC地址相同,若相同则取出数据包向上提交给网络层,否则就丢弃该帧。
但有的时候某适配器确实想广播它的帧,这时候它的目的地址应该为全1,即FF-FF-FF-FF-FF-FF
。
地址解析协议(ARP)
地址解析协议(Address Resolution Protocol, ARP):根据IP地址获取MAC地址的协议。
以下图为例:
加入IP地址为222.222.222.200
的主机C想向IP地址为222.222.222.222
的主机A(注意它们在同一个子网中)发送数据报,为了发送数据报,源主机不仅要给NIC提供IP数据报,而且要提供目的主机的MAC地址。源主机会向它的APR模块输入目的主机的IP地址,希望能得到目的主机的MAC地址。
如果ARP模块返回了目的主机的MAC地址,事情就很简单了,源主机会把目的主机的MAC地址加到帧中,然后发送到局域网上。这里需要说明一点,APR只为在同一个子网上的主机和路由器接口解析IP地址。
ARP模块是如何工作的:每台主机或路由器在其内存中具有一个ARP表,这张表包含IP地址到MAC地址的映射关系,也包含一个寿命值(TTL),指示从表中删除这个映射的时间。一般来说一个表项通常的过期时间是20分钟(和CPU中的缓存有点类似)。
上面说了,如果ARP表上有想查找的IP地址的表项,那么任务就很简单了。但如果表中没有这个表项呢?此时发送方会构造一个ARP分组,一个ARP分组有几个字段,包括发送和接收方的IP地址,以及发送方的MAC地址,该分组的目的MAC地址是FF-FF-FF-FF-FF-FF
,即该帧会广播给所有子网中的主机。
每个收到该帧的主机都会检查其目的IP地址是否与它自己的相匹配,如果匹配它会单播回给查询主机自己的MAC地址来更新对方的ARP表。当查询主机收到响应ARP分组后,会更新它的ARP表,并发送它的数据报。
需要注意两点:
- 查询ARP报文是广播,响应ARP报文是单播。(可能处于安全考虑,也可能是广播会带来什么不好的东西?)
- ARP是即插即用的,ARP表可以自动建立而不需要系统管理员来配置。并且如果某主机与子网断开连接,它的表项最终会从留在子网中的结点的表中删除。
ARP协议可以认为是链路层协议(因为一个ARP分组封装在链路层帧中),也可以认为是跨越链路层和网络层的协议。
发送数据报到子网以外
上面解释了子网内部的发送和接收数据报的过程,现在再来讨论跨越子网发送和接收数据报的情况。见下图:
我们可以看到每一个主机都有一个IP地址和MAC地址,而路由器的每一个端口都有一个NIC,图中路由器有两个端口,所以它有两个IP地址、两个ARP模块和两个NIC。
假设现在IP地址为111.111.111.111/24
的主机(左上角)想向IP地址为222.222.222.222/24
的主机(右下角)发送数据报。那么对于发送方的主机,在填写目的MAC地址的时候需要填的当然是路由器的MAC地址(首先它不会知道目的主机的MAC地址,其次就算它知道了目的MAC地址,如果放到帧里面,也走不到路由器的网络层,自然也进不了另一个子网)。
为什么知道要填写路由器的MAC地址?因为发送端的NIC只要对比一下自己的和目的的IP地址的网络号就知道是不是同一个子网。怎么得到到路由器的MAC地址?仔细看路由器和这个子网的交换机所连接的端口的IP地址,这个端口就属于这个子网!那么很自然的就是ARP模块来处理了。
现在数据报来到了路由器的家门口,路由器一看这帧的目的MAC地址是自己,直接取出里面的数据报上交给网络层处理。网络层的东西就不是这章的主要内容了,到了网络层后通过查询路由器中的转发表来找到目的主机所在的子网对应的端口,然后路由器把数据报丢给这个端口的NIC,NIC再次通过它的ARP模块找到目的主机的MAC地址把数据报发过去,整个过程就结束了!
5.4.2 以太网
以太网一直占领者现有的有线局域网市场。20世纪70年代中期,初始的以太网使用同轴电缆总线来互联结点,使用总线拓扑的以太网是一种广播局域网,即所有传输的帧传送到与该总线连接的所有适配器并被处理,采取之前的具有二进制指数回退的CSMA/CD多路访问协议。下图是总线拓扑:
到了20世纪90年代后期,大多数公司和大学使用一种基于集线器的星型拓扑以太网安装替代了它们的局域网。在这种安装中,主机(和路由器)直接用双绞对铜线与一台集线器相连。集线器(hub)是一种物理层设备,当一个比特0或1到达它的一个接口是,它会重新生成这个比特并将其放大,向所有其他端口传输出去。如果集线器同时从两个端口接收到了信号,将出现一次碰撞,生成该碰撞帧的结点必须重新传输该帧。由此可见,这种以太网也是广播局域网。以下是星型拓扑:
在21世纪早期,以太网又经历了一次重要的革命性变化,以太网仍旧使用星型拓扑,但集线器被交换机(switch)所替代。交换机不仅是“无碰撞的”,而且也是名副其实的存储转发分组交换机。
以太网帧结构
考虑以太局域网中的一台主机向另一台主机发送IP数据报,发送适配器接收到网络层传递下来的IP数据报(事实上也可以是其他网络层分组),会添加以下内容构成以太网帧:
- 数据字段(data,46~1500 Bytes):这个字段承载了IP数据报。以太网的最大传输单元(MTU)是1500字节,如果超过了则主机必须将数据报分片。如果少于46字节必须要填充到46字节,接收方的网络层会根据IP数据报首部的长度字段来去除填充部分。
- 目的地址(dest. address, 6 Bytes):包含目的适配器的MAC地址。当接收适配器收到一个以太网帧,如果是和自己的MAC地址相同或是MAC广播地址,就会取出数据段并交给网络层;否则丢弃该帧。
- 源地址(source address, 6 Bytes):包含了传输该帧到局域网上的适配器的MAC地址。
- 类型字段(type, 2 Bytes):类型字段允许以太网复用多种网络层协议。当接收方适配器收到该帧,会根据类型字段来把数据字段进行分解,传递给相应的网络层协议。
- CRC(4 Bytes):如同5.2.3节讨论的那样,目的是进行差错检测和纠正。
- 前同步码(preamble, 8 Bytes):以太网帧以一个8字节的前同步码字段开始,该前同步码的前7个字节都是
10101010
,最后一个字节是10101011
,用于“唤醒”接收适配器,并且将它们的时钟和发送方的时钟同步。
所有的以太网技术都向网络层提供无连接服务,即它不需要“握手”(事先建立连接)。同时以太网技术都向网络层提供不可靠服务(unreliable service),特别是当接收方适配器对执行CRC校验时,如果通过了则向网络层上交该数据报,否则就丢弃,但无论如何它都不会告诉接收方。在链路层缺乏可靠的传输有助于使得以太网简单和便宜。但也意味着传递到网络层的数据报流能够有间隙。
以太网技术
以太网技术在这么多年的发展中已经被IEEE 802.3 CSMA/CD(Ethernet) 工作组进行了标准化 [IEEE 802.3 2012] 。形如10BASE-T
、10BASE-2
、100BASE-T
、1000BASE-LX
和10GBASE-T
这些首字母缩写词,它们都是一些以太网标准,第一部分的数字指该标准的速率:10、100、1000或10G,分别代表10Mbps、100Mbps、1000Mbps和10Gbps以太网。BASE
指基带以太网,意味着物理媒体仅承载以太网流量。缩写的最后一部分指物理媒体本身,如T
指双绞铜线。
转发器(repeater):一种物理层设备,在输入端接收信号并在输出端再生成该信号(防止信号因为物理媒体过长衰弱)。
5.4.3 链路层交换机
交换机的任务是接收入链路层帧并将它们转发到出链路(路由器也是转发,不过交换机是根据MAC地址转发,路由器是根据IP地址)。交换机自身对子网中的主机和路由器是透明的(transparent),即主机或路由器向其他主机或路由器发送帧的时候,并不知道这其中的交换机是否参与进来,交换机对它们来说和物理链路没什么区别,不需要知道有关交换机的任何信息。
交换机转发和过滤
- 过滤(filter):决定一个帧应该转发到某接口还是丢弃的交换机功能。
- 转发(forwarding):决定一个帧应该被导向哪个接口。
- 交换机的工作过程:当接收到一个帧时,如果目的MAC地址是
FF-FF-FF-FF-FF-FF
,则进行广播,否则交换机检查自己的转发表,有以下几种情况:- 表中没有这个表项,先更新接收这个帧的接口的表项,然后广播该帧。
- 表中有这个表项,但接收到的接口与表项中的接口相同(交换机会认为这两个MAC地址是同一网段),交换机会丢弃这个帧(过滤)。
- 表中有这个表项,且接收到的接口与表项中的接口不同(交换机会认为这两个MAC地址是不同网段),交换机将该帧转发到出链路的接口。
自学习
交换机具备自学习能力,即它的转发表一开始并不具有某些表项,它会通过学习来添加表项,具体过程如下:
- 交换机表初始为空。
- 对于每个接口接收到的每个入帧,交换机在表中存储一条表项:(1). 在该帧源地址字段中的MAC地址。(2). 该帧到达的接口。(3). 当前时间。
- 如果在一段时间(称为老化期(aging time))后,交换机没有接收到以该地址作为源地址的帧(注意不是目的地址),就在表中删除这个地址。如果一台PC被另一台PC(不同NIC)替代,原来PC的MAC地址将最终从该交换机表中被清除掉。
由此可见,交换机是即插即用设备(plug-and-play device),因为它们不需要网络管理员或用户的干预。
链路层交换机的性质
- 消除碰撞:在使用交换机(替代了集线器)构建的局域网,没有因为碰撞而浪费的带宽。交换机缓存帧绝不会再网段上同时传输多于一个帧。
- 异质的链路:交换机将链路彼此隔离。
- 管理:除了提供强化的安全性,交换机也易于网络管理。例如一个适配器工作异常并且持续发送以太网帧,交换机能检测到该问题并在内部断开异常适配器。
交换机和路由器比较
二者之间的根本不同:交换机是二层网络设备(当然现在有三层交换机)转发基于MAC地址;路由器是三层网络设备,转发基于IP地址。
- 交换机:
- 优点:即插即用,具有相对高的分组过滤和转发速率(因为它只有两层,当然比要处理第三层的路由器快)。
- 缺点:为了防止广播帧的循环(广播风暴),交换网络的活跃拓扑限制为一棵生成树。而且交换机对网络风暴不提供任何保护措施,如果某主机除了故障并传输出没完没了的以太网广播帧,该交换机将转发所有这些帧,使得整个以太网崩溃。
- 路由器:
- 优点:分组不会通过路由器循环(因为网络寻址是分层的),所以路由器没有生成树限制,所以它们允许以丰富的拓扑结构构建因特网。路由器对第二层的广播风暴提供了风火墙保护。
- 缺点:不是即插即用,需要人对路由器以及连接它的主机进行配置IP地址。处理分组的时间会比较长(相对交换机)。
5.4.4 虚拟局域网
虚拟(virtual)一词,含义是不符合或不一定符合实际的东西,或者说是仿真的一些技术或手段。我们在很多地方都用到这个词,这个词就像抽象一样,在计算机领域中广泛应用。例如虚拟内存,虚拟存储器等等,它们都是利用一些技术来将对硬件的操作和逻辑分离,对处于高层的人只需要知道硬件应该执行什么样的逻辑,至于硬件如何实现这个逻辑对高层来说是无所谓的,从而弥补直接对硬件配置和使用的不方便之处。虚拟局域网也是如此。
以上面那张图为例,有三个工作组的局域网(子网,具有不同网络号),每个局域网的交换机和一个中心交换机相连,与此同时中心交换机还连接着两台服务器和连接到外网的路由器。我们前面讨论的局域网中有一些缺点,总结下来为以下三点:
- 缺乏流量隔离:尽管等级结构把一个组的流量局域化到一个单一交换机中,但广播流量仍然会跨越整个机构网络。有时出于安全/隐私目的可能希望限制局域网的广播流量,比如可能只希望在组局域网内部广播(不过这个可以简单的把中心交换机替换为路由器,后面会看到也能只通过第二层就解决)。
- 交换机的无效使用:如果该机构不仅有3个组,而又10个组,则要求有10个第一级交换机,如果每个组都比较小,比如少于10台主机,则单台96端口(16线)就可以容纳每个人,