网络层概述
1. 概述-网络层的功能和服务
不同于应用层和运输层大多在网络终端机上提供服务,网络层涉及网络中的每台主机和路由器。因此,不同于仅关注端到端的特性,网络层需要关注整个网络系统-网络数据报如何从一台主机顺利传输到另一台。因特网通过对网络中的每个接口进行编址的方式实现对网络中设备的定位,通过路由选择规定传路径,再通过路由设备实现数据报的具体的转发。
1.1 网络服务模型
因特网的服务模型是一种 尽力而为的模型,具体如下图所示:
从上图可以看出,Internet 的服务模型不对传输带宽、无丢包、有序传输、定时抵达以及拥塞反馈提供任何保证。(相比较的 ATM 网络体系结构 参考 拓展阅读)
1.2 核心功能
连接建立:类似 TCP协议的3次握手,对于部分网络层协议也需要一个类似的建立连接的过程- 从源到目的地沿着所选择的路径彼此握手,以确定一些所需的状态信息。这一过程称为 连接建立(connection setup)。
网络层中最重要的两个功能为 转发 和 路由选择。
转发(forwarding)是指:将网络分组从一个输入链路接口转移到适当的输出链路接口的路由器本地动作。
路由选择(routing)是指:从整个网络范围来看,分组从源到目的地所采取的端到端路径。
两者关系:路由器通过 转发表(forwarding table) 以及 网络分组首部字段 的值来确定转发的链路接口。而路由器选择算法,决定了路由器的转发表中的值(通过路由器接收的路由选择协议报文)。
1.3 硬件层面概念区分
硬件层面上,分组交换机(Switches)是一个广义的概念,即从输入链路接口到输出链路接口转移分组的设备。具体地,根据转移分组的依据,分为:
链路层分组交换机(link-layer switches):基于链路层字段中的值做转发决定的交换机。
路由器(router):基于网络层字段的值做转发决定的交换机(路由器为三层设备:网络层,链路层,物理层)。
1.4 虚电路和数据报网络
历史:虚电路网络的概念来自于电话界 - 采用 真正的电路进行数据的传输。而英特网的设计遵循了 端到端原则 也就是尽量保证底层的简洁,将复杂的功能尽量放置在顶层进行实现(例如数据的可靠传输放置在 运输层-TCP 实现),这样设计的好处还包括 降低了对更加底层的服务的要求 - 链路层技术的选择更加宽泛,可以使用各种传输速率和丢包率的链路层技术。
在网络层中,同样分为无连接服务和连接服务。具体地,提供连接服务的计算机网络称为 虚电路网络(Virtual-circuit, e.g. ATM, 帧中继), 而提供无连接服务的计算机网络称为 数据报网络(datagram network, e.g. Internet)
虚电路网络 在网络层中建立的连接称为 虚电路,一条虚电路由如下部分组成:1- 源和目的主机之间的路径(即一系列的链路和路由器);2- VC号,沿着该路径的每段链路的一个号码;3- 沿着该路径的每台路由器中的转发表表项。属于特定的虚电路的分组在 虚电路中传输时,每经过一个中间路由器就根据路由器的转发表项更新一个VC号。
虚电路网络 传输数据分为3个阶段,1- 虚电路的建立,所经过的路由器等设备添加连接项,维护连接信息;2- 数据传输,数据沿着建立完毕的虚电路进行传输;3- 虚电路的拆除。
数据报网络 中,端系统将需要发送的数据添加目的端系统地址后直接推进网络中,路由器根据分组的目的地址对分组进行转发(根据前缀匹配算法)。
数据报网络 由于转发表能够在任何时候进行修改,因此,从一个端系统到另一个端系统的数据传输所走的路径不一定完全相同。因此,无法保证有序到达(虚电路网络则不同,因为是使用的特定的传输网络路径,因此传输的顺序能够进行保证)。
2. 转发
2.1 路由器工作原理
一个通用的路由器体系结构包括 输入端口、交换结构、输出端口 以及 路由选择处理器。
其中,输入端口、交换结构、输出端口 共同实现了 转发功能,并且为了保证转发速度,总是使用硬件实现, 这3部分也总称为 路由器转发平面(router forwarding plane)。
为了保证网络的速度,路由器转发平面的实现需要进行很多的优化。例如 输入端口的 快速查找技术(快速定位输入所对应的输出端口);输入缓存使用 DRAM 技术提升缓存读写速度。
当输入输出速度不匹配时,或者交换结构处理过慢时,都会出现分组的排队现象,并最终可能出现丢包现象(packet loss)。对应输入和输出的排队,分别有相关的调度算法。
思想:对于路由器的工作,可以抽象为 “匹配加动作” - 根据目的地址,将输入的数据分配到对应的输出端口。这一 “匹配加动作” 的行为,在计算机网络中应用非常广泛,例如:链路层交换机;防火墙(过滤特定的源/目的 IP + 端口);网络地址转换(NAT)。
2.2 因特网中的转发和编址
前面对网络转发和编址的过程进行了抽象化的介绍,本节对具体的英特网网络层协议的实现进行介绍。
英特网的网络层主要由3个组件组成: 1- IP协议(网际协议);2- 路由选择,决定数据从源到目的地所流经的路径;3- 处理数据报中的差错和某些信息报告的协议(介绍 ICMP协议)。
2.2.1 数据报格式
网络层的分组被称为 数据报。如下图所示:
- 版本号:规定该数据报所使用的的 IP协议版本,路由器通过查看该版本号决定如何解释 IP数据报的剩余部分。上述数据报是 IPv4 的数据报格式;
- 首部长度:由于数据报的首部可能包含一些可变数量的选项,因此,通过这4个比特来确定IP数据报中首部的真实长度;
- 服务类型:通过该字段标识不同类型的 IP数据报,可通过该字段将一些实时性要求比较高的数据报特殊的标识出来(例如 IP电话应用),最终由路由器的管理员决定具体的服务策略。
- 数据报长度:IP数据报的总长度。共16位,所以理论上 IP数据报的最长长度为 65535 字节。实际上,一般的IP数据报的长度不会超过 1500 字节。
- 标识、标志、片偏移。与IP分片有关的字段。
- 生存时间(Time-To-Live): 用来确保数据报不会永远在网络中循环。每当该数据报由一台路由器进行处理时,该字段的值减1,若 TTL 的值减为 0,则该数据报必须丢弃。
- 协议:指示该IP数据报的数据部分应该交由那个特定的运输层协议。值为6表示交给 TCP协议,值为17表示交给 UDP 协议。(该字段的作用类似于 运输层协议中端口号的作用- 是负责将运输层和网络层粘合在一起的字段)
- 首部检验和:用于帮助路由器检测收到的IP数据报 首部 的比特错误。算法与前面运输层协议所使用的相同。需要注意的是,由于 TTL每经过一个路由器都需要改变,因此,每个路由器都需要重新计算这个检验和。
- 源和目的IP地址:通常目的IP地址由源主机通过DNS查找来获得。
- 选项:通常不使用。
- 数据:大多数情况下,数据字段为运输层的报文段(TCP 或者 UDP),此外,还可以是ICMP报文。
补充介绍:IP数据报分片
由于不同的链路层所能承载的最长网络层分组的长度不同(e.g. 以太网帧能承载的长度不超过1500字节,而某些广域网链路的帧可承载不超过576字节的数据),一个链路层帧能承载的最大数据量叫做 最大传送单元(Maximum Transmission Unit. MTU)。
一个超过了所经过的链路层承载能力的网络层分组需要进行分片, 即将一个大的IP数据报分成若干个链路层帧可以承载的小数据报,每个较小的数据报都成为 片(fragment)。
基于保持简单的网络内核的原则,片的重新组装工作放在端系统中进行(具体的组装根据数据报的 标识、标志、片偏移确定)。
2.2.2 IPv4
主机与物理链路之间的边界叫做接口(interface),IP协议要求每台主机和路由器的接口都拥有自己的IP地址(例如一个路由器有3个接口,则它有3个IP地址)。
每个IP地址的长度为 32比特(因此,总共有约40亿个可能的IP地址),这些地址使用 点分十进制记法(dotted-decimal notation)书写(e.g. 193.32.216.9)。在互联网中,要求每台主机和路由器上的每个接口都需要有一个全球唯一的 IP地址(NAT后面的接口除外)。
每个可以和外界隔开的网络岛可以确定一个子网(sub-net),每个子网中的网络地址具有相同的前缀,例如:223.1.1.0/24, 表示子网中的地址前24为都为 223.1.1。/24 有时也称为子网掩码(subnet mask, 或者表达为 255.255.255.0? ref)参考下图:
a. 地址分配策略
较老的分配方案叫做 分类编址 方案,它限制IP地址的网络部分长度为 8, 16, 24 比特(分别称为 A, B, C 类网络)。这种地址分配策略的问题是不灵活,例如一个子网有2000台主机,超过了 C 类网络的最大限额 254 (2^8 -2)台,但是远远小于B类网络的最大限额(65534台)。
更为灵活的地址分配策略叫做 无类别域间路由选择(classless Interdomain Routing- CIDR). 它将32位IP地址以如下形式划分为两部分: a.b.c.d/x 。
x 规定了 a.b.c.d 的前 x 位为地址的 IP部分(也称为地址的前缀-prefix,或网络前缀)。通常一个组织会被分配一段连续的IP地址,也即具有相同前缀的一段地址。IP中剩余的 32-x 位比特则用于区分该组织内部设备。
两个特殊的IP为 255.255.255.255 和 0.0.0.0, 其中 255.255.255.255 为IP广播地址,即发送给该地址的信息会被广播给子网中的所有主机。
b. 获取主机地址-DHCP协议
通常,配置本机IP地址有两种方案,一种是管理员手动配置静态地址,另一种则是使用 动态主机配置协议(Dynamic Host Configuration, DHCP)动态获取。
DHCP协议是一种即插即用式的协议,DHCP服务器可以给加入网络中的主机分配IP地址,以及发送例如子网掩码,第一跳路由器地址(默认网关)以及本地DNS服务器地址等信息。
在最简单的情况下,每个子网拥有一台DHCP服务器,如果没有,则需要一个 DHCP中继代理(通常是一台路由器),通过这个代理获得该网络中的服务器的地址。
DHCP建立是一个4步的过程:
- DHCP服务器发现:一个新到的主机将自己的IP设置为 0.0.0.0,然后通过广播(向255.255.255.255)发送DHCP发现报文(DHCP discover message, UDP分组67端口)。
- DHCP服务器提供:当DHCP服务器收到一个DHCP发现报文时,用一个 DHCP提供报文(DHCP offer message)通过广播的形式向客户做出响应。该报文包含收到的发现报文的事务ID、向客户推荐的IP地址、网络掩码以及 IP地址租用期(address lease time)。
- DHCP请求。客户从收到的一个或多个服务器提供中选择一个,并向其发送 DHCP请求报文(DHCP request message)进行响应,并回显配置参数。
- DHCP ACK。服务器用DHCP ACK 报文(DHCP ACK message)对DHCP请求报文进行响应,证实所要求的参数。
c. 网络地址转换
当子网中的设备太多,超过了ISP所分配给他们的地址数量时,可以使用 网络地址转换(Network Address Translation- NAT)。
NAT内部的设备对于外界来说,只有一个 IP地址(NAT路由器的地址),如下图所示 NAT路由器地址为:10.105.178.2。
NAT路由器通过 NAT转换表(NAT translation table)来确定分组的转发目的地。具体的,是通过将不同的子网中进程映射到NAT路由器的不同端口上,收到公网的数据后,根据端口号确定转发到子网中的哪台主机和和对应的端口号。(也就是所有的子网中的进程都被映射到了NAT路由器的不同端口上了)
NAT的一个重要问题是它妨碍了P2P应用程序。因为P2P协议要求对等方A 与B 都能够对等地作为服务器和客户机,但对于一个位于NAT后面的对等方,它无法作为一个服务器来建立 TCP连接。
为解决在NAT网络中使用P2P 的问题,可以使用了所谓的 连接反转(connection reversal) 技术(借助一个第三方非NAT网络中的机器作中继建立 TCP 连接),来实现 NAT穿越(NAT traversal)。 目前,NAT穿越 更多地由 UPnP 协议实现。对于支持 UPnP协议 的NAT路由器,它允许NAT网络中的主机将用于 TCP 握手的端口映射到 NAT路由器上,从而允许 NAT路由器 监听TCP握手请求,并最终转发到对应的目的主机中。
2.2.3 因特网控制报文协议
因特网控制报文协议(ICMP协议)主要的用途有:差错报告,ping程序,traceroute 程序。ICMP报文包含 类型字段 和 编码字段 Ref,以及引起该ICMP报文的IP数据报的首部和前8字节内容(以便发送方确认引起错误的数据报)。
当IP路由器无法找到一条路径通往Telnet,FTP或HTTP等所求请的主机时,路由器会创建和发出一个类型为3的ICMP报文给请求方以指示该错误。
ICMP是属于网络层的协议,但是它又有点类似运输层-因为ICMP报文会放置在IP数据报的数据字段。
2.2.4 IPv6
由于IPv4 协议的地址已经耗尽,IPv6协议作为下一代的英特网网络层协议,正在加速推广中。
除了将IP地址从32位提升到128位外,IPv6 的数据报头部也更加简洁(固定为40字节),IPv4 和 IPv6 头部的对比如下所示:
具体的,IPv6 的头部包含以下部分:
- 版本;
- 流量类型(traffic class - 8 bit):有点类似IPv4 中的服务类型(Type of service);
- 流标签(flow label - 20 bit):IPv6允许给一些特殊的分组加上标签,例如音频、视频等需要处理的分组;
- 有效负荷长度(Payload Length-16bit):给出了IPv6 数据报中40字节首部后面的数据部分的长度;
- 下一个首部(Next Header):标识数据报中的内容需要交付给哪个运输层协议,与IPv4中 protocol 字段相同;
- 跳限制(Hop Limit):类似IPv4 中的 TTL,数据报允许最多的转发次数。
- 源和目的地址。
在 IPv4 向 IPv6 转换的过程中,一般使用一种 双栈(dual-stack) 的方法,也就是一个结点同时支持 IPv4和IPv6协议。设备间通过 DNS了解结点是否支持IPv6协议(只有两个主机都支持IPv6协议,才能使用 IPv6数据报进行数据传输)。此外,对于网络传输链路中部分路由器不支持 IPv6 的问题,可以使用 隧道(tunnel) 的方法,将IPv6 报文封装在 IPv4 报文的数据字段中,从而很好的穿过这些仅支持IPv4 协议的设备,而不需要进行协议头部的转换。
2.2.5 IP安全性
对于网络层来说,IPv4,IPv6 等都没有做安全性相关的处理。为实现网络层的安全传输,人们设计了一种新型的带有安全机制的网络协议 IPsec,在VPN等应用中已经得到了广泛的部署。
IPsec 兼容IPv4 与IPv6 协议,两台主机间可以进行 IPsec通信仅需要这两台主机支持该协议即可,不需要中间的路由设备也支持该协议。具体的实现类似 IPv6 的隧道方法。需要进行 IPsec 通信的两台主机首先建立IPsec 会话(Note: IPsec 是面向连接的),然后两台主机上的运输层数据都会经由IPsec 进行加密,然后打包作为IP数据报的数据报部分进行传输(实际更复杂一些),接收方接收到 IP数据报后,根据IPsec 协议的规范解密得到数据内容。
3. 路由选择
3.1 原理简述
路由选择的即求解从源路由器到目的路由器的最佳路径(基于成本最低)。该问题通常抽象为图的问题,即求解 有权无向图的最短路径。参考数据结构笔记-图2。
路由选择算法通常可以分为:全局式路由选择算法(global routing algorithm) 和 分散式路由选择算法(decentralized routing algorithm)。
全局式路由选择算法 也称为链路状态(Link state)路由选择算法,是用完整的网络拓扑信息来计算最低费用路径(通常通过链路状态广播(link state broadcast)算法来完成网络拓扑及费用信息的获取)。可以使用 Dijkstra 算法求解最短路径。
分散式路由选择算法 的一个典型算法为 距离向量算法(Distance-Vector DV)。它根据 Bellman-Ford 公式迭代、异步、分布式的求取最短路径。公式如下:
$$d_x(y) = min_c{c(x,v) + d_v(y)}$$
其中,$d_x(y)$ 为 结点x 到结点y 的最短路径(费用)- 也称为距离向量,v为x 的相邻结点,$c(x,v)$ 为 x 到 结点v 的费用。
自治系统 在实际的因特网中,由于网络的规模巨大,无法将所有路由器放进一个整体问题中进行求解(开销太大)。因此,需要将网络划分为一个个子网,每个自网络形成一个自治系统(Autonomous System, AS),自治系统内部使用上述介绍的路由选择协议(LS or DV等)。
自治系统之间通过 网关路由器(gateway router) 相连,如果一个主机需要访问其他自治系统中的内容,需要经由网关路由器进行访问。网关路由器之间使用 自治系统间路由访问协议(inter-autonomous system routing protocol, 主要进行可达性信息的分享)。
3.2 因特网中的路由选择协议
因特网中,在自治系统内部 常用的路由选择协议有 路由选择信息协议(Routing Information Protocol- RIP)与 开放最短路优先协议(Open Shortest Path First, OSPF)。
RIP协议 运行方式和 DV算法比较接近,路由选择信息更新通过在邻居间使用 RIP响应报文(RIP response message) 进行交换来实现。需要注意的是,RIP在运行时是作为一个使用UDP协议的应用进程来实现的。
OSPF协议 被设想为RIP的后继者,核心是一个使用洪泛链路状态信息的链路状态协议和一个 Dijkstra 最低费用路径算法。即使用 OSPF协议的AS 中,一台路由器会构建一幅关于整个自治系统的完整拓扑图,然后在本地运行Dijkstra算法来寻找最短路径(确定一个以自身为根结点的到所有子网的最短路径树)。
在自治系统之间,使用 边界网关协议 BGP(Broad Gateway Protocol- 广泛使用的为BGP4,简称BGP)。BGP的核心作用是向互联网中的其他部分告知它的存在,具体的工作如下:
- 从相邻AS处获得子网可达性信息;
- 向本AS内部的所有路由器传播这些可达性信息;
- 基于可达性信息和 AS策略,决定到达子网的最优路由。
3.3 广播和多播
广播是指将数据交付给网络中所有结点的服务,多播是将数据交付给网络中所有设备的一个子集的服务。
广播 主要使用两种思路实现:
- 受控洪泛(controlled flooding):所谓洪泛,是指源节点向它的所有邻居发送分组副本,显然,对于一个连通的网络,数据一定可以分发到整个网络中。洪泛必须受控(否则会在回路中无限循环,形成广播风暴-broadcast storm),通常控制洪泛的方法有:序号控制洪泛 和 反向路径转发(RPF,或称为 反向路径广播 RPB)。
- 生成树。可以以源节点为根,建立一棵该图的最小生成树进行数据的广播(参考笔记-数据结构-图2)。
多播 通常需要使用 间接地址 (address indirection, 也是一个 IP地址) 来编址待交付数据的网络设备组;接收方组称为一个多播组(multicast group)。因特网使用 IGMP(因特网组管理协议)来对组进行管理。