判断ip地址是否在同一网段

怎么判断IP地址的是否在同一网段。

相信好多人都认为IP只要前三段相同,就是在同一网段了,其实,不是这样的,同样,我想把IP的每一段转换为一个二进制数,这里就拿IP:192.168.0.1,子网掩码:255.255.255.0做实验吧。

192.168.0.1

11000000.10101000.00000000.00000001

(这里说明一下,和子网掩码一样,每段8位,不足8位的,前面加0补齐。)

IP    11000000.10101000.00000000.00000001

子网掩码  11111111.11111111.11111111.00000000

在这里,向大家说一下到底怎么样才算同一网段。

要想在同一网段,必需做到网络标识相同,那网络标识怎么算呢?

各类IP的网络标识算法都是不一样的。A类的,只算第一段。B类,只算第一、二段。C类,算第一、二、三段。

算法只要把IP和子网掩码的每位数AND就可以了。

AND方法:0和1=0 0和0=0 1和1=1

如:And 192.168.0.1,255.255.255.0,先转换为二进制,然后AND每一位

IP      11000000.10101000.00000000.00000001

子网掩码    11111111.11111111.11111111.00000000

得出AND结果  11000000.10101000.00000000.00000000

转换为十进制192.168.0.0,这就是网络标识,

再将子网掩码反取,也就是00000000.00000000.00000000.11111111,与IP:192.168.0.1 AND

得出结果00000000.00000000.00000000.00000001,转换为10进制,即0.0.0.1,

这0.0.0.1就是主机标识。

 

要想在同一网段,必需做到网络标识一样。

 

  我们再来看看这个改为默认子网掩码的B类IP

如IP:188.188.0.111,188.188.5.222,子网掩码都设为255.255.254.0,在同一网段吗?

先将这些转换成二进制

188.188.0.111 10111100.10111100.00000000.01101111

188.188.5.222 10111100.10111100.00000101.11011010

255.255.254.0 11111111.11111111.11111110.00000000

分别AND,得

10111100.10111100.00000000.00000000

10111100.10111100.00000100.00000000

网络标识不一样,即不在同一网段。

 

 

 

这里所说的网络标识也就是子网

  • 17
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用Java的InetAddress类来判断IP地址是否同一网段。以下是一个示例代码: ```java import java.net.InetAddress; import java.net.UnknownHostException; public class CheckIPv6InSameNetwork { public static void main(String[] args) { try { String ipv6Address = "2001:0db8:85a3:0000:0000:8a2e:0370:7334"; String gatewayAddress = "2001:0db8:85a3:0000:0000:8a2e:0370:733f"; int maskLength = 64; InetAddress ipv6 = InetAddress.getByName(ipv6Address); InetAddress gateway = InetAddress.getByName(gatewayAddress); byte[] ipv6Bytes = ipv6.getAddress(); byte[] gatewayBytes = gateway.getAddress(); // 判断前缀是否相同 boolean isSamePrefix = true; for (int i = 0; i < maskLength / 8; i++) { if (ipv6Bytes[i] != gatewayBytes[i]) { isSamePrefix = false; break; } } if (isSamePrefix) { // 判断后缀是否相同 boolean isSameSuffix = true; for (int i = maskLength / 8; i < ipv6Bytes.length; i++) { if (ipv6Bytes[i] != gatewayBytes[i]) { isSameSuffix = false; break; } } if (isSameSuffix) { System.out.println("IPv6地址和网关在同一网段"); } else { System.out.println("IPv6地址和网关不在同一网段"); } } else { System.out.println("IPv6地址和网关不在同一网段"); } } catch (UnknownHostException e) { e.printStackTrace(); } } } ``` 在这个示例中,我们假设IPv6地址和网关地址都已经以字符串的形式给出,并且子网掩码的长度为64。首先,我们使用`InetAddress.getByName()`方法将字符串转换为`InetAddress`对象。然后,我们将IPv6地址和网关地址转换为字节数组,以便我们可以比较它们的前缀和后缀。最后,我们比较前缀和后缀以确定它们是否同一网段

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值