首页 > 技术文章 > 计算机网络之网络层

ChangAn223 2019-05-11 17:40 原文

计算机网络之网络层

  网络层为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把运输层产生的报文段或数据报封装成分组或包进行传送。

目录

1. 网络层的两种服务

  在计算机网络领域,网络层应该向运输层提供怎样的服务(“面向连接”还是“无连接”)曾引起了长期的争论。

  争论焦点的实质就是:在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统?

  关于网络层提供通信的两种思路:有人认为应当借鉴电话网的成功经验,网络应该提供面向连接的,可靠的数据传输。这样可以有效的提供很好的服务质量;但现互联网的先辈门则主张网络层只向上提供无连接的、灵活的、尽最大努力交付的数据报服务。因为端系统比电话机智能的多,差错检测的功能完全可以交给上层去做。

  • 第一种即是虚电路服务

  当两台计算机进行通信时,先建立连接(在分组交换网中是建立一条虚电路VC),以预留双方通信的一切网络资源。然后双方就沿着已经建立的虚电路传送分组。这样的分组不需要填写完整的目的主机地址,而只需要填写这条虚电路的编号(一个不大的整数),因而减少分组的开销。在通信结束后要释放建立的虚电路。

  虚电路表示这只是一条逻辑上的连接,而并不是真正建立了一条物理连接。所有的分组都沿着这条逻辑连接按照存储转发方式传送,而且每个分组独占这条链路的全部带宽。

虚电路的通信过程分为三步:呼叫建立(call setup)→数据传输→拆除呼叫。

呼叫建立后,会唯一确定一条传输的链路,这条链路会有一个标识,随后每个分组携带的不是目的地址,而是这条链路的标识。每个分组携带虚电路标识(VCID),而不是目的主机地址,虚电路经过的每个网络设备( 如路由器),维护每条经过它的虚电路连接状态。通信结束要拆除这条链路。

PS:电路交换的电话通信是先建立了一条真正的连接。因此分组交换的虚连接和电路交换的连接只是类似,但并不完全一样。

  • 第二种即是数据报服务

  网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。网络在发送分组时不需要先建立连接,每一个分组(也就是IP数据报)独立发送,与其前后分组无关(不进行编号)。网络层不提供服务质量的承诺。也就是说,所传送的分组可能出错,丢失,重复,失序(即不按顺序到达终点),当然也不保证分组交付的期限。

虚电路服务与数据报服务的对比

2. 网际协议IP

网际协议IP是TCP/IP体系中两个最主要的协议之一,也是最重要的互联网标准协议之一。与IP协议配套使用的还有三个协议:

  • 1.地址解析协议ARP
  • 2.网际控制报文协议ICMP
  • 3.网际组管理协议IGMP

还有一个逆地址解析协议RARP,现在已经淘汰不用了。因为现在的DHCP协议已经包含了RARP协议的功能。

IP协议经常使用ARP协议,而ICMP和IGMP协议要使用IP协议。因此在网络层图中,ICMP和IGMP位于IP上,ARP位于IP下。

2.1 虚拟互联网络

从一般的概念来讲,将网络互相连接起来需要用到一些中间设备,根据中间设备所在层次可分为四种:

  • 物理层使用的中间设备叫做转发器
  • 数据链路层使用的中间设备叫做网桥或桥接器
  • 网络层使用的中间设备叫做路由器
  • 在网络层上使用的中间设备叫做网关。用网关连接两个不兼容的系统需要在高层进行协议转换

转发器或者网桥仅仅是把一个网络扩大了,从网络层的角度看则仍然是一个网络,一般不称之为网络互连。我们讨论网络互联,都是指路由器进行网络互连和路由选择。

虚拟互联网也是指逻辑互联网,它的意思是互连起来的各种物理网络的异构性是客观存在的,但我们利用IP协议就可以使这些性能各异的网络在网络层上看起来好像就是一个统一的网络。

使用IP协议的虚拟互联网可简称为IP网,如果这个网络覆盖全球,且在上层使用TCP协议,即是现在的互联网

2.2 分类的IP地址

2.2.1 IP地址的编址方法共经历了三个历史阶段:

  • 分类的IP地址
  • 子网的划分
  • 构成超网

这里的IP地址都是指IPv4中的地址,即32位的IP地址。

2.2.2 分类的IP地址**

  是指将IP地址划分为若干个固定类,每一类地址都由两个固定长度的字段组成,其中第一个是网络号,它标志主机或路由器所连接到的某个网络,一个网络号必须在整个网络范围都是是唯一的。第二个是主机号,它标志某台主机或路由器本身。一个主机号在它前面的网络号所指明的网络范围内必须是唯一的。

IPV4简单粗暴地把IP地址分为五类。分类方法如下图所示:

也就是说,分为以下几类:

  • A类: 0.0.0.0-127.255.255,可指派网络号126个(27-2个),网络号全0和网络号127不可用。可指派主机号224-2个,主机号全0和全1这两个不可用。

  • B类: 128.0.0.0-191.255.255.255,可指派网络号214-1个,128.0.0.0不可指派。可指派主机号216-2,因为主机号全0和全1不可用。

  • C类: 192.0.0.0-223.255.255.255,可指派网络号221-1个,192.0.0.0不可用,可指派主机号28-2,因为主机号全0和全1不可用。

  • D类: 224.0.0.0-239.255.255.255,是多播地址,用于多播(一对多通信)

  • E类: 240.0.0.0-255.255.255.255,保留为以后所用。

这其中除了段0和段127之外,还有一些IP地址因为有其他的用途,是不可以用作普通IP的。还有一部分被用作私有IP地址。

(1)环回地址:127.x.x.x

如127.0.0.1 等效于localhost或本机IP。 一般用于测试使用。
例如:ping 127.0.0.1来测试本机TCP/IP是否正常。http://127.0.0.1:8080 等效 http://localhost:8080

(2)私有IP

  与私有IP地址对应的是公有地址(Public address),由Inter NIC(Internet Network Information Center 因特网信息中心)负责。这些IP地址分配给注册并向Inter NIC提出申请的组织机构。通过它直接访问因特网。   

  私有IP的出现是为了解决公有IP地址不够用的情况。从A、B、C三类IP地址中拿出一部分作为私有IP地址,这些IP地址不能被路由到Internet骨干网上,Internet路由器也将丢弃该私有地址。如果私有IP地址想要连至Internet,需要将私有地址转换为公有地址。这个转换过程称为网络地址转换(Network Address Translation,NAT),通常使用路由器来执行NAT转换。

范围如下:
    A类: 10.0.0.0~10.255.255.255
    B类:172.16.0.0~172.31.255.255
    C类:192.168.0.0~192.168.255.255

2.3 IP地址与硬件地址

从层次的角度看:

  • 硬件地址(或物理地址、MAC地址)是数据链路层和物理层使用的地址。
  • IP 地址是网络层和以上各层使用的地址,是一种逻辑地址(称 IP 地址是逻辑地址是因为 IP 地址是用软件实现的)。

  在发送数据时,数据从高层下到低层,然后才到通信链路上传输。使用IP地址的IP数据报一旦交给了数据链路层,就被封装成了MAC帧了。MAC帧在传送时使用的源地址和目的地址都是硬件地址,这两个硬件地址都写在MAC帧首部中。

  通信链路上的设备(主机或路由)收到MAC帧后,根据MAC帧首部中的MAC地址决定收下还是丢弃。在剥去MAC帧的首部和尾部后,将剩下的信息部分(也就是IP数据报)上交给网络层,网络层才能在IP数据报的首部中找到缘IP地址和目的IP地址。

  所以,IP地址在IP数据报中,硬件地址在MAC帧中,整个IP数据报是MAC帧的数据,不能直接从帧中读取到IP地址,在数据链路层看不见数据报的IP地址。

  • 在IP层抽象的互联网上只能看到IP数据报
  • 路由器只根据目的地的IP地址的网络号进行路由选择
  • 在局域网的链路层只能看见MAC帧

  IP数据报被封装在MAC帧中,MAC帧在不同的网络上传送时,经过路由转发时,MAC帧需要去掉当前首部和尾部重新换首部和尾部,进而首部中的源地址和目的地址也就发生了变化,如上图。

  • IP 层抽象的互联网屏蔽了下层很复杂的细节。在抽象的网络层上讨论问题,就能够使用统一的、抽象的 IP 地址研究主机和主机或主机和路由器之间的通信 。

2.4 地址解析协议ARP

通信时使用了两个地址:

  • IP 地址(网络层地址)
  • MAC 地址(数据链路层地址)

在实际应用中,有这样一个问题:已经知道了一个机器(主机或路由器)的IP地址,如何找出其相应的硬件地址?
答案是地址解析协议ARP

2.4.1 ARP 的两个要点:

  • 网络层使用的IP地址,但在实际网络的链路上传送数据帧时,必须使用硬件地址。
  • 每一个主机都设有一个 ARP 高速缓存 (ARP cache),里面有所在的局域网上的各主机和路由器的 IP 地址到硬件地址的映射表。这个映射表经常动态更新(新增或超时删除)

ARP对保存在高速缓存中的每一个映射地址项目都设置生存时间(如10~20分钟),凡是超过生存时间的映射项目就会从高速缓存中删除掉。

2.4.2 ARP工作步骤:

  举例:

注意:

  • 虽然ARP请求分组是广播发送的,但是ARP响应分组是普通的单播,即从一个源地址发送到一个目的地址。如上图所示。
  • ARP 用于解决同一个局域网上的主机或路由器的 IP 地址和硬件地址的映射问题。
  • 如果所要找的目的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络(可能是直接交付给目的主机,也可能是间接交付给下一个路由器)。剩下的工作就由下一个网络来做。这里就会有对MAC帧的首部和尾部重新封装。
  • 从 IP 地址到硬件地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的。
  • 只要主机或路由器要和本网络上的另一个已知 IP 地址的主机或路由器进行通信,ARP 协议就会自动地将该 IP 地址解析为链路层所需要的硬件地址。

2.4.3 四种典型情况:

  • 发送方是主机,要把IP数据报发送到本网络上的另一个主机,这时用ARP找到目的主机的硬件地址
  • 发送方是主机,要IP数据报发送到其他网络的主机,这时ARP找到本网络上某个路由器硬件地址,剩下工作由这个路由器完成
  • 发送方是路由器,要把 P数据报转发到本网络上的一个主机,这时用ARP找到目的主机的硬件地址
  • 发送方是路由器,要把IP数据报转发到另一个网络上的一个主机,这时用ARP找到本网络上的一个路由器的硬件地址,剩下的工作由这个路由器来完成

2.5 IP数据报格式

一个 IP 数据报由首部和数据两部分组成。

最高位在左边,记为0 bit;最低位在右边,记为31 bit

首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的。
在首部的固定部分的后面是一些可选字段,其长度是可变的。

2.5.1 首部固定长度字段解释:

  • 版本:
      占 4 位,指 IP 协议的版本目前的 IP 协议版本号为 4 (即 IPv4)

  • 首部长度:
      占4位,可表示的最大数值是15个单位(一个单位为 4 字节)因此IP 的首部长度的最大值是 60 字节

  • 区分服务:
      占8位,用来获得更好的服务,在旧标准中叫做服务类型,但实际上一直未被使用过,1998 年这个字段改名为区分服务,只有在使用区分服务(DiffServ)时,这个字段才起作用,一般的情况下都不使用这个字段

  • 总长度:
      占16位,指首部和数据之和的长度,单位为字节,因此数据报的最大长度为 65535 字节(2^16-1),总长度必须不超过最大传送单元 MTU。在IP层下面每一种数据链路层协议都规定了一个数据帧中的数据字段的最大长度,这称为最大传送单元 MTU

  • 标识:
      占16位,它是一个计数器,用来产生数据报的标识。这个标识并不是序号,是在数据报大小超过网络的MTU而进行分片时,这个字段值被复制到分片后的每一个数据报的标识字段中,使分片后的各数据报最后能正确的重装为原来的数据报。

  • 标志(flag):
      占3位,目前只有前两位有意义
       - MF:标志字段的最低位(第1位)是 MF (More Fragment)
        MF=1 表示后面“还有分片”,MF=0 表示最后一个分片
       - DF:标志字段中间的一位(第2位)是 DF (Don't Fragment)
        只有当 DF=0 时才允许分片

  • 片偏移:
      占12位,指较长的分组在分片后某片在原分组中的相对位置,片偏移以 8 个字节为偏移单位

  • 生存时间:
      占8位,记为TTL (Time To Live) 数据报在网络中可通过的路由器数的最大值,TTL 字段最初是用秒做单位,现在已改成跳数做单位,路由器在每次转发数据报之前就把TTL值减1,被转发之前减到0则丢弃。推荐的初始值由分配数字 RFC 指定,当前值为 64,发送 ICMP 回显应答时经常把 TTL 设为最大值 255

  • 协议:
      占8位,指出此数据报携带的数据使用何种协议以便目的主机的IP层将数据部分上交给哪个处理过程,1表示为 ICMP 协议, 2表示为 IGMP 协议, 6表示为 TCP 协议, 17表示为 UDP 协议

  • 首部检验和:
      占16位,只检验数据报的首部不检验数据部分,因为数据报每经过一个路由器一些字段如生存时间、标志、片偏移都可能发生变化。不检验数据部分为了减少计算的工作量,这里不采用 CRC 检验码而采用简单的计算方法进一步减少了计算的工作量。

  • 源地址和目的地址:
      都各占 4 字节,分别记录源地址和目的地址

2.5.2 首部可变部分:

  • IP 首部的可变部分就是一个选项字段,用来支持排错、测量以及安全等措施,内容很丰富。
  • 选项字段的长度可变,从 1 个字节到 40 个字节不等,取决于所选择的项目。但最后必须是4字节的整数倍(不够用全0的字段填充)。
  • 增加首部的可变部分是为了增加 IP 数据报的功能,但这同时也使得 IP 数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。

2.6 IP层转发分组流程

  • (1)从数据报的首部提取目的主机的 IP 地址 D, 根据D得出目的网络地址为 N。
  • (2)若网络 N 与此路由器直接相连,则把数据报直接交付目的主机 D;否则是间接交付,执行 (3)。
  • (3)若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行 (4)。
  • (4)若路由表中有到达网络 N 的路由,则把数据报传送给路由表指明的下一跳路由器;否则,执行 (5)。
  • (5)若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行 (6)。
  • (6)报告转发分组出错。
  • 当路由器收到待转发的数据报,不是将下一跳路由器的 IP 地址填入 IP 数据报,而是送交数据链路层的网络接口软件。
  • 网络接口软件使用 ARP 负责将下一跳路由器的 IP 地址转换成硬件地址,并将此硬件地址放在链路层的 MAC 帧的首部,然后根据这个硬件地址找到下一跳路由器。

3 划分子网与构造超网

3.1 划分子网

随着互联网的发展,早期设计的IP划分方法逐渐显得“愚笨”,愈加不合理:

  (1) IP 地址空间的利用率有时很低。
  (2) 给每一个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏。
  (3) 两级的 IP 地址不够灵活。

解决办法:划分子网(subnetting)

  在 IP 地址中又增加了一个“子网号字段”,使两级的 IP 地址变成为三级的 IP 地址。

3.1.1 划分子网的基本思想

  (1) 一个拥有许多物理网络的单位,可将所属的物理网络划分为若干个子网。划分子网纯属一个单位内部的事情。本单位以外的网络看不见这个网络是有多少子网组成,单位对外仍然表现为没有划分子网的一个网络。
  (2) 划分子网的方法是从主机号借用若干个位作为子网号 (subnet-id),而主机号 (host-id) 也就相应减少了同样的位数。这样,原本的两级IP地址就变为了三级IP地址:网络号+子网号+主机号
  (3) 凡是从其他网络发送给本单位某个主机的 IP 数据报,仍然是根据 IP 数据报的目的网络号 (net-id),先找到连接在本单位网络上的路由器。然后此路由器在收到 IP 数据报后,再按目的网络号 (net-id) 和子网号 (subnet-id) 找到目的子网。最后把 IP 数据报直接交付目的主机。

3.1.2 寻找子网:子网掩码

  划分子网后,如何把一个数据报转发到它目的地址 (如145.13.10) 对应的子网 (145.13.0) 呢?首先从一个 IP 数据报的首部并无法判断源主机或目的主机所连接的网络是否进行了子网划分。因此我们必须另想办法,这个办法就是子网掩码

  使用子网掩码 (subnet mask) 可以找出 IP 地址中的子网部分。在这里介绍的子网掩码叫做定长子网掩码,下面 3.3节 会介绍基于变长子网掩码研究出的无分类编址方法:无分类域间选择CIDR

规则:
  (1) 子网掩码长度 = 32 位
  (2) 子网掩码左边部分的一连串 1,对应于网络号和子网号
  (3)子网掩码右边部分的一连串 0,对应于主机号

根据目的IP地址和子网掩码计算子网:

  子网掩码是一个网络或一个子网的重要属性。路由器在和相邻路由器交换路由信息时,必须把自己所在网络(或子网)的子网掩码告诉相邻路由器。路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码。若一个路由器连接在两个子网上,就拥有两个网络地址和两个子网掩码。

  现在的互联网标准规定:所有的网络都必须使用子网掩码,同时在路由器的路由表中也必须有子网掩码这一栏。如果一个网络不划分子网,那么该网络的子网掩码就使用默认子网掩码。默认子网掩码就是一个IP中的网络号字段 (net-id) 全为1,其余全0。如下图所示:

3.2 使用子网时的分组转发

  在不划分子网的两级 IP 地址下,从 IP 地址得出网络地址是个很简单的事。但在划分子网的情况下,从 IP 地址却不能唯一地得出网络地址来,这是因为网络地址取决于那个网络所采用的子网掩码,但数据报的首部并没有提供子网掩码的信息。因此分组转发的算法也必须做相应的改动。

  使用子网划分后,路由表必须包含这三项内容:目的网络地址子网掩码下一跳地址

在划分子网情况下路由器转发分组的算法:

  • (1)从收到的分组的首部提取目的 IP 地址 D。
  • (2)先用各网络的子网掩码和 D 逐位相“与”,看是否和相应的网络地址匹配。若匹配,则将分组直接交付。否则就是间接交付,执行(3)。
  • (3)若路由表中有目的地址为 D 的特定主机路由,则将分组传送给指明的下一跳路由器;否则,执行 (4)。
  • (4)对路由表中的每一行,将子网掩码和 D 逐位相“与”。若结果与该行的目的网络地址匹配,则将分组传送给该行指明的下一跳路由器;否则,执行 (5)。
  • (5)若路由表中有一个默认路由,则将分组传送给路由表中所指明的默认路由器;否则,执行 (6)。
  • (6)报告转发分组出错。

3.3 无分类编址方法CIDR(与构造超网)

无分类编址方法,它的正式名字是无分类域间路由选择 CIDR (Classless Inter-Domain Routing)。 是基于变长子网掩码进一步研究出来的。

3.3.1 CIDR主要特点:

(1) CIDR消除了传统的A、B、C类地址以及传统的划分子网概念,能更加有效的分配IPv4的地址空间。
(2) CIDR把32位IP地址划分为前后两个部分。前部分是网络前缀(简称前缀),代替分类地址中的网络号和子网号,后一部分来指明主机。这使得IP地址从三级编址(使用子网掩码)又回到了两级编址。但这里的前缀不像是A、B、C类地址那样固定长度,而是不固定的长度。格式如下:

(3) CIDR把网络前缀都相同的连续的IP地址组成一个“CIDR地址块”。

3.3.2 CIDR的记法:

  CIDR 使用“斜线记法”(slash notation),它又称为 CIDR 记法,即在 IP 地址面加上一个斜线“/”,然后写上网络前缀所占的位数(这个数值对应于三级编址中子网掩码中 1 的个数)。例如: 220.78.168.0/24

例如: 128.14.32.0/20 表示的地址块共有 212 个地址(因为斜线后面的 20 是网络前缀的位数,所以这个地址的主机号是 12 位)。
这个地址块的起始地址是 128.14.32.0。在不需要指出地址块的起始地址时,也可将这样的地址块简称为“/20 地址块”。
128.14.32.0/20 地址块的最小地址:128.14.32.0
128.14.32.0/20 地址块的最大地址:128.14.47.255
全 0 和全 1 的主机号地址一般不使用

3.3.3 CIDR的地址掩码:

  为方便进行路由选择,CIDR使用32位的地址掩码。地址掩码由一串1和一串0组成,而1的个数就是网络前缀的长度。在斜线记法中,斜线后面的数字就是地址掩码中1的个数。

虽然CIDR不使用子网了,但是由于目前还是有一些网络在使用子网划分和子网掩码,因此CIDR使用的地址掩码也可以继续称为子网掩码。这里的“CIDR不使用子网”是指CIDR并没有在32位地址中明确的指出若干位作为子网字段。但是分配到一个CIDR的地址块的单位,仍可以在本单位内根据需要划分出一些子网。这些子网也都只有一个网络前缀和主机号字段,但子网的网络前缀会比整个单位的网络前缀要长一点。

3.3.4 构造超网

  由于一个CIDR地址块中有很多地址,所以在路由表中就利用CIDR地址块来查找目的网络。把这种地址的聚合常称为路由聚合,它使得路由表中的一个项目可以表示原来传统分类地址的很多个路由。路由聚合也成为构造超网。路由聚合有利于减少路由器之间的路由选择信息的交换,从而提高了整个互联网的性能。

如下图所示,前缀长度不超过 23 位的 CIDR 地址块都包含了多个 C 类地址。这些 C 类地址合起来就构成了超网。

CIDR 的一个好处是:可以更加有效地分配 IPv4 的地址空间,可根据客户的需要分配适当大小的 CIDR 地址块。

3.3.5 路由查找:最长前缀匹配

  在使用CIDR时,每个路由中路由表的项目就由“网络前缀”和“下一跳地址”组成。但是在查找路由表时可能回得到多个匹配结果,这时如何选择一条合适的路由呢?答案是应当从匹配结果中选择具有最长网络前缀的路由。这叫做最长前缀匹配(最长匹配、最佳匹配)

3.3.6 使用二叉线索查找路由表

当路由表的项目数很大时,怎样设法减小路由表的查找时间就成为一个非常重要的问题。

为了进行更加有效的查找,通常是将无分类编址的路由表存放在一种层次的数据结构中,然后自上而下地按层次进行查找。这里最常用的就是二叉线索 (binary trie)。

IP 地址中从左到右的比特值决定了从根结点逐层向下层延伸的路径,而二叉线索中的各个路径就代表路由表中存放的各个地址。

(为了提高二叉线索的查找速度,又广泛使用了各种压缩技术。)

4 网际控制报文协议ICMP

  为了更加有效的转发IP数据报和提高交付成功的机会,在网络层使用了网际控制报文协议ICMP。ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告。

  ICMP报文作为IP层数据报的的数据,加上IP数据报的首部,组成IP数据报发送出去。虽然ICMP报文是装在IP数据报中作为其中的数据部分,但ICMP并不是高层协议,而只是IP层的协议。

  ICMP报文总的来说可以分为两种报文,分别是差错报告报文、询问报文。

4.1 ICMP报文格式

  • 类型: 占一字节,标识ICMP报文的类型。这里的内省是指差错报告报文或询问报文两大类下的子类型报文。
  • 代码: 占一字节,是为了进一步区分某种类型中的几种不同情况。
  • 检验和: 检验整个ICMP报文是否出现差错。计算方法和IP首部检验和计算方法一样。

紧接着的四个字节的内容与ICMP报文的类型有关。可能全0,也可能是其他内容。

例如:

4.2 ICMP报文种类

4.2.1 几种常见ICMP报文类型:(没有代码字段及说明)

  • 终点不可达: 当路由器或者主机不能交付数据报时就向源点发送终点不可达报文。具体又有网络不可达,端口不可达等,详见下图。
  • 时间超过:当路由器收到生存时间为0的数据报时,除丢弃该数据报外还要向源点发送时间超过报文。
  • 参数问题: 当路由器或者目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。
  • 改变路由(重定向): 路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)
  • 源点抑制: 数据包集中到达某一路由器后,数据包因为来不及被处理,有可能被丢弃的情况。这时候,向送信方发送的是ICMP 源点抑制报文,用来使送行方减慢发送速度。

两种常见ICMP询问报文:

  (1) 回送请求和回答。ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问是用来测试目的站是否可达以及了解有关状态。

  (2) 时间戳请求和回答。ICMP时间戳请求报文是由某台主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。时间戳请求与回答可用于时钟同步和时间测量。

常见的一些更加具体的报文类型:

4.2.2 不应发送ICMP差错报告报文的几种情况

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

4.3 ICMP应用举例

4.3.1 分组网间探测 ping

  ping 是用来测试两台主机之间的连通性。ping 使用了ICMP回送请求与回送回答报文。ping 是应用层直接使用网络层协议(ICMP)的一个例子。他没有通过运输层的UDP或TCP。稍微了解电脑的都知道如何使用,这里不再说明。

4.3.2 路径跟踪 tracerout

  tracerout 是UNIX系统中的名字,Windows中这个命令是 tracert 。用来跟踪一个分组从源点到终点的路径。它利用 IP 数据报中的 TTL 字段和 ICMP 时间超过差错报告报文实现对从源点到终点的路径的跟踪。命令格式和 ping 一样。

5 互联网的路由选择协议

5.1 基本概念

  路由选择的核心就是路由算法,即需要何种算法来获得路由表中的各项目。

5.1.1 理想的路由算法

  • (1) 算法必须是正确和完整的。“正确”是指沿着路由表所指的路由,分组最终一定能够到达目的网络和目的主机。
  • (2) 算法在计算上应该简单。
  • (3) 算法应能适应通信量和网络拓扑的变化,即要有自适应性。
  • (4) 算法应具有稳定性。
  • (5) 算法应该是公平的。
  • (6) 算法应该是最佳的。这里“最佳”只能是相对于某一种特定要求下得出的较为合理的选择而已。

倘若从路由算法的自适应性考虑则分两大类:

静态路由选择策略——即非自适应路由选择,其特点是简单和开销较小,但不能及时适应网络状态的变化。
动态路由选择策略——即自适应路由选择,其特点是能较好地适应网络状态的变化,但实现起来较为复杂,开销也比较大。

5.1.2 分层次的路由选择协议

互联网采用分层次的路由选择协议。原因有二:

(1) 互联网的规模非常大。如果让所有的路由器知道所有的网络应怎样到达,则这种路由表将非常大,处理起来也太花时间。而所有这些路由器之间交换路由信息所需的带宽就会使互联网的通信链路饱和。
(2) 许多单位不愿意外界了解自己单位网络的布局细节和本部门所采用的路由选择协议(这属于本部门内部的事情),但同时还希望连接到互联网上。

自治系统 AS (Autonomous System) :把整个互联网划分为许多较小的自治系统,一般记为AS。自治系统 AS 是在单一的技术管理下的一组路由器,而这些路由器使用一种 AS 内部的路由选择协议和共同的度量。AS之间使用另一种路由选择协议实现AS之间的路由选择。尽管一个 AS 使用了多种内部路由选择协议和度量,但重要的是一个 AS 对其他 AS 表现出的是一个单一的和一致的路由选择策略。

这样,互联网就把路由选择协议划分为两大类,即:

  • 内部网关协议IGP (Interior Gateway Protocol) :即在一个自治系统内部使用的路由选择协议,这个与互联网中其他AS用什么路由选择协议无关。目前这类选择协议使用的最多,如 RIP 和 OSPF 协议。
  • 外部网关协议EGP (External Gateway Protocol) :若源站和目的站处在不同的自治系统中,当数据报传到一个自治系统的边界时,就需要使用一种协议将路由选择信息传递到另一个自治系统中。这样的协议就是外部网关协议 EGP。目前使用最多的外部网关协议就是BGP的版本4(BGP-4)。

自治系统之间的路由选择也叫做域间路由选择 (interdomain routing),在自治系统内部的路由选择叫做域内路由选择 (intradomain routing) 。

5.2 路由信息协议RIP

  路由信息协议RIP是IGP中最先得到广泛使用的协议,但现在很少被使用。RIP是一种分布式的基于距离向量的路由选择协议。最大优点是简单。

RIP要求网络中每一个路由器都要维护从它自己到其他每一个目的网络的距离记录(因此这是一组距离,即“距离向量”)。RIP中距离定义如下:

  (1) 从一个路由器到直接连接的网络的距离定义为 1。从一个路由器到非直接连接的网络的距离定义为所经过的路由器数加 1。RIP 协议中的“距离”也称为“跳数”(hop count),因为每经过一个路由器,跳数就加 1。
  (2) 这里的“距离”实际上指的是“最短距离”。RIP 认为一个好的路由就是它通过的路由器的数目少,即“距离短”。
  (3) RIP 允许一条路径最多只能包含 15 个路由器。“距离”的最大值为 16 时即相当于不可达。可见 RIP 只适用于小型互联网。
  (4) RIP 不能在两个网络之间同时使用多条路由。RIP 选择一个具有最少路由器的路由(即最短路由),哪怕还存在另一条高速(低时延)但路由器较多的路由。

5.2.1 RIP 协议的三个特点

  • (1) 仅和相邻的路由器交换信息。
  • (2) 路由器交换的信息是当前本路由器所知道的全部信息,即自己的路由表。
  • (3) 按固定的时间间隔交换路由信息,例如,每隔 30 秒。当网络拓扑发生变化时,路由器也及时向相邻路由器通告拓扑变化后的路由信息。

5.2.2 路由表的建立

  路由器在刚刚开始工作时,只知道到直接连接的网络的距离(此距离定义为 1)。它的路由表是空的。以后,每一个路由器也只和数目非常有限的相邻路由器交换并更新路由信息。经过若干次更新后,所有的路由器最终都会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器的地址。

  RIP 协议的收敛 (convergence) 过程较快。“收敛”就是在自治系统中所有的结点都得到正确的路由选择信息的过程。

5.2.3 距离向量算法

  路由表中最主要的信息就是:到某个网络的最短距离,以及经过下一跳的地址。路由表的更新的原则是找出每个目的网络的最短距离。这种更新算法也叫距离向量算法

步骤:

RIP 协议让互联网中的所有路由器都和自己的相邻路由器不断交换路由信息,并不断更新其路由表,使得从每一个路由器到每一个目的网络的路由都是最短的(即跳数最少)。
虽然所有的路由器最终都拥有了整个自治系统的全局路由信息,但由于每一个路由器的位置不同,它们的路由表当然也应当是不同的。

例如:

  已知路由器 R6 有表 4-9(a) 所示的路由表。现在收到相邻路由器 R4 发来的路由更新信息,如表 4-9(b) 所示。试更新路由器 R6 的路由表。

5.2.4 RIP报文格式

  RIP使用运输层数据报UDP进行传送(端口520)。RIP 报文由首部和路由部分组成。现在使用的RIP版本是RIP2,支持变长子网掩码、CIDR,还 具有简单的鉴别功能。下图为RIP2的报文格式,首部与RIP1相同,路由部分不一样。

(1) 首部信息:

  • 命令: 指出报文的意义。如:1表示请求路由信息,2表示对请求路由信息的响应或未被请求而发出的路由更新报文。
  • 版本: RIP的版本。

必为0 是为了4字节的对齐而填充的。

(2) 路由信息:
  RIP2 报文中的路由部分由若干个路由信息组成。每个路由信息需要用 20 个字节。

地址族标识符(又称为地址类别)字段用来标志所使用的地址协议。
路由标记填入自治系统的号码,这是考虑使 RIP 有可能收到本自治系统以外的路由选择信息。
再后面指出某个网络地址、该网络的子网掩码、下一跳路由器地址以及到此网络的距离。

一个 RIP 报文最多可包括 25 个路由,因而 RIP 报文的最大长度是 4+20 x25=504 字节。如超过,必须再用一个 RIP 报文来传送。

RIP 存在的一个问题:当网络出现故障时,要经过比较长的时间 (例如数分钟) 才能将此信息传送到所有的路由器。

5.3 开放最短路径优先OSPF

5.4 边界网关协议BGP

5.5 路由器构成

6 IPv6

6.1 IPv6的基本首部

6.2 IPv6的地址

6.3 IPv4向IPv6的过渡

6.4 ICMPv6

7 IP多播

7.1 基本概念

7.2 局域网上的硬件多播

7.3 网际管理协议IGMP和多播路由选择协议

8 VPN与NAT

8.1 虚拟专用网VPN

8.2 网络地址转换NAT

2019.5.16 待更新........

推荐阅读