网络层在五层协议中位于数据链路层和运输层的中间,主要功能为实现两个端系统之间透明的数据传输,即将分组从一个主机移动到另外一个主机。
由于TCP/IP协议栈的网络层使用网际协议IP,它是整个协议栈的核心协议,因此在TCP/IP协议栈中网络层常称为网际层。
互联网上的每台主机(或路由器)的每个接口分配一个在全世界唯一的 IP 地址。
现如今有两个版本的IP地址——IPv4和IPvV6,先讨论如今还在广泛你使用的IPv4地址。
所谓分类编址就是将IP地址划分为若干个固定类,每一类地址都由两个固定长度字段组成
今天看来,分类的IP地址不太合理
为了解决上面的问题,从1985年起在IP地址中又增加了一个"子网号字段",使两级IP地址变成为三级IP地址,这种做法叫做划分子网(subnetting),或子网寻址或子网路由选择。
32比特的子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号,其中子网掩码使用连续的比特1来对应网络号和子网号,使用连续的比特0来对应主机号。将划分子网的IPv4地址与其相应的子网掩码进行逻辑与运算就可得到IPv4地址所在子网的网络地址。
划分子网在一定程度上缓解了因特网在发展中的遇到的困难,但是数量巨大的C类网络因为其地址空间太小并没有得到充分使用,而因特网的IP地址仍在加速消耗,整个IPv4地址空间面临全部耗尽的威胁。为此,因特网工程任务组IETF又提出了采用无分类编址的方法来解决IP地址紧张的问题,同时还专门成立IPv6工作组负责研究新版本IP以彻底解决IP地址耗尽问题。
1993年,IETF发布了无分类域间路由选择CIDR(Class Inter-Domain Routing)的RFC文档,其中CIDR消除了传统的A类,B类和C类网络以及划分子网的概念。
CIDR使用"斜线记法",即在IPv4地址后面加上斜线"/“,在斜线后面写上网络前缀所占的比特数量。
CIDR实际上是将网络前缀都相同的连续的IP地址组成一个"CIDR地址块”,我们只要知道CIDR地址快中的任何一个地址,就可以知道该地址块的全部细节。如下例
路由聚合又称为构造超网,举例说明:
如图所示,路由器R1和五个网络以及路由器R2直接相连,路由器R1和R2互为相邻路由器,它们周期性地通告自己所知道的路由信息给对方。
如果R1将自己直连的这五个网络的路有记录都通告给,则R2的路由表会增加五条路由记录。而我们可有通过查找共同前缀的方式将五条路由记录聚合成1条,也就是找出5个目的网络地址的共同前缀。这五个目的网络地址的左起前两个字节都是相同的,从第三个字节开始不同,因此只需将第三个字节转换为二进制形式,这样就可以很容易找出5个目的网络地址的共同前缀,共22个比特。
网络前缀越长,地址块越小,路由越充分;若路由器查表转发分组时发现有多个路由可选,则选择网络前缀最长的那条,这称为最长前缀匹配,因为这样的路由更具体。
从层次的角度来看,物理地址是数据链路层和物理层使用的地址,而IP地址是网络层和以上各层使用的地址,是一种逻辑地址(称IP地址为逻辑地址是因为IP地址是用软件实现的)。
在发送数据时,数据从高层下到底层,然后才到通信链路上传输。使用IP地址的IP数据报一旦交给数据链路层,就被封装成MAC帧了。MAC帧在传送时使用的源地址和目的地址都是硬件地址,这两个硬件地址都写在MAC帧的首部中。
连接在通信链路上的设备(主机或路由器)在收到MAC帧时,根据MAC帧首部中的硬件地址决定收下或丢弃。只有在剥去MAC帧中的首部和尾部后把MAC层的数据上交给网络层后,网络层才能在IP数据报的首部中找到源IP地址和目的IP地址。
尽管互连在一起的网络的 MAC 地址体系各不相同,但 IP 层抽象的互联网却屏蔽了下层这些很复杂的细节。只要我们在网络层上讨论问题,就能够使用统一的、抽象的 IP 地址研究主机和主机或路由器之间的通信。
在实际应用中,我们经常会遇到这样的问题:已经知道了一个机器(主机或路由器)的IP地址,需要找出相对应的硬件地址,而地址解析协议ARP就是来解决整个问题的。
我们知道网络层使用的是IP地址,但在实际网络的链路上传送数据帧时,最终还是必须使用该网络的硬件地址。但IP地址和下面的网络的硬件地址之间由于格式不同而不存在简单的映射关系,此外,在一个网络上可能会有新的主机加入进来,更新网络适配器也会使主机的硬件地址改变。ARP解决的方法使在主机ARP高速缓存中存放一个从IP地址到硬件地址的映射表,并且这个映射表还经常动态更新。同时ARP是解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题。
当主机A要向本局域网上的某台主机B发送IP数据报时,就现在其ARP高速缓存中查看有无主机B的IP地址。如果有,就在ARP高速缓存中查出其对应的硬件地址,再把这个硬件地址写入MAC帧,然后通过局域网把该MAC帧发往此硬件地址。
也有可能高速缓存中并没有主机B的信息,在这种情况下,主机A就自动运行ARP,然后按照下面的步骤找出主机B的硬件地址。
当主机A向B发送数据报时,很可能以后不久主机B还要向A发送数据报,因而主机B也可能向A发送ARP请求分组。为了减少网络上的通信量,主机A在发送其ARP请求分组时,就把自己的IP地址到硬件地址的映射写入ARP请求分组。当主机B收到A的ARP请求分组时,就把主机A的这一地址映射写入主机B自己的ARP高速缓存中。以后主机B向A发送数据报就很方便。
为了将重点放在TCP/IP协议栈的网际层发送和转发IP数据报的过程中,在下面的举例中,我们忽略使用ARP协议来获取目的主机或路由器接口的MAC地址的过程以及以太网交换机自学习和转发帧的过程。
再上图所示的小型互联网中,路由器的接口0直连了一个交换式以太网,接口1也直连了一个交换式以太网,分别给网络和路由器分配网络地址和子网掩码。
对于同一个网络中的主机可以直接通信,这叫做直接交付;不同网络中的主机之间的通信,需要通过路由器来中转,这叫做间接交付。
假如主机C要给主机F发送IP数据报,主机C将自己的IP地址和子网掩码相与,就可以得到主机C所在网络的网络地址,既然主机C要给主机C发送IP数据报,那主机C肯定知道主机F的IP地址,主机C将主机F的IP地址与自己的子网掩码相与,就可以得到目的网络地址,该网络地址与主机C的网络地址不相同,因此主机C就知道了主机F与自己不在同一个网络,它们之间的通信属于间接交付。主机C需要将IP数据报传输给路由器,由路由器将IP数据报转发给主机F,
实际上,用户为了让本网络中的主机能和其他网络中的主机进行通信,就必须给指定本网络中的一个路由器,由该路由器进行转发,所指定的路由器也被称为默认网关。在上面这个例子中,我们可以将该路由器接口0的IP地址指定给该接口所直连网络中的各个主机作为默认网关。这样当本网络中的主机要和其他网络中的主机进行通信时,会将IP数据报传输给默认网关,由默认网关帮主机将IP数据报转发出去。
路由器收到IP数据报后
路由器取出IP数据报首部各地址字段的值,源地址字段的值为主机A的IP地址,目的字段为主机B的IP地址,接下来,路由器就要对该IP数据报进行查表转发。
当我们给路由器的接口配置IP地址和子网掩码时,路由器就知道了自己的该接口与哪个网络是直连的。如上图路由表,同时路由器中还可以有其他的路由条目,这可以是用户或网络管理员手动配置的静态路由,也可以是路由器使用路由协议自动获取到的动态路由。接下来,路由器根据IP数据报的目的地址在自己的路由表中查找匹配的路由条目,逐条检查路由条目,将目的地址与路由条目中的地址掩码相与得到目的网络地址。找到匹配的后按照它的下一跳指示,也就是从接口1转发该IP数据报,这样主机D就可以收到主机A转发过来的IP数据报。
如上图所示,一个IP数据报由首部和数据两部分构成。首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。下面介绍首部各字段的意义。
现在使用的IP(即IPv4)是在20世纪70年代末期设计的。互联网经过几十年的飞速发展,到2011年2月,IPv4的地址已经耗尽。各地区互联网地址分配机构也相继宣布地址耗尽,我国在 2014 – 2015 年也逐步停止了向新用户和应用分配 IPv4 地址。解决IP地址耗尽的根本措施就是采用具有更大地址空间的新版本的 IP,即 IPv6。
IPv6所引进的主要变化如下:
IPv6数据报由两大部分组成:基本首部 (base header)和有效载荷 (payload)。有效载荷也称为净负荷。有效载荷允许有零个或多个扩展首部 (extension header),再后面是数据部分。
一般来讲,一个IPv6数据报的目的地址可以是以下三种基本类型:
在 IPv6 中,每个地址占 128 位,地址空间大于 3.4 x1038 。使用冒号十六进制记法(colon hexadecimal notation, 简写为 colon hex):16 位的值用十六进制值表示,各值之间用冒号分隔。
零压缩 (zero compression):一串连续的零可以用一对冒号取代。如上图。注意:在任一地址中,只能使用一次零压缩。
路由选择协议属于网络层控制层面的内容,不仅控制沿着从源主机到目的主机的端到端路径间的路由器如何转发数据报,而且控制网络层组件和服务如何配置和管理。细节比较多,感兴趣的可以在本篇文章的参考部分查阅资料。
[1]James F. Kurose / Keith W. Ross.计算机网络(原书第7版) 自顶向下方法.机械工业出版社,2018.
[2] 谢希仁. 计算机网络(第7版).电子工业出版社,2017.
[2] https://space.bilibili.com/360996402