IPv4协议及其地址格式

概述

目前的计算机网络,特别是TCP/IP网络,使用最多的是数据报分组交换,而IP协议就是将多个不同的分组交换网络连接起来最典型的的通信协议。IP协议是一个无连接的服务,负责从源地址到目的地址之间传送数据报,为了适应不同网络对分组大小的要求,还可以对上层报文进行分割。目前最新的IP协议为IPv6,但主流使用的仍然是IPv4。

目前的IPv4协议族里面包括了三个协议:

  1. 因特网协议(IP, Internet Protocol)
  2. 地址解析协议(ARP, Address Resolution Protocol)
  3. 因特网控制消息协议(ICMP, Internet Control Message Protocol)

IPv4地址

IP协议是目前TCP/IP体系结构中网际互联层最重要的协议,目前正处4和6两个版本交接时期,要讲IP协议就要先了解一下IP地址。

基本格式

IPv4使用32位(4字节)地址,因此理论上整个地址空间中有2^32^(约43亿)个地址。但是,一些地址是为了特殊用途保留的,如局域网专用地址约1800万个)、组播地址约2700万个,这样一来可以在广域网上使用的就变少了。

所谓在广域网上使用的IP地址即公网IP地址,公网IP地址是可以被直接路由查找到的、并需要向IP地址管理机构申请、注册、购买,且保证全球唯一的地址。它就相当于身份证号。

与公网IP地址对应的是私网IP地址,又称为专用网络IP地址或局域网IP地址。它是仅可以在用户的局域网内部使用的IP地址,且可以重复使用,无需向IP地址管理机构申请、注册、购买的地址。它就相当于企业内部的员工编号。

随着公网IP地址不断的分配出去,其枯竭问题也随着产生,虽然网络地址转换(NAT, Network Address Translation)可变长子网掩码(VLSM, Variable Length Subnet Mask)无类域间路由(CIDR, Classless Inter-Domain Routing)等技术显著减少了枯竭的速度,但在2011年2月3日,最后5个地址块也被分配出去。所以现在正积极推广IPv6。

与任何数据一样,IPv4地址在计算机内部也是以二进制形式表示的,每个地址都有32位,我们经常看到的IP地址格式是为了让其可读性更高而特地转化的。

引用一个IPv4地址的时候一般以点分十进制的xxx.xxx.xxx.xxx来表示,其中每3位代表一个8位的二进制数

8位的二进制数可表示最大的值为2^8^-1,因此转换成点分十进制后,每段IP地址的取值范围在0~255之间

子网掩码

在设置IP地址时,经常要配置子网掩码,它是为了区分IP地址中的网络ID和主机ID使用的。

因为互联网实际上是有多个小型网络组成的,每个网络上又有多个主机,这样网络便是一个有层次的结构,IPv4地址设计之初就考虑到了层次特点,于是规定将IP地址分割为网络ID和主机ID两部分

但这样一来在寻址的时候就要知道哪部分是网络ID哪部分是主机ID,这就是通过子网掩码实现的,子网掩码和IP地址一样也是一个32位的数字,为了方便阅读,一般也按点分十进制表示。

将子网掩码和IP地址都转换为二进制后,子网掩码上对应位为1的则为网络ID,对应位为0则为主机ID

要注意的是,子网掩码的1位和0位必须是连续的,也就是说,不能出现二进制为10101010这样的子网掩码。

地址的分类

最初时把IPv4地址分成两部分,网络识别码在最高的一个字节中,主机识别码在剩下的部分中,但这样来分类最多就只能分配给256个网络,显然是不符合实际需求的。

于是在后来出现了分类网络,地址的高位被重新定义为网络类别,分为A~E共5类地址。其中D类是组播地址,E类是保留地址。其他均为单播地址。

它们都有不同的网络类别长度,剩余部分就用来标识主机。网络ID用来确定不同类型的网络里面有的网络数量,而主机ID用来确定每个网络里面的IP地址数。

下面是每类网络的详细结构:

A类IPv4地址

classa

结构如上图所示,其中网络ID占最高一个字节,主机ID则占用剩余的三个字节。

在分类中规定,A类地址的最高位固定为0,即A类网络的理论总数应为2^7^为128个,但实际上可使用的只有126个,因为网络ID为0或127都是不可用的

网络ID全为0的地址称为保留地址;而全为1的(十进制的127)是本地环路地址

而A类地址中主机ID共24位,可用主机ID数为2^24^为16777216个,但有两个是保留的,所以一共可用的ID数是16777214个其中主机ID全为0的是网络地址;主机ID全为1的是广播地址

综上所述,A类网络可构建的网络数量最少,但每个网络中拥有的地址数量是最多的,也就是可以构建的网络规模是最大的。

其子网掩码为固定的255.0.0.0。

B类IPv4地址

ClassBIPv4

结构如上图所示,和A类不同的是,B类地址网络ID扩展到了16位,但前两位固定为10。

同理,由此可知B类网络总数为16384个。而主机ID一共有65536个,同样的,主机ID全为0或全为1均为保留地址,所以实际可用地址数位65534个。

其子网掩码为固定的255.255.0.0。

C类IPv4地址

ClassCIPv4

结构如上图所示,和B类相比,C类网络的网络ID扩展到了24位,其中前三位为固定的110(图片有错误)。

这样一来,可知C类网络总数为2^21^=2097152个。而主机ID只有8位,同样要保留全为0或1的地址,所以主机ID一共只有2^8^-2=254个。

其子网掩码为固定的255.255.255.0。

单播地址的类别特征

上述提及到的A、B、C类地址是单播地址,可以发现,网络数和主机数总保持一个变化,但由于其变化过于剧烈,因此实际应用中这种分类并不足够科学。其特征如下表:

类别网络ID部分主机ID部分w的取值范围主机ID取值范围网络ID总数
Aw.x.y.z1-1261-16777214126
Bw.xy.z128-1911-6553416384
Cw.x.yz192-2231-2542097152

D类IPv4地址

ClassDIPv4

结构如上图所示,D类地址属于组播地址,用于组播通信。这样一来源主机只需要发送一次数据就可以使对应的组中所有主机都接受到这份数据。

它规定前4位固定为1110,组播地址范围为224.0.0.0~239.255.255.255。

永久组播地址

预留为公用的部分又称永久组播地址,其地址范围为224.0.0.0~224.0.0.255。使用这些永久组播地址的有IGMP(Internet组管理协议)、CGMP(Cisco组管理协议)、IGMP Snooping(IGMP侦听)、PIM(协议无关组播)等等。

这段组播地址不会被路由器转发。其中224.0.0.0不使用,其他一部分的说明如下表所示:

地址说明
224.0.0.1本地组播网络中所有支持组播的主机
224.0.0.2本地组播网络中所有组播路由器
224.0.0.4本地组播网络中所有DVMRP路由器
224.0.0.5本地组播网络中所有OSPF路由器
224.0.0.6本地组播网络中所有OSPF指定路由器(DR)
224.0.0.9本地组播网络中所有RIPv2路由器
224.0.0.10本地组播网络中所有IGRP路由器
224.0.0.13本地组播网络中所有PIMv2路由器
224.0.0.22本地组播网络中所有IGMPv3路由器

公用组播地址

公用组播地址和单播IP地址类似,是在全球范围内可以直接在互联网上使用的组播地址。其地址范围为224.0.1.0~224.0.1.255。和单播IP地址一样,也由IANA为提出申请并付费的用户分配。

临时组播地址

该地址段是由企业用户在本企业局域网内使用的组播地址,其地址范围为224.0.2.0~238.255.255.255,和本地环路地址一样,它仅在本地局域网有效

本地管理组播地址

该地址段也是保留使用的,专用于内部组播测试使用,其地址范围为239.0.0.0~239.255.255.255,仅在特定的本地网络范围内有效。

E类IPv4地址

ClassEIPv4

结构如上图所示,该地址是IANA保留地址,不分配给用户使用,其地址范围为240.0.0.0~247.255.255.255


因特网协议(IP)

IP协议最主要的功能就是将数据报在互联的网络上传送,具体的来说,IP协议主要有如下功能:寻址、数据报封装、分段与重组

该协议服务的特色是:无连接、不可靠、尽力而为

IPv4数据报

头部格式

发送端的网络层接收到从传输层发来的数据段时,需要通过网络层协议将其封装成数据报,IP对其数据报头的格式如下:

IPv4PacketHeader

下面来详细看看每个字段的格式:

  1. 版本(Version)

    表示IP数据报中使用IP的版本,占4位。对于IPv4,其值为4(0100)~2~。

  2. 头部长度(Header Length)

    表示IP数据报头部的总长度,占4位。注意,这个长度的单位是4字节(Byte),当报头不使用选项字段时,该值为5(即20字节)。通过该值可以发现,IP数据报头部最长为15个单位,也就是60字节,注意,报头长度必须是4字节的整数倍,如若不是,则需要使用填充字段补0凑足

  3. 区分服务(Differentiated Services)

    表示优先级和服务类型标识,又叫做ToS字段,占8位。它包括3位的优先级、4位的标志位(标志分别为:Delay、Throughput、Reliability、Cost,分别标识延迟、吞吐量、可靠性、开销),剩余的1位不使用。

    但IETF的RFC2474中有另外的解释,其前6位定义为区分服务码点(DSCP, Differentiated Services Code Point),是优先级和服务类型的组合,定义了共64个优先级,剩余2位不使用。

    无论是哪个版本,都必须在使用区分服务时有效,如不使用该字段值总为0。在目前的因特网中,多半不使用该服务。

  4. 总长度(Total Length)

    表示整个IP报文的长度(包括报头和数据),占16位(2字节)。这个长度的单位是字节,由此可得出,IP数据报最大长度为2^16^-1字节,即65535字节(64KB)。

  5. 标识(Identification)

    表示该IP数据报的ID号,占16位。每个数据报都有唯一的标识号,IP会维持一个全局变量来记录标识号,当改号码超出字段表示范围时重置为0。之所以要维持这样一个序号,是为了在数据报需要分段时,接收端可以根据该编号和段偏移正确的重组报文

  6. 标志(Flags)

    表示该数据报后是否还有/允许分段,占3位。只有前两位有意义——最低位为MF(More Fragment);中间位为DF(Don’t Fragment)。如果MF为1,则表示后面还有分段;如果DF为1,则表示该报文不允许分段,当不允许分段的报文超出MTU时中间节点会将该报文直接丢弃,并返回ICMP报告。

  7. 段偏移(Fragment Offset)

    表示该分段在数据报中的相对位置,占13位。即相对于用户数据字段的起点,该分段从何起始,要注意的是,段偏移以8字节为单位(分段也必须按8的整数倍来分段,最后一段除外)。如果无分段时,该值为0。

  8. 生存时间(TTL, Time To Live)

    表示该数据报的生存期,占8位。每经过一个路由器时,路由器都会将该值减1,如果该值为0,则分组被丢弃。设置这个值是为了避免路由表中的环路导致数据报文无休止的循环转发。

    有趣的是,该字段设计之初是用来表示数据报在网络中传输的时间的,以秒的单位。也就是说每经过一个路由器,就使该值减去在本路由器所耗费的时间,不足1秒减去1秒,最长为255秒。后来因为网络效率很高,一次转发全流程不过数十毫秒,于是就变为了现在的生存期。

  9. 协议(Protocol)

    表示该数据报在传输层使用的协议,占8位。该字段让主机的IP层可以对应的将数据上交给哪个处理过程,如TCP的协议号是6,UDP的协议号是17等等。

  10. 校验和(Checksum)

    用于该数据报头部部分的校验,占16位。要注意的是,该校验和只负责数据报头部的校验,每次经过路由器转发后一些值可能都会改变,所以每次转发都会重新计算该值。

  11. 源地址/目的地址(Sources Address/Destination Address)

    表示该数据报的发送者和目的地的地址,各占32位。在整个IP传输流程中,这两个字段永远保持不变。

  12. 选项(Options)

    预留作为扩展使用,可变长,占1~40个字节。让用户可以用作除错、测量、加密等使用,也可以完全不使用该字段。目前来说,该字段使用不多。

  13. 填充(Padding)

    如果使用了选项字段导致数据报并非32位(4字节)的整数倍,就需要用该字段补0来凑齐。

分段与重组

IP数据报中一个比较重要的特性是分段与重组,也是报头里标识和段偏移等字段的作用。

因为不同的网络上的MTU可能是不同的,如果一个数据报过大,不能一次性传输的话,就需要对数据报进行拆分后再传输。

分段

当一个IP数据报封装成数据链路层帧时,如果此报文的总长度超过了链路层的MTU值,则需要对数据报进行拆分。每个拆分后的数据报都会包含源IP数据报的报头,此后将其各自独立传输,就如同一个普通的IP数据报。

值得注意的是,分段一般是由路由器完成的,并且有可能在分段的基础上再次分段。

重组

当最终目的主机接收到所有分段后进行重组,这个过程根据数据报里的标识符(由同一个数据报拆分的各个段里面标识符都是一致的)、段偏移、标志等字段进行重组。

重组过程是丢弃子分组的报头,并且最终重组而成的数据报不会有偏移字段或者标志位的设置。

与分段不同,重组都是由目的主机完成的。


地址解析协议(ARP)

ARP(Address Resolution Protocol)是将IP地址解析为以太网MAC地址(物理地址)的协议。在局域网中,发送数据时必须知道对方的网络层地址(IP地址),但仅有IP地址是无法发送的,因为IP数据报最终要封装成帧(Frame)通过链路层由物理网络发送,因此还必须知道接收方的物理地址,该协议就是为了建立一个从IP地址到物理地址的映射而产生的。

ARP解析原理

假设A和B同处于一个网段中,如果A已经知道B的IP地址,要想获得主机B的MAC地址,其流程如下:

  1. A查看自己的ARP表(存于本地的IP地址与MAC地址映射表),确认其中是否有对应的MAC地址,如有则直接使用。
  2. 如果ARP表中没有对应记录,则缓存该数据报,随后以广播方式发送一个ARP请求报文。该请求报文中包含自己的IP、MAC地址及请求目标的IP地址。
  3. 主机B收到来自A的广播ARP报文,将报文中A的IP与物理地址存于本机ARP表,随后将自己的IP及MAC地址以单播方式向主机A发送一个ARP响应报文。
  4. 主机A接收到来自B的响应报文后,便得知了对方的MAC地址,将其加入自己的ARP表中,随后将缓存的数据报发送出去。

注意,这个流程里面,所有收到来自A广播的ARP请求报文的终端,都会将A的IP及MAC存于自己的ARP表中,这样就可以减少多次重复的无意义广播了。

如果不在同一网段下则有些许不同,大体上仍然是类似的,但请求会逐层上交,如无该IP,则A的网关会构造一个ARP响应报文交回给A,然后由网关来负责询问对应IP地址的网关MAC地址,如此类推,逐层转发。

ARP报文格式

ARP是独立的三层协议,所以在向数据链路层传输的时候不经过IP协议,而是直接自己生成报文。其中也包括ARP报头,ARP报文又分为请求报文和应答报文两种,它们格式如下表:

大小(字节)221126464
字段硬件类型上层协议类型MAC地址长度IP地址长度操作类型源MAC地址源IP地址目的MAC地址目的IP地址

其各项说明如下:

  • 硬件类型:表示ARP报文在哪种类型上网络传输,占2字节。值为1时代表以太网地址。
  • 上层协议类型:表示硬件地址要映射的协议地址类型,占2字节。值为0x0800的时候代表映射IP地址。
  • MAC地址长度:表示MAC地址长度,占1字节。注意,该单位为字节数,此处为6(MAC地址共6个字节)。
  • IP协议地址长度:表示IP地址长度,占1字节。注意,该单位为字节数,此处为4(IP地址共4字节)。
  • 操作类型:表示本次ARP报文的类型,占2字节。值为1表示请求,为2表示应答。
  • 源MAC地址:表示发送方MAC地址,占6字节。
  • 源IP地址:表示发送方IP地址,占4字节。
  • 目的MAC地址:表示目的方MAC地址,占6字节。在请求报文中该字段为全0,表示任意地址,因为不知道对方MAC地址才会发请求报文。
  • 目的IP地址:表示目的方IP地址,占4字节。

ARP报文也不是直接从网络层发送的,它和其他报文一样,最终会经过数据链路层等等再次封装。特别的是,因为ARP请求报文是广播报文,所以链路层封装的目的MAC地址填写的是FFFFFFFF,即广播地址。而其帧类型为ARP协议号0x0806。


因特网控制消息协议(ICMP)

ICMP(Internet Control Message Protocol)是用于在IP主机、路由器之间传递控制消息的,这里的控制是指各种类型的反馈信息,如网络不通,主机不可达到等等。

控制信息是极其重要的,但与ARP协议不同,ICMP主要依靠IP协议来完成其任务,也就是说ICMP报文中是有封装IP头部的,但它与传输层协议的TCP/UDP的目的不同,它并不是用来传送数据的,一般是不被用户程序直接使用的(除了Ping/tracert这一类诊断程序)。

要注意的是,尽管ICMP对网络状况提供了反馈,但并不能使IPv4协议成为可靠的协议,因为ICMP本身就是通过不可靠的IPv4传送的。

ICMP常见错误类型

消息类型说明
回显请求0最常见的是Ping工具通过发送ICMP回显以检查特定节点的连接状况。
回显应答8节点响应回显答复请求。
重定向5路由器发送重定向消息,告诉主机到目标IPv4地址更好的路由路径。
源抑制4路由器发送源结束消息,告诉主机它们发送的数据报将被丢弃,因为路由器产生了拥塞。主机会响应并应较低的频率来发送数据报。
超时11当IP数据报超过生存期时发出的错误信息。分段的IP数据报如果不能在时限内重新组合也会发送该消息。
无法到达3路由器和目标主机发送的无法到达消息,通知主机它们的数据报无法传送。该报文还会包含更多细节信息,如无法访问协议、无法访问主机(无该IP地址)、无法访问端口、路由过程中需要分段但设置了不可分段标志。

ICMP报文格式

ICMP是包含在IP数据报中的,因为ICMP是经由IP发送的。当IP报文中协议字段值为1,表示这是一个ICMP报文。其格式如下图所示:

ICMPPacket


IPv4的不足

IPv4经过多年的使用,证明它是可靠、易实现的,但随着网络高速发展,网络设备爆炸性膨胀,仍然暴露出来了其不足。

地址空间面临枯竭

IPv4地址分为私网地址和公网地址,私网地址即仅用于局域网内部的,不同的局域网可以重复使用。而公网地址则是全球唯一的地址,是需要购买注册的,一个地址只能在一个地方使用。由此可见,公网地址越来越少,但IPv4地址仅有32位,总体可以提供的地址总数是有限的,这也是IPv4走向衰落的主要原因。

目前IPv4地址已经相当缺乏,全球几乎都无IP地址可以分配了,这严重影响了计算机网络的发展。尽管一直在采用网络地址转换(NAT, Network Address Translation)可变长子网掩码(VLSM, Variable Length Subnet Mask)无类域间路由(CIDR, Classless Inter-Domain Routing)等技术来更加充分利用现有的公网IP地址,但仍然很难满足现实需求的增长速度。

骨干路由器维护的路由表项目数量过多

由于IPv4发展初期规划问题,造成许多IPv4地址块分配不连续,导致无法有效聚合路由。

尽管通过CIDR技术及重新分配IPv4地址的方法有效抑制了全球BGP路由表的增长速度,但仍然无法中止该过程,现在已经达到17万多条,经CIDR技术聚合后仍有近十万条。如此庞大的路由表使得需要耗费很多的内存,对成本及转发效率都有影响。

地址结构不合理

IPv4地址的A、B、C、D、E这五种分类本身就存在严重缺陷,不能很好的充分利用地址资源。

如果一个组织分配了A类地址,那么大部分地址都将会被浪费,如果给该组织分配C类地址,则其空间又严重不足。而且D类及E类地址都无法利用。

虽然通过VLSM、CIDR这样的技术可以在一定程度上弥补,但同样会使得路由表和路由策略变得十分复杂,影响路由效率。

配置复杂

目前大多数IPv4都需要手动配置,或者通过控制状态的地址配置协议进行配置(如DHCP协议)。

随着设备数量增多,越来越需要一种不依赖基础结构的配置设置方法。IPv6就支持自动配置功能。

服务质量差

由于IPv4是无连接协议,所以它本身就不具可靠性。虽然有QoS标准,但实时通信依赖于IPv4服务类型(ToS)字段和负载的标识,通常使用UDP或TCP端口。

可惜的是,IPv4协议的ToS字段功能有限,且有多种解释。另外,当IPv4数据报中负载被加密后,负载标识就无法使用TCP和UDP端口。

不支持端到端安全

因为IPSec是IPv4中的可选项,实际上部署的多数节点都不支持IPSec,所以其安全性较差。

另外,IPv4中NAT需要对IP报文头进行修改,有时候甚至要修改相关应用数据。而在端到端安全需要对IP报头的完整性通过加密来保证,其发送者负责保护报头完整,而中间任何对报头的修改都会导致无法使用IPSec。也就是说,部署了NAT的时候就无法使用端到端安全了。

文中图片来自《深入理解计算机网络》


版权声明:本文为GarfieldGCat原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。