将电脑的路由表手工删除,为什么电脑Ping不通同一个网段的主机了?
昨天看到同学们在讨论一个问题:将电脑的路由表手工删除,为什么电脑Ping不通同一个网段的主机了?
当然Ping不通了,因为电脑完全依靠路由表来与外界通信,现在路由表被你强行删除了,电脑就傻了,什么都做不了。
有同学问,同一个网段的主机只需要发送ARP获得对方的MAC地址,就可以完成二层封装,不就可以通信了吗?为什么需要路由表?
因果关系搞反了,主机之所以要从某个硬件接口发送ARP消息获得对方的MAC地址,还是因为路由表要它这么做。现在路由表没有了,电脑什么也做不了。
同学继续提问,用wireshark抓包,什么也没有抓到,ARP广播也没有。
那是肯定的,上文已经说了,主机一旦没有路由表,什么也做不了。这就好比一个导航软件,没有地图数据一样,无法给用户提供导航功能。
写网络科普文的时候,往往是这么写的,主机判断对方主机是否与自己在同一个网段,如果是,直接发送ARP广播请求对方的MAC地址,然后就可以通信了。如果不在同一个网段,ARP请求网关的MAC地址,将报文发给网关代理转发。
看以上文字,压根没提路由表,为什么不提路由表呢?
因为类似这样的文章,只是最最简单的启蒙文章,为了让读者对计算机通信有一个感性认识,而不是望而却步。但是随着学习的深入,光了解这些是肤浅的,因为这些文字的背后站着一个叫路由表的大佬。
路由表的工作原理,公众号文章至少写过十篇以上,可是很多读者并没有看过,等出了问题之后就抓耳挠腮,这是怎么回事呢?
最近关于路由表的文章可以参考这篇,当然你看完学到了,那么恭喜你,说明你自学能力强,前途无限量。如果压根没有看,那就没有办法了。
当一台主机通过DHCP动态获取IP、网络掩码、网关、DNS,或者用户手工配置,其实背后发生很多操作,这些操作虽然看不到,但是作为工程师的你一定要知晓,就仿佛在看一场电影一样,要有画面感。
假设主机从DHCP服务器获得的参数如下:
IP= 10.1.1.2
网络掩码= 255.255.255
网关= 10.1.1.1
DNS Server = 10.1.1.1
当然主机在获取这些信息被将这些参数配置完成之前,还需要校验10.1.1.2是否被别的主机使用,校验的方法以前的文章也有过介绍,这里不再重复。操作系统在将这些参数配置到接口上之后,至少生成以下五条路由:
10.1.1.2/32 (自己与自己通信)
255.255.255.255/32 (广播通信)
10.1.1.255/32 (本网段广播通信)
10.1.1.0/24 (本网段通信)
0.0.0.0/0 下一跳10.1.1.1 (跨网段通信)
现在你把加亮的路由表删除了,主机Ping 10.1.1.3 时主机怎么办啊?
根据最长匹配原则,主机会使用0.0.0.0/0这条路由,然后强行将报文发给10.1.1.1(网关)。
网关10.1.1.1收到之后,非常为难,因为网关要将这个目的IP = 10.1.1.3的报文从收到的接口再发出去,这违反了水平分割原则(不能将报文从入口再次发送出去),所以网关通常将报文丢弃,同时给源主机10.1.1.2发送一个ICMP Redirect报文,意思是,你可以和10.1.1.2直接通信,犯不着麻烦我!
源主机10.1.1.2收到ICMP消息之后自己也很为难,因为自己的路由表没有更好的选择,只有0.0.0.0/0是最后的选择,于是继续将报文扔给网关10.1.1.1,于是一个恶性循环一直在持续发生。
当然操作系统的实现多种多样,当你删除加亮路由条目时,系统自动将依赖于该条路由的0.0.0.0/0也同时删除,那么同样也无法完成通信。
通常路由表由主机的进程自动维护,无需用户手动修改,但是一旦你要修改,你要知道你在做什么并知道由此引起的后果。比如你可以修改路由表的Metric,以此到达优选某个接口作为跨网流量的第一优选接口。