路由过程

基本过程

数据包从主机1.1.1.1发送到目标主机5.5.5.5的过程

首先从初始网关(一个路由器)中查找路由表,路由表形式如下(windows下使用 route print 查看):

注:网关中的“on-link”表示该目标网络和该主机存在同一个子网下,不需要经过路由转发

根据前两列(目标网络和网络掩码)确认目标主机应该从以哪个接口(第四列,下面有解释)发送给哪个网关(第三列,即路由的下一跳地址)

路由表的第一行为默认网关,如果在下面的路由表中找不到对应目标主机的网络记录,则发送给默认网关,后续的路由过程也是如此

例如一般本机的路由表中都只会记录局域网的路由记录,如果是发送数据到公网或其他局域网的主机,一般都是走默认网关,可以使用 tracert destination-ip 查看路由过程(一般默认网关ip都是一1结尾,下图中可以看到先走了两次默认网关)

如果有多个匹配的目标网络地址,则根据最优匹配规则(最长前缀等)及路由表的Metric列(数值越小,路径越短)选择最合适的网关进行发送

当然,网关只是一个ip地址,属于传输层,它还需要根据ip地址找到mac地址才能进行发送,这里就是arp协议的功能了

网关 vs 接口

一台路由器或主机可能通过交换机连接着多台路由器,每个路由器都可以看作是下一跳的备选地址,具体选择哪一个就是根据目标网络和网络掩码决定。在路由表上的体现就是根据前两列找到某一行,第三列网关就是下一跳路由器的地址。

一台主机可能有多张网卡,所以就会有多个ip地址,例如,你本机可能和校园网在一个子网,则校园网会给你分配一个ip。你在主机上使用VMware使用“仅主机”的网络模式开启了其他的虚拟机,则你的主机又和这些虚拟机组成一个局域网,它又会给你分配一个ip。如此你的主机就会有两个ip,路由表中的接口作用就是说,数据包在发送给网关时,选择使用哪个ip。

路由器 vs 交换机

交换机:有6台主机要相互通信,则需要使用 6*5=30 根网线将它们连接起来,但是如果用交换机的话,则每台主机都只用连在交换机上,当两台主机要进行通信时,交换机负责将它们连接起来。这样就只需要6根网线。交换机的数据转发是基于mac地址的,它会维护一个mac地址与端口的映射表。

路由器:同一个子网之间通信不需要路由器,只用交换机就行了,路由器只有在数据包发送给其他局域网时才会有作用,路由器一般有两个或多个网络接口,分别连接多个子网,找到数据包下一跳接口的过程就是路由。

若一个网络没有路由器而只有交换机,主机之间也是可以通过ip进行访问的,例如某台主机具有dhcp的功能,则其他主机会先广播找到dhcp服务器的mac地址,然后将自己的mac地址发送给dhcp服务器,它就会返回一个ip。或者也可以手动配置静态ip等

同服务器一样,你应该将路由器看作是一个软件而不是硬件,任何主机都可以做路由器,就像任何主机都可以做服务器一样,只不过主机上安装的软件不同,我们对它的叫法也就不同

网关 vs 路由器

网关只是一个统称,所有流量需要经过的地方就是网关,路由过程中,下一跳的路由器就是一个网关。但在路由表中,网关又被具体化成下一跳的路由地址。

Q&A

  1. 如果路由过程中,某路由器存在多个符合条件的路由记录,它们的优先级相同,数据包会如何发送?
    数据包被复制成多份并同时发送给这些符合条件的网关路由,由于它们具有相同的目标网络地址,则当它们到达目标网络的路由器时,路由器会自动去重,保证只有一个数据包发送给目标主机
    自动去重的一种解决方案:网络设备维护一个长度为100个数据包缓存的队列,当新的数据包到来时,其和队列中的数据包进行hash比对,若存在则将其丢弃,不存在则弹出队列头部的数据包,并将新数据包添加到队尾
  2. 路由表如何更新?
    路由表可以手动修改(静态路由)也能自动更新(动态路由)。它使用动态路由协议来自动更新路由表,例如rip是一种动态路由协议,它规定每过30秒就和相邻的路由器同步路由表。当同步次数足够多时,所有的路由表都会收敛成定值(排除网络环境的变化)。
  3. 路由表会不会无限增大?
    不会,它可以根据一定策略更新本地路由表,而不是盲目地把所有拉取的记录都保存下来,例如跳数过多的记录就不会被保存
    第1个路由器拉取第2个路由器的路由表,第2个路由器拉取第1个和第3个路由器的路由表,如此持续下去并且不停迭代,若不加以限制,所有的路由器中的路由表都会变成一样的(每个路由器的网关还是不同的,因为单个路由器的路由表中的网关只能是其相邻路由器的地址,所以即便第1个路由器最终会有第99个路由器的网络记录,但该记录的网关还是第2个或其他相邻路由器的地址,但此时跳数为98),但跳数是不一样的,故如果跳数过大,则不进行记录
  4. 路由表会不会形成环路
    会,但可以尽量避免,即使形成了环路,也会有一定的检查和修改措施,这些都是自动完成的

Leave a Comment