文章目录
- 1 网络层
- 2 网络层IP协议
- 2.1 IPv4地址及其表示方法
- 2.2 IP协议格式
- 2.2.1 Version(版本)
- 2.2.2 IHL(首部长度)
- 2.2.3 TOS(区分服务)
- 2.2.4 Total Length(总长度)
- 2.2.5 Identification(标识符)
- 2.2.6 Flags(标记位)
- 2.2.7 Fragment Offset(分段偏移)
- 2.2.8 Time to Live(存活时间)
- 2.2.9 Protocol(协议)
- 2.2.10 Header Checksum(报头校验和)
- 2.2.11 Source address(源地址)
- 2.2.12 Destination address(目的地址)
- 2.2.13 options(ip选项)
- 2.2.14 padding(填充)
- 2.3 IPv4数据报的封装与解封转
- 2.4 IP层转发分组的流程
在网络层我们需要了解的就是整个计算机网络中最重要的协议IP协议。
1 网络层
网络层介于传输层和数据链路层之间,其主要作用是实现两个网络系统之间的数据透明传送,具体包括路由选择,拥塞控制和网际互连等。
网络层是网络与网络之间通信的最底层,在数据从数据链路层向传输层进行数据传输的通信中,起到构建一个中间通信子网的作用。不同网络有这不同的网络层协议和地址规范,如果一个网络中的用户不能识别其他网络的通信协议和地址规范,那么这两个网络之间就不能进行数据通信,就好比不同国家有着不同的交通法规,属于不同的交警系统管理,不允许他国车辆随便出入一样。不同网络也有不同的设计规范,属于不同的组织来管理,必须通过授权,并由专门的协议来负责网络间的通信。
如果只是同一局域网内的各个计算机之间的通信,单靠物理层和数据链路层就可以建立通信链路完成用户间的数据通信,但要扩大应用范围,连接不同的局域子网,就需要借助网络层处理各个网络子网的协议,从而进行计算机的网络互连,所以网络层在TCP/IP协议体系中叫网际互连层。
从一般的概念来讲,将网络互相连起来的要使用一些中间设备。根据中间设备所在的层次,可以有以下四种不同的中间设备:
- 物理层使用的中间设备叫转发器(repeater)
- 数据链路层使用的中间设备叫做网桥或桥接器(bridge)
- 网络层使用的中间设备叫做路由器(router)
- 在网络层以上使用的中间设备叫做网关(gateway) 用网关链接两个不兼容的系统需要在高层进行协议的转换。
1.1 网络层提供的服务
网络层向上只提供简单灵活的,无连接的,尽最大努力交付的数据报(IP数据报或分组)服务。网络层不提供服务质量的承诺,也就是说,所传送的分组可能出错,丢失,重复和失序,当然也不保证分组交付的实现。如果主机中的进程之间的通信需要的是可靠的,则由传输层的协议进行负责。
1.2 虚电路和数据报网络
虚电路网络和数据报网络是计算机网络的两种基本类型。在作出转发决定时,他们使用了非常不同的信息:
- 许多网络体系结构(包括ATM、帧中继体系结构)是虚电路网络,即它们在网络层提供连接服务。一条虚电路的组成如下:
- 源和目的主机之间的路径(即一系列链路和路由器);
- VC号,沿着路径的每段链路的一个号码;
- 沿着该路径的每台路由器中的转发表表项。
- 因特网是一个数据报网络。在数据报网络中,每当一个端系统要发送分组,它就为该分组加上目的地端系统的地址,然后将分组推进网络中。每台路由器有一个将目的地址映射到链路接口的转发表,当分组到达路由器时,路由器使用该分组的目的地址在转。
1.3 网络层的作用
在网络体系中,每一层都是服务于对应的上下层的,网络层也是,服务于上层的传输层和下层的数据链路层。其主要作用表现在一下几个方面:
1.3.1 屏蔽网络差异,提供透明传输
不同网络有不同的规范要求,网络层就是为了解决这种不同差异,寻找一个不同网络间都能共同遵守的网络通信规范,以便不同网络间能相互识别,并接受对方的网络请求,说白了,就是一个中转站的作用,两个毫无交集的网络通过这个中转站来建立交集。这样传输层就可以在不同网络间进行透明数据传输。网络层向传输层提供的服务有两类:面向连接的网络服务和无连接的网络服务。
虚电路是网络层向传输层提供的一种面向连接的服务,是可以使所有数据包按顺序到达目的节点的可靠数据传送方式。在该种方式下,进行数据交换的两个结点之间存在一条专为它们服务的虚电路(逻辑线路),无须附加网络地址;
数据报服务是网络层提供的一种无连接的网络服务,只能提供不可靠的数据传送方式,源节点(如源路由器)发送的每个数据包都要附加网络地址、包序号等信息,目的节点收到的数据包也不一定按序到达,还可能存在数据包丢失的情况。IP协议是一种无连接的网络层协议,提供无连接的网络层服务。
1.3.2 为网络间通信提供路由选择
路由选择也叫路由选择,是根据一定的原则和路由选择算法在多个结点的通信子网中选择一条到达目的节点的最佳路径的过程。确定路由选择的策略成为路由算法。在无连接的数据包服务中,网络节点要为每个数据包做出路由选择,即选择到达目的节点的最佳路线,而在面向连接的虚电路服务中,存在一条专们的逻辑线路,在建立连接时就已经确定了路有路径,无需额外选择。
1.3.3 数据包封装和解封装
这个类似的功能各个网络层都提供,因为在网络体系结构的不同层次中传输的数据单位并不一样,且发送方和接收方接受数据包的路径是相反的。在发送方,数据自上而下每经过一层都必须在数据头部添加对应层的协议头和(或)协议尾信息,到了接收方,数据自下而上每经过一层又都必须解除前面那层所封装的协议头和(或)协议尾信息。
在发送方,来自传输层的报文通常是已根据对应网络链路的MTU(最大传输单元)被分成多个数据段,然后在网络层中对这些数据段头部添加一些网络层协议控制信息就组成了数据包,这就是包的封装过程。数据包的头部包含源节点和目标节点的网络层地址,在接收方,数据从底层到达网络层时,要去掉在数据链路层加上的数据链路层协议控制信息(帧头和帧尾),还原出原来的数据包格式,这就是包的解封转过程。
1.3.4 拥塞控制
拥塞控制是为了避免网络传输路径中数据的传输延迟或死锁。数据链路层中的流量控制功能,是针对数据链路中点对点传输速率的控制,这里的拥塞控制是针对在网络层传输路径中的端到端传输效率的控制。主要采用预约缓冲区、许可证和分组丢弃等方式。
1.4 网络层数据交换
在网络层中,路由器把数据包转发到另一个网络中的目的节点。在计算机网络中,两个端点之间通常需要通过中间结点实现数据通信,这些中间结点并不关心数据内容,只提供一个交换设备,把数据从一个结点转发到另一个结点,直至达到目的端。
目前最常用的是分组交换方式。
在分组交换技术中有两大技术派系:
- 采用路由技术(目前比较普遍采用的一种交换方式),在要转发的数据包头部加上源节点和目的节点的IP地址,然后通过路由技术一级级地把数据转发下去。这种分组方式就是前面说到的数据报分组交换方式。
- 采用虚电路服务,它不依靠路由技术,而是在进行数据分组转发前先在源节点和目的节点间的所有路由器间建立一条虚拟的通信通道,然后再把数据分组从这个虚拟通道中转发到目的节点。
分组交换是集报文交换和线路交换两者优点而开发的一种数据交换方式,也采用报文交换的存储-转发机制,并规定了传输数据的单位长度。
分组交换是集报文交换和线路交换两者优点而开发的一种数据交换方式,也采用报文交换的存储-转发机制,并规定了传输数据的单位长度。现在主要采用这种数据方式。
当报文过长时,会把报文分成几个组,在数据报服务方式中,会为每个分组添加报文号、分组号、目的地址、源地址和校验字段信息,然后将这些信息发送出去,由通信子网中的节点进行路由选择,当一个报文的所有分组到达了目的主机后,再将各个分组按序号编排起来。
采用虚电路这种服务方式的分组则无须添加源和目的地址信息,但仍需要添加报文号、分组号信息。在分组发送之前,已经搭建好了一条逻辑链路。
2 网络层IP协议
目前的计算机网络,特别是TCP/IP网络,使用最多的是数据包分组交换方式,而IP协议是用于将多个分组交换网络连接起来的最典型通信协议。
IP协议是一个无连接的服务,负责在源地址和目的地址之间传送数据包,然后为了使用不同网络对分组大小的要求,需要对上层传来的报文进行分割,最后调用本地网络协议将数据包传送给下一个网关或目的计算机。
IP协议有多个版本,比较重要的是IPv4和IPv6。
与IP协议配套使用的还有:
- 地址解析协议ARP(Address Resolution Protocol)
- 网络控制报文协议ICMP(Internet Control Message Protocol)
- 网络组管理协议IGMP(Internet Group Management Protocol)
- 逆地址解析协议RARP(Reverse Address Resolution Protocol) 与ARP配合使用,现在已经淘汰。
2.1 IPv4地址及其表示方法
IP地址就是给互联网上的每一台主机(或路由器)的每个接口分配的一个在全世界范围内唯一的32位的标识符。IP地址由互联网名字和数字分配机构ICANN(Internet Corporation for Assigned Names and Numbers)进行分配。
IP地址的编址经过了三个阶段:
- 分类的IP地址。这是最基本的编址方法,在1981年通过了相应的标准协议。
- 子网划分。这是对分类IP地址的改进,其标准RFC950在1985年通过。
- 构成超网。比较新的无分类编址方法,在1993年提出后得到推广应用。
2.1.1 IPv4分类
IP地址分类指将IP地址划分为若干个固定类,每一类地址都由两个固定长度的字段组成:
- 第一个字段是网络号(net-id),标志主机(或路由器)所链接的网络。网络号在整个互联网范围必须是唯一的。
- 第二个字段是主机号(host-id),标志该主机(或路由器)。一个主机号在它前面的网络号所指明的网络范围内必须是唯一的。
由此可见,一个IP地址在整个互联网范围内是唯一的。
根据网络号定义的位数,IPv4可以分类为以下几种:
2.1.1.1 A类
A类IPv4地址结构如下图所示,其中网络ID占用最高一个字节,也就是第一个二进制8位组,而主机ID则占用剩余三个字节,也就是后面的三个二进制8位组(一共24位)。
网络ID
在分类中规定,A类IPv4地址中网络ID的最高位固定为0,后面7位可变。这样一来,A类网络的总数从256($2^8$
)个减少到 128($2^7$
)个。但实际可以使用的只有126个,即整个IPv4地址中可构建126个A类网络,因为网络ID为0和127的A类网络不可用的。
- 网络ID为00000000(相当于十进制的0)的地址为保留地址,表示本网络,不能被分配;
- 网络ID为01111111(相当于十进制的127)的地址作为本地软件环回测试本主机的进程之间通信之用,也是不能分配的。目的地址为环回地址的IP数据报不会出现在任何网络上。
主机ID
A类IPv4地址中主机ID有24位,所有可以使用的主机ID数,也就是可以每个A类网络中拥有的IPv4地址数为166777216($2^{24}$
),但实际上可用的地址数为166777214($2^{24}-2$
)
- 主机ID全为0的地址为网路地址,如一主机IP地址为10.1.2.13,其所在的网络地址为10.0.0.0。不能分配给主机使用。
- 主机ID全为1的地址为广播地址,表示该网络上的所有主机,不能分配给主机使用。
A类网络中可以构建的网络数最少,但每个网络中拥有的地址数是最多的,也就是可以构建的网络规模最大,适用于大型企业和运营商。
2.1.1.2 B类
B类IPv4地址结构如下图所示,其网络ID占用最高的前两个字节,也就是第一个和第二个二进制8位组,而主机ID则占用剩余的两个字节,也就是后面两个二进制8位组。
网络ID
B类IPv4地址的网络ID的最高两位固定分别为10
,后面14位可变。由此可知B类网络的总数16384($2^{14}$
)个。网络ID没有类似A类的特殊地址。
主机ID
B类IPv4地址中主机ID为16位,所以可用的主机数,也就是每个B类网络拥有的IPv4地址数为65536($2^{16}$
)个,但实际上可以使用的地址数为65534($2^{16}-2$
)个。与A类类似,B类中也有特殊地址:
- 主机ID全为0的地址是网络地址,不能分配给主机使用;
- 主机ID全为1的地址为广播地址,不能分配给主机使用;
2.1.1.3 C类
C类IPv4地址结构如下图所示,其网络ID占用最高的前三个字节,也就是第一个、第二个和第三个二进制8位组,而主机ID只占用最后的一个字节,也就是只有最后一个二进制8位组。
网络ID
C类IPv4地址的网络ID的最高三位固定分别为110
,后面的21位可变。由此得知C类网络总数2097152(2^{22}
)个。网络ID没有类似A类的特殊地址。
主机ID
C类地址中主机ID仅为8位,所以可用的主机ID数,也就是每个C类网络拥有的IPv4地址数为256(2^8
)个,实际上可用的地址数为254(2^8-2
)。与A类类似,C类中也有特殊地址:
- 主机ID全为0的地址是网络地址,不能分配给主机使用;
- 主机ID全为1的地址为广播地址,不能分配给主机使用;
2.1.1.4 常用IP地址总结
以上3类为常用的IP地址,根据上面3节的讲解,进行个总结。
- IP地址的指派范围:
网络类别 | 最大可指派的网络数 | 第一个可指派的网络号 | 最后一个可指派的网络号 | 每个网络中的最大主机数 |
---|---|---|---|---|
A | 126($2^7-2$ ) | 1 | 126 | 16777214 |
B | 16383($2^{14}-1$ ) | 128.1 | 191.255 | 65534 |
C | 2097151($2^{21}-1$ ) | 192.0.1 | 223.255.255 | 254 |
- 特殊IP地址
网络号 | 主机号 | 源地址使用 | 目的地址使用 | 代表的意思 |
---|---|---|---|---|
0 | 0 | 可以 | 不可 | 在本网络上的本主机(见DHCP协议) |
0 | host-id | 可以 | 不可 | 在本网络上的某台主机host-id |
全1 | 全1 | 不可 | 可以 | 只在本网络上进行广播(各路由器均不转发) |
net-id | 全1 | 不可 | 可以 | 对net-id上的所有主机进行广播 |
127 | 非全0或非全1的任何数 | 可以 | 可以 | 用于本地软件环回测试 |
2.1.1.5 D类
D类IPv4地址是组播地址,用于IPv4组播通信中。通过组播IPv4地址,组播时源主机(组播源)只需发送一份数据,就可以使对应组播组(组播组使用D IPv4地址标识)中的一个主机或者多个主机收到这份数据的副本的通信方式,但只有组播组内的主机可以接收到该数据。
IP组播技术有效地解决了单点发送多点接受的问题,实现了IP网络中点到多点的高效数据传输,能够大量节约网络带宽、降低网络负载。还可以利用网络的组播特性方便地提供一些新的增值服务,包括在线直播、网络电视、远程教育、远程医疗、网络电台、实时视频会议等互联网的信息服务领域。
D类IPv4地址结构如下图所示,规定在最高字节中前四位分别固定为1110
,组播地址范围为224.0.0.0 ~ 239.255.255.255
。
(1)预留组播地址
预留组播地址(又称永久组播地址)就是由IANA保留不分配给特定用户使用,仅为公用的组播路由协议分配使用的组播地址,地址范围为224.0.0.0~224.0.0.255
。使用这些预留组播地址的组播协议包括IGMP(Internet 组管理协议)、CGMP(Cisco 组管理协议)、IGMP Snooping(IGMP 侦听)和 PIM(协议无关组播)等。使用这段组播地址的 IP 包不被路由器转发。
在这个地址组段中:
224.0.0.0
不分配;224.0.0.1
分配给本地组播网络所有支持组播的主机;224.0.0.2
分配给本地组播网络中的所有组播路由器;224.0.0.4
分配给本地组播网络中的所有SVMRP路由器;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路由器;
(2)公用组播地址
公用组播地址就是在全球范围内可以直接在互联网上使用的组播地址,和公网单播IPv4地址一样。公用组播地址范围为224.0.1.0~224.0.1.255
,也是有IANA为提出申请并付费的用户分配。
(3)临时组播地址
临时组播地址就是由企业用户在本企业局域网内部使用的组播地址,地址范围为224.0.2.0~238.255.255.255
,仅在本地局域网有效,私网IPv4地址一样。
(4)本地管理组播地址
本地管理组播地址也是保留使用的,专用于局域网内部测试,地址范围为239.0.0.0~238.255.255.255
,仅在特定的本地网络范围有效。
当网络层收到组播报文时,根据组播目的查找组播转发表,对报文进行转发。
- 在私网中,组播时不需要再工作站配置的,只需要在网络中的路由器或者支持组播协议的三层交换机上进行配置。私网工作站被分配的组播地址都是
224.0.0.1
,就像环路地址127.0.0.1
一样,无需另外配置。只要在路由器中启用了组播协议后就可以对加入到组播组中。 - 公网中,工作站组播地址选择
224.0.1.0~238.255.255.255
范围中的一个就可以了。
另外,要注意的是,在进行组播通信时,在数据链路层目的MAC地址封装的也是组播MAC地址。IANA把0.:00:5E
开头的以太网MAC块作为组播地址对应的二层组播MAC地址。组播MAC地址的范围是01:00:5E:00:00:00~01:00:5E:7F:FF:FF
(前24位为MAC头,固定不变,第25位为0),并要求将IPv4组播地址的后28位(因为最高的4位是固定不变的)映射到48位的MAC地址空间中。
具体的映射方法是将组播IPv4地址中的低23位放入MAC地址的低23位,如下图所示。至于为什么要映射后面的23位,原因在于根据IANA给出组播MAC地址段是前3字节(也就是24位)来标识单位或者厂商,只有后面的24位来和IP地址映射;而给定的地址空间后3字节的最高位相同,都为0,那么给定的MAC地址段内只有23位了,所以最终只能丢弃28位IPv4地址中的5位,剩下的23位和MAC的23位相映射。注意,这个映射无须手动进行,在路由器启动组播协议,站点加入到组播后就会自动生成。
2.1.1.6 E类
E类地址输入IANA保留地址,不分配给用户使用,地址段范围为240.0.0.0~247.255.255.255
,其特征是最高5位分别是11110
,如下图所示,也就是有27位是可变的。
2.1.2 子网
由前面讲解,可以两级IP地址有不少的缺点,诸如:
- IP地址空间的利用率有时很低。
如果一个单位申请到的是B类IP,则可连接主机要达到6万,这就很可能并非所有的IP均利用完成。 - 使路由表变得很大。
路由器连接的网络数越多,路由表越大,当路由表急剧增加时,网络性能会下降。 - 两级IP地址不够灵活。
有些单位申请到A类IP后,需要根据部门划分不同的网络,但是A类IP的网络数又比较有限。
基于上述的缺陷,1985年开始在IP地址中又增加了“子网号字段”,使用两级IP地址变成了三级IP地址。即划分子网。划分子网的基本思路如下:
- 一个拥有许多物理网络的单位,可将所属的物理网络划分为若干个子网。划分子网纯属于一个单位内部的事情。本单位以外的网络看不见这个网路是由多少个子网组成,因为这个单位对外任然表现为一个网络。
- 划分子网的方法是从网络的主机号借用若干位作为子网号(subnet-id),当然主机号就响应减少了同样的位数。于是两级IP在本单位内部就变成三级IP地址,其表示为
<网络号>,<子网号>,<主机号>
。 - 凡是从其他网络发送给本单位某台主机的IP数据报,任然是根据IP数据报的目的网络号找到链接到在本单位网络上的路由器。但此路由器在接收到IP数据报后,再按目的网络号和子网号找到目的子网,把数据报交付目的主机。
2.1.2.1 子网掩码
从IP数据报的首部中无法看出源主机或目的主机所链接的网络是否进行了子网的划分。因为32位的IP地址本身和数据报的首部都没有包含任何有关子网划分的信息。这就需要子网掩码(subnet mask)。
子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。子网掩码由连续的1和0组成,连续的1表示网络地址,连续的0表示主机地址,通过0的个数可以计算出子网的容量(子网中主机的IP地址范围)。
下图是一个B类IP的子网掩码示例:
通过IP地址与子网掩码逐位相与(AND)运算后,可得出子网的网络地址。
例如上图中,目的IP地址145.13.3.10
相位与(二进制与操作)255.255.255.0
可以得出子网为145.13.3.0
。
子网掩码的好处就是:不管网络有没有划分子网,只要把子网掩码和IP地址进行逐位的与运算,就立即得出网络地址。
2.1.2.2 默认子网掩码
互联网规定,所有的网络都必须使用子网掩码,同时在路由器的路由表中也必须有子网掩码一栏。如果一个网络不划分子网,那么改网络的子网掩码就是使用默认子网掩码。
- A类IPv4地址的子网掩码固定为
255.0.0.0
,因为子掩码就是网络ID部分全为1,主机ID部分全为0,而A类地址中网络ID部分就是最高的那个字节。 - B类IPv4地址的子网掩码为固定的
255.255.0.0
,因为B类地址中网络ID部分是最高的两字节,每个字节均为8个连续的1,转换成十进制后每个字节就是255了。 - C类单播地址的子网掩码为固定的
255.255.255.0
,因为C类地址中网络ID部分是最高的前3个字节,每个字节均为8个连续的1,转换成十进制后每个字节就是255了。
2.1.2.3 使用子网时分组的转发
在划分子网的情况下,分组转发的算法必须做出相应的改动。其中路由表必须包含:目的网络地址,子网掩码和下一跳地址。
其路由器转发分组的算法如:
- 从收到的数据报的首部提取目的IP地址D。
- 先判断是否直接支付。对路由器直接相连的网络逐个进行检查:用各网络的子网掩码和D逐位相与(AND操作),看结果是否和相应的网络地址匹配。若匹配,则把分组进行直接支付(需要把D转换成物理地址,把数据报封装成帧发送出去),转发任务结束。否则就是间接支付,执行3。
- 若路由表中有目的地址为D的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行4。
- 对路由表中的每一行(目的网络地址、子网掩码、下一跳地址),用其中的子网掩码和D逐位相与(AND操作),其结果为N。若N与该行的目的网络地址匹配,则把数据报传送给该行指明的下一跳路由器;否则,执行5。
- 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行6。
- 报告转发分组出错。
2.1.2.4 IPV4地址的应用规划
- 定长的子网掩码FLSM(使用同一个子网掩码来划分子网)
- 变长的子网掩码VLSM(使用不同的子网掩码来划分子网)
2.1.3 无分类编址CIDR(构造超网)
划分子网虽然在一定程度上提高了IP地址空间的利用,但是在2011年,整个IPv4的地址空间最终被消耗殆尽。为了解决这个问题,提出了无分类编址的方法。
划分子网在一个局域网中它的子网号的长度是固定的,即所有的子网的掩码都是相同的,之后提出可变长子网掩码(VLSM)进一步提高IP地址资源利用率,无分类编址就是在变长子网掩码的基础上研究出的方法。
无分类编址又称无分类域间路由选择CIDR(读音“sider”),CIDR将32位IP地址划分为前后两个部分,前面的部分称为网络前缀或简称为前缀,用来指明网络,后面的部分则用来指明主机。
IP地址:{<前缀部分>,<主机号>}
下图表示三种编址方式的图示:
2.1.3.1 CIDR主要特点
- CIDR消除了传统的A类、B类和C类地址以及划分子网的概念。
CIDR不再规定使用固定的多少位来指定网络号和主机号,更加有效率的分配了IPv4的地址空间。 - CIDR还使用“斜线记法”,或称为CIDR记法,即在IP地址后面加上
/
,然后写上网络前缀所占的位数。例如:205.123.196.183/25
中的25表示地址中25位用于网络ID,相应的掩码为255.255.255.128
。 - CIDR把网络前缀相同的连续的IP地址组成一个CIDR地址块。只需要知道CDIR地址块中的任意一个地址,就可以知道这个CIDR地址块的起始地址(最小地址)和最大地址,以及CIDR地址块中的地址数。例如:已经IP地址
128.14.35.7/20
是某CIDR地址块中的一个地址,则最大最小地址为:
128.14.35.7/20 = 1000000 00001110 00100011 00000111
最小地址 128.14.32.0 1000000 00001110 00100000 00000000
最大地址 128.14.47.255 1000000 00001110 00101111 11111111
- 为了方便路由选择,CIDR使用32位地址掩码。地址掩码由一串1和一串0组成,而1的个数就是网络前缀的长度。斜线记法中,斜线后的数字就是地址掩码中1的个数。所以CIDR融合了子网地址和子网掩码,方便子网的划分。
虽然CIDR不使用子网,但是还有一些网络还使用子网划分和子网掩码,因此CIDR使用的地址掩码也可以继续称为子网掩码。
2.1.3.2 构成超网
将多个子网聚合成一个较大子网,叫做构成超网,或路由聚合。方法:将网络前缀缩短。
例如网络1:203.1.0.0/17
和网络2:206.1.128.0/17
,可以将这两个子网聚合成一个更大的子网206.1.0.0/16
。
路由聚合最大的优点就是大大提高路由效率
如下图所示,如果要发送数据报给网络1和网络2,通过路由器R1,需要查看路由器转发表,判断网络前缀,但是无论是网络1还是网络2,其下一跳(即写一个要转发的路由器)都是R2。
如果一个路由器连接网络特别多时(如主干路由器),这就会使得路由转发表表项特别多,可以通过路由聚合,可以将多个子网聚合成一个大的子网,当有数据报要发送时,如果目的地址IP前缀满足聚合的子网前缀,就直接转发到下一个路由器的接口即可,这样可以大大减少路由器转发表的大小。如下图所示,当有数据报发送到R1时,不管它具体发送到哪个网络,只要前置满足超网的前缀,直接就转发到R2即可。
可以将图中的子网络看成一个个体,这些个体都在同一个区域(如一个大学,或一个公司),R2看做一个快递站,R1快递员不用将快递一个个送到个体手中,只要将快递送到这个区域的收发室就可以了,至于收发室怎么将这些快递送到个体手中就不归它管了,这就大大提高了快递员的效率。
2.1.3.3 最长前缀匹配
考虑上图这种情况,如果网络3同样满足上面的超网前缀,但是它不再R2所连接的网络内,如果此时一个数据报的地址为206.1.1.1/17,可以知道这个数据报是要发送给网络3的某台主机,如果仅仅使用图中的路由表会导致数据报送错了地方,所以,需要为路由转发表中添加网络3的网络地址。
添加了网络3的IP地址后,在路由转发表中这两个表项都满足目的地址的前缀,这时路由器该如何选择呢?路由器会从匹配结果中选择具有最长的网络前缀的路由——最长前缀匹配。这是因为前缀越长,地址块越小,路由越具体。如上图中,206.1.1.0./17
网络前缀有17位,并且都能够匹配17位,另一个网络前缀只有16位,只能匹配前16位,所以会选择下一跳地址为R3。
2.1.4 NAT
IPv4使用32位(4 字节)地址,因此整个地址空间有4294967296($2^{32}$
)个地址,也就是近43亿个地址。不过,有一些地址是特殊用途而保留的,如局域网专用地址(约1800万个地址)和组播地址(约2700万个地址),具体如下:
- 私有IP地址段:
- A类:10.0.0.0到10.255.255.255 1658万个
- B类:172.16.0.0到172.31.255.255 104万个
- C类:192.168.0.0到192.168.255.255 6.5万个
- 公网IP地址段:
- A类:
- 1.0.0.0----9.255.255.255 1.5亿个
- 11.0.0.0-----126.255.255.255 19.23亿个
- B类:
- 128.0.0.0-----172.15.255.255 7.3亿个
- 172.32.0.0-----191.255.255.255 3.3亿个
- C类:
- 192.0.0.0-------192.167.255.255 0.11亿个
- 192.169.0.0-----223.255.255.255 5.03亿个
- A类:
由此看出全球所有的手机,电脑等并不能完全分配到一个公网IP,为了解决IPv4公网IP数量限制的问题,从而诞生了NAT技术。即全国多数多少办公电脑和个人手机的IP地址都是私网IP,都集中在192.168.1.0网段的254个IP地址上。然后这些私网在通过NAT技术链接到公网上。
就好比我们在公司的局域网上网时,个人电脑和手机的IP均是私网地址,然后通过公司的路由器接入电信网络(其实也是一个大的私网),最后在由电信网络接入互联网。所以无论是个人电脑的IP和公司路由器的IP均非公网IP,而是私网IP。当然也可以去电信公司申请单独的公网IP,但是由于公网IP的逐渐减少,申请公网IP是需要单独费用的。
2.2 IP协议格式
8 下图是完整的IP数据表格式:
-
另附英文格式:
-
实际抓取的IPv4协议包:
2.2.1 Version(版本)
该字段长度为4比特位。标识IP报头的版本和格式。
0100
表示IP版本4;0110
表示IP版本6;- 其他所有版本号仅作为“历史产物”;
2.2.2 IHL(首部长度)
即Internet报头长度,该字段长度为4比特位。它标识报头的总长度,以32比特位为一个单位(即4个字节)。
IP协议报头的最小长度为20个字节,最大可以扩展到60个字节。当报头长度最小为20字节,则IHL最小为5 (0101
), 最大为60字节,则IHL为15 (1111
)。
由此特殊,IP协议报头长度必须为4字节的整数倍,如果首部长度非4字节的整数倍时,必须利用最后的填充字段加以填充。
2.2.3 TOS(区分服务)
即Type of Service(服务类型),该字段长度为8比特位。
2.2.3.1 RCF2474
这里参考的是RCF2474的定义,现在的IP协议也级别都是这种。具体可以参见:http://www.ietf.org/rfc/rfc2474.txt
该字段被分为俩个部分,前6位被称为区分服务字段—DS字段;后2位是显示拥塞通知字段—ECN字段,用于QS。
IP precedence和DSCP代码对照表
具体DSCP对应关系表参考:TOS/DSCP对照表
2.2.3.2 RCF1349
这里参考的是老的定义,不晓得现在还有在用没有
如图所示,ToS字段是1B,根据RFC1122的定义,IP优先级(IP Precedence)使用最高3比特,可以定义8个服务等级。第3到第5比特由RFC791定义,称为DTR(Delay,Throughput,Reliability)位,后来RFC1349又扩展到第6位。最后1比特必须为0(Must Be Zero)。
详细资料请参考:IPv4 ToS字段
2.2.4 Total Length(总长度)
该字段长度为16比特位。它标识数据报和数据包的总长度,单位为字节。所以ipv4的数据最大为65535($2^{16}-1$
)字节。
2.2.5 Identification(标识符)
该字段长度为16比特位,通常与标记字段和分段偏移字段一起用于数据包的分段。它标识分段所属的组,所属为同一组则标识符相同。在网络层中也可把流量区分开来,用于流量分片。
如果数据包原始长度超过数据包所要经过的数据链路的最大传输单元(MTU),那么必须将数据包分段为更小的数据包。例如,一个大小为 5000 字节的数据包在穿过网络时,如果遇到一条MTU为1500字节的数据链路,即数据帧最多容纳大小为1500字节的数据 包。路由器需要在数据成帧之前将数据包分段成多个数据包,其中每个数据包长度不得超过1500 字节;然后路由器在每片数据包的标识字段上打上相同的标记,以便接收设备可以识别出属于一个数据包的分段。
2.2.6 Flags(标记位)
该字段长度为3比特位。它分为三分部分:
- 保留位(reserved bit)为0。
- 分片位(Don`t fragent)当为1时表示不能分片,为0则表示可以分片。置1之后路由器不能对其分段处理,如果超过MTU值则路由器不能对其转发将其丢弃,并向源点发送错误消息。
- 更多位(more fragments)为1时表示后面还有分片的数据报。为0时表示已经是若干数据报片中的最后一个。
2.2.7 Fragment Offset(分段偏移)
字段长度为13位,以8个字节为偏移单位,也就是每个分片的长度一定是8字节(64位)的整数倍。分段偏移指出较长的分组在分片后,某片在原组中的相对位置。
由于分段到达时可能错序,所以分段偏移字段可以使接收者按照正确的顺序重组数据包。请注意,如果一个分段在传输中丢失,那么必须在网络中同一点对整个数据包重新分段并重新发送。因此,容易发生故障的数据链路会造成时延不成比例。 另外,如果由于网络拥塞而造成分段丢失, 那么重传整组分段会进一步加重网络拥塞。
2.2.8 Time to Live(存活时间)
英文缩写TTL,该字段长度为8比特位。在网络中标识数据包最大存活时间,用来防止路由环路,每经过一台路由器则TTL字段减去1,直到为0,此数据包直接被丢弃。其值最大为255,单位为s。然而现在路由器转发数据包都是用跳数来作为衡量单位。(用于防环,trace追踪工具)
2.2.9 Protocol(协议)
该字段长度为8比特位。它给出了主机到主机层或传输层协议的“地址”或协议号,协议字指定了数据包中信息的类型。当前已分配了 100 多个不同的协议号。
常用的一些协议和相应的协议字段值如下:
协议名 | 协议字段值 |
---|---|
1 | ICMP |
2 | IGMP |
4 | IP (这里的IP表示特殊的IP数据报,IP数据报再封装到IP数据报中) |
6 | TCP |
8 | EGP |
9 | IGP |
17 | UDP |
41 | IPv6 |
50 | ESP |
89 | OSPF |
具体类型分类参见:IP协议(Protocol)字段释义
2.2.10 Header Checksum(报头校验和)
也叫首部校验和,该字段长度为16比特位。这个1字段只对首部查错,不包括数据部分。
在每一跳,路由器都要重新计算出的首部检验和并与此字段进行比对,如果不一致,此报文将会被丢弃。重新计算的必要性是因为每一跳的一些首部字段(如TTL、Flag、Offset等)都有可能发生变化,不检查数据部分是为了减少工作量。数据区的错误留待上层协议处理——(UDP)和(TCP)都有检验和字段。此处的检验计算方法不使用CRC。
IP首部校验和的计算方法
- 把校验和字段清零。
- 然后对每16位(2字节)进行二进制反码求和, 反码求和的意思是先对每16位求和,再将得到的和转为反码。
2.2.11 Source address(源地址)
该字段长度为32比特位。它标识发送者的ip地址。
2.2.12 Destination address(目的地址)
该字段长度为32比特位。它标识接受者的ip地址。
2.2.13 options(ip选项)
该字段长度可变。该字段提供某些控制功能,但在大部分情况下不需要这些功能。里面包括机制有松散路由,严格路由,路由记录及时间戳。
-
松散源路由选择( Loose Source Routing)—— 它给出了一连串路由器接口的IP地址序列。数据包必须沿着IP地址序列传送, 但是允许在相继的两个地址之间跳过多台 路由器。
-
严格源路由选择( Strict Source Routing)—— 它也给出了一系列路由器接口的IP地址序列。不同于松散源路由选择,数据包必要严格按照路由转发。如果下一跳不再列表中,那么将会发生错误。
-
记录路由( Record Route)—— 当数据包离开时为每台路由器提供空间记录数据包的出站接口地址,以便保存数据包经过的所有路由器的记录。记录路由选项提供了类似于路由追踪的功能,但是不同点在于这里记录了双向路径 上的出站接口信息。
-
时间戳( Timestamp)——每台路由器除了会记录一个时间戳之外,时间戳选项十分类似于记录路由选项,这样数据包不仅可以知道自己到过哪里,而且还可以记录到达的时间。
2.2.14 padding(填充)
通过options字段后面补充0来补齐32位比特位,padding的和位0或者是32的倍数。
2.3 IPv4数据报的封装与解封转
发送端网络层生成的IP数据报还要继续向下传输,到达数据链路层就要封装成数据帧了。IP数据报的“帧封装”只需把来自网络层的整个IP数据报(报头和数据部分)当做数据链路层帧的数据部分,然后在前面加上与数据链路层对应的协议头即可。
在以太局域网中,由于数据链路层分成了LLC子层和MAC子层这两层,所以来自网络层的IP数据报在到达数据链路层后先要经过LLC子层和MAC子层的协议头封装,最终形成数据链路层的以太网MAC帧。
2.4 IP层转发分组的流程
在IP层转发分组的流程如下图:
在路由表中,对每一条路由最主要的是目的网络地址和下一跳地址,路由器通过查询路由表将报文发送到正确位置。
2.4.1 分组转发算法
- 从数据报的首部提取目的主机的IP地址D,得出目的网络地址N。
- 若N就是与此路由器直接相连的某个网络地址,则进行直接交付,不需要再经过其他的路由器,直接把数据报交付目的主机(这里包括通过ARP协议将目的地址D转换为具体的AMC地址,然后封装为帧);否则间接交付,执行步骤3。
- 若路由表中有目的地址为D的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则执行步骤4。
- 若路由表中有到达网络N的路由,则把数据报传送给路由表中所指明的下一跳路由器;否则执行步骤5。
- 若路由表中有一个默认路由,则把数据报传输给路由表中所指明的默认路由器;否则执行步骤6。
- 报告转发分组错误。