本篇结构:
- 前言
- IP地址
一、前言
网际协议IP是TCP/IP协议中最重要的两个协议之一,也是最重要的互联网标准协议之一。与ip协议配套的协议有:
- 地址解析协议ARP(Address Resolution Protocol)
- 网际控制报文协议ICMP(Internet Control Message Protocol)
- 网际组管理协议IGMP(Internet Group Management Protocol)
逆地址解析协议RARP(Reverse Address Resolution Protocol)(已被淘汰)
上图显示了网际协议IP同其三个配套协议的关系,它们都属于TCP/IP协议中的网络层。ARP在最下面,因为IP要经常使用这个协议。ICMP和IGMP在最上面,因为它们要使用IP协议,其报文作为IP数据报的数据部分。
二、IP地址
2.1、什么是IP
整个互联网是一个单一的、抽象的网络。IP地址就是给互联网的每一台主机(路由器)的每一个接口分配的一个在全世界范围内唯一的32位标识符。IP地址现在是由互联网名字和数字分配机构ICANN进行分配。
2.2、IP地址的表示
IP地址是一个32位的二进制标识符(10000000000010110000001100011111),这样的表示对我们来说可读性很低,为了提高可读性,往往把32位的IP地址分为4段,每段8位,中间插入空格(10000000 00001011 00000011 00011111),这只是显示方便,计算机中并没有真实转变,为了更利于我们的记忆和识别,往往用等效的十进制数表示每段,并且每段之间加上一个点(128.11.3.31)。这是点分十进制记法。
2.3、分类的IP地址
分类的IP地址是指将固定的IP地址划分为若干个固定的类,每一类都有两个固定长度的字段组成。
IP地址::={<网络号>,<主机号>} (::=意为“定义为”)
1.其中第一个字段是网络号,标志着主机(路由器)所连接的网络,网络号是全网唯一的;
2.第二个字段是主机号,标志网络号所指的网络内的主机(路由器)。
分类的IP地址根据网络号所占比特位个数不同,分为5类:A类、B类、C类、D类、E类,其中A、B、C类为单播地址,D类为多播地址,E类为保留地址。
2.4、划分IP的原因
把IP地址分类,是这样考虑的。各种网络差异很大,有些网络拥有很多主机,有些网络拥有的主机相对较少,把IP地址划分为A类、B类、C类能更好的满足需求,当某个单位申请了一个IP地址时,实际是获得了同样网络号的一个IP地址块,其中的各台主机号则由单位自行分配。
2.5、常用的3类IP地址
1.A类IP地址
- 网络号
A类地址的网络号字段占1个字节,但前面的1位(0)已经固定,只剩下7位可以进行分配,即可指派的网络号是126个(即2^7-2)。
减去2是因为:
网络号字段为全0的IP地址是个保留地址,意思是“本网络”;
网络号为127(即01111111)保留作为本地软件环回测试(loopback test)本主机的进程之间的通信只用。
若主机发送一个目的地址为环回地址(例如 127.0.0.1)的IP数据报,则本主机中的协议软件就处理数据报中的数据,而不会把数据报发送到任何网络。目的地址为环回地址的IP数据报永远不会出现在任何网络上,因为网络号为127的地址根本不是一个网络地址。
- 主机号
A类地址的主机号占3个字节,因此每一个A类网络中的最大主机数是2^24-2,即16777214。
减去2是因为:
全0的主机号字段表示该IP地址是“本主机”所连接到的单个网络地址(例如,一主机的IP地址为5.6.7.8,则该主机所在的网络地址就是5.0.0.0)。
全1的主机号字段表示该IP地址是“所有的”,即该网络上的所有主机。
2.B类地址
- 网络号
B类地址的网络号字段占2个字节,但前面的2位(1 0)已经固定,只剩下14位可以进行分配。
B类网络地址128.0.0.0是不指派的,而可以指派的B类最小网络地址是128.1.0.0(128.0.0.0是保留地址)。因此B类地址可指派的网络数是2^14-1,即16383。
- 主机号
B类地址的主机号占2个字节,每一个网络上的最大主机数是2^16-2,即65534,这里需要减2是因为要扣除全0和全1的主机号。
整个B类地址空间共约2^30个地址,占有整个IP地址空间的25%。
3.C类IP地址
- 网络号
C类地址的网络号字段占3个字节,但前面的3位(1 1 0)已经固定,只剩下21位可以进行分配。
C类网络地址192.0.0.0是不指派的,而可以指派的C类最小网络地址是192.0.1.0。因此B类地址可指派的网络数是2^21-1,即2097151。
- 主机号
C类地址的每一个网络上的最大主机数是2^8-2,即254,这里需要减2是因为要扣除全0和全1的主机号。
2.6、IPv4私有地址空间
人们对IPv4单播地址空间的某些地址块进行了预留,并将其指定为私有地址。私有地址空间专为不与公网(Internet)相连的网络而预留。RFC 1918将下列地址块定义为IPv4私有地址:
10.0.0.0~10.255.255.255;
172.16.0.0~172.31.255.255;
192.168.0.0~192.168.255.255。
RFC 1700载有已预留及已分配(Internet相关)参数的通用信息,包括已预留的IP地址信息[1]。使用网络地址转换(Network Address Translation,NAT)技术,启用了IPv4私有地址空间的私有网络仍然可以连接到公网(Internet)。
2.7、IP数据报的格式
IP数据报的格式能够说明IP协议具有什么功能。下图是IP数据报的完整格式。
- 版本
占4位,指IP协议的版本。通信双方使用的IP协议版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。
- 首部长度
占4位,可表示的最大十进制数值是15,请注意,首部长度字段所表示数的单位是32字(1个32位字长是4字节),因此,首部长度字段的最小值是5(即0101),相当于IP首部长度为5×4=20字节,而当首部长度为1111时(即十进制15),即达到60个字节,当 IP 分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此数据部分永远在 4字节的整数倍开始,这样在实现 IP协议时较为方便。首部长度限制为 60字节的缺点是有时可能不够用。这样做的目的是希望用户尽量减少开销。最常用的首部长度就是 20 字节 (即首部长度为 0101),这时不使用任何选项。
- 区分服务
占8位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务DS(Differentiated Services)。只有在使用区分服务时,这个字段才起作用。
- 总长度
总长度指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为216-1=65535字节。在IP层下面的每一种数据链路层都有自己的帧格式,其中包括帧格式中的数据字段的最大长度,即最大传送单元 MTU (Maximum Transfer Unit)。当一个数据报封装成链路层的帧时,此数据报的总长度 (即首部加上数据部分)一定不能超过下面的数据链路层的MTU值。若传送的数据报长度超过MTU,就需把过长的数据报做分片处理。
- 标识
占 16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加 1,并将此值赋给标识字段。但这个“标识”并不是序号,因为 IP是无连接的服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的 MTU 而必须分片时,这个标识字段的值就被复制到所有的数据报的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。
- 标志(flag)
占3位,但目前只有2位有意义。
标志字段中的最低位记为MF(More Fragment)。MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个。
标志字段中间的一位记为DF(Don’t Fragment),意思是“不能分片”。只有当DF=0时才允许分片。
- 片偏移
占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。
- 生存时间
占 8位,生存时间字段常用的英文缩写是TTL (Time To Live),其表明数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在因特网中兜围子,因而白白消耗网络资源。最初的设计是以秒作为 TTL的单位。每经过一个路由器时,就把TTL减去数据报在路由器消耗掉的一段时间。若数据报在路由器消耗的时间小于 1 秒,就把TTL值减 1。当 TTL值为 0时,就丢弃这个数据报。
- 协议
占 8 位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。
- 首部检验和
占 16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,都要重新计算一下首都检验和 (一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量。
- 源地址
占32位。
- 目的地址
占32位。
- P数据报首部的可变部分
IP首部的可变部分就是一个可选字段。选项字段用来支持排错、测量以及安全等措施,内容很丰富。此字段的长度可变,从1个字节到40个字节不等,取决于所选择的项目。某些选项项目只需要1个字节,它只包括1个字节的选项代码。但还有些选项需要多个字节,这些选项一个个拼接起来,中间不需要有分隔符,最后用全0的填充字段补齐成为4字节的整数倍。
增加首部的可变部分是为了增加IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。实际上这些选项很少被使用。新的IP版本IPv6就将IP数据报的首部长度做成固定的。