虚电路服务
借助于电信网的成功经验,让网络负责可靠交付。用面向连接的通信方式,当两个计算机进行通信时,应当向建立连接(在分组交换中建立一条虚电路VC(Virtual Circuit)),以保证双方通信所需的一切网络资源,然后双方沿着已建立的虚电路发送分组。这样的分组的首部不需要填写完整的目的主机地址,而只需要填写这条虚电路的编号(一个不大的整数),因而减少了分组的开销。这种通信方式如果再使用可靠传输的网络协议,就可使所发的分组无差错按序到达终点,也不丢失、不重复。在通信结束后要释放建立的虚电路,图1(a)是网络提供虚电路服务的示意图,主机H1和H2之间交换的分组都必须在事先建立的虚电路上传送。
数据报服务
考虑到计算机网络的端系统是有智能的计算机,计算机有很强的差错处理能力(不像电信网的终端(电话机)非常简单,无智能和差错处理能力),因此因特网在设计上就采用了和电信网完全不同的思路。网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。网络在发送分组时不需要先建立连接,每一个分组(也就是IP数据报)独立发送,与其前后的分组无关(不编号)。网络层不提供服务质量的承诺。所传送的分组可能出错、丢失、重复和失序,也不保证分组交付的时限。由于传输网络不提供端到端的可靠传输服务,这样的好处是路由器做的比较简单而且价格低廉,大大降低了网络的造价,运行方式灵活,能够适应多种应用。图1(b)是网络提供数据报服务的示意图,主机H1向H2发送的分组各自独立地选择路由,而且传送的过程中还可能丢失。
表1归纳了虚电路服务和数据报服务的主要区别。
对比的方面 | 虚电路服务 | 数据报服务 |
---|---|---|
思路 | 可靠通信应当由网络来保证 | 可靠通信应当由用户主机来保证 |
连接的建立 | 必须有 | 不需要 |
终点地址 | 仅在连接建立阶段使用,每个分组使用短的虚电路号 | 每个分组都有终点的完整地址 |
分组的转发 | 属于同一条虚电路的分组均按照同一路由进行转发 | 每个分组独立选择路由进行转发 |
当结点出故障时 | 所有通过出故障的结点的虚电路均不能工作 | 出故障的结点可能会丢失分组,一些路由可能会发送变化 |
分组顺序 | 总是按发送顺序到达终点 | 到达终点时不一定按发送顺序 |
端到端的差错处理和流量控制 | 可以由网络负责,也可以由用户主机负责 | 由用户主机负责 |
网际协议IP是TCP/IP体系中最主要的协议之一,也就是最重要的因特网标准协议之一,与IP协议配套使用的还有四个协议:地址解析协议ARP(Address Resolution Protocol)、逆地址解析协议RARP(Reverse Address Resolution Protocol)、网际控制报文协议ICMP(Internet Control Message Protocol)、网际组管理协议IGMP(Internet Group Management Protocol)。
虚拟互连网络
由于用户的需求是多种多样的,没有一种单一的网络能够适应所有用户的需求,所以市场上有很多种不同性能、不同网络协议的网络。面对不同的寻址方案、不同的最大分组长度、不同的网络接入机制、不同的超时控制、不同的差错恢复方法等等,网络的互连变得复杂。
TCP/IP体系在网络互连上采用的做法是在网络层(即IP层)采用了标准化协议,但相互连接的网络可以是异构的。由于参加互连的计算机网络都使用相同的网际协议IP,因此可以把互连以后的计算机网络看成虚拟互连网络,所谓虚拟互连网络就是逻辑互连网络,也就是互连起来的各种物理网络的异构性本来是客观存在的,但是利用IP协议可以使这些性能各异的网络在网络层上看起来好像是一个统一的网络。
网络层使用中间设备路由器(router) 用来在互联网中进行路由选择。(物理层/数据链路层/网络层以上分别对应的中间设备是转发器(repeater)/网桥或桥接器(bridge)/网关(gateway))。如图2所示,主机H1先要查找自己的路由表,看目的主机是否就在本网络上,则不需要经过任何路由器而是直接交付,任务就完成。如不是,则必须把IP数据报发送给某个路由器 (R1),R1在查找了自己的路由表后,知道应当把数据报转发给R2进行间接交付,这样一直转发直到路由器R5直到自己是和H2在同一网络上,就把数据报直接交付给目的主机H2。图中协议栈中的数字1~5分别表示物理层、数据链路层、网络层、运输层和应用层。
分类的IP地址
有了虚拟互连网络的概念,再讨论在这样的虚拟网络上如何寻址。
2.1 IP地址及其表示方法
IP地址就是给因特网上的每一个主机(或路由器)的每一个接口分配一个在全世界范围是唯一的32位的标识符。IP地址现在由因特网名字与号码指派公司ICANN(Internet Corporation for Assigned Names and Numbers) 进行分配。
IP地址被划分为若干个固定类,每一类地址都由两个固定长度的字段组成,其中第一个字段是网络号(net-id),它标志主机(或路由器)所连接到的网络。一个网络号在整个因特网范围内必须是唯一的。第二个字段是主机号(host-id),它标志该主机(或路由器)。一个主机号在它前面的网络号所指明的网络范围内必须是唯一的。由此可见,一个IP地址在整个因特网范围内是唯一的。这种两级的IP地址可以记为IP地址 ::= {<网络号>, <主机号>}。
图3给出了各种IP地址的网络号字段和主机号字段,这里的A类、B类和C类地址都是单播地址(一对一通信),是最常用的。
由图3可以看出:
此处指出,由于近年来已经广泛使用无分类IP地址进行路由选择,A类、B类和C类地址的区分已经成为历史。
从IP地址的结构来看,IP地址并不仅仅指明一个主机,同时指明了主机所连接到的网络。将IP地址分为三个类别主要是考虑到不同网络需要的主机数量不同,把IP地址划分为A类、B类和C类满足不同用户的要求。当某个单位申请到一个IP地址时,实际上是获得了具有同样网络号的一块地址。其中具体的各个主机号则由该单位自行分配,只要做到在该单位管辖范围内无重复的主机号即可。
2.2 常用的三种类别的IP地址
A类地址 的网络号字段占一个字节,只有7位可供使用(该字段的第一位已固定为0),最终可指派的网络号是126个(即2^7-2)。减2是去除了:(a) 网络号字段为全0的IP地址是个保留地址,表示“这个(this)”、“本网络”;(b) 网络号为127(即0111 1111)保留作为本地软件环回测试(loopback test) 本主机的进程之间通信使用。若主机发送一个目的地址为环回地址(如127.0.0.1)的IP数据报,则本主机中的协议软件就处理数据报中的数据,而不会把数据报发送到任何网络。目的地址为环回地址的IP数据报永远不会出现在任何网络上,因为网络号为127的地址根本不是一个网络地址。
A类地址的主机号占3字节,因此每一个A类网络中的最大主机数是2^24-2。此处减2去除的是:(a) 全0的主机号字段表示该IP地址是“本主机”所连接到的单个网络地址(如一主机的IP地址为5.6.7.8,则该主机所在的网络地址就是5.0.0.0),而全1表示“所有的(all)”,因此全1的主机号字段表示该网络上的所有主机。
IP地址空间共有 2^32 个地址。整个A类地址空间共有 2^31 个地址,占有整个IP地址空间的50%。
B类地址 的网络号字段有2字节,但前面两位(10)已经固定,只剩下14位可以进行分配。因为网络号字段后面的14位无论怎样取值也不可能出现使整个2字节的网络号字段成为全0或全1,因此这里不存在网络总数减2的问题。但实际上B类网络地址128.0.0.0是不指派的,而可以指派的B类最小网络地址是128.1.0.0。因此B类地址可指派的网络数为2\^14-1。B类地址的每一个网络上的最大主机数是2\^16-2,减2扣除全0和全1的主机号。整个B类地址空间共约有2^30个地址,占整个IP地址空间的25%。
C类地址 有3个字节的网络号字段,最前面的3位是(110),还有21位可以进行分配。C类网络地址192.0.0.0也是不指派的。可以指派的C类最小网络地址是192.0.1.0。因此C类地址可指派的网络总数是2\^21-1。每一个C类地址的最大主机数是2\^8-2。整个C类地址空间共约有2^29个地址,占整个IP地址的12.5%。
表2 给出IP地址的指派范围如下:
网络类别 | 最大可指派的网络数 | 第一个可指派的网络号 | 最后一个可指派的网络号 | 每个网络中的最大主机数 |
---|---|---|---|---|
A | 126(2^7-2) | 1 | 126 | 16777214(2\^24-2) |
B | 16383(2\^14-1) | 128.1 | 191.255 | 65534(2\^16-2) |
C | 2097151(2\^21-1) | 192.0.1 | 223.255.255 | 254(2\^8-2) |
表3给出了一般不使用的IP地址,这些地址只能在特定的情况下使用:
网络号 | 主机号 | 源地址使用 | 目的地址使用 | 代表的意思 |
---|---|---|---|---|
0 | 0 | 可以 | 不可 | 在本网络上的本主机 |
0 | host-id | 可以 | 不可 | 在本网络上的某个主机host-id |
全1 | 全1 | 不可 | 可以 | 只在本网络上进行广播(各路由器均不转发) |
net-id | 全1 | 不可 | 可以 | 对net-id上的所有主机进行广播 |
127 | 非全0或全1的任何数 | 可以 | 可以 | 用作本地软件环回测试只用 |
IP地址的重要特点:
IP数据包的格式
在TCP/IP标准中,各种数据报格式常常以32位(即4字节)为单位来描述。IP数据报的完整格式如图4所示:
IP数据报首部各字段的意义如下。
IP数据报首部的固定部分中的各字段
(1) 版本 占4位,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(IPv4),之后可能使用IPv6。
(2) 首部长度 占4位,可表示的最大十进制数值是15。这个字段所表示的单位是32位字(1个32位字长是4字节),因此当IP的首部长度为1111时(即十进制的15),首部长度就达到最大值60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。首部长度限制的缺点是有时不够用。最常用的首部长度是20字节(即首部长度为0101),此时不使用任何选项。
(3) 区分服务 占8位,用来获得更好的服务。在旧标准中叫做服务类型,但实际一直未被使用。1998年IETF把这个字段改名为区分服务DS(Differentiated Services),只用在使用区分服务才会使用该字段(不同数值表示提供不同等级的服务质量)。
(4) 总长度 首部和数据之和,单位为字节。总长度字段为16位,则数据包的最大长度为2\^16-1=65535字节。
有关IP的标准文档规定,所有主机和路由器必须能处理的IP数据报长度不得小于576字节,这个数值也就是最小的IP数据报的总长度。当数据报长度超过网络说容许的最大传送单元MTU时,就必须把过长的数据报进行分片,此时数据报首部中的总长度字段指的是分片后的每一个分片的首部长度和数据长度总和。
(5) 标识(identification) 占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。主要是当数据报分片是,这个标识字段被复制到所有数据报片中,接收端根据标识字段把各数据报片重装成原来的数据报。
(6) 标志(flag) 占3位。目前只有两位有意义。
(7) 片位移 占13位。较长的分组在分片后,某片在原分组中的相对位置。也就是说相对于用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。每个分片的长度一定是8字节(64位)的整数倍。
(8) 生存时间TTL(Time To Live) 占8位,表明是数据报在网络中的寿命,目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源。初始的TTL值的单位为秒,每经过一个路由器,TTL就减去数据报在路由器所消耗的一段时间,当TTL值减为0时,就丢弃该数据报。
由于现在路由器处理数据报所需时间不断缩短,一般远远小于1秒,后来就把TTL字段的功能改为“跳数限制”(但名称不变)。路由器在转发数据报之前就把TTL值减1。也就是TTL的单位不再是秒,而是跳数。其意义是表明数据报在因特网中至多可经过多少个路由器。若TTL初始值为1,则表示该数据报只能在本局域网中传送。
(9) 协议 占8位,协议字段指出此数据报携带的数据使用何种协议,以便目的主机的IP层知道应将数据部分上交给哪个处理过程。常用的一些协议及其协议字段值如下表:
协议名 | ICMP | IGMP | TCP | EGP | IGP | UDP | IPv6 | OSPF |
---|---|---|---|---|---|---|---|---|
协议字段值 | 1 | 2 | 6 | 8 | 9 | 17 | 41 | 89 |
(10) 首部检验和 占16位,这个字段只检验数据报的首部,不包括数据部分。因为数据报每经过一个路由器,路由器都要重新计算首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量。检验码的计算方法是:在发送方,先把IP数据报首部划分为许多16位字的序列,并把检验和字段置零。用反码算术运算把所有16位字相加后,将得到的和的反码写入检验和字段。接收方收到数据报后,将首部的所有16位字再使用反码算术运算相加一次,将得到的和取反码,即得出接收方检验和的计算结果。若首部未发生变化,则结果必为0,保留数据报,否则丢弃数据报。
(11) 源地址 占32位。
(12) 目的地址 占32位。
无分类编址CIDR(构造超网)
网络前缀
无分类编址的方法是用于解决两个问题:(1) B类地址在1992年已分配了近一半,眼看很快就将全部分配完毕;(2) 因特网主干网上的路由表中的项目数急剧增长(几千->几万)。IPv6协议是用于解决另一个问题:整个IPv4的地址空间最终将全部耗尽。
早先在RFC1009中就指明了在一个划分子网的网络中可同时使用几个不同的子网掩码。使用变长子网掩码VLSM(Variable Length Subnet Mask) 可进一步提高IP地址资源的利用率。
无分类编址 方法,正式名字是无分类 域间路由选择CIDR(Classless Inter-Domain Routing,读音是“sider”)是在VLSM的基础上研究出的。
CIDR最主要的特点是:
(1) CIDR消除了传统的A类、B类和C类地址以及划分子网的概念。CIDR把32位的IP地址划分为两部分,前面部分是“网络前缀”(network-prefix)(或简称为“前缀”)用来指明网络,后面的部分则用来指明主机。因此CIDR使IP地址从三级编址(使用子网掩码)又回到两级编址,但这已是无分类的两级编址,其记法是:IP地址::={<网络前缀>, <主机号>}。
CIDR还使用“斜线记法”(slash notation),或称为CIDR记法,即在IP地址后面加上斜线“/”,然后写上网络前缀所占的位数。
(2) CIDR把网络前缀都相同的连续IP地址组成一个“CIDR地址块”,只要知道CIDR地址块中的任何一个地址,就可以知道这个地址块的起始地址(即最小地址)和最大地址,以及地址中的地址数。
由于一个CIDR地址块中有很多地址,所以在路由表中就利用CIDR地址块来查找目的网络,这种地址的聚合常称为路由聚合(route aggregation),使得路由表中的一个项目可以表示原来传统分类地址的很多个路由,路由聚合也称为构成超网(supernetting)。
CIDR记法有多种形式,如地址块10.0.0.0/10可简写为10/10(把点分十进制中低位连续的0省略);另一种简化表示实在网络前缀的后面加一个星号*,如:00001010 00*。
最长前缀匹配
使用CIDR后,路由表中的每个项目由“网络前缀”和“下一跳地址”组成,但是在查找路由表时可能会得到不止一个匹配结果。正确的匹配是:从匹配结果中选择具有最长网络前缀的路由,这就是最长前缀匹配(longest-prefix matching),又称为最长匹配或最佳匹配。
网际控制报文协议ICMP(Internet Control Message Protocol)允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去。ICMP报文格式如图6所示:
ICMP报文的种类
ICMP报文的种类有两种,即ICMP差错报告报文和ICMP询问报文。
ICMP报文的前4个字节是统一的格式,共有三个字段:类型、代码和检验和。接着的4个字节的内容与ICMP的类型有关。最后面是数据字段,其长度取决于ICMP的类型。下表给出了几种常用的ICMP报文类型:
ICMP报文种类 | 类型的值 | ICMP报文的类型 |
---|---|---|
差错报告报文 | 3 | 终点不可达 |
差错报告报文 | 4 | 源点抑制(Source quench) |
差错报告报文 | 11 | 时间超过 |
差错报告报文 | 12 | 参数问题 |
差错报告报文 | 5 | 改变路由(Redirect) |
询问报文 | 8或0 | 回送(Echo)请求或回答 |
询问报文 | 13或14 | 时间戳(Timestamp)请求或回答 |
所有的ICMP差错报告报文中的数据字段都具有同样的格式(如图7所示)。把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出作为ICMP报文的数据字段。再加上相应的ICMP差错报文的前8个字节,就构成了ICMP差错报告报文。提取收到的IP数据报的数据字段的前8个字节是为了得到传输层的端口号(对于TCP和UDP)以及运输层报文的发送序号(对于TCP)。这些信息对源点通知高层协议是有用的,整个ICMP报文作为IP数据报的数据字段发送给源点。
内部网关协议RIP
工作原理
路由信息协议RIP(Routing Information Protocol)是内部网关协议IGP中最先得到广泛使用的协议。RIP是一种分布式的基于距离向量的路由选择协议,是因特网的标准协议,其最大优点就是简单。
RIP的协议要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录(因此,这是一组距离,即“距离向量”)。RIP协议的“距离”实际上指的是“跳数”(hop count)。RIP认为好的路由就是通过的路由器的数目少。RIP允许一条路径最多只能包含15个路由器。因此“距离”等于16时即相当于不可达。可见RIP只适用于小型互联网。RIP不能在两个网络之间同时使用多条路由。RIP选择一条具有最少路由器的路由(即最短路由),哪怕还存在另一条高速(低时延)但路由器较多的路由。
RIP协议的特点如下:
(1) 仅和相邻路由器交换信息。
(2) 路由器交换的信息是当前本路由器所知道的全部信息,即自己的路由表。也就是“我到本自治系统中所有网络的(最短)距离,以及到每个网络应经过的下一跳路由器”。
(3) 按固定的时间间隔交换路由信息。然后路由器根据收到的路由信息更新路由表。当网络拓扑发生变化时,路由器也及时向相邻路由器通告拓扑变化后的路由信息。
此处强调,路由器在刚刚开始工作时,只知道直接连接的网络的距离。接着,每一个路由器也只和数目非常有限的相邻路由器交换并更新路由信息。但经过若干次更新后,所有的路由器最终都会知道本自治系统中的任何一个网络的最短距离和下一跳路由器地址。
内部网关协议OSPF
OSPF协议的基本特点
这个协议的名字是开放最短路径优先OSPF(Open Shortest Path First)。该协议最主要的特征就是使用分布式的链路状态协议(link state protocol),OSPF的三个要点是:
(1) 向本自治系统中所有路由器发送信息,此处使用洪泛法(flooding),这就是路由器通过所有输出端口向所有相邻的路由器发送信息,而相邻路由器又再将此信息发往其所有的相邻路由器(但不再发送给刚刚发来信息的那个路由器)(RIP仅仅向自己相邻的几个路由器发送信息)。
(2) 发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。所谓“链路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的“度量”(metric)。OSPF将这个“度量”用来表示费用、距离、时延和带宽等等,有时为了方便就称这个度量为“代价”(RIP发送的信息是:到所有网络的距离和下一跳路由器)。
(3) 只有当链路状态发生变化时,路由器才向所有路由器用洪泛法发送其信息。(RIP是定期交换路由表信息)。
由于各路由器之间频繁地交换链路状态信息,因此所有的路由器最终都能建立一个链路状态数据库(link-state database),这个数据库实际上就是全网的拓扑结构图。注意RIP协议的每一个路由器虽然知道所有的网络的距离以及下一跳的路由器,但却不知道全网的拓扑结构。
OSPF的链路状态数据库能较快地进行更新,使各个路由器能及时更新其路由表。OSPF的更新过程收敛得快是其重要优点。
为了使OSPF能够用于规模很大的网络,OSPF将一个自治系统再划分为若干个更小的范围,叫作区域(area)。划分区域的好处就是利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个的自治系统,这就减少了整个网络上的通信量。在一个区域内部的路由器只知道本区域的完整网络拓扑,而不知道其他区域的网络拓扑的情况。为了使每一个区域能够和本区域以外的区域进行通信,OSPF使用层次结构的区域划分。在上层的区域叫做主干区域(backbone area),用于连通其他在下层的区域。
OSPF不用UDP而是直接用IP数据报传送(其IP数据报首部的协议字段值为89)。OSPF构成的数据报如图9所示。OSPF分组使用24字节的固定长度首部。
OSPF首部各字段的意义如下:
(1) 版本 当前版本号为2;
(2) 类型 可以是五种类型分组中的一种;
(3) 分组长度 包括OSPF首部在内的分组长度,以字节为单位;
(4) 路由器标识符 标志发送该分组的路由器的接口的IP地址;
(5) 区域标识符 分组属于的区域的标识符;
(6) 检验和 用来检测分组中的差错;
(7) 鉴别类型 目前只有两种。0(不用)和1(口令);
(8) 鉴别 鉴别类型为0时就填入0。鉴别类型为1则填入8个字符的口令。
OSPF具有下列的一些特点:
(1) OSPF对于不同类型的业务可计算出不同的路由。
(2) 如果到同一个目的网络有多条相同代价的路径,那么可以将通信量分配给这几条路径,这叫作多路径间的负载平衡(load balancing)。
(3) 所有在OSPF路由器之间交换的分(如链路状态更新分组)组都具有鉴别的功能,因而保证了仅在可信赖的路由器之间交换链路状态信息。
(4) OSPF支持可变长度的子网划分和无分类的编址CIDR。
(5) OSPF让每一个链路状态都带上一个32位的序号,序号越大网络中的链路状态越新。
[1] 谢希仁. 计算机网络(第五版)