理清路由表

最近一直搞网络这一块,想从最简单的路由表说起,首先贴一张我阿里云主机真实路由表:

理清路由表

比如本机要与172.16.0.1主机进行通讯,如果知道一点网络知识,必须首先确定dst mac,src mac,dst ip,src ip

此时内核会查看路由表项,会匹配到第六个表项,由此可以确定

与172.16.0.1通讯时会使用eth0网卡的mac地址和eth0网卡配置的ip地址(注:eth0网卡的ip地址可以与此表项没有任何关系,

例如本网卡的ip地址为10.26.146.35)

理清路由表


到底是怎么匹配的呢,linux源码说的很清楚了,贴一点代码显得这个简单文章多一点逼格:

理清路由表

简单说就是比如本机的例子就是用 (172.16.0.1 ^ 172.16.0.0) &(255.240.0.0) == 0,就确定了第六项路由表。

匹配到以后就可以确定src ip为10.26.146.35,src mac为eth0的mac,dst ip本来就是172.16.0.1,然后就缺少dst mac.可以看到如果第六项路由表Getway如果是0.0.0.0,就说明getway与目的ip是同网段的,然后直接发送一个arp request就可以获取到172.16.0.1的mac地址,但是此时Getway是10.26.147.247,然后内核就接着再以目的地址为10.26.147.247去查找路由表项,可以知道会匹配到第三项路由表,此时由本网段发送一个arp请求,就可以获取到10.26.147.247(并非172.16.0.1)的mac,即dst mac。

在此说明一下,第一个路由表项是默认路由表,当匹配不到路由表的时候,默认会选择此路由表。可能有人会产生疑问,本机为什么会有第六个路由表项呢,而本地的所有网卡ip都不跟它在同一个网段,这是因为172.16.0.0/20 是本机的专网网络,如果不设置此路由表,如果本机与172.16.0.1地址通讯,会走默认的路由表,信息会发到外网eth1去,而专网是要走内网eth0。

至于route -n 产生的其他字段的含义比如Flags字段的含义,man route说的很清楚了,我就不说了。