1. 到目前为止,我们在第4章中对网络层的研究-网络层的数据和控制平面组件的概念,转发和路由之间的区别,各种网络服务模型的识别,以及我们对路由器的了解-通常没有参考任何特定的计算机网络体系结构或协议。在本节中,我们将重点介绍当今Internet和著名的Internet协议(IP)上的网络层的关键方面。<br />目前使用的IP有两个版本。我们将首先研究广泛部署的IP协议版本4,在4.3.1节中通常简称为IPv4[RFC 791]。我们将在4.3.4节中研究IP版本6[RFC 2460RFC 4291],它已被提议用来取代IPv4。在此期间,我们将主要讨论Internet编址--这个主题可能看起来相当枯燥和注重细节,但我们将看到这一主题对于理解Internet的网络层是如何工作的至关重要。掌握IP编址就是掌握互联网的网络层本身!

4.3.1 IPv4数据报格式 IPv4 Datagram Format

回想一下,Internet的网络层数据包称为数据报。我们从概述IPv4数据报的语法和语义开始学习IP。您可能会认为,没有什么比数据包位的语法和语义更枯燥的了。然而,数据报在Internet中扮演着核心角色-每个网络专业的学生和专业人员都需要看到它、吸收它并掌握它。(要了解协议头确实可以很有趣地学习,请查看[Pmeranz 2010])。IPv4数据报格式如图4.17所示。IPv4数据报中的关键字段如下:

  • 版本号(Version number)。这4位指定数据报的IP协议版本。通过查看版本号,路由器可以确定如何解释IP数据报的其余部分。不同版本的IP使用不同的数据报格式。IPv4的数据报格式如图4.17所示。新版本IP(IPv6)的数据报格式将在第4.3.4节中讨论。

image.png
Figure 4.17 ♦ IPv4 datagram format
图4.17♦IPV4数据报格式

  • 首部长度(Header length)。由于IPv4数据报可以包含可变数量的选项(包括在IPv4数据报首部中),因此需要这4位来确定IP数据报中的有效负载(例如,封装在该数据报中的传输层数据段)实际开始的位置。大多数IP数据报不包含选项,因此典型的IP数据报有一个20字节的首部。
  • 服务类型(Type of service)。服务类型(TOS)位包括在IPv4首部中,将允许不同类型的IP数据报彼此区分。例如,将实时数据报(诸如由IP电话应用使用的那些数据报)与非实时业务(例如FTP)区分开来可能是有用的。要提供的特定服务级别是由网络管理员为该路由器确定和配置的策略问题。我们还在3.7.2节中了解到,其中两个TOS位用于显式拥塞通知。
  • 数据报长度(Datagram length)。这是IP数据报(首部加上数据)的总长度,以字节为单位。由于此字段为16位长,因此IP数据报的理论最大大小为65,535字节。但是,数据报很少会超过1500字节,这使得IP数据报可以容纳在最大大小以太网帧的有效载荷字段中。
  • 标识符、标志、分片偏移量(Identifier, flags, fragmentation offset)。这三个字段与所谓的IP分片(fragmentation)有关,当一个大的IP数据报被分成几个较小的IP数据报,然后这些较小的IP数据报被独立地转发到目的地,在那里它们在它们的有效负载数据(见下文)被向上传递到目的地主机的传输层之前被重新组装。有趣的是,新版本的IP,IPv6,不允许分片。我们不会在这里讨论分片;但是读者可以在网上找到详细的讨论,在本书早期版本的“退休”材料中。
  • 生存时间(Time-to-live)。包括生存时间(time-to-live,TTL)字段是为了确保数据报不会在网络中永远循环(例如,由于长时间的路由环路)。路由器每次处理数据报时,此字段减1。如果TTL字段为0,路由器必须丢弃该数据报。
  • 协议(Protocol)。此字段通常仅在IP数据报到达其最终目的地时使用。此字段的值指示此IP数据报的数据部分应传递到的特定传输层协议。例如,值6表示将数据部分传递给TCP,而值17表示将数据传递给UDP。有关所有可能值的列表,请参阅[IANA Protocol Numbers 2016]。请注意,IP数据报中的协议号的作用类似于传输层段中端口号字段的作用。协议号是将网络层和传输层捆绑在一起的粘合剂,而端口号是将传输层和应用层捆绑在一起的粘合剂。我们将在第6章中看到,链路层帧也有一个将链路层绑定到网络层的特殊字段。
  • 首部校验和(Header checksum)。首部校验和帮助路由器检测接收到的IP数据报中的比特错误。首部校验和是通过将首部中的每个2字节视为一个数字并使用1s补码算术对这些数字求和来计算的。如3.3节所述,此和的1补码(称为Internet校验和)存储在校验和字段中。路由器为每个接收到的IP数据报计算首部校验和,并且如果数据报首部中携带的校验和不等于计算的校验和,则检测到错误条件。路由器通常会丢弃检测到错误的数据报。请注意,必须在每台路由器上重新计算并存储校验和,因为TTL字段(可能还有选项字段)会发生变化。关于计算Internet校验和的快速算法的一个有趣的讨论是[RFC1071]。此时经常被问到的一个问题是,为什么TCP/IP同时在传输层和网络层执行错误检查?这种重复有几个原因。首先,请注意,只有IP首部在IP层进行校验和,而TCP/UDP校验和是在整个TCP/UDP数据段上计算的。其次,TCP/UDP和IP不必都属于同一协议栈。原则上,TCP可以在不同的网络层协议(例如ATM[Black 1995])上运行,而IP可以携带不会传递给TCP/UDP的数据。
  • 源和目的IP地址(Source and destination IP addresses)。当源创建数据报时,它会将其IP地址插入源IP地址字段,并将最终目的地址插入目的IP地址字段。源主机通常通过DNS查找确定目的地址,如第2章所述。我们将在4.3.2节中详细讨论IP编址。
  • 选项(Options)。选项字段允许扩展IP首部。首部选项本来很少使用,因此决定通过不在每个数据报首部的选项字段中包含信息来节省开销。然而,选项的存在确实使问题变得复杂-因为数据首部可以是可变长度的,所以人们不能预先确定数据字段将从哪里开始。此外,由于某些数据报可能需要选项处理,而其他数据报可能不需要,因此在路由器上处理IP数据报所需的时间可能会有很大差异。这些注意事项对于高性能路由器和主机中的IP处理尤为重要。由于这些和其他原因,IP选项未包括在IPv6首部中,如第4.3.4节所述。
  • 数据(有效负载)(Data (payload))。最后,我们来看最后一个也是最重要的字段—首先说明数据报存在的理由!在大多数情况下,IP数据报的数据字段包含要传送到目的地的传输层段(TCP或UDP)。但是,数据字段可以携带其他类型的数据,例如ICMP消息(在第5.6节中讨论)。

请注意,IP数据报总共有20字节的首部(假设没有选项)。如果数据报携带TCP数据段,则每个数据报总共携带40字节的首部(20字节的IP首部加上20字节的TCP首部)以及应用层消息。

4.3.2 IPv4编址 IPv4 Addressing

现在我们将注意力转向IPv4编址。虽然您可能认为编址必须是一个直截了当的主题,但希望在本节结束时您会确信,Internet编址不仅是一个有趣、微妙和有趣的主题,而且对Internet至关重要。在[Stewart 1999]的第一章中可以找到有关IPv4编址的出色论述。
但是,在讨论IP编址之前,我们需要简单介绍一下主机和路由器是如何连接到Internet的。一台主机通常只有一条连接到网络的链路;当主机中的IP想要发送数据报时,它会通过此链路发送数据报。主机和物理链路之间的边界称为接口(interface)。现在考虑一台路由器及其接口。因为路由器的工作是在一条链路上接收数据报,并在另一条链路上转发数据报,所以路由器必须连接两条或多条链路。路由器与其任何一条链路之间的边界也称为接口。因此,路由器有多个接口,每个接口对应于它的每条链路。因为每台主机和路由器都能够发送和接收IP数据报,所以IP要求每个主机和路由器接口都有自己的IP地址因此,从技术上讲,IP地址与接口相关联,而不是与包含该接口的主机或路由器相关联。
每个IP地址是32位长(相当于4个字节),因此总共有232个(或大约40亿)可能的IP地址。这些地址通常以所谓的点分十进制记法(dotted-decimal notation)写入,其中地址的每个字节都以其十进制形式写入,并且与地址中的其他字节用句点(点)隔开。例如,考虑IP地址193.32.216.9。193是地址的前8位的十进制等价值;32是地址的后8位的十进制等价值,依此类推。因此,二进制表示法中的地址193.32.216.9为
11000001 00100000 11011000 00001001
全球互联网中每台主机和路由器上的每个接口都必须具有全球唯一的IP地址(NAT后面的接口除外,如第4.3.3节所述)。然而,这些地址不能随意选择。接口的IP地址的一部分将由其所连接的子网确定。
图4.18提供了IP编址和接口的示例。在此图中,一台路由器(有三个接口)用于互连七台主机。请仔细查看分配给主机和路由器接口的IP地址,因为有几点需要注意。图4.18左上角的三台主机及其连接的路由器接口的IP地址均为223.1.1.xxx。也就是说,它们的IP地址都具有相同的最左边的24位。这四个接口还通过不包含路由器的网络相互连接。该网络可以通过以太网LAN(Ethernet LAN)互连,在这种情况下,接口将通过以太网交换机(Ethernet switch,我们将在第6章中讨论)或无线接入点(wireless access point,我们将在第7章中讨论)进行互连。目前,我们将把连接这些主机的无路由器网络表示为云,并在第6章和第7章深入研究此类网络的内部结构。
image.png
Figure 4.18 ♦ Interface addresses and subnets
图4.18♦接口地址和子网
在IP术语中,该网络互连三个主机接口和一个路由器接口,形成一个子网(subnet)[RFC 950]。(子网在互联网文献中也称为IP网络或简称为网络。)。IP编址为该子网分配一个地址:223.1.1.0/24,其中/24(“斜杠-24”)符号(有时称为子网掩码(subnet mask))表示32位数量的最左边24位定义子网地址。因此,223.1.1.0/24子网由三个主机接口(223.1.1.1、223.1.1.2和223.1.1.3)和一个路由器接口(223.1.1.4)组成。连接到223.1.1.0/24子网的任何其他主机都需要具有223.1.1.xxx格式的地址。图4.18中显示了另外两个子网:223.1.2.0/24网络和223.1.3.0/24子网。图4.19显示了图4.18中显示的三个IP子网。
image.png
Figure 4.19 ♦ Subnet addresses
图4.19♦子网地址
子网的IP定义不限于将多台主机连接到路由器接口的以太网网段。为了深入了解这里的情况,请看图4.20,图中显示了通过点对点链路相互连接的三台路由器。每台路由器有三个接口,一个用于每个点对点链路,一个用于直接将路由器连接到一对主机的广播链路。这里有哪些子网?223.1.1.0/24、223.1.2.0/24和223.1.3.0/24这三个子网与我们在图4.18中遇到的子网相似。但请注意,本例中还有另外三个子网:一个子网223.1.9.0/24用于连接路由器R1和R2的接口;另一个子网223.1.8.0/24用于连接路由器R2和R3的接口;第三个子网223.1.7.0/24用于连接路由器R3和R1的接口。对于路由器和主机的一般互联系统,我们可以使用以下配方来定义系统中的子网:

要确定子网,请将每个接口与其主机或路由器分离,从而创建隔离网络孤岛,其中接口终止于隔离网络的端点。这些隔离网络中的每一个都称为一个子网(subnet)

image.png
Figure 4.20 ♦ Three routers interconnecting six subnets
图4.20♦三台路由器互连六个子网
如果我们将此过程应用于图4.20中的互连系统,则会得到六个岛或子网。
从上面的讨论可以清楚地看出,具有多个以太网段和点对点链路的组织(如公司或学术机构)将有多个子网,给定子网上的所有设备都具有相同的子网地址。原则上,不同的子网可以有完全不同的子网地址。然而,在实践中,它们的子网地址通常有很多共同之处。为了理解其中的原因,接下来让我们将注意力转向全球互联网中如何处理编址。
Internet的地址分配策略称为无类域间路由(Classless Interdomain Routing,CIDR发音为cider)[RFC 4632]。CIDR概括了子网编址的概念。与子网编址一样,32位IP地址分为两个部分,同样采用点分十进制形式A.B.C.D/x,其中x表示地址第一部分的位数。
A.B.C.D/x格式的地址的x个最高有效位构成IP地址的网络部分,通常称为地址的前缀(prefix,或网络前缀)。组织通常会分配一个连续地址块,即具有共同前缀的地址范围(请参阅Principles in Practice feature)。在这种情况下,组织内设备的IP地址将共享通用前缀。当我们在5.4节中介绍Internet的BGP路由协议时,我们将看到组织网络之外的路由器只考虑这x个前导前缀位。也就是说,当组织外部的路由器转发目的地址在组织内部的数据报时,只需要考虑地址的前x位。这大大减小了这些路由器中转发表的大小,因为A.B.C.D/x格式的单个条目就足以将数据包转发到组织内的任何目的地。
地址的其余32-x位可以视为组织内的设备之间的区别,所有这些设备都具有相同的网络前缀。这些是在组织内的路由器上转发数据包时需要考虑的位。这些较低阶位可以(也可以不)具有附加的子网划分结构,例如上面讨论的结构。例如,假设CIDR化地址A.B.C.D/21的前21位指定了组织的网络前缀,并且对该组织中所有设备的IP地址都是通用的。然后,剩下的11位标识组织中的特定主机。如上所述,组织的内部结构可能是这样的,即这11个最右边的位用于组织内的子网划分。例如,A.B.C.D/24可能指的是组织内的特定子网。
在采用CIDR之前,IP地址的网络部分长度被限制为8位、16位或24位,这是一种称为有类编址(classful addressing)的编址方案,因为具有8位、16位和24位子网地址的子网分别称为A类、B类和C类网络。IP地址的子网部分长度必须恰好为1、2或3个字节的要求,对于支持数量迅速增加的具有中小型子网的组织来说是有问题的。一个C(/24)类子网最多只能容纳28 - 2 = 254台主机(28 = 256个地址中有两个保留用于特殊用途),这对于许多组织来说太小了。但是,最多支持65,634台主机的B类(/16)子网太大。在有类编址下,假设有2,000台主机的组织通常会被分配一个A类(/8)子网地址。这导致A类地址空间迅速耗尽,分配的地址空间利用率较低。例如,为其2,000台主机使用B类地址的组织分配了足够的地址空间,最多可容纳65,534个接口-剩下63,000多个地址无法被其他组织使用。

PRINCIPLES IN PRACTICE 实践中的原则 这个将八个组织连接到Internet的ISP示例很好地说明了仔细分配的CIDR化地址如何促进路由。如图4.21所示,假设ISP(我们将其称为Fly-by-Night-ISP)向外部世界通告应该发送其前20个地址位与200.23.16.0/20匹配的任何数据报。世界其他地方不需要知道在地址块200.23.16.0/20内实际上还有8个其他组织,每个组织都有自己的子网。这种使用单个前缀通告多个网络的能力通常称为地址聚合(address aggregation,也称为路由聚合或路由归纳(route aggregation or route summarization))。 image.png Figure 4.21 ♦ Hierarchical addressing and route aggregation 图4.21♦分层寻址和路由聚合 当地址按块分配给ISP,然后从ISP分配给客户端组织时,地址聚合效果非常好。但是,如果地址不是以这种分层方式分配的,会发生什么情况呢?例如,如果Fly-by-Night-ISP收购了ISPs-R-Us,然后组织1通过其子公司ISPs-R-Us连接到Internet,会发生什么情况?如图4.21所示,子公司ISPs-R-Us拥有地址块199.31.0.0/16,但组织1的IP地址不幸在此地址块之外。这里应该做些什么呢?当然,组织1可以对其所有路由器和主机重新编号,使其地址位于ISPs-R-Us地址块内。但这是一个昂贵的解决方案,组织1很可能在未来被重新分配到另一家子公司。组织1通常采用的解决方案是将其IP地址保留在200.23.18.0/23中。在本例中,如图4.22所示,Fly-by-Night-ISP继续通告地址块200.23.16.0/20,ISPs-R-Us继续通告199.31.0.0/16。但是,ISPs-R-Us现在也通告组织1的地址块200.23.18.0/23。当更大的Internet中的其他路由器看到地址块200.23.16.0/20(来自Fly-by-Night-ISP)和200.23.18.0/23(来自ISPs-R-Us)并想要路由到地址块200.23.18.0/23中的地址时,它们将使用最长前缀匹配(请参见第4.2.1节),并路由到ISPs-R-Us,因为它通告与目的地址匹配的最长(即,最具体的)地址前缀。 image.png Figure 4.22 ♦ ISPs-R-Us has a more specific route to Organization 1 图4.22♦ISPs-R-Us有到组织1的更具体的路由

  1. 如果我们不提到另一种类型的IP地址,即IP广播地址(broadcast address255.255.255.255,我们将会疏忽。当主机发送目的地址为255.255.255.255的数据报时,该消息将传送到同一子网中的所有主机。路由器也可以选择将消息转发到相邻子网(尽管它们通常不会)。<br />现在已经详细学习了IP编址,我们首先需要知道主机和子网是如何获取其地址的。让我们首先看看组织如何为其设备获取地址块,然后看看如何从组织的地址块中为设备(如主机)分配地址。

获取地址块 Obtaining a Block of Addresses

为了获得在组织的子网内使用的IP地址块,网络管理员可能首先联系其ISP,后者将从已分配给ISP的较大地址块中提供地址。例如,ISP本身可能被分配了地址块200.23.16.0/20。反过来,ISP可以将其地址块划分为八个大小相等的连续地址块,并将这些地址块中的一个分配给该ISP支持的最多八个组织中的每个组织,如下所示。(为方便起见,我们在这些地址的子网部分加了下划线。)

ISP’s block: 200.23.16.0/20 11001000 00010111 00010000 00000000
Organization 0 200.23.16.0/23 11001000 00010111 00010000 00000000
Organization 1 200.23.18.0/23 11001000 00010111 00010010 00000000
Organization 2 200.23.20.0/23 11001000 00010111 00010100 00000000
Organization 7 200.23.30.0/23 11001000 00010111 00011110 00000000

虽然从ISP获取一组地址是获取地址块的一种方法,但这并不是唯一的方法。显然,ISP本身也必须有一种方法来获取地址块。是否有一个全球权威机构负责管理IP地址空间并将地址块分配给ISP和其他组织?确实有!IP地址由互联网名称与数字地址分配机构(ICANN)[ICANN 2020]根据[RFC 7020]中规定的指导原则进行管理。非营利ICANN组织的角色不仅是分配IP地址,还负责管理DNS根服务器它还有一项非常有争议的工作,那就是分配域名(domain name)和解决域名纠纷。ICANN将地址分配给区域互联网注册机构(例如,ARIN、RIPE、APNIC和LACNIC,它们共同组成了ICANN的地址支持组织[ASO-ICANN 2020]),并处理其区域内的地址分配/管理。

获取主机地址:动态主机配置协议 Obtaining a Host Address: The Dynamic Host Configuration Protocol

一旦组织获得了地址块,就可以为其组织中的主机和路由器接口分配单独的IP地址。系统管理员通常会手动将IP地址配置到路由器中(通常是使用网络管理工具远程配置)。也可以手动配置主机地址,但通常使用动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)[RFC 2131]进行配置。DHCP允许主机自动获取(分配)IP地址。网络管理员可以配置DHCP,使给定主机在每次连接到网络时都收到相同的IP地址,或者可以为主机分配一个临时IP地址(temporary IP address),该地址在主机每次连接到网络时都是不同的。除了主机IP地址分配之外,DHCP还允许主机了解其他信息,例如其子网掩码、其first-hop路由器(通常称为默认网关(default gateway))的地址以及其本地DNS服务器的地址。
由于DHCP能够自动将主机连接到网络中与网络相关的方面,因此它通常被称为即插即用(plug-and-play)零配置(zeroconf,zero-configuration)协议。此功能对网络管理员非常有吸引力,否则他们将不得不手动执行这些任务!DHCP还在住宅互联网接入网络、企业网络以及主机频繁加入和离开网络的无线局域网中广泛使用。例如,假设有这样一个学生,他带着一台笔记本电脑从宿舍到图书馆再到教室。很可能在每个位置,学生将连接到一个新子网,因此每个位置都需要一个新的IP地址。DHCP非常适合这种情况,因为有很多用户来来去去,而且只有有限的时间需要地址。DHCP的即插即用功能的价值是显而易见的,因为系统管理员能够在每个位置重新配置笔记本电脑是不可想象的,而且几乎没有学生(除了那些上计算机网络课程的学生!)拥有手动配置笔记本电脑的专业知识。
DHCP是客户端-服务器协议。客户端通常是想要获取网络配置信息(包括其自身的IP地址)的新到达的主机。在最简单的情况下,每个子网(在图4.20的寻址意义上)都将有一台DHCP服务器。如果子网上没有服务器,则需要知道该网络的DHCP服务器地址的DHCP中继代理(通常是路由器)。图4.23显示了连接到子网223.1.2/24的DHCP服务器,路由器充当连接到子网223.1.1/24和223.1.3/24的到达客户端的中继代理。在下面的讨论中,我们将假设子网上有一台DHCP服务器可用。
image.png
Figure 4.23 ♦ DHCP client and server
图4.23DHCP♦客户端和服务器
对于新到达的主机,DHCP协议是一个由四个步骤组成的过程,如图4.23所示的网络设置的图4.24所示。在此图中,yiaddr(与“您的Internet地址”相同)表示分配给新到达的客户端的地址。这四个步骤是:

  • DHCP服务器发现(DHCP server discovery)。新到达的主机的第一个任务是查找要与之交互的DHCP服务器。这是使用DHCP发现报文(DHCP discover message)完成的,客户端在UDP数据包中将该报文发送到端口67。UDP数据包被封装在IP数据报中。但是,该数据报应该发送给谁呢?主机甚至不知道它所连接的网络的IP地址,更不用说该网络的DHCP服务器地址了。鉴于此,DHCP客户端创建一个IP数据报,其中包含其DHCP发现报文以及广播目的IP地址255.255.255.255和“this host”源IP地址0.0.0.0DHCP客户端将IP数据报传递到链路层,然后链路层将该帧广播到连接到子网的所有节点(我们将在6.4节中介绍链路层广播的详细信息)。
  • DHCP服务器提供(DHCP server offer(s))。收到DHCP发现报文的DHCP服务器使用DHCP 提供报文(DHCP offer message)响应客户端,该消息将再次使用IP广播地址255.255.255.255广播到子网上的所有节点。(您可能需要考虑为什么此服务器回复也必须广播)。由于子网中可能存在多个DHCP服务器,因此客户端可能会发现自己处于令人羡慕的位置,可以从多个选项中进行选择。每个服务器的提供报文都包含接收到的发现报文的事务(transaction)ID、客户端的建议IP地址、网络掩码和IP地址租用时间(IP address lease time)(IP地址将有效的时间量)。服务器通常会将租用时间设置为几小时或几天[Droms 2002]。
  • DHCP请求(DHCP request)。新到达的客户端将从一个或多个服务器提供中进行选择,并使用DHCP请求报文(DHCP request message)响应其选择的提供,回显配置参数。
  • DHCP确认(DHCP ACK)。服务器用DHCP ACK报文响应DHCP请求报文,确认所请求的参数。

image.png
Figure 4.24 ♦ DHCP client-server interaction
图4.24DHCP♦客户端-服务器交互
一旦客户端收到DHCP ACK,交互就完成了,客户端可以在租期内使用DHCP分配的IP地址。由于客户端可能希望在租约到期后使用其地址,因此DHCP还提供了一种机制,允许客户端续订其对IP地址的租约。
从移动性方面来看,DHCP确实有一个非常显著的缺点。由于每次节点连接到新子网时都会从DHCP获取新的IP地址,因此当移动节点在子网之间移动时,无法保持到远程应用程序的TCP连接。在第7章中,我们将学习移动蜂窝网络如何允许主机在提供商蜂窝网络中的基站之间移动时保留其IP地址和持续的TCP连接。有关DHCP的更多详细信息,请参阅[Droms 2002]和[DHC 2020]。互联网系统联盟[ISC 2020]提供了DHCP的开源参考实现。

4.3.3 网络地址转换 Network Address Translation (NAT)

鉴于我们对Internet地址和IPv4数据报格式的讨论,我们现在很清楚每个支持IP的设备都需要一个IP地址。随着小型办公室、家庭办公室(small office, home office,SOHO)子网的激增,这似乎意味着每当SOHO想要安装LAN来连接多台机器时,ISP都需要分配一定范围的地址来覆盖SOHO的所有IP设备(包括电话、平板电脑、游戏设备、IP电视、打印机等)。如果子网变大,则必须分配更大的地址块。但是,如果ISP已经分配了SOHO网络当前地址范围的连续部分呢?那么,典型的房主想(或应该)首先知道如何管理IP地址吗?幸运的是,有一种更简单的地址分配方法已在此类场景中得到越来越广泛的使用:网络地址转换(network address translation,NAT)[RFC 2663; RFC 3022; Huston 2004, Zhang 2007; Huston 2017。
图4.25显示了启用NAT的路由器的运行情况。位于家庭中的支持NAT的路由器的接口属于家庭网络的一部分,如图4.25所示。家庭网络中的编址与我们上面看到的完全一样-家庭网络中的所有四个接口都具有相同的子网地址10.0.0.0/24。地址空间10.0.0.0/8是[RFC 1918]中为私有网络或具有私有地址的域(private network or a realm with private addresses)(如图4.25中的归属网络)保留的IP地址空间的三个部分之一。具有私有地址的域是指其地址仅对该网络内的设备有意义的网络。要了解这一点的重要性,请考虑这样一个事实:有数十万个家庭网络,其中许多使用相同的地址空间10.0.0.0/24。给定家庭网络中的设备可以使用10.0.0.0/24寻址相互发送数据包。但是,从归属网络转发到更大的全球Internet的数据包显然不能使用这些地址(作为源地址或目的地址),因为有数十万个网络使用此地址块。也就是说,10.0.0.0/24地址只能在给定的归属网络内有意义。但是,如果私有地址仅在给定网络中有意义,那么在地址必须唯一的全球Internet上发送或接收数据包时,如何处理寻址?答案在于理解NAT。
image.png
Figure 4.25 ♦ Network address translation
图4.25♦网络地址转换
在外界看来,启用NAT的路由器看起来不像路由器。相反,NAT路由器在外界看来表现为具有单个IP地址的单个设备。在图4.25中,所有离开家庭路由器前往更大Internet的流量的源IP地址为138.76.29.7,所有进入家庭路由器的流量的目的地址必须为138.76.29.7。实质上,启用NAT的路由器向外界隐藏了家庭网络的详细信息。(顺便说一句,您可能想知道家庭网络计算机从哪里获得其地址,路由器从哪里获得其单个IP地址。通常,答案是相同的-DHCP!路由器从ISP的DHCP服务器获取地址,然后路由器运行DHCP服务器,为NAT-DHCP-路由器控制的家庭网络地址空间内的计算机提供地址。)
如果从WAN到达NAT路由器的所有数据报都具有相同的目的IP地址(具体地说,是NAT路由器的WAN端接口的目的IP地址),那么路由器如何知道它应该将给定数据报转发到哪台内部主机?诀窍是在NAT路由器上使用NAT转换表(NAT translation table),并在表条目中包括端口号和IP地址
请考虑图4.25中的示例。假设用户坐在主机10.0.0.1后面的家庭网络中,请求某个Web服务器(端口80)上IP地址为128.119.40.186的网页。主机10.0.0.1分配(任意)源端口号3345并将数据报发送到LAN。NAT路由器接收数据报,为该数据报生成新的源端口号5001,将源IP地址替换为其WAN端IP地址138.76.29.7,并将原始源端口号3345替换为新的源端口号5001。在生成新的源端口号时,NAT路由器可以选择当前不在NAT转换表中的任何源端口号。(请注意,由于端口号字段为16位长,因此NAT协议可以通过路由器的单个WAN端IP地址同时支持60,000多个连接!)。路由器中的NAT还会向其NAT转换表中添加一个条目Web服务器幸好没有意识到包含HTTP请求的到达数据报已被NAT路由器操纵,它以目的地址为NAT路由器的IP地址、目的端口号为5001的数据报作为响应。当此数据报到达NAT路由器时,路由器会使用目的IP地址和目的端口号索引NAT转换表,以获得家庭网络中浏览器的适当IP地址(10.0.0.1)和目的端口号(3345)。然后,路由器重写数据报的目的地址和目的端口号,并将数据报转发到家庭网络。
近年来,NAT得到了广泛的部署。但NAT也不是没有批评者。首先,有人可能会争辩说,端口号是用来寻址进程的,而不是用来寻址主机的。这种违规确实会给在家庭网络上运行的服务器带来问题,因为正如我们在第2章中所看到的,服务器进程在众所周知的端口号处等待传入请求,并且P2P协议中的对等点在充当服务器时需要接受传入连接。一个对等点如何连接到位于NAT服务器后面且具有DHCP提供的NAT地址的另一个对等点?这些问题的技术解决方案包括NAT穿透工具(NAT traversal tools)[RFC5389][RFC5389,RFC5128,Ford 2005]。
建筑纯粹主义者也提出了更多反对NAT的“哲学”论点。这里需要注意的是,路由器应该是第3层(即网络层)设备,并且应该只处理最高到网络层的数据包。NAT违反了这一原则,即主机应该直接相互通信,而不干扰修改IP地址的节点,更不用说端口号了。稍后我们将在第4.5节讨论这场辩论,届时我们将讨论中间盒(middleboxes)。

FOCUS ON SECURITY 关注安全 INSPECTING DATAGRAMS: FIREWALLS AND INTRUSION DETECTION SYSTEMS 检查数据报:防火墙和入侵检测系统 假设您被分配了管理家庭、部门、大学或公司网络的任务。攻击者知道您网络的IP地址范围,可以轻松地将IP数据报发送到您范围内的地址。这些数据报可以执行各种不正当的操作,包括使用ping扫描和端口扫描映射网络、使用格式错误的数据包使易受攻击的主机崩溃、在网络中的服务器上扫描打开的TCP/UDP端口,以及通过在数据包中包含恶意软件感染主机。作为网络管理员,您将如何处理所有这些坏人,每个人都能向您的网络发送恶意数据包?针对恶意数据包攻击的两种流行防御机制是防火墙(firewalls)和入侵检测系统(intrusion detection systems,IDS)。 作为网络管理员,您可以首先尝试在您的网络和Internet之间安装防火墙。(目前大多数接入路由器都具有防火墙功能。)。防火墙检查数据报和数据段首部字段,拒绝可疑数据报进入内部网络。例如,防火墙可以配置为拦截所有ICMP回应请求数据包(请参阅第5.6节),从而防止攻击者在您的IP地址范围内执行传统的端口扫描。防火墙还可以根据源和目的IP地址和端口号拦截数据包。此外,可以将防火墙配置为跟踪TCP连接,只向属于已批准连接的数据报授予条目。 IDS可以提供额外的保护。通常位于网络边界的IDS执行“深度数据包检查”,不仅检查首部字段,还检查数据报中的有效负载(包括应用层数据)。IDS有一个已知属于攻击的数据包签名数据库。当发现新的攻击时,此数据库会自动更新。当数据包通过IDS时,IDS会尝试将首部字段和有效负载与其签名数据库中的签名进行匹配。如果找到这样的匹配项,则会创建警报。入侵防御系统(intrusion prevention system,IPS)类似于IDS,不同之处在于除了创建警报外,它实际上还会拦截数据包。我们将在4.5节和第8章中更详细地探讨防火墙和IDS。 防火墙和IDS能否完全保护您的网络免受所有攻击?答案显然是否定的,因为攻击者不断发现签名尚不可用的新攻击。但是防火墙和传统的基于签名的IDS在保护您的网络免受已知攻击方面很有用。

4.3.4 IPv6

在20世纪90年代初,Internet工程任务组开始努力开发IPv4协议的后继者。这一努力的主要动机是意识到32位IPv4地址空间正开始耗尽,新的子网和IP节点正以惊人的速度连接到Internet(并被分配唯一的IP地址)。为了响应这种对大IP地址空间的需求,开发了一种新的IP协议IPv6。IPv6的设计者还利用这个机会根据IPv4积累的操作经验对IPv4的其他方面进行了调整和增强。
IPv4地址将在什么时候完全分配(因此不能再有新的网络连接到Internet)是非常有争议的话题。IETF地址终身预期工作组的两位领导人估计,地址将分别在2008年和2018年耗尽[Solensky 1996]。2011年2月,IANA将最后一个未分配的IPv4地址池分配给了一个地区注册中心。虽然这些注册中心的池中仍有可用的IPv4地址,但一旦这些地址用完,就没有更多的可用地址块可以从中央池中分配[Huston 2011a]。最近对IPv4地址空间耗尽的调查,以及为延长地址空间寿命所采取的步骤是[Richter 2015];最近对IPv4地址使用的分析是[Huston 2019]。
虽然20世纪90年代中期对IPv4地址耗尽的估计表明,在IPv4地址空间耗尽之前可能还需要相当长的时间,但人们意识到,在如此广泛的规模上部署一项新技术将需要相当长的时间,因此开始了开发IP版本6(IPv6)[RFC 2460]的过程[RFC 1752]。(一个经常被问到的问题是IPv5发生了什么?最初的设想是ST-2协议将成为IPv5,但后来ST-2被放弃了。)。有关IPv6的一个极好的信息来源是[Huitema 1998]。

IPv6数据报格式 IPv6 Datagram Format

IPv6数据报的格式如图4.26所示。IPv6中引入的最重要变化在数据报格式中显而易见:

  • 扩展了编址能力(Expanded addressing capabilities)。IPv6将IP地址的大小从32位增加到128位。这确保了世界不会耗尽IP地址。现在,地球上的每一粒沙子都可以IP寻址。除了单播和组播地址外(unicast and multicast addresses),IPv6还引入了一种称为任播地址(anycast address)的新地址类型,它允许将数据报传送到一组主机中的任何一个。(例如,此功能可用于将HTTP GET发送到包含给定文档的多个镜像站点中最近的一个。)
  • 精简的40字首部(A streamlined 40-byte header)。如下所述,多个IPv4字段已被丢弃或成为可选字段。由此产生的40字节定长首部允许路由器更快地处理IP数据报。新的选项编码允许更灵活的选项处理。
  • 流量标签(Flow labeling)。IPv6对流有一个难以捉摸的定义。RFC2460规定,这允许“标记属于发送方请求特殊处理(例如非默认服务质量或实时服务)的特定流的数据包。”例如,音频和视频传输可能被视为流。另一方面,文件传输和电子邮件等更传统的应用程序可能不会被视为流。高优先级用户(例如,有人为其流量支付更好的服务)所承载的流量也可能被视为流。然而,有一点是明确的,IPv6的设计者预见到最终需要能够区分流,即使流的确切含义尚未确定。

image.png
Figure 4.26 ♦ IPv6 datagram format
图4.26♦IPV6数据报格式
如上所述,将图4.26与图4.17进行比较,可以发现IPv6数据报的结构更简单、更流畅。IPv6中定义了以下字段:

  • 版本(Version)。此4位字段标识IP版本号。毫不奇怪,IPv6在此字段中的值为6。请注意,在此字段中输入4不会创建有效的IPv4数据报。(如果是这样的话,情况会简单得多-请参阅下面关于从IPv4向IPv6过渡的讨论。)
  • 流量类型(Traffic class)。与IPv4中的TOS字段一样,8位流量类字段可用于为流中的某些数据报赋予优先级,也可用于使来自特定应用程序(例如,IP语音)的数据报优先于来自其他应用程序(例如,SMTP电子邮件)的数据报。
  • 流标签(Flow label)。如上所述,该20位字段用于标识数据报流。
  • 有效负载长度(Payload length)。此16位值被视为一个无符号整数,它给出了IPv6数据报中固定长度的40字节数据首部后面的字节数。
  • 下一个首部(Next header)。此字段标识此数据报的内容(数据字段)将传送到的协议(例如,传送到TCP或UDP)。该字段使用与IPv4首部中的协议字段相同的值。
  • 跳数限制(Hop limit)。转发数据报的每台路由器都会将此字段的内容减1。如果跳数限制计数达到零,路由器必须丢弃该数据报。
  • 源地址和目的地址(Source and destination addresses)。RFC 4291中介绍了IPv6 128位地址的各种格式。
  • 数据(Data)。这是IPv6数据报的有效负载部分。当数据报到达其目的地时,将从IP数据报中删除有效负载,并将其传递到下一个首部字段中指定的协议。

上述讨论确定了IPv6数据报中包含的字段的用途。将图4.26中的IPv6数据报格式与我们在图4.17中看到的IPv4数据报格式进行比较,我们注意到IPv4数据报中出现的几个字段不再出现在IPv6数据报中:

  • 分片化/重组(Fragmentation/reassembly)。IPv6不允许在中间路由器上进行分片和重组;这些操作只能由源路由器和目的路由器执行。如果路由器接收到的IPv6数据报太大,无法通过传出链路转发,路由器就会简单地丢弃该数据报,并向发送方发回一条“Packet Too Big”(数据包太大)ICMP错误报文(参见第5.6节)。然后,发送方可以使用较小的IP数据报大小重新发送数据。分片和重组是一项耗时的操作;从路由器中移除此功能并将其直接放置在终端系统中会大大加快网络中的IP转发速度。
  • 首部校验和(Header checksum)。由于Internet层中的传输层(例如TCP和UDP)和链路层(例如以太网)协议执行校验和,因此IP的设计者可能认为此功能在网络层足够冗余,因此可以将其删除。同样,IP数据包的快速处理也是一个核心问题。回想一下我们在4.3.1节中对IPv4的讨论,由于IPv4首部包含TTL字段(类似于IPv6中的跳数限制字段),因此需要在每台路由器上重新计算IPv4首部校验和。与分片和重组一样,这在IPv4中也是一项代价高昂的操作。
  • 选项(Options)。选项字段不再是标准IP首部的一部分。然而,它并没有消失。相反,options字段是IPv6首部内可能指向的下一个首部之一。也就是说,正如TCP或UDP协议首部可以是IP数据包中的下一个首部一样,选项字段也可以。删除options字段会产生固定长度、40字节的IP首部。

    从IPv4过渡到IPv6 Transitioning from IPv4 to IPv6

    现在我们已经看到了IPv6的技术细节,让我们来考虑一个非常实际的问题:基于IPv4的公共互联网将如何过渡到IPv6?问题是,虽然新的支持IPv6的系统可以向后兼容,即可以发送、路由和接收IPv4数据报,但已经部署的支持IPv4的系统不能处理IPv6数据报。有几种选择是可能的[Huston 2011b, RFC 4213]。
    一种选择是宣布一个旗帜日(flag day)——一个给定的时间和日期,届时所有互联网机器都将被关闭,并从IPv4升级到IPv6。上一次重大技术过渡(从使用NCP到使用TCP提供可靠传输服务)发生在大约40年前。即使在当时互联网还很小,还由少数“巫师(wizards)”管理的时候,人们就意识到这样的旗帜日是不可能的。今天,涉及数十亿台设备的旗帜日更是不可想象的。
    在实践中最广泛采用的IPv4到IPv6过渡的方法涉及隧道(tunneling)[RFC 4213]。隧道技术是一个关键概念,在IPv4到IPv6过渡之后的许多其他场景中都有应用,包括我们将在第7章介绍的全IP蜂窝网络中的广泛使用,其背后的基本思想如下。假设两个IPv6节点(在本例中为图4.27中的B和E)希望使用IPv6数据报进行互操作,但通过中间的IPv4路由器相互连接。我们将两个IPv6路由器之间的一组IPv4路由器称为隧道,如图4.27所示。使用隧道,隧道发送端的IPv6节点(在本例中为B)获取整个IPv6数据报,并将其放入IPv4数据报的数据(有效负载)字段中。然后,该IPv4数据报被定址到隧道接收侧的IPv6节点(在本例中为E),并被发送到隧道中的第一个节点(在本例中为C)。隧道中的中间IPv4路由器在它们之间路由该IPv4数据报,就像它们路由任何其他数据报一样,它们幸福地不知道IPv4数据报本身包含完整的IPv6数据报。隧道接收端的IPv6节点最终接收IPv4数据报(它是IPv4数据报的目的地!),确定IPv4数据报包含IPv6数据报(通过观察IPv4数据报中的协议号字段是41[RFC 4213],表示IPv4有效负载是IPv6数据报),提取IPv6数据报,然后完全按照其从直接连接的IPv6邻居接收IPv6数据报的方式路由IPv6数据报。
    image.png
    Figure 4.27 ♦ Tunneling
    图4.27♦隧道
    我们在本节结束时指出,虽然IPv6的采用最初进展缓慢[Lawton 2001;Huston 2008b],但势头一直在增强。NIST[NIST IPv6 2020]报告称,超过三分之一的美国政府二级域名支持IPv6。在客户端,谷歌报告说,大约25%的客户端访问谷歌服务是通过IPv6[谷歌IPv6 2020]。最近的其他测量结果[Chyz 2014]表明,IPv6的采用一直在加速。支持IP的电话和其他便携设备等设备的激增进一步推动了IPv6的更广泛部署。欧洲第三代合作伙伴计划[3GPP 2020]已将IPv6指定为移动多媒体的标准编址方案。
    我们可以从IPv6经验中学到的一个重要教训是,更改网络层协议非常困难。自20世纪90年代初以来,许多新的网络层协议被吹捧为互联网的下一次重大革命,但到目前为止,大多数这些协议的普及率都很有限。这些协议包括IPv6、多播协议和资源预留协议(IPv6, multicast protocols, and resource reservation protocols);后两类协议的讨论可以在本文的在线补充中找到。的确,在网络层引入新协议就像更换房屋地基一样—如果不拆掉整栋房子,或者至少暂时重新安置房屋的居民,就很难做到这一点。另一方面,互联网见证了新协议在应用层的快速部署。当然,典型的例子有网络、即时消息、流媒体、分布式游戏和各种形式的社交媒体。引入新的应用层协议就像给房子加了一层新的油漆—这相对容易做,如果你选择了吸引人的颜色,附近的其他人就会模仿你。总而言之,在未来,我们肯定会看到互联网网络层的变化,但这些变化发生的时间尺度可能会比应用层发生的变化慢得多。