网络层概述
网络层实现主机到主机之间的通信服务,根据功能可以分解为两个相互作用的部分:
- 数据平面:实现转发功能,即决定到达路由器输入链路之一的数据报如何转移到到路由器适当的的输出链路之一。
- 控制平面:实现路由选择功能,即控制数据报从源主机,沿着路由器组成的路径,到目的主机的过程中选择路径的方式。
路由表
最重要的网络层设备是路由器,路由器中用于实现转发和路由选择的其中一个关键元素是路由表,当分组到达路由器时,路由器检查其首部的一个或多个字段值,进而使用这些首部值在转发表中索引,这些值所对应的表项指出了该分组应该被转发的输出链路接口,于是分组被转发。
配置转发表的传统方法是让网络管理员手动进行配置,实现难度较大;更现实的控制平面方法是软件定义网络(SDN),通过用软件实现的远程控制器计算和分发路由表,而路由选择设备仅指向转发。
网络服务模型
网络服务模型定义了分组在发送与接收端系统之间的端到端运输特性,包括确保交付、延时上界、有序分组交付、确保最小带宽、安全性等。
而实际上因特网的网络层仅提供了尽力而为服务,因此分组不能保证被有序接收、最终交付、端到端时延、最小带宽等。
路由器工作原理
路由器主要分为四个组件:
- 输入端口:执行物理层和链路层功能接入分组,分组被存储在缓存中。同时提供查找功能,数据分组到达输入端口后,输入端口查询转发表决定路由器的输出端口,并通过路由的交换结构转发到输出端口。而控制分组(如携带路由选择信息的分组)则会从输入端口转发到路由选择处理器;
- 交换结构:将路由器的输入端口连接到输出端口;
- 输出端口:存储从交换结构接收的分组,分组被存储在缓存中,同时执行链路层和物理层功能在输出链路上传输这些分组;
- 路由选择处理器:执行平面控制功能,如【路由选择协议、维护路由选择表与链路状态信息、计算转发表】(传统路由器)、【与远程控制器通信,接收由远程控制器计算的转发表项,并在输入端口安装表项】(SDN路由器)。
其中数据平面的功能主要由更快的硬件进行实现,如输入端口、输出端口、交换结构;而控制平面的功能通常用软件进行实现,并在路由选择处理器上执行。
输入端口处理
路由器使用转发表来查找输出端口,转发表可以由路由选择处理器计算和更新,也可以接收来自远程SDN控制器的内容。当分组到达路由器的输入端口,路由器使用分组目的地址的前缀与表中的表项进行匹配,如果存在一个匹配项则路由器向相关联的链路发送分组;当有多个匹配时,路由器使用最长匹配规则,即向在该表中前缀最长的匹配项所关联的链路接口转发分组。查找过程必须要使用硬件实现。
除了查找之外,输入端口处理的过程还包括:
- 物理层和链路层处理;
- 检查分组的版本号、检验和、寿命字段,并重写后面两个字段;
- 更新用于网络管理的计数器。
交换
交换结构位于路由器的核心,交换可以由以下方式实现:
- 经内存交换:输入端口与输出端口之间的交换在CPU(路由选择处理器) 的直接控制下完成。
- 经总线交换:输入端口经一根共享总线将分组直接传送到输出端口,不需要CPU的干预,一次只有一个分组能跨越总线,因此如果多个位于不同输出端口的分组同时到达路由器,则会产生等待。
- 经互联网络交换:纵横式交换机是一种由2N条总线组成的互联网络,连接N个输入端口和N个输出端口,两种总线相互之间纵横交叉,交叉点通过交换结构控制器能够随时开启和闭合。纵横式交换机能并行转发多个分组,是非阻塞的,但是每条总线依然只能发送一个分组,因此如果两个来自不同输入端口的分组其目的为相同的输出端口,即需要经过一条输出总线,则其中一个需要等待。
输出端口处理
输出端口从其缓存中取出分组并将其发送到输出链路上。
端口排队
输入端口和输出端口都可能形成排队,随着队列的增长,可能导致端口缓存用尽而出现丢包。端口排队主要分为以下两种:
- 输入排队:一个在输入队列中排队的分组被另一个分组所阻塞,因此它必须等待交换结构发送,即使输出端口空闲,称为线路前部阻塞(HOL);
- 输出排队:若交换结构速率比输出端口速率快一定倍数,输出端口缓存中就会出现排队。当没有足够的空间来接收新的分组时,输出端口要么丢弃已到达的分组(弃尾),要么删除一个已排队的分组,关于分组丢弃与标记的策略称为主动队列管理算法(AMQ)。
分组调度
分组调度规则解决排队的分组经输出链路传输的次序问题,主要有:
- 先进先出(FIFO):也称为先来先服务(FCFS),根据分组到达输出链路的次序来选择分组进行传输;
- 优先权排队:到达输出链路的分组被分类,并被放入不同的优先权类队列,每次选择非空的最高优先权类队列中的一个分组进行传输,同一优先权的分组按照FIFO进行选择;
- 循环排队:分组同样被分类,但不存在严格的优先权,循环调度器在这些类之间轮流提供服务;
- 加权公平排队(WFQ):与循环排队一样进行分类以及使用WFQ调度器循环为每个类提供服务,但是每个类i被分配一个权w[i],在类i要发送的任何时间间隔中,确保类i收到的服务部分等于,因此每每个类在任何时间间隔可能收到不同数量的服务。
IPv4
IPv4数据报格式
网络层分组称为数据报,IPv4数据报中的关键字段如下:
- 版本号:4bit,规定了数据报的IP协议版本,路由器能据此确定如何解释数据报的剩余部分;
- 首部长度:4bit,表示IP数据报中载荷实际开始的地方,因为IPv4数据报可包含可变数量的选项;
- 服务类型(TOS):用于区分不同类型的IP数据报;
- 数据报长度:16bit,IP数据报的总长度(首部加上数据),单位为字节,理论最大长度为=65535字节;
- 标识、标志、片偏移:与IP分片有关;
- 寿命(TTL):每当一台路由器处理数据报时,该字段值减1,TTL为0时该数据包必须丢弃;
- 协议:指示数据部分应交给哪个特定的传输层协议,类似于运输层报文段中的端口号字段;
- 首部检验和:帮助路由器检测收到的IP数据报中的比特错误,只对IP首部进行计算检验(与TCP/UDP对整个报文段进行检验不同),计算方式为将首部的每2个字节作为一个数,使用反码算术对这些数求和,路由器如果发现计算结果与其首部携带的检验和不一致则代表有差错,该数据报一般会被丢弃。由于TTL以及可能的选项字段会改变,因此每台路由器需要重新计算并更新检验和;
- 源和目的IP地址:当某源生成一个数据报,它在源IP字段插入其自身IP地址,在目的IP地址字段插入其最终目的地IP地址,通常源主机通过DNS查找目的IP地址;
- 选项:允许IP首部扩展;
- 数据:即有效载荷。
如果IP数据报无选项,其首部为20字节;如果IP数据报承载一个TCP报文段,那么还要再加上20字节的TCP首部,即总长40字节的首部。
IPv4数据报分片
一个链路层帧能承载的最大数据量叫作最大传送单元(MTU),如果一个IP数据报的长度超过了它被转发的出链路的MTU,那么IP数据报中的数据需要被分片成两个或多个较小的IP数据报,称为片,并用单独的链路层帧封装后通过输出链路发送这些帧。
片在到达目的地传输层前需要重新组装,该工作在端系统中而不是路由器中进行。
数据报生成时,其首部会被贴上标识号,当路由器对数据报进行分片时,每个片首部中的标识号与初始数据报相同,目的主机接收到一系列数据报时,它能通过检查数据报的确认号来确定哪些数据报来自同一个初始数据报;每个数据报的最后一个片的标志会被设为0,而其他数据报会被设为1,从而让目的主机知道是否收到了同一数据报的最后一片;偏移字段指定该片应放在初始数据报的哪个位置,从而使目的主机知道是否丢失了片。
IPv4编址
每个IP地址长度为32比特,通常按照点分十进制记法书写,即地址中的每个字节(8bit)用它的十进制形式书写,各字节间以句点隔开。
主机与物理链路之间的边界叫接口,一台路由器有多个接口,每个接口都有自己的IP地址,因此一个IP地址与一个接口相关联,而不是包括该接口的主机或路由器。通常一个接口的IP地址的一部分需要由其连接的子网决定,如图:
互联左侧IP地址为223.1.1.xxx的3台主机与路由器接口223.1.1.4的网络形成了一个子网,IP编址为这个子网分配一个子网IP地址 223.1.1.0/24,其中的“/24”称为子网掩码,代表IP地址的左侧24位定义了子网地址,称为该地址的前缀,任何要连入223.1.1.0/24的接口都要求地址具有223.1.1.xxx的格式。而剩余的8位用于区分子网内部设备,当内部的路由器转发分组时才会考虑这些比特。
因特网的地址分配策略被称为无类别域间路由选择(CIDR),一个组织通常被分配一块连续的地址,这些地址具有相同的前缀,当组织外部的一台路由器向组织内转发一个数据报时,仅需要考虑该地址的前缀即可,外界不需要知道在目的网络中还存在的其他组织,这种使用单个网络前缀通告多个网络的能力称为地址聚合,也称为路由聚合或路由摘要。
在CIDR被采用前,有一种分类编址的方案,即具有8、16、24比特子网地址的子网分别被称为A、B、C类网络。
此外还有一种IP广播地址,其IP为255.255.255.255,当一台主机向该地址发出数据报时,该报文会交付给同一个网络中的所有主机。
DHCP
动态主机配置协议(DHCP) 允许主机自动获取一个IP地址,网络管理员能够配置DHCP使某主机每次得到一个相同的IP地址,或被分配一个临时IP地址。DHCP是一个C/S协议,客户通常是新到达的主机,每个子网将具有一台DHCP服务器,或是一个DHCP中继代理(通常是一台路由器)。新主机通过DHCP协议获取IP地址分为4个步骤:
- DHCP服务器发现:DHCP客户生成包含DHCP发现报文的IP数据报,其目的地址为广播地址,源IP地址为0.0.0.0,数据报将在链路层封装成帧并被广播到所有该子网连接的节点。
- DHCP服务器提供:DHCP服务器收到一个DHCP发现报文时,用DHCP提供报文向客户做出响应,该报文包含收到的发现报文的事务ID、向客户推荐的IP地址,子网掩码以及IP地址租用期(即有效时间量),该报文仍向子网的所有节点广播。
- DHCP请求:客户从一个或多个服务器提供中选择一个,并向选中的服务器提供用DHCP请求报文进行相应。
- DHCP ACK:服务器用DHCP ACK报文对DHCP请求报文进行响应证实。
NAT
专用网络也称为具有专用地址的地域,表示仅对该网络中的设备有意义的网络。网络地址转换(NAT) 用于实现公用网络和专用网络之间IP地址的转换
NAT通过专用网络中的NAT使能路由器进行实现,它对外界隐藏了专用网络的细节,它对外界的行为就像一个具有单一IP地址的网络设备。NAT路由器上有一张NAT转换表,表项中包含了端口号及其IP地址。
假如专用网络中的主机10.0.0.1在端口3355上请求IP地址为128.119.40.186的服务器80端口上的一个Web页面,NAT路由器从LAN接收到数据表后,任意选择一个当前未在NAT转换表中的端口号5001,将数据报源IP地址更换为NAT路由器与广域网相连一侧接口的IP地址138.76.29.7,源端口号更换为5001,并在表中添加一条表项:IP和端口138.76.29.7:5001对应主机和端口10.0.0.1:3355;Web服务器发回一个响应报文,其目的IP地址和端口号为138.76.29.7:5001;NAT路由器接收到响应报文后,使用目的IP地址和端口号从NAT转换表中检索出适当的IP地址和端口号10.0.0.1:3355,于是重写数据报的目的IP地址和端口号,并向专用网络转发。
NAT已成为因特网中运行在网络层的一个重要中间盒,它并不执行数据报转发,而是实现NAT、流量负载均衡、防火墙等功能。
防火墙、IDS、IPS
防火墙通常位于内部网络和因特网之间,它检查数据报和报文段的首部字段,拒绝可疑的数据进入内部网络;
入侵检测系统(IDS) 位于网络的边界,它不仅检查数据报的首部字段,而且检查其有效载荷。IDS具有一个分组特征数据库,这些特征是已知攻击的一部分,且会随着新攻击的发现而自动更新。IDS将分组的首部和有效载荷与数据库中的特征相匹配,如果发现了这样的一种匹配则产生告警。
入侵防止系统(IPS) 与IDS相类似,它除了产生告警外还会阻挡分组。
IPv6
IPv6数据报格式
相比IPv4,IPv6引入的最重要的变化体现在数据表格式中:
- 扩大的地址容量:将IP地址长度增加到128bit,同时引入了一种任播地址,可以将数据报交付给一组主机中的任意一个;
- 40字节定长首部:许多IPv4字段已被舍弃或作为选项,40字节定长首部允许路由器更快处理IP数据报;
- 流标签:该字段可为属于特殊流的分组加上标签,表示发送方要求进行特殊处理的流。
IPv6中定义的字段如下:
- 版本:4bit,用于标识IP版本号;
- 流量类型:8bit,类似于服务类型(TOS),用于区分不同类型的IP数据报;
- 流标签:20bit,用于标识一条数据报的流,能够对一条流中的某些数据报给出优先权;
- 有效载荷长度:16bit,用于给出数据报的40字节首部后的字节数量;
- 下一个首部:标识数据报中的内容需要交给哪个协议(如TCP/UDP);
- 跳限制:转发数据报的每台路由器对该字段值减1,如果达到0则该数据报将被丢弃;
- 源地址和目的地址;
- 数据:即有效载荷,到底目的地时便被移出,交给下一个首部字段指定的字段处理。
IPv6中相比IPv4中已经移除的字段:
- 分片/重新组装:IPv6不允许数据报在中间路由器上进行分片与重新组装,如果路由器收到的数据报太大不能转发到输出链路,则丢弃该数据报,并向发送方发回一个分组太大的ICMP差错报文,发送方收到后使用较小长度的IP数据报重发数据。即分片/重写组装的工作从路由器被转移到了端系统上。
- 首部检验和:在IPv4中包含一个TTL字段,由于该字段在每个路由器上都有更新,因此需要在每个路由器重新计算首部检验和,十分费时;且由于传输层和数据链路层都已进行了检验操作,因此该字段于IPv6被移除;
- 选项:它可能出现在首部中由下一个首部字段所指示的位置上。
从IPv4到IPv6的迁移
实践中已广泛采用的迁移方法包括建隧道:假定两个IPv6节点要用IPv6数据报进行交互,但它们经由中间IPv4路由器进行互联,那么我们将两IPv6路由器之间IPv4路由器的集合称为隧道,在隧道发送端的IPv6节点可将整个IPv6数据报放到一个IPv4数据报的有效载荷中,在发送给隧道的第一个节点,隧道接收端的IPv6节点最终收到该IPv4数据报,并通过观察IPv4数据报中的协议号字段确定该IPv4数据报中包含一个IPv6数据报,于是取出IPv6数据报并为其提供路由。
通用转发
基于目的的转发可以总结为两个步骤:匹配(查找目的IP地址)、动作(将分组发送到有特定输出端口的交换结构);通用转发能够对协议栈的多个首部字段进行匹配,这些首部字段与不同层次的不同协议,动作能够包括:
- 将分组转发到一个或多个输出端口;
- 跨越多个通向服务的离开接口进行负载均衡分组;
- 重写首部值;
- 阻挡/丢弃分组;
- 向某个特定的服务器发送一个分组。
通用转发中的转发设备更准确地描述为分组交换机,每台分组交换机中都有一张匹配加动作表,匹配加动作表能够使用网络层和链路层源和目的地址做出转发决定,相当于将基于目的地的转发表一般化,通用匹配加动作能力是通过计算、安装和更新这些表的远程控制器实现的
OpenFlow
OpenFlow是一个控制器和交换机之间的标准协议,已成为匹配加动作转发抽象、控制器、更为一般的SDN革命等概念的先驱。匹配加动作转发表在OpenFlow中称为流表,每个表项包括:
- 首部字段值的集合:入分组将与之匹配,匹配不流表项的分组将被丢弃或发送到远程控制器做更多处理;
- 计数器集合:可以包括已经与该表项匹配的分组数量,以及自从该表项上次更新以来的时间;
- 动作集合:当分组匹配表项时所采取。
流表本质上是一个API,每台分组交换机的行为能被编程。OpenFlow的匹配抽象允许对来自三个层次的协议首部所选择的字段进行匹配;每个流表项都有零个或者多个动作列表,决定了应用于与流表项匹配的分组的处理,如果有多个动作,它们以在表中规定的次序执行,最为重要的动作包括:转发、丢弃、修改字段。