IP协议概述

网际协议IP是TCP/IP体系中两个最主要的协议之一[STEV94][COME06][FORO10],也 是最重要的因特网标准协议之一。与IP协议配套使用的还有三个协议:

  1. 地址解析协议 ARP (Address Resolution Protocol)
  2. 网际控制报文协议 ICMP (Internet Control Message Protocol)
  3. 网际组管理协议 IGMP (Internet Group Management Protocol)

本来还有一个协议叫做逆地址解析协议RARP (Reverse Address Resolution Protocol),是和ARP协议配合使用的。但现在己被淘汰不使用了。

虚拟互联网络

我们知道,如果要在全世界范围内把数以百万计的网络都互连起来,并且能够互相通 信,那么这样的任务一定非常复杂。其中会遇到许多问题需要解决,如:

• 不同的寻址方案;
• 不同的最大分组长度;
• 不同的网络接入机制;
• 不同的超时控制;
• 不同的差错恢复方法;
• 不同的状态报告方法;
• 不同的路由选择技术;
• 不同的用户接入控制;
• 不同的服务(面向连接服务和无连接服务);
• 不同的管理与控制方式;

能不能让大家都使用相同的网络,这样可使网络互连变得比较简单。答案是不行的。 因为用户的需求是多种多样的,没有一种单一的网络能够适应所有用户的需求。另外,网络技术是不断发展的,网络的制造厂家也要经常推出新的网络,在竞争中求生存。因此在市场 上总是有很多种不同性能丨不同网络协议的网络,供不同的用户选用。

从一般的概念来讲,将网络互相连接起来要使用一些中间设备。根据中间设备所在的层次,可以有以下四种不同的中间设备:

(1) 物理层使用的中间设备叫做转发器(repeater)。

(2) 数据链路层使用的中间设备叫做网桥(bridge)。

(3) 网络层使用的中间设备叫做路由器(router)®。

(4) 在网络层以上使用的中间设备叫做网关(gateway)。用网关连接两个不兼容的系统需要在高层进行协议的转换。

当中间设备是转发器或网桥时,这仅仅是把一个网络扩大了,而从网络层的角度看, 这仍然是一个网络,一般并不称之为网络互连。网关由于比较复杂,目前使用得较少。因此 现在我们讨论网络互连时,都是指用路由器进行网络互连和路由选择。路由器其实就是一台专用计算机,用来在互联网中进行路由选择。

TCP/IP体系在网络互连上采用的做法是在网络层(即IP层)采用了标准化协议,但相互连接的网络则可以是异构的。图4-3(a)表示有许多计算机网络通过一些路由器进行互连。 由于参加互连的计算机网络都使用相同的网际协议IP (Internet Protocol),因此可以把互连以 后的计算机网络看成一个虚拟互连网络(internet)。

所谓虚拟互连网络也就是逻辑互连网络,它的意思就是互连起来的各种物理网络的异构性本来是客观存在的,但是 我们利用IP协议就可以使这些性能各异的网络在网络层上看起来好像是一个统一的网络。

这种使用IP协议的虚拟互连网络可简称为IP网(IP网是虚拟的,但平常不必每次都强调 “虚拟”二字)。使用IP网的好处是:当IP网上的主机进行通信时,就好像在一个单个网络上通信一样,它们看不见互连的各网络的具体异构细节(如具体的编址方案、路由选择协议,等等)。

当很多异构网络通过路由器互连起来时,如果所有的网络都使用相同的IP协议,那么在网络层讨论问题就显得很方便。

IP地址

IP地址就是给因特网上的每一个主机 (或路由器)的每一个接口分配一个在全世界范围是唯一的32位的标识符。IP地址的结构 使我们可以在因特网上很方便地进行寻址。IP地址现在由因特网名字和数字分配机构 ICANN (Internet Corporation for Assigned Names and Numbers)进行分配。

为了便于寻址以及层次化构造网络,每个IP地址包括两个标识码(ID),即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。Internet委员会定义了5种IP地址类型以适合不同容量的网络,即A类~E类。

  1. A类、B类和C类地址的网络号字段(在图中这个字段是灰色的)分别为1, 2和 3字节长,而在网络号字段的最前面有1〜3位的类别位,其数值分别规定为0, 10 和 110。

  2. A类、B类和C类地址的主机号字段分别为3个、2个和1个字节长。

  3. D类地址(前4位是1110)用于多播(一对多通信)。我们将在本章4.6节讨论IP 多播。

  4. E类地址(前4位是1111)保留为以后用。

这里要指出,由于近年来已经广泛使用无分类IP地址进行路由选择,A类、B类和C 类地址的区分已成为历史[RFC 1812],但由于很多文献和资料都还使用传统的分类IP地 址,而且从概念的演进上更清晰,因此我们在这里还要从分类IP地址讲起。

A类地址

A类地址的网络号字段占一个字节,只有7位可供使用(该字段的第一位已固定为 0),但可指派的网络号是126个(即27- 2)。

减2的原因是:

  1. IP地址中的全0表示 “这个(this)‘网络号字段为全0的IP地址是个保留地址,意思是“本网络”。

  2. 网络号为127 (即01111111)保留作为本地软件环回测试(loopback test)本主机的进程之间的通信之用。若主机发送一个目的地址为环回地址(例如127.0.0.1)的IP数据报,则本主机中的协议软件就处理数据报中的数据,而不会把数据报发送到任何网络。目的地址为环回地址的 IP数据报永远不会出现在任何网络上,因为网络号为127的地址根本不是一个网络地址。

A类地址的主机号占3字节,因此每一个A类网络中的最大主机数是2^24- 2,即 16 777 214。

减2的原因是:

  1. 全0的主机号字段表示该IP地址是“本主机”所连接到的 单个网络地址(例如,一主机的IP地址为5.6.7.8,则该主机所在的网络地址就是5.0.0.0),

  2. 全1表示“所有的(all)”,因此全1的主机号字段表示该网络上的所有主机。

IP地址空间共有2^32 (即4 294 967 296)个地址。整个A类地址空间共有2^31个地址, 占有整个IP地址空间的50%。

B类地址

B类地址的网络号字段有2字节,但前面两位(1 0)已经固定了,只剩下14位可以进 行分配。因为网络号字段后面的14位无论怎样取值也不可能出现使整个2字节的网络号字 段成为全0或全1,因此这里不存在网络总数减2的问题。

但实际上B类网络地址128.0.0.0 是不指派的,而可以指派的B类最小网络地址是128.1.0.0 [COME06]。因此B类地址可指派的网络数为214-1,即16383。

B类地址的每一个网络上的最大主机数是216-2,即 65 534。这里需要减2是因为要扣除全0和全1的主机号。整个B类地址空间共约有23Q个 地址,占整个IP地址空间的25%。

C类地址

C类地址有3个字节的网络号字段,最前面的3位是(1 1 0),还有21位可以进行分 配。C类网络地址192.0.0.0也是不指派的,可以指派的C类最小网络地址是192.0.1.0 [COME06],因此C类地址可指派的网络总数是221-1,即2097151。

每一个C类地址的最 大主机数是28 - 2,即254。整个C类地址空间共约有229个地址,占整个IP地址的 12.5%。

总结

子网

从两级IP地址到三级IP地址

在今天看来,在ARPANET的早期,IP地址的设计确实不够合理。

  1. IP地址空间的利用率有时很低。

    每一个A类地址网络可连接的主机数超过1 000万台,而每一个B类地址网络可连接 的主机数也超过6万台。然而有些网络对连接在网络上的计算机数目有限制,根本达不到这 样大的数值。例如10BASE-T以太网规定其最大结点数只有1 024个。这样的以太网若使用 一个B类地址就浪费6万多个IP地址,地址空间的利用率还不到2%,而其他单位的主机 无法使用这些被浪费的地址。有的单位申请到了一个B类地址网络,但所连接的主机数并不多,可是又不愿意申请一个足够使用的C类地址,理由是考虑到今后可能的发展。IP地址的浪费,还会使IP地址空间的资源过早地被用完。

  2. 给每一个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏。

    每一个路由器都应当能够从路由表查出应怎样到达其他网络的下一跳路由器。因此, 互联网中的网络数越多,路由器的路由表的项目数也就越多。这样,即使我们拥有足够多的 IP地址资源可以给每一个物理网络分配一个网络号,也会导致路由器中的路由表中的项目 数过多。这不仅增加了路由器的成本(需要更多的存储空间),而且使查找路由时耗费更多 的时间,同时也使路由器之间定期交换的路由信息急剧增加,因而使路由器和整个因特网的 性能都下降了。

  3. 两级IP地址不够灵活。

    有时情况紧急,一个单位需要在新的地点马上开通一个新的网络。但是在申请到一个 新的IP地址之前,新增加的网络是不可能连接到因特N上工作的。我们希望有一种方法, 使一个单位能随时灵活地增加本单位的网络,而不必事先到因特网管理机构去申请新的网络 号。原来的两级IP地址无法做到这一点。

子网

为解决上述问题,从1985年起在IP地址中又增加了一个“子网号字段”,使两级IP地 址变成为三级IP地址,它能够较好地解决上述问题,并且使用起来也很灵活。这种做法叫 作划分子网(subnetting) [RFC 950],或子网寻址或子网路由选择。划分子网已成为因特网的 正式标准协议。 划分子网的基本思路如下:

  1. 一个拥有许多物理网络的单位,可将所属的物理网络划分为若干个子网(subnet)。划分子网纯属一个单位内部的事情。本单位以外的网络看不见这个网络是由多少个子网组成, 因为这个单位对外仍然表现为一个网络。

  2. 划分子网的方法是从网络的主机号借用若干位作为子网号subnet-id,当然主机号也 就相应减少了同样的位数。于是两级IP地址在本单位内部就变为三级IP地址:网络号、子网号和主机号。也可以用以下记法来表示:

    IP地址::={ <网络号>,<子网号>, <主机号>} (4-2)

  3. 凡是从其他网络发送给本单位某个主机的IP数据报,仍然是根据IP数据报的目的网络号找到连接在本单位网络上的路由器。但此路由器在收到IP数据报后,再按目的网络号和子网号找到目的子网,把IP数据报交付目的主机。

下面用例子说明划分子网的概念。图4-18表示某单位拥有一个B类IP地址,网络地址 是145.13.0.0 (网络号是145.13)。凡目的地址为145.13.X.X的数据报都被送到这个网络上的 路由器Ri。

现把图4-18的网络划分为三个子网(图4-19)。这里假定子网号占用8位,因此在增加了子网号后,主机号就只有8位。所划分的三个子网分别是145.13.3.0,145.13.7.0和 145.13.21.0。

在划分子网后,整个网络对外部仍表现为一个网络,其网络地址仍为0。但网络145.13.0.0上的路由器&在收到外来的数据报后,再根据数据报的目的 地址把它转发到相应的子网。

总之,当没有划分子网时,IP地址是两级结构。划分子网后IP地址变成了三级结构。 划分子网只是把IP地址的主机号这部分进行再划分,而不改变IP地址原来的网络号。

子网掩码

现在剩下的问题就是:假定有一个数据报(其目的地址是145.13.3.10)己经到达了路 由器R,。那么这个路由器如何把它转发到子网145.13.3.0呢?

我们知道,从IP数据报的首部无法看出源主机或目的主机所连接的网络是否进行了子网的划分。这是因为32位的IP地址本身以及数据报的首部都没有包含任何有关子网划分的 信息。因此必须另外想办法,这就是使用子网掩码(subnetmask)(见图4-20)。

图4-20(a)是IP地址为145.13.3.10的主机本来的两级IP地址结构。

图4-20(b)是这个两级IP地址的子网掩码。

图4-20(c)是同一地址的三级IP地址结构,也就是说,现在从原来 16位的主机号中拿出8位作为子网号,而主机号由16位减少到8位。请注意,现在子网号 为3的网络的网络地址是145.13.3.0 (既不是原来两级IP地址的网络地址145.13.0.0,也不 是简单的子网号3)。为了使路由器&能够很方便地从数据报中的目的IP地址中提取出所 要找的子网的网络地址,路由器K就要使用三级IP地址的子网掩码。

图4-20(d)是三级IP 地址的子网掩码,它也是32位,由一串1和跟随的一串0组成。子网掩码中的1对应于IP 地址中原来二级地址中的16位网络号加上新增加的8位子网号,而子网掩码中的0对应于 现在的8位主机号。

图4-20(e)表示R,把三级IP地址的子网掩码和收到的数据报的目的IP地址丨45.13.3.10 逐位相“与”(AND)(计算机进行这种逻辑AND运算是很容易的),得出了所要找的子网的 网络地址145.13.3.0。

虽然RFC文档中没有规定子网掩码中的一串1必须是连续的,但却极 力推荐在子网掩码中选用连续的1,以免出现可能发生的差错。

使用子网掩码的好处就是:不管网络有没有划分子网,只要把子网掩码和IP地址进行 逐位的“与”运算(AND),就立即得出网络地址来。这样在路由器处理到来的分组时就可采用同样的算法。

在不划分子网时,既然没有子网,为什么还要使用子网掩码?

这就是为了更便于查找路由表。现在因特网的标准规定:所有的网络都必须使用 子网掩码,同时在路由器的路由表中也必须有子网掩码这一栏。如果一个网络不划分子网, 那么该网络的子网掩码就使用默认子网掩码。默认子网掩码中1的位置和IP地址中的网络号字段net-id正好相对应。因此,若用默认子网掩码和某个不划分子网的IP地址逐位相 “与”(AND),就应当能够得出该IP地址的网络地址来。这样做可以不用查找该地址的类别位就能知道这是哪一类的IP地址。

通过简单的计算,读者不难得到这样的结论:划分子网增加了灵活性,但却减少了能够连接在网络上的主机总数。

超网

CIDR定义

划分子网在一定程度上缓解了因特网在发展中遇到的困难。然而在1992年因特网仍然面临三个必须尽早解决的问题,这就是:

(1) B类地址在1992年己分配了近一半,眼看很快就将全部分配完毕!

(2) 因特网主干网上的路由表中的项目数急剧增长(从几千个增长到几万个)。

(3) 整个IPv4的地址空间最终将全部耗尽。在2011年2月3日,IANA宣布IPv4地址B类地址已经耗尽了。

IETF研究出无分类编址方法,它的正式名字是无分类 域间路由选择 CIDR (Classless Inter-Domain Routing, CIDR 的读音是 “sider”)。

CIDR最主要的特点有两个:

  1. CIDR消除了传统的A类、B类和C类地址以及划分子网的概念,因而可以更加有效地分配IPv4的地址空间,并且可以在新的IPv6使用之前容许因特网的规模继续增长。 CIDR把32位的IP地址划分为两个部分。前面的部分是“网络前缀”(network-prefix)(或 简称为“前缀”),用来指明网络,后面的部分则用来指明主机。因此CIDR使IP地址从三 级编址(使用子网掩码)又回到了两级编址,但这已是无分类的两级编址。它的记法是:

     IP地址::={<网络前缀>, <主机号>}	(4-3)
    

    CIDR还使用“斜线记法”(slash notation),或称为CIDR记法,即在IP地址后面加上斜线“/”,然后写上网络前缀所占的位数。

  2. CIDR把网络前缀都相同的连续的IP地址组成一个“CIDR地址块”。我们只要知道CIDR地址块中的任何一个地址,就可以知道这个地址块的起始地址(即最小地址)和最大地址,以及地址块中的地址数。

为了更方便地进行路由选择,CIDR使用32位的地址掩码(address mask)。地址掩码由 一串1和一串0组成,而1的个数就是网络前缀的长度。虽然CIDR不使用子网了,但由于 目前仍有一些网络还使用子网划分和子网掩码,因此CIDR使用的地址掩码也可继续称为子网掩码。例如,/20地址块的地址掩码是:11111111 11111111 11110000 00000000 (20个连续 的1)。斜线记法中,斜线后面的数字就是地址掩码中1的个数。

CIDR记法有多种形式,例如,地址块10.0.0.0/10可简写为10/10,也就是把点分十进 制中低位连续的0省略。另一种简化表示方法是在网络前缀的后面加一个星号如: 00001010 00 意思是:在星号*之前是网络前缀,而星号*表示IP地址中的主机号,可以是任意值。

表4-7给出了最常用的CIDR地址块。表中的K表示1024。在“包含的地址数”中没有把全1和全0的主机号除外。每一个CIDR地址块中的地址数一定是2的整数次幂。

求地址块范围

当然,这主机号是全0和全1的地址一般并不使用。通常只使用在这两个地址之 间的地址。不难看出,这个地址块共有212个地址。我们可以用地址块中的最小地址和网络 前缀的位数指明这个地址块。例如,上面的地址块可记为128.14.32.0/20。在不需要指出地 址块的起始地址时,也可把这样的地址块简称为“/20地址块

IPv6地址

IP是因特网的核心协议。现在使用的IP (即IPv4)是在20世纪70年代末期设计的。 因特网经过几十年的飞速发展,到2011年2月,IPv4的地址己经耗尽,ISP已经不能再申 请到新的IP地址块了。为此,解决IP地址耗尽的根本措施就是采用具有更大地址空间的新 版本的IP,即IPv6。

一般来讲,一个IPv6数据报的目的地址可以是以下三种基本类型地址之一:

(1) 单播(unicast) 单播就是传统的点对点通信。

(2) 多播(multicast) 多播是一点对多点的通信,数据报发送到一组计算机中的每一 个。IPv6没有采用广播的术语,而是将广播看作多播的一个特例。

(3) 任播(anycast) 这是IPv6增加的一种类型。任播的终点是一组计算机,但数据报只交付其中的一个,通常是距离最近的一个。

在IPv6中,每个地址占128位,IPv6使用冒号十六进制记法(colon hexadecimal notation,简写 为colonhex),它把每个16位的值用十六进制值表示,各值之间用冒号分隔。例如

68E6:8C64:FFFF:FFFF:0:1180:960A:FFFF 

在十六进制记法中,允许把数字前面的0省略。上面就把0000中的前三个0省略了。

特殊地址

从 IPv4 向 IPv6 过渡

由于现在整个因特网上使用老版本IPv4的路由器的数量太大,因此,“规定一个日期, 从这一天起所有的路由器一律都改用IPv6”,显然是不可行的。这样,向IPv6过渡只能采 用逐步演进的办法,同时,还必须使新安装的IPv6系统能够向后兼容。这就是说,IPv6系统必须能够接收和转发IPv4分组,并且能够为IPv4分组选择路由。

下面介绍两种向IPv6过渡的策略,即使用双协议栈和使用隧道技术

1.双协议栈

双协议栈(dual stack)是指在完全过渡到IPv6之前,使一部分主机(或路由器)装有两 个协议栈,一个IPv4和一个IPv6。因此双协议栈主机(或路由器)既能够和IPv6的系统通 信,又能够和IPv4的系统进行通信。双协议栈的主机(或路由器)记为IPv6/IPv4,表明它 具有两种IP地址:一个IPv6地址和一个IPv4地址。

双协议栈主机在和IPv6主机通信时是采用IPv6地址,而和IPv4主机通信时就采用 IPv4地址。但双协议栈主机怎样知道目的主机是采用哪一种地址呢?它是使用域名系统 DNS来查询。若DNS返回的是IPv4地址,双协议栈的源主机就使用IPv4地址。但当DNS 返回的是IPv6地址,源主机就使用IPv6地址。

图10-9所示的情况是源主机A和目的主机F都使用IPv6,所以A向F发送IPv6数据 报,路径是A—B—C—D-E—F。中间B到E这段路径是IPv4网络,因此路由器B不能 向C转发IPv6数据报,因为C只使用IPv4协议。由于B是IPv6/IPv4路由器,因此路由器 B把IPv6数据报首部转换为IPv4数据报首部后发送给C。等到IPv4数据报到达IPv4网络 的出口路由器E时(E也是IPv6/IPv4路由器),再恢复成原来的IPv6数据报。需要注意的 是:IPv6首部中的某些字段却无法恢复。例如,原来IPv6首部中的流标号X在最后恢复出 的IPv6数据报中只能变为空缺。这种信息的损失是使用首部转换方法所不可避免的。

2.隧道技术

向IPv6过渡的另一种方法是随道技术(tunneling)。图10-10给出了隧道技术的工作原理。这种方法的要点就是在IPv6数据报要进入IPv4网络时,将IPv6数据报封装成为IPv4 数据报(整个的IPv6数据报变成了 IPv4数据报的数据部分)。然后,IPv6数据报就在IPv4 网络的隧道中传输。当IPv4数据报离开IPv4网络中的隧道时再把数据部分(即原来的IPv6 数据报)交给主机的IPv6协议栈。

图10-10(a)表示在IPv4网络中打通了一个从B到E的 “IPv6隧道”,路由器B是隧道的入口而E是出口。图10-10(b)表示数据报的封装要点。注意,在隧道中传送的数据报的源地址是B而目的地址是E。

要使双协议栈的主机知道IPv4数据报里面封装的数据是一个IPv6数据报,就必须把 IPv4首部的协议字段的值设置为41 (41表示数据报的数据部分是IPv6数据报)。