• 第 4 章 网络层

    Intro

    【考纲内容】

    1. 网络层的功能 异构网络互连;路由与转发;SDN 基本概念;拥塞控制
    2. 路由算法 静态路由与动态路由:距离-向量路由算法;链路状态路由算法:层次路由视频讲解
    3. IPv4 IPv4 分组;IPv4 地址与 NAT;子网划分与子网掩码、CIDR、路由聚合、ARP、DHCP 与 ICMP
    4. IPv6 IPv6 的主要特点;IPv6 地址
    5. 路由协议 自治系统;域内路由与域间路由:RIP 路由协议:OSPF 路由协议:BGP 路由协议
    6. IP 组播 组播的概念;IP 组播地址
    7. 移动 IP 移动 IP 的概念;移动 IP 通信过程
    8. 网络层设备 路由器的组成和功能;路由表与路由转发

    【复习提示】

    本章是历年考查的重中之重,尤其是结合第 3 章、第 5 章、第 6 章出综合题的概率很大。其中 IPv4 以及路由的相关知识点是核心,历年真题都有涉及,因此必须牢固掌握其原理,也要多做题,以便灵活应用。本章的其他知识点,如 IP 组播、移动 IP、IPv6 也要有所了解。

     

    一、网络层的功能

    互联网在网络层的设计思路是,向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。也就是说,所传送的分组可能出错、丢失、重复、失序或超时,这就使得网络中的路由器比较简单,而且价格低廉。如果主机中的进程之间的通信需要是可靠的,那么可以由更高层的传输层来负责。采用这种设计思路的好处是:网络的造价大大降低,运行方式灵活,能够适应多种应用。互联网能够发展到今日的规模,充分证明了当初采用这种设计思想的正确性。

    0x00 异构网络互连

    要在全球范围内把数以百万计的网络互连起来,并且能够互相通信,是一项非常复杂的任务,此时需要解决许多问题,比如不同的寻址方案、不同的网络接入机制、不同的差错处理方法、不同的路由选择机制等等。用户的需求是多样的,没有一种单一的网络能够适应所有用户的需求。网络层所要完成的任务之一就是使这些异构的网络实现互连。

    网络互连是指将两个以上的计算机网络,通过一定的方法,用一些中间设备(又称中继系统)相互连接起来,以构成更大的网络系统。根据所在的层次,中继系统分为以下 4 种:

    1. 物理层中继系统:转发器,集线器。
    2. 数据链路层中继系统:网桥或交换机。
    3. 网络层中继系统:路由器。
    4. 网络层以上的中继系统:网关。

    使用物理层或数据链路层的中继系统时,只是把一个网络扩大了,而从网络层的角度看,它仍然是同一个网络,一般并不称为网络互连。因此网络互连通常是指用路由器进行网络互连和路由选择。路由器是一台专用计算机,用于在互联网中进行路由选择。

    注意:由于历史原因,许多有关 TCP/IP 的文献也把网络层的路由器称为网关。

    TCP/IP 体系在网络互连上采用的做法是在网络层采用标准化协议,但相互连接的网络可以是异构的。图.4.1(a) 表示用许多计算机网络通过一些路由器进行互连。由于参加互连的计算机网络都使用相同的 IP 协议,因此可以把互连后的网络视为如图 4.1(b) 所示的一个虚拟 IP 网络。

    1

    虚拟互连网络也就是逻辑互连网络,其意思是互连起来的各种物理网络的异构性本来是客观存在的,但是通过 IP 协议就可以使这些性能各异的网络在网络层上看起来好像是一个统一的网络。这种使用 IP 协议的虚拟互连网络可简称为 IP 网络

    使用 IP 网络的好处是:当 IP 网上的主机进行通信时,就好像在一个单个网络上通信一样,而看不见互连的各网络的具体异构细节(如具体的编址方案、路由选择协议等)。

    0x01 路由与转发

    路由器主要完成两个功能:一是路由选择(确定哪一条路径),二是分组转发(当一个分组到达时所采取的动作)。前者是根据特定的路由选择协议构造出路由表,同时经常或定期地和相邻路由器交换路由信息而不断地更新和维护路由表。后者处理通过路由器的数据流,关键操作是转发表查询、转发及相关的队列管理和任务调度等。

    1. 路由选择。指按照复杂的分布式算法,根据从各相邻路由器所得到的关于整个网络拓扑的变化情况,动态地改变所选择的路由。
    2. 分组转发。指路由器根据转发表将用户的 IP 数据报从合适的端口转发出去。

    路由表是根据路由选择算法得出的,而转发表是从路由表得出的。转发表的结构应当使查找过程最优化,路由表则需要对网络拓扑变化的计算最优化。在讨论路由选择的原理时,往往不去区分转发表和路由表,而是笼统地使用路由表一词。

    0x02 SDN 的基本概念

    网络层的主要任务是转发和路由选择。可以将网络层抽象地划分为数据平面(也称转发层面)和控制平面,转发是数据平面实现的功能,而路由选择是控制平面实现的功能。

    软件定义网络(SDN)是近年流行的一种创新网络架构,它采用集中式的控制平面和分布式的数据平面,两个平面相互分离,控制平面利用控制-数据接口对数据平面上的路由器进行集中式控制,方便软件来控制网络。在传统互联网中,每个路由器既有转发表又有路由选择软件,也就是说,既有数据平面又有控制平面。但是在图 4.2 所示的 SDN 结构中,路由器都变得简单了,它的路由选择软件都不需要了,因此路由器之间不再相互交换路由信息。在网络的控制平面有一个逻辑上的远程控制器(可以由多个服务器组成)。远程控制器掌握各主机和整个网络的状态,为每个分组计算出最佳路由,通过 Openflow 协议(也可以通过其他途径)将转发表(在 SDN 中称为流表)下发给路由器。路由器的工作很单纯,即收到分组、查找转发表、转发分组。

    2

    这样,网络又变成集中控制的,本来互联网是分布式的。SDN 并非要把整个互联网都改造成如图 4.2 所示的集中控制模式,这是不现实的。然而,在某些具体条件下,特别是像一些大型的数据中心之间的广域网,使用 SDN 模式来建造,就可以使网络的运行效率更高。

    SDN 的可编程性通过为开发者们提供强大的编程接口,使得网络具有很好的编程性。对上层应用的开发者,SDN 提供的编程接口称为北向接口,北向接口提供了一系列丰富的 API,开发者可以在此基础上设计自己的应用,而不必关心底层的硬件细节。SDN 控制器和转发设备建立双向会话的接口称为南向接口,通过不同的南向接口协议(如 Openflow),SDN 控制器就可兼容不同口称为东西向接口,用于增强整个控制平面的可靠性和可拓展性。

    SDN 的优点:

    1. 全局集中式控制和分布式高速转发,既利于控制平面的全局优化,又利于高性能的网络转发
    2. 灵活可编程与性能的平衡,控制和转发功能分离后,使得网络可以由专有的自动化工具以编程方式配置。
    3. 降低成本,控制和数据平面分离后,尤其是在使用开放的接口协议后,就实现了网络设备的制造与功能软件的开发相分离,从而有效降低了成本。

    SDN 的问题:

    1. 安全风险,集中管理容易受攻击,如果崩溃,整个网络会受到影响。
    2. 瓶颈问题,原本分布式的控制平面集中化后,随着网络规模扩大,控制器可能成为网络性能的瓶颈。

    0x03 拥塞控制

    在通信子网中,因出现过量的分组而引起网络性能下降的现象称为拥塞。例如,某个路由器所在链路的带宽为 RB/s,如果 IP 分组只从它的某个端口进入,那么其速率为 rinB/s。当 rin=R 时,可能看起来是件“好事”,因为链路带宽被充分利用。但是,如图 4.3 所示,当分组到达路由器的速率接近 R 时,平均时延急剧增加,并且会有大量的分组被丢弃(路由器端口的缓时冲区是有限的),整个网络的吞吐量会骤降,源与目的地之间延的平均时延也会变得近乎无穷大。

    3

    判断网络是否进入拥塞状态的方法是,观察网络的吞吐量与网络负载的关系:如果随着网络负载的增加,网络的吞吐量明显小于正常的吞吐量,那么网络就可能已进入“轻度拥塞”状态:如果网络的吞吐量随着网络负载的增大而下降,那么网络就可能已进入拥塞状态;如果网络的负载继续增大,而网络的吞吐量下降到零,那么网络就可能已进入死锁状态。

    为避免拥塞现象的出现,要采用能防止拥塞的一系列方法对子网进行拥塞控制。拥塞控制主要解决的问题是如何获取网络中发生拥塞的信息,从而利用这些信息进行控制,以避免由于拥塞而出现分组的丢失,以及严重拥塞而产生网络死锁的现象。

    拥塞控制的作用是确保子网能够承载所达到的流量,这是一个全局性的过程,涉及各方面的行为:主机、路由器及路由器内部的转发处理过程等。单一地增加资源并不能解决拥塞。

    流量控制和拥塞控制的区别:流量控制往往是指在发送端和接收端之间的点对点通信量的控制。流量控制所要做的是抑制发送端发送数据的速率,以便使接收端来得及接收。而拥塞控制必须确保通信子网能够传送待传送的数据,是一个全局性的问题,涉及网络中所有的主机、路由器及导致网络传输能力下降的所有因素。

    拥塞控制的方法有两种:

    1. 开环控制。在设计网络时事先将有关发生拥塞的因素考虑周到,力求网络在工作时不产生拥塞。这是一种静态的预防方法。一旦整个系统启动并运行,中途就不再需要修改。开环控制手段包括确定何时可接收新流量、何时可丢弃分组及丢弃哪些分组,确定何种调度策略等。所有这些手段的共性是,在做决定时不考虑当前网络的状态。
    2. 闭环控制。事先不考虑有关发生拥塞的各种因素,采用监测网络系统去监视,及时检测哪里发生了拥塞,然后将拥塞信息传到合适的地方,以便调整网络系统的运行,并解决出现的问题。闭环控制是基于反馈环路的概念,是一种动态的方法。

     

    二、路由算法

    0x00 静态路由与动态路由

    路由器转发分组是通过路由表转发的,而路由表是通过各种算法得到的。从能否随网络的通信量或拓扑自适应地进行调整变化来划分,路由算法可以分为如下两大类。

    静态路由算法(又称非自适应路由算法)。指由网络管理员手工配置的路由信息。当网络的拓扑结构或链路的状态发生变化时,网络管理员需要手工去修改路由表中相关的静态路由信息。它不能及时适应网络状态的变化,对于简单的小型网络,可以采用静态路由。

    动态路由算法(又称自适应路由算法)。指路由器上的路由表项是通过相互连接的路由器之间彼此交换信息,然后按照一定的算法优化出来的,而这些路由信息会在一定时简间隙里不断更新,以适应不断变化的网络,随时获得最优的寻路效果。

    静态路由算法的特点是简便和开销较小,在拓扑变化不大的小网络中运行效果很好。动态路由算法能改善网络的性能并有助于流量控制;但算法复杂,会增加网络的负担,有时因对动态变化的反应太快而引起振荡,或反应太慢而影响网络路由的一致性,因此要仔细设计动态路由算法,以发挥其优势。常用的动态路由算法可分为两类:距离-向量路由算法和链路状态路由算法。

    0x01 距离-向量路由算法

    在距离-向量路由算法中,所有结点都定期地将它们的整个路由选择表传送给所有与之直接相邻的结点。这种路由选择表包含:

    注意:这里的距离是一个抽象的概念,如 RIP 就将距离定义为“跳数”。跳数指从源端口到达目的端口所经过的路由器个数,每经过一个路由器,跳数加 1。

    在这种算法中,所有结点都必须参与距离向量交换,以保证路由的有效性和一致性,也就是说,所有的结点都监听从其他结点传来的路由选择更新信息,并在下列情况下更新它们的路由选择表:

    1. 被通告一条新的路由,该路由在本结点的路由表中不存在,此时本地系统加入这条新的路由。
    2. 发来的路由信息中有一条到达某个目的地的路由,该路由与当前使用的路由相比,有较短的距离(较小的代价)。此种情况下,就用经过发送路由信息的结点的新路由替换路由表中到达那个目的地的现有路由。

    距离-向量路由算法的实质是,迭代计算一条路由中的站段数或延迟时间,从而得到到达一个目标的最短(最小代价)通路。它要求每个结点在每次更新时都将它的全部路由表发送给所有相邻的结点。显然,更新报文的大小与通信子网的结点个数成正比,大的通信子网将导致很大的更新报文。由于更新报文发给直接邻接的结点,所以所有结点都将参加路由选择信息交换。基于这些原因,在通信子网上传送的路由选择信息的数量很容易变得非常大。

    最常见的距离-向量路由算法是 RIP 算法,它采用 “跳数” 作为距离的度量。

    0x02 链路状态路由算法

    链路状态路由算法要求每个参与该算法的结点都具有完全的网络拓扑信息,它们执行下述两项任务。第一,主动测试所有邻接结点的状态。两个共享一条链接的结点是相邻结点,它们连接到同一条链路,或者连接到同一广播型物理网络。第二,定期地将链路状态传播给所有其他结点(或称路由结点)。典型的链路状态算法是 OSPF 算法。

    在一个链路状态路由选择中,一个结点检查所有直接链路的状态,并将所得的状态信息发送给网上的所有其他结点,而不是仅送给那些直接相连的结点。每个结点都用这种方式从网上所有其他的结点接收包含直接链路状态的路由选择信息。

    每当链路状态报文到达时,路由结点便使用这些状态信息去更新自己的网络拓扑和状态“视野图”,一旦链路状态发生变化,结点就对更新的网络图利用 Dijkstra 最短路径算法重新计算路由,从单一的源出发计算到达所有目的结点的最短路径。

    链路状态路由算法主要有三个特征:

    1. 向本自治系统中所有路由器发送信息,这里使用的方法是洪泛法,即路由器通过所有端口向所有相邻的路由器发送信息。而每个相邻路由器又将此信息发往其所有相邻路由器(但不再发送给刚刚发来信息的那个路由器)。
    2. 发送的信息是与路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。所谓“链路状态”,是指说明本路由器与哪些路由器相邻及该链路的“度量”。对于 OSPF 算法,链路状态的“度量”主要用来表示费用、距离、时延、带宽等。
    3. 只有当链路状态发生变化时,路由器才向所有路由器发送此信息。

    由于一个路由器的链路状态只涉及相邻路由器的连通状态,而与整个互联网的规模并无直接关系,因此链路状态路由算法可以用于大型的或路由信息变化聚敛的互联网环境。

    链路状态路由算法的主要优点是,每个路由结点都使用同样的原始状态数据独立地计算路径,而不依赖中间结点的计算;链路状态报文不加改变地传播,因此采用该算法易于查找故障。当一个结点从所有其他结点接收到报文时,它可以在本地立即计算正确的通路,保证一步汇聚。最后,由于链路状态报文仅运载来自单个结点关于直接链路的信息,其大小与网络中的路由结点数目无关,因此链路状态算法比距离-向量算法有更好的规模可伸展性。

    距离-向量路由算法与链路状态路由算法的比较:在距离-向量路由算法中,每个结点仅与它的直接邻居交谈,它为它的邻居提供从自己到网络中所有其他结点的最低费用估计。在链路状态路由算法中,每个结点通过广播的方式与所有其他结点交谈,但它仅告诉它们与它直接相连的链路的费用。相较之下,距离-向量路由算法有可能遇到路由环路等问题。

    0x03 层次路由

    当网络规模扩大时,路由器的路由表成比例地增大。这不仅会消耗越来越多的路由器缓冲区空间,而且需要用更多 CPU 时间来扫描路由表,用更多的带宽来交换路由状态信息。因此路由选择必须按照层次的方式进行。

    因特网将整个互联网划分为许多小的自治系统(注意一个自治系统中包含很多局域网),每个自治系统有权自主地决定本系统内应采用何种路由选择协议。如果两个自治系统需要通信,那么就需要一种在两个自治系统之间的协议来屏蔽这些差异。据此,因特网把路由选择协议划分为两大类:

    1. 一个自治系统内部所使用的路由选择协议称为内部网关协议(IGP),也称域内路由选择,具体的协议有 RIP 和 OSPF 等。
    2. 自治系统之间所使用的路由选择协议称为外部网关协议(EGP),也称域间路由选择,用在不同自治系统的路由器之间交换路由信息,并负责为分组在不同自治系统之间选择最优的路径。具体的协议有 BGP。

    使用层次路由时,OSPF 将一个自治系统再划分为若干区域(Area),每个路由器都知道在本区域内如何把分组路由到目的地的细节,但不用知道其他区域的内部结构。

    采用分层次划分区域的方法虽然会使交换信息的种类增多,也会使 OSPF 协议更加复杂。但这样做却能使每个区域内部交换路由信息的通信量大大减小,因而使 OSPF 协议能够用于规模很大的自治系统中。

     

    三、IPv4

    0x00 IPv4 分组

    IPv4 即现在普遍使用的 IP 协议(版本 4)。IP 协议定义数据传送的基本单元-一一 IP 分组及其确切的数据格式。IP 协议也包括一套规则,指明分组如何处理、错误怎样控制。特别是 IP 协议还包含非可靠投递的思想,以及与此关联的分组路由选择的思想。

    1. IPv4 分组的格式

    一个 IP 分组由首部和数据部分组成。首部前一部分的长度固定,共 20B,是所有 IP 分组必须具有的。在首部固定部分的后面是一些可选字段,其长度可变,用来提供错误检测及安全等机制。IP 数据报的格式如图所示。

    4

    IP 首部的部分重要字段含义如下:

    1. 版本。指 IP 协议的版本,目前广泛使用的版本号为 4。
    2. 首部长度。占 4 位,可以表示的最大十进制数是 15。以 32 位为单位,最大值为 60B(15×4B)。最常用的首部长度是 20B,·此时不使用任何选项(即可选字段)
    3. 总长度。占 16 位。指首部和数据之和的长度,单位为字节,因此数据报的最大长度为 216-1=65535B。以太网帧的最大传送单元(MTU)为 1500B,因此当-个 IP 数据报封装成帧时,数据报的总长度(首部加数据)一定不能超过下面的数据链路层的 MTU 值。
    4. 标识。占 16 位。它是一个计数器,每产生一个数据报就加 1,并赋值给标识字段。但它并不是“序号”(因为 IP 是无连接服务)。当一个数据报的长度超过网络的 MTU 时,必须分片,此时每个数据报片都复制一次标识号,以便能正确重装成原来的数据报。
    5. 标志。占 3 位。标志字段的最低位为 MF,MF = 1 表示后面还有分片,MF=0 表示最后一个分片。标志字段中间的一位是 DF,只有当 DF = 0 时才允许分片。
    6. 片偏移。占 13 位。它指出较长的分组在分片后,某片在原分组中的相对位置。片偏移以 8 个字节为偏移单位。除最后一个分片外,每个分片的长度一定是 8B 的整数倍。
    7. 生存时间(TTL)。占 8 位。数据报在网络中可通过的路由器数的最大值,标识分组在网络中的寿命,以确保分组不会永远在网络中循环。路由器在转发分组前,先把 TTL 减 1。若 TTL 被减为 O,则该分组必须丢弃。
    8. 协议。占 8 位。指出此分组携带的数据使用何种协议,即分组的数据部分应上交给哪个协议进行处理,如 TCP、UDP 等。其中值为 6 表示 TCP,值为 17 表示 UDP。
    9. 首部校验和。占 16 位。首部校验和只校验分组的首部,而不校验数据部分。
    10. 源地址字段。占 4B,标识发送方的 IP 地址。
    11. 目的地址字段。占 4B,标识接收方的 IP 地址。

    注意:在 IP 数据报首部中有三个关于长度的标记,首部长度、总长度、片偏移,基本单位分别为 4B、1B、8B(需要记住)。题目中经常会出现这几个长度之间的加减运算。另外,读者要熟悉 IP 数据报首部的各个字段的意义和功能,但不需要记忆 IP 数据报的首部,正常情况下如果需要参考首部,题目都会直接给出。第 5 章学到的 TCP、UDP 的首部也是一样的。

     

    2. IP 数据报分片

    一个链路层数据报能承载的最大数据量称为最大传送单元(MTU)。因为 IP 数据报被封装在链路层数据报中,因此链路层的 MTU 严格地限制着 IP 数据报的长度,而且在 IP 数据报的源与目的地路径上的各段链路可能使用不同的链路层协议,有不同的 MTU。例如,以太网的 MTU 为 1500B,而许多广域网的 MTU 不超过 576B。当 IP 数据包的总长度大于链路 MTU 时,就需要将 IP 数据报中的数据分装在多个较小的 IP 数据报中,这些较小的数据报称为

    片在目的地的网络层被重新组装。目的主机使用 IP 首部中的标识、标志和片偏移字段来完一个数据报分片时,形成的每个数据报(即片)都具有原始数据报的标识号。当目的主机收到来自同一发送主机的一批数据报时,它可以通过检查数据报的标识号来确定哪些数据报属于同一个原始数据报的片。IP 首部中的标志位占 3 位,但只有后 2 位有意义,分别是 MF 位(More Fragment)和 DF 位(Don't Fragment)。只有当 DF = 0 时,该 IP 数据报才可以被分片。MF 则用来告知目的主机该 IP 数据报是否为原始数据报的最后一个片。当 MF=1 时,表示相应的原始数据报还有后续的片;当 MF = 0 时,表示该数据报是相应原始数据报的最后一个片。目的主机在对片进行重组时,使用片偏移字段来确定片应放在原始 IP 数据报的哪个位置。

    IP 分片涉及一定的计算。例如,一个长 4000B 的 IP 数据报(首部 20B,数据部分 3980B)到达一个路由器,需要转发到一条 MTU 为 1500B 的链路上。这意味着原始数据报中的 3980B 数据必须被分配到 3 个独立的片中(每片也是一个 IP 数据报)。假定原始数据报的标识号为 777,那么分成的 3 片如图 4.5 所示。可以看出,由于偏移值的单位是 8B,所以除最后一个片外,其他所有片中的有效数据载荷都是 8 的倍数。

    5

    0x01 IPv4 地址与 NAT

    1. IPv4 地址

    连接到因特网上的每台主机(或路由器)都分配一个 32 比特的全球唯一标识符,即 IP 地址。IP 地址由互联网名字和数字地址分配机构 ICANN 进行分配。 互联网早期采用的是分类的 IP 地址,如图 4.6 所示。

    6

    无论哪类 IP 地址,都由网络号和主机号两部分组成。即 IP 地址 ::={<网络号>, <主机号>}。其中网络号标志主机(或路由器)所连接到的网络。一个网络号在整个因特网范围内必须是唯一的。主机号标志该主机(或路由器)。一台主机号在它前面的网络号所指明的网络范围内必须是唯一的。由此可见,一个 IP 地址在整个因特网范围内是唯一的。

    在各类 IP 地址中,有些 IP 地址具有特殊用途,不用做主机的 IP 地址:

    实际使用时,由于路由器对广播域的隔离,255.255.255.255 等效为本网络的广播地址。常用的三种类别 IP 地址的使用范围见下表。

    网络类别最大可用网络数第一个可用的网络号最后一个可用的网络号每个网络中的最大主机数
    A27 - 21126224 - 2
    B214128.0191.255216 - 2
    C221192.0.0223.255.25528 - 2

    在上表中,A 类地址可用的网络数为 27 - 2,减 2 的原因是: 第一,网络号字段全为 0 的 IP 地址是保留地址,意思是“本网络”; 第二,网络号为 127 的 IP 地址是环回自检地址。

    IP 地址有以下重要特点:

    1. 每个 IP 地址都由网络号和主机号两部分组成,因此 IP 地址是一种分等级的地址结构。分等级的好处是:

      1. IP 地址管理机构在分配 IP 地址时只分配网络号,而主机号则由得到该网络的单位自行分配,方便了 IP 地址的管理:
      2. 路由器仅根据目的主机所连接的网络号来转发分组(而不考虑目标主机号),从而减小了路由表所占的存储空间。
    2. IP 地址是标志一台主机(或路由器)和一条链路的接口。当一台主机同时连接到两个网络时,该主机就必须同时具有两个相应的 IP 地址,每个 IP 地址的网络号必须与所在网络的网络号相同,且这两个 IP 地址的主机号是不同的。因此 IP 网络上的一个路由器必然至少应具有两个 IP 地址(路由器每个端口必须至少分配一个 IP 地址)。

    3. 用转发器或桥接器(网桥等)连接的若干 LAN 仍然是同一个网络(同一个广播域),因此该 LAN 中所有主机的 IP 地址的网络号必须相同,但主机号必须不同。

    4. 在 IP 地址中,所有分配到网络号的网络(无论是 LAN 还是 WAN)都是平等的。

    5. 在同一个局域网上的主机或路由器的 IP 地址中的网络号必须是一样的。路由器总是具有两个或两个以上的 IP 地址,路由器的每个端口都有一个不同网络号的 IP 地址。

    近年来,由于广泛使用无分类 IP 地址进行路由选择,这种传统分类的 IP 地址已成为历史。

     

    2. 网络地址转换(NAT)

    网络地址转换(NAT)是指通过将专用网络地址(如 Intranet)转换为公用地址(如 Internet),从而对外隐藏内部管理的 IP 地址。它使得整个专用网只需要一个全球 IP 地址就可以与因特网连通,由于专用网本地 IP 地址是可重用的,所以 NAT 大大节省了 IP 地址的消耗。同时,它隐藏了内部网络结构,从而降低了内部网络受到攻击的风险。

    此外,为了网络安全,划出了部分 IP 地址为私有 IP 地址。私有 IP 地址只用于 LAN,不用于 WAN 连接(因此私有 IP 地址不能直接用于 Intemet,必须通过网关利用 NAT 把私有 IP 地址转换为 Internet 中合法的全球 IP 地址后才能用于 Internet),并且允许私有 IP 地址被 LAN 重复使用。这有效地解决了 IP 地址不足的问题。私有 IP 地址网段如下:

    在因特网中的所有路由器,对目的地址是私有地址的数据报一律不进行转发。这种采用私有 IP 地址的互联网络称为专用互联网或本地互联网。私有 IP 地址也称可重用地址

    使用 NAT 时需要在专用网连接到因特网的路由器上安装 NAT 软件,NAT 路由器至少有一个有效的外部全球 IP 地址。使用本地地址的主机和外界通信时,NAT 路由器使用 NAT 转换表进行本地 IP 地址和全球 IP 地址的转换。NAT 转换表中存放着{本地 IP 地址:端口}到{全球 IP 地址:端}的映射。通过这种映射方式,可让多个私有 IP 地址映射到一个全球 IP 地址。

    以宿舍共享上网为例,假设某个宿舍办理了 2Mb/s 的电信宽带,那么这个宿舍就获得了一个全球 IP 地址(如 138.76.29.7),而宿舍内 4 台主机使用私有地址(如 192.168.0.0 网段)。宿舍的网关路由器应开启 NAT 功能,并且某时刻路由器上的 NAT 转换表见下表。那么,当路由器从 LAN 端口收到源 IP 及源端口号为 192.168.0.2, 2233 的数据报时,就将其映射成 138.76.29.7, 5001,然后从 WAN 端口发送到因特网上。当路由器从 WAN 端口收到目的 IP 及目的端口号为 138.76.29.7, 5060 的数据报时,就将其映射成 192.168.0.3, 1234,然后从 LAN 端口发送给相应的本地主机。这样,只需要一个全球地址,就可以让多台主机同时访问因特网。

    WAN 端LAN 端
    138.76.29.7, 5001192.168.0.2 2233
    138.76.29.7, 5060192.168.0.3 1234

    下面以图 4.7 为例来说明 NAT 路由器的工作原理:

    1. 假设用户主机 10.0.0.1(随机端口 3345)向 Web 服务器 128.119.40.186(端口 80)发送请求。
    2. NAT 路由器收到 IP 分组后,为该 IP 分组生成一个新端口号 5001,将 IP 分组的源地址更改为 138.76.29.7(即 NAT 路由器的全球 IP 地址),将源端口号更改为 5001。NAT 路由器在 NAT 转换表中增加一个表项。
    3. Web 服务器并不知道刚抵达的 IP 分组已被 NAT 路由器进行了改装,更不知道用户的专用地址,它响应的 IP 分组的目的地址是 NAT 路由器的全球 IP 地址,目的端口号是 5001。
    4. 响应分组到达 NAT 路由器后,通过 NAT 转换表将 IP 分组的目的 IP 地址更改为 10.0.0.1,将目的端口号更改为 3345。

    7

    注意:普通路由器在转发 IP 数据报时,不改变其源 IP 地址和目的 IP 地址。而 NAT 路由器在转发 IP 数据报时,一定要更换其 IP 地址(转换源 IP 地址或目的 IP 地址)。普通路由器仅工作在网络层,而 NAT 路由器转发数据报时需要查看和转换传输层的端口号。

     

    0x02 子网划分与子网掩码、CIDR

    1. 子网划分

    两级 IP 地址的缺点:IP 地址空间的利用率有时很低;给每个物理网络分配一个网络号会使路由表变得太大而使网络性能变坏:两级的 IP 地址不够灵活。 从 1985 年起,在 IP 地址中又增加了一个“子网号字段”,使两级 IP 地址变成了三级 IP 地址。这种做法称为子网划分。子网划分已成为因特网的正式标准协议。

    子网划分的基本思路如下:

    注意:

    1. 划分子网只是把 IP 地址的主机号这部分进行再划分,而不改变 IP 地址原来的网络号。因此,从一个 IP 地址本身或 IP 数据报的首部,无法判断源主机或目的主机所连接的网络是否进行了子网划分。
    2. RFC 950 规定,对分类的 IPv4 地址进行子网划分时,子网号不能为全 1 或全 0。但随着 CIDR 的广泛使用,现在全 1 和全 0 的子网号也可使用,但一定要谨慎使用,要弄清你的路由器所用的路由选择软件是否支持全 0 或全 1 的子网号。
    3. 不论是分类的 IPv4 地址还是 CIDR,其子网中的主机号为全 0 或全 1 的地址都不能被指派。子网中主机号全 0 的地址为子网的网络号,主机号全 1 的地址为子网的广播地址。

     

    2. 子网掩码

    为了告诉主机或路由器对一个 A 类、B 类、C 类网络进行了子网划分,使用子网掩码来表达对原网络中主机号的借位。

    子网掩码是一个与 IP 地址相对应的、长 32bit 的二进制串,它由一串 1 和跟随的一串 0 组成。其中,1 对应于 IP 地址中的网络号及子网号,而 0 对应于主机号。计算机只需将 IP 地址和其对应的子网掩码逐位“与”(逻辑 AND 运算),就可得出相应子网的网络地址。

    现在的因特网标准规定:所有的网络都必须使用子网掩码。如果一个网络未划分子网,那么就采用默认子网掩码。A、B、C 类地址的默认子网掩码分别为 255.0.0.0、255.255.255.0、255.255.255.0。例如,某主机的 IP 地址 192.168.5.56,子网掩码为 255.255.255.0,进行逐位“与”运算后,得出该主机所在子网的网络号为 192.168.5.0。

    由于子网掩码是一个网络或一个子网的重要属性,所以路由器在相互之间交换路由信息时,必须把自己所在网络(或子网)的子网掩码告诉对方。路由表中的每个条目,除要给出目的网络地址和下一跳地址外,还要同时给出该目的网络的子网掩码。

    在使用子网掩码的情况下:

    1. 一台主机在设置 IP 地址信息的同时,必须设置子网掩码
    2. 同属于一个子网的所有主机及路由器的相应端口,必须设置相同的子网掩码
    3. 路由器的路由表中,所包含信息的主要内容有目的网络地址、子网掩码、下一跳地址

     

    3. 无分类编址 CIDR

    无分类域间路由选择 CIDR 是在变长子网掩码的基础上提出的一种消除传统 A、B、C 类网络划分,并且可以在软件的支持下实现超网构造的一种 IP 地址的划分方法。

    例如,如果一个单位需要 2000 个地址,那么就给它分配一个 2048 地址的块(8 个连续的 C 类网络),而不是一个完全的 B 类地址。这样可以大幅度提高 IP 地址空间的利用率,减小路由器的路由表大小,提高路由转发能力。

    CIDR 消除了传统 A、B、C 类地址及划分子网的概念,因而可以更有效地分配 IPv4 的地址空间。CIDR 使用“网络前缀”的概念代替子网络的概念,与传统分类 IP 地址最大的区别就是,网络前缀的位数不是固定的,可以任意选取。CIDR 的记法是:IP:={<网络前缀>,<主机号>}

    CIDR 还使用“斜线记法”(或称 CIDR 记法),即 IP 地址/网络前缀所占比特数。其中,网络前缀所占比特数对应于网络号的部分,等效于子网掩码中连续 1 的部分。例如,对于 128.14.32.5/20 这个地址,它的掩码是 20 个连续的 1 和后续 12 个连续的 0,通过按位与可以得到该地址的网络前缀(或直接截取前 20 位):

    7-1

     

    CIDR 虽然不使用子网,但仍然使用 “掩码” 一词,“CIDR 不使用子网” 是指 CIDR 并没有在 32 位地址中指明若干位作为子网字段。但分配到一个 CIDR 地址块的组织,仍可以在本组织内根据需要划分出一些子网。例如,某组织分配到地址块/20,就可以再继续划分为 8 个子网(从主机号中借用 3 位来划分子网),这时每个子网的网络前缀就变成了 23 位。全 0 和全 1 的主机号地址一般不使用。

    将网络前缀都相同的连续 IP 地址组成 “CIDR 地址块”。一个 CIDR 地址块可以表示很多地址,这种地址的聚合称为路由聚合,或称构成超网。路由聚合使得路由表中的一个项目可以表示多个原来传统分类地址的路由,有利于减少路由器之间的信息的交换,从而提高网络性能。

    例如,在如图 4.8 所示的网络中,如果不使用路由聚合,那么 R1 的路由表中需要分别有到网络 1 和网络 2 的路由表项。不难发现,网络 1 和网络 2 的网络前缀在二进制表示的情况下,前 16 位都是相同的,第 17 位分别是 0 和 1,并且从 R1 到网络 1 和网络 2 的路由的下一跳皆为 R2。若使用路由聚合,在 R1 看来,网络 1 和网络 2 可以构成一个更大的地址块 206.1.0.0/16,到网络 1 和网络 2 的两条路由就可以聚合成一条到 206.1.0.0/16 的路由。

    8

    CIDR 地址块中的地址数一定是 2 的整数次幂,实际可指派的地址数通常为 2N - 2,N 表示主机号的位数,主机号全 0 代表网络号,主机号全 1 为广播地址。网络前缀越短,其地址块所包含的地址数就越多。而在三级结构的 IP 地址中,划分子网使网络前缀变长。 CIDR 的优点在于网络前缀长度的灵活性。由于上层网络的前缀长度较短,因此相应的路由表的项目较少。而内部又可采用延长网络前缀的方法来灵活地划分子网。

    最长前缀匹配(最佳匹配):使用 CIDR 时,路由表中的每个项目由“网络前缀”和“下一跳地址”组成。在查找路由表时可能会得到不止一个匹配结果。此时,应当从匹配结果中选择具有最长网络前缀的路由,因为网络前缀越长,其地址块就越小,因而路由就越具体。

    CIDR 查找路由表的方法:为了更加有效地查找最长前缀匹配,通常将无分类编址的路由表存放在一种层次式数据结构中,然后自上而下地按层次进行查找。这里最常用的数据结构就是二叉线索。

     

    4. 网络层转发分组的过程

    分组转发都是基于目的主机所在网络的,这是因为互联网上的网络数远小于主机数,可以极大地压缩转发表的大小。当分组到达路由器后,路由器根据目的 IP 地址的网络前缀来查找转发表,确定下一跳应当到哪个路由器。因此,在转发表中,每条路由必须有下面两条信息:(目的网络,下一跳地址)

    这样,IP 数据报最终一定可以找到目的主机所在目的网络上的路由器(可能要通过多次间接交付),当到达最后一个路由器时,才试图向目的主机进行直接交付。

    采用 CIDR 编址时,如果一个分组在转发表中可以找到多个匹配的前缀,那么应当选择前缀最长的一个作为匹配的前缀,称为最长前缀匹配。网络前缀越长,其地址块就越小,因而路由就越精准。为了更快地查找转发表,可以按照前缀的长短,将前缀最长的排在第 1 行,按前缀长度的降序排列。这样,从第 1 行最长的开始查找,只要检索到匹配的,就不必再继续查找。

    此外,转发表中还可以增加两种特殊的路由:

    综上所述,归纳出路由器执行的分组转发算法如下:

    1. 从收到的 IP 分组的首部提取目的主机的 IP 地址 D(即目的地址)。
    2. 若查找到特定主机路由(目的地址为 D),就按照这条路由的下一跳转发分组;否则从转发表中的下一条(即按前缀长度的顺序)开始检查,执行步骤 3。
    3. 将这一行的子网掩码与目的地址 D 进行按位与运算。若运算结果与本行的前缀匹配,则查找结束,按照“下一跳”指出的进行处理(或者直接交付本网络上的目的主机,或通过指定接口发送到下一跳路由器)。否则,若转发表还有下一行,则对下一行进行检查,重新执行步骤 3)。否则,执行步骤 4。
    4. 若转发表中有一个默认路由,则把分组传送给默认路由;否则,报告转发分组出错。

    值得注意的是,转发表(或路由表)并未给分组指明到某个网络的完整路径(即先经过哪个路由器,然后再经过哪个路由器等)。转发表指出,到某个网络应该先到某个路由器(即下一跳路由器),在到达下一跳路由器后,再继续查找其转发表,知道下一步应当到哪个路由器。这样一步一步地查找下去,直到最后到达目的网络。

    注意:得到下一跳路由器的 IP 地址后,并不是直接将该地址填入待发送的数据报,而是将该 IP 地址转换成 MAC 地址(通过 ARP),将此 MAC 地址放到 MAC 帧首部中,然后根据这个 MAC 地址找到下一跳路由器。在不同网络中传送时,MAC 帧中的源地址和目的地址要发生变化,但是网桥在转发帧时,不改变顿的源地址,请注意区分。

     

    0x03 ARP、DHCP 与 ICMP

    1. IP 地址与硬件地址

    IP 地址是网络层使用的地址,它是分层次等级的。硬件地址是数据链路层使用的地址(MAC 地址),它是平面式的。在网络层及网络层之上使用 IP 地址,IP 地址放在 IP 数据报的首部,而 MAC 地址放在 MAC 帧的首部。通过数据封装,把 IP 数据报分组封装为 MAC 帧后,数据链路层看不见数据报分组中的 IP 地址。

    由于路由器的隔离,IP 网络中无法通过广播 MAC 地址来完成跨网络的寻址,因此在网络层只使用 IP 地址来完成寻址。寻址时,每个路由器依据其路由表(依靠路由协议生成)选择到目标网络(即主机号全为 0 的网络地址)需要转发到的下一跳(路由器的物理端口号或下一网络地址),而 IP 分组通过多次路由转发到达目标网络后,改为在目标 LAN 中通过数据链路层的 MAC 地址以广播方式寻址。这样可以提高路由选择的效率。

    1. 在 IP 层抽象的互联网上只能看到 IP 数据报。
    2. 虽然在 IP 数据报首部中有源 IP 地址,但路由器只根据目的 IP 地址进行转发。
    3. 在局域网的链路层,只能看见 MAC 帧。IP 数据报被封装在 MAC 帧中,通过路由器转发 IP 分组时,IP 分组在每个网络中都被路由器解封装和重新封装,其 MAC 帧首部中的源地址和目的地址会不断改变。这也决定了无法使用 MAC 地址跨网络通信。
    4. 尽管互连在一起的网络的硬件地址体系各不相同,但 IP 层抽象的互联网却屏蔽了下层这些复杂的细节。只要我们在网络层上讨论问题,就能够使用统一的、抽象的 IP 地址研究主机与主机或路由器之间的通信。

    注意:路由器由于互连多个网络,因此它不仅有多个 IP 地址,也有多个硬件地址。

     

    2. 地址解析协议(ARP)

    无论网络层使用什么协议,在实际网络的链路上传送数据帧时,最终必须使用硬件地址。所以需要一种方法来完成 IP 地址到 MAC 地址的映射,这就是地址解析协议(Address Resolution Protocol,ARP)。每台主机都设有一个 ARP 高速缓存,用来存放本局域网上各主机和路由器的 IP 地址到 MAC 地址的映射表,称 ARP 表。

    使用 ARP 来动态维护此 ARP 表。ARP 工作在网络层,其工作原理如下: 主机 A 欲向本局域网上的某台主机 B 发送 IP 数据报时,先在其 ARP 高速缓存中查看有无主机 B 的 IP 地址。 如果有,就可查出其对应的硬件地址,再将此硬件地址写入 MAC 帧,然后通过局域网将该 MAC 帧发往此硬件地址。 如果没有,那么就通过使用目的 MAC 地址为 FFFF-FF-FF-FF-FF 的帧来封装并广播 ARP 请求分组(广播发送),使同一个局域网里的所有主机都收到此 ARP 请求。 主机 B 收到该 ARP 请求后,向主机 A 发出 ARP 响应分组(单播发送),分组中包含主机 B 的 IP 与 MAC 地址的映射关系,主机 A 收到 ARP 响应分组后就将此映射写入 ARP 缓存,然后按查询到的硬件地址发送 MAC 帧。ARP 由于“看到了”IP 地址,所以它工作在网络层,而 NAT 路由器由于“看到了”端口,所以它工作在传输层。对于某个协议工作在哪个层次,读者应该能通过协议的工作原理进行猜测。

    注意:ARP 用于解决同一个局域网上的主机或路由器的 IP 地址和硬件地址的映射问题。如果所要找的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络。剩下的工作就由下一个网络来做,尽管 ARP 请求分组是广播发送的,但 ARP 响应分组是普通的单播,即从一个源地址发送到一个目的地址

    使用 ARP 的 4 种典型情况总结如下:

    9

    1. 发送方是主机(如 H1),要把 IP 数据报发送到本网络上的另一台主机(如 H2)。这时 H1 在网 1 用 ARP 找到目的主机 H2 的硬件地址。
    2. 发送方是主机(如 H1),要把 IP 数据报发送到另一个网络上的一台主机(如 H3)。这时 H1 用 ARP 找到与网 1 连接的路由器 R1 的硬件地址,剩下的工作由 R1 来完成。
    3. 发送方是路由器(如 R1),要把 IP 数据报转发到与 R1 连接的网络(网 2)上的一台主机(如 H3)。这时 R1 在网 2 用 ARP 找到目的主机 H3 的硬件地址。
    4. 发送方是路由器(如 R1),要把 IP 数据报转发到网 3 上的一台主机(如 H4)。这时 R1 在网 2 用 ARP 找到与网 2 连接的路由器 R2 的硬件地址,剩下的工作由 R2 来完成。

    从 IP 地址到硬件地址的解析是自动进行的,主机的用户并不知道这种地址解析过程。只要主机或路由器和本网络上的另一个已知 IP 地址的主机或路由器进行通信,ARP 就会自动地将这个 IP 地址解析为数据链路层所需要的硬件地址。

     

    3. 动态主机配置协议(DHCP)

    动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)常用于给主机动态地分配 IP 地址,它提供了即插即用的联网机制,这种机制允许一台计算机加入新的网络和获取 IP 地址而不用手工参与。DHCP 是应用层协议,它是基于 UDP 的。

    DHCP 的工作原理如下:使用客户/服务器模式。需要 IP 地址的主机在启动时就向 DHCP 服务器广播发送发现报文,这时该主机就成为 DHCP 客户。本地网络上所有主机都能收到此广播报文,但只有 DHCP 服务器才回答此广播报文。DHCP 服务器先在其数据库中查找该计算机的配置信息。若找到,则返回找到的信息。若找不到,则从服务器的 IP 地址池中取一个地址分配给该计算机。DHCP 服务器的回答报文称为提供报文

    DHCP 服务器和 DHCP 客户端的交换过程如下:

    1. DHCP 客户机广播“DHCP 发现”消息,试图找到网络中的 DHCP 服务器,以便从 DHCP 服务器获得一个 IP 地址。源地址为 0.0.0.0,目的地址为 255.255.255.255
    2. DHCP 服务器收到 “DHCP 发现” 消息后,广播 “DHCP 提供” 消息,其中包括提供给 DHCP 客户机的 IP 地址。源地址为 DHCP 服务器地址,目的地址为 255.255.255.255
    3. DHCP 客户机收到 “DHCP 提供” 消息,如果接收该 IP 地址,那么就广播 “DHCP 请求” 消息向 DHCP 服务器请求提供 IP 地址。源地址为 0.0.0.0,目的地址为 255.255.255.255
    4. DHCP 服务器广播 “DHCP 确认” 消息,将 IP 地址分配给 DHCP 客户机,源地址为 DHCP 服务器地址, 目的地址为 255.255.255.255

    DHCP 允许网络上配置多台 DHCP 服务器,当 DHCP 客户机发出“DHCP 发现”消息时,有可能收到多个应答消息。这时,DHCP 客户机只会挑选其中的一个,通常挑选最先到达的。

    DHCP 服务器分配给 DHCP 客户的 IP 地址是临时的,因此 DHCP 客户只能在一段有限的时间内使用这个分配到的 IP 地址。DHCP 称这段时间为租用期。租用期的数值应由 DHCP 服务器自己决定,DHCP 客户也可在自己发送的报文中提出对租用期的要求。

    DHCP 的客户端和服务器端需要通过广播方式来进行交互,原因是在 DHCP 执行初期,客户端不知道服务器端的 IP 地址,而在执行中间,客户端并未被分配 IP 地址,从而导致两者之间的通信必须采用广播的方式。采用 UDP 而不采用 TCP 的原因也很明显:TCP 需要建立连接,如果连对方的 IP 地址都不知道,那么更不可能通过双方的套接字建立连接。

    DHCP 是应用层协议,因为它是通过客户/服务器模式工作的,DHCP 客户端向 DHCP 服务器请求服务,而其他层次的协议是没有这两种工作方式的。

     

    4. 网际控制报文协议(ICMP)

    为了提高 IP 数据报交付成功的机会,在网络层使用了网际控制报文协议(Internet Control Message Protocol,ICMP)来让主机或路由器报告差错和异常情况。ICMP 报文作为 IP 层数据报的数据,加上数据报的首部,组成 IP 数据报发送出去。ICMP 是网络层协议。

    ICMP 报文的种类有两种,即 ICMP 差错报告报文和 ICMP 询问报文。

    ICMP 差错报告报文用于目标主机或到目标主机路径上的路由器向源主机报告差错和异常情况。共有以下 5 种常用的类型:

    1. 终点不可达。当路由器或主机不能交付数据报时,就向源点发送终点不可达报文
    2. 源点抑制。当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢。
    3. 时间超过。当路由器收到生存时间(TTL)为零的数据报时,除丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文。
    4. 参数问题。当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。
    5. 改变路由(重定向)。路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)。

    不应发送 ICMP 差错报告报文的几种情况如下:

    1. 对 ICMP 差错报告报文不再发送 ICMP 差错报告报文。
    2. 对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文。
    3. 对具有组播地址的数据报都不发送 ICMP 差错报告报文。
    4. 对具有特殊地址(如 127.0.0.0 或 0.0.0.0)的数据报不发送 ICMP 差错报告报文

    ICMP 询问报文有 4 种类型:回送请求和回答报文、时间戳请求和回答报文、地址掩码请求和回答报文、路由器询问和通告报文,最常用的是前两类。

    ICMP 的两个常见应用是分组网间探测 PING(用来测试两台主机之间的连通性)和 Traceroute(UNIX 中的名字,在 Windows 中是 Tracert,可以用来跟踪分组经过的路由)。其中 PING 使用了 ICMP 回送请求和回答报文,Traceroute(Tracert)使用了 ICMP 时间超过报文。

    注意:PING 工作在应用层,它直接使用网络层的 ICMP,而未使用传输层的 TCP 或 UDP。Traceroute/Tracert 工作在网络层。

     

    四、IPv6

    0x00 IPv6 的主要特点

    解决“IP 地址耗尽”问题的措施有以下三种:

    1. 采用无类别编址 CIDR,使 IP 地址的分配更加合理
    2. 采用网络地址转换(NAT)方法以节省全球 IP 地址
    3. 采用具有更大地址空间的新版本的 IPv6。其中前两种方法只是延长了 IPv4 地址分配完毕的时间,只有第三种方法从根本上解决了 IP 地址的耗尽问题。

    IPv6 的主要特点如下:

    1. 更大的地址空间。IPv6 将地址从 IPv4 的 32 位增大到了 128 位。IPv6 的字节数(16B)是 IPv4 字节数(4B)的平方
    2. 扩展的地址层次结构
    3. 灵活的首部格式
    4. 改进的选项
    5. 允许协议继续扩充
    6. 支持即插即用(即自动配置)
    7. 支持资源的预分配
    8. IPv6 只有在包的源结点才能分片,是端到端的,传输路径中的路由器不能分片,所以从一般意义上说,IPv6 不允许分片(不允许类似 IPv4 的路由分片)
    9. IPv6 首部长度必须是 8B 的整数倍,而 IPv4 首部是 4B 的整数倍
    10. 增大了安全性。身份验证和保密功能是 IPv6 的关键特征

    虽然 IPv6 与 IPv4 不兼容,但总体而言它与所有其他的因特网协议兼容,包括 TCP、UDP、ICMP、IGMP、OSPF、BGP 和 DNS,只是在少数地方做了必要的修改(大部分是为了处理长的地址)。IPv6 相当好地满足了预定的目标,主要体现在:

    1. 首先也是最重要的,IPv6 有比 IPv4 长得多的地址。IPv6 的地址用 16 个字节表示,地址空间是 IPv4 的 2128-32=296 倍,从长远来看,这些地址是绝对够用的。
    2. 简化了 IP 分组头,它包含 8 个域(IPv4 是 12 个域)。这一改变使得路由器能够更快地处理分组,从而可以改善吞吐率。
    3. 更好地支持选项。这一改变对新的分组首部很重要,因为一些从前必要的段现在变成了可选段。此外,表示选项的方式的改变还能加快分组的处理速度。

     

    0x01 IPv6 地址

    IPv6 数据报的目的地址可以是以下三种基本类型地址之一

    1. 单播。单播就是传统的点对点通信。
    2. 多播。多播是一点对多点的通信,分组被交付到一组计算机的每台计算机。
    3. 任播。这是 IPv6 增加的一种类型。任播的目的站是一组计算机,但数据报在交付时只交付其中的一台计算机,通常是距离最近的一台计算机。

    IPv4 地址通常使用点分十进制表示法。如果 IPv6 也使用这种表示法,那么地址书写起来将会相当长。在 IPv6 标准中指定了一种比较紧凑的表示法,即把地址中的每 4 位用一个十六进制数表示,并用冒号分隔每 16 位,如 4BF5:AA12:0216:FEBC:BA5F:039A:BE9A:2170。

    通常可以把 IPv6 地址缩写成更紧凑的形式。当 16 位域的开头有一些 0 时,可以采用一种缩写表示法,但在域中必须至少有一个数字。例如,可以把地址 4BF5:0000:0000:0000:BA5F:039A:000A:2176 缩写为 4BF5:0:0:0:BA5F:39A:A:2176。

    当有相继的 0 值域时,还可以进一步缩写。这些域可以用双冒号缩写(:)。当然,双冒号表示法在一个地址中仅能出现一次,因为 0 值域的个数没有编码,.需要从指定的总的域的个数来推算。这样一来,前述地址可被更紧凑地书写成 4BF5::BA5F:39A:A:2176。

    IPv6 扩展了 IPv4 地址的分级概念,它使用以下 3 个等级:第一级(顶级)指明全球都知道的公共拓扑;第二级(场点级)指明单个场点;第三级指明单个网络接口。IPv6 地址采用多级体系主要是为了使路由器能够更快地查找路由。

    从 IPv4 向 IPv6 过渡只能采用逐步演进的办法,同时还必须使新安装的 IPv6 系统能够向后兼容。IPv6 系统必须能够接收和转发 IPv4 分组,并且能够为 IPv4 分组选择路由。

    从 IPv4 向 IPv6 过渡可以采用双协议栈和隧道技术两种策略:双协议栈是指在一台设备上同时装有 IPv4 和 IPv6 协议栈,那么这台设备既能和 IPv4 网络通信,又能和 IPv6 网络通信。如果这台设备是一个路由器,那么在路由器的不同接口上分别配置了 IPv4 地址和 IPv6 地址,并很可能分别连接了 IPv4 网络和 IPv6 网络:如果这台设备是一台计算机,那么它将同时拥有 IPv4 地址和 IPv6 地址,并具备同时处理这两个协议地址的功能。隧道技术的要点是在 IPv6 数据报要进入 IPv4 网络时,把整个 IPv6 数据报封装到 IPv4 数据报的数据部分,使得 IPv6 数据报就好像在 IPv4 网络的隧道中传输。

     

    五、路由协议

    0x00 自治系统

    自治系统(Autonomous System,AS):单一技术管理下的一组路由器,这些路由器使用一种 AS 内部的路由选择协议和共同的度量来确定分组在该 AS 内的路由,同时还使用一种 AS 之间的路由选择协议来确定分组在 AS 之间的路由。 一个自治系统内的所有网络都由一个行政单位.(如一家公司、一所大学、一个政府部门等)管辖,一个自治系统的所有路由器在本自治系统内都必须是连通的。

    0x01 域内路由与域间路由

    自治系统内部的路由选择称为域内路由选择,自治系统之间的路由选择称为域间路由选择。.因特网有两大类路由选择协议。

    1. 内部网关协议(Interior Gateway Protocol,IGP)

    内部网关协议即在一个自治系统内部使用的路由选择协议,它与互联网中其他自治系统选用什么路由选择协议无关。目前这类路由选择协议使用得最多,如 RIP 和 OSPF。

    2. 外部网关协议(External Gateway Protocol,EGP)

    若源站和目的站处在不同的自治系统中,当数据报传到一个自治系统的边界时(两个自治系统可能使用不同的 IGP),就需要使用一种协议将路由选择信息传递到另一个自治系统中。这样的协议就是外部网关协议(EGP)。目前使用最多的外部网关协议是 BGP-4。

    下图是两个自治系统互连的示意图。每个自治系统自己决定在本自治系统内部运行哪个内部路由选择协议(例如,可以是 RIP,也可以是 OSPF),但每个自治系统都有一个或多个路由器(途中的路由器 R1 和 R2)。除运行本系统的内部路由选择协议外,还要运行自治系统间的路由选择协议(如 BGP-4)。

    10

    0x02 路由信息协议(RIP)

    路由信息协议(Routing Information Protocol,RIP)是内部网关协议(IGP)中最先得到广泛应用的协议。RIP 是一种分布式的基于距离向量的路由选择协议,其最大优点就是简单。

    1. RIP 规定

    1. 网络中的每个路由器都要维护从它自身到其他每个目的网络的距离记录(因此这是一组距离,称为距离向量
    2. 距离也称跳数(Hop Count),规定从一个路由器到直接连接网络的距离(跳数)为 1。而每经过一个路由器,距离(跳数)加 1
    3. RIP 认为好的路由就是它通过的路由器的数目少,即优先选择跳数少的路径。
    4. RIP 允许一条路径最多只能包含 15 个路由器(即最多允许 15 跳)。因此距离等于 16 时,它表示网络不可达。可见 RIP 只适用于小型互联网。距离向量路由可能会出现环路的情况,规定路径上的最高跳数的目的是为了防止数据报不断循环在环路上,减少网络拥塞的可能性
    5. RIP 默认在任意两个使用 RIP 的路由器之间每 30 秒广播一次 RIP 路由更新信息,以便自动建立并维护路由表(动态维护)
    6. 在 RIP 中不支持子网掩码的 RIP 广播,所以 RIP 中每个网络的子网掩码必须相同。但在新的 RIP2 中,支持变长子网掩码和 CIDR

     

    2. RIP 的特点(注意与 OSPF 的特点比较)

    1. 仅和相邻路由器交换信息。
    2. 路由器交换的信息是当前路由器所知道的全部信息,即自己的路由表。
    3. 按固定的时间间隔交换路由信息,如每隔 30 秒。

    RIP 通过距离向量算法来完成路由表的更新。最初,每个路由器只知道与自己直接相连的网络。通过每 30 秒的 RIP 广播,相邻两个路由器相互将自己的路由表发给对方。于是经过第一次 RIP 广播,每个路由器就知道了与自己相邻的路由器的路由表(即知道了距离自己跳数为 1 的网络的路由)。同理,经过第二次 RIP 广播,每个路由器就知道了距离自己跳数为 2 的网络的路由……因此,经过若干 RIP 广播后,所有路由器都最终知道了整个 IP 网络的路由表,称为 RIP 最终是收敛的。通过 RIP 收敛后,每个路由器到每个目标网络的路由都是距离最短的(即跳数最少,最短路由),哪怕还存在另一条高速(低时延)但路由器较多的路由。

    3. 距离向量算法

    每个路由表项目都有三个关键数据:<目的网络 N,距离 d,下一跳路由器地址 X>。对于每个相邻路由器发送过来的 RIP 报文,执行如下步骤:

    1. 对地址为 X 的相邻路由器发来的 RIP 报文,先修改此报文中的所有项目:把“下一跳”字段中的地址都改为 X,并把所有“距离”字段的值加 1。

    2. 对修改后的 RIP 报文中的每个项目,执行如下步骤:

      1. 当原来的路由表中没有目的网络 N 时,把该项目添加到路由表中。
      2. 当原来的路由表中有目的网络 N,且下一跳路由器的地址是 X 时,用收到的项目替换原路由表中的项目。
      3. 当原来的路由表中有目的网络 N,且下一跳路由器的地址不是 X 时,如果收到的项目中的距离 d 小于路由表中的距离,那么就用收到的项目替换原路由表中的项目;否则什么也不做。
    3. 如果 180 秒(RIP 默认超时时间为 180 秒)还没有收到相邻路由器的更新路由表,那么把此相邻路由器记为不可达路由器,即把距离设置为 16(距离为 16 表示不可达)。

    4. 返回。

    RIP 最大的优点是实现简单、开销小、收敛过程较快。RIP 的缺点如下:

    1. RIP 限制了网络的规模,它能使用的最大距离为 15(16 表示不可达)。
    2. 路由器之间交换的是路由器中的完整路由表,因此网络规模越大,开销也越大。
    3. 网络出现故障时,会出现慢收敛现象(即需要较长时间才能将此信息传送到所有路由器),俗称“坏消息传得慢”,使更新过程的收敛时间长。

    RIP 是应用层协议,它使用 UDP 传送数据(端口 520)。RIP 选择的路径不一定是时间最短的,但一定是具有最少路由器的路径。因为它是根据最少跳数进行路径选择的。

     

    0x03 开放最短路径优先(OSPF)协议

    1. OSPF 协议的基本特点

    开放最短路径优先(OSPF)协议是使用分布式链路状态路由算法的典型代表,也是内部网关协议(IGP)的一种。OSPF 与 RIP 相比有以下 4 点主要区别:

    1. OSPF 向本自治系统中的所有路由器发送信息,这里使用的方法是洪泛法。而 RIP 仅向自己相邻的几个路由器发送信息
    2. 发送的信息是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。“链路状态” 说明本路由器和哪些路由器相邻及该链路的 “度量”(或代价)。而在 RIP 中,发送的信息是本路由器所知道的全部信息,即整个路由表
    3. 只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息,并且更新过程收敛得快,不会出现 RIP“坏消息传得慢”的问题。而在 RIP 中,不管网络拓扑是否发生变化,路由器之间都会定期交换路由表的信息。
    4. OSPF 是网络层协议,它不适用 UDP 或 TCP,而直接用 IP 数据报传送(其 IP 数据报首部的协议字段为 89)。而 RIP 是应用层协议,它在传输层使用 UDP。

    除以上区别外,OSPF 还有以下特点:

    1. OSPF 对不同的链路可根据 IP 分组的不同服务类型(TOS)而设置成不同的代价。因此,OSPF 对于不同类型的业务可计算出不同的路由,十分灵活
    2. 如果到同一个目的网络有多条相同代价的路径,那么可以将通信量分配给这几条路径。这称为多路径间的负载平衡
    3. 所有在:OSPF-路由器之间交换的分组都具有鉴别功能,因而保证了仅在可信赖的路由器之间交换链路状态信息
    4. 支持可变长度的子网划分和无分类编址 CIDR
    5. 每个链路状态都带上一个 32 位的序号,序号越大,状态就越新

     

    2. OSPF 的基本工作原理

    由于各路由器之间频繁地交换链路状态信息,因此所有路由器最终都能建立一个链路状态数据库。这个数据库实际上就是全网的拓扑结构图,它在全网范围内是一致的(称为链路状态数据库的同步)。然后,每个路由器根据这个全网拓扑结构图,使用 Dijkstra 最短路径算法计算从自己到各目的网络的最优路径,以此构造自己的路由表。此后,当链路状态发生变化时,每个路由器重新计算到各目的网络的最优路径,构造新的路由表。

    注意:虽然使用 Dijkstra 算法能计算出完整的最优路径,但路由表中不会存储完整路径,而只存储“下一跳”(只有到了下一跳路由器,才能知道再下一跳应当怎样走)

    为使 OSPF 能够用于规模很大的网络,OSPF 将一个自治系统再划分为若干更小的范围,称为区域。划分区域的好处是,将利用洪泛法交换链路状态信息的范围局限于每个区域而非整个自治系统,减少了整个网络上的通信量。在一个区域内部的路由器只知道本区域的完整网络拓扑,而不知道其他区域的网络拓扑情况。这些区域也有层次之分。处在上层的域称为主干区域,负责连通其他下层的区域,并且还连接其他自治域。

     

    3. OSPF 的五种分组类型

    OSPF 共有以下五种分组类型:

    1. 问候分组,用来发现和维持邻站的可达性。
    2. 数据库描述分组,向邻站给出自己的链路状态数据库中的所有链路状态项目的摘要信息。
    3. 链路状态请求分组,向对方请求发送某些链路状态项目的详细信息。
    4. 链路状态更新分组,用洪泛法对全网更新链路状态。
    5. 链路状态确认分组,对链路更新分组的确认。

    通常每隔 10 秒,每两个相邻路由器要交换一次问候分组,以便知道哪些站可达。在路由器刚开始工作时,OSPF 让每个路由器使用数据库描述分组和相邻路由器交换本数据库中已有的链路状态摘要信息。然后,路由器使用链路状态请求分组,向对方请求发送自己所缺少的某些链路状态项目的详细信息。经过一系列的这种分组交换,就建立了全网同步的链路数据库。下图给出了 OSPF 的基本操作,说明了两个路由器需要交换的各种类型的分组。

    11

    第 4 章 网络层 183 在网络运行的过程中,只要一个路由器的链路状态发生变化,该路由器就要使用链路状态更新分组,用洪泛法向全网更新链路状态。其他路由器在更新后,发送链路状态确认分组对更新分组进行确认。为了确保链路状态数据库与全网的状态保持一致,OSPF 还规定每隔一段时间(如 30 分钟)就刷新一次数据库中的链路状态。由于一个路由器的链路状态只涉及与相邻路由器的连通状态,因而与整个互联网的规模并无直接关系。因此,当互联网规模很大时,OSPF 要比 RIP 好得多,而且 OSPF 协议没有“坏消息传播得慢”的问题。注意:教材上说 OSPF 协议不使用 UDP 数据报传送,而是直接使用 IP 数据报传送,在此解释一下什么称为用 UDP 传送,什么称为用 IP 数据报传送。用 UDP 传送是指将该信息作为 UDP 报文的数据部分,而直接使用 IP 数据报传送是指将该信息直接作为 IP 数据报的数据部分。RIP 报文是作为 UDP 数据报的数据部分。

    0x04 边界网关协议(BGP)

    边界网关协议(Border Gateway Protocol,BGP)是不同自治系统的路由器之间交换路由信息的协议,是一种外部网关协议。边界网关协议常用于互联网的网关之间。

    内部网关协议主要设法使数据报在一个 AS 中尽可能有效地从源站传送到目的站。在一个 AS 内部不需要考虑其他方面的策略。然而 BGP 使用的环境却不同,主要原因如下:

    1. 因特网的规模太大,使得自治系统之间路由选择非常困难。
    2. 对于自治系统之间的路由选择,要寻找最佳路由是很不现实的。
    3. 自治系统之间的路由选择必须考虑有关策略。

    边界网关协议(BGP)只能力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非寻找一条最佳路由。BGP 采用的是路径向量路由选择协议,它与距离向量协议和链路状态协议有很大的区别。BGP 是应用层协议,它是基于 TCP 的。

    BGP 的工作原理如下:每个自治系统的管理员要选择至少一个路由器(可以有多个)作为该自治系统的“BGP 发言人”。一个 BGP 发言人与其他自治系统中的 BGP 发言人要交换路由信息,就要先建立 TCP 连接(可见 BGP 报文是通过 TCP 传送的,也就是说 BGP 报文是 TCP 报文的数据部分),然后在此连接上交换 BGP 报文以建立 BGP 会话,再利用 BGP 会话交换路由信息。当所有 BGP 发言人都相互交换网络可达性的信息后,各 BGP 发言人就可找出到达各个自治系统的较好路由。

    每个 BGP 发言人除必须运行 BGP 外,还必须运行该 AS 所用的内部网关协议,如 OSPF 或 RIP。BGP 所交换的网络可达性信息就是要到达某个网络(用网络前缀表示)所要经过的一系列 AS。图 4.12 给出了一个 BGP 发言人交换路径向量的例子。

    12

    BGP 的特点如下:

    1. BGP 交换路由信息的结点数量级是自治系统的数量级,比这些自治系统中的网络数少很多。
    2. 每个自治系统中 BGP 发言人(或边界路由器)的数目是很少的。这样就使得自治系统之间的路由选择不致过分复杂。
    3. BGP 支持 CIDR,因此 BGP 的路由表也就应当包括目的网络前缀、下一跳路由器,以及到达该目的网络所要经过的各个自治系统序列。
    4. 在 BGP 刚运行时,BGP 的临站交换整个 BGP 路由表,但以后只需在发生变化时更新有变化的部分。这样做对节省网络带宽和减少路由器的处理开销都有好处。

    BGP-4 共使用 4 种报文:

    1. 打开(Open)报文。用来与相邻的另一个 BGP 发言人建立关系。
    2. 更新(Update)报文。用来发送某一路由的信息,以及列出要撤销的多条路由。
    3. 保活(Keepalive)报文。用来确认打开报文并周期性地证实邻站关系。
    4. 通知(Notification)报文。用来发送检测到的差错。

    RIP、OSPF 与 BGP 的比较如下表所示。

    协议RIPOSPFBGP
    类型内部内部外部
    路由算法距离-向量链路状态路径-向量
    传递协议UDPIPTCP
    路径选择跳数最少代价最低较好,非最佳
    交换节点和本结点相邻的路由器网络中的所有路由器和本结点相邻的路由器
    交换内容当前本路由器知道的全部信息,即自己的路由表容与本路由器相邻的所有路由器的链路状态首次:整个路由表
    非首次:有变化的部分

     

    六、IP 组播

    0x00 组播的概念

    为了能够支持像视频点播和视频会议这样的多媒体应用,网络必须实施某种有效的组播机制。使用多个单播传送来仿真组播总是可能的,但这会引起主机上大量的处理开销和网络上太多的交通量。人们所需要的组播机制是让源计算机一次发送的单个分组可以抵达用一个组地址标识的若干目标主机,并被它们正确接收。

    组播一定仅应用于 UDP,它对将报文同时送往多个接收者的应用来说非常重要。而 TCP 是一个面向连接的协议,它意味着分别运行于两台主机(由 IP 地址来确定)内的两个进程(由端口号来确定)之间存在一条连接,因此会一对一地发送。

    使用组播的缘由是,有的应用程序要把一个分组发送给多个目的地主机。不是让源主机给每个目的地主机都发送一个单独的分组,而是让源主机把单个分组发送给一个组播地址,该组播地址标识一组地址。网络(如因特网)把这个分组的副本投递给该组中的每台主机。主机可以选择加入或离开一个组,因此一台主机可以同时属于多个组。

    因特网中的 IP 组播也使用组播组的概念,每个组都有一个特别分配的地址,要给该组发送的计算机将使用这个地址作为分组的目标地址。在 IPv4 中,这些地址在 D 类地址空间中分配:而 IPv6 也有一部分地址空间保留给组播组

    主机使用一个称为 IGMP(因特网组管理协议)的协议加入组播组。它们使用该协议通知本地网络上的路由器关于要接收发送给某个组播组的分组的愿望。通过扩展路由器的路由选择和转发功能,可以在许多路由器互连的支持硬件组播的网络上面实现因特网组播。

    需要注意的是,主机组播时仅发送一份数据,只有数据在传送路径出现分岔时才将分组复制后继续转发。因此,对发送者而言,数据只需发送一次就可发送到所有接收者,大大减轻了网络的负载和发送者的负担。组播需要路由器的支持才能实现,能够运行组播协议的路由器称为组播路由器。单播与组播的比较如图所示。

    13

    0x01 IP 组播地址

    IP 组播使用 D 类地址格式。D 类地址的前四位是 1110,因此 D 类地址范围是 224.0.0.0~239.255.255.255。每个 D 类 IP 地址标志一个组播组。

    组播数据报和一般的 IP 数据报的区别是,前者使用 D 类 IP 地址作为目的地址,并且首部中的协议字段值是 2,表明使用 IGMP。需要注意的是:

    1. 组播数据报也是“尽最大努力交付”,不提供可靠交付。
    2. 组播地址只能用于目的地址,而不能用于源地址。
    3. 对组播数据报不产生 ICMP 差错报文。因此,若在 PING 命令后面键入组播地址,将永远不会收到响应。
    4. 并非所有的 D 类地址都可作为组播地址。

    IP 组播可以分为两种:一种只在本局域网上进行硬件组播;另一种则在因特网的范围内进行组播。在因特网上进行组播的最后阶段,还是要把组播数据报在局域网上用硬件组播交付给组播组的所有成员 [见图 4.13(b)]。 下面讨论这种硬件组播。

    IANA 拥有的以太网组播地址的范围是从 01-00-5E-00-00-00 到 01-00-5E-7F-FF-FF。不难看出,在每个地址中,只有 23 位可用作组播。这只能和 D 类 IP 地址中的 23 位有一一对应关系。D 类 IP 地址可供分配的有 28 位,可见在这 28 位中,前 5 位不能用来构成以太网的硬件地址,如图所示。

    14

    例如,IP 组播地址 224.128.64.32(即 E0-80-40-20)和另一个 IP 组播地址 224.0.64.32(即 E0-00-40-20)转换成以太网的硬件组播地址都是 01-00-5E-00-40-20。由于组播 IP 地址与以太网硬件地址的映射关系不是唯一的,因此收到组播数据报的主机,还要在 IP 层利用软件进行过滤,把不是本主机要接收的数据报去弃。

     

    0x02 IGMP 与组播路由算法

    要使路由器知道组播组成员的信息,需要利用因特网组管理协议(Internet Group Management Protocol,IGMP)。连接到局域网上的组播路由器还必须和因特网上的其他组播路由器协同工作,以便把组播数据报用最小代价传送给所有组成员,这就需要使用组播路由选择协议。

    IGMP 并不是在因特网范围内对所有组播成员进行管理的协议,IGMP 并不知道 IP 组播包含的成员数,也不知道这些成员分布在哪些网络上。IGMP 让连接到本地局域网上的组播路由器知道本局域网上是否有主机参加或退出了某个组播组。

    IGMP 应视为网际协议 IP 的一个组成部分,其工作可分为两个阶段。

    第一阶段:当某台主机加入新的组播组时,该主机应向组播组的组播地址发送一个 IGMP 报文,声明自己要成为该组的成员。本地的组播路由器收到 IGMP 报文后,将组成员关系转发给因特网上的其他组播路由器。

    第二阶段:因为组成员关系是动态的,本地组播路由器要周期性地探询本地局域网上的主机,以便知道这些主机是否仍继续是组的成员。只要对某个组有一台主机响应,那么组播路由器就认为这个组是活跃的。但一个组在经过几次的探询后仍然没有一台主机响应时,则不再将该组的成员关系转发给其他的组播路由器。

    组播路由选择实际上就是要找出以源主机为根节点的组播转发树,其中每个分组在每条链路上只传送一次(即在组播转发树上的路由器不会收到重复的组播数据报)。不同的多播组对应于不同的多播转发树;同一个多播组,对不同的源点也会有不同的多播转发树。

    在许多由路由器互连的支持硬件多点传送的网络上实现因特网组播时,主要有三种路由算法:第一种是基于链路状态的路由选择;第二种是基于距离-向量的路由选择;第三种可以建立在任何路由器协议之上,因此称为协议无关的组播(PIM)。

     

    七、移动 IP

    0x00 移动 IP

    移动 IP 技术是指移动站以固定的网络 IP 地址实现跨越不同网段的漫游功能,并保证基于网络 IP 的网络权限在漫游过程中不发生任何改变。移动 IP 的目标是把分组自动地投递给移动站。

    一个移动站是把其连接点从一个网络或子网改变到另一个网络或子网的主机。

    移动 IP 定义了三种功能实体:移动节点、本地代理(也称归属代理)和外地代理。

    1. 移动节点。具有永久 IP 地址的移动站
    2. 本地代理。通常就是连接在归属网络(原始连接到的网络)上的路由器
    3. 外地代理。通常就是连接在被访网络(移动到另一地点所接入的网络)上的路由器。

    值得注意的是,某用户将笔记本关机后从家里带到办公室重新上网,在办公室能很方便地通过 DHCP 自动获取新的 IP 地址。虽然笔记本移动了,更换了地点及所接入的网络,但这并不是移动 IP。但如果我们需要在移动中进行 TCP 传输,在移动站漫游时,应一直保持这个 TCP 链接,否则移动站的 TCP 连接就会断断续续的。可见,若要使移动站在移动中的 TCP 连接不中断,就必须使笔记本的 IP 地址在移动中保持不变。这就是移动 IP 要研究的问题。

     

    0x01 移动 IP 通信过程

    用一个通俗的例子来描述移动 IP 的通信原理。例如,在以前科技不那么发达的年代,本科毕业时都将走向各自的工作岗位。由于事先并不知道自己未来的准确通讯地址,那么怎样继续和同学们保持联系呢?实际上也很简单。彼此留下各自的家庭地址(即永久地址)。毕业后若要和某同学联系,只要写信寄到该同学的永久地址,再请其家长把信件转交即可。

    在移动 IP 中,每个移动站都有一个原始地址,即永久地址(或归属地址),移动站原始连接的网络称为归属网络。永久地址和归属网络的关联是不变的。归属代理通常是连接到归属网络上的路由器,然而它实现的代理功能是在应用层完成的。当移动站移动到另一地点,所接入的外地外地网络也称被访网络。被访网络中使用的代理称为外地代理,它通常是连接在被访网络上的路由器。代理有两个重要功能:

    1. 要为移动站创建一个临时地址,称为转交地址。转交地址的网络号显然和被访网络一致
    2. 及时把移动站的转交地址告诉其归属代理

    移动 IP 技术的基本通信流程如下:

    1. 移动站在归属网络时,按传统的 TCP/IP 方式进行通信
    2. 移动站漫游到外地网络时,向外地代理进行登记,以获得一个临时的转交地址。外地代理要向移动站的归属代理登记移动站的转交地址
    3. 归属代理知道移动站的转交地址后,会构建一条通向转交地址的隧道,将截获的发送给移动站的 IP 分组进行再封装,并通过隧道发送给被访网络的外地代理
    4. 外地代理把收到的封装的数据报进行拆封,恢复成原始的 IP 分组,然后发送给移动站,这样移动站在被访网络就能收到这些发送给它的 IP 分组
    5. 移动站在被访网络对外发送数据报时,仍然使用自己的永久地址作为数据报的源地址,此时显然无须通过 A 的归属代理来转发,而是直接通过被访网络的外部代理
    6. 移动站移动到另一外地网络时,在新外地代理登记后,然后新外地代理将移动站的新转交地址告诉其归属代理。无论如何移动,移动站收到的数据报都是由归属代理转发的
    7. 移动站回到归属网络时,移动站向归属代理注销转交地址。

    请注意两点:转交地址是供移动站、归属代理及外地代理使用的,各种应用程序都不会使用。外地代理要向连接在被访网络上的移动站发送数据报时,直接使用移动站的 MAC 地址。

     

    八、网络层设备

    0x00 冲突域和广播域

    这里的“域”表示冲突或广播在其中发生并传播的区域。

    1. 冲突域

    冲突域是指连接到同一物理介质上的所有结点的集合,这些结点之间存在介质争用的现象。在 OSI 参考模型中,冲突域被视为第 1 层概念,像集线器、中继器等简单无脑复制转发信号的第 1 层设备所连接的结点都属于同一个冲突域,也就是说它们不能划分冲突域。而第 2 层(网桥、交换机)、第 3 层(路由器)设备都可以划分冲突域。

    2. 广播域

    广播域是指接收同样广播消息的结点集合。也就是说,在该集合中的任何一个结点发送一个广播帧,其他能收到这个帧的结点都被认为是该广播域的一部分。在 OSI 参考模型中,广播域被视为第 2 层概念,像第 1 层(集线器等)、第 2 层(交换机等)设备所连接的结点都属于同一个广播域。而路由器,作为第 3 层设备,则可以划分广播域,即可以连接不同的广播域。

    通常所说的局域网(LAN)特指使用路由器分割的网络,也就是广播域。

     

    0x01 路由器的组成和功能

    路由器是一种具有多个输入/输出端口的专用计算机,其任务是连接不同的网络(连接异构网络)并完成路由转发。在多个逻辑网络(即多个广播域)互连时必须使用路由器。

    当源主机要向目标主机发送数据报时,路由器先检查源主机与目标主机是否连接在同一个网络上。如果源主机和目标主机在同一个网络上,那么直接交付而无须通过路由器。如果源主机和目标主机不在同一个网络上,那么路由器按照转发表(路由表)指出的路由将数据报转发给下一个路由器,这称为间接交付。可见,在同一个网络中传递数据无须路由器的参与,而跨网络通信必须通过路由器进行转发。例如,路由器可以连接不同的 LAN,连接不同的 VLAN,连接不同的 WAN,或者把 LAN 和WAN 互连起来。路由器隔离了广播域。

    从结构上看,路由器由路由选择和分组转发两部分构成,如下图所示。而从模型的角度看:路由器是网络层设备,它实现了网络模型的下三层,即物理层、数据链路层和网络层

    15

    注意:如果一个存储转发设备实现了某个层次的功能,那么它就可以互连两个在该层次上使用不同协议的网段(网络)。如网桥实现了物理层和数据链路层,那么网桥可以互连两个物理层和数据链路层不同的网段;但中继器实现了物理层后,却不能互连两个物理层不同的网段,这是因为中继器不是存储转发设备,它属于直通式设备。

    路由选择部分也称控制部分,其核心构件是路由选择处理机。路由选择处理机的任务是根据所选定的路由选择协议构造出路由表,同时经常或定期地和相邻路由器交换路由信息而不断更新和维护路由表。

    分组转发部分由三部分组成:交换结构、一组输入端口和一组输出端口。输入端口在从物理层接收到的比特流中提取出数据链路层帧,进而从帧中提取出网络层数据报,输出端口则执行恰好相反的操作。交换结构是路由器的关键部件,它根据转发表对分组进行处理,将某个输入端口进入的分组从一个合适的输出端口转发出去。有三种常用的交换方法:通过存储器进行交换、通过总线进行交换和通过互联网络进行交换。交换结构本身就是一个网络。

    路由器主要完成两个功能:一是分组转发,二是路由计算。前者处理通过路由器的数据流,关键操作是转发表查询、转发及相关的队列管理和任务调度等:后者通过和其他路由器进行基于路由协议的交互,完成路由表的计算。

    路由器和网桥的重要区别是:网桥与高层协议无关,而路由器是面向协议的,它依据网络地址进行操作,并进行路径选择、分段、顿格式转换、对数据报的生存时间和流量进行控制等。现今的路由器一般都提供多种协议的支持,包括 OSI、TCP/IP、IPX 等。

     

    0x02 路由表与路由转发

    路由表是根据路由选择算法得出的,主要用途是路由选择。从历年统考真题可以看出,标准的路由表有 4 个项目:目的网络 IP 地址、子网掩码、下一跳 IP 地址、接口。在如图 4.16 所示的网络拓扑中,R1 的路由表见表 4.4,该路由表包含到互联网的默认路由。

    16

    表 4.4 R1 的路由表目的网络

    目的网络 IP 地址子网掩码下一跳 IP 地址接口
    202.114.1.0255.255.255.0DirectE1
    202.114.2.0255.255.255.0DirectL0
    202.114.3.0255.255.255.0202.144.2.2L0
    0.0.0.0255.255.255.0202.144.2.2L0

    转发表是从路由表得出的,其表项和路由表项有直接的对应关系。但转发表的格式和路由表的格式不同,其结构应使查找过程最优化(而路由表则需对网络拓扑变化的计算最优化)。转发表中含有一个分组将要发往的目的地址,以及分组的下一跳(即下一步接收者的目的地址,实际为 MAC 地址)。为了减少转发表的重复项目,可以使用一个默认路由代替所有具有相同“下一跳”的项目,并将默认路由设置得比其他项目的优先级低,如图 4.17 所示。路由表总是用软件来实现的;转发表可以用软件来实现,甚至也可以用特殊的硬件来实现。

    17

    注意转发和路由选择的区别:“转发”是路由器根据转发表把收到的 IP 数据报从合适的端口转发出去,它仅涉及一个路由器。而“路由选择”则涉及很多路由器,路由表是许多路由器协同工作的结果。这些路由器按照复杂的路由算法,根据从各相邻路由器得到的关于网络拓扑的变化情况,动态地改变所选择的路由,并由此构造出整个路由表。

    注意,在讨论路由选择的原理时,往往不去区分转发表和路由表的区别,但要注意路由表不等于转发表。分组的实际转发是靠直接查找转发表,而不是直接查找路由表。

     

    九、本章疑难

    1. “尽最大努力交付”有哪些含义?

    1. 不保证源主机发送的 IP 数据报一定无差错地交付到自的主机
    2. 不保证源主机发送的 IP 数据报都在某一规定的时间内交付到目的主机
    3. 不保证源主机发送的 IP 数据报一定按发送时的顺序交付到目的主机
    4. 不保证源主机发送的 IP 数据报不会重复交付给目的主机
    5. 不故意丢弃 IP 数据报。丢弃 IP 数据报的情况是:路由器检测出首部校验和有错误;或由于网络中通信量过大,路由器或目的主机中的缓存已无空闲空间。

    但要注意,IP 数据报的首部中有一个 “首部校验和” 。当它检验出 IP 数据报的首部出现了差错时,就丢弃该数据报。因此,凡交付给自的主机的 IP 数据报都是 IP 首部没有差错的或没有检测出差错的。也就是说,在传输过程中,出现差错的 IP 数据报都被丢弃了。

    现在因特网上绝大多数的通信量都属于“尽最大努力交付”。如果数据必须可靠地交付给目的地,那么使用 IP 的高层软件必须负责解决这一问题。

     

    2. “IP 网关” 和 “IP 路由器” 是否为同义语?“互连网” 和 “互联网” 有没有区别?

    当初发明 TCP/IP 的研究人员使用 IP Gateway 作为网际互连的设备,可以认为“IP 网关”和“IP 路由器”是同义词。“互连网”和“互联网”都是推荐名,都可以使用,不过建议优先使用“互联网”

     

    3. 在一个互联网中,能否用一个很大的交换机(switch)来代替互联网中很多的路由器?

    不行。交换机和路由器的功能是不相同的。

    交换机可在单个网络中与若干计算机相连,并且可以将一台计算机发送过来的帧转发给另一台计算机。从这一点上看,交换机具有集线器的转发帧的功能,但交换机比集线器的功能强很多。在同一时间,集线器只允许一台计算机发送数据。

    路由器连接两个或多个同构的或异构的网络,在网络之间转发分组(即 IP 数据报)。因此,如果许多相同类型的网络互连时,那么用一个很大的交换机(如果能够找出其他计算机进行通信,交换机允许找得到)代替原来的一些路由器是可行的。但若这些互连的网络是异构的网络,那么就必须使用路由器来进行互连。

     

    4. 网络前缀是指网络号字段(net-id)中前面的几个类别位还是指整个的网络号字段?

    是指整个的网络号字段,包括最前面的几个类别位在内。网络前缀常常简称为前缀。例如一个 B 类地址 1010000000000000 0000000000010000,其类别位就是最前面的两位:10,而网络前缀就是前 16 位:1010000000000000。

     

    5. IP 有分片的功能,但广域网中的分组则不必分片,这是为什么?

    IP 数据报可能要经过许多个网络,而源结点事先并不知道数据报后面要经过的这些网络所能通过的分组的最大长度是多少。等到 IP 数据报转发到某个网络时,中间结点可能才发现数据报太长了,因此在这时就必须进行分片。但广域网能够通过的分组的最大长度是该广域网中所有结点都事先知道的,源结点不可能发送网络不支持的过长分组。因此广域网没有必要将已经发送出的分组再进行分片。

     

    6. 数据链路层广播和 IP 广播有何区别?

    数据链路层广播是用数据链路层协议(第二层)在一个以太网上实现的对该局域网上的所有主机进行广播 MAC 帧,而 IP 广播则是用 IP 通过因特网实现的对一个网络(即目的网络)上的所有主机进行广播 IP 数据报。

     

    7. 主机在接收一个广播帧或组播帧时,其 CPU 所要做的事情有何区别?

    在接收广播帧时,主机通过其适配器[即网络接口卡(NIC)门接收每个广播帧,然后将其传递给操作系统。CPU 执行协议软件,并界定是否接收和处理该帧。在接收组播帧时,CPU 要对适配器进行配置,而适配器根据特定的组播地址表来接收帧。凡与此组播地址表不匹配的帧都将被 NIC 丢弃。因此在组播的情况下,是适配器 NIC 而不是 CPU 决定是否接收一个帧。

     

    8. 假定在一个局域网中计算机 A 发送 ARP 请求分组,希望找出计算机 B 的硬件地址。这时局域网上的所有计算机都能收到这个广播发送的 ARP 请求分组。试问这时由哪个计算机使用 ARP 响应分组将计算机 B 的硬件地址告诉计算机 A?

    这要区分两种情况。第一,如果计算机 B 和计算机 A 都连接在同一个局域网上,那么就是计算机 B 发送 ARP 响应分组。第二,如果计算机 B 和计算机 A 不连接在同一个局域网上,那么就必须由一个连接计算机 A 所在局域网的路由器来转发 ARP 请求分组。这时,该路由器向计算机 A 发送 ARP 回答分组,给出自己的硬件地址。

    9. 路由器实现了物理层、数据链路层、网络层,这句话的含义是什么?

    第 1 章中提到了网络中的两个通信结点利用协议栈进行通信的过程。发送方一层一层地把数据“包装”,接收方一层一层地把“包装”拆开,最后上交给用户。路由器实现了物理层,数据链路层和网络层的含义是指路由器有能力对这三层协议的控制信息进行识别、分析以及转换,直观的理解是路由器有能力对数据“包装”这三层协议或者“拆开”这三层协议。自然,路由器就有能力互连这三层协议不同的两个网络。