一、前言
网络层是网络体系结构中非常重要的一层,在技术上又是非常复杂的一层。网络层是从功能上定义的一个逻辑层次,与物理层和数据链路层有具体的设备支持一样,网络层也有具体的设备来完成其相关任务,最典型的就是我们常用的路由器(Router)。路由器就相当于连接不同城市公路的中转车站,起数据中转作用。
网络层介于传输层和数据链路层之间,其主要作用是实现两个网络系统之间的数据透明传送,具体包括路由选择,拥塞控制和网际互连等。网络层是网络与网络之间通信的最底层,在数据从数据链路层向传输层进行数据传输的通信中,起到构建一个中间通信子网的作用。不同网络有这不同的网络层协议和地址规范,如果一个网络中的用户不能识别其他网络的通信协议和地址规范,那么这两个网络之间就不能进行数据通信,就好比不同国家有着不同的交通法规,属于不同的交警系统管理,不允许他国车辆随便出入一样。不同网络也有不同的设计规范,属于不同的组织来管理,必须通过授权,并由专门的协议来负责网络间的通信。如果只是同一局域网内的各个计算机之间的通信,单靠物理层和数据链路层就可以建立通信链路完成用户间的数据通信,但要扩大应用范围,连接不同的局域子网,就需要借助网络层处理各个网络子网的协议,从而进行计算机的网络互连,所以网络层在TCP/IP协议体系中叫网际互连层。
通常一个计算机网络就是一个管理边界,一般是属于一个特定的公司,有一个特定的管理者负责,所以在进行计算机网络互连时,要同时考虑两方面的问题:一是授权用户可以在不同网络间互访,共享双方的资源;另一方面又要保持各计算机网络管理原来的独立性。从前面介绍的数据链路层,我们知道不同用户之间进行通信,首先得知道彼此的地址,局域网内部的用户访问(物理层和数据链路层就可以构建一个局域网)是通过MAC地址进行,但不同网络之间进行访问不同通过属于数据链路层地址的MAC地址来进行寻址,这需要网络层对应的一个网络地址来进行访问,每个网络都通过其网络地址,即NSAP(网络服务访问点)来标识,网络中的每个节点都有一个NSAP。这个NSAP就是由对应网络所运行的网络层通信协议来定义的,在目前最常见的TCP/IP协议网络中,这个协议就是IP协议,对应的NSAP就是IP地址。
在物理层传输的是一个个比特位(bit),在数据链路层中传输的是一个个以许多字节为单位的帧(Frame),在每个帧的帧头都有源节点的MAC地址和目的节点的MAC地址,局域网内部的寻址就是通过MAC地址进行的,而在网络层中传输的是数据包(Packet,也叫分组),一个数据包是一个数据帧经过网络层协议重封装后得到的,每个数据包的包头(IP头)都有源节点和目的节点的IP地址,网路间的寻址就是通过IP地址进行的。这样我们知道网络通信只有两种情况:如果通信双方在同一个局域网内,可直接通过数据链路层进行相互通信,但因为主机其实也有网络层的路由功能,所以两台主机间进行网络通信时通常也是通过三层来进行的(IP协议则是IP地址寻址);如果通信双方在不同网络内,毫无疑问必须通过三层进行。事实上,网络层的IP包到达链路层后还要重封装成帧,因为不同网络中的统一标识就是三层地址(网络地址),局域网内链路层的则是MAC地址。所以不同层传输的数据包格式不一样,因为每层的标识不一样。网络层的IP包封装成帧后,其中封装的源和目的网络地址作为帧的数据部分,不会改变,这在前面的数据链路层中有介绍。
二、网络层的作用
在网络体系中,每一层都是服务于对应的上下层的,网络层也是,服务于上层的传输层和下层的数据链路层。其主要作用表现在一下几个方面:
1、屏蔽网络差异,提供透明传输
不同网络有不同的规范要求,网络层就是为了解决这种不同差异,寻找一个不同网络间都能共同遵守的网络通信规范,以便不同网络间能相互识别,并接受对方的网络请求,说白了,就是一个中转站的作用,两个毫无交集的网络通过这个中转站来建立交集。这样传输层就可以在不同网络间进行透明数据传输。网络层向传输层提供的服务有两类:面向连接的网络服务和无连接的网络服务。
- 虚电路是网络层向传输层提供的一种面向连接的服务,是可以使所有数据包按顺序到达目的节点的可靠数据传送方式。在该种方式下,进行数据交换的两个结点之间存在一条专为它们服务的虚电路(逻辑线路),无须附加网络地址;
- 数据报服务是网络层提供的一种无连接的网络服务,只能提供不可靠的数据传送方式,源节点(如源路由器)发送的每个数据包都要附加网络地址、包序号等信息,目的节点收到的数据包也不一定按序到达,还可能存在数据包丢失的情况。IP协议是一种无连接的网络层协议,提供无连接的网络层服务。
- 寻址,在不同网络中必须通过三层地址进行寻址。常用的IP网络中运行的三层协议就是IP协议,对应的三层地址就是IP地址。
- 数据报的封装,从传输层过来的数据段需要经过IP协议的重封装,而从数据链路层过来的数据帧就需要进行解封装。在IP网络中封装后形成的是IP数据报,IP封装的目的就是标识此IP数据报发送节点和接受节点的IP地址和控制信息。
- 分段与重组,不同网络上的链路可以传输的最大报文大小是不同的,这就是我们通常说的MTU(最大传输单元)。尺寸较大的数据报在MTU值较小的网络链路传输需要将数据报分段依次传输,对应的接收方就需要把这些接收到的拆分的分段组合起来,还原成原来的数据报。
- 版本,指定IP数据报中使用的IP协议版本,占4位。IPv4对应值为4(0100)
- 首部长度,指示IP数据报头部的总长度,占4位。IP数据报头部的总长度以4字节为单位(即4字节的整数倍)
- 区分服务,用于表示数据报的优先级和服务类型,占8位。包括一个3位长度的优先级,4位长度的标志位,最高位未用
- 总长度,标识整个IP数据报的总长度,包括报头和数据部分,占16位,由此可知IPv4的最大长度为65535(64KB)
- 标识,用于表示IP数据报的标识符,占16位,每个IP数据报有一个唯一的标识(不是序号)。当数据报分段时,这个标识的值就被复制到所有分段的标识字段中,相同的标识字段值使分段后的数据报分段最后能正确地重组成为原来的数据报。
- 标志,指出该IP数据报后面是否还有分段,为分段标志,占3位,仅最低位有意义
- 片偏移,指出该分段在数据报中的相对位置。相对于用户数据字段的起点,该字段从何处开始,占13位
- 生存时间,标识IP数据报在网络中传输的有效期,以秒来计数,占8位。现在通常认为这个数值是指数据报允许经过的路由器数,当值为0时,就丢弃这个数据报。设定生存时间是为了防止数据报在网络中无限制地循环转发。
- 协议,用来标识此IP数据报在传输层所采用的协议类型(如TCP、UDP或ICMP等),以便使目的主机的IP层知道应将数据部分上交给哪个处理过程,占8位
- 首部校验和,用来检验IP数据报的包头部分(不含“数据”部分)在传输到接收端后是否发生了变化,占16位。因为数据报每经过一个路由器,路由器都要重新计算一下报头校验和
- 源地址/目的地址,分别表示该IP数据报发送者和接收者的IP地址,各站32位
- 选项,用来支持各种选项,提供扩展余地,后面的填充字段就是为了保证IP数据报的报头是32位的整数倍。