IP协议学习笔记

网际协议IP是TCP/IP 体系中两个最主要的协议之一,也是最重要的互联网标准协议之一。

与IP 协议配套使用的还有三个协议:

  • 地址解析协议ARP (Address Resolution Protocol)
  • 网际控制报文协议ICMP (Internet Control Message Protocol)
  • 网际组管理协议IGMP (Interet Group Management Protocol )

本来还有一个协议叫做逆地址解析协议RARP(Reverse Address Resolution Protocol),是和ARP协议配合使用的。但现在已被淘汰不使用了。

IP协议及其配套协议
在这一层中,ARP 画在最下面,因为IP 经常要使用这个协议。ICMP 和IGMP 画在这一层的上部,因为它们要使用IP协议。这三个协议将在后
面陆续介绍。由于网际协议IP 是用来使互连起来的许多计算机网络能够进行通信的,因此TCP/IP体系中的网络层常常被称为网际层(internet layer) 或IP 层。

虚拟互联网络

从一般的概念来讲,将网络互相连接起来要使用一些中间设备。根据中间设备所在的
层次,可以有以下四种不同的中间设备:

  1. 物理层使用的中间设备叫做转发器(repeater)
  2. 数据链路层使用的中间设备叫做网桥或桥接器(bridge)
  3. 网络层使用的中间设备叫做路由器(router)
  4. 在网络层以上使用的中间设备叫做网关(gateway)。用网关连接两个不兼容的系统要在高层进行协议的转换。

由于参加互连的计算机网络都使用相同的网际协议IP (Internet Protocol),因此可以把互连以后的计算机网络看成一个虚拟互连网络(internet)。所谓虚拟互连网络也就是逻辑互连网络,它的意思就是互连起来的各种物理网络的异构性本来是客观存在的,但是我们利用IP 协议就可以使这些性能各异的网络在网络层上看起来好像是一个统一的网络。这种使用IP 协议的虚拟互连网络可简称为IP网。
使用IP网的好处是: 当IP网上的主机进行通信时,就好像在一个单个网络上通信一样,它们看不见互连的各网络的具体异构细节(如具体的编址方案、路由选择协议,等等)。在这种覆盖全球的IP网的上层使用TCP协议,那么就是现在的互联网(Internet)。
互联网可以有多种异构的网络互连组成。

分类的IP地址

整个的互联网就是一个单一的、抽象的网络。IP 地址就是给互联网上的每一台主机(或路由器) 的每一个接口分配一个在全世界范围内是唯一的32位的标识符。IP地址的结构使我们可以在互联网上很方便地进行寻址。

IP地址及其表示方法

所谓分类的IP地址就是将IP地址划分为若干个固定类,每一类地址都由两个固定长度的字段组成,其中第一个字段是网络号(net-id),它标志主机(或路由器)所连接到的网络。一个网络号在整个互联网范围内必须是唯一的。第二个字段是主机号(host-id),它标志该主机(或路由器)。一台主机号在它前面的网络号所指明的网络范围内必须是唯一的。由此可见,一个IP 地址在整个互联网范围内是唯一的。

IP可以记为:
{<网络号>,<主机号>}

IP地址中的网络号字段和主机号字段

A、B、C类地址都是单播地址(用于一对一通信)

  • A 类、B 类和C 类地址的网络号字段分别为1个、2 个和3 个字节长,而在网络号字段的最前面有1~3 位的类别位,其数值分别规定为0,10 和110
  • A类、B类和C类地址的主机号字段分别为3 个、2个和1个字节长。
  • D 类地址(前4 位是1110) 用于多播(一对多通信)。我们将在4.6 节讨论IP 多播。
  • E类地址(前4位是1111) 保留为以后用。

近年来已经广泛采用无分类的IP地址进行路由选择*

重要特点

  • 每一个IP地址都由网络号和主机号两部分组成。IP 地址是一种分等级的地址结构。分两个等级的好处是:
    * IP 地址管理机构在分配IP 地址时只分配网络号(第一级),而剩下的主机号(第二级) 则由得到该网络号的单位自行分配。这样就方便了IP地址的管理; 
    * 路由器**仅根据目的主机所连接的网络号来转发分组**(而不考虑目的主机号),这样就可以使路由表中的项目数大幅度减少,从而减小了路由表所占的存储空间以及查找路由表的时间。
    
  • 实际上IP地址是标志一台主机(或路由器) 和一条链路的接口。当一台主机同时连接到两个网络上时,其网络号必须是不同的。该主机就必须同时具有两个相应的IP 地址,这种主机称为多归属主机(multihomed host)。由于一个路由器至少应当连接到两个网络,因此一个路由器至少应当有两个不同的IP 地址。
  • 按照互联网的观点,一个网络是指具有相同网络号net-id的主机的集合,因此,用转发器或网桥连接起来的若干个局域网仍为一个网络,因为这些局域网都具有同样的网络号。具有不同网络号的局域网必须使用路由器进行互连。
  • 在IP地址中,所有分配到网络号的网络(不管是范围很小的局域网,还是可能覆盖很大地理范围的广域网) 都是平等的。所谓平等,是指互联网同等对待每一个IP地址。

IP地址与硬件地址

从层次的角度看,物理地址是数据链路层和物理层使用的地址,而IP 地址是网络层和以上各层使用的地址,是一种逻辑地址(称IP 地址为逻辑
地址是因为IP地址是用软件实现的)。

在发送数据时,数据从高层下到低层,然后才到通信链路上传输。使用IP 地址的IP 数据报一旦交给了数据链路层,就被封装成MAC 帧了。MAC 帧在传送时使用的源地址和目的地址都是硬件地址,这两个硬件地址都写在MAC 帧的首部中。
连接在通信链路上的设备(主机或路由器) 在收到MAC 帧时,根据MAC 帧首部中的硬件地址决定收下或丢弃。只有在剥去MAC 帧的首部和尾部后把MAC 层的数据上交给网络层后,网络层才能在IP数据报的首部中找到源IP地址和目的IP地址
总之,IP 地址放在IP 数据报的首部。而硬件地址则放在MAC 帧的首部。在网络层和网络层以上使用的是IP 地址,而数据链路层及以下使用的是硬件地址。当IP数据报放入数据链路层的MAC 帧中以后,整个的IP 数据报就成为MAC 帧的数据,因而在数据链路层看不见数据报的IP地址。

地址解析协议ARP

ARP协议是用来完成一个主机或者路由器的IP地址到其硬件地址的转换的协议。

我们知道,网络层使用的是IP 地址,但在实际网络的链路上传送数据帧时,最终还是必须使用该网络的硬件地址。但IP 地址和下面的网络的硬件地址之间由于格式不同而不存在简单的映射关系(例如,IP 地址有32 位,而局域网的硬件地址是48 位)。此外,在一个网络上可能经常会有新的主机加入进来,或撤走一些主机。更换网络适配器也会使主机的硬件地址改变。
地址解析协议ARP 解决这个问题的方法是在主机ARP 高速缓存中存放一个从IP地址到硬件地址的映射表,并且这个映射表还经常动态更新(新增或超时删除)。
每一台主机都设有一个ARP 高速缓存(ARP cache),里面有本局域网上的各主机和路由器的IP 地址到硬件地址的映射表,这些都是该主机目前知道的一些地址。

当主机A 要向本局域网上的某台主机B 发送IP 数据报时,就先在其ARP 高速缓存中查看有无主机B的IP地址。如有,
就在ARP 高速缓存中查出其对应的硬件地址,再把这个硬件地址写入MAC 帧,然后通过局域网把该MAC 帧发往此硬件地址。
也有可能查不到主机B 的IP地址的项目。在这种情况下,主机A 就自动运行ARP。

ARP运行步骤:

  1. ARP 进程在本局域网上广播发送一个ARP 请求分组
  2. 在本局域网上的所有主机上运行的ARP 进程都收到此ARP 请求分组。
  3. 主机B 的IP地址与ARP 请求分组中要查询的IP 地址一致,就收下这个ARP请求分组,并向主机A 发送ARP 响应分组,同时在这个ARP 响应分组中写入自己的硬件地址。由于其余的所有主机的IP 地址都与ARP 请求分组中要查询的IP 地址不一致,因此都不理睬这个ARP 请求分组。虽然ARP 请求分组是广播发送的,但ARP响应分组是普通的单播,即从一个源地址发送到一个目的地址。
  4. 主机A收到主机B的ARP响应分组后,就在其ARP高速缓存中写入主机B的IP地址到硬件地址的映射。

  5. 当主机A向B发送数据报时,很可能以后不久主机B还要向A发送数据报,因而主机B也可能要向A发送ARP 请求分组。为了减少网络上的通信量,
    主机A在发送其ARP请求分组时,就把自己的IP地址到硬件地址的映射写入ARP请求分组。当主机B收到A的ARP请求分组时,就把主机A 的这一地址映射写入主机B自己的ARP高速缓存中。以后主机B向A 发送数据报时就很方便了。

如果不使用ARP 高速缓存,那么任何一台主机只要进行一次通信,就必须在网络上用广播方式发送ARP 请求分组,这就使网络上的通信量大大增
加。ARP把已经得到的地址映射保存在高速缓存中,这样就使得该主机下次再和具有同样目的地址的主机通信时,可以直接从高速缓存中找到所需的硬件地址而不必再用广播方式发ARP 请求分组。

IP数据报的格式

IP数据报首部的固定部分中的各字段

版本:

占4位,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目
前广泛使用的IP 协议版本号为4 (即IPv4)。

首部长度

占4位,可表示的最大十进制数值是15。请注意,首部长度字段所表示数的单位是32位字(1个32位字长是4 字节)。因为IP首部的固定长度是20字节,因此首部长度字段的最小值是5 (即二进制表示的首部长度是0101)。而当首部长度为最大值1111时(即十进制数的15),就表明首部长度达到最大值15个32 位字长,即60 字节。当IP 分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此IP数据报的数据部分永远在4字节的整数倍时开始,这样在实现IP 协议时较为方便。首部长度限制为60 字节的缺点是有时可能不够用。但这样做是希望用户尽量减少开销。最常用的首部长度是20字节(即首部长度为0101),这时不使用任何选项。

区分服务

占8位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。只有在使用区分服务时,这个字段才起作用。在一般的情况下都不使用这个字段。


总长度

总长度指首部和数据之和的长度,单位为字节。总长度字段为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字节的数据报时,应当先了解一下,目的主机能否接受所要发送的数据报长度。否则,就要进行分片。在进行分片时(见后面的“片偏移”字段),数据报首部中的“总长度”字段是指分片
后的每一个分片的首部长度与该分片的数据长度的总和。

标识(identification)

占16 位。IP 软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报片的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。

标志(flag)

占3位,但目前只有两位有意义:

  • 标志字段中的最低位记为MF (More Fragment)。MF= 1即表示后面“还有分片”
    的数据报。MF=0 表示这已是若千数据报片中的最后一个。
  • 标志字段中间的一位记为DF (Don’t Fragment),意思是“不能分片”。只有当DF=
    0时才允许分片。

片偏移

占13 位。片偏移指出: 较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对于用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。

生存时间

占8位,生存时间字段常用的英文缩写是TTL (Time To Live),表明这是数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在互联网中兜圈子(例如从路由器R转发到R2,再转发到R3,然后又转发到RI),因而白白消耗网络资源。最初的设计是以秒作为TTL值的单位。每经过一个路由器时,就把TTL 减去数据报在路由器所消耗掉的一段时间。若数据报在路由器消耗的时间小于1秒,就把TTL值减1。当TTL 值减为零时,就丢弃这个数据报。
然而随着技术的进步,路由器处理数据报所需的时间不断在缩短,一般都远远小于1
秒,后来就把TTL字段的功能改为“跳数限制”(但名称不变)。路由器在每次转发数据报
之前就把TTL值减1.若TTL 值减小到零,就丢弃这个数据报,不再转发。因此,现在
TTL 的单位不再是秒,而是跳数
。TTL 的意义是指明数据报在互联网中至多可经过多少个
路由器。显然,数据报能在互联网中经过的路由器的最大数值是255。若把TTL 的初始值
设置为1,就表示这个数据报只能在本局域网中传送。因为这个数据报一传送到局域网上的
某个路由器,在被转发之前TTL值就减小到零,因而就会被这个路由器丢弃。

协议

协议字段指出此数据报携带的数据是使用何种协议,以便使目的占8位,主机的IP层知道应将数据部分上交给哪个协议进行处理。
常用协议对应字段:

协议名 ICMP IGMP IP TCP EGP IGP UDP IPv6 ESP OSPF
协议字段值 1 2 4 6 8 9 17 41 50 89

这里的IP表示特殊的IP数据报–IP数据报再封装到IP数据报中。

首部检验和

占16 位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算- 一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量。为了进一步减小计算检验和的工作量,IP 首部的检验和不采用复杂的CRC 检验码而采用下面的简单计算方法:
在发送方,先把IP数据报首部划分为许多16位字的序列,并把检验和字段置零。用反码算术运算把所有16位字相加后,将得到的和的反码写入检验和字段。接收方收到数据报后,将首部的所有16 位字再使用反码算术运算相加一次。将得到的和取反码,即得出接收方检验和的计算结果。若首部未发生任何变化,则此结果必为0,于是就保留这个数据报。否则即认为出差错,并将此数据报丢弃。

源地址

占32位

目的地址

占32位

IP数据报首部可变部分

IP 数据报首部的可变部分就是一个选项字段。选项字段用来支持排错、测量以及安全等措施,内容很丰富。此字段的长度可变,从1个字节到40 个字节不等,取决于所选择的项目。某些选项项目只需要1个字节,它只包括1个字节的选项代码。而有些选项需要多个字节,这些选项一个个拼接起来,中间不需要有分隔符,最后用全0 的填充字段补齐成为4字节的整数倍。
增加首部的可变部分是为了增加IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。实际上这些选项很少被使用。很多路由器都不考虑IP 首部的选项字段,因此新的IP版本IPV6 就把IP数据报的首部长度
做成固定的。

IP层转发分组的流程

在互联网上转发分组时,是从一个路由器转发到下一个路由器,在路由表中,每一条路由最主要的是连个信息:

(目的网络地址,下一跳地址)

于是,我们就根据目的网络地址来确定下一跳路由器,这样做可得出以下的结果:

  • IP 数据报最终一定可以找到目的主机所在目的网络上的路由器(可能要通过多次的间接交付)。
  • 只有到达最后一个路由器时,才试图向目的主机进行直接交付。虽然互联网所有的分组转发都是基于目的主机所在的网络,但在大多数情况下都允许有这样的特例,即对特定的目的主机指明一个路由。这种路由叫做特定主机路由。采用特定主机路由可使网络管理人员更方便地控制网络和测试网络,同时也可在需要考虑某种安全问题时采用这种特定主机路由。在对网络的连接或路由表进行排错时,指明到某一台主机的特殊路由就十分有用。

路由器还可采用默认路由(default route)以减小路由表所占用的空间和搜索路由表所用的时间。这种转发方式在一个网络只有很少的对外连接时是很有用的。实际上,默认路由在主机发送IP数据报时往往更能显示出它的好处。主机在发送每一个IP数据报时都要查找自己的路由表。如果一台主机连接在一个小网络上,而这个网络只用一个路由器和互联网连接,那么在这种情况下使用默认路由是非常合适的。

在IP 数据报的首部中没有地方可以用来指明“下一跳路由器的IP地址”。在IP数据报的首部写上的IP地址是源IP地址和目的IP地址,而没有中间经过的路由器的IP地址。

既然IP数据报中没有下一跳路由器的IP 地址,那么待转发的数据报又怎样能够找到下一跳路由器呢?

当路由器收到一个待转发的数据报,在从路由表得出下一跳路由器的IP 地址后,不是把这个地址填入IP 数据报,而是送交数据链路层的网络接口软件。网络接口软件负责把下跳路由器的IP地址转换成硬件地址(必须使用ARP),并将此硬件地址放在链路层的MAC 帧的首部,然后根据这个硬件地址找到下一跳路由器。由此可见,当发送一连串的数据报时,上述的这种查找路由表、用ARP 得到硬件地址、把硬件地址写入MAC 帧的首部等过程,将不断地重复进行,造成了一定的开销。

那么,能不能在路由表中不使用IP 地址而直接使用硬件地址呢?

不行。我们一定要弄清楚,使用抽象的IP 地址,本来就是为了隐蔽各种底层网络的复杂性而便于分析和研究问
题,这样就不可避免地要付出些代价,例如在选择路由时多了一些开销。但反过来,如果在
路由表中直接使用硬件地址,那就会带来更多的麻烦。

分组转发算法:

  1. 从数据报的首部提取目的主机的IP地址D,得出目的网络地址为N。
  2. N就是与此路由器直接相连的某个网络地址,则进行直接交付,不需要再经过其他的路由器,直接把数据报交付目的主机(这里包括把目的主机地址D 转换为具体的硬件地址,把数据报封装为MAC帧,再发送此帧); 否则就是间接交付,执行(3)。
  3. 若路由表中有目的地址为D的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行(4)。
  4. 若路由表中有到达网络N的路由,则把数据报传送给路由表中所指明的下一跳路由器; 否则,执行(5)。
  5. 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器; 否则,执行(6)。
  6. 报告转发分组出错。