![afca66a3dfdab498777b527e52b233a9.png](https://i-blog.csdnimg.cn/blog_migrate/61cc030727c30de35c51c5d03e133f3f.png)
路由表解释
输入ipconfig
![f5d783b74c319e2100b61bc231c4d98f.png](https://i-blog.csdnimg.cn/blog_migrate/5ae75ac62cbdc448bb1bbc3923f06dc9.png)
输入route print
![f8c69161682e1d90262f8602ea94384e.png](https://i-blog.csdnimg.cn/blog_migrate/589f7d8860e140fc54984c307838a0ae.jpeg)
网络目标(Network Destination):根据网络掩码的不同,网络目标可以表示主机地址也可以表示网络地址。如掩码是255.255.255.255,则代表网络目标指向的是一个主机地址,当掩码是255.255.255.0(/24)时,网络目标代表的是网络地址(主机号为0)。当为某个目的IP地址搜索路由表时,主机地址必须与目标地址完全匹配,而网络地址只需要匹配目标的网络号和子网号就可以了。
- 网络掩码(Netmask):显示网络目标的范围
- 接口(Interface):接口对应着TCP协议中的Source IP,也就是本机IP。需要与目标地址和网关在一个网段中。接口也可以理解为指向的网卡,即指定发往网络目标的数据包将由哪个网卡发出。
- 跃点数(Metric):代表跳出路由的成本,通常情况下代表到达目标地址所需要经过的跳跃数量,一个跃点数代表经过一个路由器。跃点数越低,代表路由成本越低,优先级越高。
双网卡讨论
添加一张新的网卡
![8efb0efc31dacfe1ab8688bddd4c5e49.png](https://i-blog.csdnimg.cn/blog_migrate/f4fe4ae7cf26d95739c216965c1aff5a.jpeg)
查看路由表
![3868e0a4f8b991291eb8f87e6f91a5ef.png](https://i-blog.csdnimg.cn/blog_migrate/1402244d406602c67c7cbe6d693093cb.jpeg)
可以看到Interface List多了一条网卡,而且路由表也多了一条默认项。
这里我使用虚拟机进行模拟,IP为192.168.0.109的网卡是桥接网卡,可以连接互联网。而IP为192.168.68.128的网卡是主机模式的网卡,无法连接互联网。
现在我们分别ping局域网和百度试下。
![4a799858c8b38f6925b0607c82123096.png](https://i-blog.csdnimg.cn/blog_migrate/59445f21bd72c3f0f3b477f83bb997fc.jpeg)
![7e71f6f299447b601ce944a6895b7465.png](https://i-blog.csdnimg.cn/blog_migrate/ad1cf3ee58a014d5b7b98a72cee0b591.png)
都可以ping通,而且用Wireshark抓包发现桥接网卡(Ethernet0)给百度发包,主机网卡(Ethernet2)给局域网内的主机发包。
![62007f91d1ef20422e9d419f3d5c77c9.png](https://i-blog.csdnimg.cn/blog_migrate/9f96f0c73967efac54e1631e4a81b62e.jpeg)
![34b74de8544e06185760698e47e2644f.png](https://i-blog.csdnimg.cn/blog_migrate/03c2b67e177aeb0990331213162b4450.jpeg)
目前为止一切都很正常,但如果ping不存在的局域网IP,会发生什么呢。
![0e69ab7397ca99d0e715042a657eec49.png](https://i-blog.csdnimg.cn/blog_migrate/54bb1fd8c92c399e5e3f56aa7349a5ee.png)
ping不存在的IP,显然是不可能ping通的,这个没有异议。但是问题来了,这个ICMP包是由桥接网卡(Ethernet0)还是主机网卡(Ethernet2)发出去的呢?如果你觉得局域网的包是由主机网卡(Ethernet2)发出去的话,那就错了。事实上通过抓包发现,这三个ICMP包是由桥接网卡(Ethernet0)发出去的。
![3f75d4252c8b12b5d543d6473f62ef49.png](https://i-blog.csdnimg.cn/blog_migrate/1dfdbd2a820297c2790766d6ee41074c.jpeg)
细心的同学可能发现了,ping的时候发出去了4个包,为什么就只抓到三个ICMP包呢?其实之前在ping的时候返回的第一条信息就说了“192.168.68.128不可达”。这个反馈信息其实是在主机网卡(Ethernet2)ARP192.168.68.128后抓不到返回的信息。
Reply from 192.168.68.128: Destination host unreachable.
![81f9a4d8f6680c5819c8449d59c4984a.png](https://i-blog.csdnimg.cn/blog_migrate/1ebfe0bc7f866c8f6606e5886db3d4fa.jpeg)
如上图所示,主机网卡(Ethernet2)其实也是发包的,它先发了个ARP包,但无人应答,那么就转为由桥接网卡(Ethernet0)发包。
如果向桥接网卡(Ethernet0)的网段发包如192.168.0.200,则由桥接网卡(Ethernet0)发包。
![fc8c1459053549a53be1b750e2dfbd1f.png](https://i-blog.csdnimg.cn/blog_migrate/50d3f2b7fb65bc68274974cf9cff99df.png)
![55c177d2b3b7949548668d83929dc755.png](https://i-blog.csdnimg.cn/blog_migrate/706bada1296ddd5f745286df8290fb4c.jpeg)
根据以上情况,我们可以得到ping的发包规则是,如果目标地址在哪个网卡的网段,就优先使用这个网卡发包,但如果该网卡找不到这个IP,则会转到Metric更低的网卡尝试。
那么程序是如何知道某个给定的IP是属于哪个接口也就是哪个网卡的网段呢?我们猜想是从路由表里面查询得到的,如下图就是一条指向192.168.68.0/24的网络地址。我们看看如果把它删掉会发生什么。
![fc6149c952cec44f9292b5f5e1f85d91.png](https://i-blog.csdnimg.cn/blog_migrate/8e6a683b2ea65e865eca4731976b73bd.png)
执行命令route delete 192.168.68.0
,该记录已经被从路由表中移除,这时候我们重新ping一下192.168.68.0/24网段。
![d0aae09040666ff503d267a496f0565b.png](https://i-blog.csdnimg.cn/blog_migrate/cdf02bb0774827f7af4ddb833dc2513e.jpeg)
这次所有的记录都是从桥接网卡(Ethernet0)发出去的,主机网卡(Ethernet2)一个包都没有发。
![31e1585ea5050cc7b19d04c2880b0056.png](https://i-blog.csdnimg.cn/blog_migrate/612887a4f754641b5f9e5e6e33f99280.png)
![7d828e9ea7544220ba102a3566e36dfa.png](https://i-blog.csdnimg.cn/blog_migrate/6df663b23cf9e04fde0fe626e058003c.jpeg)
从这次试验我们可以看出ping程序在发包之前首先会查询路由表,如果路由表上有匹配的项目,如刚开始的192.168.68.200匹配我们删除的规则192.168.0.0,则ping程序会根据这个规则采用主机网卡(Ethernet2)接口发包出去。
但如果目标IP在路由表中没有找到,则采用默认规则发送,即0.0.0.0这一条,如果有两条默认规则0.0.0.0,则采用Metric最小的接口。
如果两者Metric相同,则采用最上面的那一个。