网络协议

出了网关,网络包的经历

Posted by Liangjf on April 9, 2019

出了网关,网络包的经历

数据包经过路由从局域网出去后,就变得复杂起来。数据包的传递会面临各种选择,比如最重要的路径选择

路径选择就是选择最短路径,也即最优路径来传递网络包到目的地。

在现在网络世界,个人发出的各种网络包的传递一般经过n多路由,每个路由就相当于关卡,有一些策略算法来保证网络包的正常传输。

所以这里涉及到路由的配置。路由拥有一张路由表。一张路由表中会有多条路由规则。每一条规则至少包含这三项信息:

  • 1.目的网络:这个包想去哪儿?
  • 2.出口设备:将包从哪个口扔出去?
  • 3.下一跳网关:下一个路由器的地址。

路由的配置有两种类型:静态配置和动态配置。

静态配置就是直接在配置文件里规定好路由的各个网口和ip的转发规则,负载均衡和默认路径等。

从中可以看到手工配置路由只适合在一些网络环境简单的,可控的网络中使用。不然在复杂的网络中,静态路由是不可取的。

动态路由路由器,可以根据路由协议算法生成动态路由表,随网络运行状况的变化而变化。

动态路由主要有两种算法:

  • 1. 距离矢量路由算法
  • 2. 链路状态路由算法

距离矢量路由算法

每个路由器都保存一个路由表,包含多行,每行对应网络中的一个路由器,每一行包含两部分信息,一个是要到目标路由器,另一个是到目标路由器的距离。

所以啊,使用距离矢量路由算法,每个路由都拥有整个自己能感知的网络的信息。每个路由都知道它能到达的路由的距离。所以,在更新的时候,相关联的路由就会根据相连的路由的距离和源地址路由的距离来推断出自己和源地址路由的距离,然后就会被源地址路由来计算出一条最优的路径。

距离矢量路由算法有个不好的地方,“好事传千里,坏事关起门来”的特点。当某个路由加入网络或更新信息时,就会发起一个广播,然后全局中的其他路由就会更新自己信息,主要是自己与其他路由的最终距离。

但是当某个路由挂掉时,挂了是不会发广播的,只能是通过全局所有路由“报告距离挂掉的路由的信息递增超过阈值“来发现挂掉,所以全局中其他路由更新这个信息的过程是缓慢的。

这个过程是这样的。当全局网络中的每个路由器发现原来的路径到不了这个路由器时,是发现不了它已经挂了,而会试图通过其他的路径访问,直到试过了所有的路径,才发现这个路由器是真的挂了。

针对距离矢量路由算法,每次更新信息都要发动一次全局更新,这样一来,网络大了,这个过程是缓慢,并且是效率低下的。因此,限制了其网网络规模。

链路状态路由算法

和距离矢量路由算法不同,链路状态路由算法的路由算法中,路由在启动时,会向相邻的路由询问距离,这个询问是发送一个echo,然后除以2来求出距离。然后把这个距离信息和地址信息一起广播到全局网络的路由。每个路由都会构建一个本地的全局地图。然后针对这个图使用 Dijkstra 算法,找到两点之间的最短路径。

链路状态路由算法和距离距离矢量路由算法不一样。后者在更新时会发送自己的整个路由表。而前者只广播更新的或改变的网络拓扑,这样更新信息更小,节省了带宽和 提高效率。当某个路由器挂了,它的邻居都会广播这个消息,可以使得坏消息迅速收敛。