四、网络层
本章重要内容:
虚拟互联网络的概念
IP地址与物理地址的关系
传统的分类的IP地址(包括子网掩码)和误分类域间路由选择CIDR
路由选择协议的工作原理
网络层提供的两种服务
网络层应该用”面向连接“还是”无连接“服务?
面向连接服务:
传统电信网的电话服务,向电话机(用户)提供可靠的传输服务。
如果计算机使用面向连接服务,两台计算机进行通信时,要先建立虚电路VC,以预留双方通信所需的一切网络资源。然后双方就沿着已建立的虚电路发送分组。这样的分组首部不需要填写玩真的个目的地址,而只需要填写这条虚电路的编号(一个不大的整数),因而减小了分组的开销。这种通信方式如果再使用可靠的传输协议,就可以使所发送的分组无差错按序到达终点。在通信结束后要释放建立的虚电路。
但是互联网先驱却使用了一种崭新的思路。他们认为电信网中,电话终端没有计算能力,电话机不能自行差错处理,因此电信网必须负责起可靠传输。而互联网中的PC拥有计算能力,可以自行差错处理判断。
互联网采用的设计思路是这样的:网络层向上提供简单灵活的、无连接、尽量最大努力交付的数据报服务
无连接服务:
每一个分组独立发送,不分顺序。不处理分组的丢失、出错、重复和失序。
由于网络层采用了这种思路——不提供服务质量的承诺。这就使得路由器比较简单,价格低廉。网络造价成本降低,后期调整灵活(因为简单和低成本)。互联网能发展到今天的规模,充分说明了这种思路的正确性
鉴于TCP/IP体系的网络层提供的是数据报服务,下面我们就讨论围绕网络层如何传送IP数据报这个主题
网际协议IP
IP协议:是用来使互联起来的许多计算机网络能够进行通信,也因此TCP/IP体系中的网络层被称为网际层或IP层
与IP配套的还有三个协议:
-
地址解析协议ARP
-
网际控制报文协议ICMP
-
网际组管理协议IGMP
-
IP、ARP、ICMP、IGMP之间的关系
ARP在最下面,因为IP经常要用这个协议,ICMP、IGMP在上层因为他俩要使用IP协议
虚拟互联网络
世界范围内有很多种网络,每种网络都有:
- 不同的寻址方案
- 不同的最大分组长度
- 不同的网络接入机制
- 不同的超时控制
- 不同的差错恢复法
- 不同的状态报告法
- 不同的路由选择技术
- 不同的用户接入控制
- 不同的服务(面向连接服务和无连接服务)
- 不同的管理与控制方式
能不能让大家都使用相同的网络,这样可使网络互联变得比较简单。答案是不。因为用户的需求是多种多样的,没有一种单一的网络能适应所有用户的需求。
一般将网络互连起来需要用到中间设备。根据中间设备所在的层次,可以分为:
- 物理层——转发器
- 数据链路层——网桥或桥接器
- 网络层——路由器
- 网络层以上——网关,用网关连接两个不兼容的系统需要在高层进行协议转换,由于网关比较复杂现在使用的较少。
转发器和网桥只是把一个网络给扩大了,从网络层的角度看,这仍是一个网络。因此讨论网络互连时都是指用路由器进行网络互连和路由选择。由于历史原因,许多文献曾经把网络层的路由器称为网关,请读者加以注意。(可以把网关当作路由器)
可以把许多网络互联之后组成的网络(共同使用IP协议)看作一个虚拟互联网络。所谓虚拟互联网络也就是逻辑上互联,互连起来的各种物理网络的异构型是客观存在的,但是我们用IP协议就可以使这些性能各异的网络在网络层上看起来好像是一个统一的网络。可以把虚拟互联网络简称为——IP网。
屏蔽了异构网络之间的差异,在网络层的研究就可以很方便。
分组在互联网中的传输:
分类的IP地址
-
IP地址及其表示方法
IP地址的编址方法经历了三个阶段:
①分类的IP地址
②子网的划分
③构成超网
我们先来讨论第一阶段——分类的IP地址
上图中的地址分类为两级:网络号+主机号
A类:网络号8位+主机号24位
B类:网络号16位+主机号16位
C类:网络号24位+主机号8位
网络号前端有1-3位的类别位(见上图)
A、B、C类为单播地址,D类属于多播,E类保留作为以后使用。
其实分类的IP地址已经被淘汰,但是为了从概念上演进更为清晰,因此我们在这里还要从分类的IP地址讲起
把IP地址分为A、B、C三个类别,当初是这样考虑的。有的网络上需要很多主机,有的网络需要较少的主机,把IP分为ABC类可以更灵活的满足用户的需求,当某个单位申请到了一个IP地址时,实际上是获得了具有同样网络号的一块地址,其中具体主机号由该单位自行分配。
采用点分十进制记法能提高可读性:
机器中存放的IP是连续的二进制代码:10000000000010110000001100011111
每隔8位插入一个空格提高可读性:10000000 00001011 00000011 00011111
把8位的二进制转换为十进制:128.11.3.31
-
常用的三种类别IP地址
A类地址空间
网络号字段占1字节,只有7位可以使用(第一位已经固定为0),但可以指派的网络号是126个(2⁷-2)。
减2的原因:
-
IP地址中全0表示”这个(this)“。网络号全0的IP地址是个保留地址,意思是”本网络“
-
网络号为127(即01111111)保留作为本地软件回环测试本主机的进程之间的通信之用。
若主机发送一个目的地址为回环地址(127.0.0.1)的IP数据报,则本主机中的协议软件就处理IP数据报中的数据,而不会把数据报发送到任何网络
主机号占3字节,每个网络号中最大的主机数是2²⁴-2=16777214
减2的原因:
-
全0的主机号字段表示该IP地址是”本主机“所连接到的单个网络地址:一个主机IP地址为5.6.7.8,则该主机所在的网络地址就是5.0.0.0
-
全1表示所有的(all),该网络上的所有主机
B类地址128.7.255.255表示”在网络128.7.0.0上的所有主机“
A类地址0.0.0.35表示”这个网络上主机号为35的主机“
IP地址空间有2³²个地址,整个A类地址空间共有2³¹个,占了整个IP地址空间的50%
B类地址空间
网络号字段有2个字节,但是前两位(1 0)已经固定了,只剩下14位。因为网络号字段后面14位无论怎么取值也不可能出现使整个2字节的网络号字段成为全0或全1的主机号。整个B类地址空间共约有2³⁰个地址,占整个IP地址空间的25%
C类地址空间
网络号字段3字节,最前面3位(1 1 0),还有21位可以分配。C类地址可指派的网络总数是2²¹。每一个C类地址最大主机数是2⁸-2=254.整个C类2²⁹占IP总数的12.5%
IP地址具有的特点
- 每一个IP地址都由网络号和主机号两部分组成。这是一种二级结构,IP机构只分配网络号,利于管理,路由器仅根据网络号来转发分组,这样使路由表中的项目大幅减少。
- 一台主机同时连接到两个网络上,该主机就必须具备两个IP地址,其网络号必须是不同的,这种主机称为多归属主机
- 用转发器或网桥连接起来的若干个局域网仍为一个网络。因为这些局域网具有相同的网络号,具有不同网络号的局域网必须使用路由器进行互联
- 互联网同等对待每一个IP地址
- 当两台路由器直接相连时,在连线两端的接口处,可以分配也可以不分配IP地址,现在为了节省IP地址资源常常不分配IP地址,把这样的网络叫做无编号网络或无名网络
-
IP地址与硬件地址
4-9(b)特别强调了IP地址与硬件地址的区别
- 在IP层抽象的互联网上只能看到IP数据报,IP数据报经过路由器转发,但是其首部的源地址和目的地址始终分别是IP₁和IP₂
- 虽然IP数据报首部有源站IP地址,但路由器只根据目的站的IP地址的网络号进行路由选择
- 在局域网数据链路层只能看到MAC帧。IP数据报被封装在MAC帧中,MAC帧在不同网络上传送时,其MAC帧首部中的源地址和目的地址都要变化。MAC帧的这种首部变化,在上面IP层是看不见的
- 尽管互联在一起的网络的硬件地址体系各不相同,但IP层抽象的互联网却屏蔽了下层这些复杂的细节。只要我们在网络层上讨论问题,就能使用统一的、抽象地IP地址研究主机和主机或路由器之间的通信
地址解析协议ARP
实际应用中,我们经常会遇到:已经知道了一个机器的IP地址,需要找出其相应的硬件地址。
网络层使用的是IP地址,但是在实际网络的链路上传送数据帧时,最终还是必须使用该网络的硬件地址。所以要找到IP地址和MAC地址的映射关系。
ARP解决这个问题的办法是在主机ARP高速缓存中存放一个从IP到MAC的地址映射表并且这个表还是动态更新。
由于IP地址使用的ARP协议,因此通常把ARP协议规划到网络层,但ARP协议的用途是为了从网络层使用的IP地址,解析出在数据链路层使用的硬件地址。因此有的书中按照协议所用,把ARP规划在数据链路层也是可以的。
ARP高速缓存
每一台主机都有一个ARP高速缓存,里面有本局域网上各主机和路由器的IP地址到硬件地址的映射表,这些都是该主机目前知道的地址。
主机A要向本局域网上的某台主机B发送IP数据报时,就先在其ARP高速缓存中查看有无B主机的IP地址。如有就找到MAC地址然后在局域网上发送数据。
也有可能查不到主机B,原因是主机B刚加入局域网,或者,主机A刚加电开机其ARP高速缓存还是空的。
在ARP高速缓存中找不到物理地址,主机A就自动运行ARP,按照以下步骤找到主机B的硬件地址
-
ARP进程在本局域网上广播发送一个ARP请求分组,分组的主要内容是:“我的IP地址是209.0.0.5,硬件地址是00-00-C0-15-AD-18.我想知道IP地址为209.0.0.6的主机的硬件地址”
-
本局域网上的所有主机上运行的ARP进程都会收到此ARP请求分组
-
主机B的IP地址与ARP请求分组中要查询的IP地址一致,就收下这个ARP请求分组,并向主机A发送ARP响应分组(单播),在这个响应分组中写入自己的MAC地址。其他所有主机都不理睬这个ARP分组。响应分组的主要内容是:“我的IP地址是209.0.0.6,我的硬件地址是08-00-2B-00-EE-0A”
-
主机A收到主机B的ARP响应分组之后,就在其ARP高速缓存中写入主机B的IP地址到硬件地址的映射
主机B在收到主机A发来的ARP请求后就会把A的IP地址和MAC地址记录下来,以便后续使用。
ARP高速缓存中的项目都有生存时间(例如10分-20分),假如B的网卡坏了立即换了块,B的硬件地址就变了,这时A的ARP高速缓存中的项目就需要更新了。有了生存时间,就会定期更新。
使用ARP的四种典型情况
- 发送方是主机(如H1),要把IP数据报发送到同一网络上的另一台主机(如H2),这是H1发送ARP请求分组(在网1上广播),找到目的主机H2的硬件地址
- 发送方是主机(如H1),要把IP数据报发送到另一个网络上的一台主机(如H3或H4),这时H1发送ARP请求分组(在网1上广播),找到网1上的一个路由器R1的硬件地址。剩下的交给路由器R1来完成。
- 发送方是路由器(如R1),要把IP数据报转发到与R1连接在同一网络(网2)上的主机(如H3)。这时R1发送ARP请求分组(在网2上广播),找到目的主机H3的硬件地址。
- 发送方如果是路由器(如R1),要把IP数据报转发到网3上的一台主机(如H4),H4与R1不是一个网络上的,这时R1发送ARP请求分组(在网2),找到连接在网2上的一个路由器R2的硬件地址。剩下的交给路由器R2来完成
既然在网络链路上传送的帧最终是按照硬件地址找到目的主机的,那么我们为什么还要使用IP地址?
由于全世界存在各式各样的网络,它们使用不同的硬件地址,要使这些异构的网络能够互相通信就必须进行非常复杂的硬件地址转换工作,但IP编址使它们之间的通信就像连接在同一个网络上那样简单。因此在虚拟网络上用IP地址进行通信会给用户带来很大的方便。
IP数据报的格式
-
版本:4位,目前广泛使用的是IPV4版本。
-
首部长度:4位,首部长度字段所表示的单位是32位(4字节),因为IP首部固定长度就是20字节,所以首部字段长度的最小值是5,而首部长度字段的最大值二进制1111=十进制15,15*32=60字节。当IP首部长度不是4字节的整数倍时,必须利用最后的字段加以填充。最常用的首部长度是20,这时不使用选项。
-
区分服务:占8位,基本不用这个字段
-
总长度:16位,首部和数据之和的长度,单位为字节。数据报长度最大为2¹⁶-1 = 65535字节,然而实际上传送这样长的数据报在现实中很少遇到。IP层下面的每一种数据链路层协议都规定了一个数据帧中的数据字段的最大长度——最大传送单元MTU,当一个IP数据报封装成链路层的帧时,此数据报的总长度(首部+数据部分)一定不能超过下面的数据链路层规定的MTU值。例如最常用的以太网就规定MTU为1500字节,若所传的数据报长度超过数据链路层的MTU值,就必须把过长的数据报进行分片处理
-
标识:16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报片的标识字段中,相同的标识字段的值使分片后的各数据报片最后能正确的重装成原来的数据报。
-
标志:3位,但目前只有两位有意义。
- 标志字段中的最低位记为MF。MF=1表示后面还有分片
- 标志字段中间的一位记为DF,意思是不能分片。只有当DF=0时才能分片
-
片偏移:13位。较长的分组在分片后,某片在原分组中的相对位置。也就是说。相对于用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,除最后一个数据报片外,每个片的长度一定是8字节的整数倍
一个数据报总长度3820字节,数据部分3800字节(使用固定首部),需要分片为长度不超过1420字节的数据报片。因其首部固定长度20字节,所以每个数据报片的数据部分不超过1400字节。于是分为3个片。原始数据报首部被复制为各数据报片的首部。但是必须修改有关字段的值
现在假定数据报片2经过某个网络时还需要进行分片,即划分为数据报片2-1(携带数据800字节)和数据报片2-2.那么这两个片的总长度、标识、MF、DF和片偏移分别为:820,12345,1,0,175;620,12345,1,0,275
-
生存时间:8位。TTL。由发出源点设置这个字段。其目的时防止无法交付的数据报无限制的在互联网中兜圈子。一开始是以时间为单位,后来改为了“跳数”为单位,TTL的功能变为“跳数限制”。显然数据报在互联网中经过的路由器最大数值是255。若把TTL的初始值设置为1,就表示这个数据报只能在本局域网中传送。因为这个数据报一传送到局域网上的某个路由器上,在被转发之前TTL就减小到0,因而就会被这个路由器丢弃。
-
协议:8位。该字段指出此数据报携带的数据是使用何种协议,以便目的主机的IP层知道应将数据部分上交给哪个协议进行处理。
-
首部校验和:16位。此字段只检验数据报的首部,不包括数据部分。为了减少计算量不检验数据部分,并且也不使用复杂的CRC检验码而采用其他的较简单的计算方法。如果首部未发生变化就保留这个数据报,若发生变化就丢弃。
-
源地址:32位
-
目的地址:32位
-
IP数据报首部的可变部分
IP数据报首部可变部分就是一个选项字段。选项字段用来支持排错、测量以及安全等,内容非常丰富。此字段长度可变,从1字节到40字节不等。某些选项项目只需要1个字节,它只包括1个字节的选项代码。而有些选项需要多个字节,这些选项一个个拼起来,中间不需要有分隔符,最后用全0的填充字段补齐成为4字节的整数倍。实际上这些选项很少使用,很多路由器都不考虑IP首部选项字段,因此新版本IPv6九八数据报首部长度做成固定的。
IP转发分组的流程
下图有四个A类网络通过三个路由器连接起来。每一个网络上都有可能存在上万个主机。可以想象如果路由表指出到每一台主机应怎样转发,则所得出的路由表就会过于庞大(如果每个网络有1万台主机,那每一个路由表就要有4万个项目。每一行对应一台主机)。但若路由表指出到某一个网络应如何转发,则每个路由器中的路由表就只包含4个项目。
路由表中对每一条路由最主要的是以下两个信息:
(目的网络地址,下一跳地址)
虽然互联网所有的分组转发都是基于目的主机所在的网络,但在大多数情况下都允许有这样的特例,即对特定的目的主机指明一个路由。这种路由叫特定主机路由。采用特定主机路由可以使网络管理人员方便的控制网络和测试网络,同时也可以在需要考虑某种安全问题时采用这种特定主机路由。在对网络的连接或路由表进行排错时,指明到某一台主机的特定路由就时分有用
路由器还可以采用默认路由以减少路由表所占用的空间和搜索路由表所用的时间。这种转发方式在一个网络只有很少的对外连接时是很有用的。之前已经讲过,主机在发送每一个IP数据报时都要查找自己的路由表。如果一台主机连接在一个小网络上,而这个网络只用一个路由器和互联网连接,那么在这种情况下使用默认路由是非常合适的。如下图:连接在网络N1上的任何一台主机中的路由表只需要三个项目即可。第一个项目就是到本网络主机的路由,其目的网络就是本网络N1,因而不需要路由转发,而是直接交付。第二个项目是到网络N2的路由,对应下一跳路由器是R2。第三个项目就是默认路由。只要目的网络是其他网络(不是N1或N2),就一律选择默认路由。在实际上的路由器中,像图中路由表所示的“直接”和“默认”的几个字并没有出现在路由表中,而是被记为0.0.0.0。
再次强调,在IP地址数据报首部中没有地方可以用来指明“下一跳路由器的IP地址”。在IP数据报首部写上的IP地址是源IP地址和目的IP地址,而没有中间经过的路由器IP地址。那么待转发数据报又是怎样能够找到下一跳路由器的呢?
当路由器收到一个待转发的数据报,在从路由表中得出下一跳路由器的IP地址后,不是把这个地址填入IP数据报,而是送交数据链路层的网络接口软件。网络接口软件负责把下一跳路由器的IP地址转换成MAC地址(必须使用ARP),并将此硬件地址放在数据链路层的MAC帧首部,然后根据这个硬件地址找到下一跳路由器。由此可见,当发送一连串的数据报时,上述的这种查路由表、用ARP得到硬件地址、把硬件地址写入MAC帧的首部等过程,将不断的重复进行,造成了一定的开销。
那么,能不能在路由表中不使用IP地址而直接使用硬件地址呢?不行。我们一定要弄清楚。使用抽象的IP地址,本来就是为了隐藏各种底层网络的复杂性而便于分析和研究问题,这样就不可避免的付出一定代价,例如在选择路由时带来了一定的开销。但反过来如果在路由表中直接使用硬件地址,那就会带来更多的麻烦。
根据上述,可归纳出分组转发的算法如下:
- 从数据报的首部提取目的主机的IP地址D,得出网络地址为N。
- 若N就是与此路由器直接相连的某个网络地址,则直接交付(这里包括把目的主机地址D转换为具体的硬件地址,把数据报封装为MAC帧,再发送此帧);否则间接交付,执行3.
- 若路由表中有目的地址为D的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则执行4.
- 若路由表中有到达网络N的路由,则把数据报传送给路由表中所指明的下一跳路由器;否则执行5.
- 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则执行6.
- 报告转发分组出错
划分子网和构造超网
划分子网
-
从两级IP地址到三级IP地址
为什么要发展为三级地址?
早期的分类IP地址有几个个缺点:
①IP地址空间利用率低,A类地址网络可连接主机数超过1000万,有的单位用不了这么多,还占用着。
②给每一个物理网络分配一个网络号会使路由表变得太大。互联网上的网络数越多,路由表的项目数也就越多。
③两级IP地址不够灵活。有时情况紧急,一个单位需要在新的地点马上开通一个新网络。但是在申请到一个新的IP地址之前,新增加的网络时不可能连接到互联网上工作的。
解决办法是:
在IP地址中新增一个“子网号字段”,使两级的IP地址变成三级IP地址。这种做法叫划分子网或子网寻址或子网路由选择。
那么划分子网之后是怎么解决以上问题的?它的原理是什么?
划分子网的基本思路如下:
①一个拥有许多物理网络的单位,可将所属的物理网络划分为若干个子网。划分子网纯属一个单位内部的事情。本单位以外的网络看不见这个网络是由多少个子网组成,因为这个单位对外仍表现为一个网络。
②划分子网的方法是从网络的主机号借用若干位作为子网号。于是两级IP地址在本单位内部就变为了三级IP地址:网络号、子网号、主机号
③凡是从其他网络发送给本单位某台主机的IP数据报,仍然是根据IP数据报的目的网络号找到连接在本单位网络上的路由器。但此路由器收到IP数据报后,再按目的网络号和子网号找到目的子网,把IP数据报交付给目的主机。
-
子网掩码
子网掩码是什么?子网掩码能用来干什么?
上面知道了划分子网之后,假定有一个数据报(其目的地址是145.13.3.10)已经到达了路由器R₁。那么这个路由器怎么把它转发到子网145.13.3.0呢?
从IP数据报肯定是看不出源主机或目的主机所连接网络是否进行了子网划分。因为IP数据报信息中没有任何字段是有关子网划分的。
因此前人们能想到的办法就是使用子网掩码。
路由器在拿到数据报之后,使用三级IP地址的子网掩码可以很方便的提取出子网网络地址(按位与)。使用子网掩码的好处就是不管网络有没有划分子网,只要把子网掩码和IP地址进行逐位的“与”运算,就立即得出了网络地址来。
现在互联网的标准规定:所有网络都必须使用子网掩码,同时在路由表中也必须有子网掩码这一栏。如果一个网络不划分子网,那么该网络的子网掩码就使用默认子网掩码。这么做可以不用查找该地址的类别位就能知道这是哪一类的IP地址。
虽然RFC文档中没有规定子网掩码中的一串1必须是连续的,但却极力推荐子网掩码中选用连续的1,以免出现可能发生的差错。
总结:
从网络145.13.0.0外面看,这就是一个普通的B类网络,其子网掩码是:
11111111 11111111 00000000 00000000
但进入到这个网络后(即到了路由器R₁),就看到了还有许多网络(即划分了子网后的许多网络),其网络地址是145.13.x.0。
子网掩码是一个网络或一个子网的重要属性。在RFC 950 成为互联网的正式标准后,路由器和相邻路由器之间交换路由信息时,必须把自己所在网络(或子网)的子网掩码告诉对方。在路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须给出该网络的子网掩码。若一个路由器连接在两个子网上就拥有两个网络地址和两个子网掩码。(有个疑问待解决:子网掩码是通过什么协议传送的?)
子网掩码解决了上述三个问题③每个单位网络号下的IP地址可以得到充分的利用了;①进而IP地址的空间利用率就提高了;②那么分配出去的网络号的增速就可以减缓了,路由器中的项目数的增加也就减缓了
例题:同样的IP地址和不同的子网掩码可以得出相同的网络地址。
使用子网时分组的转发
在划分子网的情况下,路由器转发分组的算法必须做出相应的改动。
划分子网后路由表必须包含以下三项内容:目的网络地址、子网掩码、下一跳地址。
划分子网的情况下,路由器转发分组算法如下:
①从收到的数据报首部提取目的IP地址D。
②先判断是否直接交付。对路由器直接相连的网络逐个进行检查:用各网络的子网掩码和D逐位相“与”,看结果是否和相应的网络地址匹配。若匹配,则把分组进行直接交付(当然还要把D转换成物理地址,把数据报封装成帧发送出去),转发任务结束。否则就是间接交付,执行③
③若路由表中有目的的地址为D的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则执行④
④对路由表中的每一行(目的网络地址,子网掩码,下一跳地址)。用其中的子网掩码和D逐位相“与”,其结果为N。若N与该行的网络地址相匹配,则把数据报传送给该行指明的下一跳路由器;否则执行⑤
⑤若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则执行⑥
⑥报告转发分组错误
无分类编址CIDR(构成超网)
-
网络前缀
历史上发生了什么?已经划分子网了,为什么还要改进?
1992年遇到的问题:
①B类地址在1992年已经分配了近一半,眼看就要全部分配完毕②互联网主干上的路由表中项目急剧增长(从几千增长到几万个)。
③整个IPv4的地址空间最终将全部耗尽。在2011年2月3日,官方宣布IPv4地址已经耗尽了。
当时预计前两个问题在1994年变得非常严重。因此为了解决前两个问题很快就研究出来了无分类编址方法,它的正式名字是无分类域间路由选择CIDR
CIDR干了两件事:
①CIDR消除了传统的A、B、C类地址以及划分子网的概念,因而能更加有效的分配IPv4地址空间,并且在新的IPv6使用之前容许互联网的规模继续增长。具体做法是:CIDR把32位IP地址划分成了两个部分——”网络前缀“、”主机号“。因此CIDR使IP地址从三级编址变回了两级,但这已经使无分类的两级编址
②CIDR把网络前缀都相同的连续IP地址组成一个”CIDR地址块“,我们只要知道地址快中的任何一个地址。就可以知道这个地址块的起始地址和最大地址,以及地址块中的地址数。
128.14.35.7/20=10000000 00001110 00100011 00000111
这个地址所在地址块中的最小地址和最大地址可以很方便的计算出:
最小地址——128.14.32.0=10000000 00001110 00100011 00000000
最大地址——128.14.47.255=10000000 00001110 00100011 11111111
当然以上这两个主机号是全0和全1的地址,一般不使用。
我们可以用最小地址和网络前缀的位数指明这个地址块。上面的地址块可记为:128.14.32.0/20。
CIDR记法:IP地址后面+斜线+网络前缀所占位数。如:128.14.32.0/20。不需要指出地址块的起始地址时可以把这样的地址快简称为:”/20地址块“。10.0.0.0/10也可以记为10/10,也就是省略了中间的连续0。
/20地址块的地址掩码是:11111111 11111111 11110000 00000000
有了CIDR记法了之后,继续使用地址掩码(也可继续叫子网掩码)的原因是?
地址掩码可以更快的找出IP地址中的网络地址,所以更方便的进行路由选择。
CIDR不使用子网,是指CIDR并没有在32位地址中指明若干位作为子网段。但是分配到了一个CIDR地址块的单位,仍然可以在本单位内根据需要划分出一些子网。这些子网也都只有一个网络前缀和一台主机号字段,但子网的网络前缀比整个单位的网络前缀要长一些。
在使用无分类域间路由选择CIDR之后,路由表中是怎么查找目的网络的?
由于一个CIDR地址块中有很多地址,所以在路由表中就利用CIDR地址块来查找目的网络。这种地址的聚合称为”路由聚合“,它使得路由表中的一个项目可以表示原来传统分类地址的很多个(例如上千个)路由。路由聚合也称为构成超网
如果没有采用CIDR,1994年和1995年,互联网的一个路由表就会超过7万个项目。而使用了CIDR后,在1996年一个路由表的项目数采只有3万多个。路由聚合有利于减少路由器之间的路由选择信息的交换,从而提高了整个互联网的性能。(个人思考:CIDR方式更灵活的分配IP地址,你需要多少IP地址我就分配给你多大的地址块,节省了CIDR地址块的分配数量,所以路由表中的项目就少了)。
上图中可看出,出最后几行外,CIDR地址块都包含了多个C类地址,这就是构成超网这一名词的来源
使用CIDR的一个好处就是可以更加有效的分配IPv4的地址空间,可以根据用户需要分配适当大小的CIDR地址块。然而在有分类编址的环境中,向一个部门分配IP地址,就只能以/8,/16,/24为单位来分配。这就很不灵活。
CIDR地址块分配的例子。假定某ISP已拥有地址块206.0.64.0/18(相当于有64个C类网络)。现在某大学需要800个IP地址。ISP可以给大学分配一个地址块206.0.68.0/22,它包括1024(即2¹⁰)个地址,相当于4个连续的C类/24地址块,占该ISP拥有的地址空间的1/16。这个大学然后可自由的对本校的各系分配地址块,而各系还可以再次划分本系的地址块。
从图中还可以清楚的看出地址聚合的概念。这个ISP共有64个C类网络。如果不采用CIDR技术,则在与该ISP的路由器交换路由信息的每一个路由器的路由表中,就需要有64个项目。但采用地址聚合后,就只需用路由聚合后的一个项目206.0.64.0/18就能找到该ISP。同理,这个大学共有4个系。在ISP内的路由器的路由表中,也许使用206.0.68.0/22这个项目。
-
最长前缀匹配
在使用CIDR时,由于采用了网络前缀这种记法,IP地址由网络前缀和主机号这两个部分组成,因此在路由表中的项目也要有相应的改变。这时,每个项目由”网络前缀“和”下一跳地址“组成。但是在查找路由表的时候可能得到不止一个匹配结果。那么这时我们应该选择哪个路由呢?
正确答案是:应当从匹配结果中选择具有最长网络前缀的路由。这叫做最长前缀匹配,这是因为网络前缀越长,路由就越具体。
假定大学下属四系希望ISP把转发给四系的数据报直接发到四系而不要经过大学的路由器,但又不愿意改变自己使用的IP地址块。因此在ISP的路由表中,至少要有以下两个项目,206.0.68.0/22(大学)和206.0.71.128/25(四系)。现在假定ISP收到一个数据报,其目的IP地址为D=206.0.71.130。把D分别和路由表中这两个项目的掩码逐位相与。将得到:
D和11111111 11111111 11111100 00000000 相与=206.0.68.0/22匹配
D和11111111 11111111 11111111 10000000 相与=206.0.71.128/25匹配
现在同一个IP地址D可以在路由表中找到两个匹配的目的网络(大学和四系),根据最长匹配的原理选择后者,把收到的数据报转发到后一个目的网络(四系)即选择两个匹配结果中更具体的那个。
如果IP地址的分配一开始就采用CIDR,那么我们可以按网络所在地理位置来分配地址块,这样就可大大减少路由表中的路由项目。例如可以将世界划分为四大地区,每一个地区分配一个CIDR地址块:
194/7(194.0.0.0 - 195.255.255.255)欧洲
198/7(198.0.0.0 - 199.255.255.255)北美洲
200/7(200.0.0.0 - 201.255.255.255)中美和南美洲
202/7(202.0.0.0 - 203.255.255.255)亚洲和太平洋地区
上面每一个地址块包含约3200万个地址。这种分配地址的方法就使得IP地址与地理位置相关联。他的好处是可以大大压缩路由表中的项目数。
但是在CIDR之前,互联网地址管理机构没有按地理位置来分配IP地址。现在要把已分配出去的IP地址收回再重新分配是件非常困难的事情。尽管这样CIDR已经推迟了IP地址耗尽的日期了。
-
使用二叉线索查找路由表。
网际控制报文协议ICMP
ICMP是干什么的?
为了更有效地转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议ICMP。ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP不是高层协议,它的报文是装在IP数据报中,作为其中的数据部分。
ICMP报文的种类
- ICMP差错报告报文
- ICMP询问报文
几种常用的ICMP报文类型
ICMP标准在不断更新,已不再使用的ICMP报文有:”信息请求与回答报文“、”地址掩码请求与回答报文“、”路由器请求与通告报文“以及”源点抑制报文“[RFC 6633].
ICMP报文的代码字段是为了进一步区分某种类型中的几种不同情况。检验和字段用来检验整个ICMP报文。我们应当还记得,IP数据报首部的检验和并不负责检验IP数据报的内容因此不能保证经过传输的ICMP报文不产生差错。
上图中的差错报告报文都是什么意思?
-
终点不可达:当路由器或主机不能交付数据报时就向源点发送终点不可达报文。
-
时间超过:当路由器收到生存时间为零的数据报时,除丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文。
-
参数问题:当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。
-
改变路由(重定向):路由器把改变路由报文发送给主机,让主机知道下次应该将数据报发送给另外的路由器(可通过更好的路由)。
简短解释下重定向。
我们知道互联网的主机中也要有一个路由表。当主机要发送数据报时,首先是查找自己的路由表,看应当从哪一个接口把数据报发送出去。在互联网中主机的数量远远大于路由器,出于效率考虑,这些主机不和连接在网络上的路由器定期交换数据。在主机刚开始工作时,一般都在路由表中设置一个默认路由器的IP地址。。不管数据报要发送到哪个目的地址,都一律先把数据报传送给这个默认路由器,而这个默认路由器知道到每一个目的网络的最佳路由(通过和其他路由器交换路由信息)。如果默认路由器发现主机发往某个目的地址的数据报的最佳路由应当经过网络上另一个路由器R时,就用改变路由报文把这情况告诉主机。于是该主机就在其路由表中增加一个项目:到某某目的地址应经过路由器R(而不是默认路由器)
所有ICMP差错报告报文中的数据字段都具有同样的格式。把收到的需要进行差错报告的IP数据报首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。再加上相应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报告的报文。提取收到的数据报的数据字段前8个字节是为了得到运输层的端口号(对于TCP和UDP)以及运输层报文的发送序号(对于TCP)。这些信息对源点通知高层协议是有用的。整个ICMP报文作为IP数据报的数据字段发送给源点。
下面是不应发送ICMP差错报告报文的几种情况。
- 对ICMP差错报告报文,不再发送ICMP差错报告报文
- 对第一个分片的数据报片的所有后续数据报片,都不发送ICMP差错报告报文
- 对具有多播地址的数据报,都不发送ICMP差错报告报文
- 对具有特殊地址(如127.0.0.0或0.0.0.0)的数据报,不发送ICMP差错报告报文
常用的ICMP询问报文有两种:
- 回送请求和回答: ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。
- 时间戳请求和回答:ICMP时间戳请求报文是请求某台主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中可写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。时间戳请求与回答可用于时钟同步的时间测量。
ICMP应用举例
PING:分组网间探测,用来测试两台主机之间的连通性。PING使用了ICMP回送请求与回送回答报文。PING是应用层直接使用网络层ICMP的一个例子。它没有通过TCP或UDP。
如图PC一连发送了四个ICMP回送请求报文。如果目标服务器正常工作而且响应这个ICMP回送请求报文(有的主机为了防止恶意攻击就不理睬外界发送过来的这种报文),那么它就发回ICMP回送回答报文。由往返的ICMP报文上都有时间戳,因此很容易得出往返时间。最后显示出的统计结果:发送到哪个机器(IP地址),发送的、收到的和丢失的分组数(但不会给出分组丢失的原因),以及往返时间的最小值、最大值、平均值。
traceroute(UNIX系统),tracert(Windows)。
Traceroute从源主机向目的主机发送一连串的IP数据报,数据报中封装的是无法交付的UDP用户数据报(使用了非法端口号)。第一个数据报P₁的生存时间TTL设置为1。当P₁到达路径上的第一个路由器R₁时,路由器R₁先收下它,接着把TTL减1 。由于TTL变为零了,R₁就把P₁丢弃了,并向源主机发送一个ICMP时间超过差错报告报文。
源主机接着发送第二个数据报P₂,并把TTL设置为2 。P₂先到达路由器R₁,R₁收下后把TTL减1再转发给路由器R₂。R₂收到P₂时TTL为1,但减一后TTL变为零了。R₂就丢弃P₂并向源主机发送一个ICMP时间超过差错报告报文。这样一直下去,当最后一个数据报刚刚到达目的主机时,数据报的TTL是1。主机不再转发数据报,也不把TTL减一了。但因IP数据报中封装的是无法交付的运输层的UDP用户数据报,因此目的主机要向源主机发送ICMP终点不可达差错报告报文。
这样源主机根据这些发送回来的ICMP报文,就得到了路由信息——到达目的主机所经过的路由器的IP地址,以及到达其中每一个路由器的往返时间。
从图中还能注意到,有时IP数据报所经过的路由器越多反而花费的时间越少。这是因为互联网的拥塞成都随时都在变化,也很难预料到。
互联网的路由选择协议
路由选择协议,也就是路由表中的路由是怎样得出来的。
-
理想的路由算法
- 算法必须是正确的和完整的
- 算法在计算上应简单
- 算法应能适应通信量和网络拓扑的变化
- 算法应具有稳定性
- 算法应是公平的
- 算法应是最佳的
从路由算法能否随网络的通信量或拓扑自适应地进行调整变化来划分,则只有两大类——静态路由选择策略、动态路由选择策略。
-
分层次的路由选择协议
- 内部网关协议IGP:RIP、OSPF协议。RIP协议使用运输层的用户数据报UDP进行传送;OSPF直接使用IP数据报传送。OSPF能做到多路径间的负载平衡,RIP只能找出到某个网络的一条路径。
- 外部网关协议EGP:BGP协议的版本4——BGP-4。使用TCP报文
路由器的构成
IPv6
从IPv4向IPv6过渡
-
双协议栈
一部分主机或者路由器装有双协议栈:一个IPv4和一个IPv6.因此双协议栈主机(或路由器)既能和IPv6的系统通信,又能够和IPv4的系统通信。双协议栈主机(或路由器)记为IPv6/IPv4,表明他同时拥有两种IP地址。
双协议栈主机在和IPv6主机通信时采用IPv6地址,在和IPv4主机通信时采用IPv4地址,但是它是怎么知道目的主机采用哪一种地址的呢?答:使用DNS来查询。若DNS返回IPv4协议,双方就使用IPv4,返回IPv6.......
需要注意:这种技术是先把IPv6数据报首部转换成IPv4数据报首部,然后通过了一段IPv4网络之后再把IPv4数据报首部转回IPv6。但是这个过程中IPv6首部中的某些字段去无法恢复。
A---------------->B------------------>C--------------------------->D-------------------->E-------------------->F
IPv6--------IPv6/IPv4-----------{IPv4<------->IPv4网络<----->IPv4}--------------IPv6/IPv4--------------IPv6
-
隧道技术
另一种过渡方法是隧道技术。这种方法的要点是在IPv6数据报要进入IPv4网络时,把IPv6数据报封装成为IPv4数据报。现在整个的IPv6数据报变成了IPv4数据报的数据部分。这样的IPv4数据报从路由器B经过路由器C、D,传送到E,而原来的IPv6数据报就好像在IPv4网络的隧道中传输,什么都没有变化。当IPv4数据报离开IPv4网络中的隧道时,再把数据部分(即原来的IPv6书数据报)交给主机的IPv6协议栈。请注意隧道中传送的数据报源地址是B而目的地址是E。
要使双协议栈的主机知道IPv4数据报里面封装的数据是一个IPv6数据报,就必须把IPv4首部的协议字段的值设置为41(41表示数据报的数据部分是IPv6数据报)
ICMPv6
和IPv4一样IPv6也不保证数据报的可靠交付。因此IPv6也需要使用ICMP来反馈一些差错信息。新的版本称为ICMPv6,它比ICMPv4要复杂的多。地址解析协议ARP和网际组管理协议IGMP的功能都已被合并到ICMPv6中。
IP多播
多播基本概念
在局域网上进行硬件多播
网际组管理协议IGMP和多播路由选择协议
- IP多播需要两种协议
- 网际组管理协议IGMP
- 多播路由选择协议
- 洪泛与剪除
- 隧道技术
- 基于核心的发现技术