计算机网络网络层
只有深入地掌握了IP协议的主要内容,才能理解互联网是怎样工作的。
网络层设计
在计算机网络领域,网络层应该向运输层提供怎样的服务(“面向连接”还是“无连接”)曾引起了长期的争论。争论焦点的实质就是:在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统?
互联网采用的设计思路是这样的:网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。这里的“数据报”(datagram)是互联网的设计者最初使用的名词,其实数据报(或IP数据报)就是我们经常使用的“分组”。
网络在发送分组时不需要先建立连接。每一个分组(也就是IP数据报)独立发送,与其前后的分组无关(不进行编号)。网络层不提供服务质量的承诺 。也就是说,所传送的分组可能出错、丢失、重复和失序(即不按序到达终点),当然也不保证分组交付的时限。
网际协议IP
网际协议IP是TCP/IP体系中两个最主要的协议之一[STEV94][COME06][FORO10],也是最重要的互联网标准协议之一。网际协议IP又称为Kahn-Cerf协议,因为这个重要协议正是Robert Kahn和Vint Cerf二人共同研发的。这两位学者在2005年获得图灵奖(其地位相当于计算机科学领域的诺贝尔奖)。严格来说,这里所讲的IP其实是IP的第4个版本,应记为IPv4。但在讲述IP协议的各种原理时,往往不在IP后面加上版本号。
与IP协议配套使用的还有三个协议:
- 地址解析协议ARP (Address Resolution Protocol)
- 网际控制报文协议ICMP (Internet Control Message Protocol)
- 网际组管理协议IGMP (Internet Group Management Protocol) 由于网际协议IP是用来使互连起来的许多计算机网络能够进行通信的,因此TCP/IP体系中的网络层常常被称为网际层 (internet layer),或IP层 。使用“网际层”这个名词的好处是强调这是由很多网络构成的互连网络。
虚拟互连网络
我们知道,如果要在全世界范围内把数以百万计的网络都互连起来,并且能够互相通信,那么这样的任务一定非常复杂。其中会遇到许多需要解决的问题,如:
- 不同的寻址方案;
- 不同的最大分组长度;
- 不同的网络接入机制;
- 不同的超时控制;
- 不同的差错恢复方法;
- 不同的状态报告方法;
- 不同的路由选择技术;
- 不同的用户接入控制;
- 不同的服务(面向连接服务和无连接服务);
- 不同的管理与控制方式;等等。
从一般的概念来讲,将网络互相连接起来要使用一些中间设备 。根据中间设备所在的层次,可以有以下四种不同的中间设备:
- 物理层使用的中间设备叫做转发器 (repeater)。
- 数据链路层使用的中间设备叫做网桥 或桥接器 (bridge)。
- 网络层使用的中间设备叫做路由器 (router) 。
- 在网络层以上使用的中间设备叫做网关 (gateway)。用网关连接两个不兼容的系统需要在高层进行协议的转换。 当中间设备是转发器或网桥时,这仅仅是把一个网络扩大了,而从网络层的角度看,这仍然是一个网络,一般并不称之为网络互连。网关由于比较复杂,目前使用得较少。因此现在我们讨论网络互连时,都是指用路由器进行网络互连和路由选择。路由器其实就是一台专用计算机,用来在互联网中进行路由选择。由于历史的原因,许多有关TCP/IP的文献曾经把网络层使用的路由器称为网关 (本书有时也这样用)
现在用一个例子来说明。互联网可以由多种异构网络互连组成 。 互联网中的源主机H 1 要把一个IP数据报发送给目的主机H 2 。根据第1章中讲过的分组交换的存储转发概念,主机H 1 先要查找自己的路由表,看目的主机是否就在本网络上。如是,则不需要经过任何路由器而是直接交付 ,任务就完成了。如不是,则必须把IP数据报发送给某个路由器(R 1 )。R 1 在查找了自己的路由表后,知道应当把数据报转发给R 2 进行间接交付 。这样一直转发下去,最后由路由器R 5 知道自己是和H 2 连接在同一个网络上,不需要再使用别的路由器转发了,于是就把数据报直接交付 目的主机H 2 。 如果我们只从网络层考虑问题,那么IP数据报就可以想象是在网络层中传送,其传送路径是:
H 1 →R 1 →R 2 →R 3 →R 4 →R 5 →H 2
IP地址
在TCP/IP体系中,IP地址是一个最基本的概念,一定要把它弄清楚。有关IP最重要的文档就是互联网的正式标准RFC 791。
IP地址及其表示方法
整个的互联网就是一个单一的、抽象的网络 。IP地址就是给互联网上的每一台主机(或路由器)的每一个接口分配一个在全世界范围内是唯一的32位的标识符。IP地址的结构使我们可以在互联网上很方便地进行寻址。IP地址现在由互联网名字和数字分配机构ICANN (Internet Corporation for Assigned Names and Numbers)进行分配。
IP地址的编址方法共经过了三个历史阶段。
- 分类的IP地址 。这是最基本的编址方法,在1981年就通过了相应的标准协议。
- 子网的划分 。这是对最基本的编址方法的改进,其标准RFC 950在1985年通过。
- 构成超网 。这是比较新的无分类编址方法。1993年提出后很快就得到推广应用。
所谓“分类的IP地址”就是将IP地址划分为若干个固定类,每一类地址都由两个固定长度的字段组成,其中第一个字段是网络号 (net-id),它标志主机(或路由器)所连接到的网络。一个网络号在整个互联网范围内必须是唯一的。第二个字段是主机号 (host-id),它标志该主机(或路由器)。一台主机号在它前面的网络号所指明的网络范围内必须是唯一的。由此可见,一个IP地址在整个互联网范围内是唯一的 。
这种两级的IP地址可以记为:
IP地址={网络号,主机号}
IP地址特点
- 每一个IP地址都由网络号和主机号两部分组成。从这个意义上说,IP地址是一种分等级的地址结构 。分两个等级的好处是:第一,IP地址管理机构在分配IP地址时只分配网络号 (第一级),而剩下的主机号(第二级)则由得到该网络号的单位自行分配。这样就方便了IP地址的管理;第二,路由器仅根据目的主机所连接的网络号来转发分组 (而不考虑目的主机号),这样就可以使路由表中的项目数大幅度减少,从而减小了路由表所占的存储空间以及查找路由表的时间 。
- 实际上IP地址是标志一台主机(或路由器)和一条链路的接口。当一台主机同时连接到两个网络上时,该主机就必须同时具有两个相应的IP地址,其网络号必须是不同的。这种主机称为多归属主机 (multihomed host)。由于一个路由器至少应当连接到两个网络,因此一个路由器至少应当有两个不同的IP地址。这好比一个建筑正好处在北京路和上海路的交叉口上,那么这个建筑就可以拥有两个门牌号码。例如,北京路4号和上海路37号。
- 按照互联网的观点,一个网络是指具有相同网络号net-id的主机的集合,因此,用转发器或网桥连接起来的若干个局域网仍为一个网络 ,因为这些局域网都具有同样的网络号。具有不同网络号的局域网必须使用路由器进行互连。
- 在IP地址中,所有分配到网络号的网络(不管是范围很小的局域网,还是可能覆盖很大地理范围的广域网)都是平等 的。所谓平等,是指互联网同等对待每一个IP地址。
- 用网桥(它只在链路层工作)互连的网段仍然是一个局域网,只能有一个网络号。
- 路由器总是具有两个或两个以上的IP地址。即路由器的每一个接口都有一个不同网络号的IP地址。
- 当两个路由器直接相连时(例如通过一条租用线路),在连线两端的接口处,可以分配也可以不分配IP地址。如分配了IP地址,则这一段连线就构成了一种只包含一段线路的特殊“网络”(如图中的N 1 ,N 2 和N 3 )。之所以叫做“网络”是因为它有IP地址。但为了节省IP地址资源,对于这种仅由一段连线构成的特殊“网络”,现在也常常不分配IP地址。通常把这样的特殊网络叫做无编号网络 (unnumbered network)或无名网络 (anonymous network)[COME06]。
IP地址与硬件地址
从层次的角度看,物理地址是数据链路层和物理层使用的地址 ,而IP地址是网络层和以上各层使用的地址,是一种逻辑地址 (称IP地址为逻辑地址是因为IP地址是用软件实现的)。
地址解析协议ARP
在实际应用中,我们经常会遇到这样的问题:已经知道了一个机器(主机或路由器)的IP地址,需要找出其相应的硬件地址。地址解析协议ARP就是用来解决这样的问题的。
ARP协议的用途是为了从网络层使用的IP地址,解析出在数据链路层使用的硬件地址。
还有一个旧的协议叫做逆地址解析协议RARP,它的作用是使只知道自己硬件地址的主机能够通过RARP协议找出其IP地址。现在的DHCP协议已经包含了RARP协议的功能。因此本书不再介绍RARP协议。
ARP协议要点。
我们知道,网络层使用的是IP地址,但在实际网络的链路上传送数据帧时,最终还是必须使用该网络的硬件地址。但IP地址和下面的网络的硬件地址之间由于格式不同而不存在简单的映射关系(例如,IP地址有32位,而局域网的硬件地址是48位)。此外,在一个网络上可能经常会有新的主机加入进来,或撤走一些主机。更换网络适配器也会使主机的硬件地址改变。地址解析协议 ARP解决这个问题的方法是在主机ARP高速缓存中存放一个从IP地址到硬件地址的映射表,并且这个映射表还经常动态更新(新增或超时删除)。
每一台主机都设有一个ARP高速缓存(ARP cache) ,里面有本局域网上 的各主机和路由器的IP地址到硬件地址的映射表,这些都是该主机目前知道的一些地址。那么主机怎样知道这些地址呢?我们可以通过下面的例子来说明。
当主机A要向本局域网 上的某台主机B发送IP数据报时,就先在其ARP高速缓存中查看有无主机B的IP地址。如有,就在ARP高速缓存中查出其对应的硬件地址,再把这个硬件地址写入MAC帧,然后通过局域网把该MAC帧发往此硬件地址。
也有可能查不到主机B的IP地址的项目。这可能是主机B才入网,也可能是主机A刚刚加电,其高速缓存还是空的。在这种情况下,主机A就自动运行ARP,然后按以下步骤找出主机B的硬件地址。
- ARP进程在本局域网上广播发送一个ARP请求分组。ARP请求分组的主要内容是:“我的IP地址是209.0.0.5,硬件地址是00-00-C0-15-AD-18。我想知道IP地址为209.0.0.6的主机的硬件地址。”
- 在本局域网上的所有主机上运行的ARP进程都收到此ARP请求分组。
- 主机B的IP地址与ARP请求分组中要查询的IP地址一致,就收下这个ARP请求分组,并向主机A发送ARP响应分组,同时在这个ARP响应分组中写入自己的硬件地址。由于其余的所有主机的IP地址都与ARP请求分组中要查询的IP地址不一致,因此都不理睬这个ARP请求分组。ARP响应分组的主要内容是:“我的IP地址是209.0.0.6,我的硬件地址是08-00-2B-00-EE-0A。”请注意:虽然ARP请求分组是广播发送的,但ARP响应分组是普通的单播,即从一个源地址发送到一个目的地址。
- 主机A收到主机B的ARP响应分组后,就在其ARP高速缓存中写入主机B的IP地址到硬件地址的映射。 当主机A向B发送数据报时,很可能以后不久主机B还要向A发送数据报,因而主机B也可能要向A发送ARP请求分组。为了减少网络上的通信量,主机A在发送其ARP请求分组时,就把自己的IP地址到硬件地址的映射写入ARP请求分组。当主机B收到A的ARP请求分组时,就把主机A的这一地址映射写入主机B自己的ARP高速缓存中。以后主机B向A发送数据报时就很方便了。
可见ARP高速缓存非常有用。如果不使用ARP高速缓存,那么任何一台主机只要进行一次通信,就必须在网络上用广播方式发送ARP请求分组,这就使网络上的通信量大大增加。ARP把已经得到的地址映射保存在高速缓存中,这样就使得该主机下次再和具有同样目的地址的主机通信时,可以直接从高速缓存中找到所需的硬件地址而不必再用广播方式发送ARP请求分组。
ARP对保存在高速缓存中的每一个映射地址项目都设置生存时间 (例如,10~20分钟)。凡超过生存时间的项目就从高速缓存中删除掉。设置这种地址映射项目的生存时间是很重要的。设想有一种情况。主机A和B通信。A的ARP高速缓存里保存有B的硬件地址。但B的网络适配器突然坏了,B立即更换了一块,因此B的硬件地址就改变了。假定A还要和B继续通信。A在其ARP高速缓存中查找到B原先的硬件地址,并使用该硬件地址向B发送数据帧。但B原先的硬件地址已经失效了,因此A无法找到主机B。但是过了一段不长的生存时间,A的ARP高速缓存中已经删除了B原先的硬件地址,于是A重新广播发送ARP请求分组,又找到了B。
请注意,ARP是解决同一个局域网上 的主机或路由器的IP地址和硬件地址的映射问题。如果所要找的主机和源主机不在同一个局域网上,例如,主机H 1 就无法解析出另一个局域网上主机H 2 的硬件地址(实际上主机H 1 也不需要知道远程主机H 2 的硬件地址)。主机H 1 发送给H 2 的IP数据报首先需要通过与主机H 1 连接在同一个局域网上的路由器R 1 来转发。因此主机H 1 这时需要把路由器R 1 的IP地址IP 3 解析为硬件地址HA 3 ,以便能够把IP数据报传送到路由器R 1 。以后,R 1 从转发表找出了下一跳路由器R 2 ,同时使用ARP解析出R 2 的硬件地址HA 5 。于是IP数据报按照硬件地址HA 5 转发到路由器R 2 。路由器R 2 在转发这个IP数据报时用类似方法解析出目的主机H 2 的硬件地址HA 2 ,使IP数据报最终交付主机H 2 。
从IP地址到硬件地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的 。只要主机或路由器要和本网络上的另一个已知IP地址的主机或路由器进行通信,ARP协议就会自动地把这个IP地址解析为链路层所需要的硬件地址。
IP数据报的格式
IP数据报的格式能够说明IP协议都具有什么功能。在TCP/IP的标准中,各种数据格式常常以32位(即4字节)为单位来描述。
一个IP数据报由首部和数据两部分组成。首部的前一部分是固定长度 ,共20字节,是所有IP数据报必须具有的。在首部的固定部分的后面是一些可选字段 ,其长度是可变的。下面介绍首部各字段的意义。
1.IP数据报首部的固定部分中的各字段
(1)版本 占4位,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。关于以后要使用的IPv6(即版本6的IP协议),我们将在后面的4.6节讨论。
(2)首部长度 占4位,可表示的最大十进制数值是15。请注意,首部长度字段所表示数的单位是32位字(1个32位字长是4字节)。因为IP首部的固定长度是20字节,因此首部长度字段的最小值是5(即二进制表示的首部长度是0101)。而当首部长度为最大值1111时(即十进制数的15),就表明首部长度达到最大值15个32位字长,即60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此IP数据报的数据部分永远在4字节的整数倍时开始,这样在实现IP协议时较为方便。首部长度限制为60字节的缺点是有时可能不够用。但这样做是希望用户尽量减少开销。最常用的首部长度是20字节(即首部长度为0101),这时不使用任何选项。
(3)区分服务 占8位,用来获得更好的服务。这个字段在旧标准中叫做服务类型 ,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务 DS(Differentiated Services)。只有在使用区分服务时,这个字段才起作用(见8.4.4节)。在一般的情况下都不使用这个字段[RFC 2474,3168,3260]。
(4)总长度 总长度指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为2 16 –1=65535字节。然而实际上传送这样长的数据报在现实中是极少遇到的。
我们知道,在IP层下面的每一种数据链路层协议都规定了一个数据帧中的数据字段的最大长度 ,这称为最大传送单元 MTU(Maximum Transfer Unit)。当一个IP数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层所规定的MTU值。例如,最常用的以太网就规定其MTU值是1500字节。若所传送的数据报长度超过数据链路层的MTU值,就必须把过长的数据报进行分片处理。
虽然使用尽可能长的IP数据报会使传输效率得到提高(因为每一个IP数据报中首部长度占数据报总长度的比例就会小些),但数据报短些也有好处。每一个IP数据报越短,路由器转发的速度就越快。为此,IP协议规定,在互联网中所有的主机和路由器,必须能够接受长度不超过576字节的数据报。这是假定上层交下来的数据长度有512字节(合理的长度),加上最长的IP首部60字节,再加上4字节的富余量,就得到576字节。当主机需要发送长度超过576字节的数据报时,应当先了解一下,目的主机能否接受所要发送的数据报长度。否则,就要进行分片。
在进行分片时(见后面的“片偏移”字段),数据报首部中的“总长度”字段是指分片后的每一个分片 的首部长度与该分片的数据长度的总和。
(5)标识 (identification) 占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报片的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。
(6)标志 (flag) 占3位,但目前只有两位有意义。
标志字段中的最低位记为MF (More Fragment)。MF=1即表示后面“还有分片 ”的数据报。MF=0表示这已是若干数据报片中的最后一个。 标志字段中间的一位记为DF (Don’t Fragment),意思是“不能分片 ”。只有当DF=0时才允许分片。 (7)片偏移 占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对
位置。也就是说,相对于用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。