IP 地址(Internet Protocol Address)乃是用于明确标识网络中各类设备的独一无二的地址。IP 地址主要存在两种重要类型,即 IPv4 和 IPv6 。
IPv4地址
IPv4 地址实则是一个由 32 位二进制数字所构成的标识,通常会以四个十进制数字的形式呈现出来,每一个数字均处于 0 至 255 的区间范围内,且通过点来加以分隔,例如:192.168.1.1 。IPv4 地址能够被细分为不同的类别、子网掩码、网络位以及主机位。
IP地址分类
IPv4 地址依据其开头几位的数值被划分为不同的类别:
Class A:范围从 0.0.0.0 延伸至 127.255.255.255 。
网络位:占据 8 位。
主机位:达到 24 位。
子网掩码:为 255.0.0.0 。
网络数量:总计 128 个。
主机数量:在每个网络中可达 16777214 (即 2^24 - 2) 。
Class B:处于 128.0.0.0 至 191.255.255.255 之间。
网络位:为 16 位。
主机位:有 16 位。
子网掩码:是 255.255.0.0 。
网络数量:达 16384 个。
主机数量:在每个网络中为 65534 (即 2^16 - 2) 。
Class C:处于 192.0.0.0 至 223.255.255.255 。
网络位:占据 24 位。
主机位:为 8 位。
子网掩码:是 255.255.255.0 。
网络数量:总计 2097152 个。
主机数量:在每个网络中为 254 (即 2^8 - 2) 。
Class D:范围在 224.0.0.0 至 239.255.255.255
主要用于组播。
Class E:从 240.0.0.0 至 255.255.255.255
被保留下来用于实验用途。
子网掩码
子网掩码在网络通信中发挥着关键作用,其主要用途在于清晰地区分 IP 地址中的网络部分和主机部分。子网掩码同样是由 32 位构成的二进制数,这一点与 IP 地址别无二致。并且,如同 IP 地址那样,子网掩码通常也会以四个十进制数的形式来予以表示。
举例来说,像子网掩码 255.255.255.0 这种情况,就明确地表明了其前面的 24 位属于网络位,而后面的 8 位则属于主机位。
计算网络位和主机位
假设你有一个IP地址192.168.1.10和子网掩码255.255.255.0:
将IP地址和子网掩码转换为二进制形式:
IP地址: 192.168.1.10 -> 11000000.10101000.00000001.00001010
子网掩码: 255.255.255.0 -> 11111111.11111111.11111111.00000000
网络位是IP地址与子网掩码按位与的结果:
网络位: 11000000.10101000.00000001.00000000 -> 192.168.1.0
主机位是IP地址的剩余部分:
主机位: 00000000.00000000.00000000.00001010 -> 10
子网划分
子网划分是将一个大网络划分为多个小子网。假设你有一个Class C网络192.168.1.0/24,并希望将其划分为4个子网。
计算每个子网需要的位数:
需要划分4个子网,需要2位(2^2 = 4)。
原来的网络位是24位,加上2位子网位,共26位。
子网掩码变为255.255.255.192(前26位为1,其余为0)。
划分后的子网网络地址:
192.168.1.0/26
192.168.1.64/26
192.168.1.128/26
192.168.1.192/26
每个子网的主机范围(去掉网络地址和广播地址):
192.168.1.1 到 192.168.1.62
192.168.1.65 到 192.168.1.126
192.168.1.129 到 192.168.1.190
192.168.1.193 到 192.168.1.254
用Python计算子网划分
Python脚本来计算子网划分:
import ipaddress
def subnet_calculator(network, new_prefix):
network = ipaddress.IPv4Network(network)
subnets = list(network.subnets(new_prefix=new_prefix))
return subnets
def main():
network = "192.168.1.0/24"
new_prefix = 26
subnets = subnet_calculator(network, new_prefix)
for subnet in subnets:
print(f"子网: {subnet}")
print(f"网络地址: {subnet.network_address}")
print(f"广播地址: {subnet.broadcast_address}")
print(f"可用主机范围: {list(subnet.hosts())}\n")
if __name__ == "__main__":
main()
这个脚本将一个/24的网络划分为/26的子网,并输出每个子网的网络地址、广播地址和可用主机范围。
结语
如果你觉得文章很棒,可以转发,评论该文章;如果文章有问题,请留言或私信告诉我,我会在第一时间对内容进行调整,这将会帮助每一位想要学习网络基础的小伙伴,感谢!抱拳!