🚥计算机网络 自顶向下方法 系列文章导航🚥

  1. 《计算机网络 自顶向下方法》笔记:第一章 计算机网络和因特网
  2. 《计算机网络 自顶向下方法》笔记:第二章 应用层
  3. 《计算机网络 自顶向下方法》笔记:第三章 传输层
  4. 《计算机网络 自顶向下方法》笔记:第四章 网络层:数据平面
  5. 《计算机网络 自顶向下方法》笔记:第五章 网络层:控制平面
  6. 《计算机网络 自顶向下方法》笔记:第六章 链路层和局域网

一、导论

1.网络层概述

提供的服务

  • 在发送主机和接收主机对之间传送报文段(segment)

  • 在发送端将报文段封装到数据报(datagram)

  • 在接收端将数据报解封装,提取出报文段上交给传输层实体

  • 网络层协议存在于每一个主机和路由器中

  • 路由器会检查每一个经过它的 IP 数据报的头部

网络层的关键功能

转发(forwarding):指将分组从一个输入链路接口转移到适当的输出链路接口的路由器本地动作(即,对于每一个具体的数据交换结点,决定分组从某个端口入,再从某个合适的端口发送出去,是一个局部的概念)

路由(routing):指确定分组从源到目的地所采取的端到端路径的网络范围处理过程(即,规划从源到目标的详细路径,是一个全局的概念)

计算路由选择路径的算法被称为路由选择算法(routing algorithm),在网络中交换路由信息的通信协议被称为路由选择协议(Routing Protocol)

2.数据平面

功能:数据平面负责实际的数据报转发(即转发功能的实现)

每台网络路由器中都有一个关键元素——转发表(forwarding table)

转发功能的实现方式:传统方式、SDN(软件定义网络 Software Defined Network)方式

传统方式:基于目标地址 + 转发表

路由器会检查到达分组首部的一个或多个字段值,进而使用这些首部值在其转发表中索引,通过这种方法来转发分组。

SDN 方式:基于多个字段 + 流表(Flow Table)

SDN 中流是指共享首部某些字段的值的一种分组序列,如具有相同源IP地址和目的IP地址的一系列分组。SDN 中流表指分组交换机中用于转发的表(即记录流转发方式的表)。SDN使用流表取代传统路由器中的转发表。

在 SDN 方式下,数据平面设备包含一个或多个流表(Flow Table),用于存储流量匹配规则。数据平面采用基于多个字段匹配和流表的机制,可以实现更加灵活和精细的流量转发控制。通过 SDN 控制器对流表的集中化管理,网络管理员可以对整个网络进行可编程和自动化的配置和管理。

如果找到匹配项,交换机会根据流表中的指令执行相应的操作(如转发、丢弃、泛洪、修改数据包等);如果没有找到匹配项,数据包会被转发到 SDN 控制器,由控制器决定如何处理并下发新的流表规则。

3.控制平面

功能:控制平面决定数据报如何在路由器之间路由,决定数据报从源到目标主机之间的端到端路径(即路由功能的实现)

控制平面方法:传统方式、SDN方式

传统的路由算法

路由选择算法运行在每台路由器中,并且在每台路由器中都包含转发和路由选择两种功能。一台路由器中的路由选择算法与其他路由器中的路由选择算法通信,以计算出它的转发表的值。而这种通信的执行则依靠路由选择协议交换包含路由选择信息的路由选择报文。

SDN 方法

SDN 方式下控制平面路由选择功能与物理的路由器是分离的,即路由器选择设备仅执行转发,而远程控制器计算并分发流表。

SDN 允许网络管理员在不手动处理网络硬件设备的前提下,使用集中化程序重新规划网络,控制复杂网络拓扑以及网络流量。它打破了传统基础架构的限制,将传统的分布式规则计算演变为集中计算,具有低成本、管理简化、灵活性高和可扩展性强等优点。

注意:这里为了区分数据平面和控制平面,把传统方式和SDN方式各分割为两块来讲,因此可能有些混乱,难以理解。本章最后一节,我们将重新完整地讨论SDN方式。

4.网络服务模型

网络服务模型(network service model) 定义了分组在发送与接收端系统之间的端到端运输特性。

这些服务包括:

  • 确保交付:该服务确保分组将最终到达目的地

  • 具有时延上界的确保交付:该服务不仅确保分组的交付,而且在特定的主机到主机时延上界内(例如在 100 ms 内)交付

  • 有序分组交付:该服务确保分组以他们发送的顺序到达目的地

  • 确保最小带宽:这种网络层服务模仿在发送和接收主机之间一条特定比特率(例如 1 Mbps)的传输链路的行为。只要发送主机以低于特定比特率的速率传输比特(作为分组的组成部分),则所有分组最终会交付到目标主机

  • 安全性:网络层能够在源加密所有数据报并在目的地解密这些分组,从而对所有运输层报文段提供机密性

因特网的网络层提供了单一的服务,称为尽力而为服务(best-effort service)。使用尽力而为服务,传送的分组既不能保证以它们发送的顺序被接收,也不能保证它们最终交付;既不能保证端到端时延,也不能保证有最小的带宽(尽力而为服务是根本无服务的一种委婉的说法,因为即使一个没有向目的地交付分组的网络也依旧符合这种模型的定义)。

分组交换机

在《自顶向下方法》中,我们约定分组交换机是指一台通用分组交换设备,他根据分组首部字段中的值,从输入链路接口到输出链路接口转移分组。某些分组交换机称为链路层交换机(link-layer switch),基于链路层帧中的字段值做出转发决定,这些交换机因此被称为链路层设备;其他分组交换机称为路由器(router),基于网络层数据报中的首部字段值做出转发决定,路由器因此是网络层设备。

二、路由器组成

1.路由器工作原理

通用路由器的体系结构如下图所示:

1

上方为控制平面,负责路由:运行路由选择算法/协议(RIP、OSPF、BGP) - 生成路由表

下方为数据平面,负责转发:从输入到输出链路交换数据报 - 根据路由表进行分组的转发

2.输入端口处理和基于目的地转发

(1)输入端口结构与功能

2

  • 线路端接:处理Bit级的接收,通过物理层连接将外部信号接入路由器

  • 数据链路处理:在链路层根据协议标准进行数据拆包,将链路层帧转换为网络层数据包

  • 查找、转发、排队:数据包在进入路由器后,输入端口要进行查找操作(路由器使用转发表来查找输出端口,使得到达的分组能经过交换结构转发到该输出端口),然后决定是否将数据包转发到其他端口或队列进行排队,等待传输到输出端口。

转发分为两种:基于目的地转发(仅仅依赖于 IP 数据报的目标 IP 地址,传统方法)和通用转发(基于头部字段的任意集合进行转发,更加灵活,能支持更复杂的策略和功能)

(2)最长前缀匹配

在基于目的地转发模式下,我们使用最长前缀匹配规则(longest prefix matching rule) 来查找路由。

假设我们的路由器有四条链路,路由器的转发表里只需要包括如下四个表项:

3

采用这种方式,路由表就不需要针对每个可能的目的地址都存储一个表项,大大减少了内存消耗。对于上面这种风格的转发表,路由器用分组目的地址的前缀(prefix) 与该表中的表项进行匹配。例如存在一个分组的目标地址是11001000 00010111 00010110 10100001,因为该地址的前 21 比特前缀匹配该表的第一项,所以路由器向链路接口 0 转发该分组。

如果有一个分组既能与第二项匹配,又能与第三项匹配,那么路由器会使用最长前缀匹配规则,选取第二项进行匹配,向与其对应的接口 1 发送分组。

(3)输入端口缓存

当交换结构的速率小于输入端口的汇聚速率时,在输入端口可能需要排队,输入缓存溢出后可能造成丢失。

通常来说交换结构的速率被设计为足够快,以确保能够处理输入端口接收到的分组,那么为什么还是会产生排队呢?主要有以下几种原因:

  • 汇聚效应(流量突发):多个输入端口可能同时接收到大量的流量,并且这些流量都需要通过同一个输出端口进行转发。

  • 队首阻塞问题(Head-of-Line Blocking):比如,输入端口中的多个数据包等待被发送到不同的输出端口,但由于第一个数据包的目标输出端口暂时不可用,后续的数据包也无法被处理,导致整个输入队列阻塞,形成排队。

  • 非均匀流量分布:网络中的流量往往是非均匀分布的,有的端口可能处于空闲状态,而另一些端口可能会收到大量数据。如果多个输入端口的流量都要发送到某个输出端口时,交换结构虽然速率高,但在短时间内可能会出现流量竞争。

3.交换结构

(1)交换结构的功能

交换结构(Switching Fabric) 在路由器中起着核心作用,负责将数据包从输入缓冲区正确地转发到相应的输出端口。

交换速率:分组可以按照该速率从输入端口传输到输出端口

  • 运行速度通常是输入/输出链路速度的若干倍

  • 对于N个输入端口,交换结构的交换速率是输入线路速度的N倍才比较理想,不会成为瓶颈

三种典型的交换结构见下图:分别是通过内存、总线、互联网络的交换

4

(2)通过内存的交换

该交换结构下,输入端口与输出端口之间的交换是在CPU(路由选择处理器)的直接控制下完成的。

在这种情况下,如果内存带宽为每秒可写进内存或从内存读出最多B个分组,则总的转发吞吐量(分组从输入端口被传送带输出端口的总速率)必然小于B/2,因为每个数据包需要写入和读出这两次操作。

此外,也无法同时转发两个分组,即使它们有不同的目的端口,因为经过共享系统总线,一次仅能执行一个内存读/写。

注意:基于内存的交换结构通常也使用共享总线,这是因为在基于内存的交换结构中,输入端口和输出端口都需要通过同一条总线与内存进行交互。

(3)通过总线的交换

该交换结构下,数据报通过共享总线,从输入端口转发到输出端口。

总线竞争:交换速率受限于总线的带宽

如果多个分组同时到达路由器,每个位于不同的输出端口,除了一个分组外所有其他分组必须等待,因为一次只有一个分组能够跨越总线。因为每个分组必须跨过单一总线,故路由器的交换带宽受总线速率的限制;

(4)通过互联网络的交换

该交换结构下,同时并发转发多个分组,克服单一、共享式总线带宽限制。

例如纵横式(crossbar)交换机就是一种用 2N 条总线组成的互联网络,它连接N个输入端口与N个输出端口。每条垂直的总线在交叉点与每条水平的总线交叉,交叉点通过交换结构控制器能够在任何时间开启和闭合。

5

纵横式网络能够并行转发多个分组。例如当分组达到端口A,需要转发到端口Y时,交换机控制器闭合总线A和Y交叉部位的的交叉点,然后端口A在其总线上发送该分组,该分组仅由总线Y接收。而来自端口B的一个分组在同一时间能够转发到端口X,因为A到Y和B到X的分组使用不同的输入和输出总线。

纵横式交换机是非阻塞的(nonblocking),即只要没有其他分组当前被转发到该输出端口,转发到输出端口的分组将不会被到达输出端口的分组阻塞。然而,如果来自两个不同输入端口的两个分组其目的地为相同的输出端口,则一个分组必须在输入端等待,因为在某个时刻,经给定总线仅能够发送一个分组。

:这里非阻塞的定义是中文版书上的原话,我只能说非常抽象。我们可以把它理解为只要目标输出端口是空闲的,输入端口的分组就可以立即传输到该输出端口,不会因为交换结构本身的原因被阻塞。

更为复杂的互联网络使用多级交换元素,以使来自不同输入端口的分组通过交换结构同时朝着相同的输出端口前行。

4.输出端口处理

(1)输出端口结构与功能

6

与输入端口对应,输出端口处理取出已经存放在输出端口内存中的分组并将其发送到输出链路上。这包括选择和取出排队的分组进行传输,执行所需的链路层和物理层传输功能。

(2)输出端口缓存

当来自不同输入端口的多个分组的目的地是相同的输出端口,因为交换结构的交换速率一般是输出线路速度的N倍(假定输入线路速度与输出线路速度相同),所以分组会很快地堆积在该输出端口,形成分组队列。

当没有足够的内存来缓存一个入分组是,就必须做出决定:丢弃到达的分组(采用一种称为弃尾(drop-tail) 的策略),要么删除一个或多个已排队的分组为新来的分组腾出空间。

主动队列管理(Active Queue Management, AQM) 是一类用于缓解网络拥塞的算法,旨在在网络设备(如路由器)的缓冲区尚未填满之前采取措施,通过主动丢弃或标记分组,向发送方提供拥塞信号,以促使发送方调整其传输速率,从而防止拥塞进一步加剧。

随机早期检测(Random Early Detection, RED) 算法是得到最广泛研究和实现的 AQM 算法之一

5.调度机制

调度机制用于处理排队的分组如何经输出链路传输的问题。

注意:分组的丢弃不属于调度机制的范畴,分组调度的主要任务是决定哪个数据包应该首先被传输。

(1)先进先出

先进先出(First-In-First-Out, FIFO),也称先来先服务(FCFS)调度规则,按照分组到达输出链路队列的先后顺序来选择分组在链路上传输。

FIFO规则的运行过程如下图所示:

8

(2)优先权排队

优先权排队(priority queuing) 规则下,到达输出链路的分组被分类放入输出队列中的优先权类,如下图所示。

9

每个优先权类通常有自己的队列(不仅仅局限于图中的两种优先级),当选择一个分组传输时,优先权排队规则将从队列中为非空的的最高优先权类中传输一个分组。对于同一优先权类的分组之间的选择通常以FIFO方式完成。

非抢占式优先权排队(non-preemptive priority queuing) 规则下,一旦分组开始传输,就不能打断。例如在下面的这个过程中,分组1、3和4属于高优先权类,分组2和5属于低优先权类。分组4到达时,分组2正在传输中,分组4不会将其打断,而是排队等待传输,等其传输完成后开始传输。

10

(3)循环和加权公平排队

循环排队规则(round robin queuing discipline) 下,分组被分成不同的类,但类之间不在优先级。循环调度器在这些类之间轮流提供服务,传输完类1的一个分组后,开始传输类2的一个分组,然后是类3,以此类推,最后循环到类1。一个所谓的保持工作排队(work-conserving queuing) 规则在有(任何类的)分组排队等待传输时,不允许链路保持空闲,也就是说当前类没有分组时,会立即检查循环序列中的下一个类。

加权公平排队(Weighted Fair Queuing, WFQ ) 规则下,分组会被分到不同的类,WFQ调度器也以循环的方式为各个类提供服务(同时它也是一种保持工作排队规则,即当前类为空则立刻检查下一个类)。但是由于每个类在任何时间间隔内可能收到不同数量的分组,因此每个类都会被分配一个权w,每一个类在一个循环中获得不同权重的服务量,如下图所示:

11

实际上,每个队列得到的服务时间并不是严格按照权重比例的,因为它不会打断一个分组的传输来开始传输另一个分组。

三、IP:Internet Protocol

1.IPv4数据报格式

12

IPv4分组的首部各字段解释如下:

版本:占4比特,指IP协议版本号,IPv4分组中此处应为4。

首部长度:占4比特,指分组首部总长度,以4字节为单位进行计算,首部固定部分总长度20字节,故此字段最小值为5。

服务类型:占8比特,在之后的更新中更名为区分服务,定义了分组在网络中的传输优先级和处理方式。

数据报长度:占16比特,指IP分组总长度(首部长度与数据部分长度之和),单位为字节。因字段位数有限,故理论上分组最大长度为2的16次方减一,即65535字节。

标识、标志、片偏移:分别占16、3、13比特,与IP分片有关,我们在下一小节详细介绍。

寿命:占8比特,寿命(Time-To-Live,TTL)字段用来确保数据报不会永远在网络中循环,当一台路由器处理数据报时,该字段的值减一,若TTL字段减为0,则该数据报必须丢弃。

协议:占8比特,指IP分组所运载高层协议的类型。此高层并非指传输层及以上,而是指存在网络层协议且依赖于IP协议进行传输的高层协议,下表为常见的协议及对应的类型值。

协议 ICMP IGMP TCP UDP OSPF
IP分组协议字段值 1 2 6 17 89

首部检验和:占16比特,只检验分组首部,不包括数据部分,保障路由选择关系的正确性。检验方式与UDP相同。

源地址:占32比特,源主机的IP地址。

目的地址:占32比特,目的主机的IP地址。

选项字段:此字段可选,长度为4的整倍数字节,最长40字节。为保证首部以4字节对齐,若选项长度不足,则需进行填充(通常为0)。

2.数据报分片与重组

数据链路层的数据帧数据部分最大长度称为最大传送单元(MTU),不同协议和链路类型的MTU不同。过大的IP数据报需要被分片,即分割成若干个小的数据报。

标识:16比特,源主机发送该分组时计数器的数值,并非序号,分组之间无序号关联。

标志:3比特,从左到右依次是保留位、禁止分片(DF,Don't Fragment)、更多分片(MF,More Fragment)。

片偏移:13比特,以8字节为单位进行计算,记录分片数据在原始数据中的起始位置。因为总长度字段比片偏移字段多3比特,在数值表示范围上前者是后者的8倍,故片偏移计数单位为8字节。

分片过程

  1. 检查原分组总长度是否超过下一跳网络的MTU值,超过则继续执行接下来的分片步骤。

  2. 检查原分组首部标志位DF,若DF为1则表示禁止分片,路由器将丢弃该分组,若DF为0则继续执行以下步骤。

  3. 计算分片数据长度,片偏移。由于片偏移量的计数单位是8字节,因此分片数据最大长度必定为8的整倍数,同时不能超过MTU的值。

  4. 生成分片数据报,每一个分片都需要加上首部。首部各字段与原始数据报的基本相同,主要只修改了总长度,标志,片偏移,而标识保持不变。最后一分片数据报MF标志位为0,其余数据报MF标志位为1。

分片重组

分片重组仅发生在目的主机(而不是下一跳路由器),目的主机依据首部标识重组原始数据报,并通过片偏移计算分片数据在原始数据中的正确位置。

注意:由于每个分片都需要加上首部,所以MTU过小将导致分组有效载荷占比减少,从而降低通信效率。因此分片时,每片都会取最大长度,最后余下的部分单独作为一个分片。

3.IPv4地址

(1)IP地址

IP地址是对主机或者路由器与网络的接口的编址,共32位。

这些地址通常按照点分十进制记法(dotled decimal notation) 书写,即地址中的每个字节用它的十进制形式书写,各字节间以句点隔开。

路由器通常有两个及以上的接口;主机可能有一个或多个接口,比如多网卡配置或虚拟接口。

(2)子网

一个子网内的节点(主机或者路由器)的IP地址的高位部分相同,这些节点构成的网络的一部分叫做子网(subnet),IP地址的高位表示子网部分,地位表示主机部分。

子网内的各主机之间通信无需路由器介入,一跳可达(可借助交换机,因为交换机是链路层设备,不计入IP跳数)。

下图为包括三个子网的网络:

13

划分子网时,将每一个接口从主机或路由器上分开,构成一个个网络的孤岛,每一个孤岛都可称之为子网。以下图为例,我们将其划分为6个子网,因为每个路由器之间的网络也是一个子网。

14

注意:子网说到底其实是对网络的划分,而不是对主机和路由器这些设备的划分,个人认为上图的蓝色部分如果不把主机包括进去反而更好理解。

(3)IP地址分类

IPv4地址的分类指的是将整个IPv4地址空间划分为大小不等的5块,对应于A类、B类、C类、D类、E类IPv4地址,其中,A、B、C三类地址是单播地址,占据了绝大部分;D类地址是多播地址(Multicast address);E类地址是保留地址,用于实验或在将来使用。

15

地址分类的区分依靠前几个比特,若第一位为0,则该地址为A类,否则判断第二位;若第二位为0,则该地址为B类地址,否则判断第三位,依此类推。

IPv4分类编址则是在分类的基础上,将A、B、C三类地址都分成固定长度的网络号和主机号,三类地址的网络号长度分别为一、二、三字节(包含前面用于区分类别的比特)。由此我们可以得出,A类地址空间被划分为2的7次方个地址块,每个地址块包含2的24次方个IP地址(但是主机号全为0和全为1的为特殊地址,一般不作分配),其他类型地址同理。

部分IPv4地址具有特殊用途,我们称之为特殊地址

  • 网络地址:主机号全0,是一个地址块的首地址,表示网络本身,不分配给主机。

  • 本网某个特定的主机地址:网络号全0,表示本网络某台主机,如0.0.103.123

  • 直接广播地址:主机号全1,是一个地址块的末尾地址。广播是指将分组发送给网络中的所有主机。

  • 全0地址:可以表示整个网络所有主机。

  • 全1地址:称为受限广播地址,受限指路由器拦截广播分组扩散到其他网络,只能在局域网内广播。

  • 回环地址:用于本地软件的测试的地址块,范围是127.0.0.0~127.255.255.255,以任一回环地址为目的的分组都不会离开本机,传输到网络层时会直接返回。

  • 专用网址:局域网内部私有地址。私有地址可重复使用,不违背IP地址的全局唯一性。经过路由器NAT地址转换,私有地址将被隐藏在内部网络中,后面将详细讲NAT。

(4)CIDR与子网掩码

CIDR,即无类域间路由(Classless InterDomain Routing) 中,不再将IP地址分为A类B类等,允许子网掩码在任意位置划分,格式为a.b.c.d/x,其中x是地址中子网号的长度。

16

图中网络号为23位,主机号为9位,子网掩码(subnet mask) 的前23位为1,其余为0。因此我们将子网掩码与IP地址按位做与操作,就会得到该IP地址的网络号。

子网掩码的另一种表达方式就是 /#,例如图中的/23就表示前23个比特为子网部分。

而原始的A、B、C类网络的子网掩码分别是

  • A:255.0.0.011111111 00000000 00000000 00000000

  • B:255.255.0.011111111 11111111 00000000 00000000

  • C:255.255.255.011111111 11111111 11111111 00000000

(5)转发表和转发算法

转发表中主要包括四项:目的子网号、子网掩码、下一跳、接口。

17

表的最后一项是默认路由(Default),当没有找到明确的匹配项时,将会匹配这一项。

网络中数据报的转发

当路由器转发数据报时,主机号部分在路由表查询时没有意义。路由器根据子网进行匹配和查找路由表,而不是基于具体的IP地址,因为以IP地址为单位进行路由信息通告和计算代价过大。只有只有当数据报到达最后一跳路由器时,该路由器已经在目标子网内,才需要使用主机号来定位并转发给目标主机。在之前的路由过程中,所有路由器只关心网络部分。正因为这种通过多个网络逐跳传递数据的方式,我们称互联网为“网络的网络”。

4.地址的获取

(1)获取一块地址

在了解主机如何从组织的地址块中分配到自己的地址之前,我们先探讨一下组织的地址块是如何获取的。

第一种方法是网络管理员与自己的ISP(因特网服务提供商)提出申请,然后该ISP从自己的地址块中划分出一块提供给申请的组织。

看到这我们不免会想:ISP的地址块又是从哪来的呢?

第二种方法便是由因特网名字和编号分配机构(Internet Corporation for Assigned Names and Numbers,ICANN)[ICANN 2016] 进行管理分配。

ICANN是一个非营利的组织,具有管理IP地址空间并向各ISP和其他组织分配地址块的最终责任。除了分配地址外,它还负责管理DNS根服务器,分配域名和解决域名冲突。

(2)层次编址和路由聚集

20

以上图为例,ISP将8个组织连接到因特网,其只需要对外界通告:向它发送以200.23.16.0/20开始的任何东西即可。外界的其他部分不需要知道地址块200.23.16.0/20在内部还被划分成了其他八个子网。这种使用单个网络前缀通告多个网络的能力通常称为路由聚合(route aggregation)

这个例子也说明了仔细分配CIDR化的地址有利于路由选择的道理。但如果地址不是按这样的层次方式分配时,会出现什么情况呢?

21

在这张图中,组织1的地址块被分配到了另一个ISP。原ISP对外界的通告保持不变,另一个ISP只需要向外通告对其发送以200.23.16.0/20开始的东西即可,这是一个到组织1更加具体的路由。外界向组织1发送内容时,会根据最长前缀匹配原则,选择第二个ISP。

(3)获取主机地址:动态主机配置协议

主机想要从组织里获取一个IP地址也有两种方式。第一种方式是静态 IP 地址分配,即由网络管理员手动修改配置文件,为每个主机配置一个唯一的 IP 地址。这种方式虽然稳定且便于精细化管理,但却有着很高的维护成本。

目前采用的更多是第二种方法,即动态主机配置协议(Dynamic Host Configuration,DHCP)DHCP是基于UDP的应用层协议,负责IP地址的集中管理和自由分配

DHCP允许主机自动获取一个 IP 地址。网络管理员能够配置 DHCP,使某给定主机每次与网络连接时能得到一个相同的IP地址,或者某主机将被分配一个临时的IP地址(temporary IP address),每次与网络连接时该地址也许是不同的。由于DHCP这种即插即用的自动分配 IP 地址的能力,故又被成为即插即用协议(plug-and-play protocol) 或零配置(zeroconf)协议。

除了主机IP地址分配外,DHCP还会发送一些其他的信息,如子网掩码,默认网关(第一跳路由器的IP地址),本地DNS服务器的地址等。

我们以下图为例详细介绍DHCP的工作流程:

18

DHCP是一个客户-服务器协议,客户是新到达的主机,请求包括自身使用的IP地址在内的网络配置信息。图中有一台连接到子网223.1.2/24的DHCP服务器,虽然剩下的两个子网虽然没有自己的DHCP服务器,但可以由图中的路由器作为DHCP中继代理,为另外两个子网上的客户提供DHCP服务。

对于一个新到达的主机,DHCP协议的工作流程可以分为以下四步:

DHCP服务器发现:新接入网络的主机会尝试获取 IP 地址,它会向网络发送一个DHCP发现报文(DHCP discover message)。该报文是广播报文,目的是寻找网络中可用的 DHCP 服务器。由于主机在初始阶段还没有 IP 地址,所以报文是从源 IP 0.0.0.0 广播到目的 IP 255.255.255.255。这个过程使 DHCP 服务器得知有新设备需要分配 IP 地址。

DHCP服务器提供:DHCP服务器收到一个DHCP发现报文时,会从其可用的 IP 地址池中选取一个地址,并用**DHCP提供报文(DHCP offer message)**向客户做出回应,告知主机它可以使用这个 IP 地址,该报文依旧使用IP广播地址255.255.255.255。除了提供的IP地址外,该报文中还包括收到的发现报文的事务ID、网络掩码以及IP地址租用期(address lease time),即IP地址的有效时间量。

DHCP请求:新到达的客户从一个或多个服务器提供中选择一个,并向其发送DHCP请求报文(DHCP request message),来告知 DHCP 服务器它选择了哪个提供的 IP 地址。这个请求报文也可以用来更新、续订或释放之前分配的 IP 地址。

DHCP ACK:当 DHCP 服务器收到主机的请求报文后,会发送一个**DHCP确认报文(DHCP Acknowledgment Message)**给主机,告知其正式使用提供的 IP 地址及配置信息。

19

一旦客户收到DHCP ACK后,交互便完成了,该客户可以在租用期内使用DHCP分配的IP地址。

对于不是新到达的主机,即已经获得过IP地址并且租约尚未到期的主机,可以跳过DHCP流程中的前两步,直接发送DHCP请求报文给之前的DHCP服务器。只有在原来的DHCP服务器不可用或租约失效时,才会重新执行完整的DHCP四步流程。

DHCP提供报文也使用广播地址的原因

  1. 新主机没有获得正式的IP地址,无法对其进行定向的单播通信。
  2. 网络中可能有多个DHCP服务器在监听,它们可能会同时响应,并提供可用的IP地址。广播发送可以确保所有处于同一子网的客户端都能接收到DHCP服务器的提供信息,并且由客户端从中选择一个合适的服务器。

5.NAT:网络地址转换

(1)NAT介绍

网络地址转换(NAT,Network Address Translation) 是一种将一个网络的私有IP地址映射到另一个网络的公共IP地址,以实现内网主机与外部网络(如互联网)之间的通信的网络技术。

借助NAT技术,我们可以实现一块局域网内部的设备公共一个IP地址,而不需要从ISP分配一块地址。

22

上图是一个NAT模型,右方设备的内网IP地址在外网中是没有意义的,所有离开本地网络的数据报经过默认网关(即图中的路由器),源地址都会由私有IP地址转换为公共IP地址138.76.29.7(但是端口号不同,用于区分内网的不同设备),这个地址是一个在外网中有效的地址。

NAT技术的作用包括:

  • 降低成本,内网的所有设备在外部共用一个IP地址。

  • 增强网络的安全性,内网的设备没有明确的地址,对外不可见。

  • 提高IP地址的利用率,解决IPv4地址不足的问题。

(2)NAT转换表

从广域网到达NAT路由器的所有数据报也都具有相同的目的IP地址,为了区分该数据报应该被转发到哪个内部主机,我们在NAT路由器上引入了一张NAT转换表(NAT translation table),表项中包含了端口号以及IP地址。

23

我们以上图为例讲解NAT转换表的工作原理:

主机10.0.0.1128.119.40.186,80号端口发送数据报,该数据报的源地址为10.0.0.1,3345号端口,目标地址为128.119.40.186,80号端口。该数据报到达NAT路由器后,路由器将其源地址修改为此内网公用的IP地址,并选一个没有被占用的端口号来代表该内网主机,此时数据报的源地址为138.76.29.7,5001号端口。然后将这种映射关系记录在NAT转换表中。当NAT路由器收到广域网返回的响应数据报时,该数据报的目标地址为138.76.29.7,5001号端口。NAT路由器查找表项后发现,5001号端口对应的是内网的10.0.0.1,3345号端口。于是将数据报中的目标地址修改为10.0.0.1,3345号端口后,发送给对应内网主机。

(3)NAT穿透

在我上面的讨论中,都是由内网中的主机主动向外界联系。但由于内网的设备对外是不可见的,广域网的设备该如何主动联系到内网的设备呢?我们将这种情况称为NAT穿透(NAT traversal)问题。

解决方案1:静态配置NAT

预先在NAT路由器上配置好固定的映射规则,例如目标地址为138.76.29.7,5001号端口的数据报总是被转发到10.0.0.1,3345号端口。

解决方案2:UPnP协议

通用即插即用(Universal Plug and Play,UPnP)协议允许内网主机通过自动发现和交互来主动与网关设备进行通信,然后通过IGD协议(Internet Gateway Device Protocol) 增加、删除或修改相应的表项从而实现动态调整(IGD是UPnP架构的一部分)。

解决方案3:中继技术

中继技术中,内网的主机如果想要被外网联系,可以先与中继服务器建立连接。当外网的设备也与中继服务器建立连接后,中继服务器就可以作为桥梁实现外网设备向内网设备的主动连接。

6.IPv6

(1)IPv6的动机

一个新事物的诞生自然伴随着对旧事物的批判,IPv6的初始动机便是IPv4的32字节地址空间会很快被用完。此外,IPv4的数据报头部在转发过程中是会变化的(例如TTL字段等),每次都需要重新计算校验和;IPv4的分片功能也会加剧路由器的负担,尤其是互联网骨干的核心路由器。

在这些弊端的基础上,IPv6采用了128位的超长地址,同时设置了固定的40字节头部。此外IPv6的数据报在传输过程中不允许分片,路由器会直接将过大的分组抛弃,然后通过ICMPv6协议向源主机发送一个消息,告知其需要发送更小的分组。这大大降低了路由器的负担。

(2)IPv6数据报格式

24

IPv6的数据报格式如上图所示,具有固定的40字节头部,其中各字段的功能如下:

版本:占4比特,用于表示IP版本号,这里毫不意外地将值设置为6。

流量类型:占8比特,相当于IPv4的服务类型字段,用于区分优先级。

流标签:占20比特。流(flow)的概念一直没有被严格地定义。我们可以理解为同一个IP发出来的属于同一个会话的数据,可以为其打上同样的一个流标签,试图让网络对同一个流的数据做出同样的处理。

有效载荷长度:占16比特,该值作为一个无符号整数,给出了IPv6数据报中在定长的40字节数据报首部后面的字节数量。

下一个首部:占8比特,标识数据报中的内容需要交付给哪个协议(如TCP或UDP),使用与IPv4首部中协议字段相同的值。

跳限制:占8比特,转发数据报的每台路由器将对该字段的内容减1,如果跳限制计数达到了0,则该数据报将被丢弃。

(3)和IPv4相比的变化

IPv6相较于IPv4主要有以下几点变化和改进:

  • 校验和(checksum)被移除。因为链路层和传输层(如TCP和UDP)已经包含了校验和功能,IPv6不再重复验证,提高了数据报的处理速度。

  • 选择(Options)部分被移动到了头部之外。IPv6将所有可选字段放在了扩展头部中,并用下一个首部字段来指示是否存在扩展头部以及扩展头部的类型。

  • ICMPv4升级为ICMPv6,ICMPv6是IPv6中的控制报文协议,与IPv4中的ICMP类似,用于网络诊断和错误报告。但支持更多功能,如新增报文类型“Packet Too Big”,如果数据包超过了链路的MTU,路由器不会进行分片,而是丢弃数据包,并向源主机发送一个“Packet Too Big”报文,以通知其需要分片成更小的数据包。

  • 除了单播和多播外,IPv6还引入了一种称为任播地址(anycast address) 的新型地址,这种地址可以使数据报交付给一组主机中的任意一个(例如,如果有多个镜像服务器都包含相同的数据,用户发出请求时,可以通过任播地址将请求数据报交付给距离最近的镜像服务器,从而实现更高效的数据获取和减少网络延迟)。

(4)IPv4到IPv6的迁移

由于如今互联网的规模十分庞大,IPv4到IPv6的迁移只能循序渐进。这将不可避免的产生IPv4和IPv6路由器的混合,此时互联网的运转主要依靠于隧道(tunnel)

这里隧道的概念与我们传统意义上的隧道有一些区别,我们假定两个IPv6节点要使用IPv6数据报进行交互,但它们是经由中间IPv4路由器互联的,我们将两台IPv6路由器之间的IPv4路由器的集合称为一个隧道。借助于隧道,在隧道发送端的IPv6节点可将整个IPv6数据报放到一个IPv4数据报的数据字段中,运输过程中,中间的IPv4路由器将其当做正常的IPv4数据报进行运输。隧道接收端的IPv6节点最后收到该IPv4数据报,并确定其包含一个完整的IPv6数据报(通过观察IPv4数据报中的协议号字段是41)后,从中取出IPv6数据报,继续为其进行路由。

25

上图为IPv4数据报包裹IPv6数据报的结构图,类似于我们用船去运送汽车。

26

上图为隧道的逻辑视图与物理视图,隧道为IPv6的逐步普及提供了平滑的过渡方案。以后随着IPv6网络逐渐增多,依赖于隧道技术的场景会逐渐减少,IPv4反而称为一个个孤岛,看过《三体》同学可能会感觉这里很像四维空间向三维的跌落过程。

四、通用转发和SDN

1.传统方式与SDN方式的比较

在前面的内容中,我们所讲的都是传统方式,第二层交换机和第三层路由器等中间盒的剧增,而且每种都有自己特殊的硬件、软件和管理界面给许多网络操作管理带来了很大麻烦。而最新的软件定义网络(Software Defined Network,SDN) 通过将网络控制与数据转发分离,重新定义了网络的架构,为网络管理带来了灵活性和易用性。

前面提到,在传统方式中,路由器兼具路由和转发的功能。而在SDN方式中,控制平面被从每个网络设备中抽离出来,集中到一个或多个远程的SDN控制器上,路由器仅负责转发功能。

2.通用转发

传统的基于目的地转发可以总结为以下两步,即查找IP地址(“匹配”),然后将分组发送到有特定输出端口的交换结构(“动作”)。我们将这两个概念抽离出来,考虑一种更加标准通用的“匹配加动作”范式。

SDN网络中的“匹配”不仅限于传统网络中的目的地IP地址,它可以对协议栈中多层首部字段进行匹配,这些首部字段是与不同层次的不同协议相关联的。通过支持对多个首部字段进行匹配,SDN可以提供更精细化的流量控制,可以根据不同的条件来匹配特定的数据包流。

SDN网络中的“动作”包括将分组转发到一个或多个输出端口(就像在基于目的地转发中一样),跨越多个通向服务的离开接口进行负载均衡分组(就像在负载均衡中一样),重写首部值(就像在NAT中一样),有意识地阻挡/丢弃某个分组(就像在防火墙中一样)等等。

27

我们对通用转发的讨论都将OpenFlow(一个得到高度认可的成功标准)。“匹配加动作”转发表在OpenFlow中称为流表(flow table),它的每个表项包括:

  • 首部字段值的集合,匹配不上流表项的分组将被丢弃或发送到远程控制器做更多处理。

  • 计数器集合,当分组与流表项匹配时更新计数器。这些计数器可以包括已经与该表项匹配的分组数量,以及自从该表项上次更新以来的时间。

  • 当分组匹配流表表项时所采取的动作集合,这些动作可能将分组转发到给定的输出端口,丢弃该分组、复制该分组和将它们发送到多个输岀端口,或重写所选的首部字段等(功能要远多于传统方式)。

至于转发表(基于目标的转发)和流表(通用转发)是如何计算出来的,我们将在下一章控制平面继续讨论。