假设本机 IP 是 192.168.12.170/26,现在要分别给 192.168.12.180 和 192.168.12.210 发数据。这两个目标 IP 的前三段都是 192.168.12,看起来很像“同一个网段”,但在发包时走的路完全不同。
判断目标是否在本地子网
前面算过,本机所在的子网是 192.168.12.128/26,范围从 .128 到 .191。所以 .180 在本地子网里,而 .210 已经超出了本地子网。
在操作系统内部,协议栈会把目标 IP 和本机子网掩码做按位与(AND)运算(两个二进制位都是 1 结果才为 1,否则为 0),看算出来的网络号跟本机是不是一样:
地址最后一组二进制 与掩码 11000000 做按位与
本机自身 .170 10101010 10000000 = 128(本机网络号)
目标地址 .180 10110100 10000000 = 128(同一子网,直接发)
目标地址 .210 11010010 11000000 = 192(不在本子网,交给网关)
网络号相同,说明目标就在同一个局域网里,直接通过本地交换机发过去就行;网络号不同,说明目标在外部网络,必须把包交给默认网关(Default Gateway)去转发。