IPv4协议

网际协议版本4(英语:Internet Protocol version 4,IPv4),又称互联网通信协议第四版,是网际协议开发过程中的第四个修订版本,也是此协议第一个被广泛部署的版本。IPv4是互联网的核心,也是使用最广泛的网际协议版本,其后继版本为IPv6,直到2011年,IANA IPv4位址完全用尽时,IPv6仍处在部署的初期。

IPv4在IETF于1981年9月发布的 RFC 791 中被描述,此RFC替换了于1980年1月发布的 RFC 760。

IPv4是一种无连接的协议,操作在使用分组交换的链路层(如以太网)上。此协议会尽最大努力交付数据包,意即它不保证任何数据包均能送达目的地,也不保证所有数据包均按照正确的顺序无重复地到达。这些方面是由上层的传输协议(如传输控制协议)处理的。

2019年11月26日,全球所有43亿个IPv4地址已分配完毕,这意味着没有更多的IPv4地址可以分配给ISP和其他大型网络基础设施提供商。

IPv4简介

际协议版本4(英语:InternetProtocolversion4,IPv4),又称互联网通信协议第四版,是网际协议开发过程中的第四个修订版本,也是此协议第一个被广泛部署的版本。IPv4是互联网的核心,也是使用最广泛的网际协议版本,其后继版本为IPv6,直到2011年,IANAIPv4位址完全用尽时,IPv6仍处在部署的初期。

IPv4在IETF于1981年9月发布的RFC 791中被描述,此RFC替换了于1980年1月发布的RFC 760。

IPv4数据报

在TCP/IP协议中,使用IP协议传输数据的包被称为IP数据包。每个数据包都包含IP协议规定的内容。IP协议规定的这些内容被称为IP数据报文(IP Datagram)或者IP数据报。IP数据报文由首部和数据两部分组成。首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。数据部分用于封装上层(传输层)报文,表示所发送数据报的具体内容,其长度以字节计,数据报的最大长度(含首部)为65535字节。

每个IP数据报都以一个IP报头开始。源计算机构造这个IP报头,而目的计算机利用IP报头中封装的信息处理数据。IP报头中包含大量的信息,如源IP地址、目的IP地址、数据报长度、IP版本号等。每个信息都被称为一个字段。IP数据报头字段如下图所示:

image

IP数据报首部:

固定部分

  • 版本(version):占4位,表示IP协议的版本。通信双方使用的IP协议版本必须一致。目前广泛使用的IP协议版本号为4,即IPv4。
  • 首部长度(Internet Header Length,IHL):占4位,可表示的最大十进制数值是15。这个字段所表示数的单位是32位字长(1个32位字长是4字节)。因此,当IP的首部长度为1111时(即十进制的15),首部长度就达到60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。首部长度限制为60字节的缺点是,长度有时可能不够用,之所以限制长度为60字节,是希望用户尽量减少开销。最常用的首部长度就是20字节(即首部长度为0101),这时不使用任何选项。
  • 差分服务(Differentiated Services,DS):也被称为服务类型,占8位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务(Differentiated Services,DS)。只有在使用区分服务时,这个字段才起作用。

差分服务(Differentiated Services,DS)与服务类型(Type of Service,TOS)

详见 差分服务与服务类型

  • 总长度(Total Length):总长度占16位,指定包括首部和数据在内的IP数据报总长度,单位为字节。根据数据报总长度和首部长度可以计算出数据部分的长度。数据长度=数据报总长度-首部长度×4。数据报总长度字段在将IP数据报封装到以太网帧中进行传输时是非常有用的。以太网要求帧中封装的数据最少46字节,当数据少于46字节时必须在数据的后面进行填充,使其达到46字节,通过IP数据报中的数据报总长度和首部长度可以计算出除去填充后的实际数据长度。。总长度字段为16位,因此数据报的最大长度为2^16-1=65535字节。
  • 标识(Identification):用来标识数据报,占16位。IP协议在存储器中维持一个计数器。每产生一个数据报,计数器就加1,并将此值赋给标识字段。当数据报的长度超过网络的MTU,而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。具有相同的标识字段值的分片报文会被重组成原来的数据报。
  • 标志(Flags):标志占3位,用于表示该IP数据报是否允许分片以及是否是最后的一片。第1位保留,设置为0;第2位设置是否分片,0表示可以分片,1表示不分片;第3位表示是否最后一片,0表示已是最后一个分片,1 表示还有更多分片抵达。典型情况下允许分片,但是出于某些原因,应用程序可以决定不允许分片。
  • 分片偏移(Fragmentation Offset):分片偏移占13位,描述该数据报分片在它所属的原始数据报数据区中的偏移量,为目的主机进行各分片的重组提供顺序依据。偏移量以8字节(64位)为一个单位。例如,第1个分片的偏移值可以是0,并包含了1400字节的数据(不包括任何首部),第2个分片的偏移值应该为175(1400/8=175)。
  • 生存时间(Time to Live,TTL):表示数据报在网络中的寿命,占8位。该字段由发出数据报的源主机设置。其目的是防止无法交付的数据报无限制地在网络中传输,从而消耗网络资源。路由器在转发数据报之前,先把TTL值减1。若TTL值减少到0,则丢弃这个数据报,不再转发。因此,TTL指明数据报在网络中最多可经过多少个路由器。TTL的最大数值为255。若把TTL的初始值设为1,则表示这个数据报只能在本局域网中传送。

说明

虽然RFC 791定义TTL以秒为单位,但是Internet的路由器无法进行准确的时间同步,因此路由器不能准确地计算出需要减去的时间。目前所采用的一种简单的处理办法是用经过路由器的个数(即跳数)进行控制,数据报每经过一个路由器,生存时间 TTL 值减 1。当 TTL 值减到 0时,如果仍未能到达目的地,便丢弃该数据报。典型的TTL起始值为32、64和128。

  • 协议(Protocol):表示该数据报文所携带的数据所使用的协议类型,占8位。该字段可以方便目的主机的IP层知道按照什么协议来处理数据部分。不同的协议有专门不同的协议号。例如,TCP的协议号为6,UDP的协议号为17,ICMP的协议号为1,IP的协议号则为0。
  • 首部检验和(Header Checksum):用于校验数据报的首部,占16位。数据报每经过一个路由器,首部的字段都可能发生变化(如TTL),所以需要重新校验。而数据部分不发生变化,所以不用重新生成校验值。这是一种除了数据链路出错检测机制(如以太网的CRC)之外的出错检测机制。
  • 源地址(Source Address):源地址占32位,指明源主机(最初发送者)的IP地址。在IP数据报从源主机发送到目的主机的时间内,这个字段必须保持不变。在某些情况下,如在DHCP引导过程中,IP主机或许并不知道自己的IP地址,因此这个字段可以使用0.0.0.0。这个字段不能包含多播或广播地址。
  • 目的地址(Destination Address):目的地址占32位,指明目的主机(最终接收者)的IP地址。在IP数据报从源主机发送到目的主机的时间内,这个字段必须保持不变。这个字段能够包含单播、多播或广播地址。

提示

在 IP 数据报的转发过程中,若干路由器会对物理帧进行解封装和再封装,物理地址会发生变化,但IP数据报的源地址和目的地址字段始终保持不变。

  • 可选字段(Options):该字段用于一些可选的报头设置,主要用于测试、调试和安全的目的。这些选项包括严格源路由(数据报必须经过指定的路由)、网际时间戳(经过每个路由器时的时间戳记录)和安全限制。
  • 填充:由于可选字段中的长度不是固定的,使用若干个0填充该字段,可以保证整个报头的长度是32位的整数倍。
  • 数据部分:表示传输层的数据,如保存TCP、UDP、ICMP或IGMP的数据。数据部分的长度不固定。

可变部分

IP首部的可变部分就是一个可选字段。选项字段用来支持排错、测量以及安全等措施,内容很丰富。此字段的长度可变,从1个字节到40个字节不等,取决于所选择的项目。某些选项项目只需要1个字节,它只包括1个字节的选项代码。但还有些选项需要多个字节,这些选项一个个拼接起来,中间不需要有分隔符,最后用全0的填充字段补齐成为4字节的整数倍。 增加首部的可变部分是为了增加IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。实际上这些选项很少被使用。新的IP版本IPv6就将IP数据报的首部长度做成固定的。这些任选项定义如下:

(1)安全和处理限制(用于军事领域)

(2)记录路径(让每个路由器都记下它的IP地址)

(3)时间戳(Time Stamp)(让每个路由器都记下IP数据报经过每一个路由器的IP地址和当地时间)

(4)宽松的源站路由(Loose Source Route)(为数据报指定一系列必须经过的IP地址)

(5)严格的源站路由(Strict Source Route)(与宽松的源站路由类似,但是要求只能经过指定的这些地址,不能经过其他的地址)

这些选项很少被使用,并非所有主机和路由器都支持这些选项。

差分服务与服务类型

服务类型(Type of Service,TOS)

服务类型占 8 位,提供所需服务质量的参数集,规定对本数据报的处理方式。包括优先级(Precedence)和服务类型两个部分。优先级在前3位中定义,服务类型在紧接着的后4位中定义,最后1位被保留并设置为0,如图所示:

image

优先级表示本数据报的重要程度。当网络出现拥塞时,路由设备可以根据数据的优先级决定首先丢弃哪些数据报。RFC 791 中TOS 位的IP 优先级划分成了从0到7共8 个级别,可以应用于流分类,数值越大表示优先级越高,各级别说明见下表:

image

在默认情况下,IP优先级6和7用于网络控制通信使用,不推荐用户使用。优先级的划分为有区别地对待不同数据提供了可能,但目前的IPv4并未使用优先级,统一用0表示。

服务类型表示本数据报在传输过程中所希望得到的服务,由用户设置。4 位服务类型分别用D(0为普通值,1为最小延迟)、T(0为普通值,1为最大吞吐率)、R(0为普通值,1为最高可靠性)和C(0为普通值,1为最低成本)表示,4位全为0时表示一般服务类型的数据报。表4-2列出了服务类型各位组合的设置类型。

image

对于传输数据量比较大的协议一般要求高吞吐率,如FTP数据传输、SMTP数据传输、DNS区域传输;对于传输少量数据的协议一般要求低延迟,如 Telnet、FTP 控制信息、TFTP、SMTP命令;对于路由和网络管理信息,则要求较高的可靠性,如IGP和SNMP;对于直接向用户发送的一般新闻信息,则应该考虑采用较低成本的路径,如NNTP。ICMP、DNS(TCP)则属于一般服务。 不过,服务类型未能在现有的IP网络中普及使用。服务类型要求并不具有强制性,目前许多路由设备的TCP/IP实现中都不支持服务类型特性。新的路由协议(如OSPF)能够根据这些服务类型进行路由选择。在D、T、R和C这4个参数中每次只能设置其中的一个,也就是说,在传输时路由设备只能考虑一个性能指标,不可能照顾到每个性能指标。多个参数的同时指定只能使路由设备无所适从,所以没有实际意义。

差分服务(Differentiated Services,DS)

RFC 791所定义的服务类型(TOS)字段现在已被新的差分服务(DS)字段所取代。随着Internet应用的迅速发展,多媒体数据传输和实时应用对TCP/IP的服务类型提出了更高的要求,为此 IETF 将 IP 数据报的服务类型字段改成了差分服务(Differentiated Services,DS)字段。

RFC 2474“Definition of the Differentiated Services Field(DS Field)in the IPv4 and IPv6 Headers(IPv4和IPv6首部中差分服务字段(DS字段)的定义)”、RFC 2475 “An Architecture for Differentiated Services(一种差分服务架构)”、RFC 3168 “TheAddition of Explicit Congestion Notification(ECN)to IP(显式拥塞通告(ECN)添加到 IP)”提供了原服务类型字段 8 位的新用途,将原来的优先级和服务类型替换为新的差分服务代码点(Differentiated Services Code Point,DSCP)和显式拥塞通告(ExplicitCongestion Notification,ECN),该字段被称为差分服务字段。

image

1.差分服务

RFC 791中定义8个优先级应用于流分类,但是在网络中实际部署的时候这8个优先级远远不够,于是在 RFC 2474 中又对服务类型字段进行重新定义,将该字段的前 6 位定义成 DSCP。DSCP给出流量的优先级,网络节点依据这个等级值排队和转发流量。

DSCP是IP优先级和服务类型字段的组合。为利用仅支持IP优先级的路由器,DSCP的定义向后与IP优先级兼容,DSCP可看做是IP优先级的超集。DSCP优先级值有64个(0~63),0优先级最低,63优先级最高。DSCP的可读性比较差,为此将DSCP进一步分成了以下4种类型。

(1)类选择器(Class Selector,CS)。

类选择器DSCP定义为向后与IP优先级兼容,值为8、16、24、32、40、48、56,后3位为0,格式为“aaa000”。也就是说类选择器仍然沿用了 IP 优先级,只不过它定义的 DSCP 为 IP 优先级的8 倍,如CS6 = 6×8 = 48,CS7 = 7×8 = 56。 CS6和CS7默认用于协议报文,如OSPF报文、BGP报文等应该优先保障,因为如果这些报文无法接收的话会引起协议中断。这是大多数厂商硬件队列里最高优先级的报文。

(2)加速转发(Expedited Forwarding,EF)。

加速转发DSCP一般用于低延迟的服务,推荐值为46(101110)。可以将它看做为IP优先级5,是一个比较高的优先级。 EF用于承载语音的流量,因为语音要求低延迟、低抖动、低丢包率,是仅次于协议报文的最重要的报文。

(3)确保转发(Assured Forwarding,AF)。

确保转发DSCP分为两部分,即a部分和b部分,格式为“aaabb0”。a部分为3位,仍然可以与IP优先级对应;b部分为2位,表示丢弃优先级。a部分最大取值为8,但是目前只用到了1~4。与十进制转换时,可以将DSCP十进制数值除以8得到的整数就是AF值,余数换算成二进制前两位就是丢弃优先级。例如,DSCP值34表示AF4,丢弃优先级为2(010),属于中等。确定转发定义了4个服务等级,每个服务等级有3个下降过程,具体的DSCP值为4组:(10,12,14),(18,20,22),(26,28,30),(34,36,38)。

AF4用来承载语音的信令(如呼叫控制)流量;AF3用来承载IPTV的直播流量,直播的实时性很强,需要连续性和大吞吐量的保证;AF2 用来承载 VOD 的流量,允许有延迟或者缓冲;AF1可承载不是很重要的专线业务。

(4)默认(Default,BE)。

默认的DSCP为000000。Internet业务最不重要,可以放在BE模型来传输。

2.显式拥塞通告

为避免因为路由器拥塞而丢包所产生的一系列问题,设计了一种路由器向发送方报告发生拥塞的机制,让发送方在路由器开始丢包前降低发送速率,这种路由器报告和主机响应机制就是显式拥塞通告(简称ECN)。为了利用这项技术,拥塞链路的两端(发送方和接收方)必须支持ECN。在 IP 层一个发送主机必须能够表明自身支持 ECN,路由器在转发时必须能够表明它正在经历拥塞。根据RFC 3168,需要在IP数据报首部原服务类型字段中使用最后两个位来设置ECN字段,参见图4-4。一个是ECT(ECN-Capable Transport)位,由发送方设置以显示发送方的传输协议是否支持 ECN;另一个是 CE(Congestion Experienced)位,由路由器设置,以显示是否发生了拥塞。必须将这两个位结合起来实现ECN功能,具体包括以下几种组合。

  • 00:发送主机不支持ECN。
  • 01 或者10:发送主机支持ECN。
  • 11:路由器正在经历拥塞。

一个支持ECN的主机发送数据报时将ECN字段设置为01或者10。对于支持ECN的主机发送的数据报,如果路径上的路由器支持ECN并且经历拥塞,它将ECN字段设置为11。如果该数值已经被设置为11,那么下游路径上的路由器不会修改该值。

首部校验和

IP数据报在传输过程中并不对其数据进行校验,主要有两个方面的原因,一是作为一个点对点协议,在传输过程中每个点都对数据进行校验操作会增加很大的开销;二是留给更高的层次去解决,既可以保证数据的可靠性,又可以得到更大的灵活性和效率。IP数据报首部中的部分字段在点对点的传输过程中是不断变化的,只能在每个中间点重新形成校验数据,在相邻点之间完成校验。首部通过校验和来保证其正确性,具体方法如下。

(1)发送方将IP数据报首部按顺序分为多个16位的小数据块,首部校验和字段的初始值设置为0,用1的补码算法对16位的小数据块进行求和,最后再对结果求补码便得到了首部校验和。

(2)将经过计算得到的首部校验和填写到数据报的首部校验和字段,封装成帧后发给通往目的地的下一跳设备。

(3)下一跳设备作为接收方将收到的IP数据报的首部再分为多个16位的小数据块,用1的补码算法对16位的小数据块进行求和,最后再对结果求补码,若得到的结果为0,就验证了数据报首部的正确性。

提示

发送方用1的补码计算和数时,首部校验和字段被设置为0,等于没有参加计算,求补码后的校验和与校验和和数各位正好相反。接收方用1的补码计算和数时,由于新的首部校验和字段已经被加入,在首部未发生变化的情况下所得的和数应该为 0xffff,因此求补码后的结果应该为0x0000。

验证IP首部信息

大多数 TCP/IP 通信都建立在 IP 协议之上,可使用协议分析工具抓取 IP 数据包。这里使用Wireshark抓取一个浏览网页过程中的数据包,展开某个HTTP数据包中的IP数据报,结果如下图所示。可对照前述字段说明来分析验证。

image

其中的服务类型字段已变成了差分服务字段(Differentiated Services Field),DSCP和ECN各位显示非常明晰,这里使用的是目前常用的默认设置00000000。

首部校验和已证明校验正确(Header checksum:0x7620 [correct])。

IPv4地址

IPv4使用32位(4字节)地址,因此地址空间中只有4,294,967,296(2)个地址。不过,一些地址是为特殊用途所保留的,如专用网络(约1800万个地址)和多播地址(约2.7亿个地址),这减少了可在互联网上路由的地址数量。随着地址不断被分配给最终用户,IPv4地址枯竭问题也在随之产生。基于分类网络、无类别域间路由和网络地址转换的地址结构重构显著地减少了地址枯竭的速度。但在2011年2月3日,在最后5个地址块被分配给5个区域互联网注册管理机构之后,IANA的主要地址池已经用尽。

这些限制刺激了仍在开发早期的IPv6的部署,这也是唯一的长期解决方案。

地址格式

IPv4地址可被写作任何表示一个32位整数值的形式,但为了方便人类阅读和分析,它通常被写作点分十进制的形式,即四个字节被分开用十进制写出,中间用点分隔。 下表展示了几种不同的格式:

格式从点分十进制转换
点分十进制192.0.2.235不适用
点分十六进制0xC0.0x00.0x02.0xEB每个字节被单独转换为十六进制
点分八进制0300.0000.0002.0353每个字节被单独转换为八进制
十六进制0xC00002EB将点分十六进制连在一起
点分十进制3221226219用十进制写出的32位整数
点分十进制030000001353用八进制写出的32位整数

此外,在点分格式中,每个字节都可用任意的进制表达。如,192.0x00.0002.235是一种合法(但不常用)的表示。

地址分类

最初,一个IP地址被分成两部分:网上识别码在地址的高位字节中,主机识别码在剩下的部分中。

为了克服这个限制,在随后出现的分类网络中,地址的高位字节被重定义为网络的类(Class)。这个系统定义了五个类别:A、B、C、D和E。A、B和C类有不同的网络类别长度,剩余的部分被用来识别网络内的主机,这就意味着每个网络类别有着不同的给主机编址的能力。D类被用于多播地址,E类被留作将来使用。

image

1993年,无类别域间路由(CIDR)正式地取代了分类网络,后者也因此被称为“有类别”的。CIDR被设计为可以重新划分地址空间,因此小的或大的地址块均可以分配给用户。CIDR创建的分层架构由互联网号码分配局(IANA)和区域互联网注册管理机构(RIR)进行管理,每个RIR均维护着一个公共的WHOIS数据库,以此提供IP地址分配的详情。

即对IP地址如何编址经历了两个历史阶段:

(1)分类的IP地址。这是最基本的IP地址编址方法,于1981年通过相应的标准协议。这种IP地址编址方法在实际使用中发现不甚合理,故做了许多改进,如子网划分、变长子网划分等。

(2)无分类的IP地址。这是1993年提出的新的分类方法,已得到广泛应用。

特殊用途的地址

CIDR地址块描述参考资料
0.0.0.0/8本网络(仅作为源地址时合法)RFC 5735
10.0.0.0/8专用网络RFC 1918
100.64.0.0/10电信级NATRFC 6598
127.0.0.0/8环回RFC 5735
169.254.0.0/16链路本地RFC 3927
172.16.0.0/12专用网络RFC 1918
192.0.0.0/24保留(IANA)RFC 5735
192.0.2.0/24TEST-NET-1,文档和示例RFC 5735
192.88.99.0/246to4中继RFC 3068
192.168.0.0/16专用网络RFC 1918
198.18.0.0/15网络基准测试RFC 2544
198.51.100.0/24TEST-NET-2,文档和示例RFC 5737
203.0.113.0/24TEST-NET-3,文档和示例RFC 5737
224.0.0.0/4多播(之前的D类网络)RFC 3171
240.0.0.0/4保留(之前的E类网络)RFC 1700
255.255.255.255受限广播RFC 919

专用网络

IPv4子网划分

1.三级IP地址的构成

在实际使用中发现,上面所述的IP地址结构存在一些不合理性。例如,A、B和C类IP地址,可供分配的网络号超过211万个,而这些网络上可供使用的主机号的总数则超过37.2亿个。似乎这么多IP地址足以供全世界用户使用,其实不然。原因在于当初IP地址的设计不合理,主要体现在以下三个方面:

(1)IP地址的使用存在很大的浪费现象,地址空间的利用率不高。例如,某单位申请到了一个B类地址,但该单位只有5000台主机。于是,在这个B类地址中就白白浪费了其余的6 万多个主机号,地址空间的利用率仅为7.63%。IP地址的浪费,将导致IP地址空间资源的紧张。

(2)原来的两级IP地址不够灵活。因为某单位申请到一个IP地址,其实所得到的是一个网络号,主机号则由本单位自行分配。一般来说,单位对本单位的网络都有按部门划分的要求,在两级IP地址结构中却没有做出这方面的规定。

(3)按物理网络分配一个网络号的方法,将导致路由表的表项越来越多,这不但增加路由器的成本,还使查找路由表花费更多的时间,因而不易改善网络性能。

基于上述原因,自1985年起,在IP地址格式中增加了一个“子网号字段(subnet-id)”,使IP地址结构由两级变为三级,从而大大增加了使用的灵活性。这种做法称为划分子网(详见RFC 950)。

划分子网的基本思路是:

(1)划分子网纯属单位内部的事情,对本单位以外的网络是完全透明的。也就是说,本单位的网络划分子网,对外仍然表现为一个没有划分子网的网络。

(2)划分子网的具体方法是,利用IP地址中的主机号字段的前若干比特作为子网号字段,后面剩下的仍为主机号字段。这样就构成了三级IP地址,这种地址结构的IP地址可记为:

IP地址::={<网络号>,<子网号>,<主机号>}

(3)凡从其他网络传送到本单位网络某主机的IP数据报,仍然按IP数据报的目的网络号传送到连接在本单位网络上的路由器。此路由器按目的子网号找到目的子网,再把IP数据报交付给目的主机。

由此可见,划分子网只是对IP地址的本地部分(即原来的主机号)进行再划分,并未改变IP 地址的原始结构。

2.子网掩码

划分子网要用到子网掩码(subnet mask)的概念。TCP/IP体系规定:子网掩码是一个32位二进制数,由一串连续的“1”后随一串连续的“0”组成。其中“1”对应于IP地址的网络号和子网号字段,而“0”对应于IP地址的主机号字段。下图以B类IP地址为例,说明了子网掩码的用法。

image

把接收到的IP数据报中的目的IP地址与子网掩码逐位相“与”,便可得出子网所在的网络地址。

子网掩码的表示可采用点分十进制记法,也可用十六进制记法,特别是当子网的边界不是正好在一字节的位置时。这样,根据给出的IP地址,就可判断出它的地址类别,而子网掩码则指出子网号和主机号的界限。子网掩码的表示还可采用网络前缀标记法(又称斜线记法),即在IP地址后面加一斜线再加一数字,此数字是网络号与子网号位数之和。例如,某主机的IP地址为140.120.84.24,子网掩码为255.255.240.0,用网络前缀标记法就可以表示为140.120.84.24/20。

子网掩码是一个网络或一个子网的重要属性。因特网标准规定:所有的网络都必须有一个子网掩码,同时在路由器的路由表中也必须设有子网掩码这一项。路由器在相互交换信息时,也必须包含子网掩码这一信息。如果一个网络不划分子网,那么该网络的子网掩码就使用默认子网掩码。默认子网掩码中的“1”的位置和IP地址中的网络号字段相对应。因此,

A类地址的默认子网掩码是 255.0.0.0,或 0xFF000000;

B类地址的默认子网掩码是 255.255.0.0,或 0xFFFF0000;

C类地址的默认子网掩码是 255.255.255.0,或 0xFFFFFF00。

这样,若用默认子网掩码和某个IP地址逐位相“与”,就能得出该IP地址的网络地址,而不必先查找该地址的类别位再确定属于哪一类的IP地址。

如上所述,子网号字段的长短决定子网的个数。下面以B类IP地址为例,来说明子网号字段与子网数及主机数的关系,如下表所列。

image

“子网号位数”这一列没有0、1、15和16这四项是因为它们没有意义。同时,“子网数”这一列是除去了全0和全1这两种情况。不过,随着无分类域间路由选择CIDR的广泛使用,现在全0和全1的子网号有被使用的可能,但必须确认路由器所用的路由选择软件是否支持全0和全1的子网号的识别。

划分子网增加了网络设计的灵活性,但它是以减少主机数为代价的。

本来一个B类IP地址可容纳65534个主机号。但划分出6位长的子网号字段后,最多可有62个子网(除去全1和全0的子网号)。每个子网有10位的主机号,即每个子网最多可加接1022台主机(除去全1和全0的主机号)。因此主机的总数是62×1022=63364个。显然,这比未划分子网时要少。

当采用子网掩码时,单从IP地址有时还不能很方便地看出子网号和主机号。例如,一个B类IP地址140.252.20.68,其网络号是140.252。子网掩码为0xFFFFFFE0(其二进制记法为11111111 11111111 11111111 11100000)。由于子网号为11位,则主机号只占5位。上面IP地址的后两字节(20.68)的二进制记法是00010100 01000100,其中前11位是子网号,后5位是主机号。因此用十进制记法的子网号是162,而主机号是4。

其实,子网掩码的概念相当于采用三级寻址。当路由器在收到一个分组时,首先检查该分组的目的IP地址中的网络号。若网络号不是本网络,则从路由表中找出下一站地址将其转发出去;若网络号是本网络,则再检查目的IP地址中的子网号。若子网不是本子网,也同样转发出去;若子网是本子网,则根据主机号将分组交付给该目的主机。

3.变长子网

子网划分的最初目的是把基于类的网络(A类、B类、C类)划分为几个规模相同的子网,即每个子网包含相同的主机数。

例如,一个B类网络当使用主机号字段的4位作为子网号字段时,就可以产生16个规模相同的子网(包括全0和全1子网在内)。其实,子网划分只是一种通用的利用主机号字段划分子网的方法,不一定要求子网的规模相同,实际应用正是如此。例如,一个单位中的各个网络包含不同数量的主机,如能为其创建不同规模的子网,就可避免IP地址的浪费。对于不同规模的子网划分,称为变长子网划分(详见RFC 1009),并使用相应的变长子网掩码VLSM(Variable Length Subnet Mask)技术。

变长子网划分是一种用不同长度的子网掩码来分配子网号字段的技术。 它是对已划分好的子网使用不同的子网掩码做进一步划分,形成不同规模的网络,从而提高IP地址资源的利用率。下面用一个实例来说明变长子网划分的细节。

【例】某公司申请了一个B类136.48.0.0的IP地址空间,现要求为该公司配置1个能容纳32000台主机的子网,15个能容纳2000台主机的子网,以及8个能容纳254台主机的子网。试问应如何进行IP地址的分配?并给出地址的利用率。

【解】下面给出的是一种配置方案(见下图,注意,图中列出的IP地址是各子网的起始地址)。

image

(1)对于1个能容纳32000台主机的子网。用主机号字段中的1位进行子网划分,产生两个子网,即136.48.0.0/17和136.48.128.0/17。由于每个子网可加接32766台主机。拟选择136.48.0.0/17作为能满足容纳32000台主机需求的子网。

(2)对于15个能容纳2000台主机的子网。再使用主机号字段中的左4位对子网网络136.48.128.0/17(步骤(1)中所划分的第2个子网136.48.128.0/17)进行子网划分,就可以划分16个子网,即136.48.128.0/21,136.48.192.0/21,…,136.48.240.0/21,136.48.248.0/21,从这16个子网中选择前15个子网就可满足每个子网容纳2000台主机的需求。

(3)对于8个能容纳254台主机的子网。再使用主机号字段中的左3位对子网网络136.48.248.0/21(步骤(2)中所划分的第16个子网136.48.248.0/21)进行子网划分,可以产生8个子网,即136.48.248.0/24,136.48.249.0/24,136.48.250.0/24,136.48.251.0/24,136.48.252.0/24,136.48.253.0/24,136.48.254.0/24,136.48.255.0/24。这8个子网每一个都可以容纳254台主机。

地址利用率为(32000+15×2000+8×256)/65534=64048/65534=97.73%

IPv4无分类编址(CIDR)

划分子网概念的提出,在一定程度上缓解了当初IP地址设计不够合理所引起的矛盾,而变长子网的概念也符合用户对IP地址实际使用的需要。但这些措施并未从根本上解决因特网在发展过程中所遇到的问题。至1992年,B类IP地址已分配过半,而因特网主干网上的路由表上项目数还在急速增加,1994年这种情况已变得非常严峻。为此,因特网工程部IETF在VLSM的基础上,又研究出无分类编址方法,来解决这两方面的问题。无分类编址方法的正式名字无分类域间路由选择CIDR(Classless Inter-Domain Routing),它的相关文档是RFC 1517~1519和1520。

CIDR的主要设计思想是:

(1)CIDR取消了以往对IP地址进行分类以及划分子网的概念,利用“网络前缀”(network-pfefix,简称前缀)来代替分类地址中的网络号和子网号。这样,就使得IP地址从三级编址重新回到了两级编址,只是这种编址是无分类的两级编址。可记为:

IP地址::={<网络前缀>,<主机号>}

CIDR还使用斜线记法(slash notation,或称CIDR记法),即在IP地址后面加一斜线“/”,再写上网络前缀所占的位数。在无分类编址中,有时还会用到“网络后缀”,“网络后缀”是地址中的主机号。例如,136.48.52.36/20,表示该IP地址的前20位是网络前缀,网络后缀便是12位的主机号。

(2)CIDR把网络前缀相同的连续的IP地址块组成一个“CIDR地址块”。CIDR地址块可用它的起始地址和块中地址数来表示。例如,136.48.32.8/20表示某CIDR地址块中的一个地址,这个地址用二进制可表示为:

136.48.32.8/20-→10001000 00110000 00100000 00001000

这个地址所在地址块中共有212个地址,但全0和全1的地址一般不使用。该地址块的最小地址是136.48.32.0(即10001000 00110000 00100000 00000000),而最大地址是136.48.47.255(即10001000 00110000 00101111 11111111)。通常,我们可用地址块中的最小地址和网络前缀的位数来指明这个地址块。如上面的地址块可记为136.48.32.0/20。在不需要指明地址块的起始地址时,也可把这个地址块简称“/20地址块”。

使用CIDR后,由于一个CIDR地址块包含多个地址,路由表的表项也可改用地址块来表示。这种地址聚合称为路由聚合(route aggregation)。路由聚合既有利于缩减路由表,又可以减少查找路由表所花费的时间,从而提高了因特网的性能。路由聚合也称构建超网(supernetting)。因此,构建超网的目的是将现有的IP地址合并成较大的、具有更多主机地址的地址域。

为了更方便地进行路由选择,CIDR使用32位的地址掩码(又称超网掩码),其组成规则同前。如对于/20地址块,它的地址掩码是11111111 11111111 11110000 00000000,即地址掩码中1的个数就是斜线记法中斜线后面的数字。

CIDR记法还有其他几种形式。一种是把点分十进制中的低位连续的“0”省去,如20.0.0.0/10,可表示为20/10。另一种是在网络前缀后面加一个星号“”,如00010100 00,其中星号前是网络前缀,而星号表示IP地址中的主机号。

前面曾指出,CIDR取消了划分子网的概念,这是指CIDR并没有在32位IP地址中再指明子网字段(subnet-id),但是,凡分配到一个CIDR地址块的单位仍可按本单位的需要进行划分子网的操作。这些子网也都只有一个网络前缀和一个主机号,但各子网的前缀比该单位的网络前缀要长。例如,某单位分配到/20地址块,若要再继续划分6个子网,此时每一个子网的网络前缀应是23位,比该单位的网络前缀多3位。

下表给出了常用的CIDR地址块:

image

除了最后4项外,每一CIDR地址块都包含着相当于多个C类地址,最前三项还包含着相当于数个B类地址。另外,表中网络前缀小于13和大于27的都很少使用,这主要是所包含的地址数太多或太少的缘故。

使用CIDR地址块的最大好处是可以更加有效地来分配IPv4的地址空间。现举一例来说明。假如某因特网服务提供者ISP拥有地址块208.18.128.0/17(相当于128个C类网络)。某单位需用900个IP地址。在不使用CIDR之前,ISP可以分配给该单位一个B类地址或者4个C类地址。但在使用CIDR之后,ISP可分配给该单位一个地址块208.18.128.0/22,它包含1024个IP地址,相当于4个连续的/24地址块。

使用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地址。按网络所在的地理位置来分配地址块,虽可实现IP地址与地理位置相关联,但却是件难以取舍的事情。因为在使用CIDR之前因特网的地址管理机构是不按地理位置来分配IP地址的,现在如要作更改,一是要重新收回和分配已分配出去的所有IP地址,二是很多正在工作的主机必须修改其IP地址。 最后需要指出的是,使用CIDR构建超网时,要求得到相关的路由器和路由协议的支持。因特网内部网关协议RIP2和外部网关协议BGPv4都支持CIDR,但RIPv1不支持CIDR。