该文章笔记来源于B站湖科大教书匠计算机网络微课视频,部分地方做了些许调整,并加入了一些王道视频中的内容。主要目的是自己考研复习使用,也方便大家参考学习。
24考研王道计算机组成原理笔记
电路交换
由于链路一直存在,占用资源,导致线路传输效率一般都会很低。
分组交换
将 h1 的数据传输到 h3 的设备上来,考虑到中间交换机的缓存容量,所以采用报文的方式,将长数据分解成一段段的带首部的短数据。分组交换网中的节点先缓存短数据,然后从首部中提取出目的地址,按照目的地址查找自己的转发表,找到相应的转发接口后,将分组转发出去把分组交给下一个转发节点,经过多个节点的存储转发后,分组最终转发到目的主机。主机 h3 接收到数据后,去掉首部,将各数据段组合还原出原始报文。
报文交换
现阶段计算机网络的一个较好的定义:计算机网络主要是由一些通用的、可编程的硬件互连而成的,而这些硬件并非专门用来实现某一特定目的(例如,传送数据或视频信号)。这些可编程的硬件能够用来传送多种不同类型的数据,并能支持广泛的和日益增长的应用。
计算机网络的性能指标被用来从不同方面度量计算机网络的性能,常用的八个计算机网络性能指标:速率、带宽、吞吐量、时延、时延带宽积、往返时间、利用率、丢包率。
1、速率
2、带宽
3、吞吐量
4、时延
时延是指数据从网络的一端传送到另一端所耗费的时间,也称为延迟或迟延。 数据可由一个或多个分组、甚至是一个比特构成。
5、时延带宽积
6、往返时间
往返时间(Round-Trip Time,RTT)是指从发送端发送数据分组开始,到发送端收到接收端发来的相应确认分组为止,总共耗费的时间。
7、利用率
8、丢包率
丢包率是指在一定的时间范围内,传输过程中丢失的分组数量与总分组数量的比率。接口丢包率、网络丢包率、节点丢包率、路径丢包率、链路丢包率。
分组丢失主要有以下两种情况:
丢包率可以反映网络的拥塞情况:
网络接口:有线的以太网接口,无线局域网的 wifi 接口等。
本质上 TCP/IP 只有网际层,运输层,应用层三层。IP 协议是 TCP/IP 体系结构网际层的核心协议。TCP 和 UDP 是 TCP/IP 体系结构运输层的两个重要协议。TCP/IP 体系结构的应用层包含了大量的应用层协议。例如 HTTP、SMTP、DNS、RTP 等。
计算机网络是个非常复杂的系统,“分层”可将庞大复杂的问题转化为若干较小的局部问题。
1、实体
1、物理层要实现的的功能
解决在各种传输媒体上传输比特0和1的问题,进而给数据链路层提供透明传输比特流的服务。
光纤的缺点
串行传输是一个比特一个比特传输,因此发送端和传输端之间只需要一条数据传输线路即可。
并行传输是指一次性传输多个比特,而不是一个比特。接发收端有 n 条传输线路。成本高。
远距离传输是串行传输,计算机内部传输是并行传输,常见的数据总线宽度有 8 位,16位,32 位和 64 位。
同步传输:发送端发送连续不间断的信号,接收端按照时钟频率进行接收,因为发送端和接收端频率不同步,所以会产生一定的时钟误差,会导致接收端对比特信号的判别错位,那么要需要一些方式来使时钟保持同步。
异步传输:发送数据是有间隔不联系的,接收端仅在每个字节的起始处对字节内的比特实现同步。为此,通常要在每个字节前后分别加上起始位和结束位。
传输媒体和信道不能直接划等号
在传输大量连续1或连续0的情况下,差分曼彻斯特编码信号比曼彻斯特编码信号的变化少。在噪声干扰环境下,检测有无跳变比检测跳变方向更不容易出错,因此差分曼彻斯特编码信号比曼彻斯特编码信号更易于检测。在传输介质接线错误导致高低电平翻转的情况下,差分曼彻斯特编码仍然有效。
信号在传输过程中或受到各种因素的影响,一个数字信号通过实际的信道后,波形会产生失真,在失真不严重时,在输出端还可根据已失真的波形还原出发送的码元。在失真严重时,很难判断这个信号是什么时候是1,什么时候是0,信号波形失去了码元之间的清晰界限。这种现象叫做码间串扰。
码元的传输速率越高、信号的传输距离越远、噪声干扰越大、传输媒体质量越差,信号经过传输后的失真就越严重。
码元传输速率又称为波特率、调制速率、波形速率或符号速率。
波特率与比特率有一定的关系:
问:尽管奈氏准则限制了最高码元传输速率,但是只要采用技术更为复杂的信号调制方法,让码元可以携带更多的比特,岂不是可以无限制地提高信息的传输速率吗?
答:回答是否定的。因为在实际的信道中会有噪声,噪声是随机产生的,其瞬时值有时会很大,这会影响接收端对码元的识别,并且噪声功率相对于信号功率越大,影响就越大。
在信道的频率带宽W一定的情况下,根据奈氏准则和香农公式,要想提高信息的传输速率,就必须采用多元制(更复杂的调制技术),并努力提高信道中的信噪比。
常用的信道复用技术:频分复用FDM、时分复用TDM、波分复用WDM、码分复用CDM
例如,在一根光缆中放入100根速率为2.5Gb/s的光纤,对每根光纤采用40倍的密集波分复用,则这根光缆的总数据速率为(2.5Gb/s × 40)× 100 = 10000Gb/s = 10Tb/s。
【举例】
假设给某个站指派的8比特码片序列为01011001
该站发送比特1:发送自己的8比特码片序列01011001
该站发送比特0:发送自己的8比特码片序列01011001的反码10100110
将码片序列中的比特0记为-1,而比特1记为+1,可写出码片序列相应的码片向量。在本例中,该站的码片向量为(-1 +1 -1 +1 +1 -1 -1 +1)。
如果有两个或多个站同时发送数据,则信道中的信号就是这些站各自所发送一系列码片序列或码片序列反码的叠加。为了从信道中分离出每个站的信号,给每个站指派码片序列时,必须遵循以下规则:
令向量A表示站A的码片向量,向量B表示站B的码片向量。两个不同站A和B的码片序列相互正交,就是向量A与向量B的规格化內积为0,如下式所示。
在讨论链路层传输过程时,不考虑解封问题,只看成水平层传输的过程。及局域网1中的主机 H1 经过路由器 R1,广域网,以及路由器 R2 连接到局域网2中的主机 H2。不同的数据链路层可能采取不同的数据链路层协议。
链路(Link)是指从一个节点到相邻节点的一段物理线路(有线或无线),而中间没有任何其他的交换节点。
数据链路(Data Link)是基于链路的。当在一条链路上传送数据时,除需要链路本身,还需要一些必要的通信协议来控制这些数据的传输,把实现这些协议的硬件和软件加到链路上,就构成了数据链路。
计算机中的网络适配器(俗称网卡)和其相应的软件驱动程序就实现了这些协议。一般的网络适配器都包含了物理层和数据链路层这两层的功能。
帧(Frame)是数据链路层对等实体之间在水平方向进行逻辑通信的协议数据单元PDU。
帧的首部和尾部包含着重要的链路信息,例如这是以太网版本2的 MAC 帧首部中的各字段,包括帧的源地址、目的地址、类型等重要信息,尾部字段帧检验信息 FCS 字段,接收方通过该字段的值,用于判断帧在传输过程中是否产生了误码。
这是点对点协议 PPP 的帧格式。首部和尾部都有一个标志字段,接收方的数据链路层在收到物理层交付上来的比特流后,根据帧首部和尾部中的标志字段,就可以从收到的比特流中识别出帧的开始和结束。也就是进行帧定界。
如下图所示,发送方给接收方发送了两个帧,这时两个帧的帧首部和帧尾部都有一个标志字段,也就是帧定界符。接收方的数据链路层根据帧定界符就能从一连串比特流中识别出一个个的帧,然而,如果在帧的数据载荷部分恰好出现了帧首部和尾部中的标志字段取值相同的数据,在不采取其它措施的情况下接收方的数据链路层会出现帧定界的错误。
在传输过程中,由于实际的通信链路都不是理想的,表示比特的信号在信道上传输时,不可避免地会产生失真,甚至出现误码。即比特 0 变成比特 1,比特 1 变成比特 0,那么接收方的数据链路层收到该帧后,如何才能知道帧中出现了误码呢?这就需要采用差错检测措施。
例如,发送方的数据链路层采用某种检错技术,根据帧的内容计算出一个检错码,将检错码填入帧尾部,帧尾部中用来存放检错码的字段称为帧检验序列(FCS),接收方的数据链路层从帧尾部取出检错码,采用与发送方相同的检错技术,就可通过检错码检测出帧在传输中是否出现了误码。
封装成帧是指数据链路层给上层交付下来的协议数据单元PDU添加一个首部和一个尾部,使之成为帧。
透明传输是指数据链路层对上层交付下来的协议数据单元PDU没有任何限制,就好像数据链路层不存在一样。
在传输过程中,如果帧定界和网络协议数据单元的数据发生重合,那还能鉴定出帧定界符么?
答案是否定的。解决这个问题时,可以在发送帧之前,对帧的数据部分进行扫描,每出现一个帧定界符,就在其前面插入一个转义字符。接收方数据链路层在物理层交付的比特流中提取帧,遇到第一个帧定界符时,认为这是帧的开始。当遇到转义字符时就知道,其后面的 1 字节内容虽然与帧定界符相同,但它是数据而不是定界符,剔除转义字符后,将其后面的内容作为数据继续提取。
要是在传输过程中遇到既包含帧定界符,又包含了转义字符,应该怎么处理?
方法依旧是对帧的数据部分进行扫描,每出现一个帧定界符或转义字符,就在其前面插入一个转义字符。转义字符是一个特殊的字符,其长度为1个字节,十进制为27,而并不是E、S、C这三个字符。
为了提高数据链路层传输帧的效率,应当使帧的数据载荷的长度尽可能地大于首部和尾部的长度。
考虑到对缓存空间的需求以及差错控制等诸多因素,每一种数据链路层协议都规定了帧的数据载荷的长度上限,即最大传送单元(Maximum Transfer Unit,MTU)。例如,以太网的MTU为1500个字节。
检错编码–奇偶校验
数据链路层广泛使用漏检率极低的循环冗余校验(Cyclic Redundancy Check,CRC)检错技术。
循环冗余校验CRC的基本思想:
1、可靠传输的相关基本概念
使用差错检测技术(例如循环冗余校验CRC),接收方的数据链路层就可检测出帧在传输过程中是否产生了误码(比特差错)。
数据链路层向其上层提供的服务类型:
一般情况下,有线链路的误码率比较低。为了减小开销,并不要求数据链路层向其上层提供可靠传输服务。即使出现了误码,可靠传输的问题由其上层处理。
无线链路易受干扰,误码率比较高,因此要求数据链路层必须向其上层提供可靠传输服务。
2、停止-等待协议的实现原理
发送方给接收方发送数据分组,接收方收到后对其进行差错检测,若没有误码,则接受该数据分组,并给发送方发送确认分组,简称为ack。发送方收到对所发送数据分组的确认分组后,才能发送下一个数据分组。
假设这个数据分组在传输过程中出现了误码,接收方收到后对其进行差错检测,发现了误码,则丢弃该数据分组,并给发送方发送否认分组,简称为nak。发送方收到对所发送数据分组的否认分组后,就知道了之前自己所发送的数据分组出现了差错,而被接收方拒绝,于是立刻重传该数据分组。
因此发送方每发送完一个数据分组后,并不能立刻将该数据分组从缓存中删除,只有在收到帧对该数据分组的确认后才能将其从缓存中删除。
超时重传
发送方给接收方发送数据分组,然而该数据分组在传输过程中丢失了,需要说明的是对于数据链路层点对点信道而言,不太容易出现这种情况,但对于多个网络,通过多个路由器互联的复杂互联网环境而言,这种情况是会经常出现的。
对于这种情况,接收方既然收不到数据分组,那么也就不会发送确认或否认分组。如果不采取其他措施,发送方就会一直处于等待接收方确认或否认分组的状态。为了解决该问题,可以在发送方发送完一个数据分组时,启动一个超时计时器。若到了超时计时器所设置的重传时间,而发送方仍收不到接收方的确认或否认分组,则重传原来的数据分组,这就叫做超时重传。
确认丢失
发送方发送了一个数据分组,接收方正确接收该数据分组后,给发送方发送确认分组,但该确认分组在传输过程中丢失了,这必然会造成发送方对之前所发送数据分组的超时重传。
为了避免分组重复这种传输错误,必须给每个数据分组带上序号。例如该数据分组的序号为0,对于停止等待协议,由于每发送一个数据分组,就进行停止等待,只要保证每发送一个新的数据分组,其序号与上次发送的数据分组的序号不同就可以了。因此用一个比特来编号就够了。即序号0和1,这样根据数据分组的序号,接收方就可以判断出该数据分组是否是重复的,接收方丢弃重复的数据分组,并给发送方发送帧对该数据分组的确认分组,以免发送方对该数据分组的再次超时重传。
发送方收到帧对0号数据分组的确认分组,就可以发送下一个数据分组了,其序号为1,接收方正确收到1号数据分组后,给发送方发送确认分组。
确认迟到
发送方发送0号数据分组,接收方正确接收后,给发送方发送确认分组,由于某些原因,该确认分组迟到了,这必然会导致发送方对0号数据分组的超时重传。在重传的0号数据分组的传输过程中,发送方收到了迟到的确认分组,于是发送一号数据分组,接收方收到重传的零号数据分组后,发现这是一个重复的数据分组,将其丢弃,并针对该数据分组给发送方发送确认分组,以免发送方再次超时重传该数据分组。
现在问题来了,我们可以非常清楚的看到,这是一个对0号数据分组的重复确认,但是发送方又如何知道呢?如果不采取其他措施的话,发送方会误认为这是对1号数据分组的确认,如果对确认分组也进行编号,就可以使发送方避免这种误判。
如图所示该确认分组的序号为0,发送方通过确认分组的序号,知道这是一个重复的确认分组,忽略即可。接收方正确接受一号数据分组后,给发送方发送针对该数据分组的确认,分组其序号为一,发送方收到该确认分组后,发送下一个数据分组,序号为0。
请注意该数据分组与之前序号为0的数据分组,不是同一个数据分组,我们用给确认分组编号的方法,解决了确认迟到所导致的重复确认的问题。需要说明的是对于数据链路层的点对点信道,往返时间比较固定,不会出现确认迟到的情况。因此如果只在数据链路层实现停止等待协议,可以不用给确认分组编号。
停止-等待协议的信道利用率
TD:发送方发送数据分组所耗费的发送时延
RTT:收发双方之间的往返时间
TA:接收方发送确认分组所耗费的发送时延
途中忽略了接收方对数据分组的处理时延,以及发送方对确认分组的处理时延
①无传输差错的情况
累计确认
发送方将序号落在发送窗口内的0-4号数据分组,依次连续发送出去,他们经过互联网的传输,正确到达了接收方按序接收他们。当接收完0号和1号数据分组后,给发送方发送了一个累积确认ack1,当接收完2-4号数据分组后,又给发送方发送了一个累计确认ack4,假设ack1在传输过程中丢失了,而ack4正确到达了发送方,发送方接收ack4后就知道了,序号为4及之前的数据分组已被接收方正确接收了,于是将发送窗口向前滑动5个位置,这样就有新的序号落入了发送窗口,发送方可以将收到确认的数据分组从缓存中删除了,而接收方可以择机将已接收的数据分组交付上层处理。
累计确认的优缺点
②超时重传、回退N帧的情况
发送方将序号落在发送窗口内的这5个数据分组,依次连续发送出去,他们经过互联网的传输到达了接收方,假设他们在传输过程中受到了干扰,其中5号数据分组出现了误码,接收方通过数据分组中的检错码发现了错误,于是丢弃该数据分组。而后续到达的这4个数据分组的序号与接收窗口中的序号不匹配,接收方同样也不能接受他们,将他们丢弃,并对之前按序接收的最后一个数据分组进行确认,也就是发送ack4,每丢弃一个数据分组,就发送一个ack4,这4个ack4经过互联网的传输到达了发送方,发送方之前就接收过ack4,当收到这些重复的ack4时,就知道了之前所发送的数据分组出现了差错,于是可以不等超时计时器超时就立刻开始重传。
至于收到几个重复确认,就立刻重传,由具体实现来决定。在本例中,假设收到这4个重复的确认,并不会触发发送方立刻重传。一段时间后,超时计时器出现超时,发送方将发送窗口内已发送过的这些数据分组全部重传。在本例中,尽管序号为6701的数据分组,之前已经正确的到达接收方,但由于5号数据分组误码不被接受,他们也受到牵连而不被接受。发送方还要重传这些数据分组,这就是所谓的go back-n也就是回退n帧。可见当通信线路质量不好时,回推N帧协议的信道利用率并不比停止等待协议高。
对于本例,WT取值为8,发送方将序号落在发送窗口内的0-7号这8个数据分组依次连续发送出去,他们经过互联网的传输,正确到达了接收方,接收方按序正确接收他们后,给发送方发回累计确认ack7。假设ack7在传输过程中丢失了,这将导致发送方的超时重传,重传的0~7号数据分组到达接收方。接收方根据当前接收窗口内的序号,会对这8个数据分组按序接收,但是接收方之前已经接收过这8个数据分组了,现在是在重复接收,也就是说接收方无法分辨新旧分组,进而会产生分组重复这种传输差错,因此发送窗口的尺寸不能超过其上限。
注:小于8的时候,接收窗口的值不为0,而发送方发送的第一帧值为0,接收方拒绝接受。
总结:
4、选择重传协议
为了使发送方仅重传出现差错的数据分组,接收方不再采用累积确认,而需要对每一个正确接收的数据分组进行逐一确认。
发送方将序号落在发送窗口内的这4个数据分组,依次连续发送出去,他们经过互联网的传输陆续到达接收方,但其中的2号数据分组丢失了,只要序号落入接收窗口内,且无误码的数据分组,接收方都会接收。
接收方接收0号和1号数据分组,并发送0号和1号确认分组,接收窗口向前滑动两个位置,这样就有4和5这两个新的序号落入接收窗口,接收方接收3号数据分组并发送3号确认分组,但接收窗口不能向前滑动,因为3号数据分组是未按序到达的数据分组,这些确认分组经过互联网的传输,陆续到达发送方,每按序收到1个确认分组,发送窗口就向前滑动1个位置。
发送方接收0号和1号确认分组,发送窗口向前滑动两个位置,这样就有4和5这两个新的序号落入发送窗口,发送方将序号落入发送窗口的4号和5号数据分组发送出去,发送方现在可以将已经收到确认的0号和1号数据分组从发送缓存中删除了,而接收方可择机将以按序接收的0号和1号数据分组交付上层处理。
发送方接收3号确认分组,但发送窗口不能向前滑动,因为这是一个未按序到达的确认分组,发送方还未收到他之前的2号确认分组,不过需要记录3号数据分组已收到确认,这样该数据分组就不会超时重发。4号和5号数据分组到达接收方,接受方接受他们,并发送4号和5号确认分组,但接收窗口不能向前滑动,因为他们是未按序到达的数据分组,接收方还未收到他们之前的2号数据分组。
假设在4号和5号确认分组的传输过程中,发送方帧对2号数据分组的重传计时器超时了,发送方重传2号数据分组,4号和5号确认分组陆续到达发送方,发送方接收他们,但发送窗口不能向前滑动,因为他们是未按时到达的确认分组,发送方还未收到他们之前的2号确认分组,不过需要记录4号和5号数据分组已收到确认,这样他们就不会超时重发。
发送方之前重传的2号数据分组到达接收方,接收方接收该数据分组,并发送2号确认分组,接受窗口现在可以向前滑动4个位置,这样就有6701这4个新的序号落入接收窗口。
2号确认分组经过互联网的传输到达发送方,发送方接收该确认分组,发送窗口现在可以向前滑动4个位置,这样就有6701这4个新的序号落入发送窗口,发送方现在就可以继续将这4个序号的数据分组依次发送出去了。
下面我们就来看看,如果发送窗口和接收窗口的尺寸超过了他们的取值范围,会出现什么样的情况?
我们还是采用3个比特给分组编序号,即序号0~7,发送窗口的尺寸,WT取最大值,接收窗口的尺寸WR也取最大值,也就是WT等于WR=2的3-1次=4。假设我们故意将发送窗口尺寸WT设置为5,相应的将接收窗口尺寸WR也设置为5。
发送方将序号落入发送窗口内的0-4号这5个数据分组依次发送出去,他们经过互联网的传输,依次到达接收方,接收方接收他们,并发送0~4号确认分组,接收窗口向前滑动5个位置,这样就有56701这5个新的序号落入接收窗口。
这些确认分组经过互联网的传输,陆续到达发送方,但其中的0号确认分组丢了,发送方接收1-4号确认分组,并记录1~4号数据分组已收到确认,发送窗口不能向前移动。
一段时间后,0号数据分组的重传计时器超时了,发送方重传0号数据分组,该数据分组经过互联网的传输到达接收方,其序号0落在接收窗口内,接收方会接收它,但是接收方先前已经正确接收过该数据分组了,如果现在还要接收,那就会出现分组重复这种传输差错。也就是说如果发送窗口和接收窗口的尺寸超过了取值范围,就会使接收方无法分辨新旧数据分组,进而出现分组重复这种传输差错。
1、点对点协议PPP概述
点对点协议(Point-to-Point Protocol,PPP)是目前使用最广泛的点对点数据链路层协议。
一般的因特网用户通常都是要通过连接到某个因特网服务提供者ISP,例如中国电信、中国联通、中国移动这三大运营商才能接入因特网。这些ISP已经从因特网管理机构申请到了一批IP地址,用户计算机只有获取到ISP所分配的合法IP地址后,才能成为因特网上的主机。
用户计算机与ISP进行通信时所使用的数据链路层协议,通常就是PPP协议。在以太网上运行的PPP协议,即PPP over ethernet,简称为pppoe,它使得ISP可以通过DSL电路调制解调器、以太网等宽带接入技术,以以太网接口的形式为用户提供接入服务。另外点对点协议PPP也广泛应用于广域网路由器之间的专用线路。
从网络体系结构的角度看,PPP是数据链路层的协议,他将上层交付下来的协议数据单元封装成PPP帧。
为了支持不同的网络层协议,PPP协议包含了一套网络控制协议ncps,其中的每一个协议支持不同的网络层协议,例如TCP/IP中的IP,网络操作系统中的IPX,苹果公司的apple talk等。
链路控制协议LCP,用于建立配置以及测试数据链路的连接,PPP协议能够在多种类型的点对点链路上运行,例如面向字节的异步联络,面向比特的同步链路。
2、PPP的帧格式
3、PPP帧的透明传输
4、PPP帧的差错检测
接收方每收到一个PPP帧就进行crc检验,若crc检验正确,就收下这个帧,反之就要丢弃这个帧,使用PPP的数据链路层,向上不提供可靠传输服务。
1、网络适配器
假设主机 B 给主机 C 发送帧,则在帧首部中的目的地址字段,应填入主机 C 的 MAC 地址 C,而在源地址字段,应填入主机 B 的 MAC 地址 B,这样,总线上的其他各主机中的网卡,收到该帧后,就可以根据帧首部中的目的地址字段的值是否与自己的 MAC 地址匹配,决定丢弃或接受该帧。
全球多播:例如,交换机的生成树协议STP使用的多播地址为01-80-C2-00-00-00
本地多播:剩余46比特为“全1”时,就是广播地址FF-FF-FF-FF-FF-FF
四个交换机连接形成了一个环路,这样做的目的是为了提高网络的可靠性,然而,环路会造成广播帧在环路中永久兜圈的严重问题,为了解决该问题,交换机之间会交互一种特殊的帧,即BPDU,也就是网桥协议数据单元,各交换机根据 BPDU 中的一些参数,按照生成树协议所使用的生成树算法。最终某些交换机会阻塞自己的某些接口,这样就破除了环路,而 BPDU 首部中的目的地址,就是生成树协议专用的多播 MAC 地址01-80-C2-00-00-00
网卡从网络上每收到一个帧,就检查帧首部中的目的MAC地址,按以下情况处理:
网卡还可被设置为一种特殊的工作方式:混杂方式(Promiscuous Mode)。工作在混杂方式的网卡,只要收到共享媒体上传来的帧就会收下,而不管帧的目的MAC地址是什么。
全球单播MAC地址就如同身份证上的身份证号码,具有唯一性,它往往与用户个人信息绑定在一起。因此,用户应尽量确保自己拥有的全球单播MAC地址不被泄露。为了避免用户设备连接Wi-Fi热点时MAC地址泄露的安全问题,目前大多数移动设备都已经采用了随机MAC地址技术。
01 CSMA/CD协议的基本原理
为了解决各站点争用总线的问题,共享总线以太网使用了一种专用协议CSMA/CD,它是载波监听多址接入/碰撞检测(Carrier Sense Multiple Access Collision Detection)的英文缩写词。
多址接入:即多个站点连接到一根总线上,各主机随机发送帧.
载波监听:假设站点 C 要发送帧,它首先进行载波监听,在检测到总线空闲 96 比特时间后,就可以发送帧了。
碰撞检测:假设在站点 C 使用总线发送帧的过程中,站点 B 也要发送帧,站点 B 进行载波监听,发现总线忙,于是持续检测总线,一旦发现总线空闲 96 比特时间,则立即发送帧,边发送帧还要边检测碰撞,这就是所谓的碰撞检测,只要没检测到碰撞,就可继续发送帧的剩余部分。
假设在站点 B 发送帧的过程中,站点 C 也要发送帧,站点 C 进行载波监听,检测到总线空闲,但总线实际上并不空闲,这是因为站点 B 发送的信号还没有传播到站点 C,站点 C 检测不到而已,站点 C 检测到总线空闲 96 比特时间后,就立即发送帧,这必然会产生碰撞,在产生碰撞的时刻,站点 B 和 C 都在边发送帧还要边检测碰撞。
产生碰撞的位置离站点 C 较近。因此,站点 C 比 B 更早检测到碰撞,并停止发送帧。退避一段随机时间后,重新从载波监听开始,以便重发之前遭遇到碰撞的帧,当站点 B 检测到碰撞后,立即停止发送。
退避一段随机时间后,重新从载波监听开始,以便重发之前遭遇到碰撞的帧,以太网还采取了一种叫做强化碰撞的措施。
强化碰撞:发送帧的站点一旦检测到碰撞,除了立即停止发送帧外,还要再继续发送32比特或48比特的人为干扰信号(Jamming Signal),以便有足够多的碰撞信号使所有站点都能检测出碰撞。
CSMA(Carrier Sense Multiple Access)是载波监听多址接入的英文缩写词。
CSMA属于争用型的媒体接入控制协议,连接在同一媒体上的多个站点使用该协议以竞争方式发送数据帧,可能出现冲突(也称为碰撞)。
TDMA、FDMA、CDMA是常见的物理层信道复用技术,属于静态划分信道,用于多用户共享信道,不会发生冲突。
02 共享式以太网的争用期
本例中的站点 A 和 B,它们分别位于共享总线以太网的两端,A 与 D 之间的信号传播时延,就是该以太网单程端到端传播时延,记为τ,假设纵坐标为时间,我们来看站点 A 和 D 都发送帧,并产生碰撞的情况。
在 t=0 时刻,主机 A 要发送帧,当检测到总线空闲 96 比特时间后,立即发送帧,在 t=τ-δ 时刻,站点 A 发送的帧还未到达站点 D,而站点 D 也要发送帧,尽管总线现在已经被站点 A 占用,但是站点 A 发送的信号还未到达站点 D,因此站点 D 检测不到总线忙,站点 D 检测到总线空闲 96 比特时间后,立即发送帧,这必然会产生碰撞,碰撞时刻为 t=τ-δ/2 时刻,但此时双方都检测不到碰撞,碰撞信号沿总线传播到总线的两端,在 t=τ 时刻,站点 D 首先检测到碰撞,于是立即停止发送帧,在 t=2τ-δ 时刻,站点 A 也检测到碰撞,于是立即停止发送帧,站点 A 和 D 发送帧都失败了,它们各自要退避一段随机时间后,再重新发送。
03 共享式以太网的最小帧长和最大帧长
假设站点 A 给 D 发送一个很短的帧,边发送边检测碰撞,由于该帧很短,因此很快就发送完毕,站点 A 不再检测碰撞。
假设该帧再传送过程中,站点 C 也要发送帧,站点 C 再检测到信道空闲 96 比特时间后发送
帧,这必然会产生碰撞,站点 D 最终收到遭遇碰撞的帧,丢弃即可。然而站点 A 并不知道已发送完毕的帧,遭遇了碰撞,不会重发该帧,这样,站点 D 就无法正确收到该帧。
04 共享式以太网的退避算法
05 共享式以太网的信道利用率
如图所示,横坐标为时间,总线上的某个站点可能产生多次碰撞,并进行多次退避后,才能成功发送一个帧,帧的发送时延记为 T0,在最极端的情况下,源站点在总线的一端,而目的站点在总线的另一端,因此,还要经过一个单程到端的传播时延τ后,总线才能完全进入空闲状态,显然,发送一帧所需的平均时间由多个争用期,帧的发送时延,以及单程端到端的传播时延τ这三个部分构成。
使用细同轴电缆的共享总线以太网,为了避免信号的反射,在总线的两端,需要各连接一个终端匹配电阻,每一台要接入到总线的主机,都必须要配套使用一块带有 BNC 接口的网卡,和一个 BNC T 型接口。因此,这样的网络中就会有大量的机械连接点,若总线上的某个机械连接点接触不良或断开,则整个网络通信就不稳定或彻底断网。
集线器的一些主要特点如下:
来看网络中某个主机向另一个主机发送帧的情况。对于使用细同轴电缆的共享总线型以太网,表示帧的信号会沿总线传播到各个主机。对于使用集线器和双绞线的星型拓扑的共享式以太网,集线器收到帧后,会把帧从自己的其它各接口转发出去,这样,表示帧的信号也会传播到各个主机。
若网络中有多个主机要发送帧,对于这两种不同拓扑的共享式以太网,都会出现碰撞的情况。
01 扩展站点与集线器之间的距离
共享总线以太网中两站点之间的距离不能太远,否则它们之间所传输的信号就会衰减到使CSMA/CD协议无法正常工作。
在早期广泛使用粗同轴电缆或细同轴电缆共享总线以太网时,为了提高网络的地理覆盖范围,常用的是工作在物理层的转发器。
随着使用双绞线和集线器的10BASE-T星型以太网成为以太网的主流类型,扩展网络覆盖范围就很少使用转发器了。
10BASE-T星型以太网中每个站点到集线器的距离不能超过100m,因此两站点间的通信距离最大不能超过200m。
在10BASE-T星型以太网中,可使用光纤和一对光纤调制解调器来扩展站点与集线器之间的距离。这种扩展方法比较简单,所需付出的代价是:为站点和集线器各增加一个用于电信号和光信号转换的光纤调制解调器,以及它们之间的一对通信光纤。
02 扩展共享式以太网的覆盖范围和站点数量
01 使用网桥在数据链路层扩展以太网
02 网桥的主要结构和基本工作原理
使用网桥将两个使用集线器的共享式以太网互连起来,这回形成一个覆盖范围更大,站点数量更多的以太网,而原来的两个共享式以太网分别成为这个更大的以太网的一个网段,并且各自是一个独立的碰撞域。
转发表是网桥转发帧的依据,里面记录有网桥所知道的网络中各主机的 MAC 地址与自己的各接口的对应关系。网桥收到帧后,会在自身的转发表中查找帧的目的 MAC 地址,根据查找结果来转发或丢弃帧。
网桥转发帧:假设主机 A 给主机 D 发送单播帧,该单播帧被集线器转发给主机 B、C 以及网桥,主机 B 和 C 中的网卡根据该单播帧首部中的目的MAC 地址可知这不是发送给自己的帧,于是将其丢弃。网桥从自己的接口1收到该单播帧后,在转发表中查找主机 D 的目的 MAC 地址 D,根据查找结果可知,应从接口 2 转发该帧,于是就把该帧从自己的接口 2 转发给另一个网段,使主机 D 能够收到该帧,主机 D 中的网卡根据该单播帧首部中的目的 MAC 地址可知,这是发送给自己发的帧,于是接受该帧,而主机E和F中的网卡根据该单播帧首部中的目的MAC地址可知,这不是发送给自己的帧,于是将其丢弃。
网桥丢弃帧:假设主机 A 给 C 发送单播帧该单播帧被集线器转发给主机 B C 以及网桥,主机 B 中的网卡,根据该单播帧首部中的目的 MAC 地址可知,这不是发送给自己的帧,于是将其丢弃,而主机 C 中的网卡根据该单播帧首部中目的 MAC 地址可知,这是发送给自己的帧,于是接受该帧,网桥从自己的接口 1 收到该单播帧后,在转发表中查找主机 C 的目的 MAC 地址 C,根据查找结果可知,应从接口 1 转发该帧,然而网桥正是熊接口 1 收到该帧的,这表明主机 C 和主机 A 在同一个网段,主机 C 能直接收到这个帧,而不需要依靠网桥的转发,因此网桥会丢弃该帧。
网桥转发广播帧:假设主机 A 发送一个广播帧,广播帧的目的MAC 地址为全 F,该广播帧被集线器转发给主机 B C 以及网桥,主机 B 和 C 中的网卡会接受该帧,网桥从自己的接口 1 收到该广播帧,不用查找转发表,而是会通过除接收该帧的接口的其他接口转发该广播帧了,该广播帧通过集线器的转发到达该网段中的各主机,各主机中的网卡接受该广播帧。
上述举例的各种过程,是网桥通过其内部的接口管理软件和网桥协议实体来完成的。
03 透明网桥的自学习和转发帧的流程
如图所示:使用网桥将原来独立的两个使用集线器的共享式以太网连接起来,就可形成一个覆盖范围更大站点数量更多的以太网,为了简单起见,将主机 A~F 各自网卡对的 MAC 地址分别简记为 A-F,网桥上电启动后,其转发表是空的,网桥需要在网络中各站点相互通信的过程中通过自学习来建立自己的转发表。
假设主机 A 给 B 发送单播帧,与主机 A 处于同一网段中的主机 B 和 C,以及网桥的接口 1 都会收到该单播帧,主机 B 中的网卡根据该单播帧的目的 MAC 地址 B 可知,这是发送给自己的帧而接受该帧;主机 C 中的网卡根据该单播帧的目的 MAC 地址 B 可知,这不是发送给自己的帧而将其丢弃。网桥从接口 1 收到该单播帧后,首先进行自学习,也就是进行登记,登记的内容为帧的源 MAC 地址 A 和该帧进入网桥的接口号 1,之后网桥要对该单播帧进行转发,网桥在自己的转发表中查找该单播帧的目的 MAC 地址 B,但没有找到,只能进行盲目地转发,也就是网桥只能通过除接收该单播帧的接口 1 以外的其他接口转发该单播帧。对于本例,其他接口只有接口 2,因此该单播帧会从网桥的接口 2 转发到另一个网段,该网段中的主机 D,E 和 F 收到该单播帧后将其丢弃。
假设主机 D 给 A 发送单播帧,与主机 D 处于同一网段中的主机 E 和 F 以及网桥的接口 2 都会收到该单播帧,主机 E 和 F 中的网卡根据该单播帧的目的 MAC 地址 A 可知这不是发送给自己的帧而将其丢弃。网桥从接口 2 收到该单播帧后,首先进行自学习,也就是进行登记,登记的内容为,帧的源 MAC 地址 D 和该帧进入网桥的接口号 2。之后网桥要对该单播帧进行转发,网桥在自己的转发表中查找该单播帧的目的 MAC 地址 A,可以找到相应的记录,从记录的接口号部分可知,应从接口 1 转发该帧,这属于明确地转发。该单播帧从网桥的接口 1 转发到另一个网段,该网段中的主机 A 收到并接受该单播帧,而主机 B 和 C 收到该单播帧后将其丢弃。
假设主机 C 给 A 发送单播帧,与主机 C 处于同一网段中的主机 A 和 B,以及网桥的接口 1 都会收到该单播帧。主机 A 中的网卡根据该单播帧的目的 MAC 地址 A 可知,这是发送给自己的帧而接受该帧,主机 B 中的网卡,根据该单播帧的目的 MAC 地址 A 可知,这不是发送给自己的帧而将其丢弃,网桥从接口 1 收到该单播帧后,首先进行自学习,也就是进行登记,登记的内容为帧的源 MAC 地址 C 和该帧进入网桥的接口号 1。
之后网桥对该单播帧进行转发,网桥在自己的转发表中,查找该单播帧的目的 MAC 地址 A,可以找到相应的记录,从记录的接口号部分可知,应从接口 1 转发该帧,然而网桥正是从接口 1 接收的该帧,这表明主机 C 与 A 在同一个网段,A 能够直接收到该帧,而不需要借助网桥的转发,因此网桥丢弃该帧。在本例中如果网络中的各主机陆续都发送了帧,则网桥会逐步建立起完整的转发表,即网桥的每个接口都与网络中哪些主机的 MAC 地址对应。
04 透明网桥的生成树协议STP
E1 和 E2 是两个独立的共享总线型以太网,使用网桥 B1 将它们互连起来,就形成了一个更大的以太网,为了提高以太网的可靠性,还使用了一个冗余的网桥 B2,将 E1 和E2 进行了连接,很显然添加 B2 后,以太网中出现了环路。如果以太网 E1 或 E2 中的某个主机发送了一个广播帧,则该广播帧就会在网桥 B1 和 B2 构成的环路中,按顺时针和逆时针两个方向永久兜圈。
01 交换式以网
网桥的接口数量很少,通常只有2~4个,一般只用来连接不同的网段。
使用网桥将原本独立的两个使用集线器的共享式以太网连接起来,就可形成一个覆盖范围更大,站点数量更多的以太网,而原本独立的两个共享式以太网,就分别成为这个更大的以太网的一个网段。
1990年面世的交换式集线器(Switching Hub),实质上是具有多个接口的网桥,常称为以太网交换机(Switch)或二层交换机。
02 以太网交换机
以太网交换机(以下简称交换机)本质上就是一个多接口的网桥:
交换机的每个接口可以连接计算机,也可以连接集线器或另一个交换机。
交换机一般都具有多种速率的接口,例如10Mb/s、100Mb/s、1Gb/s甚至10Gb/s的接口,大部分接口支持多速率自适应。
03 共享式以太网与交换式以太网的对比(集线器与交换机的对比)
假设交换机已经通过自学习算法,逐步建立了完整的转发表,也就是学习到了网络中所有主机与自己各接口的对应关系。
1、主机发送单播帧的情况
假设主机 A 给 B 发送一个单播帧。对于使用集线器的共享式以太网,单播帧会通过集线器传播到网络中的其他各主机,其他各主机中的网卡会根据单播帧的目的 MAC 地址,决定接受或丢弃该帧。
对于使用交换机的交换式以太网,交换机收到单播帧后,根据帧的目的 MAC 地址和自身的转发表,将帧明确地转发给目的主机,而不是网络中的其他各主机,目的主机中的网卡,根据单播帧的目的 MAC 地址,决定接受该帧。
2、主机发送广播帧地情况
假设主机 A 发送了一个广播帧(广播帧首部中目的 MAC 地址字段地值应填入广播地址,即 48 比特全一,十六进制形式为全 F 的广播地址)。
对于使用集线器的共享式以太网,广播帧会通过集线器传播到网络中地其他各主机,其它各主机中的网卡,检测到帧的目的 MAC 地址是广播地址,就接受该帧。
对于使用交换机地交换式以太网,交换机收到广播帧后,检测到帧的目的 MAC 地址是广播地址,于是从除该帧进入交换机的接口的其他所有接口转发该帧,网络中其他各主机中的网卡收到该帧后,检测到帧的目的 MAC 地址是广播地址就接受该帧。
从本例可以看出,使用集线器的共享式以太网中的各主机属于同一个广播域,而使用交换机的交换式以太网中的各主机也属于同一个广播域,尽管集线器和交换机对广播帧的转发情况,从效果上看是相同的,但它们的基本原理并不相同,集线器只工作在物理层,它并不能识别帧首部中的目的 MAC地址,因为这属于数据链路层的范畴,不管集线器收到的是单播帧还是广播帧,集线器仅仅是将表示帧的信号从其他所有接口转发出去,而交换机工作在数据链路层,它可以识别帧的结构,从帧首部中提取出目的 MAC 地址,然后查找自己的转发表。根据查表结果,对帧进行明确转发或盲目转发或丢弃。
3、多对主机间同时通信的情况
假设主机 A 给 B 发送单播帧的同时,主机 C 给 D 也发送单播帧。对于使用集线器的共享式以太网,当多对主机同时通信时,必然会产生碰撞,遭遇碰撞的帧,会传播到网络中的各主机,各主机中的网卡检测到遭遇碰撞的帧后将其丢弃。
对于使用交换机的交换式以太网,由于交换机对收到的帧进行存储转发,并且能实现多对接口的高速并行交换,因此不会产生碰撞。A 发送给 B 的单播帧,以及 C 发送给 D 的单播帧,都会被交换机正确转发,主机 B 和 D 中的网卡,接受各自收到的单播帧。
如图所示,两个独立的共享式以太网,它们各自既是一个独立的广播域,也是一个独立的碰撞域,若用集线器将这两个独立的共享式以太网连接起来,则会形成一个具有更大广播域和碰撞域的共享式以太网。换句话说,使用集线器扩展共享式以太网既扩大了广播域,也扩大了碰撞域。
若用交换机将这两个独立的共享式以太网连接起来,则会形成一个具有更大广播域,但原本对立的两个碰撞域,仍被交换机隔离的以太网,换句话说使用交换机扩展共享式以太网,扩大了广播域,但隔离了碰撞域。
交换式以太网的网络性能远高于共享式以太网,集线器早已被交换机取代。
以太网 V2的数据链路层,将封装好的 MAC 帧交付给物理层进行发送,物理层在发送 MAC
帧之前,还要在其前面添加8字节的前导码,前导码中的前7个字节为前同步码,作用是使
接收方的时钟同步,之后的1字节为帧的开始符,表明其后面紧跟着的就是以太网帧。
接收方可能收到的无效 MAC 帧包括以下几种:
接收方收到无效的MAC帧时,就简单将其丢弃,以太网的数据链路层没有重传机制。
01 虚拟局域网VLAN的诞生背景
将多个站点通过一个或多个以太网交换机连接起来就构建出了交换式以太网。交换式以太网中的所有站点都属于同一个广播域。随着交换式以太网规模的扩大,广播域也相应扩大。巨大的广播域会带来一系列问题:广播风暴、难以管理和维护,带来潜在的安全问题。
广播风暴:假设网络中的某个主机要给另一个主机发送一个数据帧,但是在自己的 ARP 高速缓存表中,无法查到目的主机的 MAC 地址,于是首先要发送 ARP 广播请求来获取目的主机的 MAC 地址,该 ARP 广播请求会传遍整个网络,网络中的其他所有主机都可以收到该广播,这种情况就是所谓的广播风暴。
TCP/IP协议栈中的很多协议都会使用广播:地址解析协议ARP、路由信息协议RIPv1、动态主机配置协议DHCP
NetBEUI:Windows下使用的广播型协议
IPX/SPX:Novell网络的协议栈
Apple Talk:Apple公司的网络协议栈
02 虚拟局域网VLAN概述
如图所示:一楼,二楼,三楼分别有一个局域网,可将它们通过另外一个交换机连成一个更大的局域网。那么原来每一个局域网成为现在这个局域网的一个网段。网络中的各主机属于同一个广播域,某个主机发送的广播数据包,其他所有主机都可以收到,根据应用需求,我们将该局域网划分为两个 VLAN:VLAN1 和 VLAN2,此后,VLAN1 中的广播数据包不会传送到 VALN2,VLAN2 中的广播数据包也不会传送到 VALN1,也就是说,同一个 VLAN 内部可以广播通信,不同 VLAN 之间不能广播通信。
03 虚拟局域网VLAN的实现机制
虚拟局域网VLAN有多种实现技术,最常见的就是基于以太网交换机的接口来实现VLAN。这就需要以太网交换机能够实现以下两个功能:
IEEE 802.1Q帧也称为Dot One Q帧,它对以太网V2的MAC帧格式进行了扩展:在源地址字段和类型字段之间插入了4字节的VLAN标签(tag)字段。
802.1Q帧一般不由用户主机处理,而是由以太网交换机来处理:
Access接口:
假设主机 A 发送一个广播帧:该帧从交换机的端口 1 进入交换机。由于端口 1 的类型是 Access,它会对接收到的“未打标签“的普通以太网 MAC 帧”打标签“,也就是插入 4 字节 VLAN 标记字段,字段中的 VID 取值与端口的 PVID 取值相等。由于端口 1 的 PVID 值等于 1,因此,所插入的 4 字节 VLAN 标记字段中的 VID的值也等于 1。
对于本例,广播帧中的 VID 的取值与端口 2,3,4 的 PVID 取值都等于 1,因此,交换机会
从这三个端口对帧进行“去标签“转发。
主机 A 发送广播帧的情况:该帧从交换机的端口 1 进入交换机,由于端口 1 的类型是Access,它会对收到的“未打标签“的普通以太网 MAC 帧”打标签“,也就是插入 4 字节的VLAN 标记字段。由于端口 1 的 PVID 值等于 2,因此,所插入的 4 字节 VLAN 标记字段中的 VID的值也等于 2,广播帧中的 VID 的取值与端口 2 的 PVID 取值都等于 2,因此,交换机会从端口 2 对帧进行“去标签“转发。
主机 C 发送广播帧的情况,该帧从交换机的端口 3 进入交换机。由于端口 3 的类型是Access,它会对接收到的“未打标签“的普通以太网 MAC 帧”打标签“,也就是插入 4 字节的 VLAN 标记字段,如图所示,由于端口 3 的 PVID 值等于 3,因此,所插入的 4 字节VLAN 标记字段中的 VID 的值也等于 3。广播帧中的 VID 的取值与端口 4 的 PVID 取值都等于 3,因此,交换机会从端口 4 对帧进行”去标签“转发。
Trunk接口:
假设主机 A 发送了一个广播帧,该帧从交换机 1 的端口 1 进入交换机,由于端口 1 的类型是 Access,它会对接收到的“未打标签“的普通以太网 MAC 帧”打标签“,也就是插入 4 字节的 VLAN 标记字段,由于端口 1 的 PVID 值等于 1,因此,所插入的 4 字节 VLAN 标记字段中的 VID的值也等于1,该广播帧中的VID的取值与端口2的PVID值都等于1,端口2的类型是Access,因此,交换机 1 会从端口 2 对帧进行“去标签“转发,该广播帧中的 VID 的取值与端口 5 的PVID 值都等于 1,端口 5 的类型是 Trunk,因此,交换机 1 会从端口 5 对帧进行”去标签“转发,很显然,该广播帧会从交换机 2 的端口 5 进入交换机 2。
对于本例,交换机 2 会对接收到的“未打标签“的普通以太网 MAC 帧”打标签“,也就是插入 4
字节的 VLAN 标记字段。由于端口 5 的 PVID 值等于 1,因此,所插入的 4 字节VLAN 标记字段中的 VID 的值也等于 1,该广播帧中的 VID 的取值与端口 1 和 2 的 PVID 值都等于 1,端口 1 和 2 的类型都是 Access,因此,交换机 2 会从端口 1 和 2 对帧进行”去标签“转发。
主机 C 发送广播帧的情况:该帧从交换机 1 的端口 3 进入交换机。由于端口 3 的类型是 Access,它会对接收到的“未打标签“的普通以太网 MAC 帧”打标签“,也就是插入 4 字节的 VLAN 标记字段。由于端口 3 的 PVID 值等于 2,因此,所插入的 4 字节VLAN 标记字段中的 VID 的值也等于 2,该广播帧中的 VID 的取值与端口 4 的 PVID 值都等于 2,端口 4 的类型是 Access,因此,交换机 1 会从端口 4 对帧进行”去标签“转发,该广播帧中的 VID 的取值与端口 5 的 PVID 值不相等,由于 Trunk 端口对 VID 不等于 PVID 的帧是直接转发的,因此,交换机 1 会从端口 5 对帧直接转发。该广播帧中的 VID 的取值与端口 3 和 4 的 PVID 值都等于 2,端口 3 和 4 的类型都是 Access类型,因此,交换机 2 会从端口 3 和 4 对帧进行“去标签“转发。
4、40/100吉比特以太网
1、有固定基础设施的802.11无线局域网
如图所示:这是 802.11 无线局域网的有固定基础设施的组网方式,采用星型网络拓扑,位于其中心的基站被称为接入点,其英文缩写词为 AP。802.11 无线局域网的最小构件,称为基本服务集,其英文缩写词为 BSS,在一个 BSS 中,包含有一个 AP 和若干个移动站,本 BSS 内各站点之间的通信,以及与本 BSS 之外的站点之间的通信,都必须经过本 BSS 内的 AP 进行转发。
一个 BSS 可以是孤立的,也可以通过一个分配系统与其他 BSS 连接,这样就构成了一个扩展的服务集。分配系统的英文缩写词为 DS,扩展的服务集的英文缩写词为 ESS,DS 最常用的以太网,也可使用点对点链路或其他无线网络,ESS 还可为无线用户提供到其他非 802.11无线局域网的接入,例如通过 DS 有线连接到因特网。
假设 BSS1 中的移动站 A,要给 BSS2中的移动站 B 发送数据,则必须经过 API DS AP2,最终将数据转发到移动站 B。
若移动站 A 从 BSS1 漫游到 BSS2,在漫游过程中移动站 A 的接入点从 BSS1 中的 AP1 改为了 BSS2 中的 AP2,但移动站 A 仍然可保持与移动站 B 的通信。
被动扫描:AP 会周期性地发出信标帧,而移动站被动等待接收信标帧:
主动扫描:移动站主动发出探测请求帧,然后等待来自 AP 地探测响应帧
2、无固定基础设施的802.11无线局域网–自组织网络(ad hoc Network)
自组织网络并没有预先建立的固定基础设施,例如基站或接入点 AP,它是由一些对等地移动站点构成的临时网络。数据在自组织网络中被多跳存储转发,例如,这是该自组织网络中的某个源站 A,和目的站 E,它们之间的通信需要经过移动站 B,移动站 C,以及移动站 D 的存储转发,最终到达目的地 E。移动站 B C D,成为了移动站 A 与 E 之间通信的转发站,显然,转发站需要具备路由功能,自组织网络有其特定的路由选择协议,一般不能和因特网直接相连,需要通过网关或协议转换器接入到因特网。
802.11无线局域网的物理层非常复杂,依据工作频段、调制方式、传输速率等,可将其分为多种物理层标准:
802.11无线网卡一般会被做成多模的,以便能适应多种不同的物理层标准,例如支持802.11b/g/n
无线局域网最初还使用红外技术(infrared,IR)和跳频扩频(Frequency Hopping Spread Spectrum,FHSS)技术。
802.11无线局域网不采用“碰撞检测CD”的原因如下:
隐蔽站问题:在理想情况下,无线电波的传播范围,是以发送站为圆心的一个圆形面积。从信号覆盖范围可以看出,A 无法检测到 B 发送的信号,B 也无法检测到 A 发送的信号。
假设 A 和 B 同时向接入点 AP 发送数据,这必然会产生碰撞,然而,根据无线信道的信号传播特点,碰撞信号的强度比较弱,即使分别传播到了 A 和 B,A 和 B 也无法检测到极度微弱的碰撞信号,这种问题就称为隐蔽站问题。
如图所示,横坐标为时间,纵坐标表示 802.11 无线局域网中的各站点,假设信道是空闲的,源站要发送它的第 1 个数据帧,若检测到信道空闲,则在等待 DIFS 间隔后才能发送,DIFS是指 DCF 帧间间隔。等待DIFS间隔是考虑到可能有其他的站有高优先级的帧要发送。
本例假设现在没有其他高优先级帧要发送,因而源站就发送了自己的数据帧,目的站若正确收到该帧,则经过 SIFS 间隔后,向源站发送确认帧 ACK,若源站在重传计时器设置的超时时间内,没有收到 ACK,就必须重传之前已发送的数据帧,直到收到 ACK 为止,或者经过若干次的重传失败后,放弃发送。
由于无线信道的误码率较高,CSMA/CA协议还需要使用停止-等待的确认机制来实现可靠传输,这与使用CSMA/CD协议的共享式以太网不同。
在 NAV 这段时间内,若其他站也有帧要发送,就必须推迟发送,在 NAV 这段时间结束后,
再经过一个 DIFS 间隔,然后还要退避一段随机时间后,才能发送帧。
当且仅当检测到信道空闲并且这个数据帧是要发送的第一个帧时,才不使用退避算法,其他所有情况都必须使用退避算法,具体为:在发送第一个帧前检测到信道忙、每次重传、每次成功发送后要发送下一帧。
举例说明CSMA/CA 协议的退避算法,如图所示,横坐标为时间,纵坐标表示 802.11无线局域网中的各站点。
为了进一步降低发生碰撞的概率,802.11无线局域网允许源站对信道进行预约。
假设信道是空闲的,源站要发送它的第一个数据帧,若检测到信道空闲,则在等待 DIFS 帧间间隔后,先发送一个 RTS 帧,若目的站正确收到源站发来的 RTS 帧,在检测到信道空闲,且经过帧间间隔 SIFS 后,就向源站发送一个 CTS 帧作为响应,源站正确收到 CTS 帧后,在等待一个帧间间隔 SIFS 后,就可发送第一个数据帧了,目的站若正确收到该帧,则经过 SIFS 间隔后,向源站发送确认帧 ACK,除源站和目的站的其他各站,在收到 CTS 帧或数据帧后,就推迟访问信道,这样就确保了源站和目的站之间的通信不会受到其他站的干扰,若 RTS 帧发生碰撞,源站就不可能收到CTS帧,源站会执行退避算法重传RTS帧。
802.11无线局域网为用户提供了以下三种选择:
❶ 使用RTS帧和CTS帧;
❷ 只有当数据帧的长度超过某个数值时才使用RTS帧和CTS帧;
❸ 不使用RTS帧和CTS帧。
如图所示:A 和 B 互为隐蔽站,A 给 AP 发送 RTS 帧进行信道预约,虽然 B 监听不到该帧,但却能监听到 AP 应答给 A 的 CTS 帧,B 根据 CTS 帧中的持续时间,修改自己的网络分配向量 NAV,在 NAV 指示的时间内,虽然B 监听不到 A 发送给 AP 的帧,但 B 也不会发送帧干扰 A 和 AP 的通信。
802.11 无线局域网的 MAC 帧的格式比较复杂,本节课仅介绍其数据帧中的一些重要字段,如图所示,这是 802.11 无线局域网的数据帧格式,它由 30 字节的帧头,0~2312 字节的数据,以及 4 字节的帧尾这三部分组成。
1、帧头中包含有相关控制信息和地址信息。其中比较重要的控制位有去往DS 和来自 DS 控制位,它们用于控制帧头中地址 1–地址 4 这四个字段的内容和使用情况,DS 是分配系统的英文缩写词。
2、类型和子类型控制位,用于区分不同类型的帧,802.11 共有数据帧,控制帧和管理帧三种类型,而每种类型又分为若干种子类型。
3、有线等效保密 WEP控制位,用于指示是否使用了 WEP 加密算法,WEP 表明,使用在无线信道上的这种加密算法,在效果上可以和在有线信道上进行通信一样保密。
4、数据部分主要用来存放上层交付下来的待传送的协议数据单元,尽管数据载荷的最大长度为 2312 字节,但通常 802.11 无线局域网的数据帧的长度都不超过 1500 字节。
5、帧尾用于存放帧检验序列,采用CRC 检验码,帧头中的帧控制字段,是最复杂的字段。
6、持续期
7、序号控制
8、地址
注:地址1是直接要去的那个地址(直接目的),地址2是直接过来的那个地址(直接来源),地址3就是另外一个地址(最终目的/来源)。
举例说明:
①基本服务集 BSS1 中的站点 A 给 B 发送数据帧。
②若站点 A 要向位于 DS 的路由器 R 发送数据帧,这与站点 A 向 B 发送数据帧的情况类似。
A 需要把数据帧发送给 AP1,由于 DS 是以太网,因此 AP1会将 802.11 帧转换成以太网帧转发给 R,这时,以太网首部中的源地址和目的地址,分别是 A 和 R 的 MAC 地址。
③当 R 给 A 发回响应帧时,以太网帧首部中的源地址和目的地址分别是 R 和 A 的 MAC 地址,AP1 收到该以太网帧后,会将其转换成 802.11 帧转发给 A。可见,AP 具有网桥功能,注意802.11 帧中必须要携带 AP 的 MAC 地址,而以太网帧中却不需要携带 AP 的 MAC 地址,在以太网中,AP 与透明网桥一样,对各站点是透明的,因此以太网帧中就不需要指出 AP 的 MAC 地址,然而在 802.11 无线局域网中,在站点的信号覆盖范围内,可能会有多个 AP 共享同一个物理信道,但站点只能与其中的一个 AP建立关联,因此,802.11 帧中,就必须携带 AP 的 MAC 地址,来明确指出转发该帧的 AP。
01 分组转发和路由选择
网络层的主要任务就是将分组从源主机经过多个网络和多段链路传输到目的主机,可以将该任务划分为分组转发和路由选择两种重要的功能。
如图所示:这些异构型网络如果只是需要各自内部通信,那它们只需要实现各自的物理层和数据链路层即可,但是,如果需要将这些异构型网络互连起来,形成一个更大的互联网,就需要使用网络互连设备路由器。假设主机 A 是网络 N1 中的主机,主机 B是网络 N3 中的主机。
为了简单起见,有时我们可以不用画出这些网络,而将它们看作是一条链路即可。假设主机 A 给主机 B 发送分组,路由器 R1 收到后对其进行转发,从该网络拓扑可以看出,R1 可将该分组从自己的接口 2 转发,也可将该分组从自己的接口 3 转发。
R1如何知道应从自己的哪个接口转发分组?答案是转发表,路由器在自己的转发表中查找该分组的目的地址,以便对其按照查表结果进行转发。
那么转发表又是如何得来的呢?答案是路由表,那么路由表又是如何得来的呢?它是由路由器的路由选择处理机执行路由选择协议,并与其他相关路由器交换路由信息后得来的,如果网络拓扑比较简单,也可通过在路由器命令行输入命令的方式,对路由表进行静态配置。
注意,路由表需要对网络拓扑变化的计算最优化,而转发表是从路由表得出的,转发表的结构应当使查找过程最优化。为了简单起见,本课程在讨论路由选择的原理时,并不严格区分路由表和转发表,而是以路由表来表述问题。
02 网络层向其上层提供的两种服务
虚电路表示这是一条逻辑上的连接,分组沿着这条逻辑连接按照存储转发方式传送,而不是真正建立了一条物理连接。
而采用电路交换的电话通信,则是先建立一条真正的物理连接。因此,分组交换的虚连接与电路交换的连接只是类似,但并不完全一样。
分组的首部仅在连接建立阶段使用完整的目的主机地址,之后每个分组的首部只需要携带一条虚电路编号即可。
这种通信方式如果再使用可靠传输的网络协议,就可使所发送的分组最终正确(无差错按序
到达、不丢失、不重复)到达接收方。
很多广域分组交换网都使用面向连接的虚电路服务。例如,曾经的X.25和逐渐过时的帧中继(Frame Relay,FR)、异步传输模式(Asynchronnous Transfer Mode,ATM)。
这种通信方式所传送的分组可能误码、丢失、重复和失序。
在因特网所采用的 TCP/IP 体系结构中,网际层向其上层提供的是简单灵活的,无连接的尽最大努力交付的数据报服务,
这是四层 TCP/IP 体系结构,网络接口层支持各种网络接口,网际协议 IP 是 TCP/IP 体系结构网际层中的核心协议,网际协议 IP 可以互连各种不同的网络接口,TCP 和 UDP 是运输层中的两个重要协议,TCP 为应用层中的某些协议提供可靠传输服务,而 UDP 为应用层中的某些协议提供不可靠传输服务,TCP 和 UDP 都是用网际协议 IP 提供的不可靠传输服务。由于网际协议 IP 是 TCP/IP 体系结构网络层中的核心协议,因此 TCP/IP 体系结构的网络层,常被称为网际层或 IP 层。在网际层中与 IP 协议配套使用的还有四个协议,分别是网际控制报文协议 ICMP,网际组管理协议 IGMP,逆地址解析协议 RARP,地址解析协议 ARP,在网际层中,RARP 和 ARP 画在 IP 下面,这时因为 IP 协议经常要使用这两个协议,ICMP 和 IGMP画在 IP 的上面,因为它们要使用 IP 协议。RARP 现在已被淘汰不使用了。
01 IPv4地址概述
IPv4地址是给因特网(Internet)上的每一个主机(或路由器)的每一个接口分配的一个在全世界范围内唯一的32比特的标识符。
由于IPv4地址由32比特构成,不方便阅读、记录以及输入等,因此IPv4地址采用点分十进制表示方法以方便用户使用。
02 IPv4地址的表示
注:8位无符号二进制整数转十进制数和十进制正整数转8位无符号二进制数见计算机组成原理第二章。24考研王道计算机组成原理笔记
03 IPv4地址的分类编址方法
解析:首先应该找出图中都有哪些网络。左边两个网络,右边三台交换机在一起也组成了一个网络,不要忘记,两台路由器通过一段链路直连,它们的直连接口也属于同一个网络,之后,可以根据各网络中主机和路由器接口总数量来决定各网络分配哪个类别的网络号。左上角的网络的主机数量为 655334,加上一个路由器接口,需要可分配的 IP 地址数量为65535,只能该网络分配一个 A 类网络号;左下角的网络的主机数量为 254,加上一个路由器接口,需要可分配的 IP 地址数量为 255,可以给网络分配一个 A 类或 B 类网络号,本着节约IP 地址的原则,给该网络分配一个 B 类网络号;右边网络的主机数量为 40,再加上一个路由器接口,需要可分配的 IP 地址数量为 41,给该网络分配一个 A 类,B 类或 C 类网络号都可以,本着节约 IP 地址的原则,给该网络分配一个 C 类网络号;中间连接的网络没有主机,只有两个路由器接口,需要可分配的 IP 地址数量为 2,给该网络分配一个 A 类,B 类或 C 类网络号都可以,本着节约 IP 地址的原则,给该网络分配一个 C 类网络号;依据网络号的类别,为每一个网络挑选一个网络号,A 类网络号的取值范围是 1-126,可在该范围内挑选一个网络号分配给这个网络;B 类网络号的取值范围是 128.0-191.255,可在该范围内挑选一个网络号分配给这个网络,C 类网络号的取值范围是 192.0.0~223.255.255,可在该范围内挑选一个网络号分配给这个网络,再挑选另一个分配给这个网络,不同网络的网络号不能相同,网络号分配完毕后就可给各主机和路由器的各接口分配 IP 地址了。需要注意的是,所分配的 IP 地址应该互不相同,并且其主机号部分不能出现“全 0”,因为这是网络地址,也不能出现“全 1”,因为这是广播地址,网络地址或广播地址都不能分配给主机或路由器的各接口,因为它们无法唯一标识一台主机或路由器的某个接口。
04 IPv4地址的划分子网编址方法
IPV4 地址编址方法的第二个历史阶段,也就是划分子网的 IPV4 地址,我们举例说明为什么会出现划分子网这样的需求。
如图所示,某单位有一个大型的局域网需要连接到因特网,如果申请一个 C 类网络地址,其可分配的 IP 地址数量只有 254 个,不够使用,因此该单位申请了一个 B 类网络地址,其可分配的 IP 地址数量达到了 65534 个,给每台计算机和路由器的接口分配一个 IP 地址后,还有大量的 IP 地址剩余,这些剩余的 IP 地址只能由该单位的同一个网络使用,而其他单位的网络不能使用。
随着该单位计算机网络的发展和建设,该单位又新增了一些计算机,并且需要将原来的网络划分成三个独立的网络,我们称其为子网 1,子网 2 和子网 3。假设子网 1 仍然使用原先申请到的 B 类网络地址,那么就需要为子网 2 和子网 3 各自申请一个网络地址,但这样会产生一些弊端:申请新的网络地址需要等待很长的时间并且要花费更多的费用;即便申请到了两个网络地址,这也会使其他路由器的路由表新增针对这两个新的网络的路由记录;另外,这样还会浪费原有网络中剩余的大量 IP 地址。
如果可以从 IP 地址的主机号部分借用一些位为子网号来区分不同的子网,就可以利用原有网络中剩余的大量 IP 地址,而不用申请新的网络地址。例如,对于本例,我们可以借用 16 位主机号中的 8 位作为子网号,假设我们给子网 1 分配的子网号为 0,给子网 2 分配的子网号为 1,给子网 3 分配的子网号为 2,之后,就可以给各自子网中的主机和路由器接口分配 IP 地址了。
如果未在图中标记子网号部分,那么我们或计算机又如何知道在分类地址中,主机号有多少比特被借用作为子网号了呢?这样我们就引出了一个划分子网的工具,他就是子网掩码。
将划分子网的IPv4地址与相应的子网掩码进行逐比特的逻辑与运算,就可得到该IPv4地址所在子网的网络地址。这样,网络号和子网号被保留,而主机号被清零 ,结果为 IP 地址所在子网的网络地址。
只要给定了一个分类的IPv4地址及其相应的子网掩码,就可以得出子网划分的全部细节。
分析:题目给定网络地址为 218.75.230.0,从它的左起第一个十进制数可知,这是一个 C 类网络地址,因此网络号占三个字节,主机号占一个字节。
218.75.230.0 是该网络上的第一个地址,由于这是一个 C 类网地址,因此网络号占 3 个字节,主机号占 1 个字节,将网络号保持不变,而主机号取最大值 255,这就是该网络上的最后一个地址。该 C 类网共有256 个地址,其中第一个地址作为该网络的网络地址也就是主机号“全 0”的地址。最后一个地址作为该网络的广播地址,也就是主机号“全 1”的地址。
之前分析过题目所给的子网掩码表明从主机号部分借用 1 比特作为子网号,也就是将该 C 类网均分为两个子网。我们将主机号写成 8比特的形式,从主机号借用 1 个比特作为子网号,子网号只能是 0 或 1。使用子网掩码255.255.255.128 可将 C 类网 218.75.230.0 均分为两个子网。
无分类编址方法使用的地址掩码与划分子网使用的子网掩码类似,由32比特构成。用左起多个连续的比特1对应IPv4地址中的网络前缀;之后的多个连续的比特0对应IPv4地址中的主机号。
为了简便起见,可以不明确给出配套的地址掩码的点分十进制形式,而是在无分类编址的IPv4地址后面加上斜线“/”,在斜线之后写上网络前缀所占的比特数量(也就是地址掩码中左起连续比特1的数量),这种记法称为斜线记法。
实际上,无分类域间路由选择CIDR是将网络前缀都相同的、连续的多个无分类IPv4地址,组成一个CIDR地址块,只要知道CIDR地址块中的任何一个地址,就可以知道该地址块的以下全部细节:
这是题目给出的地址块,斜线后面的数字为 20,表明该 IPV4 地址的前 20 个比特为网络前缀,也就是说所给地址左起第一个字节,第二个字节以及第三个字节的前 4 个比特,构成 20 比特的网络前缀,剩余12 个比特为主机号,因此,我们需要将该地址的第三个字节和第四个字节转换成二进制的形式,这样,我们就可以很容易看出 20 比特的网络前缀和 12比特的主机号。
如图所示:路由器 R1 与 5 个网络以及路由器 R2 直接相连。路由器 R1 和 R2 互为相邻路由器,它们周期性地通告自己所知道的路由信息给对方。
R1 应该怎样地将路由信息通告给 R2 呢?如果 R1 将自己直连的这五个网络的路由记录都通告给 R2,则 R2 的路由表会增加 5 条路由记录。为了减少路由记录对路由表的占用,能否将这 5 条记录聚合成 1 条呢?答案是肯定的,其方法是“找共同前缀”,也就是找出这 5 个目的网络地址的共同前缀。这 5 个目的网络地址的左起前两个字节都是相同的,从第三个字节开始不同,因此,只需将第三个字节转换成二进制形式,这样就可以很容易找出这 5 个目的网络地址的共同前缀,共 22 个比特,我们将其记为“/22”。将共同前缀保持不变,而剩余的 10 个比特全部取 0,然后写成点分十进制形式,放在“/22”前面。这就是聚会后的地址块,也可以称为超网。
IPv4地址的应用规划是指将给定的IPv4地址块(或分类网络)划分成若干个更小的地址块(或子网),并将这些地址块(或子网)分配给互联网中的不同网络,进而可以给各网络中的主机和路由器的接口分配IPv4地址。
01 使用定长子网掩码划分子网
用三个十进制数 255 来对应网络号部分,也就是用 24 个连续的比特 1 来对应网络号,而最后 8 个比特为 11100000,其中 3 个连续的比特 1 表示从主机号部分借用 3 个比特作为子网号,将这 8 个比特写为十进制数为 224。
这是子网1和子网2的细节,以此类推 ,我们可以得到划分子网的全部细节。
现在我们就可以从子网 1-8 中任选 5 个分配给图中的网络 1~5,通过本例可以看出,采用定长的子网掩码进行子网划分,只能划出 2^n 个子网,其中 n 是从主机号部分借用的用来作为子网号的比特数量,每个子网所分配的 IP 地址数量相同,容易造成 IP 地址的浪费,例如图中的网络 5 只需要 4 个 IP 地址,但是我们只能给它分配 32 个 IP 地址,这样就造成了 IP 地址的严重浪费。
02 使用变长子网掩码划分子网
既然网络 1 需要 9 个地址,那么分配给网络 1 的地址的主机号应为 4 个比特,因为 2^4 等于 16,这样网络 1 就可有 16 个地址,由于使用 4 个比特作为主机号,因此剩余 28 个比特可作为网络前缀;
既然网络 2 需要 28 个地址,那么分配给网络 2 的地址的主机号应为 5 个比特,因为 2^5 等于 32,这样网络 2 就可有 32 个地址,由于使用 5 个比特作为主机号,因此剩余 27 个比特可作为网络前缀。
01 IPv4地址与MAC地址的封装位置
如图所示,这是 TCP/IP 的四层体系结构,这是某个应用层协议封装的应用层报文,也称为应用层协议数据单元。
02 数据报传送过程中IPv4地址与MAC地址的变化情况
如图所示,这是三个局域网通过两个路由器互传起来的小型互联网,为了简单起见,图中各主机和路由器接口的 IP 地址和 MAC 地址,都用比较简单的标识符来表示,而并未使用实际的 IP 地址和MAC地址,请同学们注意,主机一般只有 1 个接口,因此需要 1 个 IP 地址和 1 个 MAC 地址,而路由器最少有 2 个接口,而每个接口需要 1 个IP 地址和 1 个 MAC 地址。
这是一个小型交换式以太网,为了简单起见,我们仅画出了该网络中的三台主机,这是它们各自所配置的 IP 地址,和其网卡上固化的 MAC 地址。假设主机 A 要给主机 B 发送一个分组,主机 A 知道主机 B 的 IP 地址,然而主机 A 不知道主机 B 的 MAC 地址,因此,主机 A 的数据链路层在封装以太网帧时,无法填写目的 MAC 地址,实际上,每台主机都会维护一个 ARP 高速缓存表,ARP 高速缓存表中,记录了 IP 地址和 MAC 地址的对应关系。
主机 A 的 ARP 高速缓存表中的第一条记录是主机 A 之前获取到的主机 C 的IP 地址与 MAC 地址的对应关系,当主机 A 要给主机 B 发送分组时,会首先在自己的 ARP 高速缓存表中,查找主机 B 的 IP 地址所对应的 MAC 地址,但未找到。
于是主机 A 发送 ARP 请求报文来获取主机 B 的 MAC 地址,ARP 请求报文是广播报文,需要封装在以太网帧中发送,帧的目的 MAC 地址为广播地址,也就是 48 比特为全 1,十六进制为全 F 形式的地址。
为了简单起见,我们用简单的语言来描述 ARP 请求报文的内容,实际上 ARP 请求报文有其具体的格式。交换机收到封装有该 ARP 请求报文的以太网广播帧后,将其从自己的其他所有接口转发出去,这样,主机 B 和 C 都可以收到该广播帧,主机 C 的网卡收到该广播帧后,将其所封装的 ARP 请求报文送交上层处理,上层的 ARP 进程解析该ARP 请求报文,发现所询问的 IP 地址不是自己的地址,因此不予理会。主机 B 的网卡收到该广播帧后,将其所封装的 ARP 请求报文送交上层处理,上层的 ARP 进程解析该 ARP 请求报文,发现所询问的 IP 地址正是自己的 IP 地址,需要进行响应,主机 B 首先将 ARP 请求报文中所携带的主机A 的 IP 地址与 MAC 地址记录到自己的 ARP 高速缓存表中,然后给主机 A 发送 ARP 响应报文,以告知自己的 MAC 地址。
主机 B 给主机 A 发送 ARP 响应报文,ARP 响应报文是单播报文,需要封装在以太网帧中发送,帧的目的 MAC 地址为主机 A 的 MAC 地址,交换机收到封装有该 ARP 响应报文的以太网单播帧后,将其明确转发给主机 A,主机 A 的网卡收到该单播帧后,发现其目的 MAC 地址就是自己的 MAC 地址,于是接受该单播帧并将其所封装的 ARP 响应报文,送交上层处理,上层的 ARP 进程解析该 ARP 响应报文。
将其所包含的主机 B 的 IP 地址与 MAC 地址记录到自己的 ARP 高速缓存表中,主机 A 现在可以给主机 B 发送分组了。
需要说明的是,ARP 高速缓存表中的每一条记录都有其类型,分为动态和静态两种。
注意,ARP协议被用来解决同一个局域网上的主机或路由器的 IP 地址和 MAC 地址的映射问题,不能跨网络使用。
例如下图所示,主机 H1和 H2之间有路由器 R1和 R2共2个路由器,当主机 H1要给主机 H2发送分组时,不能跨网络使用 ARP,而是要逐段链路或逐个网络使用 ARP。
ARP协议的相关注意事项:
IP数据报的发送和转发过程包含以下两个过程:
如图所示:路由器 R 的接口0连接了一个由交换机 S1和3台主机互连而成的交换式以太网,记为以太网1;路由器 R 连接了一个由交换机 S2和3台主机互连而成的另一个交换式以太网,记为以太网2。假设以太网1分配到的 CIDR 地址块为192.168.0.0/25;以太网2的 CIDR 地址块为192.168.0.128/25,我们从这两个 CIDR 地址块中,选择可分配给主机或路由器接口的 IP 地址,分别分配给这两个网络中各主机和路由器的各接口。
同一个网络中的主机之间可以直接通信,这属于直接交付,不同网络中的主机之间的通信,需要通过路由器来中转,这属于间接交付,那么源主机如何判断出目的主机是否与自己在同一个网络中呢?
假设主机 C 要给主机 F 发送 IP 数据报,主机 C 知道主机 F 的 IP 地址,于是将主机 F 的 IP 地址的前25个比特取出,与主机 C 自己的 IP 地址的前25个比特的网络前缀进行比较,我们将主机 C 的 IP 地址的左起第4个十进制数转换成8个二进制比特,将主机 F 的 IP 地址的左起第4个十进制数也转换成8个二进制比特,可以发现,它们的IP 地址的左起前25个比特并不完全相同,这就表明,主机 C 与 F 不在同一个网络,换句话说,从主机 C 所配置的 IP 地址可以看出,其网络前缀为25个比特,因此,如果主机 F 要与主机 C 处于同一个网络,则主机 F 的 IP 地址的前25个比特,必须与主机 C 的相同,而剩余7个比特主机号必须不同,综上所述,主机 C 给主机 F 发送 IP 数据报,这属于间接交付,也就是说,主机 C 给主机 F 发送 IP 数据报,需要经过路由器的转发。
那么,主机 C 又是如何知道需要将 IP 数据报交给哪个路由器来转发呢?实际上,用户为了让本网络中的各主机能与其他网络中的各主机进行通信,就必须给本网络中的各主机指定本网络中的一个路由器,由该路由器帮忙进行转发,所指定的路由器也就被称为默认网关。对于本例,我们可以将路由器接口0的 IP 地址指定给该接口所直连网络中的各主机作为默认网关。同理,可将路由器接口1的 IP 地址指定给该接口所直连网络中的各主机作为默认网关,这样,当本网络中的主机要和其他网络中的主机进行通信时,会将 IP 数据报发送给默认网关,由默认网关主机将 IP 数据报转发出去。
假设本例中的主机 A 要给主机 D 发送 IP 数据报,这属于间接交付,主机 A 会将该 IP 数据报发送给自己的默认网关,也就是图中所示的路由器,那么当路由器收到 IP 数据报后,又是如何进行转发的呢?路由器首先会检查收到的 IP 数据报是否正确,例如该 IP 数据报的生存时间是否结束,首部是否出现了误码等,若不正确,则丢弃该 IP 数据报,并向发送该 IP 数据报的源主机发送相应的 ICMP 差错报告。假设该 IP 数据报没有出现差错,路由器基于 IP 数据报首部中的目的 IP 地址在自己的路由表中,查找匹配的路由条目,若找到匹配的路由条目,则按该路由条目的指示进行转发,否则丢弃该 IP 数据报,并向发送该 IP 数据报的源主机发送相应的 ICMP 差错报告。
该 IP 数据报首部中,源 IP 地址192.168.0.1是主机 A 的 IP 地址,而目的 IP 地址192.168.0.129是主机 D 的 IP 地址。在我们给路由器的接口0配置 IP 地址和地址掩码后,路由器就可自行得出自己的接口0所直连网络的网络地址(对于给定CIDR 形式的 IP 地址192.168.0.126/25,可以找出该地址所在地址块的最小地址,也就是网络地址和最大地址,也就是广播地址。只要给路由器编写相应的程序,路由器也能具备该能力)。
综上所述,路由器可自行得出接口0的直连网络路由条目,目的网络为192.168.0.0,相应的地址掩码为255.255.255.128,不需要下一跳路由器因为该目的网络与接口0是直连的;同理,在我们给路由器的接口1配置 IP 地址和地址掩码后,路由器可自行得出接口1的直连网络路由条目,目的网络为192.168.0.128,相应的地址掩码为255.255.255.128,不需要下一跳路由器因为该目的的网络与接口1是直连的。需要说明的是路由表中可能还会有其他路由条目,这可能是用户或网络管理员手工配置的静态路由条目,也可能是路由器通过路由选择协议,自动获取到的动态路由条目。
路由器根据 IP 数据报的目的 IP 地址,在自己的路由表中查找匹配的路由条目,将 IP 数据报的目的地址192.168.0.129与第1条路由条目中的地址掩码255.255.255.128,进行逐比特逻辑与运算,得到网络地址192.168.0.128,该网络地址与第1条路由条目中的目的网络地址192.168.0.0不相同,因此第1条路由条目不匹配。
将 IP 数据报的目的地址192.168.0.129与第2条路由条目中的地址掩码255.255.255.128进行逐比特逻辑与运算,得到网络地址192.168.0.128,该网络地址与第2条路由条目中的目的网络地址192.168.0.128,因此第2条路由条目匹配,路由器根据匹配的路由条目中的下一跳的指示。
从自己的接口1直接交付 IP 数据报给主机 D,路由器只需通过 ARP 协议,获取到与自己的接口处于同一网络中的目的主机 D 的 MAC 地址,就可将 IP 数据报封装成帧后,发送给目的主机 D。
我们再来看路由器对广播 IP 数据报的处理,假设主机 A 发送了一个广播 IP 数据报,该 IP 数
据报首部中目的地址字段的值,可以设置为192.168.0.127,这是主机 A 所在网络的广播地址,也可以设置为受限的广播地址255.255.255.255。主机 A 所在网络中的各主机和路由器的接口0都会收到该广播 IP 数据报,默认情况下,路由器不会对广播IP 数据报进行转发,也就是说路由器是隔离广播域的,试想一下,如果因特网中数量巨大的路由器,收到广播 IP 数据报后都进行转发,则会造成巨大的广播风暴,严重浪费因特网资源。
从主机 H1和主机 H2所配置的 IP 地址的 CIDR 形式可知,它们各自的26比特网络前缀是相同的,因此,H1和 H2属于同一个网络,需要使用交换机将它们互连起来。从主机 H3和主机 H4所配置的 IP 地址的 CIDR 形式可知,它们各自的26比特网络前缀是相同的,因此,H3和 H4属于同一个网络,需要使用交换机将它们互连起来。从主机 H2与 H3所配置的 IP 地址的 CIDR 形式可知,它们各自的26比特网络前缀是不同的,因此,H1和 H2所属的网络与 H3和 H4所属的网络不是同一个网络,因此,需要使用路由器将这两个不同的网络互连,该路由器就是这两个网络的默认网关。
根据我们之前课程所学过的通过给定的某个 CIDR 地址块中的 IP 地址得出该 IP 地址所在CIDR 地址块的全部细节的相关知识,我们还可以得出应该给该路由器的接口 IF1 分配的 IP 地址。同理还可以分析出,主机 H3 发送的是广播 IP 数据报,因此主机 H3 所在网络中的所有主机和路由器接口都能收到该广播数据报。
IP 数据报的首部常以 32 个比特为单位进行描述,图中的每一行都由 32 个比特(也就是 4 个字符)构成。每个小格子称为字段或者域。每个字段或某些字段的组合用来表达 IP 协议的相关功能。
1 版本
长度为4个比特,用来表示IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议的版本号为4(即IPv4)。
2 首部长度
长度为4个比特,该字段的取值以4字节为单位,用来表示IPv4数据报的首部长度。
最小取值为二进制的0101,即十进制的5,再乘以4字节单位,表示IPv4数据报首部只有20字节固定部分。
最大取值为二进制的1111,即十进制的15,再乘以4字节单位,表示IPv4数据报首部包含20字节固定部分和最大40字节可变部分。
3 可选字段
长度从1字节到40字节不等,用来支持排错、测量以及安全措施等功能。
虽然可选字段增加了IPv4数据报的功能,但这同时也使得IPv4数据报的首部长度成为可变的,这就增加了因特网中每一个路由器处理IPv4数据报的开销。实际上,可选字段很少被使用。
4 填充
用来确保IPv4数据报的首部长度是4字节的整数倍,使用全0进行填充。
当首部长度(20字节固定部分+可变部分)的长度不是4字节整数倍时,填充相应数量的全0字节,以确保IPv4数据报的首部长度是4字节的整数倍。
5 区分服务
长度为8个比特,用来获得更好的服务。
该字段在旧标准中叫作服务类型,但实际上一直没有被使用过。
1998年,因特网工程任务组IETF把这个字段改名为区分服务。
利用该字段的不同取值可提供不同等级的服务质量。
只有在使用区分服务时该字段才起作用,一般情况下都不使用该字段。
6 总长度
长度为16个比特,该字段的取值以字节为单位,用来表示IPv4数据报的长度(首部长度+数据载荷长度)。最大取值为二进制的16个比特1,即十进制的65535(很少传输这么长的IPv4数据报)。
7 标识,标志,片偏移
它们共同用于进行 IP 数据报分片,如图所示,网际层封装出的 IP 数据报,它将在数据链路层封装成帧,每一种数据链路层协议都规定了帧的数据载荷的最大长度,称为最大传输单元 MTU,例如,以太网的数据链路层规定 MTU 的值为1500 字节。如果某个 IP 数据报的总长度超过MTU 时,将无法封装成帧,需要将原 IP 数据报分片为更小的 IP 数据报,再将各分片 IP 数据报封装成帧。
举例说明 IP 数据报如何进行分片。假设有这样一个 IP 数据报,它由20字节的固定首部,和3800字节的数据载荷两部分构成,也就是说该 IP 数据报的总长为3820字节,假设使用以太网传送该 IP 数据报,以太网的最大传送单元 MTU 为 1500 字节,也就是以太网的数据载荷部分最大为 1500 字节,无法封装 3820 字节的 IP 数据报,因此需要把该 IP 数据报分片成几个更小的 IP 数据报,每个长度不能大于 1500 字节,然后再将每个分片 IP 数据报封装成一个以太网帧进行传输,为了更好地描述后续地分片工作,我们将原IP 数据报数据载荷部分地每一个字节都编上号,第一个字节编号为 0,最后一个字节编号为3799,我们可将原 IP 数据报地数据载荷分成三个更小地分片,第一个分片从 0 号字节到1399 号字节,共1400 个字节,第二个分片从 1400 号字节到 2799 号字节,共 1400 个字节,第三分片从2800 号字节到 3799 号字节,共 1000 个字节,分片结束后,给每个分片重新添加一个首部,使之成为 IP 数据报,思考这样一个问题:给各分片添加的首部是否完全相同呢?
原 IP 数据报首部中的总长度字段的十进制取值为3800+20,标识为23333,MF 分片的取值为 0,表示后面没有分片数据报,这就是最后一个分片数据报;DF 比特的取值为 0,表示该 IP 数据报准许被分片,由于这是未分片的原 IP 数据报, 因此片偏移为 0。
分片数据报1的数据载荷部分的第一个字节,就是原 IP 数据报数据载荷部分的第一个字节,因此,片偏移字段的取值为 0/8,除以 8 的原因是片偏移字段以 8 字节为单位;
分片数据报2只有片偏移字段的值与分片 1 IP 数据报的不同;
分片数据报3中 1000 字节是分片的长度,20 字节是固定首部的长度,标识字段的十进制取值与原 IP 数据报的相同,由于该分片就是最后一个分片,因此 MF 比特的取值为0,表示该分片后没有其他分片,该分片 IP 数据报准许被再次分片,因此 DF 比特的取值为0,该分片 IP 数据报数据载荷的第一个字节是原 IP 数据报数据载荷中编号为2800的字节,因此片偏移字段的取值为2800/8。
现在假定分片2的 IP 数据报经过某个网络时还需要再进行分片。其中一个分片长度为800字节,另一个分片长度为600字节,分片结束后,给每一个分片重新添加一个首部,使之成为 IP 数据报。
除最后一个分片数据报外,每个分片数据报的数据载荷的长度都必须是8字节的整数倍,否则会造成相邻后续分片数据报的片偏移不是整数。
8 生存时间(Time To Live,TTL)
假设采用如下图所示的网络拓扑,路由器 R1,R2,R3各自的路由表如图所示,为了简单起见,只给出了各路由器路由表中的由人工配置的静态路由条目,例如路由器 R2中的这条静态路由条目,它指出了 IP 数据报要到达网络 2,下一跳需要转发给路由器 R3,假设在人工配置这条静态路由条目时,错将下一跳配置成了 R1,这会导致将去往网络 2的 IP 数据报错误地转发给路由器 R1。
假设某个 IP 数据报从网络 1发往网络 2,该 IP 数据报到达 R1后,R1进行查表转发,发现了匹配的路由条目,其下一跳指示转发给 R2,于是 R1将该 IP 数据报转发给了 R2,R2收到该 IP 数据报后,进行查表转发,发现了匹配地路由条目,其下一跳指示转发给 R1,于是 R2将该 IP 数据报又转发回了 R1,很显然形成了路由环路,如果没有其他措施,IP 数据报将在路由环路中永久兜圈。
9 协议
长度为8个比特,用来指明IPv4数据报的数据载荷是何种协议数据单元PDU。
假设这是使用TCP/IP运输层的TCP协议构建的TCP报文段,运输层将其向下交付给网际层,网际层的IP协议将其作为数据载荷,并为其添加一个IP数据报首部,使之成为IP数据报,首部中协议字段的值被设置为6,用来指明该IP数据报的数据载荷封装的是TCP报文段。
10 首部检验和
11 源IP地址、目的IP地址
源IP地址:长度为32个比特,用来填写发送IPv4数据报的源主机的IPv4地址。
目的IP地址:长度为32个比特,用来填写接收IPv4数据报的目的主机的IPv4地址。
01 静态路由配置
静态路由配置是指用户或网络运维人员使用路由器的相关命令给路由器人工配置路由表。人工配置方式简单、开销小、但不能及时适应网络状态(流量、拓扑等)的变化,一般只在小规模网络中采用。
采用如图所示的网络拓扑和相应的 IP 地址配置,路由器 R1通过自己的接口0所配置的 IP 地址和地址掩码,可以自动得出接口0所在的网络,由于接口0与该网络直连,则下一跳不是路由器地址,而是通过接口0转发 IP 数据报给该网络中的某个主机,这属于直接交付,这条自动得出的路由条目的类型属于直连路由。同理,R1 还可自定得出接口 1 的直连网络路由条目。
假设 R1 要转发一个 IP 数据报给该网络中的某个主机,从图中可以看出,R1 应该将该IP 数据报转发给路由器 R2 的接口 0,但 R1 的路由表中并没有关于该目的网络的路由条目。换句话说,R1 并不知道目的网络的存在。因此,我们可以使用路由器的相关配置命令,给R1 添加一条到达该目的网络的路由条目,下一跳为路由器 R2 的接口 0 的地址,该路由条目是我们人工配置的静态路由。
假设 R2 要转发一个 IP 数据报给该网络中的某个主机,从图中可以看出,R2 应该将该 IP 数据报转发给路由器 R1 的接口 1,但R2 的路由表中并没有关于该目的网络的路由条目。因此我们可以给 R2 添加一条到达该目的网络的路由条目,下一跳为路由器 R1 的接口 1 的地址,类型为静态。
02 默认路由
路由器 R2 的接口 2 连接到了因特网。假设 R1 要转发一个 IP 数据报给因特网中某个网络的某个主机,从图中可以看出,R1 应该将该 IP 数据报转发给路由器 R2 的接口 0。由于因特网中包含了众多的网络,如果我们给 R1 添加针对这些网络的每一条路由条目,则会给人工配置带来巨大的工作量,并且使 R1 的路由表变得非常大,降低查表转发的速度,实际上对于具有相同下一跳的不同目的网络的路由条目,我们可以用一条默认路由条目来替代。默认路由条目中的目的网络地址为0.0.0.0,地址掩码也为0.0.0.0,其CIDR形式为0.0.0.0/0。对于本例,默认路由条目中的下一跳是路由器 R2 的接口 0 的地址,由于默认路由也是由我们人工配置的,因此其类型也是静态。
默认路由条目中的目的网络0.0.0.0/0,其中0.0.0.0表示任意网络,而网络前缀“/0”(相应的地
址掩码为0.0.0.0)是最短的网络前缀。路由器在查找转发表转发IP数据报时,遵循“最长前缀匹配”的原则,因此默认路由条目的匹配优先级最低。
03 特定主机路由
有时候,我们可以给路由器添加针对某个主机的特定主机路由条目。一般用于网络管理人员对网络的管理和测试,另外,在需要考虑某种安全问题时也可以采用特定主机路由。
网络192.168.2.0/24中,有一台IP地址为192.168.2.1的特定主机,在 R1 的路由表中添加一条到达该主机的特定主机路由条目,特定主机路由条目中的网络地址为192.168.2.1/32,特定主机路由条目中的下一跳是路由器 R2 的接口 0 的地址,由于特定主机路由也是由我们人工配置的,因此其类型也是静态。
使用静态路由配置可能出现以下导致产生路由环路的错误:
①配置错误
假设我们将路由器 R2下一跳错误地指向了 R3 的接口 0,则当 R2 要转发 IP 数据报到该网络时,下一跳会错误的转发给路由器 R3 的接口 0,R3 收到该 IP 数据报后,进行查表转发,找到了匹配的路由条目,下一跳应该转发给 R2 的接口 1,R2 收到该 IP 数据报后,进行查表转发找到了匹配的路由条目,下一跳应该转发给 R3 的接口 0,很显然,由于我们静态路由配置错误,导致 R2 和 R3 之间产生了路由环路,为了防止 IP 数据报在路由环路中永久兜圈,在 IP 数据报首部设有生存时间 TTL 字段,IP 数据报进入路由器后,TTL 字段的值被路由器减 1,若 TTL 字段的值减 1 后不等于 0,则被路由器转发,否则被丢弃。
②聚合了不存在的网络
假设 R2 要转发 IP 数据报到网络192.168.2.0/24,进行查表转发,找到了匹配的路由条目,下一跳应该转发给 R1 的接口 1,R1 收到该 IP 数据报后,进行查表转发,找到了匹配的路由条目后下一跳是通过接口 2 直接交付。
这条聚合路由实际上包含了四个网络。当 R2 要转发 IP 数据报到192.168.3.0/24这个不存在的网络时,进行查表转发,找到了匹配的路由条目,下一跳应该转发给R1 的接口 1,但对于这个不存在的网络,路由器 R2 应该不予转发,却错把它转发给了路由器 R1,R1 收到该 IP 数据报后,进行查表转发,只能走默认路由,下一跳应该转发给R2 的接口0,很显然,R1 和 R2 之间产生了路由环路。
针对这种情况,我们可以在 R2 的路由表中,添加针对所聚合的不存在的网络的黑洞路由。黑洞路由的下一跳为 null0,这是路由器内部的虚拟接口,可以把它形象的看成是一个黑洞,IP 数据报进入它后就有去无回了。也就是路由器丢弃了该 IP 数据报,而不是转发该 IP 数据报。
假设 R2 要转发 IP 数据报到这个不存在的网络,进行查表转发,找到了两条可选的路由条目,根据“最长前缀匹配”原则,将会选择这条到达该不存在网络的黑洞路由,下一跳为虚拟接口 null0,因此该 IP 数据报会进入这个黑洞。
③网络故障
假设路由器 R1 检测到其接口 0 所直连的网络192.168.1.0/24出现了故障而不可达,就会自动在其路由表中删除该直连网络的路由条目。之后,R2 要转发 IP 数据报到该网络,进行查表转发,找到匹配的路由条目,下一跳应该转发给 R1 的接口 1,R1 收到该 IP 数据报后,进行查表转发,找不到该 IP 数据报的目的网络的相关路由条目,只能走默认路由,下一跳应该转发给该地址,也就是转发给 R2 的接口 0,这样就将该 IP 数据报错误的转发给了R2,很显然,R1 和 R2 之间产生了路由环路。
针对这种情况,我们可以在 R1 的路由表中,添加针对该直连网络的黑洞路由。这样,当 R2 要转发 IP 数据报到该网络时,进行查表转发,找到匹配的路由条目,下一跳转发给 R1 的接口 1,R1 收到该 IP 数据报后,进行查表转发,找到匹配的路由条目,这是一条黑洞路由,下一跳为虚拟接口 null0,因此该 IP 数据报会进入这个黑洞。
假设一段时间后,之前的故障消失了,则 R1 又自动的得出了其接口 0 的直连网络的路由条目,并将我们之前人工配置的针对该直连网络的黑洞路由条目设置为失效状态。假设 R1 再次检测到其接口 0 所直连的网络出现了故障而不可达,则会自动在其路由表中删除该直连网络的路由条目,并将我们之前人工配置的针对该直连网络的黑洞路由条目设置为生效状态 。
因特网采用分层次的路由选择协议:
自治系统内部的路由选择简称为域内路由选择。域间路由选择使用外部网关协议 EGP 这个类别的路由选择协议。域内路由选择使用内部网关协议 IGP 这个类别的路由选择协议。在一个自治系统内部使用的具体的内部网关协议,与因特网中其他自治系统中选用何种内部网管协议无关,例如,在自治系统AS1内部,使用的内部网关协议为路由信息协议 RIP,而在自治系统AS2内部使用的内部网关协议为开放式最短路径优先 OSPF 协议,自治系统之间使用的外部网关协议为边界网关协议 BGP。
路由器的基本结构
路由器是一种具有多个输入端口和输出端口的专用计算机,其任务是转发分组,整个路由器结构可划分为两大部分:一个是路由选择部分,另一个是分组转发部分。路由选择部分的核心构建是路由选择处理机,它的任务是根据所使用的路由选择协议,周期性的与其他路由器进行路由信息的交互来更新路由表。分组转发部分由三部分构成,分别是交换结构、一组输入端口,一组输出端口。
信号从某个输入端口进入路由器。物理层将信号转换成比特流,送交数据链路层处理。数据链路层从比特流中识别出帧,去掉帧头和帧尾后,送交网络层处理。
如果送交网络层的分组是普通待转发的数据分组,则根据分组首部中的目的地址进行查表转发,若找不到匹配的转发条目,则丢弃该分组,否则,按照匹配条目中所指示的端口进行转发。网络层更新数据分组首部中某些字段的值,例如将数据分组的生存时间减 1,然后送交数据链路层进行封装。数据链路层将数据分组封装成帧,送交物理层处理。物理层将帧看作是比特流,将其变换成相应的电信号进行发送。
如果送交网络层的分组是路由器之间交换路由信息的路由报文,则把这种分组送交路由选择处理机。路由选择处理机根据分组的内容来更新自己的路由表。(需要说明的是我们在之前的静态路由配置的相关课程中,并没有严格区分路由器中的路由表和转发表,这样有助于简化问题的分析,因此,在后续有关路由选择协议的课程中,我们仍然不严格区分路由表和转发表,还是以路由表来表述问题)
路由选择处理机除了处理收到的路由报文外,还会周期性地给其他路由器发送自己所知道的路由信息。
路由器的各端口还应具有输入缓冲区和输出缓冲区。输入缓冲区是适用于新进入路由器但还来不及处理的分组,输出缓冲区用来暂存已经处理完毕但还来不及发送的分组,需要说明的是,路由器的端口一般都具有输入和输出的功能,我们图中分别给出输入端口和输出端口,目的在于更好的演示路由器的基本工作过程,使大家更容易理解。
01 路由信息协议RIP的相关基本概念
03 RIP的距离向量算法
路由器 C 和 D 互为相邻路由器,它们之间周期性地交换并更新路由信息,路由器 C 的路由表中到达各目的网络地下一跳都记为问号,可以理解为路由器 D 并不需要关心路由器 C 的这些内容。假设路由器 C 的 RIP 更新报文发送周期到了,则路由器 C 将自己路由表中的相关路由信息封装到 RIP 更新报文中发送给路由器 D,我们可以简单地理解为路由器 C 将自己的路由表发送给了路由器 D,路由器 D 收到后对其进行改造,将到达各目的网络地下一跳都改为 C,距离都增加 1。
路由器 D 现在可以根据改造好的路由表,来更新自己先前的路由表了。
除了上述RIP路由条目更新规则,在RIP的距离向量算法中还包含以下一些时间参数:
04 RIP存在的问题–“坏消息传播得慢”
如图所示:假设到达 R1 其直连网络 N1 的链路出现了故障,当 R1 检测出该故障后,会将到达 N1 的路由条目中的距离修改为 16,表示 N1 不可达,并等待 RIP 更新周期到时后,发送该路由信息给 R2,而此时 R2 的路由表中关于 N1 的路由条目仍然是先前通过 RIP 协议获取到的,也就是到达 N1 的距离为 2,下一跳通过 R1 转发。假设 R2 的 RIP 更新周期先到时,也就是 R2 的这条路由信息先到达 R1,而 R1 的这条路由信息后到达 R2。
当 R1 收到 R2 的这条路由信息后,就会被该谣言误导,认为可以通过 R2 到达 N1,距离为3,并在自己的 RIP 更新周期到时后,将这条路由信息发送给 R2。当 R2 收到 R1 的这条路由信息后,被该谣言误导,认为可以通过 R1 到达 N1,距离为 4,并在自己的 RIP 更新周期到时后,将这条路由信息发送给 R1。当 R1 收到 R2 的这条路由信息后,被该谣言误导,认为可以通过 R2 到达 N1,距离为 5。并在自己的 RIP 更新周期到时后,将这条路由信息发送给R2,很显然,只有当 R1 和 R2 的路由表中,到达 N1 的路由条目中的距离,都增加到 16 后,R1和 R2 才都知道 N1 不可达,也就是才收敛。
“坏消息传播得慢”的问题又被称为路由环路或RIP距离无穷计数问题。这是距离向量算法的一个固有问题。可以采取以下多种措施减少出现该问题的概率或减小该问题带来的危害:
注意:使用上述措施仍无法彻底解决问题。因为在距离向量算法中,每个路由器都缺少到目的网络整个路径的完整信息,无法判断所选的路由是否出现了环路。
05 RIP版本和相关报文的封装
01 OSPF的相关基本概念
OSPF路由器邻居关系的建立和维护:
OSPF相邻路由器之间通过交互问候(Hello)分组来建立和维护邻居关系。问候(Hello)分组封装在IP数据报中,发往组播地址224.0.0.5。IP数据报首部中的协议号字段的取值为89,表明IP数据报的数据载荷为OSPF分组。
注意:OSPF分组直接使用网际层的IP数据报进行封装,而不像RIP报文需要使用运输层用户数据报协议UDP封装。从数据报按网络体系结构逐层封装的角度看,OSPF属于网际层协议,而RIP属于应用层协议(但其核心功能是路由选择,属于网际层)。
问候分组的发送周期为 10秒,因此每个路由器都会建立一个邻居表,例如路由器 R1 的邻居表中的每一个条目,对应记录其各邻居路由器的相关信息,包括邻居 ID、接口、以及“死亡”倒计时。
例如R2 是 R1 的一个邻居路由器,为简单起见,邻居 ID 就记为 R2,实践中应填写相应的路由器ID,该邻居路由器与自己的接口 1 相连,将接口号记为 1,“死亡”倒计时还剩余 36 秒,若在“死亡”倒计时到达 0 之前,再次收到了来自 R2 的问候分组,则重新启动针对该邻居条目的40 秒“死亡”倒计时,否则,当“死亡”倒计时为 0 时,则判定该邻居路由器不可达。 R4是 R1的另一个邻居路由器,邻居 ID 就记为 R4,该邻居路由器与自己的接口 0 相连,将接口号记为 0,“死亡”倒计时还剩余 18 秒。
链路状态通告:
链路状态更新分组
链路状态通告LSA被封装在链路状态更新(Link State Update,LSU)分组中,采用可靠的洪泛法(Flooding)进行发送。
基于链路状态数据库进行最短路径优先计算
02 OSPF的五种分组类型
03 OSPF的基本工作过程
04 多点接入网络中的OSPF路由器
当 OSPF 路由器在多点接入网络中建立邻居关系时,如果不采用其他机制,将会产生大量的多播分组,例如,这 5 台路由器连接在同一个多点接入网络中,它们周期性的发送问候分组以建立和维护邻居关系,这些路由器中的任意两个路由器都互为邻居关系,如图所示,邻居关系的数量为 n(n-1)/2,其中 n 是路由器的数量,这样,每个路由器要向其他(n-1)个路由器发送问候分组和链路状态更新分组。
非 DR/BDR 之间不能直接交换信息,而必须通过 DR/BDR 进行交换,若 DR 出现问题,则由BDR 顶替 DR,实现 DR 和 BDR 的选举并不复杂,无非就是各路由器之间交换一些选举参数,例如路由器优先级,路由器 ID,接口 IP 地址等,然后根据选举规则选出 DR 和 BDR,这与交换机生成树协议选举根交换机类似。
05 OSPF划分区域
为了使 OSPF 协议能够用于规模很大的网络,OSPF 把一个自治系统,再划分为若干个更小
的范围,称为区域。
自治系统边界路由器(AS Border Router,ASBR):R6
主干路由器(Backbone Router,BBR):R3、R4、R5、R6和R7
区域内路由器(Internal Router,IR):区域1内的R1和R2,区域2内的R8,区域3内的R9
区域边界路由器(Area Border Router,ABR):R3、R4和R7
01 边界网关协议BGP的相关基本概念
边界网关协议(Border Gateway Protocol,BGP)属于外部网关协议EGP这个类别,用于自治系统AS之间的路由选择协议。
由于在不同AS内度量路由的“代价”(距离、带宽、费用等)可能不同,因此对于AS之间的路由选择,使用统一的“代价”作为度量来寻找最佳路由是不行的。
AS之间的路由选择还必须考虑相关策略(政治、经济、安全等)。BGP只能是力求寻找一条能够到达目的网络且比较好的路由(即不能兜圈子),而并非要寻找一条最佳路由。
02 BGP-4的四种报文
解析:R1和R2分别属于不同的自治系统AS1和AS2中,自治系统之间需要使用外部网关协议EGP这一类协议。具体为边界网关BGP,目前使用最多的版本是BGP-4,BGP-4报文被封装到TCP报文段中进行传输。
01 网际控制报文协议ICMP概述
02 ICMP报文类型
①差错报告报文
常见的ICMP差错报告报文有五种:终点不可达、源点抑制、时间超过(超时)、参数问题、改变路由(重定向)
1 终点不可达:
假设 H1 会将 IP 数据报发送给路由器 R1,由 R1 帮其转发,若 R1 的路由表中没有网络 N3 的路由记录、默认路由以及主机 H2 的特定主机路由,则 R1 就不知道如何转发该数据报,只能将其丢弃,并向发送该数据报的源主机 H1 发送 ICMP 差错报告报文,其类型为终点不可达。
2 源点抑制:
例如 H1 给 H2 发送 IP 数据报,当该数据报传输到路由器 R2 时,由于 R2 拥塞,也就是 R2
比较繁忙,R2 根据自己的丢包策略丢弃了该数据报,并向发送该数据报的源主机 H1 发送ICMP 差错报告报文,其类型为源点抑制。
H1 给 H2 发送 IP 数据报,当该数据报传输到 H2 时,由于 H2 拥塞就丢弃了该数据报,并向发送数据报的源主机 H1 发送 ICMP 差错报告报文,其类型为源点抑制。
3 时间超时:
另外,当终点在预先规定的时间内未能收到一个数据报的全部数据报分片时,就把已收到的数据报片都丢弃,也会向源点发送时间超过(超时)报文。
4 参数问题
5 改变路由(重定向)
假设我们给主机 H1 指定的默认网关是路由器 R1,则 H1 要发往网络 N2的 IP 数据报都会传输给 R1,由其帮忙转发,当 R1 发现 H1 发往 N2 的数据报的最佳路由,不应当经过 R1 而是应当经过 R4 时,就用改变路由报文把这个情况告诉主机,于是,H1 就在自己的路由表中添加一个项目:到达 N2 应经过路由器 R4 而不是默认网关 R1,之后,H1要发往 N2 的 IP 数据报都会传输给 R4,由其帮忙转发。
以下情况不应发送ICMP差错报告报文:
②询问报文
03 ICMP的典型应用
①分组网间探测(Packet InterNet Groper,PING)
② 跟踪路由(traceroute)
01 虚拟专用网VPN
虚拟专用网(Virtual Private Network,VPN):利用公用的因特网作为本机构各专用网之间的通信载体,这样形成的网络又称为虚拟专用网。
给专用网内各主机配置的IP地址应该是该专用网所在机构可以自行分配的IP地址,这类IP地址仅在机构内部有效,称为专用地址(Private Address),不需要向因特网的管理机构申请。在因特网中的所有路由器,对目的地址是专用地址的IP数据报一律不进行转发,这需要由因特网服务提供者ISP对其拥有的因特网路由器进行设置来实现。
[RFC 1918]规定了以下三个CIDR地址块中的地址作为专用地址:
我们给部门 A 的专用网分配的私有地址的网络号为 10.1.0.0,给部门 B 的专用网分配的私有地址的网络号为 10.2.0.0,两个专用网中各主机所分配的私有地址如图所示,需要注意的是,私有地址只能用于一个机构的内部通信,而不能用于和因特网上的主机通信,换句话说,私有地址只能用作本地地址而不能用作全球地址,在因特网中的所有路由器,对目的地址是私有地址的 IP 数据报一律不进行转发,很显然,部门 A 和 B 各自需要一个路由器具有合法的全球 IP 地址,这样,它们各自的专用网才能利用公用的因特网进行通信。
02 网络地址转换
最基本的NAT方法
假设使用私有地址的该主机,要给因特网上使用全球 IP 地址的另一台主机,发送 IP 数据报,该主机将数据报发送给 NAT 路由器,数据报首部中源地址字段的值为该主机的私有地址IPA,目的地址字段的值为因特网上另一台主机的全球地址IPB,NAT 路由器从自己的全球 IP 地址池中,为该主机分配一个临时的全球 IP 地址IPG,并将 IP 数据报的源地址修改为该地址,然后将私有地址与全球地址的对应关系,记录在 NAT 转换表中,之后就可以转发该 IP 数据报了,请注意,此时该 IP 数据报中的源地址和目的地址都是全球 IP地址。
因特网上的这台主机给源主机发回数据报,数据报的源地址和目的地址都是全球 IP 地址。NAT 路由器收到该 IP 数据报后,在 NAT 转换表中进行查找,发现该数据报的目的地址所对应的私有地址为IPA,于是就将该数据报的目的地址修改为IPA,并将其发送给相应主机,请注意:此时该 IP 数据报中的源地址为因特网上那台主机的全球IP 地址,而目的地址为专用网中这台主机的私有地址。
网络地址与端口号转换方法
尽管NAT(和NAPT)的出现在很大程度上缓解了IPv4地址资源紧张的局面,但NAT(和NAPT)对网络应用并不完全透明,会对某些网络应用产生影响。
NAT(和NAPT)的一个重要特点就是通信必须由专用网内部发起,因此拥有内部专用地址的主机不能直接充当因特网中的服务器。
对于目前P2P这类需要外网主机主动与内网主机进行通信的网络应用,在通过NAT时会遇到问题,需要网络应用自身使用一些特殊的NAT穿透技术来解决。
如图所示,共有 60 个主机要接收来自视频服务器的同一个视频节目,如果采用单播方式,视频服务器需要发送 60 个该视频节目,这些视频节目通过各路由器的转发,最终到达各主机;如果采用多播方式,可将这 60 个主机看作是同一个多播组的成员,视频服务器只要向该多播组发送 1 个视频节目即可,由于路由器 R1 支持 IP 多播,R1 在转发该视频节目时,需要把该视频节目复制成 2 个副本,分别向路由器 R2 和 R3 转发 1 个副本,当该视频节目到达目的局域网时,由于局域网具有硬件多播功能,因此不需要复制该视频节目,在局域网上的该多播组成员都能收到这个节目。
要在因特网上实现IP多播,则因特网中的路由器需要解决哪些主要问题?
答:IP多播数据报的寻址和多播路由选择协议
IP多播可以分为两种:只在本局域网上进行的硬件多播、在因特网上进行的多播。
目前大部分主机都是通过局域网接入因特网的。因此,在因特网上进行多播的最后阶段,还是要把IP多播数据报在局域网上用硬件多播交付给多播组的所有成员。
因特网号码指派管理局IANA,将自己从IEEE注册管理机构申请到的以太网MAC地址块中从01-00-5E-00-00- 00到01-00-5E-7F-FF-FF的多播MAC地址,用于映射IPv4多播地址。这些多播MAC地址的左起前25个比特都是相同的,剩余23个比特可以任意变化,因此共有 2^23 个。
对于本例,两个不同的 IP 多播地址,映射出了同一个多播 MAC 地址。由于IP多播地址与多播MAC地址的映射关系不是唯一的,因此收到IP多播数据报的主机还要在网际层利用软件进行过滤,把不是主机要接收的IP多播数据报丢弃。
举例说明,左边主机属于 IP 多播组 226.0.9.26,中间主机属于 IP 多播组 226.128.9.26,右边主机属于 IP 多播组 228.1.1.1,从网际层角度看,这是 3 个不同的 IP 多播组,各自映射出多播 MAC 地址,IP 多播组 226.0.9.26 和 226.128.9.26 映射出的以太网多播MAC 地址是相同的,这与 IP 多播组 228.1.1.1 映射出的以太网多播 MAC 地址是不同的,因此,从 MAC 层的角度看,图中有 2 个不同的硬件多播组。假设有一个封装有 IP 多播数据报的多播 MAC 帧传送到了这些多播组所在的局域网,IP 多播数据报的目的 IP 地址是IP 多播地址 226.128.9.26,多播 MAC 帧的目的 MAC 地址就是该 IP 多播地址映射出的多播 MAC 地址。
当该多播 MAC 帧到达各主机后,各主机需要根据该多播 MAC 帧的目的 MAC 地址决定是否接受该多播 MAC 帧,若接受,还要根据帧中封装的 IP 多播数据报的目的 IP 地址来决定是否在网际层接受该 IP 多播数据报。属于硬件多播组 01-00-5E-01-01 的各成员主机,从 MAC层就可判断出该多播 MAC 帧不是发送给自己所在硬件多播组的,各成员将其丢弃。属于硬件多播组 01-00-5E-00-09-1A 的所有主机收到该多播帧后,根据多播帧的目的 MAC 地址,就可知道这是发给自己的多播帧,于是 MAC 层接受该帧,并将其封装的 IP 多播数据报向上交付给网际层处理,网际层根据多播数据报的目的 IP 地址为 IP 多播地址 226.128.9.6 ,就可知道这不是发送给 IP 多播组 226.0.9.26 的多播数据报,因此,该 IP 多播组的所有成员丢弃该IP 多播数据报,而 IP 多播组 226.128.9.26 的所有成员,会接受该 IP 多播数据报。
要在因特网上进行IP多播,就必须要考虑IP多播数据报经过多个多播路由器进行转发的问题。多播路由器必须根据IP多播数据报首部中的IP多播地址,将其转发到有该多播组成员的局域网。
01 网际组管理协议(Internet Group Management Protocol,IGMP)
02 多播路由选择协议
主要任务是在多播路由器之间为每个多播组建立一个多播转发树。找出以源主机为根节点的多播转发树。
如图所示,分布在不同局域网上的ABCEF主机,都是多播组 226.128.9.26 的成员,各路由器使用 IGMP 协议,就可获知自己所连接的局域网上是否有某个多播组的成员,去往该多播组的 IP 多播数据报,只要沿着该多播转发树进行洪泛,就能被传送到所有拥有该多播组成员的多播路由器,之后,在多播路由器所直连的局域网内,多播路由器通过硬件多播,将 IP 多播数据报发送给该多播组的所有成员。
组播路由选择协议常使用的三种算法:
移动IP技术是指移动结点以固定的网络IP地址实现跨越不同网段的漫游功能,并保证基于网络IP的网络权限在漫游中不发生任何改变。
1 移动IP技术的基本工作原理 —— 代理发现与注册
在归属网络中,连接因特网的某个路由器上配置归属代理,在外地网络中,连接因特网的某个路由器上配置外地代理,移动主机 A 从它的归属网络漫游到一个外地网络 175.1.0.0/16。
2 移动IP技术的基本工作原理 —— 固定主机向移动主机发送IP数据报
假设固定主机 B 要给移动主机 A 发送一个 IP 数据报,该数据报会被路由到移动主机 A 的归属网络,归属代理会代替移动主机 A 接收该数据报,该数据报的源地址为固定主机 B 自己的 IP 地址,目的地址为移动主机 A 的永久地址 218.75.230.16。归属代理将数据报封装到一个新的 IP 数据报中,其首部中的目的地址为移动主机 A 的转交地址 175.1.1.1/16(这其实就是外地代理的 IP 地址),归属代理将这个新的 IP 数据报通过 IP 隧道发送给外地代理,外地代理收到后将其数据载荷即原 IP 数据报解封出来,根据其首部中的目的地址直接转发给位于外地网络中的移动主机 A。
注意:当外地代理和移动主机不是同一台设备时,转交地址实际上是外地代理的地址而不是移动主机的地址,转交地址既不会作为移动主机发送IP数据报的源地址,也不会作为移动主机所接收的IP数据报的目的地址。转交地址仅仅是归属代理到外地代理的IP隧道的出口地址。所有使用同一外地代理的移动主机都可以共享同一个转交地址。
3 移动IP技术的基本工作原理 —— 移动主机向固定主机发送IP数据报
假设位于外地网络中的移动主机 A 向固定主机 B 发送一个 IP 数据报,该 IP 数据报首部中的源地址为移动主机 A 的永久地址,而目的地址为固定主机 B 的 IP 地址,该 IP 数据报的发送和转发过程如图所示:
IP数据报被移动主机A按照正常的发送流程发送出去即可。由于IP路由器并不关心IP数据报的源地址,因此该IP数据报被直接路由到固定主机B,而无须再通过归属代理进行转发。为此,移动主机可以将外地代理作为自己的默认路由器,也可以通过代理发现协议从外地代理获取外地网络中其他路由器的地址,并将其设置为自己的默认路由器。
01 IPv6引进的主要变化
02 IPv6数据报的首部–基本首部
IPv6将IPv4数据报首部中不必要的功能取消了,这使得IPv6数据报基本首部中的字段数量减少到只有8个。但由于IPv6地址的长度扩展到了128比特,因此使得IPv6数据报基本首部的长度反而增大到了40字节,比IPv4数据报首部固定部分的长度(20字节)增大了20字节。
源地址字段和目的地址字段:长度都为128比特。分别用来填写IPv6数据报的发送端的IPv6地址和接收端的IPv6地址。
03 IPv6数据报的首部–扩展首部
在IPv6地址的冒号十六进制记法的基础上,再使用“左侧零”省略和“连续零”压缩,可使IPv6地址的表示更加简洁。
在一个IPv6地址中只能使用一次“连续零”压缩,否则会导致歧义。
冒号十六进制记法还可结合点分十进制的后缀。这在IPv4向IPv6过渡阶段非常有用。
CIDR的斜线表示法在IPv6中仍然可用。
03 IPv6地址的分类
IPv6数据报的目的地址有三种基本类型:
[RFC 4291]对IPv6地址进行了分类:
02 隧道技术
隧道技术(Tunneling)的核心思想是:
1 路由器的功能
如图所示,源主机给目的主机发送分组,该分组需要经过多个路由器的转发,最终到达目的
主机。
另一个功能是路由选择,从源主机到达目的主机的路径,可能不止一条,对于路由信息协议 RIP,它会选择经过路由器数量少的这条路径。
在控制层面中,每一个路由器无法独自创建出自己的路由表,路由器必须和相邻的路由器,周期性地交换路由信息,然后才能创建出自己的路由表,根据路由选择协议所使用的路由算法计算路由,需要由软件来完成,这需要花费较多地时间(时间长),一般是秒数量级;
在数据层面中,每一个路由器基于自己生成的转发表来转发分组,为了提高转发速率,现在的路由器一般都基于硬件进行转发,单个分组的转发时间为纳秒数量级(时间短)。
习题:
1.假定你要在SDN控制平面中实现一个新型路由选择协议,你将在哪个层次中实现该协议?
网络范围状态管理层。因为在这一层能获得有关网络的主机、链路、交换机和其他SDN控制设备的最新状态信息,可以根据这些信息的基础上实现新型路由选择协议,并通知给控制器落地执行。
2.谁是从控制器跨越南向接口发送的这些报文的接收者?谁是跨越北向接口从控制器发送的这些报文的接收者?
受控网络设备(路由器)、网络控制应用程序。
01 进程间基于网络的通信
局域网 1 上的主机,与局域网 2 上的主机通过互连的广域网进行通信,网络层的作用范围是主机到主机。
AP1 和 AP2 是局域网 1 上这台主机中的与网络通信相关的两个应用进程,AP3 和 AP4是局域网 2 上这台主机中的与网络通信相关的两个应用进程,AP 是应用进程的英文缩写词。运输层的作用范围是应用进程到应用进程,也称为端到端。
假设 AP1 与 AP4之间进行基于网络的通信,AP2 与 AP3 之间进行基于网络的通信,在运输层使用不同的端口,来对应不同的应用进程,然后通过网络层及其下层来传输应用层报文。如图所示,接收方的运输层通过不同的端口,将收到的应用层报文,交付给应用层中相应的应用进程。
为了简单起见,在学习和研究运输层时,我们可以简单的认为运输层直接为应用进程间的逻辑通信提供服务,“逻辑通信“的意思是运输层之间的通信好像是沿水平方向传送数据,但事实上,这两个运输层中并没有一条水平方向的物理连接,要传输的数据是沿着图中上下多次的虚线方向传送的。
02 TCP/IP运输层中的两个重要协议
03 运输层端口号
TCP/IP 体系的应用层常用协议所使用的运输层熟知端口号:
05 运输层端口号应用举例
如图所示,用户 PC,DNS服务器,web 服务器通过交换机进行互联,它们处于同一个以太网中。
web 服务器的域名为 www.porttest.com,DNS 服务器中记录有该域名所对应的 IP 地址,我们在用户 PC 使用网页浏览器来访问 web 服务器的内容,在网页浏览器的地址栏中输入 Web 服务器的域名,用户 PC 中的 DNS 客户端进程会发送一个 DNS 查询请求报文,其内容为“域名 www.porttest.com 所对应的 IP 地址是什么?”,DNS 查询请求报文需要使用运输层的 UDP 协议,封装成 UDP 用户数据报,其首部中的源端口字段的值在短暂端口号 49151~65535 中挑选一个未被占用的,用来表示 DNS 客户端进程,例如 49152,目的端口字段的值设置为53,这是 DNS 服务器端进程所使用的熟知端口号。
之后将 UDP 用户数据报封装在 IP 数据报中,通过以太网发送给 DNS 服务器,DNS 服务器收到该数据报后,从中解封出 UDP 用户数据报,UDP 首部中的目的端口号为 53,这表明应将 UDP 用户数据报的数据载荷部分也就是 DNS 查询请求报文交付给本服务器的 DNS 服务器端进程,DNS 服务器端进程解析 DNS 查询请求报文的内容,然后按其要求查找对应的 IP地址。
之后,会给用户 PC 发送 DNS 响应报文,其内容为“域名 www.porttest.com 所对应的IP 地址是 192.168.0.3”,DNS 响应报文需要使用运输层的 UDP 协议,封装成 UDP 用户数据报,其首部中的源端口字段的值设置为熟知端口号 53,表明这是 DNS 服务器端进程所发送的 UDP 用户数据报,目的端口字段的值设置为 49152,这是之前用户 PC 中发送 DNS 查询请求报文的 DNS 客户端进程所使用的短暂端口号。
之后,将 UDP 用户数据报封装在 IP 数据报中,通过以太网发送给用户 PC,用户 PC 收到该
数据报后,从中解封出 UDP 用户数据报,UDP 首部中的目的端口号 49152,这表明应将该UDP 用户数据报的数据载荷部分也就 DNS 响应报文交付给用户 PC 中的 DNS 客户端进程,DNS 客户端进程解析 DNS 响应报文的内容,就可知道自己之前所请求的 web 服务器的域名所对应的 IP 地址为 192.168.0.3。
现在用户 PC 中的 HTTP 客户端进程,可以向 web 服务器发送 HTTP 请求报文了。其内容为“首页内容是什么?”HTTP 请求报文需要使用运输层的 TCP 协议封装成 TCP 报文段,其首部中的源端口字段的值在短暂端口号 49151~65535 中挑选一个未被占用的,用来表示 HTTP客户端进程。例如仍然使用之前用过的 49152,目的端口字段的值设置为 80,这是 HTTP 服务器端进程所使用的熟知端口号。
之后,将 TCP 报文段封装在 IP 数据报中,通过以太网发送给 web 服务器,web 服务器收到该数据报后,从中解封出 TCP 报文段,TCP 首部中的端口号为 80,这表明应将该 TCP 报文
段的数据载荷部分也就是 HTTP 请求报文交付给本服务器中的 HTTP 服务器端进程,HTTP服务器端进程解析 HTTP 请求报文的内容,然后按其要求查找首页内容。之后会给用户 PC发送 HTTP 响应报文,其内容是 HTTP 客户端所请求的首页内容,HTTP 响应报文需要使用运输层的 TCP 协议封装成 TCP 报文段,其首部中的源端口字段的值设置为数值端口号 80,表明这是 HTTP 服务器端进程所发送的 TCP 报文段,目的端口字段的值设置为 49152,这是之前用户 PC 中发送 HTTP 请求报文的 HTTP 客户端进程所使用的短暂端口号。
之后,将 TCP 报文段封装在 IP 数据报中,通过以太网发送给用户 PC,用户 PC 收到该数据报后,从中解封出 TCP 报文段,TCP 首部中的目的端口号为 49152,这表明应将该 TCP 报文段的数据载荷部分也就是 HTTP 响应报文交付给用户 PC 中的 HTTP 客户端进程,HTTP 客户端进程解析 HTTP 响应报文的内容,并在网页浏览器中进行显示。这样我们就可以在网页浏览器中看到 web 服务器所提供的首页内容了。
01 无连接的UDP和面向连接的TCP
“连接”指逻辑连接关系,而不是物理连接。
02 UDP和TCP对单播、多播和广播的支持情况
使用 TCP 协议的通信双方,在进行数据传输之前,必须使用“三报文握手”,来建立 TCP 连接,TCP 连接建立成功后,通信双方之间就好像有一条可靠的通信信道,通信双方使用这条基于 TCP 连接的可靠信道进行通信。
03 UDP和TCP应用层报文的处理
04 UDP和TCP对数据传输可靠性的支持情况
2、序号seq、确认号ack、确认标志位ACK
确认号可以这样理解,若确认号为n,则表明到序号 n-1 为止的所有数据都已正确接收,期望接收序号为 n 的数据。
举例说明这三个字段的作用:
4、保留
占6比特、保留为今后使用、目前应置为0
5、窗口
6、检验和
占16比特,用来检查整个TCP报文段在传输过程中是否出现了误码。与 UDP 类似,在计算校验和时,要在 TCP 报文段的前面加上 12 字节的伪首部。
7、同步标志位 SYN
8、终止标志位FIN
9、复位标志位RST
10、推送标志位PSH
11、紧急标志位URG、紧急指针
12、选项(长度可变,最大40字节)
13、填充
若选项字段的长度加上20字节固定首部的长度不能被4字节整除时,需要填充相应数量的比特0,以确保首部长度能被4字节整除。
01 “三报文握手”建立TCP连接
“三报文握手”建立TCP连接的目的在于解决以下三个主要问题:
这是两台要基于 TCP 进行通信的主机,其中一台主机中的某个应用进程主动发起 TCP 连接建立,称为 TCP 客户,另一台主机中被动等待 TCP 连接建立的应用进程,称为 TCP 服务器,我们可以将 TCP 建立连接的过程比喻为“握手”。“握手”需要在 TCP 客户和服务器之间交换三个 TCP 报文段,最初,两端的 TCP 进程都处于关闭状态,一开始,TCP 服务器进程首先创建传输控制块,用来存储 TCP 连接中的一些重要信息,例如 TCP 连接表、指向发送和接收缓存的指针、指向重传队列的指针、当前发送和接收序号等。之后,就准备接受 TCP 客户进程的连接请求。
此时,TCP 服务器进程就进入监听状态,等待 TCP 客户进程的连接请求,TCP 服务器进程是
被动等待来自 TCP 客户进程的连接请求,而不是主动发起,因此称为被动打开连接。TCP 客
户进程也是首先创建传输控制块。
然后,在打算建立 TCP 连接时,向 TCP 服务器进程发送 TCP 连接请求报文段,并进入同步已发送状态,TCP 连接请求报文段首部中的同步位 SYN 被设置为 1,表明这是一个 TCP 连接请求报文段(TCP连接请求报文段和TCP连接请求确认报文段首部中的同步标志位SYN的值必须设置为1)。序号字段 seq 被设置了一个初始值 x,作为 TCP 客户进程所选择的初始序号。TCP 服务器进程收到TCP连接请求报文段后,如果同意建立连接,则向 TCP 客户进程发送TCP 连接请求确认报文段,并进入同步接收状态。该报文段首部中的同步位 SYN 和确认位ACK 都设置为 1,表明这是一个 TCP 连接请求确认报文段。序号字段 seq 被设置了一个初始值 y,作为 TCP 服务器进程所选择的初始序号。确认号字段 ack 的值被设置成了 x+1,这是对 TCP 客户进程所选择的初始序号x的确认。请注意:这个报文段也不能携带数据,因为它是 SYN 被设置为 1 的报文段(例如TCP连接请求报文段和TCP连接请求确认报文段),但同样要消耗一个序号。
TCP 客户进程收到 TCP 连接请求确认报文段后,还要向 TCP服务器进程发送一个普通的TCP 确认报文段,并进入连接已建立状态。该报文段首部中的确认位 ACK 被设置为 1,表明这是一个普通的 TCP 确认报文段。序号字段 seq 被设置为 x+1,这是因为 TCP 客户进程发送的第一个 TCP 报文段的序号为 x,并且不携带数据,因此第二个报文段的序号为 x+1。
请注意:TCP 规定普通的 TCP 确认报文段可以携带数据,但如果不携带数据,则不消耗序号。如果该报文段不携带数据,则TCP客户进程要发送的下一个数据报文段的序号仍为x+1。
确认号字段 ack 被设置为 y+1,这是对 TCP 服务器进程所选择的初始序号的确认。TCP 服务器进程收到该确认报文段后也进入连接已建立状态。现在,TCP 双方都进入了连接已建立状态。它们可以基于已建立好的 TCP 连接,进行可靠的数据传输了。
第三个TCP报文段是否多余?
02 “四报文挥手”释放TCP连接
数据传输结束后,TCP 通信双方都可以释放连接。现在 TCP 客户进程和 TCP 服务器进程都处于连接已建立状态。
假设使用 TCP客户进程的应用进程通知其主动关闭 TCP 连接,TCP 客户进程会发送 TCP 连接释放报文段,并进入终止等待 1 状态,该报文段首部中的终止位 FIN和确认位 ACK 的值都被设置为 1,表明这是一个 TCP 连接释放报文段,同时也对之前收到的报文段进行确认。序号 seq 字段的值设置为 u,它等于 TCP 客户进程之前已传送过的数据的最后一个字节的序号加 1。请注意:TCP 规定终止位 FIN 等于 1 的报文段即使不携带数据,也要消耗掉一个序号。确认号ack字段的值设置为v,它等于TCP客户进程之前已收到的数据的最后一个字节的序号加1。
TCP 服务器进程收到 TCP 连接释放报文段后,会发送一个普通的 TCP 确认报文段并进入关
闭等待状态。该报文段首部中的确认位 ACK 的值被设置为 1,表明这是一个普通的 TCP 确
认报文段。序号 seq 字段的值设置为 v,它等于 TCP 服务器进程之前已传送过的数据的最后
一个字节的序号加 1,这也与之前收到的 TCP 连接释放报文段中的确认号匹配。确认号 ack
字段的值设置为 u+1,这是对 TCP 连接释放报文段的确认。TCP 服务器进程这时应通知高层
应用进程:TCP 客户进程要断开与自己的 TCP 连接。此时,从 TCP 客户进程到 TCP 服务器
进程这个方向的连接就释放了。
TCP 客户进程收到 TCP 确认报文后就进入终止等待 2 状态。等待 TCP 服务器进程发出的TCP 连接释放报文段。若使用 TCP 服务器进程的应用进程已经没有数据要发送了,应用进程就通知其 TCP 服务器进程释放连接。由于 TCP 连接释放是由 TCP 客户进程主动发起的,因此 TCP 服务器进程对 TCP 连接的释放称为被动关闭连接。TCP 服务器进程发送 TCP 连接释放报文段并进入最后确认状态。该报文段首部中的终止位 FIN 和确认位 ACK的值都设置为1,表明这是一个 TCP 连接释放报文段,同时也对之前收到的报文段进行确认。现在假定序号seq 字段的值为 w。这是因为在半关闭状态下,TCP 服务器进程可能又发送了一些数据。确认号 ack 字段的值为 u+1,这是对之前收到的 TCP 连接释放报文段的重复确认。
TCP 客户进程收到 TCP 连接释放报文段后,必须针对该报文段发送普通的 TCP确认报文段,之后进入时间等待状态。该报文段首部中的确认位 ACK 的值被设置为 1,表明这是一个普通的 TCP 确认报文段。序号 seq 字段的值设置为 u+1,这是因为 TCP 客户进程之前发送的 TCP 连接释放报文段虽然不携带数据,但要消耗掉一个序号。确认号 ack 字段的值设置为 w+1,这是对所收到的 TCP 连接释放报文段的确认。
TCP 服务器进程收到该报文段后就进入关闭状态。而 TCP 客户进程还要经过 2MSL 后才能进入关闭状态。MSL 的意思是最长报文段寿命,RFC793 文档建议为 2 分钟。也就是说 TCP 客户进入时间等待状态后还要经过 4 分钟才能进入关闭状态。这完全是从工程上来考虑的。对于现在的网络,MSL 取为 2 分钟可能太长了,因此 TCP 允许不同的实现可根据具体情况使用更小的 MSL 值。
那么,TCP 客户进程在发送完最后一个确认报文段后,为什么不直接进入关闭状态,而是要进入时间等待状态,2MSL 后才进入关闭状态,这是否有必要呢?
来看这种状态,TCP 服务器进程发送 TCP 连接释放报文段后进入最后确认状态。TCP 客户进程收到该报文段后,发送普通的 TCP 确认报文段,并进入关闭状态而不是时间等待状态。然而该 TCP 确认报文段丢失了,这必然会造成 TCP 服务器进程对之前所发送的 TCP 连接释放报文段的超时重传,并处于最后确认状态。重传的 TCP 连接释放报文段到达 TCP 客户进程。由于 TCP 客户进程属于关闭状态,因此不理睬该报文段,这必然会造成 TCP 服务器进程反复重传 TCP 连接释放报文段,并一直处于最后确认状态而无法进入关闭状态。
设想这样一种情况:TCP 双方已经建立了连接。后来TCP 客户进程所在的主机突然出现了故障。显然,TCP 服务器进程以后就不能再收到 TCP 客户进程发来的数据。因此应当有措施使 TCP 服务器进程不要再白白等待下去。换句话说,TCP 服务器进程应该如何发现这种情况呢?方法就是使用保活计时器。
TCP为应用程序提供了流量控制(Flow Control)机制,以解决因发送方发送数据太快而导致接收方来不及接收,造成接收方的接收缓存溢出的问题。流量控制的基本方法:接收方根据自己的接收能力(接收缓存的可用空间大小)控制发送方的发送速率。
02 TCP的流量控制
在因特网上的两台主机,它们之间已经建立了 TCP 连接,A 给 B 发送数据,B 对 A 流量控制。假设主机 A 发送的每个 TCP 数据报文段可携带100 字节数据,因此图中每个小格子表示100 个字节数据的序号。在主机 A 和 B 建立 TCP连接时,B 告诉 A:“我的接收窗口为 400”。因此,主机 A 将自己的发送窗口也设置为 400。这意味着主机 A 在未收到主机 B 发来的确认时,可将序号落入发送窗口中的全部数据发送出去。
主机 A 将发送窗口内序号 1-100 的数据,封装成一个 TCP 报文段发送出去。发送窗口内还有 300 字节可以发送,这里的seq 是 TCP 报文段首部中的序号字段,取值 1 表示 TCP 报文段数据载荷的第一个字节的序号是 1。这里的 DATA 表示这是TCP 数据报文段。
主机 A 将发送窗口内序号 101~200 的数据封装成一个 TCP 报文段发送出去。
发送窗口内还有 200字节可以发送,主机 A 将发送窗口内序号 201~300 的数据封装成一个 TCP 报文段发送出去。但该报文段在传输过程中丢失了。
主机 A 发送窗口内还有 100 字节可以发送。主机 B 对主机 A 所发送的 201 号以前的数据进行累计确认。并在该累计确认中将窗口字段的值调整为 300,也就是对主机 A 进行流量控制。这里的大写ACK 是 TCP报文段首部中的标志位,取值 1 表示这是一个 TCP 确认报文段。小写 ack 是 TCP 报文段首部中的确认号字段,取值 201表示序号 201 之前的数据已全部正确接收,现在希望收到序号 201 及其后续数据,rwnd 是 TCP 报文段首部中的窗口字段,取值300 表示自己的接收窗口大小为 300。
主机 A 收到该累计确认后,将发送窗口向前滑动,使已发送并收到确认的这些数据的序号移出发送窗口,由于主机 B 在该累计确认中将自己的接收窗口调整为了300,因此主机 A相应地将自己的发送窗口调整为 300。
目前,主机 A 发送窗口内的序号为 201-500,也就是主机 A 还可以发送这 300 字节。其中,201-300 号字节是已发送的数据,若重传计时器超时,它们会被重传。301-400 号字节以及 401-500 号字节还未被发送。可被分别封装在一个 TCP 报文段中发送。
主机 A 现在可将发送缓存中序号 1-200 的字节数据全部删除了,因为已经收到了主机 B 对它们的累计确认。主机 A 将发送窗口内序号301~400 的数据,封装成一个 TCP 报文段发送出去。
发送窗口内还有 100 字节可以发送,主机 A 将发送窗口内序号 401-500 的数据封装成一个 TCP 报文段发送出去。至此,序号落在发送窗口内的数据已经全部发送出去了,不能再发送新数据了。
现在,发送窗口内序号201~300 这 100 个字节数据的重传计时器超时了。主机 A 将它们重新封装成一个 TCP 报文段发送出去。暂时不能发送其他数据,主机 B 收到该重传的 TCP 报文段后,对主机 A 所发送的 501 号以前的数据进行累计确认,并在该累计确认中将窗口字段的值调整为 100,这是主机 B 对主机 A 进行的第二次流量控制。
主机 A 收到该累计确认后,将发送窗口向前滑动,使已发送并收到确认的这些数据的序号移出发送窗口。由于主机 B 在该累计确认中将自己的接收窗口调整为了 100,因此主机 A 相应的将自己的发送窗口调整为 100。
目前主机 A 发送窗口内的序号为 501~600,也就是主机 A 还可以发送这100字节。主机 A 现在可将发送缓存中序号 201-500 的字节数据全部删除了,因为已经收到了主机 B 对它们的累计确认。
主机 A 将发送窗口内序号 501-600 的数据封装成一个 TCP 报文段发送出去。至此,序号落在发送窗口内的数据已经全部发送出去了,不能再发送新数据了。
主机 A 所发送的 601 号以前的数据进行累计确认,并在该累计确认中将窗口字段的值调整为 0,这是主机 B 对主机 A进行的第三次流量控制。
主机 A 收到该累计确认后,将发送窗口向前滑动,使已发送并收到确认的这些数据的序号移出发送窗口。由于主机 B 在该累计确认中将自己的接收窗口调整为了 0。因此,主机 A 相应地将自己的发送窗口调整为 0。目前,主机 A 不能再发送一般的TCP 报文段了。主机 A 现在可将发送缓存中序号 501~600 的字节数据全部删除了,因为已经收到了主机 B 对它们的累计确认。
假设主机 B 向主机 A 发送了零窗口的报文段后不久,主机 B 的接收缓存又有了一些存储空间,于是主机 B 向主机 A 发送了接收窗口等于 300 的报文段,然而这个报文段在传送过程中丢失了,主机 A 一直在等待主机 B 发送的非零窗口的通知,而主机 B 也一直等待主机 A 发送的数据。如果不采取措施,这种相互等待而形成的死锁局面将一直持续下去。
①A发送的零窗口探测报文段到达B时,如果B此时的接收窗口值仍然为0,那么B根本就无法接受该报文段,又怎么会针对该报文段给A发回确认呢?
实际上TCP规定:即使接收窗口值为0,也必须接受零窗口探测报文段、确认报文段以及携带有紧急数据的报文段。
②如果零窗口探测报文段丢失了,还会打破死锁的局面吗?
回答是肯定的。因为零窗口探测报文段也有重传计时器,当重传计时器超时后,零窗口探测报文段会被重传。
01 拥塞控制的基本概念
如图所示,横坐标是输入负载,代表单位时间内输入给网络的分组数量。纵坐标是吞吐量,代表单位时间内从网络输出的分组数量。
具有理想拥塞控制的网络在吞吐量达到饱和之前,网络吞吐量应等于所输入的负载,故吞吐量曲线是 45 度的斜线。但当输入负载超过某一限度时,由于网络资源受限,吞吐量就不再增长而保持水平线,也就是吞吐量达到饱和,这就表明输入的负载中有一部分损失掉了。例如,输入到网络中的某些分组被某个结点丢弃了。虽然如此,在这种理想的拥塞控制作用下,网络的吞吐量仍然维持在其所能达到的最大值。
然而实际网络的情况就很不同了。随着输入负载的增大,网络吞吐量的增长率逐渐减小。也就是在网络吞吐量还未达到饱和时,就已经有一部分的输入分组被丢弃了。当网络的吞吐量明显地小于理想的吞吐量时,网络就进入了轻度拥塞的状态。更值得注意的是,当输入负载到达某一数值时,网络的吞吐量反而随输入负载的增带而减小,这时网络就进入了拥塞状态。当输入负载继续增大到某一数值时,网络的吞吐量就减小为 0,此时网络就无法工作了,这就是所谓的死锁。因此,进行拥塞控制是非常有必要的。实际的拥塞控制曲线应该尽量接近理想的拥塞控制曲线。
02 TCP的四种拥塞控制方法
慢开始(slow-start)、拥塞避免(congestion avoidance)、快重传(fast retransmit)、快恢复(fast recovery)
假定如下条件:
假设发送方给接收方发送 TCP 数据报文段。接收方收到后,给发送方发送 TCP 确认报文段。发送方要维护一个叫做拥塞窗口的状态变量,其值取决于网络的拥塞程度,并且动态变化。
①慢开始、拥塞避免
为了更清晰的显示出拥塞控制过程,我们还可以绘制这样一幅拥塞窗口随传输轮次变化的图,横坐标为传输轮次。传输轮次是指发送方给接收方发送数据报文段后,接收方给发送方发回相应的确认报文段,一个传输轮次所经历的时间其实就是往返时间。请注意:往返时间并非是恒定的数值。使用传输轮次是为了强调把拥塞窗口所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个报文段的确认。纵坐标是拥塞窗口,他会随网络拥塞程度以及所使用的拥塞控制算法动态变化。
在 TCP 双方建立逻辑连接关系时,拥塞窗口的值被设置为 1。另外,还需设置慢开始门限的初始值。本例采用 16。在执行慢开始算法时,发送方每收到一个对新报文段的确认时,就把拥塞窗口值加 1,然后开始下一轮的传输。当拥塞窗口值增长到慢开始门限值时,就改为执行拥塞避免算法。由于发送方当前的拥塞窗口值是 1,而发送窗口值等于拥塞窗口值,因此,发送方当前只能发送一个 TCP 数据报文段。换句话说,拥塞窗口值是几,就能发送几个数据报文段。
如图所示,发送方发送 0 号数据报文段。接收方收到后,给发送方发回对 0 号报文段的确认报文段。发送方收到该确认报文段后,将拥塞窗口值加 1 增大到 2。这意味着发送方现在可以发送 1~2号共两个数据报文段。
接收方收到后,给发送方发回对 1-2 号报文段的确认报文段。发送方收到后,将拥塞窗口值加 2 增大到 4。发送方现在可以发送 3~6 号共四个数据报文段。接收方收到后给发送方发回对 3-6 号报文段的确认报文段。发送方收到后,将拥塞窗口值加4 增大到 8。发送方现在可以发送 7-14 号共八个数据报文段。接收方收到后给发送方发回对 7-14 号报文段的确认报文段。发送方收到后,将拥塞控制窗口值加 8 增大到 16。
发送方当前的拥塞窗口值已经增大到了慢开始门限值。之后我们要改用拥塞避免算法,也就是每个传输轮次结束后,拥塞窗口值只能线性加 1。而不像慢开始算法那样,每个传输轮次结束后,拥塞窗口值按指数规律增大。发送方现在可以发送 15~30 号共 16 个数据报文段。接收方收到后给发送方发回对 15-30 号报文段的确认报文段。发送方收到后,将拥塞窗口值加 1 增大到 17。发送方现在可以发送 31 至 47 号共 17 个数据报文段。接收方收到后给发送方发回对 31 至 47 号报文段的确认报文段。发送方收到后,将拥塞窗口值加 1 增大到 18。随着传输轮次的增加,拥塞窗口值每轮次都线性加 1。例如,当前拥塞窗口值增加到了 24。发送方现在可以发送 171 至 194 号,共 24个数据报文段。假设这 24 个数据报文段在传输过程中丢失了几个。这必然会造成发送方对这些丢失报文段的超时重传。
当发生超时重传时,就判断网络很可能出现了拥塞。采取相应的措施。一方面将慢开始门限值更新为发生拥塞时,拥塞窗口值的一半(网络发生拥塞时的拥塞窗口值是 24,因此,更新慢开始门限值为该值的一半,即 12。);另一方面,将拥塞窗口值减少为 1,并重新开始执行慢开始算法。拥塞窗口值又从1开始按指数规律增大。当增大到了新的慢开始门限值时,停止使用慢开始算法,转而执行拥塞避免算法,让拥塞窗口值按线性加 1 的规律增大。
②快重传算法和快恢复算法
有时,个别报文段会在网络中丢失,但实际上网络并未发生拥塞。这将导致发送方超时重传,并误认为网络发生了拥塞;发送方把拥塞窗口cwnd又设置为最小值1,并错误地启动慢开始算法,因而降低了传输效率。
发送方发送 1 号数据报文段,接收方收到后给发送方发回对 1号报文段的确认。在该确认报文段到达发送方之前,发送方还可以将发送窗口内的 2 号数据报文段发送出去。接收方收到后给发送方发回对 2 号报文段的确认。在该确认报文段到达发送方之前,发送方还可以将发送窗口内的 3 号数据报文段发送出去,但该报文段丢失了,接收方自然不会给发送方发回针对该报文段的确认。发送方还可以将发送窗口内的四号数据报文段发送出去。接收方收到后发现这不是按序到达的报文段,因此,给发送方发回针对 2 号报文段的重复确认。表明:“我现在希望收到的是 3 号报文段。但是我没有收到 3 号报文段,而是收到了未按序到达的报文段”。发送方还可以将发送窗口内的 5 号数据报文段发送出去。接收方收到后发现这不是按序到达的报文段,因此,给发送方发回针对 2 号报文段的重复确认。发送方还可以将发送窗口内的 6 号数据报文段发送出去。接受方收到后发现这不是按序到达的报文段,因此,给发送方发回针对二号报文段的重复确认。至此,发送方会收到三个连续的对 2 号报文段的重复确认。就立即重传 3 号报文段。接收方收到后给发送方发回针对 6 号报文段的确认,表明序号到 6 为止的报文段都正确接收了。这样就不会造成对 3 号报文段的超时重传,而是提早进行了重传。对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了拥塞而错误的降低拥塞窗口值为最小值 1。使用快重传可以使整个网络的吞吐量提高约 20%。
接下来给出 TCP 拥塞窗口值在拥塞控制时的变化情况举例。里面包含了 TCP 拥塞控制的四种算法。TCP 发送方一开始使用慢开始算法,让拥塞窗口值从 1 开始按指数规律增大,当增大到慢开始门限初始值时,停止使用慢开始算法。转而执行拥塞避免算法,让拥塞窗口只按线性加 1 的规律增大。当发生超时重传时,就判断网络可能出现了拥塞,采取相应的措施。一方面将慢开门限值更新为发生拥塞时拥塞窗口值的一半;另一方面,将拥塞窗口值减少为 1,并重新开始执行慢开始算法。拥塞窗口值又从 1 开始按指数规律增大。当增大到了新的慢开始门限值时,停止使用慢开始算法,转而执行拥塞避免算法,让拥塞窗口值按线性加 1 的规律增大。当发送方收到三个重复确认时,就进行快重传和快恢复。也就是更新慢开始门限值为当前拥塞窗口值的一半。并将拥塞窗口值也取为新的慢开始门限值,转而执行拥塞避免算法,让拥塞窗口值按线性加 1 的规律增大。
1 序号
这是因特网上的两台主机,它们之间已经建立了一个 TCP 连接。为了简单起见,我们假定数据传输只在一个方向进行。换句话说,发送方给接收方发送 TCP 数据报文段,接收方给发送相应的 TCP 确认报文段。这样的好处是讨论仅限于两个窗口,也就是发送方的发送窗口和接收方的接收窗口。TCP 的滑动窗口是以字节为单位的。
2 确认
假设发送方收到了一个来自接收方的确认报文段。在报文段首部中的窗口字段的值为 20,也就是接收方表明自己的接收窗口的尺寸为 20 字节。确认号字段的值为 31,这表明接收方希望收到下一个数据的序号是 31,而序号 30 为止的数据已经全部正确接收了。因此发送方根据这两个字段的值构造出自己的发送窗口。为了简单起见,我们假定网络不存在拥塞问题,也就是发送方在构造自己的发送窗口时,仅考虑接收方的接收窗口而不考虑拥塞窗口
由于本例中接收方告诉发送方自己的接收窗口尺寸为 20,因此发送方将自己的发送窗口尺寸也设置为 20。发送方在没有收到接收方确认的情况下,可以把发送窗口内的数据依次全部发送出去。凡是已经发送过的数据,在未收到确认之前,都必须暂时保留,以便在超时重传时使用。
发送窗口的前沿可能向后收缩,这发生在接收方通知的窗口变小了,但 TCP标准强烈不赞成这样做,因为很可能发送方在收到这个通知之前,就已经发送了窗口中的许多数据,现在又要收缩窗口,不让发送这些数据,显然就会产生错误。
现在假定发送方将发送窗口内序号 31 至 41 的数据封装在几个不同的报文段中发送出去。此时,发送窗口的位置并没有改变。发送窗口内序号 31~41 的数据已经发送但未收到确认,而序号 42 至 50 的数据是准许发送但还未发送的。
假设发送方之前发送的,封装有 32 和 33 号数据的报文段到达了接收方。由于数据序号落在接收窗口内,所以接受方接受它们,将它们存入接收缓存。但是它们是未按序到达的数据,因为 31 号数据还没有到达,这有可能是丢了,也有可能是滞留在网络中的某处。请注意:接收方只能对按序收到的数据中的最高序号给出确认。因此接收方发出的确认报文段中的确认序号仍然是 31,也就是希望收到 31 号数据。窗口字段的值仍为 20,表明接收方没有改变自己接收窗口的大小。
发送方收到该确认报文段后,发现这是一个针对 31 号数据的重复确认,就知道接收方收到了未按序到达的数据。由于这是针对 31 号数据的第 1 个重复确认,因此这并不会引起发送方针对该数据的快重传。另外接收方通知的窗口尺寸仍是 20,因此发送方仍保持自己的发送窗口尺寸为 20。现在假设封装有 31 号数据的报文段到达了接收方。接收方接受该报文段,将其封装的 31 号数据存入接收缓存。
接收方现在可将接收到的 31~33 号数据交付给应用进程。然后将接收窗口向前移动三个序号,并给发送方发送确认报文段。该确认报名段中窗口字段的值仍为 20,表明接收方没有改变自己接收窗口的大小。确认号字段的值为 34,这表明接收方已经收到了序号 33 为止的全部数据。
现在假设又有几个数据报文段到达了接收方,他们封装有 37、38 以及 40 号数据。这些数据的序号虽然落在接收窗口内,但他们都是未按序到达的数据,只能先暂存在接收缓存中。假设接收方先前发送的确认报文段到达了发送方。发送方接收后,将发送窗口向前滑动三个序号,发送窗口的尺寸保持不变,这样就有新序号 51~53 落入发送窗口内。而序号 31-33移出了发送窗口,现在可将 31-33 号数据从发送缓存中删除了,因为已经收到了接收方针对他们的确认。发送方继续将发送窗口内序号 42-53 的数据,封装在几个不同的报文段中发送出去。
3 重传
(1)超时重传
假设主机 A 和 B 是因特网上的两台主机,他们之间已经建立了 TCP 连接,纵坐标为时间,现在主机 A 给主机 B 发送 TCP 数据报文段 0, 并记录下当前的时间,主机 B收到后,给主机 A 发送相应的确认报文段,主机 A 收到确认报文段后,记录下当前的时间,那么主机 A 记录下的这两个时间,它们的差值就是报文段的往返时间 RTT。
由于这是第 0 个报文段的 RTT,我们就用 RTT0 来表示。试想一下,如果我们将超时重传时间 RTO 的值设置的比 RTT0 的值小,会出现怎样的情况呢?很显然这会引起报文段不必要的重传,使网络负荷增大,那么如果将超时重传时间 RTO 的值,设置的远大于 RTT0 的值呢,又会出现怎样的情况呢?很显然这会使重传推迟的时间太长,使网络的空闲时间增大,降低了传输效率。
例如现在主机 A给主机 B 发送 TCP 数据报文段 1。主机 B 收到后,给主机 A发送相应的确认报文段。主机 A 这次测得的报文段往返时间 RTT1 如图所示。显然 RTT1 远大于 RTT0。如果超时重传时间 RTO 还是我们之前所确定的略大于 RTT0 的话,这对于数据报文段 1 是不合适的,会造成该报文段不必要的重传。
不能直接使用略大于某次测量得到的往返时间RTT样本的值作为超时重传时间RTO。但是,可以利用每次测量得到的RTT样本计算加权平均往返时间RTTs,这样可以得到比较平滑的往返时间。
(2)冗余ACK
应用层是计算机网络体系结构的最顶层,是设计和建立计算机网络的最终目的,也是计算机网络中发展最快的部分。
01客户/服务器(Client/Server,C/S)方式
02对等(Peer-to-Peer,P2P)方式
01 动态主机配置协议DHCP的作用
如何配置用户主机,才能使它们可以正常访问网络中的 Web 服务器。根据之前所学可知,需要给网络中的各主机正确配置 IP 地址、子网掩码、默认网关、DNS 服务器等网络相关配置信息。如果网络中的主机数量比较多,则这种手工配置的工作量就比较大,并且容易出错。
如果我们给网络中添加一台 DHCP 服务器;在该服务器中设置好可为网络中其他各主机配置的网络配置信息。网络中各主机开机后自动启动 DHCP 程序,向 DHCP 服务器请求自己的网络配置信息。这样网络中的各主机就都可以从 DHCP 服务器自动获取网络配置信息而不用手工参与。
02 动态主机配置协议DHCP的基本工作过程
DHCP 使用客户/服务器方式。在 DHCP 服务器上运行DHCP 服务器进程,也可简称为 DHCP 服务器;在用户主机上运行 DHCP 客户进程,也可简称为 DHCP 客户。DHCP 是 TCP/IP 协议体系应用层中的协议,它使用运输层的 UDP 所提供的服务。也就是说,DHCP 报文在运输层会被封装成为 UDP 用户数据报。DHCP 服务器使用的 UDP 端口是 67,DHCP 客户使用的 UDP 端口是 68,这两个 UDP 端口都是熟知端口。封装有 DHCP 报文的UDP 用户数据报在网络层会被封装成 IP 数据报,然后再根据所使用的网络接口,封装成相应的数据链路层的帧进行发送,例如封装成以太网帧。(为了简单起见,在后续描述过程中,除非有特别需要,否则将不再每次都描述 DHCP 报文逐层封装的过程。)
03 DHCP中继代理
该网络中的各主机是否可以通过 DHCP 来自动获取到网络配置信息呢?答案是否定的,原因很简单,该网络中的主机广播发送 DHCP 发现报文,但该广播报文不会被路由器转发,而是丢弃(因为路由器可以隔绝广播域)。解决方式是给该路由器配置 DHCP 服务器的 IP 地址并使之成为 DHCP 中继代理。这样该网络中的各主机就可以通过 DHCP 来自动获取到网络配置信息了。当该路由器收到广播的 DHCP 发现报文后,会将其单播转发给 DHCP 服务器。使用 DHCP 中继代理的主要原因是我们并不愿意在每一个网络上都设置一个 DHCP 服务器,因为这样会使 DHCP 服务器的数量太多。
01 域名系统的作用
当我们在浏览器地址栏中输入某个 Web 服务器的域名时,用户主机会首先在自己的 DNS 高速缓存中查找该域名所对应的 IP 地址。如果没有找到,则会向网络中的某台 DNS 服务器查询。DNS 服务器中有域名和 IP 地址映射关系的数据库。当 DNS服务器收到 DNS 查询报文后,在其数据库中进行查寻,之后会将查寻结果发送给用户主机。现在,用户主机中的浏览器可以通过 Web 服务器的 IP 地址对其进行访问了。
因特网是否可以只使用一台DNS服务器?
这种做法并不可取。因为因特网的规模很大,这样的域名服务器肯定会因为超负荷而无法正常工作,而且一旦域名服务器出现故障,整个因特网就会瘫痪。早在1983年,因特网就开始采用层次结构的命名树作为主机的名字(即域名),并使用分布式的域名系统DNS。DNS使大多数域名都在本地解析,仅少量解析需要在因特网上通信,因此系统效率很高。由于DNS是分布式系统,即使单个计算机出了故障,也不会妨碍整个系统的正常运行。
02 因特网的域名结构
需要注意的是,名称相同的域名其登记未必相同。例如,com 是通用顶级域名,但我国顶级域名 cn 下也有一个名称为 com 的二级域名。
03 因特网上的域名服务器
域名和IP地址的映射关系必须保存在域名服务器中,供所有其他应用查询。显然不能将所有信息都储存在一台域名服务器中。DNS使用分布在各地的域名服务器来实现域名到IP地址的转换。
04 因特网的域名解析过程
01 文件传送协议FTP的作用
FTP 采用客户/服务器方式。因特网上的 FTP客户计算机可将各种类型的文件上传到 FTP 服务器计算机。FTP 客户计算机也可以从 FTP 服务器计算机下载文件。
02 文件传送协议FTP的基本工作原理
1、主动模式(建立数据通道时,FTP服务器主动连接FTP客户)
如图所示,FTP 服务器监听熟知端口号 21。FTP 客户随机选择一个临时端口号与其建立 TCP 连接。这条 TCP 连接用于 FTP 客户与服务器之间传送 FTP 的相关控制命令。也就是说,这条 TCP 连接是 FTP 客户与服务器之间的命令通道。当有数据要传输时,FTP 客户通过命令通道告知 FTP 服务器来与自己的另一个临时端口号建立 TCP 连接,即建立数据通道。FTP 服务器使用自己的熟知端口号 20 与其建立 TCP 连接。这条 TCP 连接用于 FTP 客户与服务器之间传送文件。也就是说,这条 TCP 连接时 FTP 客户与服务器之间的数据通道。由于在建立数据通道时,FTP 服务器主动连接 FTP 客户,因此称为主动模式。
2、被动模式(建立数据通道时,FTP服务器被动等待FTP客户的连接)
对于 FTP 客户与服务器之间命令通道的建立,它与主动模式并没有什么不同。不同之处在于,当有数据要传输时,FTP 客户通过命令通道通知 FTP 服务器开启某个协商好的临时端口被动等待来自 FTP 客户的 TCP 连接以建立数据通道。这时 FTP 服务器使用的是与 FTP 客户协商好的临时端口号。FTP 客户发起与 FTP 服务器的 TCP 连接以建立数据通道。由于在建立数据通道时,FTP 服务器被动等待FTP 客户的连接,因此称为被动模式。
01 电子邮件系统的组成
02 简单邮件传送协议(Simple Mail Transfer Protocol,SMTP)的基本工作过程
发送方邮件服务器周期性地扫描邮件缓存,如果发现有待转发的邮件,则发送方邮件服务器中的 SMTP 客户会与接收方邮件服务器中的 SMTP 服务器进行 TCP 连接。之后SMTP 客户就可以基于这条 TCP 连接给 SMTP 服务器发送 SMTP 命令,共 14 条。SMTP 服务器也会给SMTP 客户发送相应的应答,共 21 种。SMTP 客户与服务器之间通过命令与应答的交互方式最终实现 SMTP 客户发送邮件给 SMTP 服务器。
当 TCP 连接建立成功后,SMTP 服务器会主动推送服务就绪应答给 SMTP 客户。应答代码 220 后面可能跟有描述信息。
SMTP 客户收到该应答后,向服务器表明身份,告知自己的域名。具体命令为HELO,其后为命令参数。SMTP 服务器若认为身份有效,则发回应答代码250;否则发回其他代码。
SMTP 客户收到该应答后,使用命令 MAIL FROM 来告诉服务器邮件来自何方。SMTP 服务器若认为合理,则发回应代码 250;否则发回其他错误代码。SMTP 客户收到该应答后,使用命令 RCPT TO 来告诉服务器邮件去往何方,也就是收件人邮箱。SMTP 服务器中如果有该收件人邮箱,则发回应代码 250;否则发回其他错误代码。SMTP 客户收到该应答后,使用DATA 命令来告诉服务器自己准备发送邮件内容了。SMTP 服务器如果准备好接收,发回应答代码354;否则,发回其他错误代码。SMTP 客户收到该应答后,就向服务器发送邮件内容。SMTP 客户发送完邮件内容后,还要发送结束符。SMTP 服务器若收件成功,则发回应答代码250;否则,发回其他错误代码。SMTP 客户收到该应答后,使用命令 QUIT 向服务器请求断开连接。SMTP 服务器发回应答代码221表示接受请求并主动断开连接。
03 电子邮件的信息格式
首部和主体的信息都需要由用户来填写。首部中包含有一些关键字,后面加上冒号。例如,关键字From,后面填入发件人的电子邮件地址,一般由邮件系统自动填入;关键字 To,后面填入一个或多个收件人的电子邮件地址;关键字 Cc,后面填入一个或多个收件人以外的抄送人的电子邮件地址。抄送人收到邮件后,可看可不看邮件,可回可不回邮件;关键字 Subject,后面填入邮件的主题。它反映了邮件的主要内容。很显然,最重要的关键字是 To 和Subject,它们往往是必填选项。用户写好首部后,邮件系统将自动地将信封所需的信息提取出来并写在信封上。所以用户不需要填写电子邮件信封上的信息。在填写完首部各关键字的内容后,用户还需要撰写邮件的主体部分,这才是用户想传递给收件人的核心信息。
04 多用途因特网邮件扩展
假设发送方发送的电子邮件中包含有非 ASCII 码数据,则不能直接使用 SMTP 进行传送。需要经过MIME 进行转换,将非 ASCII 码数据转换为 ASCII 码数据。然后就可以使用 SMTP 进行转发传送了。接收方也要使用 MIME 对接收到的 ASCII 码数据进行逆转换,这样就可以得到包含有非 ASCII 码数据的电子邮件。
05 常用的邮件读取协议
06 基于万维网的电子邮件
①用户 A 要给用户 B 发送邮件。用户 A 使用浏览器登陆邮件服务器网站,撰写并发送邮件给用户 B。用户 B 也使用浏览器登陆邮件服务器网站,读取收到的邮件。用户 A 和 B 在发送和接收邮件时与服务器之间都使用的是 HTTP 协议,而不需要使用 SMTP 和 POP3协议。
②假设用户 A 使用网易邮件服务器,用户 C 使用谷歌邮件服务器,用户 A 要给用户 C 发送邮件。用户 A 使用浏览器登陆自己的邮件服务器网站,撰写并发送邮件给用户 C,使用的是 HTTP 协议。用户 A 的邮件服务器使用SMTP 将邮件发送给用户 C 的邮件服务器。用户 C 也使用浏览器登陆自己的邮件服务器网站,读取收到的邮件,使用的也是 HTTP 协议。
01 万维网概述
超文本标记语言 (HyperText Markup Language,HTML)使用多种“标签”来描述网页的结构和内容
02 超文本传输协议HTTP
浏览器可以只下载文本部分。就像我们进入了百度音乐的这样一个网站,那进入之后我们就可以看到有很多歌曲但是现在他们不能播放,我们要做的就是点击这样一个播放按钮,点击播放按钮之后才可以播放音乐,那这个点击播放按钮之后其实就是再次循环了这样八个步骤。
HTTP/1.0采用非持续连接方式。在该方式下,每次浏览器要请求一个文件都要与服务器建立TCP连接,当收到响应后就立即关闭连接。
在这三个报文的最后一个报文的数据载荷部分,携带有 HTTP 请求报文。服务器收到后给客户发回 HTTP响应报文。
HTTP/1.1采用持续连接方式。在该方式下,万维网服务器在发送响应后仍然保持这条连接,使同一个客户(浏览器)和该服务器可以继续在这条连接上传送后续的HTTP请求报文和响应报文。这并不局限于传送同一个页面上引用的对象,而是只要这些文档都在同一个服务器上就行。
为了进一步提高效率,HTTP/1.1的持续连接还可以使用流水线方式工作,即浏览器在收到HTTP的响应报文之前就能够连续发送多个请求报文。这样的一个接一个的请求报文到达服务器后,服务器就发回一个接一个的响应报文。这样就节省了很多个RTT时间,使TCP连接中的空闲时间减少,提高了下载文档的效率。
03 HTTP的报文格式
04 使用Cookie在服务器上记录用户信息
用户主机中的浏览器进程首先与万维网服务器中的服务器进程建立 TCP 连接。当用户的浏览器进程初次向服务器进程发送 HTTP 请求报文时,服务器进程就会为其产生一个唯一的Cookie 识别码,并以此为索引在服务器的后端数据库中创建一个项目,用来记录该用户访问该网站的各种信息。接着就会给浏览器进程发回 HTTP响应报文。在响应报文中,包含有一个首部字段为 Set-Cookie 的首部行,该字段的取值就是 Cookie 识别码。当浏览器进程收到该响应报文后,就在一个特定的 Cookie 文件中添加一行,记录该服务器的域名和 Cookie 识别码。当用户再次使用该浏览器访问这个网站时,每发送一个 HTTP 请求报文,浏览器都会从 Cookie 文件中取出该网站的 Cookie 识别码,并放到 HTTP 请求报文的 Cookie 首部行中。服务器根据 Cookie 识别码就可以识别出该用户,并返回该用户的个性化网页。