易栈 · 一盏

塞外秋来,衡阳雁去

网络层:IP选路

选路机制描述的是已经存在路由表的情况下,如何使用这个路由表(怎么搜索、匹配路由项)。选路策略描述的是如何生成路由表(根据跳数、往返时间、吞吐率来选择路由,生成路由项)。

一、IP选路机制

IP层的数据有两个来源(1)来自网络层(本机产生的TCP、UDP、ICMP和IGMP数据)(2)来自链路层(从网络接口中接收的数据)。对来自链路层的数据有两种处理方法:如果数据报中的目的IP地址是本机IP地址或者是IP广播地址,把数据报发给本机的传输层;否则,把数据报转发给其他主机。这里要注意IP层可以配置成路由器功能,也可以配置成主机功能。只有配置成路由器的时候,才会转发数据报。

综上,IP层要往外发送的数据有两种类型:由本机产生的被转发的。 

当IP层要往外发数据时,如果当前主机和目的主机直接相连(如点对点链路)或者在同一网络上(如以太网),那么IP数据报就直接送到目的主机上;否则,会把数据报发给路由器,由路由器来转发该数据报。一个IP数据报可能要经过多次转发,才能最终到达目的主机。 无论是哪种情况,都需要搜索路由表,从而确认要把数据报发到哪里。

IP层在内存中有一个路由表,用route命令可以把它列出来。路由表中每一项的意思是“如果你想发消息到Destination,可以发给Gateway”。

Destination  Gateway       Genmask       Flags  Ref   Use  Iface
127.0.0.1    127.0.0.1     255.0.0.0      UH     0     0   lo0
192.168.1.0  192.168.1.107 255.255.255.0  U      0     0   eth0
default      192.168.1.1   0.0.0.0        UG     0     0   eth0

  • Destination:目的IP地址。可以是一个主机地址,也可以是一个网络地址。主机地址很好理解,什么是网络地址呢?前面讲过IP地址被划分为ABCDE五类,其中ABC三类IP地址的结构为“前缀+网络号+主机号”(以下描述将省略前缀),每个IP地址对应的网络地址为“网络号+全0主机号”。这种结构把一组连续的IP划分到同一个网络,优点是在路由表中只需要一项就能指向一个网络,大大缩小路由表规模;缺点是划分的粒度太大,每个网络地址下有多个主机号。所以通常会进一步划分子网,从主机号中分一些比特来作子网号。这时IP地址的结构为“网络号+子网号+主机号”,网络地址为“网络号+子网号+全0主机号”。子网掩码用全1比特标识“网络号+子网号”部分,全0比特标识“主机号”部分,也就是“网络地址=IP地址&子网掩码”。
  • Gateway:网关IP地址。可以是与目的IP地址在同一个物理网络的本机网络接口的IP地址(直接路由),也可以是帮助转发数据报的下一跳路由器的IP地址(间接路由)。
  • Genmask:目的IP地址的子网掩码。通过子网掩码可以判断目的IP地址到底是主机地址还是网络/子网地址(子网号占多少位、主机号是否为全0)。注意每一个路由项都对应一个网络接口。对于一个到直接相连的网络(网关为直接路由)的网络路由项(目的IP地址为网络地址),这个掩码默认使用网络接口的子网掩码
  • Flags:标志。标志U(up)表示该路由可用。有标志G(gateway)表示间接路由,没有则表示直接路由。有标志H(host)表示目的IP地址为主机地址,没有则表示网络地址。
  • Ref:正在使用该路由的活动进程个数。
  • Use:通过该路由发送的分组数。
  • Iface:该路由表项对应的网络接口。

下面依次解释上述路由表中的每条路由:

  1. 第一条是指向环回地址的路由。环回地址无疑和环回接口lo0在同一个物理网络,所以这是个直接路由,网关IP地址是接口lo0的IP地址。
  2. 第二条是指向子网192.168.1.0的路由。该子网和网络接口eth0直接相连,所以这是直接路由,网关IP地址是外出接口eth0的IP地址。该路由项的子网掩码默认使用了网络接口eth0的子网掩码,从子网掩码也可以看出192.168.1.0是网络地址。
  3. 第三条是默认路由,也就是我们常说的默认网关。如果实在找不到与目的IP地址对应的路由项,就会把数据发往默认路由

IP层通过匹配目的IP地址来选择路由。根据路由项的目的IP地址的不同类型,匹配优先级为:主机地址 > 网络地址 > 默认网关

二、IP选路策略

静态选路和动态选路都是生成路由表的方式。静态选路是通过配置文件或者手动配置等方式建立路由表。动态选路是由选路协议根据获取到的网络连接信息自动选择路由,并且相应地更新路由表。

1、静态选路

有三种方式:

  • 在初始化网络接口时,会根据网络接口配置自动生成一个路由项。例如为以太网卡自动生成一个指向子网的直接路由项。
  • 通过route命令增加表项。例如根据物理网络的连接情况,手动添加默认网关或者其它间接路由项。
  • 根据ICMP重定向报文生成路由项。

2、动态选路

路由守护进程负责与相邻路由器交换网络连接信息,找出前往某个信宿的路由。如果前往同一信宿存在多条路由,守护进程会以某种策略选择最佳路由并加入路由表中。一个局域网通常作为一个选路自治系统,同一自治系统的路由器之间的选路协议称为内部网关协议IGP。不同自治系统之间的选路协议称为外部网关协议EGP。常用的IGP协议是选路信息协议RIP开放最短路径优先OSPF协议,这里不详细叙述,参见TCP/IP详解 卷1:第10章 动态选路协议。

本文链接:易栈 - 网络层:IP选路