此观点认为,应借助于电信网的成功经验,让网络负责可靠交付,计算机网络应模仿电信网络,使用面向连接的通信方式。
通信之前先建立虚电路(Virtual Circuit),以保证双方通信所需的一切网络资源。
如果再使用可靠传输的网络协议,就可使所发送的分组无差错按序到达终点,不丢失,不重复。
虚电路表示这只是一条逻辑上的连接,分组都沿着这条逻辑连接按照存储转发方式传送,而并不是真正建立了一条物理连接。
电路交换的电话通信是先建立了一条真正的连接。
因此分组交换的虚电路和电路交换的连接只是类似,但并不完全一样。
对比的方面 | 虚电路服务 | 数据报服务 |
---|---|---|
思路 | 可靠通信应当由网络来保证 | 可靠通信应当由用户主机来保证 |
连接的建立 | 必须有 | 不需要 |
终点地址 | 仅在连接建立阶段使用,每个分组使用短的虚电路号 | 每个分组独立查找转发表进行转发 |
分组的转发 | 属于同一条虚电路的分组均按照同一路由进行转发 | 每个分组独立查找转发表进行转发 |
当节点出现故障时 | 所有通过出故障的节点的虚电路均不能工作 | 出故障的节点可能会丢失分组,一些路由可能会发生变化 |
分组的顺序 | 总是按发送顺序到达终点 | 到达终点的顺序不一定按发送的顺序 |
端到端的差错处理和流量控制 | 可以由网络负责,也可以由用户主机负责 | 由用户主机负责 |
路由器之间传送的信息有两大类
用下图的方法来描述,就是把网络层抽象地划分为数据层面(或转发层面)和控制层面。
在传统的互联网中,每一个路由器中,既有转发表又有路由选择软件。也就是说,每个路由器中,既有数据层面也有控制层面。
在SDN结构中,所有的路由器都变简单了。路由器中的路由选择软件都不存在了,因此路由器之间不再相互交换路由信息。在网络的控制层面有一个在逻辑上集中的远程控制器(但在物理上可以由不同地点的多个服务器组成)。远程控制器掌握各主机和整个网络的状态,能够为每一个分组计算出最佳的路由,然后在每一个路由器中生成其正确的转发表。路由器的工作很单一,即收到分组,查找转发表,转发分组。
这样,网络又变成为集中控制的。本来互联网是分散控制的,为什么现在又提出集中控制呢?
所谓虚拟互连网络也就是逻辑互连网络,它的意思就是互连起来的各种物理网络的异构性本来是客观存在的,但是我们利用IP协议就可以使这些性能各异的网络在网络层上看起来好像是一个统一的网络。
这种使用协议IP的虚拟互连网络可简称为IP网。
使用IP网的好处是:当IP网上的主机进行通信时,就好像在一个单个网络上通信一样,它们看不见互连的各网络的具体异构细节。
如果在这种覆盖全球的IP网的上层使用TCP协议,那么就是现在的互联网(Internet)
互联网中的源主机H1要把一个IP数据报发送给目的主机H2。主机H1先要检查自己的转发表,看目的主机H2是否就在本网络上。如是,则不需要经过任何路由器而是直接交付,任务就完成了。如不是,则必须把IP数据报发送给某个路由器(下图R1)。R1在查找了自己的转发表后,知道应当把数据报转发给R2进行间接交付。这样一直转发下去,最后由路由器R5知道自己是和H2连接在同一个网络上,不需要再使用别的路由器转发了,于是就把数据报直接交付目的主机H2。总之,分组从源节点A发送到目的节点B,若中间必须经过一个或几个路由器(这表示A和B不在同一个网络上),则是间接交付。但若不需要经过路由器(这表示A和B在同一个网络上),则是直接交付。
IP地址就是给连接到互联网上的每一台主机(或路由器)的每一个接口,分配一个在全世界范围内是唯一的32位的标识符。
IP地址的结构使我们可以在互联网上很方便地进行寻址。
IP地址现在由互联网名字和数字分配机构ICANN(Internet Corporation for Assigned Names and Numbers)进行分配。
对主机或路由器来说,IP地址都是32位的二进制代码。为了便于人们书写和记忆,常用其等效的十进制数字表示,并且在每段数字之间加上一个小数点,这就叫做点分十进制记法(dotted decimal notation)。如下是一个IP地址表示方法的例子。
32位的IP地址采用两级结构,由两个字段组成。第一个字段是网络号,它标志主机(或路由器)所连接到的网络。一个网络号在整个互联网范围内必须是唯一的。第二个字段是主机号,它标志该主机(对路由器来说,就是标志该路由器)。一个主机号在所连接的网络中必须是唯一的。一个IP地址在整个互联网范围内是唯一的。因此,IP地址可以记为:
网络类别 | 最大可指派的网络数 | 第一个可指派的网络号 | 最后一个可指派的网络号 | 每个网络中最大主机数 |
---|---|---|---|---|
A | 126 ( 2 7 − 2 ) (2^7-2) (27−2) | 1 | 126 | 16777214 |
B | 16382 ( 2 14 − 2 ) (2^{14}-2) (214−2) | 128.1 | 191.255 | 65534 |
C | 2097150 ( 2 21 − 2 ) (2^{21}-2) (221−2) | 192.0.1 | 223.255.255 | 254 |
网络号 | 主机号 | 源地址使用 | 目的地址使用 | 代表的意思 |
---|---|---|---|---|
0 | 0 | 可以 | 不可 | 在本网络上的本主机 |
0 | X | 可以 | 不可 | 在本网络上主机号为X的主机 |
全1 | 全1 | 不可 | 可以 | 只在本网络上进行广播(各路由器均不转发) |
Y | 全1 | 不可 | 可以 | 对网络号为Y的网络上的所有主机进行广播 |
127 | 非全0或全1的任何数 | 可以 | 可以 | 用于本地软件环回测试 |
CIDR将传统IP中的网络号改称为“网络前缀”(network-prefix),用来指明网络,剩下的后面部分仍然是主机号,用来指明主机。也有文献将主机号字段称为后缀(suffix)。CIDR的记法是:
上面两个图看起来没有什么区别。只是将“网络号”变成了“网络前缀”。其实不然。这里最大的区别就是网络前缀的位数n不是固定的数,而是可以在0~32之间选取任意的值。
CIDR使用“斜线记法”(slash notation),或称为CIDR记法,即在IP地址后面加上斜线“/”,斜线后面是网络前缀所占的位数。
CIDR把网络前缀都相同的所有连续的IP地址组成一个“CIDR地址块”。一个CIDR地址块包含的IP地址数目,取决于网络前缀的位数。
我们只需要知道CIDR地址块中的任何一个地址,就可以知道这个地址块的最小地址和最大地址,以及地址块中的地址数。
如:已知IP地址128.14.35.7/20是某CIDR地址块中的一个地址,现在把它写成二进制表示形式,其中的前20位是网络前缀,而前缀后面的12位是主机号:
128.14.35.7/20 = 10000000 00001110 00100011 00000111
可以很方便得出这个地址所在的地址块中的最小地址和最大地址:
最小地址 | 128.14.32.0 | 10000000 00001110 00100000 00000000 |
---|---|---|
最大地址 | 128.14.47.255 | 10000000 00001110 00101111 11111111 |
这个地址块的IP地址共有 2 12 2^{12} 212个,扣除主机号为全0和全1的地址(最小地址和最大地址)后,可指派的地址数是 2 12 − 2 2^{12}-2 212−2个。
我们常使用地址块中的最小地址和网络前缀的位数指明一个地址块。显然,上面导出的最小地址并不是该地址128.14.32.0/20的网络地址。在不需要指明网络地址时,也可把这样的地址块简称为“/20地址块”。
注意下面例子
早期使用分类的IP地址时,A类网络的前缀是8位,B类网络的前缀是16位,而C类网络的前缀是24位,都是固定值,因此不需要重复指明其网络前缀。采用CIDR后,仅从斜线左边的IP地址已无法知道其网络地址。在这一点上,原来的分类地址还是比较方便。
地址掩码(address mask)(简称为掩码)由一连串1和接着的一连串0组成,而1的个数就是网络前缀的长度。地址掩码又称为子网掩码。
在CIDR记法中,斜线后面的数字就是地址掩码中1的个数。如**/20地址块的地址掩码是:11111111 11111111 11110000 00000000(20个连续的1和接着的12个连续的0)。这个掩码用CIDR记法表示就是255.255.240.0/20**。
对于早期使用的分类IP地址,其地址掩码是固定的,常常不用专门指出。如:
把二进制的IP地址和地址掩码进行按位AND运算,即可得出网络地址。如下图
下表给出了最常用的CIDR地址块。表中的K表示 2 10 2^{10} 210即1024。网络前缀长度在13到27之间是最常用的。在“包含的地址数”中把全1和全0的主机号都计算在内了。
网络前缀长度 | 点分十进制 | 包含的地址数 | 相当于包含分类的网络数 |
---|---|---|---|
/13 | 255.248.0.0 | 512K | 8个B类或2048个C类 |
/14 | 255.252.0.0 | 256K | 4个B类或1024个C类 |
/15 | 255.254.0.0 | 128K | 2个B类或512个C类 |
/16 | 255.255.0.0 | 64K | 1个B类或256个C类 |
/17 | 255.255.128.0 | 32K | 128个C类 |
/18 | 255.255.192.0 | 16K | 64个C类 |
/19 | 255.255.224.0 | 8K | 32个C类 |
/20 | 255.255.240.0 | 4K | 16个C类 |
/21 | 255.255.248.0 | 2K | 8个C类 |
/22 | 255.255.252.0 | 1K | 4个C类 |
/23 | 255.255.254.0 | 512 | 2个C类 |
/24 | 255.255.255.0 | 256 | 1个C类 |
/25 | 255.255.255.128 | 128 | 1/2个C类 |
/26 | 255.255.255.192 | 64 | 1/4个C类 |
/27 | 255.255.255.224 | 32 | 1/8个C类 |
CIDR地址中还有三个特殊地址块,即:
使用CIDR的一个好处就是可以更加有效地分配IP地址空间,可根据用户的需要分配适当大小的CIDR地址块。
一个大的CIDR地址块中往往包含很多小地址块,所以在路由器的转发表中就利用较大的一个CIDR地址块来代替许多较小的地址块。这种方法称为路由聚合(route aggregation),它使得转发表中只有一个项目就可以表示原来传统分类地址的很多个路由项目,因而大大压缩了转发表所占的空间,减少了转发表所需的时间。
IP地址与硬件地址是不同的地址。
从层次的角度看:
在IP层抽象的互联网上只能看到IP数据报。
虽然在IP数据报首部有源站IP地址,但路由器只根据目的站的IP地址进行转发。
在局域网的链路层,只能看见MAC帧。
IP层抽象的互联网屏蔽了下层很复杂的细节。在网络层上探讨问题,就能够使用统一的,抽象的IP地址研究主机和主机或路由器之间的通信。
在协议IP的标准中,描述首部格式的宽度是32位。
一个IP数据报由首部和数据两部分组成。首部的前一部分长度是固定的,共20字节,是所有IP数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。
ICMP报文有两种,ICMP差错报告报文和ICMP询问报文。
ICMP报文的前4字节是统一的格式,共有三个字段:类型,代码和检验和。接着的4字节的内容与ICMP的类型有关。最后面是数据字段,其长度取决于ICMP的类型
下表给出了几种常用的ICMP报文类型
ICMP标准在不断更新。已不再使用的ICMP报文有:”信息请求与回答报文“”地址掩码请求与回答报文“”路由器请求与通告报文“以及”源点抑制报文“
ICMP报文的代码字段用于进一步区分某种类型中的几种不同情况。检验和字段用来检验整个ICMP报文。IP数据报首部的检验和并不检验IP数据报的内容,因此不能保证经过传输的ICMP报文不产生差错。
上面表格中给出了ICMP差错报告报文共有四种,即:
ICMP差错报告报文中的数据字段都具有同样的格式(如下图)。把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。再加上相应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报告报文。提取收到的数据报的数据字段前8个字节是为了得到运输层的端口号以及运输层报文的发送序号。这些信息对源点通知高层协议是有用的。整个ICMP报文作为IP数据报的数据字段发送给源点。
下面是不应发送ICMP差错报告报文的几种情况:
常用的ICMP询问报文有两种,即:
IPv6仍支持无连接的传送,但将协议数据单元PDU称为分组(packet),而不是IPv4的数据报(datagram)。
IPv6所引进的主要变化如下:
IPv6数据报由两大部分组成:
与IPv4相比,IPv6对首部中的某些字段进行了如下的更改:
IPv6基本首部中各字段的作用
地址类型 | 地址块前缀 | 前缀的CIDR记法 |
---|---|---|
未指明地址 | 00…0(128位) | ::/128 |
环回地址 | 00…1(128位) | ::1/128 |
多播地址 | 11111111 | FF00::/8 |
本地站点单播地址 | 1111111011 | FEC0::/10 |
本地链路单播地址 | 1111111010 | FE80::/10 |
全球单播地址 | 见下图 | 见下图 |
未指明地址:这是16字节的全0地址,可缩写为两个冒号”::“。这个地址不能用作目的地址,只能将某台主机当作源地址使用,条件是这台主机还没有配置到一个标准的IP地址。这类地址仅此一个。
环回地址:IPv6的环回地址是0:0:0:0:0:0:0:1,可缩写为::1。作用和IPv4的环回地址一样。这类地址也是仅此一个。
多播地址:功能和IPv4一样。这类地址占IPv6地址总数的1/256。
本地站点单播地址(cite-local unicast address):有些单位的内部网络使用TCP/IP协议,但并没有连接到互联网上。连接在这样的内部网络上的主机都可以使用这种本地站点地址进行通信,但不能和互联网上的其他主机通信。这类地址占IPv6地址总数的1/1024,其用途和IPv4的专用地址是一样的。
本地链路单播地址(link-local unicast address):这种地址是在单一链路上使用的。当一个节点启用IPv6时就自动生成本地链路地址。当需要把分组发往单一链路的设备而不希望该分组被转发到此链路范围以外的地方时,就可以使用这种特殊地址。这类地址占IPv6地址总数的1/1024。
全球单播地址:IPv6的这一类单播地址是使用得最多的一类。IPv6单播地址的划分方法可以是下面的任何一种:
互联网采用的路由选择协议主要是自适应的,分布式路由选择协议。由于以下两个原因,互联网采用分层次的路由选择协议:
为此,可以把整个互联网划分为许多较小的自治系统(autonomous system),一般都记为AS。自治系统AS是在单一技术管理下的许多网络,IP地址以及路由器,而这些路由器使用一种自治系统内部的路由选择协议和共同的度量。每一个AS对其他AS表现出的是一个单一的和一致的路由选择策略。这样,互联网就把路由选择协议划分为两大类,即:
自治系统之间的路由选择也叫做域间路由选择(interdomain routing),而在自治系统内部的路由选择叫做域内路由选择(intradomain routing)。
下图是两个自治系统互连在一起的示意图。每个自治系统自己决定在本自治系统内部运行哪一个内部路由选择协议(可以是RIP,也可以是OSPF)。但每个自治系统都有一个或多个路由器(如下图中R1和R2)除运行本系统的内部路由选择协议外,还要运行自治系统间的路由选择协议(BGP-4)。
按照使用分层次的路由选择方法,可将互联网的路由选择协议划分为:
1, 仅和相邻路由器交换信息。如果两个路由器之间的通信不需要经过另一个路由器,那么这两个路由器就是相邻的。协议RIP规定,不相邻的路由器不交换信息。
2, 路由器交换的信息是当前本路由器所知道的全部信息,即自己现在的路由表。
3, 按固定的时间间隔交换路由信息,如,每隔30秒。然后路由器根据收到的路由信息更新路由表。当网络拓扑发生变化时,路由器也及时向相邻路由器通告拓扑变化后的路由信息。
OSPF共有以下五种分组类型
OSPF分组是作为IP数据报的数据部分来传送的。OSPF不用UDP而是直接用IP数据报传送(其IP数据报首部的协议字段值为89)。OSPF构成的数据报很短。这样可减少路由信息的通信量。数据报很短的另一个好处是可以不必将长的数据报分片传送。分片传送的数据报只要丢失一个,就无法组装成原来的数据报,而整个数据报就必须重传。
OSPF规定,每两个相邻的路由器每隔10秒钟要交换一次问候分组。这样就能够确知那些邻站是可达的。在正常情况下,网络中传送的绝大多数OSPF分组都是问候分组。若有40秒钟没有收到某个相邻路由器发来的问候分组,则可认为该相邻路由器是不可达的,应立即修改链路状态数据库,并重新计算路由表。
其他的四种分组都是用来进行链路状态数据库的同步。同步就是指不同的路由器的链路状态数据库的内容是一样的。两个同步的路由器叫作“完全邻接的”(fully adjacent)路由器。不是完全邻接的路由器表明它们虽然在物理上是相邻的,但其链路状态数据库并没有达到一致。
当一个路由器开始工作时,它只能通过问候分组得知它有哪些相邻的路由器在工作,以及将数据发往相邻路由器所需的“代价”。如果所有的路由器都把自己的本地链路状态信息对全网进行广播,那么各路由器只要将这些链路状态信息综合起来就可得出链路状态数据库。但这样开销太大。
路由器是一种具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组。从路由器某个输入端口收到的分组,按照分组要去的目的地(即目的网络),把该分组从路由器的某个合适的输出端口转发给下一跳路由器。下一跳路由器也按照这种方法处理分组,直到该分组到达终点为止。路由器的转发分组正是网络层的主要工作。
整个的路由器结构可划分为两大部分:路由选择部分和分组转发部分。
交换结构是路由器的关键构件。正是这个交换结构把分组从一个输入端口转移到某个合适的输出端口。
最早使用的路由器就是利用普通的计算机,用计算机的CPU作为路由器的路由选择处理机。路由器的输入和输出端口的功能和传统的操作系统中的I/O设备一样。当路由器的某个输入端口收到一个分组时,就用中断方式通知路由选择处理机。然后分组就从输入端口复制到存储器中。路由器处理机从分组首部提取目的地址,查找路由表,再将分组复制到合适的输出端口的缓存中。若存储器的带宽(读或写)为每秒 M M M个分组,那么路由器的交换速率(即分组从输入端口传送到输出端口的速率)一定小于 M / 2 M/2 M/2。这是因为存储器对分组的读和写需要花费的时间是同一个数量级。
下图表示分组通过存储器进行交换。与早期的路由器的区别就是,目的地址的查找和分组在存储器中的缓存都是在输入端口中进行的。
下图表示分组通过总线进行交换。采用这种方式时,数据报从输入端口通过共享总线直接传送到合适的输出端口,而不需要路由选择处理机的干预。但是,由于总线是共享的,因此在同一时间只能有一个分组在总线上传送。当分组到达输入端口时若发现总线忙,则被阻塞而不能通过交换结构,并在输入端口排队等待。因为每一个要转发的分组都要通过这一条总线,因此路由器的转发带宽就受总线速率的限制。
下图表示的是通过纵横交换结构(crossbar switch fabric)进行交换。常称为互连网络(interconnection network)。它有 2 N 2N 2N条总线,可以使 N N N个输入端口和 N N N个输出端口相连接,这取决于相应的交叉节点是使水平总线和垂直总线接通还是断开。当输入端口收到一个分组时,就将它发送到与该输入端口相连的水平总线上。若通向所要转发的输出端口的垂直总线是空闲的,则在这个节点将垂直总线与水平总线接通,然后把该分组转发到这个输出端口。和前两种交换机制不同,这种纵横交换结构是一种无阻塞的交换结构,其特点是分组可以转发到任何一个输出端口,只要这个输出端口没有被别的分组占用,如果这个输出端口已被占用,那么后到达的分组就必须在输入端口排队等待。
IP多播是需要在互联网上增加更多的智能才能提供的一种服务。
IP多播(multicast,以前曾译为组播)。由于有许多的应用需要由一个源点发送到许多个终点,即一对多的通信。
与单播相比,在一对多的通信中,多播可大大节约网络资源。如下:
视频服务器用多播方式向属于同一个多播组的90个成员传送节目。这时,视频服务器只需把视频分组当作多播数据报来发送,并且一次只需发送一次。路由器 R 1 R_1 R1在转发分组时,需要把收到的分组复制成3个副本,分别向 R 2 R_2 R2, R 3 R_3 R3和 R 4 R_4 R4各转发1个副本。当分组到达目的局域网时,由于局域网具有硬件多播功能,因此不需要复制分组,在局域网上的多播组成员都能收到这个视频分组。
当多播组的主机数很大时(如成千上万),采用多播方式就可明显地减轻网络中各种资源的消耗。在互联网范围的多播要靠路由器来实现,这些路由器必须增加一些能够识别多播数据报的软件。能够运行多播协议的路由器称为多播路由器(multicast router)。多播路由器当然也可以转发普通的单播IP数据报。
为了适应交互式音频和视频信息的多播,互联网开始试验虚拟的多播主干网MBONE(Multicast Backbone On the InterNEt)。MBONE可把分组传播给地点分散但属于一个组的许多台主机。现在多播主干网已经有了相当大的规模。
在互联网上进行多播就叫做IP多播。IP多播所传送的分组需要使用多播IP地址。
在互联网中每一台主机必须有一个全球唯一的IP地址。如果某台主机现在想接收某个特定多播组的分组,那么怎样才能使这个多播数据报传送到这台主机?
显然,这个多播数据报的目的地址一定不能写入这台主机的IP地址。这时因为在同一时间可能有成千上万台主机加入到同一个多播组。多播数据报不可能在其首部写入这样多的主机的IP地址。在多播数据报的目的地址写入的是多播组的标识符,然后设法让加入到这个多播组的主机的IP地址与多播组的标识符关联起来。
其实多播组的标识符就是IP地址中的D类地址。D类IP地址的前四位是1110,因此D类地址范围是224.0.0.0到239.255.255.255。我们就用每一个D类地址标志一个多播组。这样,D类地址共可标志 2 28 2^{28} 228个多播组,就是说,在同一时间可以允许有超过2.6亿的多播组在互联网上运行。多播数据报和一般的IP数据报的区别就是它使用D类IP地址作为目的地址,并且首部中的协议字段值是2,表明使用网际组管理协议IGMP。
显然,多播地址只能用于目的地址,而不能用于源地址。此外,对多播数据报不产生ICMP差错报文。因此,若在PING命令后面键入多播地址,将永远不会收到响应。
IP多播可以分为两种。一种是只在本局域网上进行硬件多播,另一种则是在互联网的范围进行多播。
下图是在互联网上传送多播数据报的例子,图中标有IP地址的四台主机都参加了一个多播组,其组地址是226.15.37.123。显然,多播数据报应当传送到路由器 R 1 R_1 R1, R 2 R_2 R2和 R 3 R_3 R3,而不应当传送到路由器 R 4 R_4 R4,因为与 R 4 R_4 R4连接的局域网上现在没有这个多播组的成员。但这些路由器又怎样知道多播组的成员信息呢?这就要利用一个协议,叫作网际组管理协议IGMP(Internet Group Management Protocol)。
上图强调了IGMP的本地使用范围。注意,IGMP并非在互联网范围内对所有多播组成员进行管理的协议。IGMP不知道IP多播组包含的成员数,也不知道这些成员都分布在那些网络上。IGMP协议是让连接在本地局域网上的多播路由器知道本局域网上是否有主机(严格讲,是主机上的某个进程)参加或退出了某个多播组。
仅有IGMP协议是不能完成多播任务的。连接在局域网上的多播路由器还必须和互联网上的其他多播主机协同工作,以便把多播数据报用最小代价传送给所有的组成员。这就需要使用多播路由选择协议。
多播路由选择协议比单播路由选择协议复杂的多,如下图
假定图中有两个多播组。多播组 M 1 M_1 M1的成员有主机A,B和C,而多播组 M 2 M_2 M2的成员有主机D,E和F。这些主机分布在三个网络上( N 1 , N 2 和 N 3 N_1,N_2和N_3 N1,N2和N3)。有如下三种情况。
适合于较小的多播组,而所有的组成员接入的局域网也是相邻接的。一开始,路由器转发多播数据报使用洪泛的方法(就是广播)。为了避免兜圈子,采用了叫作反向路径广播RPB(Reverse Path Broadcasting)的策略。RPB的要点是:每一个路由器在收到一个多播数据报时,先检查数据报是否是从源点经最短路径传送来的。进行这种检查很容易,只要从本路由器寻找到源点的最短路径上(之所以叫作反向路径,因为在计算最短路径时是把源点当作终点的)的第一个路由器是否就是刚才把多播数据报送来的路由器。若是,就向所有其他方向转发刚才收到的多播数据报(但进入的方向除外),否则就丢弃而不转发。如果本路由器有好几个相邻路由器都处在到源点的最短路径上(也就是说,存在几条同样长度的最短路径),那么只能选择一条最短路径,选择的准则就是看这几条最短路径中的相邻路由器谁的IP地址最小。
上图中的网络用路由器之间的链路来表示。假定各路由器之间的距离都是1。路由器 R 1 R_1 R1收到源点发来的多播数据报后,向 R 2 R_2 R2和 R 3 R_3 R3转发。 R 2 R_2 R2发现 R 1 R_1 R1就在自己到源点的最短路径上,因此向 R 3 R_3 R3和 R 4 R_4 R4转发收到的数据报。 R 3 R_3 R3发现 R 2 R_2 R2不在自己到源点的最短路径上,因此丢弃 R 2 R_2 R2发来的数据报。其他路由器也这样转发。 R 7 R_7 R7到源点有两条最短路径: R 7 → R 4 → R 2 → R 1 → 源点 R_7→R_4→R_2→R_1→源点 R7→R4→R2→R1→源点; R 7 → R 5 → R 3 → R 1 → 源点 R_7→R_5→R_3→R_1→源点 R7→R5→R3→R1→源点。我们再假定 R 4 R_4 R4的IP地址比 R 5 R_5 R5的IP地址小,所以我们只使用前一条最短路径。因此 R 7 R_7 R7只转发 R 4 R_4 R4传过来的数据报,而丢弃 R 5 R_5 R5传过来的数据报。最后就得出了用来转发多播数据报的多播转发树(上图中用粗线表示),以后就按这个多播转发树来转发多播数据报。这样就可避免多播数据报兜圈子,同时每一个路由器也不会接收重复的多播数据报。
如果在多播转发树上的某个路由器发现它的下游树枝(即叶节点方向)已没有该多播组的成员,就应把它和下游的树枝一起剪除。如上图中虚线椭圆表示剪除的部分。当某个树枝有新增加的组成员时,可以再接入到多播转发树上。
隧道技术适用于多播组的位置在地理上很分散的情况。如下图中,网 N 1 N_1 N1和网 N 2 N_2 N2都支持多播。现在 N 1 N_1 N1中的主机向 N 2 N_2 N2中的一些主机进行多播。但路由器 R 1 R_1 R1和 R 2 R_2 R2之间的网络并不支持多播,因而 R 1 R_1 R1和 R 2 R_2 R2不能按多播地址转发数据报。为此,路由器 R 1 R_1 R1就对多播数据报进行再次封装,即再加上普通数据报首部,使之成为向单一目的站发送的单播(unicast)数据报,然后通过“隧道”(tunnel)从 R 1 R_1 R1发送到 R 2 R_2 R2。
单播数据报到达路由器 R 2 R_2 R2后,再由路由器 R 2 R_2 R2剥去其首部,使它恢复成原来的多播数据报,继续向多个目的站转发。这种使用隧道技术传送数据报又叫作IP中的IP(IP-in-IP)。
假定某个机构在两个相隔较远的场所建立了专用网A和B,其网络地址分别为专用地址10.1.0.0和10.2.0.0。现在这两个场所需要通过公用的互联网构成一个VPN。
每一个场所至少需要有一个路由器具有合法的全球IP地址,如下图中的路由器 R 1 R_1 R1和 R 2 R_2 R2。这两个路由器和互联网的接口地址必须是合法的全球IP地址。路由器 R 1 R_1 R1和 R 2 R_2 R2在专用网内部网络的接口地址则是专用网的本地地址。
在每一个场所A或B内部的通信量都不经过互联网。但如果场所A的主机X要和另一个场所B的主机Y通信,那么就必须经过路由器 R 1 R_1 R1和 R 2 R_2 R2。主机X向主机Y发送的IP数据报的源地址是10.1.0.1,而目的地址是10.2.0.3。这个数据报先作为本机构的内部数据报从X发送到与互联网连接的路由器 R 1 R_1 R1。路由器 R 1 R_1 R1收到内部数据报后,发现其目的网络必须通过互联网才能到达,就把整个的内部数据报进行加密(这样就保证了内部数据报的安全),然后重新加上数据报的首部,封装成为在互联网上发送的外部数据报,其源地址是路由器 R 1 R_1 R1的全球地址125.1.2.3,而目的地址是路由器 R 2 R_2 R2的全球地址194.4.5.6。路由器 R 2 R_2 R2收到数据报后将其数据部分取出进行解密,恢复出原来的内部数据报(目的地址是10.2.0.3),交付主机Y。可见,虽然X向Y发送的数据报通过了公用的互联网,但在效果上就好像是在本部门的专用网上传送一样。如果主机Y要向X发送数据报,那么所进行的步骤也是类似的。
下图中,专用网192.168.0.0内所有主机的IP地址都是本地IP地址192.168.x.x。NAT路由器至少要有一个全球IP地址,才能和互联网相连。下图中NAT路由器的全球地址是172.38.1.5(NAT路由器可以有多个全球IP地址)。
NAT路由器收到从专用网内部的主机A发往互联网主机B的IP数据报1:源地址S=192.168.0.3,而目的地址D=213.18.2.4。NAT路由器通过内部的NAT转换表,把专用网的IP地址192.168.0.3,转换为全球IP地址172.38.1.5后,改写到数据报的首部中作为新的源地址,然后把新的数据报2转发出去。主机B收到IP数据报2后,发回应答3,B发送的IP数据报的源地址就是自己的地址:S=213.18.2.4,目的地址就是刚才收到的数据报的源地址,因此现在D=172.38.1.5。注意,B并不知道A的专用地址192.168.0.3。实际上,即使知道了,也不能使用,因为互联网上的路由器不能转发目的地址是任何专用地址的IP数据报。当NAT路由器收到B发来的IP数据报3时,还要进行一次IP地址的转换。通过NAT转换表,把收到的IP数据报使用的目的地址D=172.38.1.5转换为专用网内部的目的地址D=192.168.0.3(即主机A真正的本地IP地址),变成了数据报4,然后发送到A。
通过NAT路由器的通信必须由专用网内的主机发起。如果专用网上外面的主机要发起通信,当IP数据报到达NAT路由器时,NAT路由器就不知道应当把目的IP地址转换成专用网内的哪一个本地IP地址。这就表明,专用网内部的主机不能直接充当服务器用。
为了更加有效地利用NAT路由器上的全球IP地址,现在常用的NAT转换表把运输层的端口号也利用上。这样,就可以使多个拥有本地地址的主机,共用NAT路由器上的一个全球IP地址,因而可同时和互联网上的不同主机进行通信。
使用端口号的NAT也叫作网络地址与端口号转换NAPT(Network Address and Port Translation),而不使用端口号的NAT就叫作传统的NAT(traditional NAT)。