奇怪的知识增加了:路由器和主机必须在一个网段么?

1,811 阅读5分钟

这是我参与8月更文挑战的第28天,活动详情查看:8月更文挑战

先说答案:不是必须,但这样做最简单。

我之前也有这样的误解,认为局域网里的主机一定要和路由器(网关)在一个子网,才能实现路由,但其实duck不必。

先来看一下局域网内主机入网的过程:

  1. 连上网线或加入WIFI后,先要通过DHCP获取IP,同时获取到路由器的IP;
  2. 通过ARP广播,获取路由器的MAC地址;
  3. 同时通过ARP广播自己的MAC地址,并获取同网段其他主机MAC地址;

image.png

  1. 此时网络初始化已经完成,可以开始收发数据了;
  2. 当局域网内的主机互相发送消息时,是不需要通过路由转发的,比如ping:

image.png

  • 可以看到层二帧的MAC地址就是通信双方的地址,这个地址就是在接入网络后,通过ARP广播消息获取的;

  • 局域网内的通信,现在基本通过交换机来实现,交换机通过端口映射MAC地址来实现局域网内的数据交换;

看到这里,你可能会认为:路由器一般都和我们的主机在一个局域网内,所以只需要知道MAC地址就可以通信了。

我一开始也是这么认为的,但这并不是事情的全貌

我手欠的做了个测试,修改了我主机的网段,并查看了ARP表,确定其中有路由器的MAC信息: image.png

  • 补充一下,ARP表是一张保存IP地址和MAC地址的映射表,用于在发送数据包时指明下一跳的MAC地址,以及同一个网段内的通信;

测试结果是:确实可以看到主机给路由发送ARP消息,路由器也收到并回复,相当于双方都知道了对方的MAC;同时也可以看到主机在通过路由器给公网IP发送数据包;但看不到路由器转发公网响应数据包!相当于网络是单通。

这个结果证明了:当路由器不属于主机的网段时,主机一样可以给路由器发送数据,但路由器却无法给主机发送信息。

那么如何才能让不在同一个网段的路由器给主机发送信息呢? 答案很简单:路由表

  • 其实,路由表不只是路由器才有,我们每一台主机上也都有一份路由表,通过CMD命令:netstat -r,就可以查看本机的路由表:

image.png

  • 路由表的作用是:告诉数据包,下一跳的目标在哪;主机或路由器在转发数据包前,都会查这个表,来选择输出端口和目标IP;

  • 当我们给主机配置好网关之后,网关的IP就会出现在这个路由表里,在主机接入网络后,就会在网络中通过ARP广播,来获取网关对应的MAC地址,同时把自己的MAC地址也告诉网关;

  • 路由表中条目的分类:主机路由(到具体某一台主机IP的路由),网络路由(到一个子网网段的路由)和默认路由(除了前两者以外的地址,就发给默认路由);还可以分为动态路由(根据路由协议动态更新)和静态路由(手动收入);

关键点来了

  • 路由表中的下一跳,并没有必须在同一个网段的限制

  • 所以这也是为什么当路由器不在主机的网段时,主机可以给路由器发消息;

  • 对于主机来说,路由器的IP地址在主机的路由表里,主机知道路由器的MAC地址,同时根据协议,不在同一个网段的数据包必须通过路由器转发,三者同时具备,即可成功发送数据;

  • 对于路由器来说,更换了IP网段的主机不在路由器的路由表中,所以路由器收到公网响应数据包时,不知道该发给谁,只能继续路由,直到IP包中的TTL过期丢弃;

  • 所以解决方案是:将主机的新IP地址,添加到路由器的路由表中,路由器就可以根据路由表选择发送端口,然后加上主机的MAC地址,进行发送;

回到本文刚开始的那句话,为什么说主机和路由器在一个网段内最简单呢?

因为路由器的路由表,会自动添加它自己所在网段,不需要任何额外操作,就可以轻松路由。

好了,问题解释完毕!



以下是补充内容:

除了上面说的,添加一条路由信息以外,还可以通过互相设置对方为网关的方式实现互联互通:

不在同一个网段,但存在物理连接的两台主机,还可以通过互相设置对方为网关的方法实现互联互通,因为根据协议,所有发往其他网段的数据包都必须通过路由器进行转发,而互相设置为网关后,就会摆脱不在同一个网段的限制;

另外,路由器本身,由于其自身的定位,根据协议,也不受同一个网段的限制,只要目标IP在自己的路由表内,且知道对方的MAC地址,就可以实现通信;

感谢阅读,如有不准确和错误之处请留言指正,我会立即修正,感谢!




总结不易,请勿私自转载,否则别怪老大爷不客气

欢迎喜欢技术的小伙伴和我交流,微信1296386616