ip段/数字,如192.168.0.1/24是什么意思?
首先来了解一下二进制的转换知识:
二进制数转换成十进制数 二进制的1101转化成十进制
1101(2)=1*2^0+0*2^1+1*2^2+1*2^3=1+0+4+8=13
转化成十进制要从右到左用二进制的每个数去乘以2的相应次方
不过次方要从0开始
相反 用十进制的13除以2 每除一下将余数就记在旁边
最后按余数从下向上排列就可得到1101
十进制转二进制:
用2辗转相除至结果为1
将余数和最后的1从下向上倒序写 就是结果
例如302
302/2 = 151 余0
151/2 = 75 余1
75/2 = 37 余1
37/2 = 18 余1
18/2 = 9 余0
9/2 = 4 余1
4/2 = 2 余0
2/2 = 1 余0
1/2 = 0 余1
故二进制为100101110
子网掩码的前缀表示法! 11111111 11111111 1111111 00000000 24个1组成 转成成十进制等于 255.255.255.0 11111111 11111111 1111111 11111100 30个1组成 转成成十进制等于 255.255.255.252
我们租用服务器/vps的时候,买多个IP地址,机房总是发一个类似 10.0.0.1/29 或 10.0.0.1/28 或 10.0.0.1/30 或 10.0.0.1/27 的地址给我们,对于不熟悉网络的人来说,真的莫名其妙。到底有哪些可用的IP? 网关,子网掩码,广播地址是什么?
为了方便大家,本文章提供了 可用IP查询,ip段/27 /29 /30 网关,子网掩码,广播地址查询
可用IP查询,IP段对应表
IP总数 | 子网掩码 | C段个数 | |
---|---|---|---|
/30 | 4 | 255.255.255.252 | 1/64 |
/29 | 8 | 255.255.255.248 | 1/32 |
/28 | 16 | 255.255.255.240 | 1/16 |
/27 | 32 | 255.255.255.224 | 1/8 |
/26 | 64 | 255.255.255.192 | 1/4 |
/24 | 256 | 255.255.255.0 | 1 |
/23 | 512 | 255.255.254.0 | 2 |
/22 | 1024 | 255.255.252.0 | 4 |
/21 | 2048 | 255.255.248.0 | 8 |
/20 | 4096 | 255.255.240.0 | 16 |
/19 | 8192 | 255.255.224.0 | 32 |
/18 | 16384 | 255.255.192.0 | 64 |
/17 | 32768 | 255.255.128.0 | 128 |
/16 | 65536 | 255.255.0.0 | 256 |
ip段/24 /25 /26 /27 /28 /29 /30
网关,子网掩码,广播地址查询
范例: 要查询204.45.116.184/29,先找到下表的 /29 表格,网关 这一列找到要查询的IP最后一位即.184,然后就可以看到可用IP范围(注:第一个IP是Gateway网关地址)和广播地址了。然后从上面的表找到 子网掩码即可。
/25 — 2 Subnets — 126 Hosts/Subnet
| /24 –1 Subnets – 254 Hosts/Subnet 代表一整个C段 |
网络地址 | 可用IP范围 | 广播地址 |
---|---|---|
.0 | .1-.254 | .255 |
/30 — 64 Subnets — 2 Hosts/Subnet
网络地址 | 可用IP范围 | 广播地址 |
---|---|---|
.0 | .1-.2 | .3 |
.4 | .5-.6 | .7 |
.8 | .9-.10 | .11 |
.12 | .13-.14 | .15 |
.16 | .17-.18 | .19 |
.20 | .21-.22 | .23 |
.24 | .25-.26 | .27 |
.28 | .29-.30 | .31 |
.32 | .33-.34 | .35 |
.36 | .37-.38 | .39 |
.40 | .41-.42 | .43 |
.44 | .45-.46 | .47 |
.48 | .49-.50 | .51 |
.52 | .53-.54 | .55 |
.56 | .57-.58 | .59 |
.60 | .61-.62 | .63 |
.64 | .65-.66 | .67 |
.68 | .69-.70 | .71 |
.72 | .73-.74 | .75 |
.76 | .77-.78 | .79 |
.80 | .81-.82 | .83 |
.84 | .85-.86 | .87 |
.88 | .89-.90 | .91 |
.92 | .93-.94 | .95 |
.96 | .97-.98 | .99 |
.100 | .101-.102 | .103 |
.104 | .105-.106 | .107 |
.108 | .109-.110 | .111 |
.112 | .113-.114 | .115 |
.116 | .117-.118 | .119 |
.120 | .121-.122 | .123 |
.124 | .125-.126 | .127 |
.128 | .129-.130 | .131 |
.132 | .133-.134 | .135 |
.136 | .137-.138 | .139 |
.140 | .141-.142 | .143 |
.144 | .145-.146 | .147 |
.148 | .149-.150 | .151 |
.152 | .153-.154 | .155 |
.156 | .157-.158 | .159 |
.160 | .161-.162 | .163 |
.164 | .165-.166 | .167 |
.168 | .169-.170 | .171 |
.172 | .173-.174 | .175 |
.176 | .177-.178 | .179 |
.180 | .181-.182 | .183 |
.184 | .185-.186 | .187 |
.188 | .189-.190 | .191 |
.192 | .193-.194 | .195 |
.196 | .197-.198 | .199 |
.200 | .201-.202 | .203 |
.204 | .205-.206 | .207 |
.208 | .209-.210 | .211 |
.212 | .213-.214 | .215 |
.216 | .217-.218 | .219 |
.220 | .221-.222 | .223 |
.224 | .225-.226 | .227 |
.228 | .229-.230 | .231 |
.232 | .233-.234 | .235 |
.236 | .237-.238 | .239 |
.240 | .241-.242 | .243 |
.244 | .245-.246 | .247 |
.248 | .249-.250 | .251 |
.252 | .253-.254 | .255 |
/26 — 4 Subnets — 62 Hosts/Subnet
网络地址 | 可用IP范围 | 广播地址 |
---|---|---|
.0 | .1-.62 | .63 |
.64 | .65-.126 | .127 |
.128 | .129-.190 | .191 |
.192 | .193-.254 | .255 |
/27 — 8 Subnets — 30 Hosts/Subnet
网络地址 | 可用IP范围 | 广播地址 |
---|---|---|
.0 | .1-.30 | .31 |
.32 | .33-.62 | .63 |
.64 | .65-.94 | .95 |
.96 | .97-.126 | .127 |
.128 | .129-.158 | .159 |
.160 | .161-.190 | .191 |
.192 | .193-.222 | .223 |
.224 | .225-.254 | .255 |
/28 — 16 Subnets — 14 Hosts/Subnet
网络地址 | 可用IP范围 | 广播地址 |
---|---|---|
.0 | .1-.14 | .15 |
.16 | .17-.30 | .31 |
.32 | .33-.46 | .47 |
.48 | .49-.62 | .63 |
.64 | .65-.78 | .79 |
.80 | .81-.94 | .95 |
.96 | .97-.110 | .111 |
.112 | .113-.126 | .127 |
.128 | .129-.142 | .143 |
.144 | .145-.158 | .159 |
.160 | .161-.174 | .175 |
.176 | .177-.190 | .191 |
.192 | .193-.206 | .207 |
.208 | .209-.222 | .223 |
.224 | .225-.238 | .239 |
.240 | .241-.254 | .255 |
/29 — 32 Subnets — 6 Hosts/Subnet
网络地址 | 可用IP范围 | 广播地址 |
---|---|---|
.0 | .1-.6 | .7 |
.8 | .9-.14 | .15 |
.16 | .17-.22 | .23 |
.24 | .25-.30 | .31 |
.32 | .33-.38 | .39 |
.40 | .41-.46 | .47 |
.48 | .49-.54 | .55 |
.56 | .57-.62 | .63 |
.64 | .65-.70 | .71 |
.72 | .73-.78 | .79 |
.80 | .81-.86 | .87 |
.88 | .89-.94 | .95 |
.96 | .97-.102 | .103 |
.104 | .105-.110 | .111 |
.112 | .113-.118 | .119 |
.120 | .121-.126 | .127 |
.128 | .129-.134 | .135 |
.136 | .137-.142 | .143 |
.144 | .145-.150 | .151 |
.152 | .153-.158 | .159 |
.160 | .161-.166 | .167 |
.168 | .169-.174 | .175 |
.176 | .177-.182 | .183 |
.184 | .185-.190 | .191 |
.192 | .193-.198 | .199 |
.200 | .201-.206 | .207 |
.208 | .209-.214 | .215 |
.216 | .217-.222 | .223 |
.224 | .225-.230 | .231 |
.232 | .233-.238 | .239 |
.240 | .241-.246 | .247 |
.248 | .249-.254 | .255 |
python实现判断IP是否属于该网段
#!/usr/bin/python # coding: UTF-8 import struct import socket ''''' 转换为子网地址,并检验和输出正确的子网地址 192.168.2.1 -> 192.168.2.1/255.255.255.255 192.168.2.1/24 -> 192.168.2.0/255.255.255.0 192.168.2.1/255.255.255.0 -> 192.168.2.0/255.255.255.0 ''' def format_subnet(subnet_input): # 如果输入的ip,将掩码加上后输出 if subnet_input.find("/") == -1: return subnet_input + "/255.255.255.255" else: # 如果输入的是短掩码,则转换为长掩码 subnet = subnet_input.split("/") if len(subnet[1]) < 3: mask_num = int(subnet[1]) last_mask_num = mask_num % 8 last_mask_str = "" for _ in range(last_mask_num): last_mask_str += "1" if len(last_mask_str) < 8: for _ in range(8 - len(last_mask_str)): last_mask_str += "0" last_mask_str = str(int(last_mask_str, 2)) if mask_num / 8 == 0: subnet = subnet[0] + "/" + last_mask_str + "0.0.0" elif mask_num / 8 == 1: subnet = subnet[0] + "/255." + last_mask_str + ".0.0" elif mask_num / 8 == 2: subnet = subnet[0] + "/255.255." + last_mask_str + ".0" elif mask_num / 8 == 3: subnet = subnet[0] + "/255.255.255." + last_mask_str elif mask_num / 8 == 4: subnet = subnet[0] + "/255.255.255.255" subnet_input = subnet # 计算出正确的子网地址并输出 subnet_array = subnet_input.split("/") subnet_true = socket.inet_ntoa(struct.pack("!I", struct.unpack("!I", socket.inet_aton(subnet_array[0]))[0] & struct.unpack("!I", socket.inet_aton(subnet_array[1]))[0])) + "/" + \ subnet_array[1] return subnet_true def ip_in_subnet(ip, subnet): """判断ip是否属于某个网段""" subnet = format_subnet(str(subnet)) subnet_array = subnet.split("/") ip = format_subnet(ip + "/" + subnet_array[1]) return ip == subnet if __name__ == "__main__": print (ip_in_subnet("192.168.2.252", "192.168.0.0/255.255.0.0")) print (ip_in_subnet("192.168.2.252", "192.168.3.0/255.255.255.0")) print (ip_in_subnet("192.168.2.252", "192.168.2.0/23")) print (ip_in_subnet("192.168.2.252", "192.168.2.0/29")) print (ip_in_subnet("192.168.2.2", "192.168.2.2")) print (ip_in_subnet("192.168.2.2", "192.168.2.3"))