当前位置: 首页 > news >正文

计算机网络 网络层:数据平面(二)

4.3 网际协议:IPv4、寻址、IPv6及其他

        因特网网络层的关键方面和著名的网际协议(IP)。今天有两个版本的 IP 正在使用。4.3.1 节中,首先研究广泛部署的 IP 版本4,被称为 IPv4。4.3.5 节中,考察 IP版本6,已经被提议替代 IPv4。在中间,将学习因特网编址。掌握因特网编址就是掌握因特网的网络层。

4.3.1 IPv4 数据报格式

        网络层分组被称为数据报。以 IPv4数据报语法和语义开始对 IP 的学习。如图4-16所示。

        版本(号)。这 4 比特规定了数据报的 IP 协议版本。通过查看版本号,路由器能够确定如何解释 lP 数据报的剩余部分。不同的 IP 版本使用不同的数据报格式IPv4 的数据报格式如图 4-16 所示。新版本的 lP (IPv6) 的数据报格式将在 4.3.5节中讨论。

        首部长度。因为 IPv4 数据报可包含一些可变数量的选项(这些选项包括在IPv4 数据报首部中) ,故需要用这 4 比特来确定 lP 数据报中载荷(例如在这个数据报中被封装的运输层报文段)实际开始的地方。大多数 IP 数据报不包含选项,所以一般的 IP 数据报具有 20 字节的首部。

        服务类型服务类型 (TOS) 比特包含在 IPv4 首部中,以便使不同类型的 IP 数据报(例如,一些特别要求低时延、高吞吐量或可靠性的数据报)能相互区别开来。例如,将实时数据报(如用于 lP 电话应用)与非实时流量(如 FTP)分开也许是有用的。提供特定等级的服务是一个由网络管理员对路由器确定和配置的策略问题。

        数据报长度。这是 IP 数据报的总长度(首部加上数据),以字节计。因为该字段长为 16 比特,所以 IP 数据报的理论最大长度为 65535 字节。然而,数据报很少有超过 1500 字节的,该长度使得 IP 数据报能容纳最大长度以太网帧的载荷字段。

         标识、标志、片偏移。这三个字段与所谓 IP 分片有关,这是一个我们将很快要考虑的主题。有趣的是,新版本的 IP( IPv6) 不允许在路由器上对分组分片。

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

        协议。该字段通常仅当一个 IP 数据报到达其最终目的地时才会有用。该字段值指示了 lP数据报 的数据部分应交给哪个特定的运输层协议。例如,值为6 表明数据部分要交给 TCP ,而值为 17 表明数据要交给 UDP。注意在 IP 数据报中的协议号所起的作用,类似于运输层报文段中端口号字段所起的作用。协议号是将网络层与运输层绑定到一起的粘合剂,而端口号是将运输层和应用层绑定到一起的粘合剂。我们将在第 6 章看到,链路层帧也有一个特殊字段用于将链路层与网络层绑定在一起。

        首部检验和。首部检验和用于帮助路由器检测收到的 IP 数据报中的比特错误。首部检验和是这样计算的:将首部中的每 2 个字节当作一个数,用反码算术对这些数求和。如在 3.3 节讨论的那样,该和的反码(被称为因特网检验和)存放在检验和字段中。路由器要对每个收到的 IP 数据报计算其首部检验和 ,如果数据报首部中携带的检验和与计算得到的检验和不一致,则检测出是个差错。路由器一般会丢弃检测出错误的数据报。注意到在每台路由器上必须重新计算检验和并再次存放到原处,因为 TTL 字段以及可能的选项字段会改变。此时,一个经常问的问题是:为什么TCP/IP 在运输层与网络层都执行差错检测?这种重复检测有几种原因。首先,注意到在 IP 层只对 IP 首部计算了检验和,而 TCP/UDP 检验和是对整个 TCP/UDP文段进行。 其次,TCP/UDP 与 IP 不一定都必须属于同一个协议栈。原则上,TCP 能够运行在一个不同的协议(如 ATM) ,而 IP 能够携带不一定要传递给 TCP/UDP 的数据。

        源和目的 IP 地址。当某源生成一个数据报时,它在源 IP 字段中插入它 IP 地址,在目的 IP 地址字段中插入其最终目的地的地址。通常源主机通过 DNS 查找来决定目的地址,如在第 2 章中讨论的那样。将在 4.3.3 节中讨论 IP 编址。

        选项。选项字段允许 IP 首部被扩展首部选项意味着很少使用,因此决定对每个数据报首部不包括选项字段中的信息,这样能够节约开销。然而,少量选项的存在的确使问题复杂了,因为数据报首部长度可变,故不能预先确定数据字段从何处开始。而且还因为有些数据报要求处理选项,而有些数据报则不要求,故导致一台路由器处理一个 IP 数据报所需的时间变化可能很大。这些考虑对于高性能路由器和主机上的 IP 处理来说特别重要。由于这样或那样的原因,在 IPv6 首部中已去掉了 IP 选项,如 4.3.5 节中讨论的那样。

        数据(有效载荷)。来看最后也是最重要的字段,这是数据报存在的首要理由!在大多数情况下, IP 数据报中的数据字段包含要交付给目的地的运输层报文段(TCP 或 UDP) 然而,该数据字段也可承载其他类型的数据,如 ICMP 报文(在 5.6 节中讨论)。

        注意到一个 IP 数据报有总长为 20 字节的首部(假设无选项)。如果数据报承载 TCP 报文段,则每个(无分片的)数据报共承载了总长 40 字节的首部(20 字节的 IP 部加上 20 字节的 TCP 首部)以及应用层报文。

 4.3.2 IPv4 数据报分片

        在第 6 章中将看到,并不是所有链路层协议都能承载相同长度的网络层分组。有的协议能承载大数据报,而有的协议只能承载小分组。例如,以太网帧能够承载不超过1500 字节的数据,而某些广域网链路的帧可承载不超过 576 字节的数据。一个链路层帧能承载的最大数据量叫作最大传送单元 (Maximum Transmission Unit,MTU) 。因为每个 IP 数据报封装在链路层帧中从一台路由器传输到下一台路由器,故链路层协议的 MTU 严格地限制着 IP 数据报的长度。对 IP 数据报长度具有严格限制并不是主要问题,问题在于在发送方与目的地路径上的每段链路可能使用不同的链路层协议,且每种协议可能具有不同的 MTU

        为了更好地理解这一转发问题,想象一台互联几条链路的路由器,且每条链路运行具有不同 MTU 的链路层协议。假定你从某条链路收到一个 lP 数据报,通过检查转发表确定出链路,并且该条出链路的 MTU 比该 IP 数据报的长度要小。此时,如何将这个过大的 IP 分组挤进链路层帧的有效载荷字段呢?解决该问题的方法是将 IP 数据报中的数据分片成两个或更多个较小的 IP 数据报,用单独的链路层帧封装这些较小的 IP 数据报,然后通过输出链路发送这些帧。每个这些较小的数据报都称为 片(fragment)

        片在其到达目的地运输层以前需要重新组装。TCP 与 UDP 的确都希望从网络层收到完整的 、未分片的报文。IPv4 的设计者感到在路由器中重新组装数据报会给协议带来相当大的复杂性并且影响路由器的性能。为坚持网络内核保持简单的原则, IPv4 设计者决定将数据报的重新组装工作放到端系统中,而不是放到网络路由器中。

         当一台目的主机从相同源收到一系列数据报时,它需要确定这些数据报中的某些是否是一些原来较大的数据报的片。如果某些数据报是这些片的话,则它必须进一步确定何时收到了最后一片,并且如何将这些接收到的片拼接到一起以形成初始的数据报。为了让目的主机执行这些重组任务,IPv4 的设计者将标识标志片偏移字段放在 IP 数据报首部中。当生成一个数据报时,发送主机在为该数据报设置源和目的地址的同时贴上标识号。发送主机通常将它发送的每个数据报的标识号+1。当某路由器需要对一个数据报分片时,形成的每个数据报(即片)具有初始数据报的源地址、目的地址与标识号。当目的地从同一发送主机收到一系列数据报时,检查数据报的标识号以确定哪些数据报实际上是同一较大数据报的片。由于 IP 是一种不可靠服务,一个或多个片可能永远到达不了目的地。因为这种原因,为了让目的主机绝对地相信它收到了初始数据报的最后一个片,最后一个片的标志比特被设置为0,而其他所有片的标志比特设置为 1。另外,为了让目的主机确定是否丢失了一个片(且能够按正确顺序重新组装片),使用偏移字段指定该片应放在初始数据报的哪个位置

         图 4-17 图示了一个例子。一个 4000 字节的数据报(20字节 IP 首部 加上 3980字节 IP 有效载荷)到达一台路由器,且必须被转发到一条 MTU 为1500 字节的链路上。这就意味着初始数据报中的 3980 字节数据必须被分为三个独立的片(其中每个片也是一个 IP 数据报)。

 4.3.3 IPv4 编址

        然而,在讨论 IP 编址之前,我们需要简述一下主机与路由器连入网络的方法。一台
主机通常只有一条链路连接到网络
;当主机中的 IP 想发送一个数据报时,它就在该链路
上发送。主机物理链路之间的边界叫作接口( interface)。现在考虑一台路由器及其接口
因为路由器的任务是从链路上接收数据报并从某些其他链路转发出去,路由器必须拥
有两条或更多条链路与它连接路由器与它的任意一条链路之间的边界也叫作接口。一台
路由器因此有多个接口,每个接口有其链路。因为每台主机与路由器都能发送和接收 IP
数据报, IP 要求每台主机和路由器接口拥有自己的 IP 地址。因此,从技术上讲,一个 IP
地址与一个接口相关联,而不是与包括该接口的主机或路由器相关联

         每个 lP 地址长度为 32 比特(等价为 4 字节) ,因此总共有 2^32个(或大约 40 亿个)
可能的 lP 地址。这些地址通常按所谓点分十进制记法( dotted- decimal notation) 书写,即 
地址巾的每个字节用它的十进制形式书写,各字节间以句点隔开。例如,考虑 IP 地址
193.32.216.9 , 193 是该地址的第一个 8 比特的十进制等价数, 32 是该地址的第二个 8 比特的十进制等价数,以此类推。因此,地址 193.32.216.9 的二进制记法为:
                    11000001 00100000 11011000 00001001

        在全球因特网中的每行主机和路由器都上的每个接口,都必须有一个全球唯一的 lP 地址(在 NAT 后面的接口除外, 4.3.4 节中讨论)。然而,这些地址不能随意地自由选择。一个接口的 IP 地址的一部分需要由其连接的子网来决定

        图 4-18 提供了一个 lP 编址与接口的例子。在该图中, 一台路由器(具有 3 个接口)用于互联 7 台主机。仔细观察分配给主机和路由器接口的 IP 地址。有几点需要注意。图 4-18 左上侧的 3 台主机以及它们连接的路由器接口,都有一个形如 223.1.1.xxx IP地址。这就是说,在它们的 IP 地址中,最左侧的 24 比特是相同的。这 4 个接口也通过一个并不包含路由器的网络互联起来。该网络可能由一个以太网 LAN 互联,在此情况下,这些接口将通过一台以太网交换机互联(如第6章中讨论的那样),或者通过一个无线接入点互联(如第7章中讨论的那样)。我们此时将这种无路由部连接这些主机的网络表示一朵云,在第 6 7 章中再深入这些网络的内部。

         

         用 IP 的术语来说,互联这 3 个主机接口与 1个路由器接口的网络形成一个子网(subnet)。IP 编址为这个子网分配一个地址 223.1.1.0/24,其中的 /24 记法,有时称为子网掩码(network mask),指示 32 比特中的最左侧 24 比特定义了子网地址。因此子网 223.1.1.0/24 由 3 个主机接口(223.1.1.1、223.1.1.2 和 223.1.1.3)和 1 个路由器接口(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 中存在的 3个 IP 子网。

         

         一个子网的 IP 定义并不局限于连接多台主机到一个路由器接口的以太网段。为了搞清其中的道理,可考虑图 4-20,图中显示了 3 台通过点对点链路彼此互联的路由器。每台路由器有 3 个接口,每条点对点链路使用一个,一个用于直接将路由器连接到一对主机的广播链路。这里出现了几个子网呢? 3 个子网 223.1.1.0/24、223.1.2.0/24、223 .1.3.0/24 类似于我们在图 4-18 中遇到的子网。但注意到在本例中还有其他 3 个子网:一个子网是223 1. 9. 0/24,用于连接路由器 R1 与 R2 的接口;另外一个子网是 223.1.8.0/24,用于连接路由器 R2 与 R3 的接口;第三个子网是 223.1.7.0/24,用于连接路由器 R3 与 R1的接口。对于一个路由器和主机的通用互联系统,我们能够使用下列有效方法定义系统中的子网:

         为了确定子网,分开主机和路由器的每个接口,产生几个隔离的网络岛,使用接口端接这些隔离的网络的端点。这些隔离的网络中的每一个都叫做一个子网。

                         

         如果将该过程用于图 4-20 中的互联系统上,会得到 6个岛或子网。

        从上述讨论显然可以看出,一个具有多个以太网段和点对点链路的组织(如一个公司或学术机构)将具有多个子网,在给定子网上的所有设备都具有相同的子网地址。原则上,不同的子网能够具有完全不同的子网地址。然而,在实践中,它们的子网地址经常有许多共同之处。为了理解其中的道理,关注在全球因特网中是如何处理编址的。

        因特网的地址分配策略被称为无类别域间路由选择 (Classless Interdomain Routing , CIDR)。CIDR 将子网寻址的概念一般化了。当使用子网寻址时,32 比特的 lP 地址被划分为两部分,并且也具有点分十进制数形式 a. b. c. d/x,其中 x 指示了地址的第一部分中的比特数。

        形式为 a.b.c.d/x 的地址的 x 最高比特构成 IP 地址的网络部分,并且经常被称为该地址的前缀 (prefix) (或网络前缀)。一个组织通常被分配一块连续的地址,即具有相同前缀的一段地址。在这种情况下,该组织内部的设备的 IP 地址将共享共同的前缀。当我们在 5.4 节中论及因特网的 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 比特,这时一种称为分类编址的编址方案,这是因为具有 8、16、24 比特子网地址的子网分别被称为 A、B、C类网络。一个 IP地址 的网络部分正好为 1、2 或3 字节的要求,已经在支持数量迅速增加 具有小规模或中等规模子网的组织方面出现了问题。一个 C 类(/24)子网仅能容纳多达 2^8-2=254(其中两个地址预留用于特殊用途)台主机,这对于许多组织来说太小了。然而一个 B 类(/16)子网可支持多达 65534 台主机,又太大了。在分类编址方法下,比方说一个有 2000 台主机的组织通常被分给一个 B类(/16)地址。这就导致了 B类地址空间的迅速损耗以及所分配的地址空间的利用效率低下。例如,为具有 2000 台主机的组织分配一个 B 类地址,就具有足以支持多达 65534 个接口的地址空间,剩下的超过 63000 个地址却不能被其他组织使用。

         如果还不提及另一种类型的 IP 地址,即 IP 广播地址 255.255.255.255 ,那将是我们的疏漏。当一台主机发出一个目的地址为 255.255.255.255 的数据报时。该报文会交付给同一个网络中的所有主机,路由器也会有选择地向邻近的子网转发该报文(虽然它们通常不这样做)。

         现在我们已经详细地学习了 IP 编址, 需要知道主机或子网最初是如何得到它们的地址的。我们先看一个组织是如何为其设备得到一个地址块的,然后再看一个设备(如一台主机)是如何从某组织的地址块中分配到一个地址的

         1. 获取一块地址

        为了获取一块 IP 地址用于一个组织的子网内,某网络管理员也许首先会与他的 ISP 联系,该 ISP 可能会从已分给它的更大地址块中提供一些地址。例如,该 ISP 也许自己已被分配了地址块 200.23.16.0/20。ISP 可以依次将该地址块分成 8 个长度相等的连续地址块,为本 ISP 支持的最多达 8 个组织中的一个分配这些地址块中的一块,如下所示(为了便于查看,我们已将这些地址的网络部分加了下划线。)

         尽管从一个 ISP 获取一组地址是一种得到一块地址的方法,但这不是唯一的方法。显然,必须还有一种方法供 ISP 本身得到一块地址。是否有一个全球性的权威机构 ,它具有管理 IP 地址空间并向各 ISP 和其他组织分配地址块的最终责任呢?的确有一个 ! IP 地址由因特网名字和编号分配机构(Internet Corporation for Assigned Names and Numbers ICANN) 管理 。 非营利的 ICANN 组织的作用不仅是分配 lP 地址,还管理 DNS 根服务器。它还有一项容易引起争论的工作,即分配域名与解决域名纷争。ICANN 向区域性因特网注册机构 (如 ARIN 、RIPE、APNIC 和 LACNIC) 分配地址,这些机构一起形成了 lCANN的地址支持组织处理本区域内的地址分配/管理

         2. 获取主机地址:动态主机配置协议

        某组织一旦获得了一块地址,它就可为本组织内的主机与路由器接口逐个分配 IP 地址。系统管理员通常手工配置路由器中的 IP 地址(常常在远程通过网络管理工具进行配置)。主机地址也能手动配置,但是这项任务目前更多的是使用动态主机配置协议( Dynamic Host Confìgnration ,DHCP) 来完成。 DHCP 允许主机自动获取(被分配)一个 IP 地址。网络管理员能够配置 DHCP ,以使某给定主机每次与网络连接时能得到一个相同的 IP 地址,或者某主机将被分配一个临时的 IP 地址 (temporary IP address) ,每次与网络连接时该地址也许是不同的。除了主机 lP 地址分配外, DHCP 还允许一台主机得知其他信息,例如它的子网掩码、它的第一跳路由器地址(常称为默认网关)与它的本地 DNS 服务器的地址。

         由于 DHCP 具有将主机连接进一个网络的网络相关方面的自动能力,故它又常被称为即插即用协议(plug- and- play protocol )或 零配置 ( zeroconf ) 协议。这种能力对于网络管理员来说非常有吸引力,否则他将不得不手工执行这些任务! 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 服务。在我们下面的讨论中,将假定 DHCP 服务器在该子网上是可供使用的。

 

        对于一台新到达的主机而言,针对图 4-23 所示的网络设置,DHCP 协议是一个 4 个步骤的过程,如图 4-24 中所示。在这幅图中, yiaddr (表示"你的因特网地址"之意) 指示分配给该新到达客户的地址。 

        ① DHCP 服务器发现

         一台新到达的主机的首要任务是发现一个要与其交互的 DHCP服务器。这可通过使用 DHCP 发现报文 (DHCP discover lnessage) 来完成,客户在UDP 分组中向端口67 发送该发现报文。UDP 分组封装在一个 IP 数据报中,但是这个数据报应发给谁呢?主机甚至不知道它所连接网络的 IP 地址,更不用说用于该网络的 DHCP 服务器地址了。在这种情况下, DHCP 客户生成包含 DHCP 发现报文的IP 数据报,其中使用广播目的地址 255.255.255 并且使用"本主机"源 IP 地址0.0.0.0。 DHCP 客户将该 lP 数据报传递给链路层,链路层然后将该帧广播到所有与该子网连接的节点

        ② DHCP 服务器提供

         DHCP 服务器收到 DHCP 发现报文时,用 DHCP 提供报文(DHCP offer message) 向客户做出响应该报文向该子网的所有节点广播,仍然使用 IP 广播地址 255.255.255.255 (你也许要思考下这个服务器为何也必须采用广播)。因为在子网中可能存在几个 DHCP 服务器,该客户也许会发现它处于能在几个提供者之间进行选择的优越位置。每台服务器提供的报文包含有收到的发现报文的事务 ID 、向客户推荐的 IP 地址、网络掩码以及 IP 地址租用期( address lease time) ,即 IP 地址有效的时间量。服务器租用期通常设置为几小时或几天。

         ③ DHCP 请求

        新到达的客户从一个或多个服务器提供中选择一个,并向选中的服务器提供用 DHCP 请求报文进行响应,回显配置的参数

        ④ DHCP ACK

        服务器用 DHCP ACK 报文对 DHCP 请求报文进行响应,证实所要求的参数。

        一旦客户收到 DHCP ACK 后,交互便完成了,并且该客户能够在租用期内使用 DHCP 分配的 IP 地址。因为客户可能在该租用期超时后还希望使用这个地址,所以 DHCP 还提供了一种机制以允许客户更新它对一个 IP 地址的租用。

         从移动性角度看, DHCP 确实有非常严重的缺陷。因为每当节点连到一个新子网,要从 DHCP 得到一个新的 IP 地址,当一个移动节点在子网之间移动时,就不能维持与远程应用之间的 TCP 连接。在第 6 章中,我们将研究移动 IP ,它是一种对 IP 基础设施的扩展,允许移动节点在网络之间移动时使用其单一永久的地址。

4.3.4 网络地址转换

        讨论了有关因特网地址和 IPv4 数据报格式后,现在可清楚地认识到每个 IP 使能的设备都需要一个 IP 地址。随着所谓小型办公室、家庭办公室 (Small office , Home Office , SOHO) 子网的大量出现,看起来意味着每当 SOHO 想安装一个 LAN 以互联多台机器时,需要 ISP 分配 组地址以供该 SOHO 的所有 IP 设备(包括电话、平板电脑、游戏设备、 IP TV 、打印机等)使用。如果该子网变大了,则需要分配一块较大的地址。但如果 ISP 已经为 SOHO 网络的当前地址范围分配过一块连续地址该怎么办呢?并且,家庭主人一般要(或应该需要)首先知道的管理 IP 地址的典型方法有哪些呢?幸运的是,有一种简单的方法越来越广泛地用在这些场合:网络地址转换。 

         图4-25 显示了一台 NAT 使能路由器的运行情况。位于家中的 NAT 使能的路由器有一个接口,该接口是图 4-25 中右侧所示家庭网络的一部分。在家庭网络内的编址就像我们在上面看到的完全一样,其中的所有 4 个接口都具有相同的网络地址 10.0.0/24 地址空间10.0.0.0/8 是保留的三部分 IP 地址空间之一,这些地址用于如图 4-25 中的家庭网络等专用网络 (private nelwork) 或具有专用地址的地域 (realm with private address)。 具有专用地址的地域是指其地址仅对该网络中的设备有意义的网络。为了明白它为什么重要,考虑有数十万家庭网络这样的事实,许多使用了相同的地址空间10.0.0.0/24。在一个给定家庭网络中的设备能够使用 10.0.0.0/24 编址彼此发送分组。然而,转发到家庭网络之外进入更大的全球因特网的分组显然不能使用这些地址(或作为源地址,或作为目的地址) ,因为有数十万的网络使用着这块地址。这就是说, 10.0.0. 0/ 24 地址仅在给定的网络中才有意义。但是如果专用地址仅在给定的网络中才有意义的话,当向或从全球因特网发送或接收分组时如何处理编址问题呢,地址在何处才必须是唯一的呢?答案在于理解 NAT

         NAT 使能路由器对于外部世界来说甚至不像一台路由器。相反 NAT 路由器对外界的行为就如同一个具有单一IP 地址的单一设备。在图 4-25 中,所有离开家庭路由器流向更大因特网的报文都拥有一个源 IP 地址 138.76.29.7 ,且所有进入家庭的报文都拥有同一个目的 IP 地址 138.76.29.7。从本质上讲, NAT 使能路由器对外界隐藏了家庭网络的细节。(另外,你也许想知道家庭网络计算机是从哪儿得到其地址,路由器又是从哪儿得到它的单一IP 地址的。在通常的情况下,答案是相同的,即 DHCP 路由器从 ISP 的 DHCP 服务器得到它的地址,并且路由器运行一个 DHCP 服务器,为位于 NAT-DHCP 路由器控制的家庭网络地址空间中的计算机提供地址。)   

         如果从广域网到达 NAT 路由器的所有数据报都有相同的目的 IP 地址(特别是对 NAT 路由器广域网一侧的接口),那么该路由器怎样知道它应将某个分组转发给哪个内部主机呢?技巧就是使用 NAT 路由器上的一张 NAT 转换表(NAT translation table),并且在表项中包含了端口号及其 IP 地址

         考虑图 4-25 中的例子。假设一个用户坐在家庭网络主机 10.0.0.1 后,请求 IP 地址为128.119.40.186 的某台 Web 服务器(端口 80 )上的一个 Web 页面。主机10.0.0.1 为其指派了(任意)源端口号 3345将该数据报发送到 LAN 中。NAT 路由器收到该数据报,为该数据报生成一个新的源端口号 5001,将源 lP 替代为其广域网一侧接口的 IP 地址138.76.29.7 ,且将源端口 3345 更换为新端口 5001。当生成一个新的源端口号时,NAT路由器可选择任意一个当前未在 NAT 转换表中的源端口号。 (注意到因为端口号字段为 16 比特长, NAT 协议可支持超过 60000 个并行使用路由器广域网一侧单个 IP 地址的连接! ) 路由器中的 NAT 也在它的 NAT 转换表中增加一表项。Web 服务器并不知道刚到达的包含HTTP 请求的数据报已被 NAT 路由器进行了改装,它会发回一个响应报文,其目的地址是 NAT 路由器的 IP 地址,其目的端口是 5001。当该报文到达 NAT 路由器时,路由器使用目的IP 地址与目的端口号从 NAT 转换表中检索出家庭网络浏览器使用的适当 IP 地址( 10.0.0.1 ) 和目的端口号 (3345)。 于是,路由器重写该数据报的目的lP地址与目的端口号,并向家庭网络转发该数据报

4.3.5 IPv6

        替代 IPv4 的协议。现实:新的子网和 IP 节点以惊人的增长率连到因特网上(并被分配唯一的 IP 地址),32 比特的 IP 地址空间即将用尽。为了应对这种对大 IP 地址空间的需求,开发新的IP 协议,即 IPv6。

        IPv4 地址在什么时候会被完全分配完(因此没有新的网络再能与因特网相连)是个相当有争议的问题。 IANA 向一个区域注册机构分配完了未分配 IPv4 地址的最后剩余地址池。这些注册机构在它们的地址池中还有可用的 IPv4 地址, 一旦用完这些地址,从中央池中将再也分配不出更多的可用地址块了。 

1. IPv6 数据报格式

        IPv6 数据报格式如图4-26所示。引入的变化在其数据报格式中:

        ① 扩大的地址容量。IPv6 将 IP 地址长度从 32 比特增加到 128 比特。这就确保不会用尽 IP 地址。除了单播与多播地址意外,IPv6 还引入了一种称为任播地址的新型地址,这种地址可以使数据报交付给一组主机中的任意一个。(例如,这种特性可用于向一组包含给定文档的镜像站点中的最近一个发送 HTTP GET 报文。)

        ② 简化高效的 40 字节首部。如下面讨论的那样,许多 lPv4 字段已被舍弃或作为选项。因而所形成的 40 字节定长首部允许路由器更快地处理 IP 数据报。一种新的选项编码允许进行更灵活的选项处理。

         ③ 流标签。lPv6 有一个难以捉摸的流 (flow) 定义。该字段可用于" 给属于特殊流的分组加上标签,这些特殊流是发送方要求进行特殊处理的流如一种非默认服务质量或需要实时服务的流 " 。例如,音频与视频传输就可能被当作一个流。另一方面,更为传统的应用(如文件传输和电子邮件)就不可能被当作流。由高优先权用户(如某些为使其流量得到更好服务而付费的用户)承载的流量也有可能被当作一个流。然而, IPv6 的设计者显然已预见到最终需要能够区分这些流,即使流的确切含义还未完全确定。

         如上所述,比较图4-26 和 4-16 可以看出,IPv6 数据报结构更简单、高效。以下是在IPv6中定义的字段。

         注意那些 IPv4 数据报中出现的几个字段而在 IPv6数据报中已不复存在。

 2. 从 IPv4 到 IPv6 的迁移

        考虑一个非常实际的问题:基于 IPv4 的公共因特网如何迁移到 IPv6 ?新型 IPv6 使能系统可做成向后兼容,即能发送、路由和接收 IPv4 数据报,但已部署的具有 IPv4 能力的系统却不能够处理 IPv6 数据报。可以采用以下方法:

        一种可选的方法是宣布一个标志日,指定某个日期和时间,届时因特网的所有机器都关机并从 IPv4 升级到 IPv6。这是一个不可行的方法。

        在实践中广泛采用的 IPv4 到 IPv6 迁移的方法包括建隧道(tunneling)。建隧道依据的基本思想如下:假定两个 IPv 6节点(如图 4-27 中的 B 和 E) 要使用 IPv6 数据报进行交互,但它们是经由中间 IPv4 路由器互联的。我们将两台 IPv6 路由器之间的中间 IPv4 路由器的集合称为一个隧道( tunnel) ,如图 4-27 所示。借助于隧道,在隧道发送端的 IPv6 节点(如 B) 可将整个 IPv6 数据报放到 IPv4 数据报的数据(有效载荷)字段中。于是,该 IPv4 数据报的地址设为指向隧道接收端的 IPv6 节点(在此例中为 E),再发送给隧道中的第一个节点(在此例中为 C)。隧道中的中间 IPv4 路由器在它们之间为该数据报提供路由,就像对待其他数据报一样,完全不知道该 lPv4 数据报自身就含有一个完整的IPv6 数据报。隧道接收端的 IPv6 节点最终收到该 IPv4 数据报(它是该 IPv4 数据报的目的地) ,并确定该 IPv4 数据报含有 一个 IPv6 数据报(通过观察在 IPv4 数据报中的协议号字段是 41 ,指示该 IPv4 有效载荷是 IPv6 数据报),从中取出 IPv6 数据报,然后再为该 IPv6 数据报提供路由,就好像它是从一个直接相连的 IPv6 邻居那里接收到该 IPv6 数据报一样。

 4.4 通用转发和 SDN

        在 4.2.1 节中,注意到因特网路由器的转发决定传统上仅仅基于分组的目的地址。然而,在前一节中,我们也已经看到执行许多第三层功能的中间盒有了大量发展。NAT 盒重写首部 IP 地址和端口号防火墙基于首部字段值阻拦流量或重定向分组以进行其他处理,如深度分组检测( DPI )。负载均衡器将请求某种给定服务(例如一个 HTTP 请求)的分组转发到提供该服务的服务器集合中的一个。

        第二层交换机和第三层路由器等中间盒的剧增,而且每种都有自己特殊的硬件、软件和管理界面,无疑给许多网络操作员带来了十分头疼的大麻烦。然而,近期软件定义网络的进展已经预示并且正在提出一种统一的方法,以一种现代、简洁和综合方式,提供多种网络层功能以及某些链路层功能。

        回顾 4.2.1 节将基于目的地转发的特征总结为两个步骤:查找目的 IP 地址( "匹配" ) ,然后将分组发送到有特定输出端口的交换结构( "动作" )。现在考虑一种更有意义的通用"匹配加动作"范式,其中能够对协议栈的多个首部字段进行"匹配",这些首部字段是与不同层次的不同协议相关联的。"动作"能够包括:将分组转发到一个或多个输出端口(就像在基于目的地转发中一样) ,跨越多个通向服务的离开接口进行负载均衡分组(就像在负载均衡中一样) ,重写首部值(就像在 NAT 中一样) ,有意识地阻挡/丢弃某个分组(就像在防火墙中一样) ,为进一步处理和动作而向某个特定的服务器发送一个分组(就像在 DPI 一样),等等。

         在通用转发中,一张匹配加动作表将在 4.2.1 节中看到的基于目的地的转发表一般化了。因为能够使用网络层和/或链路层源和目的地址做出转发决定,所以显示在图 4-28 中的转发设备更为准确地描述为"分组交换机"而不是第三层"路由器"或第二层"交换机"。因此,在本节后面部分以及 5.5 节中,我们将这些设备称为分组交换机。

        图 4-28 显示了位于每台分组交换机中的一张匹配加动作表,该表由远程控制器计算、安装和更新。注意到虽然在各台分组交换机中的控制组件可以相互作用(例如以类似于图 4-2 中的方式),但实践中通用匹配加动作能力是通过计算、安装和更新这些表的远程控制器实现的。花比较图 4-2 、图 4-3 和图 4-28 ,你能看出图 4-2 和图 4-3 中显示的基于目的地转发与图 4-28 中显示的通用转发有什么相似和差异吗? 

 

         匹配加动作转发表在 OpenFlow 中称为流表(flow table),它的每个表项包括:

        ① 首部字段值的集合,入分组将与之匹配。与基于目的地转发的情况一样,基于硬件匹配在 TCAM 内存中执行得最为迅速(TCAM 内存中可能有上百万条地址表项)。匹配不上流表项的分组将被丢弃或发送到远程控制器做更多处理。在实践中,为了性能或成本原因,一个流表可以由多个流表实现,但我们这里只关注单一流表的抽象。

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

        ③当分组匹配流表项时所采取的动作集合。这些动作可能将分组转发到给定的输出端口丢弃该分组复制该分组将它们发送到多个输出端口,和/或重写所选的首部字段

 4.4.1 匹配

        图 4-29 显示了 11 个分组首部字段和入端口 ID ,该 ID 能被 OpenFlow 1.0 中的匹配加动作规则所匹配。前面 1.5.2 节讲过,到达一台分组交换机的一个链路层(第二层)帧将包含一个网络层(第三层)数据报作为其有效载荷,该载荷通常依次将包含一个运输层(第四层)报文段。第一个观察是, OpenFlow 的匹配抽象允许对来自三个层次的协议首部所选择的字段进行匹配(因此相当勇敢地违反了我们在 1.5 节中学习的分层原则)因为我们还没有涉及链路层,用如下的说法也就足够了:显示在图 4-29 中的源和目的 MAC 地址是与帧的发送和接收接口相关联的链路层地址;通过基于以太网地址而不是 IP 地址进行转发,我们看到 OpenFlow 使能的设备能够等价于路由器(第三层设备)转发数据报以及交换机(第二层设备)转发帧。以太网类型字段对应于较高层协议(例如 IP),利用该字段分解该帧的载荷,并且 VLAN 字段与所谓虚拟局域网相关联。

 

         入端口是指分组交换机上接收分组的输入端口。在 4.3.1 节中,已经讨论过该分组的 IP 源地址、IP 目的地址、IP 协议字段和 IP 服务类型字段。运输层源和目的端口号字段也能匹配。

         流表项也可以有通配符。例如,在一个流表中 IP 地址 128.119. *. * 将匹配其地址的前16 比特为 128.119 的任何数据报所对应的地址字段。每个流表项也具有相应的优先权如果一个分组匹配多个流表项,选定的匹配和对应的动作将是其中有最高优先权的那个

4.4.2 动作

4.4.3 匹配加动作操作中的 OpenFlow 例子

        在已经考虑了通用转发的匹配和动作组件后,在图 4-30 显示的样本网络场景中将这些想法拼装在一起。该网络具有 6 台 主机 (h1 h2 、h3、 h4 、h5 和 h6) 以及三台分组交换机 (s1 s2 和 s3) 每台交换机具有 4 个本地接口(编号1到4)。我们将考虑一些希望实现的网络范围的行为,在 s1 s2 s3 中的流表项需要实现这种行为。

 

         第一个例子:简单转发

        作为一个简单的例子,假定希望的转发行为是:来自 h5 或 h6 发往 h3 或 h4 的分组s3 转发到 s1,然后从 s1 转发到 s2(完全避免使用 s2 和 s3 之间的链路),在 s1 中的流表项为:

         第二个例子:负载均衡

        其中来自 h3 发往 10.1.*.* 的数据报经过 s1 和 s2 直接链路转发,与此同时来自 h4 发往 10.1.*.* 的数据报经过 s2 和 s3(于是从 s3 到 s1)之间的链路转发。注意到这种行为不能通过基于 IP 的目的地转发取得。在此情况下,s2 中的流表项是:

        第三个例子:充当防火墙

        考虑防火墙场景,其中 s2 仅希望(在他的任何接口上)接收来自与 a3 相连的主机所发送的流量。 

         

http://www.lqws.cn/news/512947.html

相关文章:

  • LeetCode 142题解 | 环形链表Ⅱ
  • 【MCP服务】蓝耘元生代 | MCP平台:部署时间服务器MCP,开启大模型交互新体验
  • [架构之美]Redis客户端命令指南
  • 左神算法之二叉树最大路径和问题
  • RedisVL EmbeddingsCache深度实践与最佳指南
  • LangGraph--基础学习(Human-in-the-loop 人工参与深入学习2)
  • 在智慧教育行业中,OPS插拔式电脑启到什么作用
  • 【沉浸式解决问题】微服务子模块引入公共模块的依赖后无法bean未注入
  • 磁悬浮轴承温度漂移克星:三招实现精准控制
  • 桌面小屏幕实战课程:DesktopScreen 9 GPIO
  • 轻巧灵动,智启未来 ——Kinova Gen3 Lite 机器人轻松解锁各行业自动化新姿势
  • 集成学习基础:Bagging 原理与应用
  • 多模态大模型(从0到1)
  • CRMEB PHP多门店版v3.2.1系统全开源+Uniapp前端+搭建教程
  • 【stm32】标准库学习——USART串口
  • 2023年全国青少年信息素养大赛Python 复赛真题——玩石头游戏
  • 大模型时代的创业机遇
  • 左神算法之双集合平均值优化操作的最大次数
  • SIAM-2011《Weighted Graph Compression for Parameter-free Clustering With PaCCo》
  • 【基础篇-消息队列】—— 如何实现单个队列的并行消费及如何保证消息的严格顺序
  • 爬取小红书相关数据导入到excel
  • SpringCloud系列(35)--使用HystrixDashboard进行服务监控
  • 《汇编语言:基于X86处理器》第4章 数据传送、寻址和算术运算(2)
  • 行为验证码 AJ-Captcha 使用文档
  • Golang Kratos 系列:领域层model定义是自洽还是直接依赖第三方(三)
  • C++字符串的行输入
  • MySQL之SQL性能优化策略
  • 《仿盒马》app开发技术分享-- 兑换列表展示(68)
  • git操作练习(3)
  • 【Python-Day 29】万物皆对象:详解 Python 类的定义、实例化与 `__init__` 方法