主机、路由器网络层主要功能包括:
网络层核心功能之一:就是路由和转发,因此Internet网络层一个需要实现的重要的功能就是设计路由协议,进行路径选择。比如路由协议:RIP、OSPF、BGP等。
**转发表存储了具体的路由信息,表示目的IP地址与对应输出链路端口的映射关系。**也就涉及到IP协议的相关内容:寻址规约、分组格式等。
在Internet网络传输过程中,IP数据分组难免会出现一些差错,此时,网络层需要将这些差错信息传输给相应的路由器或主机,这个时候就需要另一个非常重要的协议:ICPM协议(互联网控制报文协议)。它的作用是提供差错报告,以及路由器信令相关功能。 ICPM协议在一定程度上相当于IP协议的伴生协议,也就是说,实现IP协议,也就要实现ICPM协议,才能实现IP协议中的一些差错报告等功能。
IP数据报格式主要包括两部分:首部,数据段。
固定部分表示在所有的IP数据报中都是固定大小的。
按照网络层结构,IP分组在具体的网络中传输时,会向下封装到数据链路层的数据帧中。不同的数据链路在封装时,对数据帧大小是有限制的。因此,用MTU来表示链路层数据帧可封装数据的上限。
网络链路的最大传输单元(MTU)—链路层数据帧可封装数据的上限
显然,不同链路的MTU是不同的,那么如果传输路径上两个链路的MTU不同该如何处理呢?当一个IP数据报,在一个较大MTU的链路上传输时,是可以封装到数据帧里的,但是当经过路由器转发到下一个较小MTU的链路上时,有可能就装不到一个数据帧里面。这时就涉及到IP分片的问题。
大IP分组向较小MTU链路转发时,可以被”分片“(fragmented)。
并不是只要大的IP分组向较小MTU链路转发时,就一定会被分片。路由器是否可以对其进行分片,是根据分组里的某个标志位来看的。 如果此时,路由器发现该IP分组不允许被分片,会将该分组丢弃,同时一般也会发送ICMP报文给源主机。
如果该IP分组允许被分片,则1个IP分组会被分为多片IP分组。
这些IP分片到达目的主机后进行”重组“(reassembled)。也就是说,路由器只管分组,而数据分组到达的最终目的主机负责组装。
但是随着数据分组在传输过程中的不断拆分,各个分组可能会被沿着不同的链路进行传输,到达目的主机的顺序也无法保证,那么目的主机如何才能在接收到这些分组后,识别各个分组的顺序并重新组装呢。这就需要在各个分组中添加一些标识。
因此,在IP首部的相关字段用于标识分片以及确定分片的相对顺序。 如果其中的某一分片丢失了,目的主机会在等待一段时间后,如果还没有接收到,则会将整个分组都丢弃。
具体来说,IP首部的总长度、标识、标志位和片偏移字段参与标识分片。
标识字段: 占16位,标识一个IP分组。IP协议利用一个计数器,每产生IP分组计数器加1,作为该IP分组的标识。借助于源IP地址、目的IP地址、协议等字段一起,唯一标识一个IP分组。
标志位: 占3位。最高位的bit保留,没有定义,第二个bit标识DF,最低位的bit标识MF。
这个标志位即标识了路由器是否可以对一个分组进行分片。
片偏移量: 占13位,一个IP分组分片封装原IP分组数据的相对偏移量。根据片偏移量的相对大小,实际上就可以排序出每个片的顺序。最后一片是MF=0,而且如果MF=0,且是被分片的分组话,那么它的片偏移量肯定不是0。在IPv4的分组格式里,片偏移量的值是以8字节为单位的。
假设原IP分组总长度为L,待转发链路的MTU为M
若L > M,且DF = 0,则可以/需要分片。
分片后每个分片的标识复制原IP分组的标识。即原IP分组标识是什么,分片后的所有IP分组都取这个一样的标识。
通常分片时,除最后一片,其他分片均按照MTU允许的最大分片进行分片。
由于片偏移量是以8字节为单位,因此除了最后一个分片外,一个最大分片可封装的数据应该是8的倍数。因此,一个最大分片可封装的数据为:
MTU - 20字节的首部带下,表示数据帧携带的数据字节大小。除以8后向下取整,这个就是分片后,一个分片最大可装载的数据量。
此时,一个总长度为L的IP数据报,分片后的总分片数为:
L-20表示原IP数据报减去20字节首部长度,除以d(每个分片最大可封装数据大小) = 分片总数。
每片的片偏移字段取值为:
第一分片的片偏移量一定是0,其他的分片以此类推。
即除了最后一个分片外,都是最大的数据大小,加上20字节首部大小。最后一片即包含整个数据报剩下的那部分字节数。
即除了最后一个分片的MF=0外,其他分片的MF都等于1,表示非最后一个分片。
例子:
IP分组中,需要两个非常重要的字段,来表示一个IP分组从哪里来,到哪里去
网络接口:主机/路由器与物理链路的连接
在进行网络编址的过程中,事实上,需要重点编址的是实现网络层功能的这些接口。编址后的接口可以用来实现IP数据分组的寻址过程。
这些红色的表示网络层中的需要进行IP编址的网络层设备,包括路由器、主机的网络接口。
IP地址:32比特(IPv4)编号标识主机、路由器的接口,比如:11011111 00000001 00000001 00000001。而这些32位的二进制数比较难以记忆和使用。因此为了更方便的使用和记忆,一般会将上述32位拆分成4个8位,每个8bit转换成10进制,再用点号.拼接起来。
上述32位IP地址,采用4个十进制数来表示为:
这种对IP的书写方式,也成为点分十进制IP地址形式,也是目前使用比较广泛的IP地址书写方式。按照这种方式,可以对上述示例图中的每个接口分配一个IP地址,即在网络层中,可以利用这些唯一标识的IP地址,唯一标识这些网络接口。
在Internet网络中,IP地址更准确来说,是与每个网络接口相关联,即某某主机、路由器的IP地址。而一般说某个主机的IP地址,实际上是因为大部分主机往往只有一个网络接口,这个接口地址往往也被当做主机IP地址。
怎么样为接口分配IP地址?
如果我们随意的为接口分配独立的IP地址,再用路由转发表来记录的话,之前也讨论过这个问题,很容易造成路由器的存储、检索性能瓶颈。因此,就像改进后的路由表的目的地址表示一个范围来说,在为接口分配IP地址时,也应该是按照范围进行分配。
此时,把32位IP地址划分为两部分:
高比特位用来表示一个网络,此时,在进行地址分配时,需要遵循一个基本原则:
如上图所示,红色部分表示的就是该IP地址所属的网络号,不同子网下的网络号是不同的。
这样,具有相同网络号的IP地址的集合就构成了一个IP子网。对于这样一个集合的网络接口,我们可以利用它们相同的网络号来描述这个区域的网络。
IP子网的特点:
有了这样的编址方式,在路由转发表中,在存储向哪一个网络中转发数据时,就不需要记录某一个具体的IP地址了,只需要记录相应区域的IP子网地址就可以了。也就是,可以利用一个特殊地址,来描述一个个的IP子网的整体,这个地址就是IP子网地址。
上述我们介绍了IP子网的概念,具有相同网络号的一组IP地址集合构成了一个IP子网,这些IP地址在不跨越路由器就可以实现彼此的物理联通。
在IP子网的概念下,一个IP地址是由高比特位的网络号和低比特位的主机号共同构成的。那么,这里存在的问题就是这两部分应该各占总的IP长度的多少位比较合适?
显而易见,当网络号占用的比特更多时,能表示的IP子网就更多,但是每个IP子网中包含的主机数就更少。而当主机号更多时,每个子网包含的主机数更多,可以形成更大的网络,但是能够表示的子网个数就相对更少。
最初为了解决这个问题,就涉及到有类IP地址划分的概念。
有类编址
假设下面图中的圆圈包含了整个32位的IP地址空间,所谓的有类IP地址编制,实际上采取的是一个二分法。首先把最高比特位50%的地址空间分给称为A类地址空间,同时定义A类地址的网络号占用8bit,剩余24bit用来表示主机号。由于A类地址网络号的最高位固定为0,因此,网络号所能表示的范围就是0-2的7次方,即0-127,而24位主机号能表示的范围就在0.0.0~255.255.255。
这里网络号最高位固定位0也很好理解,因为32位IP地址所能表示的地址范围为0.0.0.0-255.255.255.255,为了使A类地址占总地址空间的一半,所以把最高8bit位拆成2半,即A类地址最高8bit表示0~127,所以最高位固定为0.
在剩下的50%地址空间中,继续进行二分,即继续在最高8bit所能表示的128~255之间进行二分,因此,B类地址所能表示的地址范围就在:128.0.0.0 ~ 191.255.255.255。同时,在B类地址中,定义前16位bit作为网络号,后16位作为主机号。
因为A类地址的高8bit最大是127,因此B类地址的最高位应该是1,同时为了满足二分的特性,次高位应该是0。
最后,剩余1/4的地址空间的最高2bit一定是11,再进行二分的话就是接着根据第三高位进行拆分,划分给C类地址。显然这部分地址的高8位表示的地址范围在:192~223之间。同时,定义C类地址的高24位为网络号,低8位为主机号。
对于剩余的1/8的地址空间,再进行最后一次的二分,拆分成两个占6.25%地址空间的D类地址和E类地址。高8bit表示的地址范围分别是:
这两类地址,不再区分网络号和主机号,一般这两类地址空间用作特殊目的。这类地址一般用来命名或标识互联网中的一组主机,这组主机理论上可以分布在互联网中的每个地方。在这种情况下,这类地址只能作为IP分组的目的地址,也就是只能往这类地址发送数据。这类地址也被成为多播地址,或是组播地址。
通过上面的饼状图也能看出,在IP网络中,A类地址+B类地址+C类地址占据了整个IP地址范围的87.5%,也都根据上述IP编制中提及的,划分了网络号和主机号,因此都可以用来标识互联网中的一个唯一网络接口的。
但也有一些特殊的IP地址,是不能够被分配给主机使用的,比如下述的一些特殊IP地址:
子网掩码形如IP地址,也是32位地址的形式,区别在于对网络号和子网号对应的bit位全部取1,对应主机号bit位全部写0。
例如:
此时,假设B类网络借用主机号的3bit来划分子网,将该子网的主机号的最高3bit都置为1,那么此时该子网的掩码为:255.255.224.0。
因此,子网地址+子网掩码 = 准确确定子网大小。
例如:
由于子网掩码是255.255.255.0,子网号对应的bit全部取1,也就是该子网的IP地址24位都表示网络号,我们就知道这个子网就是一个标准的C类网络。
假设我们想将这个子网,划分为等长的4个子网,就是针对该C类网络的8位主机号,进行均等的划分,256/4=64,因此划分后的每个子网的IP地址为:
现在我们知道了如何对子网进行划分,那么如上图所示,当路由器将这些不同的子网关联在一起后,路由器如何确定应该将IP分组转发到那个子网去呢?
这个时候,路由器的转发表除了要保存子网的地址外,还必须伴随着相关的子网掩码。
此时,路由器转发表的检索过程为:
例如:目的IP地址:172.32.1.112,子网掩码为:255.255.254.0
将目的IP地址与子网掩码按位做与操作后,得到的结果为:
因此,该目的IP地址对应的子网地址位:172.32.0.0(子网掩码:255.255.254.0)
这个子网对应的地址范围,也就是主机号所能表示的IP地址范围为:172.32.0.0~172.32.1.255。