文章目录
前言
阅读本文前请注意最后编辑时间,文章内容可能与目前最新的技术发展情况相去甚远。欢迎各位评论与私信,指出错误或是进行交流等。
本文是关于《计算机网络:自顶向下方法(第七版)》的学习分享,内容书写顺序也是按照书中的顺序。本文并不会提及书中的所有内容,主要写重点的知识,以及自己感兴趣的内容。会对原文中的内容进行一定的精简,或者加上个人的理解。
网络层:数据平面
在前一章中我们学习了运输层依赖于网络层的主机到主机的通信服务,提供各种形式的进程到进程的通信。也许你现在想知道,这种主机到主机通信服务的真实情况是什么?是什么使得它工作起来的呢?在本章和下一章中,我们将学习网络层实际是怎样实现主机到主机的通信服务的。 我们将看到与运输层和应用层不同的是,在网络中的每一台主机和路由器中都有一个网络层部分。 正因如此,网络层协议是协议栈中最具挑战性(因而也是最有趣)的部分。
网络层在协议栈中毋庸置疑是最复杂的层次,因此我们将在这里用大量篇幅来讨论。因为涉及的内容太多,我们要用两章的篇幅来讨论网络层。 我们将看到网络层能够被分解为两个相互作用的部分,即数据平面和控制平面。数据平面功能,即网络层中每台路由器的功能,该数据平面功能决定到达路由器输入链路的数据报(即网络层的分组)如何转发到该路由器的输出链路。我们将涉及传统的IP转发和通用的转发,详细地学习 IPv4和IPv6 协议及其寻址。网络层的控制平面功能,即网络范围的逻辑,该控制平面功能控制数据报沿着从源主机到目的主机的端到端路径中路由器之间的路由方式。 我们将学习路由选择算法,以及路由选择协议。
网络层概述

上图显示了一个简单网络,其中有 H1和 H2 两台主机,在 H1与 H2之间的路径上有几台路由器。 假设H1 正在向 H2 发送信息,仅考虑这些主机与中间路由器的网络层所起的作用。 H1 中的网络层取得来自于 H1 运输层的报文段,将每个报文段封装成一个数据报,然后向相邻路由器R1 发送该数据报。 在接收方主机H2, 网络层接收来自相邻路由器R2 的数据报,提取出运输层报文段,并将其向上交付给H2 的运输层。每台路由器的数据平面的主要作用是从其输入链路向其输出链路转发数据报;注意 路由器不运行应用层和运输层协议。
转发和路由选择:数据平面和控制平面
网络层的作用从表面上看极为简单,即将分组从一台发送主机移动到一台接收主机。为此,需要使用两种重要的网络层功能:
- 转发。 当一个分组到达某路由器的一条输入链路时,该路由器必须将该分组移动到适当的输出链路。
- 路由选择。 当分组从发送方流向接收方时,网络层必须决定这些分组所采用的路由或路径。 计算这些路径的算法被称为路由选择算法
转发 是指将分组从一个输人链路接口转移到适当的输出链路接口的路由器本地动作。转发发生的时间很短(通常为几纳秒),因此通常用硬件来实现。
路由选择是指确定分组从源到目的地所采取的端到端路径的网络范围处理过程。路由选择发生的时间尺度长得多 (通常为几秒),因此通常用软件来实现。
用驾驶的例子进行类比,旅行者从宾夕法尼亚州到佛罗里达州的行程。 在这个行程中,驾驶员在到佛罗里达州的途中经过了许多立交桥。 我们能够认为转发就像通过单个立交桥的过程:一辆汽车从其道路上进人立交桥的一个入口,并且决定应当走哪条路来离开该立交桥。
路由选择看作是规划从宾夕法尼亚州到佛罗里达州行程的过程:在着手行程之前,驾驶员已经查阅了地图并在许多可能的路径中选择一条,其中每条路径都由一系列经立交桥连接的路段组成。
每台网络路由器中有一个关键元素是它的转发表。 路由器检查到达分组首部的一个或多个字段值,进而使用这些首部值在其转发表中索引,通过这种方法来转发分组。 这些值对应存储在转发表项中的值,指出了该分组将被转发的路由器的输出链路接口。
网络服务模型
在钻研网络层的数据平面之前,我们将以开阔的视野来专注于我们引入的新东西并考虑网络层可能提供的不同类型的服务。当位于发送主机的运输层向网络传输分组时(即在发送主机中将分组向下交给网络层),运输层能够指望网络层将该分组交付给目的地吗?当发送多个分组时,它们会按发送顺序按序交付给接收主机的运输层吗?发送两个连续分组的时间间隔与接收到这两个分组的时间间隔相同吗?网络层会提供关于网络中拥塞的反馈信息吗?对这些问题和其他问题的答案由网络层提供的服务模型所决定。 网络服务模型定义了分组在发送与接收端系统之间的端到端运输特性。这些服务可能包括:
- 确保交付。 该服务确保分组将最终到达目的地。
- 具有时延上界的确保交付。 该服务不仅确保分组的交付,而且在特定的主机到主机时延上界内(例如在100ms 内)交付
- 有序分组交付。 该服务确保分组以它们发送的顺序到达目的地。
- 确保最小带宽。
- 安全性。 网络层能够在源主机加密所有数据报并在目的地解密这些分组,从而对所有运输层报文段提供机密性。
然而,因特网的网络层提供了单一的服务,称为尽力而为服务。使用尽力而为服务,传送的分组既不能保证它们发送的顺序,也不能保证它们最终交付; 既不能保证端到端时延,也不能保证有最小的带宽。
路由器工作原理
我们将注意力转向网络层的转发功能,即实际将分组从一台路由器的入链路传送到适当的出链路。

上图显示了一个通用路由器体系结构的总体视图,标识了一台路由器的4个组件。
输入端口处理和基于目的地转发

上图显示了一个更详细的输入端口处理的视图。输入端口的线路端接功能与数据链路处理实现了用于各个输入链路的物理层和链路层。分组是从上一跳路由器或者主机传输到路由器的其中一条输入链路中的,先处理物理层方面的信息,随即交给数据链路层。经过线路端接和数据链路处理之后,包括协议处理和分组首部拆封得到网络层分组。随后路由器执行查找,路由器使用转发表来查找输出端口,使得到达的分组能经过交换结构转发到对应输出端口。转发表是由路由选择处理器计算和更新的。路由选择处理器使用路由选择协议与其他网络,路由器中的路由选择处理器进行交互,或者接收来自远程SDN控制器的转发表。
通过举例来说明查找大概是怎么进行的,一个人分组基于该分组的目的地址(32位IP地址)交换到输出端口。假设我们的路由器具有4条链路,编号0到3。分组以如下方式转发到链路接口:

或者我们对表项进行简化

路由器用分组目的地址的前缀与该表中的表项进行匹配;如果存在一个匹配项,则路由器向与该匹配项相关联的链路转发分组。 注意!一个目的地址可能与不止一个表项相匹配。当有多个匹配时,该路由器使用最长前缀匹配规则 ; 即在该表中寻找最长的匹配项,并向与最长前缀匹配相关联的链路接口转发分组。
一旦通过查找确定了某分组的输出端口,则该分组就能够发送进入交换结构。 如果来自其他输入端口的分组当前正在使用该交换结构, 分组必须要在输入端口处排队,并等待稍后被调度以通过交换结构。
交换
交换结构位于一台路由器的核心部位,因为正是通过这种交换结构,分组才能实际地从一个输入端口交换 (即转发) 到一个输出端口中。 交换可以用许多方式完成,如下图所示了三种交换技术。

- 经内存交换。最简单、最早的路由器是传统的计算机,在输入端口与输出端口之间的交换是在路由选择处理器的直接控制下完成的。输入与输出端口的功能就像在传统操作系统中的 I/O设备一样。一个分组到达一个输入端口时. 该端口会先通过中断方式向路由选择处理器发出信号。于是,该分组从输入端口处被复制到处理器内存中。 路由选择处理器则从其首部中提取目的地址,在转发表中找出适当的输出端口,并将该分组复制到输出端口的缓存中。
- 经总线交换。在这种方法中、 输入端口经一根共享总线将分组直接传送到输出端口,不需要路由选择处理器的干预。 通常按以下方式完成该任务:让输入端口为分组预先打上一个交换机内部标签,指示本地输出端口,使分组在总线上传送和传输到输出端口。 该分组能由所有输出端口收到,但只有与该标签匹配的端口才能保存该分组。 然后标签在输出端口被去除,因为其仅用于交换机内部来跨越总线。 如果多个分组同时到达路由器,每个位于不同的输出端口, 除了一个分组外所有其他分组必须等待,因为一次只有一个分组能够跨越总线,故路由器的交换带宽受总线速率的限制;
- 经互联网络交换。克服单一、共享式总线带宽限制的一种方法是,使用一个更复杂的互联网络。纵横式交换机就是一种由 2N条总线组成的互联网络, 它连接N个输入端口与 N个输出端口。每条垂直的总线在交叉点与每条水平的总线交叉,交叉点通过交换结构控制器能够在任何
时候开启和闭合。当某分组到达端口 A, 需要转发到端口 Y 时,交换机控制器闭合总线A 和Y交叉部位的交叉点,然后端口 A在其总线上发送该分组, 该分组仅由总线Y接收。注意到来自端口 B的一个分组在同一时间能够转发到端口 X, 因为 A 到Y和B到X的分组使用不同的输入和输出总线。 因此,与前面两种交换方法不同,纵横式网络能够并行转发多个分组。 然而,如果来自两个不同输入端口的两个分组其目的地为相同的输出端口,则一个分组必须在输入端等待。
输出端口处理

输出端口处理取出已经存放在输出端口内存中的分组并将其发送到输出链路上。
何处出现排队
下列情况是一目了然的:在输入端口和输出端口处都可以形成分组队列。排队的位置和程度(或者在输入端口排队,或者在输出端口排队)将取决于流量负载、交换结构的相对速率和线路速率。为随着这些队列的增长,路由器的缓存空间最终将会耗尽,并且当无内存可用千存储到达的分组时将会出现丢包。
-
输人排队
如果交换结构不能足够快得使所有到达分组通过它,在输入端口将出现分组排队,以等待通过交换结构传送到输出端口。
-
输出排队
如果交换结构传送速率 大于 输出线路速度, 分组必须排队(等待)经输出链路传输。当没有足够的内存来缓存一个入分组时,就必须做出决定:要么丢弃到达的分组,要么删除一个或多个巳排队的分组为新来的分组腾出空间。
分组调度
现在我们转而讨论排队的分组如何经输出链路传输的问题。
-
先进先出
如果链路当前正忙于传输另一个分组,到达链路输出队列的分组要排队等待传输。 如果没有足够的缓存空间来容纳到达的分组,队列的分组丢弃策略则确定该分组是否将被丢弃或者从队列中去除其他分组以便为到达的分组腾出空间。
-
优先权排队
在优先权排队规则下,到达输出链路的分组被分类放人输出队列中。

假如分组 1 、 3 和4 属于高优先权类,分组2 属于低优先权类。分组 1 、 3 和4 属于高优先权类,分组2 和5 属于低优先权类。 分组 1 到达并发现链路是空闲的,就开始传输。 在分组 1 的传输过程中,分组2和3 到达,并分别在低优先权和高优先权队列中排队。 在传输完分组 1 后,分组3 (一个高优先权的分组)被选择在分组2 (尽管它到达得较早,但它是一个低优先权分组)之前传输。 在分组3 的传输结束后,分组2开始传输。 分组4 (一个高优先权分组)在分组2 (一个低优先权分组) 的传输过程中到达。 不过分组2此时正在传输,分组4即使到达了也不打断分组2的传输,等传输完毕后 分组4再传输,这一情形符合非抢占式优先权排队规则。
-
循环和加权公平排队
网际协议: IPv4、寻址、 IPv6 及其他
在这节中,我们将关注点转向因特网网络层的IP协议。今天有两个版本的IP正在使用,广泛部署的 IP版本4、通常简单地称为 IPv4。IP 版本 6被提议替代 IPv4。
IPv4 数据报格式

IPv4 数据报中的关键字段如下:
- 版本(号)。这4 比特规定了数据报的 IP协议版本。通过查看版本号,路由器能够确定如何解释IP数据报的剩余部分。 不同的 IP版本使用不同的数据报格式。
- 首部长度。 因为一个 IPv4 数据报包含一些可变数量的选项,需要用这4 比特来确定 lP数据报首部的长度,以及数据荷载实际开始的地方。
- 服务类型。使不同类型的 IP数据报(例如, 一些特别要求低时延、高吞吐量或可靠性的数据报) 能相互区别开来。 例如,将实时数据报(如用于IP电话应用)与非实时流量(如 FTP) 区分开也许是有用的。 提供特定等级的服务是一个由网络管理员对路由器确定和配置的策略问题。
- 数据报长度。 这是IP数据报的总长度(首部加上数据),以字节计。
- 16比特标识、标志、 13比特片偏移。 与IP分片有关,IPv6不允许在路由器上对分组分片。
- 寿命(TTL)。用来确保数据报不会永远在网络中循环。 每当一台路由器处理数据报时,该字段的值减1 。 若TTL字段减为0, 则该数据报必须丢弃。
- 上层协议。该字段通常仅当IP数据报到达其最终目的地时才会有用。该字段值指示了IP 数据报的数据部分应交给哪个特定的运输层协议。例如,值为6 表明数据部分要交给TCP, 而值为 17 表明数据要交给 UDP。
- 首部检验和。首部检验和用于帮助路由器检测收到的 IP数据报中的比特错误。 首部检验和是这样计算的: 将首部中的每2个字节当作一个数,用反码算术对这些数求和。路由器要对每个收到的IP数据报计算其首部检验和,如果数据报首部中携带的检验和与计算得到的检验和不一致,则检测出差错。路由器一般会丢弃检测出错误的数据报。 注意到在每台路由器上必须重新计算检验和并再次存放到原处,因为TTL字段以及可能的选项字段会改变。
- 源和目的 IP 地址。当某源生成一个数据报时,它在源IP字段中插入它的 IP地址,在目的IP地址字段中插入其最终目的地的地址。 通常源主机通过DNS查找来决定目的地址
- 选项。选项字段允许IP首部被扩展,但很少使用。
- 数据(有效荷载)。包含要交付给目的地的运输层报文段 (TCP 或 UDP)。
IPv4 数据报分片
并不是所有链路层协议都能承载相同长度的网络层分组。有的协议能承载大数据报, 而有的协议只能承载小分组。例如,以太网帧能够承载不超过1500 字节的数据,而某些广域网链路的帧可承载不超过576 字节的数据。一个链路层帧能承载的最大数据量叫作最大传送单元(MTU)。因为每个 IP 数据报封装在链路层帧中从一台路由器传输到下一台路由器,故链路层协议的 MTU 严格地限制着IP数据报的长度。在发送方与目的地路径上的每段链路可能使用不同的链路层协议、且每种协议可能具有不同的 MTU。
假定从某条链路收到一个IP数据报,通过检查转发表确定出链路,并且该条出链路的 MTU 比该IP数据报的长度要小。需要将IP 数据报中的数据分片成两个或更多个较小的 IP数据报,用单独的链路层帧封装这些较小的 IP数据报,然后通过输出链路发送这些帧。每个这些较小的数据报都称为片,片在其到达目的地运输层以前需要重新组装。 TCP与 UDP都希望从网络层收到完整的、未分片的报文。
在路由器中重新组装数据报会给协议带来相当大的复杂性并且影响路由器的性能。为坚持网络内核保持简单的原则,数据报的重新组装工作放到端系统中,而不是放到网络路由器中。当一台目的主机从相同源收到一系列数据报时,它需要确定这些数据报中的某些是否是一些原来较大的数据报的片。 如果某些数据报是片的话,则它必须进一步确定何时收到了最后一片,并且如何将这些接收到的片拼接到一起以形成初始的数据报。为了让目的主机执行这些重新组装任务, IPv4 的设计者将标识、标志和片偏移字段放在IP数据报首部中。当生成一个数据报时,发送主机在为该数据报设置源和目的地址的同时贴上标识号。发送主机通常将它发送的每个数据报的标识号加 1。 当某路由器需要对一个数据报分片时, 形成的每个片具有相同的 初始数据报的源地址、目的地址与标识号。 目的地从同一发送主机收到一系列数据报时,它能够检查数据报的标识号以确定哪些数据报实际上是同一较大数据报的片。由于IP是一种不可靠的服务,一个或多个片可能永远到达不了目的地。 因为这种原因,为了让目的主机绝对地相信它已收到了初始数据报的最后一个片,最后一个片的标志比特被设为0、而所有其他片的标志比特被设为 1。 另外,为了让目的主机确定是否丢失了一个片(且能按正确的顺序重新组装片), 使用偏移字段指定该片应放在初始IP数据报的哪个位置。
IPv4 编址
我们现在将注意力转向IPv4编址。在讨论IP编址之前、我们需要简述一下主机与路由器连入网络的方法。 一台主机通常只有一条链路连接到网络;当主机想发送一个数据报时,它就在该链路上发送,主机与物理链路之间的边界叫作接口。路由器的任务是从链路上接收数据报并从输出链路转发出去,路由器必须拥有两条或更多条链路与它连接。路由器与它的任意一条链路之间的边界也叫作接口。每台主机与路由器都能发送和接收数据报, IP协议要求每台主机和路由器接口拥有自己的 IP地址。 因此、从技术上讲,一个 IP地址与一个接口相关联,而不是与包括该接口的主机或路由器相关联。
每个IP 地址长度为32 比特(等价为4 字节),这些地址通常按所谓点分十进制记法书写,即地址中的每个字节用它的十进制形式书写,各字节间以句点隔开。例如,IP地址193.32.216.9 ,193 是该地址的第一个 8 比特的十进制等价数, 32 是该地址的第二个 8 比特的十进制等价数,依次类推。 地址193.32.216.9 的二进制记法是:11000001 00100000 11011000 00001001

在全球因特网中的每台主机和路由器上的每个接口,都必须有一个全球唯一的 IP地址。上图提供了一个 IP编址与接口的例子,在该图中, 一台路由器(具有3 个接口)用于互联7 台主机。 图中左侧的 3 台主机以及它们连接的路由器接口,都有一个形如223. 1. 1. XXX 的 IP
地址。 这就是说,在它们的IP地址中,最左侧的24 比特是相同的。这4 个接口通过一个不包含路由器的网络互联起来(可能由一台以太网交换机互联,或者通过一个无线接入点互联)。用 IP 的术语来说,互联这3 个主机接口与 1 个路由器接口的网络形成一个子网。
IP 编址为这个子网分配一个地址223. 1. 1. 0/24 , 称为子网掩码指示 32 比特中的最左侧 24 比特定义了子网地址。任何其他要连到223. 1. 1. 0/24 网络的主机都要求其地址具有223. 1. 1. XXX 的形式。
一个子网的IP定义并不局限于连接多台主机到一个路由器接口的以太网段。

如上图所示,3 台通过点对点链路彼此互联的路由器。 每台路由器有3 个接口,每条点对点链路使用一个、 一个用于直接将路由器连接到一对主机的广播链路。除了主机与路由器组成的子网外,还有其他3 个子网: 223. 1. 9. 0/ 24, 用于连接路由器 R1 与 R2 的接口;223. 1.8.0/24, 用于连接路由器R2 与 R3 的接口; 223. 1. 7. 0/24, 用于连接路由器 R3 与 R1的接口。
从上述可以看出, 一个具有多个以太网段和点对点链路的组织将具有多个子网, 在给定子网上的所有设备都具有相同的子网地址。原则
上, 不同的子网具有完全不同的子网地址。 然而,在实践中,它们的子网地址经常有许多共同之处。
为了理解其中的道理,我们来关注在全球因特网中是如何处理编址的。因特网的地址分配策略被称为无类别域间路由选择(CIDR)。当使用子网寻址时, 32 比特的IP 地址被划分为两部分,形式为a. b. c. d/x 地址的前x比特构成了 IP 地址的网络部分,并且经常被称为该地址的前缀。一个组织通常被分配一块连续的地址,即具有相同前缀的一段地址。一个地址的剩余32-x 比特可认为是用于区分该组织内部设备的, 当该组织内部的l路由器转发分组时,才会考虑这些比特。此外,该组织内部可能还会有子网的存在。例如,假设某CIDR化的地址a,. b. c. d/21 的前 21 比特定义了该组织的网络前缀, 其余的 11 比特标识了该组织内的主机。该组织的内部可以采用最右边的 11比特在该组织中划分子网,例如a. b.c. d/24。
在CIDR 被采用之前, IP地址的网络部分(前缀)被限制为长度为8、 16 或24 比特,称为分类编址。具有 8 、 16 和24 比特子网地址的子网分别被称为A、 B 和C类网络。网络部分正好为 1、 2或3 字节的要求,在支持数量迅速增加的小规模或中等规模子网的组织方面出现了问题。一个C 类 (/24) 子网仅能容纳 254台主机,这对于许多组织来说太小了。然而一个B类 (/16) 子网可支持多达65534 台主机, 又太大了。例如,为具有 2000 台主机的组织分配一个 B 类地址,就具有足以支持多达65 534 个接口的地址空间,剩下的超过63000个地址却不能被其他组织使用。
此外,255.255.255.255为IP广播地址,当一台主机发出一个目的地址为255.255.255.255 的数据报时,该报文会交付给同一个网络中的所有主机。 路由器也会有选择地向邻近的子网转发该报文(虽然它们通常不这样做)。
-
获取一块地址
我们已经详细地学习了 IP编址, 还需要知道主机或子网最初是如何得到它们的地址的。我们先看一个组织是如何得到一个地址块的、 然后再看一个设备(如一台主机)是如何从某组织的地址块中分配到一个地址的。为了获取一块IP地址用于一个组织的子网内, 某网络管理员也许首先会与他的ISP联系,该ISP 可能会从它的更大地址块中提供一些地址。例如, 该ISP也许自己已被分配了地址块200.23. 16.0/20。 该 ISP 可以将该地址块分成8 个长度相等的连续地址块,为ISP 支持的组织分配这些地址块中的一块.如下所示。

从一个ISP获取一组地址是一种得到一块地址的方法,但这不是唯一的方法。 显然,必须还有一种方法供ISP本身得到一块地址。是否有一个全球性的权威机构, 它具有管理IP地址空间并向各ISP和其他组织分配地址块的最终责任呢?的确有一个! IP 地址由因特网名字和编号分配机构(ICANN)管理。非营利的 ICANN 组织 的作用不仅是分配 IP地址, 还管理DNS 根服务器。
-
获取主机地址:动态主机配置协议
某组织一旦获得了一块地址, 它就可为本组织内的主机与路由器接口逐个分配 IP地址。系统管理员可以手工配置路由器中的 IP地址,主机地址也能手动配置,但是这项任务目前更多的是使用动态主机配置协议(DHCP)来完成。DHCP 允许主机自动获取(被分配) 一个IP地址。 网络管理员能够配置DHCP, 使某主机每次与网络连接时能得到一个相同的IP地址, 或者某主机被分配一个临时的 IP地址 , 每次与网络连接时该地址也许是不同的。除了主机IP地址分配外, DHCP还允许一台主机得知其他信息,例如它的子网掩码、它的第一跳路由器地址 (常称为默认网关)与它的本地DNS 服务器的地址。
由于DHCP具有将主机连接进一个网络的网络相关方面的自动能力,故它又常被称为即插即用协议或零配置协议。 这种能力对于网络管理员来说非常有吸引力,否则他将不得不手工执行这些任务! DHCP还广泛地用于住宅因特网接入网、企业网与无线局域网中,其中的主机频繁地加入和离开网络。例如.考虑一个学生带着便携机从宿舍到图书馆再到教室,很有可能在每个位置这个学生将连接到一个新的子网,因此在每个位置都需要一个新的 IP地址。 DHCP是适合这种情形的理想方法,因为有许多用户来来往往,并且仅在有限的时间内需要地址。
DHCP 是一个客户-服务器协议, 客户通常是新到达的主机,它要获得自身使用的 IP 地址和网络配置信息。在最简单场合下,每个子网具有一台 DHCP 服务器。 如果在某子网中没有服务器,则需要一个DHCP 中继代理(通常是一台路由器),这个代理知逍用于该网络的DHCP服务器的地址,

上图显示了连接到子网223. 1. 2/24 的一台 DHCP 服务器,具有一台提供中继代理服务的路由器,它为连接到子网223. 1. 1 /24 和 223. 1. 3/24 的到达客户提供 DHCP 服务。对于一台新到达的主机(DHCP客户)而言,DHCP 协议是一个4个步骤的过程:
- DHCP 服务器发现。一台新到达的主机的首要任务是发现一个要与其交互的 DHCP服务器。这可通过使用DHCP发现报文来完成,客户在UDP 分组中向端口 67 发送该发现报文。该UDP分组封装在一个 IP数据报中。 但是这个数据报应发给谁呢?主机甚至不知道它所连接网络的IP地址,更不用说用于该网络的DHCP 服务器地址了。在这种情况下, DHCP客户生成包含DHCP发现报文的IP 数据报,其中使用广播目的地址255.255.255.255 并且使用"本主机"源 IP 地址 0. 0. 0. 0。DHCP 客户将该 fP 数据报传递给链路层,链路层然后将该帧广播到所有与该子网连接的节点
- DHCP 服务器提供。DHCP 服务器收到一个 DHCP 发现报文时,用 DHCP 提供报文向客户做出响应,该报文向该子网的所有节点广播, 仍然使用IP 广播地址255.255.255.255。 因为在子网中可能存在几个DHCP服务器,该客户也许会发现它处于几个服务器之间的位置。 每台服务器提供的报文包含有收到的DHCP发现报文的事务ID、向客户推荐的 IP 地址、 网络掩码以及 IP地址租用期 , 即 IP 地址有效的时间量。
- DHCP 请求。 新到达的客户从一个或多个服务器提供中选择一个,并向选中的服务器用 DHCP 请求报文进行响应,回显配置的参数。
- DHCP ACK。 服务器用 DHCP ACK 报文对DHCP请求报文进行响应, 证实所要求的参数。(如下图所示,yiaddr表示因特网地址,用于分配给新到达的客户)
一旦客户收到DHCP ACK后,交互便完成了,并且该客户能够在租用期内使用 DHCP分配的IP 地址。 因为客户可能在该租用期超时后还希望使用这个地址,所以 DHCP还提供了一种机制以允许客户更新它对一个lP地址的租用。

网络地址转换
讨论了有关因特网地址和IPv4数据报格式后,我们现在可清楚地认识到每个连接到网络的设备都需要一个 IP 地址。随着所谓小型办公室、家庭办公室子网的大量出现,看起来意味着每当一个 SOHO 想安装一个 LAN 以互联多台机器时, 需要ISP分配一组地址以供该SOHO 的所有 IP设备使用。 如果该子网变大了,则需要分配一块较大的地址。但如果ISP 巳经为 SOHO 网络的当前地址范围分配过一块连续地址该怎么办呢?有一种简单的方法越来越广泛地用在这些场合:网络地址转换(NAT)。

上图中央显示了一台能进行NAT的路由器的运行情况。该路由器右侧接口连接着一个家庭网络,在家庭网络内的编址其中的所有4个接口都具有相同的网络地址 10.0.0/24。这一IP属于专用网络的地址,例如数十万家庭网络都可以使用相同的地址空间 10. 0.0. 0/24。 在一个家庭网络内部中的设备能够使用 10.0.0.0/24 编址彼此发送分组。然而,转发到家庭网络之外进入更大的全球因特网的分组显然不能使用这些地址(或作为源地址,或作为目的地址),因为有数十万的家庭网络可能都使用着这IP地址。这就是说, 10.0.0.0/24 地址仅在给定的网络中才有意义。当向或从全球因特网发送或接收分组处理IP编址时,NAT派上了用场。
在上图中,所有离开家庭路由器流向更大因特网的报文都拥有一个源IP地址138.76.29. 7, 且所有进入家庭的报文都拥有同一个目的 IP 地址 138. 76.29. 7。 从NAT 使路由器对外界隐藏了家庭网络的细节。(另外,你也许想知道家庭网络计算机是从哪儿得到其地址,路由器又是从哪儿得到它的单一IP 地址的。 在通常的情况下,答案是相同的,即DHCP! 路由器从ISP 的 DHCP服务器得到它的地址、 并且路由器自身运行一个DHCP服务器,为路由器控制的家庭网络地址空间中的计算机提供地址。)
广域网到达NAT路由器的所有数据报都有相同目的IP地址(138.76.29.7),通过使用 NAT路由器上的一张 NAT转换表(表项中包含了端口号及其IP地址),该路由器知道它应将某个分组转发给哪个内部主机了。
将图中的所有步骤串联起来,假设一个用户坐在家庭网络主机 10. 0. 0. 1前 ,请求 IP地址为128.119.40.186 的某台 Web 服务器(端口 80)上的一个 Web 页面。主机 10.0. 0. 1 指定了(任意)源端口号3345 并将该数据报发送到 LAN 中。 NAT路由器收到该数据报、为该数据报生成一个新的源端口号5001 , 将源 IP 替代为其广域网一侧接口的 IP 地址138. 76.29. 7, 且将源端口 3345 更换为新端口 5001。NAT路由器生成一个新的源端口号时, 可选择任意一个当前未在 NAT转换表中的源端口号。路由器中的NAT在NAT转换表中增加该表项。Web服务器并不知道刚到达的包含HTTP请求的数据报已被NAT路由器进行了改装.它会发回一个响应报文,其目的地址是NAT 路由器的 lP地址、其目的端口是5001 。当该报文到达 NAT路由器时、路由器通过目的 IP 地址与目的端口号从 NAT 转换表中检索出家庭网络浏览器使用的IP地址( 10. 0. 0. 1 ) 和目的端口号 (3345) 。 于是,路由器重写该数据报的目的 IP 地址与目的端口号,并向家庭网络转发该数据报。
IPv6
在20 世纪90 年代早期,因特网工程任务组就开始致力于开发一种替代IPv4 的协议。该努力的首要动机是以下现实: 由于新的子网和 IP 节点以惊人的增长连接到因特网上,32 比特的 IP地址空间即将用尽。为了应对这种对IP地址空间的需求,开发了一种新的IP协议,即 IPv6。 IPv6 的设计者还利用这次机会,在IPv4积累的运行经验基础上新增和强化了IPv4。

- IPv6 数据报格式
如上图所示,IPv6 中引入的最重要的变化显示在其数据报格式中:
- 扩大的地址容量。 IPv6 将 IP 地址长度从32 比特增加到 128 比特。 这就确保全世界将不会用尽IP地址。
- 流标签。 IPv6 有一个难以捉摸的流定。该字段可用于"给属于特殊流的分组加上标签,这些特殊流是发送方要求进行特殊处理的流。例如, 音频与视频传输就可能被当作一个流。
以下是在IPv6 中定义的首部字段。 - 版本。 该4 比特字段用于标识 IP版本号。
- 流量类型。 该8 比特字段与我们在IPv4 中看到的TOS字段的含义相似
- 流标签。 如上面讨论过的那样,该20 比特的字段用于标识一条数据报的流,能够对一条流中的某些数据报给出优先权,或者它能够用来对来自某些应用(例如 lP话音)的数据报给出更高的优先权,以优千来自其他应用(例如SMTP 电子邮件)的数据报。
- 有效载荷长度。该16 比特值作为一个无符号整数,给出了IPv6数据报中跟在定长的40 字节数据报首部后面的字节(数据)数量。
- 下一个首部。该字段标识数据报中的内容(数据字段)需要交付给哪个协议(如TCP 或 UDP) 。 该字段使用与 IPv4 首部中协议字段相同的值。
- 跳限制。 转发数据报的每台路由器将对该字段的内容减 1。 如果跳限制计数达到0, 则该数据报将被丢弃.
- 源地址和目的地址。
- 数据. 这是 IPv6 数据报的有效载荷部分
对比IPv4 数据报格式,我们就会注意到,部分字段在 IPv6 数据报中已不复存在:
- 分片/重新组装。 IPv6 不允许在中间路由器上进行分片与重新组装。 这种操作只能在源与目的地执行。如果路由器收到的IPv6 数据报因太大而不能转发到出链路上的话,则路由器只需丢掉该数据报,并向发送方发回一个 "分组太大"的 ICMP差错报文即可。于是发送方能够使用较小长度的 IP数据报重发数据。分片与重新组装是一个耗时的操作,将该功能从路由器中删除并放到端系统中,大大加快了网络中的IP转发速度。
- 首部检验和。 因为因特网层中的运输层(如TCP与 UDP) 和数据链路层(如以太网)协议执行了检验操作, IP设计者大概觉得在网络层中具有该项功能实属多余,所以将其去除。再次强调的是、快速处理分组是关注的重点。
- 选项。 选项字段不再是标准首部的一部分了。 但它并没有消失,而是可能出现在 IPv6 首部中由"下一个首部"指出的位置上。
- 从 IPv4 到 IPv6 的迁移
我们考虑一个非常实际的问题: 基于IPv4的公共因特网如何迁移到IPv6呢?虽然新型 IPv6系统可做成向后兼容,即能发送、路由和接收lPv4数据报、但已部署的具有IPv4 能力的系统却不能够处理IPv6 数据报。
在实践中已经得到广泛采用的 IPv4 到 IPv6 迁移的方法是建隧道。建隧道依据的基本思想如下: 假定两个IPv6 节点要使用 IPv6数据报进行交互,但它们是经由中间 IPv4 路由器互联的。 我们将两台 IPv6 路由器之间的中间 IPv4 路由器的集合称为一个隧道。在隧道发送端的 IPv6 节点,将整个 IPv6 数据报放到一个 IPv4 数据报的数据(有效载荷)字段中。该IPv4 数据报的地址指向隧道接收端的 IPv6 节点,隧道中的中间 IPv4 路由器在它们之间为该数据报提供路由,就像对待其他数据报一样,完全不知道该IPv4 数据报自身就含有一个完整的IPv6 数据报。隧道接收端的 lPv6 节点最终收到该 IPv4 数据报,并确定该IPv4 数据报含有一个 IPv6 数据报(通过观察在IPv4 数据报中的协议号字段是41)。从中取出 IPv6 数据报,然后再为该 IPv6 数据报提供路由,就好像它是从一个直接相连的 IPv6 邻居那里接收到该IPv6数据报一样。
通用转发和 SDN
我们注意到因特网路由器的转发由分组的目的地址所决定。我们也已经看到许多中间盒有了大量发展,例如NAT重写IP地址和端口号;防火墙基于首部字段值阻拦流量或重定向分组以进行其他处理;负载均衡器将请求某种给定服务的分组转发到提供该服务的服务器集合中的一个。
交换机和路由器等中间盒的剧增,而且每种都有自己特殊的硬件、软件和管理界面,无疑给许多网络操作员带来了十分头疼的大麻烦。然而,近期软件定义网络的进展已经预示并且正在提出一种统一的方法,以一种现代、简洁和综合方式,提供多种网络层功能以及某些链路层功能。
将路由器转发总结为两个步骤:查找目的IP地址 (匹配),然后将分组发送到对应输出端口的交换结构(动作)。我们现在考虑一种更有意义的通用"匹配加动作"范式,其中能够对协议栈的多个首部字段进行"匹配",这些首部字段是与不同层次的不同协议相关联的。 "动作"能够包括:将分组转发到一个或多个输出端口(就像在基于目的地转发中一样),跨越多个接口进行负载均衡分组(就像在负载均衡中一样),重写首部值(就像在NAT中一样),有意识地阻挡/丢弃某个分组(就像在防火墙中一样), 等等。

上图显示了位于每台分组交换机中的一张匹配加动作表,(这里的分组交换机不是第三层路由器或第二层交换机)。每台分组交换机中有一张匹配加动作表,该表由远程控制器计算、安装和更新。通用转发的基于OpenFlow协议,它是一个得到高度认可和成功的标准。匹配加动作转发表在OpenFlow 中称为流表, 它的每个表项包括:
- 首部。首部宇段值的集合,入分组将与之匹配。与基于目的地转发的情况一样,由硬件进行匹配,匹配不上流表项的分组将被丢弃或发送到远程控制器做更多处理。
- 计数器集合。 (当分组与流表项匹配时更新计数器) 这些计数器可以包括已经与该表项匹配的分组数量, 以及自从该表项上次更新以来的时间
- 当分组匹配流表项时所采取的动作集合。 这些动作可能将分组转发到给定的输出端口,丢弃该分组、复制该分组和将它们发送到多个输出端口,和重写所选的首部字段。
匹配

图中显示了 11 个分组首部字段和入端口 ID,该 ID 能被 OpenFlow 1. 0 中的匹配加动作规则所匹配。到达一台分组交换机的一个链路层(第二层) 帧将包含一个网络层(第三层)数据报作为其有效载荷,该载荷通常依次将包含一个运输层(第四层)报文段。OpenFlow 的匹配允许对来自三个层次的协议首部所选择的字段进行匹配。
动作
每个流表项都有零个或多个动作列表,这些动作决定了与流表项匹配的分组的处理。 如果有多个动作,它们以在表中规定的次序执行。其中最为重要的动作可能是:
- 转发。一个入分组可以转发到一个输出端口,广播到所有端口,或通过所选的端口集合进行多播。该分组可能被封装并发送到用于该设备的远程控制器。控制器则可能或不对该分组采取某些动作,包括安装新的流表项,以及可能将该分组返回给该设备以在更新的流表规则集合下进行转发。
- 丢弃。 没有动作的流表项表明某个匹配的分组应当被丢弃。
- 修改字段。
参考目录
书籍:《计算机网络:自顶向下方法(第七版)》