一个关于计算机网络的疑问

2023-06-29 09:40:16 +08:00
 OrdinaryMan

计算机发送 ip 数据包时,如何判断目的 ip 和本地 ip 是否属于同一网段?

网上的答案是:使用本地子网掩码分别和本地 IP 和目的 IP 进行按位与运算分别得到本地网络号和目的网络号,比较网络号是否相同

但是如果目的 ip 所在的网段子网掩码和本地的子网掩码不一样,比如: 本地 ip:192.168.1.1 本地子网掩码:255.255.255.0 目的 ip:192.168.1.193 目的子网掩码:255.255.255.192 这种情况按照上述判断方式结果是属于同一网段,然而实际上是两个不同的网段

所以,正确答案是什么?

6252 次点击
所在节点    程序员
56 条回复
libook
2023-06-29 10:13:35 +08:00
计算机在与目标 IP 通信前,会先查看自己接入了哪几个网段,然后看目标 IP 在自己的哪个网段里。如果自己同时接入的多个网段有重合,而目标 IP 恰好在这个重合范围内,有可能计算机会使用错误的网络接口尝试与目标 IP 通信。
如果目标 IP 不在自己接入的任何网段,且自己可以连接到至少一个网关,那么将会尝试让网关帮忙找到路由。

这个过程不会获得到目标的子网信息,仅靠一个目标 IP 和自己的接入的网络信息来完成。
raysonx
2023-06-29 10:16:58 +08:00
上述所有的回答中,只有 @blessingsi 和 @JayZXu 的回答是正确的,其他的要么错误,要么没回答到点子上。

发包时会匹配路由表,而不是看是否和本机是否同一子网。假设你本地的路由表有很多条目,会拿目的地址与每一条路由条目匹配(实际存在二分查找),找到最长前缀那一条,再决定下一步的动作。
raysonx
2023-06-29 10:22:02 +08:00
驳“如果自己同时接入的多个网段有重合,而目标 IP 恰好在这个重合范围内,有可能计算机会使用错误的网络接口尝试与目标 IP 通信。”
假如本地同时有两张网卡,分别配置为:
eth1: 192.168.1.100/24
eth2: 192.168.1.101/23
这时候,系统会生成路由表:
local 192.168.1.100
local 192.168.1.101
192.168.1.0/24 dev eth1
192.168.0.0/23 dev eth2

如果往 192.168.0.1 发包,只会匹配到 192.168.0.0/23 dev eth2 ,所以会从 eth2 发出;
如果往 192.168.1.1 发包,会匹配前缀最长的 192.168.1.0/24 dev eth1 ,所以会从 eth1 发出。
8355
2023-06-29 10:22:26 +08:00
举个最简单的例子吧。。。
假设你局域网的 ip 地址是 1.1.1.1 你 ping 1.1.1.2
假设局域网有 1.1.1.2 那么 ping 的是局域网内的 ip
没有的该地址 ping 的就是外网的 1.1.1.2

判断是否同一网段不是发出方决定的
Vraw5
2023-06-29 10:24:03 +08:00
对方的掩码你不知道的呀,就像你要给 8.8.8.8 发数据,你不知道它的掩码是啥,本地只知道匹配到要走网关。

本地只要判断对方 ip 和本地是不是同段,然后去匹配相应的路由。

通过路由没过去或者没回来,网络不通就要排查是没过去还是没回来,没回来是因为啥。

这个过程已经走过“判断目的 ip 和本地 Ip 是否同段”这步了,且和目的 ip 的掩码无关。
wheat0r
2023-06-29 10:47:41 +08:00
你按照你的子网掩码往出发,对方按照他的子网掩码回包。
leonshaw
2023-06-29 10:52:20 +08:00
查路由,看下一跳是接口 /二层邻居还是 IP 地址。
配 IP 子网掩码的本质也是生成了一条下一跳指向接口的路由。
OrdinaryMan
2023-06-29 11:03:20 +08:00
@killva4624 豁然开朗
OrdinaryMan
2023-06-29 11:04:25 +08:00
@raysonx 我的理解是第一步是判断是否同网段,不同网段才会查路由表
OrdinaryMan
2023-06-29 11:06:23 +08:00
@wheat0r OK ,明白了
OrdinaryMan
2023-06-29 11:14:02 +08:00
路由表中通常只保存不同网段的路由信息,用于选择转发数据包的下一跃点路由器。
本地网段内的 IP 地址可以通过 ARP 协议直接解析为 MAC 地址,用于直接发送数据包。路由表保存的路由条目通常包含下一跃点的 IP 地址,用于向指定路由器发送数据包。
如果向路由表中添加同一网段内所有主机的路由,会极大增加路由表的体积,降低查找效率。这没有实际意义
OrdinaryMan
2023-06-29 11:20:21 +08:00
@killva4624 192.168.1.1 给 192.168.1.193 发包的时候,判断目的 IP 在同一个网络,就直接用 arp 协议查 mac ,但是查不到,这个时候就需要查路由表了吧?
NeoZephyr
2023-06-29 11:48:15 +08:00
是否属于同一网段,是一个台机器自己主观的判断。一般来说,掩码一样的话,那判断是一致的。但如果掩码不一致的话,是否属于同一网段,也是得到的答案不一致的
ketor
2023-06-29 11:56:04 +08:00
找了个现在用的服务器上的路由信息
ip route 的输出如下:
default via 192.20.8.88 dev eth1 proto static metric 10
default via 192.20.1.1 dev eth1 proto static metric 100
192.17.0.0/16 dev docker0 proto kernel scope link src 192.17.0.1
192.20.0.0/17 dev eth1 proto kernel scope link src 192.20.31.12 metric 100
junwind
2023-06-29 12:00:47 +08:00
你本机发送,是先到你的路由器的,本机并不需要关心目的地 ip ,由路由器负责层层转发,能不能转发到,由路由器的映射表决定。
ketor
2023-06-29 12:06:04 +08:00
OP 直接理解为本地发包的时候就是从路由表里进行规则匹配就对了,匹配到哪一条路由规则,就按照规则发包,规则里指定了发到哪个网卡设备,metric 信息等等。

比如说本地有 eth1 ,还有个 docker0 ,如果目的 IP 是 192.17.0.2 ,那么会匹配到 192.17.0.0/16 这个规则,会发送到 docker0 这个网卡上,这里就直接是以太网过去了。

如果目的 IP 是 1.1.1.1 ,那么最终会匹配到 default 规则,default 有 2 条,metric 较小的优先级更高,所以会把 IP 包发给 192.20.8.88 这个 IP 地址,走 eth1 网卡。192.20.8.88 是否具备 ip forward 的能力是它的问题,它会把这个包转发给谁又是根据它自己的路由表来确定的。

整个网络的交互就是这样的,一个 IP 报文就是一个节点一个节点这么转发的,每个节点都根据自己本机配置的路由表进行转发给下一个目的。 对端 IP 回包的时候,也是一样的流程。

实际上的网络比这个过程要多很多细节,有各种路由交换协议来解决路由传播的问题; 在小的网络里面也有 VLAN 、VXLAN ,各种 GRE 隧道之类的。即使是在本机,路由表也不一定是上面展示的这么简单,还要看策略路由是否有配置,iptables 是否有规则表会在发包和收包的过程中做数据的转换,是 prerouting 还是 postrouting 对包的流向影响也不同。

要想有一个比较全面的理解,可能还是需要稍微系统性的了解一下计算机网络的知识才能有更深入全面的认识。
希望可以帮到 OP 。
julyclyde
2023-06-29 12:29:50 +08:00
以发送方的掩码判断
掩码仅具有本地意义(也就是说别人的掩码只对别人自己有效,对我没什么影响)
julyclyde
2023-06-29 12:32:14 +08:00
@OrdinaryMan 其实计算掩码是查路由表的一个步骤。不存在“不同网段才”这种说法
无论是否在同一个网段,都得 arp 查 mac ,无非是查目标地址还是查网关的 mac 的区别而已
txydhr
2023-06-29 12:51:46 +08:00
@OrdinaryMan 不查路由表,在局域网内广播寻找
dcsuibian
2023-06-29 13:14:55 +08:00
确实都属于 192.168.1.0/24 啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/952586

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX