IPv4地址长度(4.IPv4和IPv6地址长度)

一、基本概念

IPv4地址使用32位二进制表示,即4个字节。

unsigned char ipv4[] = {192, 168, 0, 1};

如上述代码所示,常见的IPv4地址由4个字节组成,每个字节使用十进制表示,范围在0~255之间。

二、地址分类

IPv4地址按照地址范围的划分分为A、B、C、D、E五类:

  • A类:第一个字节的最高位为0,范围为1.0.0.0~126.0.0.0,使用8位表示网络号,剩下24位表示主机号。
  • B类:前两个字节的最高位为10,范围为128.0.0.0~191.255.0.0,使用16位表示网络号,剩下16位表示主机号。
  • C类:前三个字节的最高位为110,范围为192.0.0.0~223.255.255.0,使用24位表示网络号,剩下8位表示主机号。
  • D类:前四个字节的最高位为1110,范围为224.0.0.0~239.255.255.255,用于组播地址。
  • E类:前四个字节的最高位为1111,范围为240.0.0.0~255.255.255.255,保留地址。

下面的代码是使用Python来判断一个IPv4地址的类型:

def ip_address_type(ip_str):
    """判断IPv4地址的类型"""
    parts = ip_str.split('.')
    first_byte = int(parts[0])
  
    if first_byte >= 1 and first_byte = 128 and first_byte = 192 and first_byte = 224 and first_byte = 240 and first_byte <= 255:
        return 'E类'
    else:
        return '未知类型'

三、子网掩码

子网掩码用于划分一个网络中的主机号和网络号。

子网掩码的二进制表示为一串连续的1和0,其中前面的连续的1表示网络部分,后面的连续的0表示主机部分。

例如,如果IP地址为192.168.1.100,子网掩码为255.255.255.0,则该IP地址的网络地址为192.168.1.0,主机地址为100。

下面的代码是使用Python计算一个IP地址的网络地址:

def network_address(ip_str, subnet_mask_str):
    """计算IP地址的网络地址"""
    ip_parts = [int(part) for part in ip_str.split('.')]
    subnet_mask_parts = [int(part) for part in subnet_mask_str.split('.')]
  
    network_address_parts = [ip_parts[i] & subnet_mask_parts[i] for i in range(4)]
  
    return '.'.join(str(part) for part in network_address_parts)

四、CIDR

CIDR(Classless Inter-Domain Routing,无类域间路由选择)是一种比传统IP地址划分更加灵活的方法。

CIDR将网络前缀和主机号都视作二进制数字,并使用一个斜线后面跟着数字表示网络前缀的长度

例如,192.168.1.0/24表示网络前缀长度为24位,即子网掩码为255.255.255.0。

下面的代码是使用Python计算一个CIDR表示的网络地址和子网掩码:

def cidr_address(cidr_str):
    """计算CIDR表示的IP地址的网络地址和子网掩码"""
    ip_str, prefix_len_str = cidr_str.split('/')
    prefix_len = int(prefix_len_str)
  
    subnet_mask = ['0' for _ in range(32)]
    for i in range(prefix_len):
        subnet_mask[i] = '1'
  
    subnet_mask_str = '.'.join([
        str(int(''.join(subnet_mask[i:i+8]), 2))
        for i in range(0, 32, 8)
    ])
  
    network_address_str = network_address(ip_str, subnet_mask_str)
  
    return network_address_str, subnet_mask_str

五、IP地址的表示方法

除了使用十进制表示,IPv4地址还可以使用点分十六进制、点分十进制和无符号整型进行表示。

下面的代码是使用Python将一个IPv4地址转换为无符号整型:

def ipv4_to_int(ip_str):
    """将IPv4地址转换为无符号整型"""
    parts = [int(part) for part in ip_str.split('.')]
    return (parts[0] << 24) + (parts[1] << 16) + (parts[2] << 8) + parts[3]

六、总结

在网络编程中,IPv4地址是非常重要的概念。本文对IPv4地址长度从基本概念、地址分类、子网掩码、CIDR、IP地址的表示方法等多个方面进行了详细阐述,并提供了相应的代码示例。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平