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

314 天前
 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 这种情况按照上述判断方式结果是属于同一网段,然而实际上是两个不同的网段

所以,正确答案是什么?

5827 次点击
所在节点    程序员
56 条回复
OrdinaryMan
314 天前
求解
seeme
314 天前
计算的时候不考虑目的 ip 的掩码吧
OrdinaryMan
314 天前
@seeme 那这种错误的出现怎么避免呢
ysc3839
314 天前
没有“目的子网掩码”,用本地子网掩码计算后就能知道是不是在同一网段
OrdinaryMan
314 天前
@ysc3839 那怎么解释这种情况呢——>本地 ip:192.168.1.1 本地子网掩码:255.255.255.0 目的 ip:192.168.1.193 目的子网掩码
jdOY
314 天前
判断是否跨网段的方法没问题的,网络传输过程中硬件设备把这些步骤做好了而已,去看看网络工程就能大概了解
yuanix
314 天前
@OrdinaryMan 感觉不是错误,如果想要两台机器能通过交换机互联,那就配置成同一网段。当然也可以使用不同的掩码,进一步划分子网,
seeme
314 天前
@OrdinaryMan #3 这不是错误阿,网络世界都是只管发包,能不能收到回包看路径上如何转发 /处理这些数据包。
举个例子,你本地 ip192.168.1.1/24 ,通过 dns 解析到一个 ip3.3.3.3 ,这时候你通过计算网络发现不属于 192.168.1.1/24 这个网段,那么这个数据包就会查找其他符合条件的网关(大部分情况都是默认网关)进行发送。

如果你想让你的机器正确收到回包,需要探究下 NAT 、路由相关的知识。
arnoldxiao
314 天前
子网掩码末位 192 转换为 8 位二进制是 1100 0000 ,
和 IP 地址进行计算,
所以目的地网络号为 192.168.1.192 ,
和本地的网络号 192.169.1.0 不一致,
所以不属于同一网段
xiaobai1213
314 天前
没有目的子网掩码这个说法 , 他只会和本机的子网掩码与一下 发现是同一网络就是同一网络了 至于下面怎么走 那是路由的事儿了。
lifekevin
314 天前
只会判断目的 ip 属不属于自己的子网,不会考虑对方的子网掩码。
你的举例中,192.168.1.1/24 可以访问 192.168.1.192/28 ,但是 192.168.1.192/28 访问不了 192.168.1.1 。
因为 192.168.1.192 属于 192.168.1.1/24 子网,但是 192.168.1.1 不在 192.168.1.192/28 的子网中。
adoal
314 天前
如果这两个节点在同一二层网络,把做配置的拖出去打死。
如果在不同的二层网络,把提要求的拖出去打死。
jiulang
314 天前
我怎么感觉这个问题是:如何判断我的局域网的 192.168.1.192 ,和你家的局域网的 192.168.1.193 ,不在同一个网段一样。

那么问题来了,你家的 192.168.1.192 自然不能直接连接我的 192.168.1.193 ,这个判断有什么意义呢
killva4624
314 天前
这个不冲突。
- 192.168.1.1 给 192.168.1.193 发包的时候,判断目的 IP 在同一个网络。
- 192.168.1.193 给 192.168.1.1 发包的时候,判断目的 IP 不在同一个网络。

你用 Cisco 模拟器试试就明白了。
Yourshell
314 天前
你的目标 ip 是被 nat 后的啊
blessingsi
314 天前
子网掩码是网络的属性,不是某台机器的属性。路由表里面每一行都包括 网络地址,子网掩码,和对应的下一跳地址。目的 ip 和每一行中的掩码做与,看是否和这行中的网络地址匹配。如果一个目的 ip 能同时满足多行记录,那么用掩码长度最长的那个。
goodryb
314 天前
正确答案就是判断是否同一网络 只看目标地址和自身的网络掩码

是 就直连
否,查询本机路由表,根据路由表发送

上述都是系统层面的,应用层感知不到这个过程
raysonx
314 天前
> 计算机发送 ip 数据包时,如何判断目的 ip 和本地 ip 是否属于同一网段?
这个假设是错误的。发送 ip 数据包时,会通过查找路由表来决定发送的目的地,不会关心目的 ip 和本地 ip 是否属于同一网段。
实际上你本地计算机根本不知道目的 IP 的子网掩码,比如你往 8.8.8.8 发送数据,难道 Google 还需要暴露它的网络结构给你吗?

拿你的例子:
本地 ip:192.168.1.1 本地子网掩码:255.255.255.0
目的 ip:192.168.1.193 目的子网掩码:255.255.255.192

本机会生成路由表:
0.0.0.0/0 via 网关 A dev 网卡 A
local 192.168.1.1/32
192.168.1.0/24 dev 网卡 B

在给 192.168.1.193 发送数据时,匹配到第 3 条路由,直接从“网卡 A”送出(目的 mac 地址为 192.168.1.193 的 mac 地址)。
在给 8.8.8.8 发送数据时,匹配到第 1 条路由,从“网卡 B”经“网关 A”送出(目的 mac 地址为网关 A 的 mac 地址)。
JayZXu
314 天前
发包路径根据路由表来寻址。
路由表的建立是比较复杂的过程,不是简单看子网掩码能决定的。

如果只是做题,用子网掩码算出内网 IP 范围就行。
你列举的例子,在实际情况下,不可能通过 192.168.1.193 跨网段请求。
raysonx
314 天前
纠正上述一处错误:

在给 192.168.1.193 发送数据时,匹配到第 3 条路由,直接从“网卡 B”送出(目的 mac 地址为 192.168.1.193 的 mac 地址)。
在给 8.8.8.8 发送数据时,匹配到第 1 条路由,从“网卡 A ”经“网关 A”送出(目的 mac 地址为网关 A 的 mac 地址)。

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

https://www.v2ex.com/t/952586

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

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

© 2021 V2EX