IP选路

  • 时间:
  • 浏览:
  • 来源:互联网

每一秒,网络层到底在发生什么?

学习资源来自《TCP/IP详解,卷1:协议》

一个数据包从底层进入网络层,获得了一个IP身份。此时,数据包才真正的获得了网络通行的权利。那网络层是如何指导和规范一个数据包的行为的呢?

这就是IP选路关心的事情。

路由表

在整个网络层,所有的行为基本上都是依据路由表来进行的。路由表就像是网络层的一套“局部地图”,每一个数据包在进行按步转发的时候都需要参考所在主机的“地图”以找到下一步行动的方向。

“局部”的意思是这个地图往往不包括全网信息;因为全网节点太多了,可能的路径选择就更多了,每一个独立的个体(比如路由器)并不能也不需要存储海量的地图信息。就像百度地图一样,我们往往只需要加载所在城市的地图基本就够用了。

但是,从另一方面来看,网络层确实不如百度地图那么高效,目前并不能提供一个拥有全局视野的“中枢系统”来快速告知每个节点更大范围的全局信息。网络层中每个转发设备通过路由表建立的信息还是比较有限的,或者更具体的说法是骨干网以下路由器对网络感知能力非常有限。

小知识 >>> 顶层选路域
网络中有一些这样的顶层域,它们维护大多数的网站信息,而不使用默认路由。在1993年Ford等人的论文中指出当时有5个顶层选路域:NSFNET主干网、商业互联网交换(CIX)、NASA科学互联网、SpringLink以及欧洲IP主干网(EBONE)。

“我国1994年中国科学技术网CSTNET首次实现和Internet直接连接,同时建立了我国最高域名服务器,标志着我国正式接入Internet。接着,相继又建立了中国教育科研网(Cerent)计算机互联网(ChinaNet)和中国金桥网(Genet),从此中国用户日益熟悉并使用Internet。”

1.查看路由表

比如,查看一下我们本机所保存的路由表:

>netstat  -rn
内核 IP 路由表
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.137.1   0.0.0.0         UG        0 0          0 wl2s0
17.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 docker0
172.16.42.0     0.0.0.0         255.255.255.0   U         0 0          0 vmnet8
172.16.148.0    0.0.0.0         255.255.255.0   U         0 0          0 vmnet1
172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 docker0
192.168.137.0   0.0.0.0         255.255.255.0   U         0 0          0 wl2s0

每条表项就是一个“指示箭头”,比如第一条

Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.137.1   0.0.0.0         UG        0 0          0 wl2s0

表示不匹配其他网络号的地址,全部转发到网关(路由器)192.168.137.1;这是因为我当前处于一个局域网状态下,所有连接外网的行为都需要由网关节点进行转发。

172.16.42.0     0.0.0.0         255.255.255.0   U         0 0          0 vmnet8

以第三条为例,当前信息是指访问172.16.42.0/24网络的信息全部转发到0.0.0.0(本机网卡)。接口vmnet8其实是我VM虚拟机的虚拟网卡,通过这样的路由机制就实现了虚拟机可以上网的目标。

小知识:
Flags有五种类型

  • U:路由可用
  • G:该路由到是一个网关(路由器)。该标志对于区分直接路由和间接路由非常重要;通向目标主机时,包含G标志的往往表示下一跳是一个间接路由。
  • H:该路由到一个主机;如果没有该标志,正如本文,默认是传递到一个网络。
  • D:该路由是由重定向报文产生。
  • M:该路由被重定向报文修改。

2.理解路由表

选路其实就是数据包理解当前路由表信息,并进行对应操作的过程。
1)搜索匹配的主机地址
首先查看目标地址是否与路由表中Destination字段是否完整匹配。如果找到完整匹配,可以直接转发到该主机。
2)搜索匹配的网络地址
接着如果没有搜索到该IP地址,则需要将IP与Genmask字段进行与运算,得到目标地址所在的网络号。然后与对应的Destination字段对比,如果匹配成功则按照此规则转发。
3)搜索匹配的默认表项
最后,如果前两步都没能找到合适的选路信息,读取路由表中的默认选项。该步骤其实就是将数据包传递到度更高的节点,增大发现的概率重新进行选路行为。
4)匹配失败
一般情况来说,每个路由器都有一个默认的转发机制。但是当路由表中没有默认转发路由或者默认路由失效的时候,数据包就会“迷路”了。此时,数据包所在的传递节点会根据数据包是由本地主机产生 or 负责转发 返回一个差错报文,ICMP报文信息分别为“主机不可达差错” or “网络不可达差错”。

ICMP报文

IP选路的魅力,不在全而在简。

1.ICMP重定向差错

当数据包依据路由表被传递到下一个路由器时,同时会返回给发起主机一个ICMP重定向报文,告诉他“以后可以把数据报发给他,不用给我了。” 正是基于这样的重定向机制,使得主机自动地对路由表进行改进。这样的机制对主机无智能化要求,路由器有少量的智能性即可。

ICMP重定向报文有四种不同类型:

  • 0:网络重定向
  • 1:主机重定向
  • 2:服务类型和网络重定向
  • 3:服务类型和主机重定向

ICMP规则:

  • 重定向报文只能由路由器产生,而不是主机生成;
  • 重定向报文为主机使用,而不是给路由器使用

主机接收到ICMP重定向报文,需要做检查:

  • 新的路由器必须直接与网络连接
  • 重定向报文必须来自当前目的地所选的路由器
  • 重定向报文不能让主机做路由器
  • 被修改的路由必须是一个间接路由

2.ICMP路由器发现报文

路由器发现报文:ICMP路由器请求报文、ICMP路由器通告报文。
主机在引导后会广播或者多播一份路由器请求报文,接着一台或者多台路由器会响应一份路由器通告报文
主机引导期间一般发送三份路由器请求报文,三秒发送一次。一旦接受到通告报文,会停止发送请求报文。
路由器启动后会随机传送通告报文,一般每两次间隔450秒和600秒,通告报文默认的生存周期是30分钟。同时,路由器监听网络中的主机请求,并响应请求。当路由器被关闭时,最后发送的一个通告报文的生命周期会被设置为0。

本文链接http://element-ui.cn/article/show-155733.aspx