两台主机通讯时,没有B主机的子网掩码,A主机咋判断B主机和自己在不在一个网络呢

我写点自己粗浅的理解吧。
掩码是给自己用的。 掩码和IP地址与运算得到网络地址。 比如(请自行脑补二进制的方式来理解):
IP地址:192.168.1.2
子网掩码:255.255.255.0
那它们与运算后得到的网络地址是:192.168.1.0
我的理解是网卡接受到一个数据包,到了第三层,取出数据包中的IP地址,与本机的掩码进行与运算得到网络地址,如果网络地址与本机的网络地址不一致则认为是不同子网,就丢弃那个数据包,如果一致则认为在同一个网络中,数据包合法,继续往上传(第四层) 。所以192.168.1.2/24和192.168.1.3/16在本机看来,对方都是跟自己在同一个网络中(貌似就是所谓的超网的概念),就像@缪伟宁 在答案中补充的例子一样。
另外我再补充四个例子(拓扑跟@缪伟宁 回答补充的例子一样)。
例子一:
主机A的IP地址:192.168.1.2/24,网关:空,运算得到的网络地址:192.168.1.0
主机B的IP地址:192.168.2.2/16,网关:空,运算得到的网络地址:192.168.0.0
此时主机A和主机B ping不通
分析:
主机A ping主机B的时候,目标地址:192.168.2.2 和本机掩码:255.255.255.0运算得到的网络地址:192.168.2.0,跟本机的网络地址:192.168.1.0 不一致,所以主机A认为目标地址和本机不在同一个网络中,所以数据包发到网关去,但是网关为空,die~
主机B ping主机A的时候,目标地址:192.168.1.2 和本机掩码:255.255.0.0运算得到的网络地址:192.168.0.0,跟本机的网络地址:192.168.0.0 一致,所以认为在同一个网络中。数据包发送出去之后主机A的网卡虽然收到了,但是在OSI第三层的时候,主机A用自己的掩码跟数据包的源地址与运算之后得到的网络地址是:192.168.2.0,显然跟本机的网络地址:192.168.1.0不一致,所以丢弃,die~
例子二:
主机A的IP地址:192.168.1.2/24,网关:192.168.2.2,运算得到的网络地址:192.168.1.0
主机B的IP地址:192.168.2.2/16,网关:空,运算得到的网络地址:192.168.0.0
此时主机A和主机B 能ping通
分析:主机A ping主机B的时候,目标地址:192.168.2.2 和本机掩码:255.255.255.0运算得到的网络地址:192.168.2.0,跟本机的网络地址:192.168.1.0 不一致,所以主机A认为目标地址和本机不在同一个网络中,所以数据包发到网关去,即:192.168.2.2 . 主机B收到了主机A发来的数据包,把主机A的IP地址跟本机的掩码计算得到的网络地址与本机的网络地址一致,OK,收下,并发送响应的ICMP包,所以ping通了。
主机B ping主机A的时候,目标地址:192.168.1.2 和本机掩码:255.255.0.0运算得到的网络地址:192.168.0.0,跟本机的网络地址:192.168.0.0 一致,所以认为在同一个网络中。数据包发送出去之后主机A看到是网关发来的数据包,所以义不容辞的收下并发送了响应的ICMP包,所以ping通了。
例子三:
主机A的IP地址:192.168.1.2/24,网关:空,运算得到的网络地址:192.168.1.0
主机B的IP地址:192.168.2.2/16,网关:192.168.1.2,运算得到的网络地址:192.168.0.0
此时主机A和主机B ping不通
分析:
主机A ping主机B,情况跟第一个例子一样,就不复制过来了。
主机B ping主机A,情况其实跟第一个例子也一样,走不走网关在单纯接交换机的情况下是差不多的,也是主机A网卡虽然收到了,但是丢弃了。
例子四:
主机A的IP地址:10.0.0.2/8,网关:空,运算得到的网络地址:10.0.0.0
主机B的IP地址:192.168.2.2/16,网关:10.0.0.2,运算得到的网络地址:192.168.0.0
此时主机A和主机B ping不通
分析:
【两台主机通讯时,没有B主机的子网掩码,A主机咋判断B主机和自己在不在一个网络呢】 主机A ping主机B,情况跟第一个例子一样,只是地址变了。不复制了。


推荐阅读