《计算机网络 自顶向下方法》笔记:第六章 链路层和局域网
🚥计算机网络 自顶向下方法 系列文章导航🚥
一、引论和服务
1.网络节点的连接方式
WAN(广域网)一般采用点到点的链路连接,因为距离较远,带宽大,采用多点连接方式一旦出现碰撞代价过大。
LAN(局域网)一般采用多点连接方式,节点只需要连接到共享型介质上,就可以实现与其他所有节点的互通,但多个节点同时尝试发送数据时,可能会产生数据碰撞。
点到点的链路的链路层服务实现很简单,只是单纯的封装和解封装;多点连接方式网络的链路层功能较为复杂,需要考虑多点接入(协调各节点对共享型介质的访问和使用)、竞争方式(发生冲突之后的协调)、令牌方式(令牌的产生、占有和释放。这里的令牌是一种特殊的数据包,用于控制网络设备访问共享通信介质的一种机制,只有持有令牌的结点才被允许发送数据)等问题。
在后面的内容中,我们统一规定:
-
运行链路层协议的任何设备都称为节点(node),如主机、路由器、交换机和WiFi接入点等。
-
沿通信路径连接相邻节点的通信信道称为链路(link),可以是有线链路、无线链路、局域网(共享型链路)。
-
在通过特定的链路时,传输节点将数据报封装在链路层帧中,并将该帧传送到链路中。
2.链路层提供的服务
如果说网络层解决的是端到端(主机到主机)的问题,那么链路层解决的是则点到点的问题(这里的点指主机或者路由器)。
虽然从整体上看链路层提供的服务都是将来自网络层的数据报封装成帧,然后通过单一通信链路从一个节点移动到相邻节点,但具体实现的细节会随着链路层协议的不同而变化。从网络层的角度上看,是直接从一个主机发送到另一个主机,但从链路层的角度看,可能第一跳链路是以太网链路,第二跳链路是帧中继链路,第三跳是无线局域网(如Wi-Fi 802.11标准)。这好比我们从大连到合肥,先坐地铁,再坐飞机,最后坐公交,经历了三种不同的运输方式。
链路层协议能够提供的可能服务包括:
-
成帧(framing):一个帧由一个数据字段和若干首部字段组成,其中网络层数据报就插在数据字段中,帧头部使用“MAC”(物理)地址来标示源和目的。帧的具体结构在不同的链路层协议中会有所不同。
-
链路接入:媒体访问控制协议(Medium Access Control,MAC)协议(这里的MAC和前面的MAC地址是两个不同的概念,天天用缩写终于还是出事了吧doge)规定了帧在链路上传输的规则。点对点链路上,MAC协议主要确保无论何时链路空闲,都能够顺利发送帧;多点连接的情况下,MAC协议较为复杂,用于协调多个节点的帧传输。
-
可靠交付:当链路层协议提供可靠交付服务时,它保证无差错地经链路层移动每个网络层数据报。但是在一些低出错率的链路上(光纤、同轴电缆、和双绞铜线链路)一般不提供可靠地交付服务。
-
差错检测和纠正:链路层的差错检测相较于上两层通常更复杂,并且用硬件实现。一般通过让发送节点在帧中包括差错检测比特,接收节点进行差错检查的方式来完成这项工作。差错纠正类似于差错检测,区别在于能额外确定帧中差错的位置并纠正。后面我们将详细介绍具体流程。
-
半双工和全双工:半双工指链路可以双向传输,但是同一时刻只能有一个方向。
3.链路层实现的位置
链路层的主体部分实在网络适配器(network adapter)中实现的,也被称为网络接口卡(Network Interface Card,NIC),就是我们通常说的网卡。网络适配器实现链路层功能和相应的物理层功能,具体关系如下面的主机体系结构所示:
链路层的实现存在于网络中每一个主机、路由器、交换机上,它们之间的通信如下图所示:
发送方:
-
在帧中封装数据报。
-
加上差错控制编码,实现RDT(Reliable Data Transfer,可靠数据传输)和流量控制功能等。
接收方:
-
检查有无出错,执行RDT和流量控制功能等。
-
解封装数据报,将其交给上层。
二、差错检测和纠正
1.场景介绍
上图是我们研究差错检测与纠正技术的环境。在发送节点,为了保护比特免受差错,使用差错检测和纠正比特(Error-Detection and-Correction,EDC) 对数据D进行增强,D即为我们需要保护的数据,它不仅包括从网络层传递下来的数据报,还包括链路帧首部中的链路级的寻址信息、序号。接收方的任务是在只接收到D'和EDC'的情况下,确认D'和D是否相同。
差错检测和纠正技术并非总能检测出已经出现的比特差错,也就是说没通过检验说明一定出错,通过检验也不能保证一定不出错。
差错检测主要有以下三种常用技术:
-
奇偶校验:用于描述差错检测和纠正背后隐含的基本思想。
-
校验和方法:通常更多地应用于运输层。
-
循环冗余检测:通常更多地应用在适配器中的链路层
2.奇偶校验
差错检测最简单的方式就是用单个奇偶校验位(parity bit),以下图为例:
在偶校验方案中,发送方只需要包含一个附加的比特,设置它的值使得这d+1个比特中1的总数是偶数;在奇校验中,则是使得1的个数为奇数。
接收方接收数据后,如果发下1的个数与预期不一致,则说明至少出现了一个比特差错,准确来说是出现了奇数个比特差错(偶数个差错则会相互抵消,无法被检测到),但无法确定是哪一个比特出错。
而在二维奇偶校验(two-dimensional parity) 中,包含比特值改变的行和列的校验值值都会出现差错,因此接收方可以利用行和列的索引来识别发生差错的单个比特并纠正它,如下图所示:
二维奇偶校验也能够检测一个分组中两个比特差错的任何组合,但无法纠正。此外,二维奇偶校验依旧可能存在无法检测到的比特差错,例如“田”字型的相邻四个比特均出现差错。
3.检验和方法
传输层UDP和TCP的检验和字段均是使用的这种方法,发送放将报文段看成一个个16比特的字段,不足16位的用0补齐。把所有字段相加,最高位的进位加到末尾上,得到的结果按位取反后作为校验和。因为一个二进制数和自己的反码相加的结果为全1。因为接收方只需要把所有的字段(包括首部和首部中的检验和)相加,判断得到结果是否为全1(FFFF)即可。
检验和方法和后面要讲的CRC方法相比,提供了相对弱的差错保护,但所需的分组开销较小。因为传输层的差错检测用软件实现,因此选用简单快速的检验和方法更合适;而链路层的差错检测在适配器中用专门的硬件实现,能够快速执行更加复杂的CRC操作。
4.循环冗余检测
现今的计算网络中广泛应用的差错检测技术基于循环冗余检测(Cyclic Redundancy Check,CRC)编码。
在研究CRC编码之前,我们先了解以下概念:
(1)模2运算
加法不进位,减法不借位,位与位之间无关。这意味着加法和减法是相同的,这种操作等价于异或(XRO)。
(2)位串的两种表示
以1011为例,它可以表示为:x^3+x+1。
(3)生成多项式
CRC中的生成多项式通常表示为以下形式:
其中g是二进制系数,通常为0或者1,生成多项式的最高次项为x^n,最低次项为g0,生成多项式的阶数决定了CRC校验码的长度,两者相等。
CRC 编码的操作如下,对于一个 d 比特的数据D,在发送前,发送方和接收方先约定一个 r+1 比特模式,称为生成多项式,我们将其表示为 G,要求 G 的最高有效位为 1。发送方要选择 r 个附加比特 R,并将他们附加到 D 上,使得得到的 d+r 比特模式用模 2 算术恰好能够被 G 整除。具体如下图所示:
接收方进行差错检测室,用G去除接收到的 d+r 比特,如果余数非零,则说明出现了差错,否则认为数据正确而被接收。而所有的 CRC 计算均采用模2运算来计算。
那么发送方是怎么计算出R的呢?
已知生成多项式G是提前约定好的,我们需要设计R满足:
等式左边表示把D左移r位后,再补上R。它的值应该是G的n倍。我们在等式两边同时异或一个R,左边的两个R抵消,得到:
这个等式告诉我们,如果我们用G来除D*2^r,得到的余值刚好是R(为什么呢?这里我们把异或看成加号会更容易理解),也就是说:
注意:这里的remainder表示余数,生成多项式G取 r+1 比特是为了能够得到最高 r 位的余数。
下面我们举一个具体的计算示例:
假设 D = 101110,d = 6,G = 1001,r = 3,在这种情况下计算R。
我们把D左移3位,末尾补上0,使用模2运算来计算它除以G = 1001后的结果,过程如下:
计算过程需要严格按照模 2 运算的规则,最后得到的余数为 11,但是R需要 3 位,因此我们在前面补上一个 0 得到 R。
三、多点访问链路和协议
1.简介
前面提到网络链路有两种类型:点对点链路和广播链路(即多点连接方式)。
-
点对点链路(point-to-point link) 由链路一端的单个发送方和链路另一端的单个接收方组成。点对点协议(point-to-point protocol,PPP)和高级数据链路控制(high-level data link control,HDLC)便是为这种网络链路设计的协议。
-
广播链路(broadcast link) 能够让多个发送和接收节点都连接到相同的、单一的、共享的广播信道上。这里的广播意味着任何一个节点传输一个帧时,信道都会广播该帧,每个其他节点都会收到一个特定的副本。传统的以太网和无线局域网都是广播链路层技术的例子。
在广播链路中应该如何协调多个发送和接收节点对一个共享广播信道的访问,我们将其称为多路访问问题(multiple access problem)。
在广播链路中,当多个节点同时传输帧时,传输的帧会在所有的接收方处碰撞(collide)。当碰撞发生时,接收节点无法有效地获得任何传输的帧。多路访问协议(multiple access protocol) 便是用来解决这种问题的。
一般来说,我们能够将任何多路访问协议划分为以下3种类型之一:
-
信道划分协议(channel partitioning protocol)
-
随机接入协议(random access protocol)
-
轮流协议(taking-turns protocol)
理想情况下,对于速率为 R bps 的广播信道,我们对多路访问协议有如下期望:
-
当仅有一个节点发送数据时,该节点具有 R bps 的吞吐量。
-
当M个节点,每个节点吞吐量为 R/M bps。
-
协议是分散的,不会因为某个主节点故障而导致整个系统崩溃。
-
协议是简单的,使实现不昂贵。
2.信道划分协议
信道划分协议的思想主要是把信道划分成小片(按照时间、频率、编码等),然后将其分配给每个节点使用,实际上这部分内容我们在第一章也有提及。
时分多路复用(TMD) 将时间划分为时间帧(time frame),并进一步划分每个时间帧为N个时隙(slot),然后把每个时隙分配给N个节点中的一个,当某个节点要发送分组时,只能在轮到自己的时隙的时候才能进行传输。例如下图中,被分配到“2”的节点,只能在每个帧里标有“2”的时隙传输数据:
TMD消除了碰撞且十分公平,每个节点在每个帧时间(注意是帧,不是时隙)内得到了专用的传输速率 R/N bps。但存在以下两个缺陷:
-
每个节点被限制于 R/N bps 的平均速率,即使它是唯一需要发送分组的结点。
-
节点必须等待它在传输序列中的轮次,只有到自己的轮次才能传输数据。
频分多路复用(FMD) 将 R bps 信道划分为不同的频段,每个频段具有 R/N 带宽,并把每个频率分配给N个节点中的一个。FDM有着和TMD同样的优缺点,速率也被限制在了 R/N bps。
第三种信道划分协议是码分多址(Code Division Multiple,CDMA),CDMA对每个节点分配一种不同的编码,然后每个节点用它唯一的编码来对它发送的数据进行编码。通过这种方式,能够实现不同的节点同时传输数据且它们各自相应的接收方仍能正确接收发送方编码的数据比特(假设接收方知道方式方的编码),不会被其他节点发送的数据干扰。
3.随机接入协议
(1)时隙ALOHA
时隙ALOHA协议是最简单的随机接入协议,在该协议中,我们做出一下假设:
-
所有帧(这里的帧值的是链路层帧,不是时间帧)是等长的。
-
时间被划分成相等的时隙,每个时隙刚好可以发送一帧。
-
每个节点只在时隙开始时发送帧。
-
节点是同步的,每个节点都知道时隙何时开始。
-
如果一个时隙中有两个及以上帧碰撞,则所有的节点在该时隙结束之前都能检测到碰撞。
当碰撞发生后,碰撞的节点不会立即在下一个时隙重传,而是以概率P重传,直到成功。
以上图为例,1、2、3号节点在第一个时隙同时发送数据,产生碰撞。三个节点会各自尝试在后面的每个时隙以概率P重传(节点之间是独立的)。在第三个时隙,恰巧1、2号节点同时选择重传,再一次发生碰撞,传送失败。第四个时隙,只有2号节点选择重传,成功传输。第六个时隙,1、3号节点同时选择重传,发送碰撞。第八个时隙,只有1号节点选择重传,成功传输。第九个时隙,三号节点选择重传,没有碰撞,成功传输。
时隙ALOHA协议有着以下优点:
-
当某节点是唯一活跃的节点时,时隙ALOHA允许其以全速R连续传输。
-
各个节点之间是高度分散的(但需要在时钟上同步),每个节点之间独立检测碰撞并决定什么时候重传。
但我们从图中也能看出来,当碰撞发生时,该时隙便被浪费了,且后续存在部分空白时隙没有节点选择重传,对时隙的利用率较低。
时隙ALOHA的效率
我们用成功传输的时隙占比来计算时隙ALOHA协议的效率,假设有N个节点,每个节点都有很多帧要发送,且在每个时隙中传输的概率是P。则一个节点成功传输的概率为
任何一个节点成功的概率是
对其求导,计算出 p = 1/N,时,该值最大。代入p,当N为无穷大时,该值的极限为 1/e = 0.37。即最好情况下,时隙ALOHA的效率为 37%。
(2)纯ALOHA(非时隙)
时隙ALOHA协议要求所有的节点同步他们的传输,以在每个时隙开始时开始传输,但第一个ALOHA协议实际上是一个非时隙、完全分散的协议(奇怪,那为什么不直接把这一小节放在第一个讲)。
无时隙ALOHA协议下,节点无需在时间上同步,当有帧需要传输时,可以马上传输,如下图所示:
对于一个 t0 时间发送的帧,在[ t0 - 1,t0 + 1 ]区间内发送的帧都会与它发生碰撞。这个角度看,冲突区间似乎比时隙ALOHA协议增大了一倍,下面我们计算纯ALOHA的效率:
已知每个节点在一个单位时间内选择传输的概率为p,那么
我们用同样的方式,可以求得当 p = 1/(2N-1) 时,P(指定节点成功) 的值取最大,为 1/2e = 0.175。
所以纯ALOHA协议的效率是17.5%,相比时隙ALOHA效率更低了。
(3)CSMA(载波侦听多路访问)
载波侦听多路访问(Carrier Sense Multiple Access,CSMA) 中的载波侦听是指,一个节点在传输前会先侦听信道,如果信道空闲,则传输整个帧,否则推迟传送,等到信道空闲再尝试传输。
但即使采用这种方式,仍然可能会发生碰撞,因为信号的传播存在延迟。
上图中,t0时刻,节点B侦听到信道是空闲的,开始沿着广播媒体在两个方向上传播它的比特。在t1时刻,节点D有一个帧需要发送,虽然此时节点B正在传输,但是B传输的比特还没有到达,导致D误认为信道空闲,选择传输比特,最终发生碰撞,导致两个节点传输失败。
从这个过程中我们也可以看出,广播信道的端到端信道传播时延(channel propagation delay) 在决定其性能方面起到关键作用,该传播时延越长,载波侦听节点不能侦听到网络中另一个节点已经开始传输的概率越大。
CSMA 的侦听策略
CSMA 协议中,节点发送数据的策略一般有如下三种:
1-坚持CSMA:节点发送数据前,如果侦听到信道忙,则继续侦听直到信道空闲,再发送数据。由于一监听到信道空闲就立即发送,所以信道的利用率较高,但多个节点同时发送导致冲突的可能性也较大。
非坚持CSMA:节点发送数据前,如果侦听到信道忙,则随机等待一个时间段后,再开始侦听。相较于1-坚持,非坚持CSMA降低了发生冲突的可能性,但同时也降低了信道的利用率。
p-坚持CSMA:该策略仅适用于分时隙的信道,主机在发送数据前,如果侦听到信道忙,则推迟到下一个时隙重新监听,如果信道空闲,则有p的概率立即发送数据,1-p的概率推迟到下一个时隙重新侦听。p-坚持CSMA既能有效减少冲突,又能比较充分的利用信道。
注:本部分内容书上并未出现,为笔者根据王道书籍做出的补充。
(4)CSMA/CD(冲突检测)
CSMA/CD是具有碰撞检测(collision detection) 的载波侦听多路访问,这里的碰撞检测是指,当一个传输节点在传输时一直在侦听此信道,如果它检测到另一个节点正在传输干扰帧,它就停止传输,在重复“帧听 - 当空闲时传输”循环之前等待一段随机时间。
我们可以看到,在多路访问协议中加入碰撞检测后,通过不传输一个无用、损坏的帧,大大改善了协议的性能(降低损坏帧在信道中的滞留时间)。
CSMA/CD协议的整体运行流程如下:
1.适配器从网络层获得数据报,准备链路层帧。
2.在发送帧前,先侦听信道:
-
信道空闲则开始传送帧。
-
信道忙则等到信道空闲再发送。
3.在传输过程中扔不停检测信道,即网络适配器要边发送边监听:
-
没有检测到冲突则持续发送,直到成功发送完成。
-
检测到冲突则放弃发送,之后尝试重发。
4.发送方适配器在检测到冲突后,除了放弃传输之外,还会发送一个强化的人为干扰信号,确保所有的节点都能够得知发生的冲突。
5.放弃传输后,适配器执行退避算法,在以太网中,CSMA/CD协议执行二进制指数退避算法。
二进制指数退避算法
- 首次发生碰撞,节点在{0,1}之间选择一个数,记为K,选择等待K*512比特时间(对于100Mbps的以太网来说,512比特时间为5.12ms)后重新开始“侦听-当空闲时传输”。
- 第二次碰撞后,节点在{0,1,2,3 }之间选择一个数,记为K,选择等待K*512比特时间后重新开始“侦听-当空闲时传输”。
- 第三次碰撞后,节点在{0,1,2,3,4,5,6,7 }之间选择一个数,记为K,选择等待K*512比特时间后重新开始“侦听-当空闲时传输”。
- ……
每发生一次碰撞,窗口大小就会翻倍,碰撞概率会变低,但平均等待时间也会边长。
需要注意的是,二进制指数退避算法是分布式的算法,即每个节点之间独立计算自己的碰撞次数和窗口大小;同时该算法也是自适应的算法,负载较大时,重传窗口时间大,减少冲突,但等待时间长,负载较小时,各站点等待时间短,但冲突概率大。
(5)CSMA/CD效率
CSMA/CD效率的推导超出了本书的范畴,这里只给出下面的近似式子:
其中,d_prop表示信号能量在任意两个适配器之间传播所需的最大时间;d_trans表示传输一个最大长度的以太网帧的时间。可以看出,当d_prop变为0,或者d_trans变为无穷大时,效率为1。
总的来说,CSMA/CD有着比ALOHA更好的性能,且有着简单,廉价,分布式的优点。
(6)CSMA/CA(碰撞避免)
在无线局域网(WLAN)中,由于电磁波在传播过程衰减较快,且在开放空间里,相同频段的电磁波之间干扰比较严重(噪声),传统的有线网络中的碰撞检测方法(如以太网中的CSMA/CD)难以正常应用,所以WLAN通常采用CSMA/CA(载波侦听多路访问/碰撞避免) 机制。
以上图为例,A和C发送的电磁波彼此之间无法正常到达,但都能发送到B。假设A,C同时向B发送帧,帧在B处发生碰撞,B无法正常接收。但A和C由于都无法收到对方的电磁波,所以未能检测到碰撞,所以WLAN中,未检测到冲突不等于发送成功。
CSMA/CA 采用事前避免的方式减少碰撞的发生(并不能杜绝碰撞),具体实现方式如下:
一个有数据发送需求的节点 sender 在侦测到信道空闲时,不会立即发送数据,而是等待DIFS长的时间,如果持续时间内信道一直处于空闲状态,则直接传输整个帧(无碰撞检测,不会终止传输,因此碰撞的代价也较大);如果检测到信道忙碌,则会执行二进制指数退避算法,选择一个随机回退值,并在信道空闲时递减该值(信道忙碌时不会递减),当该值递减到0时(只会发生在信道空闲时,且立即发送数据帧,无需再等待 DIFS 时间),发送整个帧。
接收方收到帧后,如果帧正确,则会在SIFS后发送ACK。发送方如果没有收到ACK,则会增加回退值,重复上述步骤。
注意:由于无线链路的特性,需要每一帧都进行确认,例如我们在前面说的未检测到冲突不等于成功发送。这是链路层的可靠机制。
CSMA/CA虽然采用了事前避免的方法,但依旧会出现冲突(且由于不会停止传输无用帧,导致冲突的代价较大),例如以下两种情况:
-
两个站点相互隐藏:即我们前面提到的未检测到冲突不等于发送成功的例子。
-
两个站点选择了非常靠近的随机回退值:A的回退值到达0后发送帧,但是该信号还未到达B时,B的回退值也递减到0,选择发送帧,从而导致冲突。
预约机制
CSMA/CA本身并不具有预约机制,但是它通过RTS/CTS(Request to Send / Clear to Send)机制间接实现了预约的效果,该机制作为一个可选项,一般用来降低长数据帧冲突的概率。
具体实现流程如上头所示,发送方首先使用CSMA向接收方发送一个较小的RTS分组(虽然该分组也可能会产生冲突,但由于比较小,对信道的浪费也较少)。接收方成功收到信号后,会广播CTS,作为对RTS的响应。CST能够被所有的节点听到,完成广播后,发送方开始发送数据帧,而其他节点抑制发送。当接收方成功收到数据帧后,会向接收方发送ACK确认帧,表示传输完成。A收到ACK后,信道自动释放,回归信道竞争状态。
4.轮流协议
(1)简介
信道划分协议在高负载下是有效和公平的,但是低负载下由于节点速率被限制在R/N,因此效率较低;
随机访问协议在低负载时效率高,单个节点可以完全利用信道带宽,但在高负荷情况下冲突概率大,效率低。
而轮流协议(taking-turns protocol) 集成了两者的优点,在低负载和高负载情况下都能有着较高的效率(但具体实现比较复杂)。
比较重要的两种轮流协议有:轮询协议(polling protocol) 和令牌传递协议(token-passing protocol)。
(2)轮询协议
轮询协议如上图所示,一个节点被指定为主节点,主节点依次询问每个节点,告诉它能够传输的帧的最多数量。一个节点传输完成(也可能没有数据帧要传输或者传输达到上限)后,主节点就会开始询问下一个节点,一次轮流执行。
很显然,整个过程都由主节点控制,因此这种方法存在单点故障问题,一旦主节点故障,整个信道都会变得不可操作。
(3)令牌传递协议
令牌传递协议如上图所示,该协议没有主节点。一个称为令牌(token)的小的特殊帧在节点之间以某种固定的次序进行交换。如果某节点持有令牌并有数据要发送,它将占用令牌并发送数据,当发送完成或者超时,节点释放令牌并将其传递给下一个节点。
令牌传递协议依旧存在单点故障问题,例如令牌可能会在传递的过程中丢失,这时必须调用某些复杂的机制来检查和恢复令牌。
5.电缆接入网络
DOCSIS(Data Over Cable Service Interface Specification,电缆数据服务接口规范) 定义了电缆数据网络体系结构及其协议。在电缆接入网中,我们将同时看到前面所讲的多种多路访问协议。
下图中为一个电缆接入网示例,在电缆网头将几千个住宅电缆调制解调器与一个电缆调制解调器端接系统(Cable Modem Termination System,CMTS) 连接。
注:调制解调器(Modem) 是一种将数字信号与模拟信号相互转换的设备,用于实现计算机和其他数字设备的网络接入。“调制”指数据从计算机发送到网络时,将计算机的数字信号转换成模拟信号;“解调”指数据从网络接收到计算机时,把收到的模拟信号转换回数字信号。
电缆接入网络分为下行信道(CMTS到调制解调器)和上行信道(调制解调器到CMTS),两者均为广播信道。DOCSIS使用FDM将上行和下行网络段划分为多个频率信道,每个下行信道带宽6MHz,吞吐量为40Mbps,每个上行信道带宽6.4MHz,吞吐量为30Mbps。
下行信道上,由于只有CMTS传输数据,因此不存在多路访问题。CMTS在下行信道上向所有用户广播称为MAP报文的控制报文,来为每个电缆调制解调器指定能够在上行信道中使用的微时隙。由于每个微时隙明确分配给电缆调制解调器,故CMTS能够确保在微时隙中没有碰撞传输。
那么CMTS是根据什么来分配微时隙的呢?
在下行信道划分的微时隙中,有一组特殊的微时隙专门用于让有数据发送需求的用户发送微时隙请求帧。这些来自各个用户的微时隙请求帧,会以随机接入的方式在这组特殊的微时隙中传输,因此可能会发送碰撞。但用户无法检测碰撞,只能通过观察下一个下行控制报文中是否有对自己请求分配的响应来判断是否发送碰撞。如果没有,则执行二进制指数退避算法将自己的的微时隙请求帧延缓到以后的时隙重新发送。
在流量较低的情况下,用户可能会在名义上分配给微时隙请求帧的时隙内直接传输数据帧,从而避免等待额外的请求分配,减少延迟,提高带宽的利用率。
注:电缆接入网络中,同时使用了FDM、TDM、随机接入和集中分配时隙多个多路访问协议。
四、交换局域网
1.MAC地址和ARP
(1)MAC地址和IP地址
-
IP地址是网络层地址,32bit(IPv6为128位),是分层的,能够实现路由聚集。用于完成网络到网络的交付。
-
MAC地址是链路层地址,48比特。是平面的,仅用来区分一个网络内的不同网卡,任何两个网卡的MAC地址都不相同。用于完成一个物理网络内部节点到节点的数据交付。
注意:链路层地址有多种称呼:LAN地址、物理地址或MAC地址,这里选取最流行的MAC地址。此外拥有MAC地址的并不是主机或路由器,而是他们的网络适配器。
MAC地址和IP地址分离的好处:
-
保持各层独立。局域网是为任意网络层协议设计的,将MAC地址和IP地址分离开,使其除了IP之外,还可以方便地支持其他网络层协议,如IPX等。
-
更换网卡时可以不必改变IP地址,可以直接与新网卡的MAC地址建立映射关系。
(2)ARP
地址解析协议(Address Resolution Protocol,ARP) 用于将IP地址解析为MAC地址。逆地址解析协议RARP用于将MAC地址解析为IP地址,但是它的功能已被DHCP取代,当前不再使用。
注意:虽然自定向下这本书中并未明确指出,但我们一般认为ARP是网络层协议。
下面介绍ARP在一个子网内部的运行流程:
如上的一个局域网中每个接口都有一个IP地址和MAC地址,假设主机C想要向主机A发送IP数据报。发送数据报时,主机C除了需要向它的网络适配器提供IP数据报外,还需要提供目的地的MAC地址,然后适配器将构造一个包含目的地的MAC地址的链路层帧,并把该帧发送进局域网。而目标主机MAC地址的获取就是ARP需要完成的任务。
主机C在其ARP模块上以主机A的IP地址222.222.222.222
作为输入,就会返回相应的MAC地址。每个主机上维护者一个ARP表,而主机C上的ARP表可能如下图所示:
图中的TTL为该表项的寿命值,一个表项通常的过期时间为20分钟。
可以看到ARP表上并不包含该子网内的所有主机和路由器,需要查询的目标地址A的MAC地址并不在表项中,那么主机C会向它的适配器传递一个ARP查询分组,该分组的目标地址为MAC广播地址(即FF-FF-FF-FF-FF-FF),子网内的所有地址都会收到该查询分组。当主机A收到该查询分组后(分组里有主机A的IP地址),会把自己的MAC地址放在ARP响应分组里,通过单播的形式发送给主机C。然后主机C将得到的映射关系存储更新在自己的ARP表中。
注意:ARP协议是即插即用的,即一个ARP表是自动建立的,并不需要网络管理员来进行配置。
(3)向子网外发送数据报
另一个更复杂的情况是向子网外的节点发送数据报,如下图所示,图中是由一台路由器连接的两个子网(可以看到这里路由器有两个接口,所以它有两个IP地址、两个ARP模块、两个适配器和两个MAC地址):
假设IP为111.111.111.111
的主机A准备向另一个子网里IP为222.222.222.222
的主机B发送数据报。主机A将数据报交付给它的适配器时,需要指示一个适当的MAC地址。该地址并不是主机B的MAC地址(因为主机B并不在当前子网内),而是下一跳路由器111.111.111.110
的MAC地址。通过ARP得到该MAC地址后,封装链路层帧(该帧包含了寻址到主机B的数据报),并发送出去。路由器发现该帧是向自己寻址的,于是进行接收,然后解封装。读取到数据报的目标IP后,结合自己的转发表找到转发端口应该为222.222.222.220
。该端口再把这个数据报进行封装,MAC地址为目标主机B的MAC地址(因为此时已经和目标主机位于同一子网,且依旧使用ARP获得MAC地址)。
2.以太网
以太网是目前最主流的局域网技术,由IEEE 802.3标准定义,采用无连接的工作方式,不对发送的数据帧编号,提供无连接不可靠的服务。
(1)以太网帧结构
以太网帧的结构分为如下六个字段:
-
前同步码(8字节):也叫前导码,位于以太网帧的最前面,该字段的前7个字节的值都是
10101010
,最后一个字节是10101011
。前七个字节用于同步发送方和接收方的始终,第八关字节的最后两个比特(第一次出现的两个连续的1)警告接收方“重要的内容”要来了。 -
目的地址(6字节):适配器收到除以自己和广播地址为目的地址之外的帧都会丢弃。
-
源地址(6字节):传输该帧到局域网上的适配器的MAC地址。
-
类型字段(2字节):类型字段允许以太网复用多种网络层协议(主机能够使用除了IP以外的其他网络层协议)。
-
数据字段(46~1500字节):该字段承载了IP数据报,以太网的最大传输单元MTU是1500字节,超过则需要进行分片。数据字段的最小长度是46字节,不足则需要填充到46字节(网络层可以使用IP数据报首部中的长度字段去除填充部分)。
-
CRC(4字节):循环冗余校验码。
标准以太网帧的长度最短为64字节,最长为1518字节(均不计入前导码)。
注意:虽然以太网帧有CRC码,但它向网络层提供的依旧是不可靠的服务,因为即使通过校验,接收方也不会发送确认帧;没通过校验,接收方也不会发送否定确认帧,只是直接丢弃该帧。所以发送方并不知道它传输的帧是否成功达到并通过校验。这有助于降低以太网的复杂度和成本,但可能导致传递到网络层的数据报流存在间隙。UDP会无视这些间隙(导致应用层会看到数据中的间隙),但TCP不会对有间隙的数据报进行确认,从而执行重传。但以太网并不知道自己传输的是一个新的数据报还是被重传的数据报。
(2)以太网的标准
以太网有很多不同的标准,但采用相同的MAC协议和帧结构(这里的MAC协议指介质访问控制协议):
-
不同的速率:10 Mbps、100Mbps、1Gbps、10Gbps
-
不同的物理层媒介:光纤、同轴电缆和双绞
以太网的标准有:如10BASE-T、10BASE-2.、100BASE-T、1000BASE-LX和10GBASE-T等等。
-
其中前面的数字10、100、1000、10G分表代表该标准的速率;
-
BASE表示使用基带传输,意味没有使用频分复用技术,每一个信号在单一频率上完全控制线缆
-
最后一部分指不同物理媒体本身:T表示双绞线(Twisted Pair),F表示光纤(optical Fiber),2表示细同轴电缆,5表示粗同轴电缆,LX代表适合长距离传输的光纤(Long Wavelength),SX代表适合短距离传输的光纤(Short Wavelength)(这里的X并不代表具体的单词,而是一个惯例符号,被用来标识光纤模式)。
以太网工作在半双工方式使用二进制指数退避的CSMA/CD算法,在全双工方式下,每个连接都有独立的发送和接收通道,几乎不会产生碰撞。
(3)总线以太网和星形以太网
总线以太网使用二进制指数退避的CSMA/CD协议,以半双工方式工作。
但是随着以太网站点数目的增多,总线结构以太网的可靠性下降,同时大规模集成电路以及专用芯片的发展使得星形结构的以太网交换可以做得便宜又可靠,于是采用以太网交换机的星形结构成为了以太网的首选拓扑,解决了以太网在高负载时性能差的问题。
星形以太网不使用共享总线,没有碰撞问题,因此不使用CSMA/CD协议,而是以全双工方式工作。之所以还保留以太网的称呼,是因为它的帧结构未改变,仍采用以太网的帧结构。
(4)吉比特以太网
吉比特以太网也叫千兆以太网,它的标准IEEE 802.3z有以下几个特点:
-
允许1 Gbit/s下以全双工和半双工两种方式工作。
-
使用IEEE 802.3协议规定的帧格式(即传统以太网的帧格式)。
-
在半双工方式下使用CSMA/CD协议,而在双全工方式不使用CSMA/CD协议。
-
与10BASE-T和100BASE-T技术向后兼容。
吉比特以太网在半双工方式时必须进行碰撞检测,由于数据率提高了,因此只有减小最大电缆长度或增大帧的最小长度,才能使帧的传输时间大于等于信号在最大传输距离上的往返时间。
注意:CSMA/CD协议中,必须满足帧的传输时间大于等于信号在最大传输距离上的往返时间,才能确保为检测到碰撞等于发送成功。否则可能出现发送方还未收到远处传来的碰撞信号就已经完成了帧的传输,从而误以为帧已经发送成功。这也是以太网最小帧长为64字节的由来。
为了解决这种问题,吉比特以太网采用了载波延伸(carrier extension) 方法,使最短帧长仍为64字节(保持兼容性),同时将争用期增大为512字节(传统以太网的为512位)。如果发送的MAC帧长不足512字节,就用一些特殊字段填充在帧的后面,使MAC帧的发送长度增大到512字节,这对有效负荷并无影响。接收端收到MAC帧后,把填充的特殊字段删除后才向高层交付。
但把原来仅64字节的短帧填充到512字节,额外的填充字段给链路层造成了很大开销,为此,吉比特以太网还增加了分组突发(packet bursting) 功能。及当有多个短帧要发送时,第一个短帧要采用载波延伸的方法进行填充,但随后的一些短帧则可一个接一个方式,他们之间只留必要的帧间最小间隔即可。这样就形成了一串分组的突发,直到到达1500字节或稍多一些为止。
吉比特以太网工作在全双工方式时,不使用载波延伸和分组突发。
3.交换机
交换机是链路层设备,用MAC地址转发分组,其自身对于子网中的主机和路由器来说是透明度的。
(1)交换机转发和过滤
过滤(filtering) 决定一个帧应该转发到某个接口还是应当将其丢弃的交换机功能。
转发(forwarding) 是决定一个帧应该被导向哪个接口,并把该帧移动到那些接口的交换机功能。
交换机的两个功能都依赖于交换机表(switch table) 完成。交换机表中的一个表项包括:
-
一个MAC地址。
-
通向该MAC地址的交换机接口。
-
表项放置在表中的时间。
当一个目的地址为DD-DD-DD-DD-DD-DD
的帧从交换机接口 x 到达,交换机用该MAC地址在它的表里进行索引。有3种可能的情况:
-
表中没有该表项。交换机会将该帧泛洪到所有端口(除了接收该帧的端口x),即将帧转发到除入口端口以外的所有接口。
-
表中有一个表项将该MAC地址与接口 x(即进来时的接口)联系起来。不会转发,而是直接丢弃该帧。
-
表中有一个表项将该MAC地址与非 x 的的接口联系起来。将帧转发到该MAC地址对应的端口,而不会泛洪。这是正常的单播转发操作。
(2)自学习
交换机是自学习(self-learning) 的,即它的表是自动,动态和自治地建立的,不需要来自网络管理员和配置协议的任何干预。实现过程如下:
-
交换机表初始为空。
-
对于在每个接口收到的帧,交换机会在其表中存储:a.源MAC地址;b.接口信息(将源MAC地址和对应的接口进行关联并记录,以便在之后需要转发到该地址时知道帧应该从哪个接口发送);c.老化期。
-
如果在老化期内,交换机没有收到以该地址作为源地址的帧,就在表中删除这个地址(以这种方式,如果一台主机更换了网卡,那么旧的MAC地址最终会被从该交换机表中清除掉)。
因为交换机不需要网络管理员或用户的干预,因此交换机是即插即用设备(plug-and-play device)。此外交换机也是全双工的,即任何交换机接口都能够同事发送和接收。
注意:学到这里可能觉得和前面讲到的ARP表的维护有些类似,ARP虽然也是即插即用的,但并不是自学习的。因为ARP的工作依赖于设备主动发送ARP请求来获得地址映射信息,而交换机是被动地从流经的帧中学习。
笔者的碎碎念:
写到这里,对 TopDown 的学习也就告一段落了,写这些东西确实花了不少时间,但能够有始有终地做完这些,是一件值得开心的事情。本以为在这之后已经对计网有了比较清晰的了解,结果去看了408的几道题后,直接道心破碎(悲鸣)。只能说408考察的深度和广度都不是学校的期末考试所能比拟的,未来还有很长的路要走,一切都才刚刚起步。
最后,来只可爱的利欧路吧!(づ ̄ ³ ̄)づ