T793074 【C1155】 - IP网络
题目描述
Alex是一个IP网络管理员。他的客户拥有许多个独立的IP地址,他决定将这些IP地址归并到尽可能小的IP网络中。
每个IP地址是一个4字节的数字,按字节以点分十进制表示法写成:`“byte0.byte1.byte2.byte3”`(引号用于说明)。每个字节表示为0到255(包括0和255)的十进制数,且没有多余的前导零。
IP网络由两个4字节的数字描述——网络地址(network address)和网络掩码(network mask)。网络地址和网络掩码的表示方法与IP地址相同。
为了理解网络地址和网络掩码的意义,需要考虑它们的二进制表示。IP地址、网络地址和网络掩码的二进制表示由32位组成:
- **byte0** 的8位(二进制从高到低排列)
- 接着是 **byte1** 的8位
- 再接着是 **byte2** 的8位
- 最后是 **byte3** 的8位。
一个IP网络包含了 $2^n$ 个IP地址,其中 $0 \leq n \leq 32$。
- **网络掩码** 在二进制表示中总是从高位开始的 $32 - n$ 位设置为1,低位的 $n$ 位设置为0。
- **网络地址** 的二进制表示中前 $32 - n$ 位是任意值,后 $n$位设置为0。
一个IP网络包含所有与网络地址的前 $32 - n$ 位相同、后 $n$位任意的IP地址。如果一个IP网络包含的IP地址数量少于另一个网络,则我们认为前者的网络“更小”。
例如:
网络地址为 `194.85.160.176`,网络掩码为 `255.255.255.248` 的IP网络包含从 `194.85.160.176` 到 `194.85.160.183` 共8个IP地址(包含端点)。
输入格式
输入文件包含多个测试用例,每个测试用例的格式如下:
- 第一行是一个整数 $m$ ($1 \leq m \leq 1000$),表示有 $m$ 个IP地址。
- 接下来的 $m$ 行中,每行一个IP地址。每个IP地址可能在输入文件中出现多次。
输出格式
对于每个测试用例,输出两行描述包含所有输入IP地址的最小可能的IP网络:
- 第一行是网络地址
- 第二行是网络掩码
说明/提示
### 补充说明
输入会有多组测试数据,最后以EOF作为输入结束的标志
IP网络地址为 `194.85.160.176`,网络掩码为 `255.255.255.248` 的IP网络包含从 `194.85.160.176` 到 `194.85.160.183` 共8个IP地址(包含端点)。
IP网络地址为 `194.85.160.176`的二进制表示为: `11000010 . 01010101 . 10100000 . 10110000`
网络掩码为 `255.255.255.248`的二进制表示为:`11111111 . 11111111 . 11111111 . 11111000`
网络地址通过将IP地址与网络掩码按位与(AND)运算得到:`11000010 . 01010101 . 10100000 . 10110000` => `194.85.160.176`
在这个子网中,主机地址范围是从网络地址到广播地址之间的地址(包含网络地址和广播地址):
- 网络地址的主机部分:末尾的`000` 到 `111`,共8个IP地址,由掩码的最后的3个0控制
- 可用主机地址范围:`194.85.160.176` - `194.85.160.183`
可以简单的认为网络掩码的前n位的1用于确定的是网络地址,后m位的0用于确定网络主机的地址(n + m = 32位)
如果末尾有m位0,则可以有`0000..`(m位) - `111..`(m位)的主机地址
网络掩码的作用也可以认为是掩饰掉网络IP中的不同的信息(主机部分),将这部分置为0,保留相同的信息(网络部分),将这部分置为1
#### 如何计算多个不同IP的网络掩码
计算多个不同IP地址的网络掩码的过程是为了找到它们的**公共网络前缀**,也就是确定这些IP地址属于同一个网络的最小网络掩码。以下是详细步骤:
---
**步骤 1:将IP地址转换为二进制**
将每个IP地址转换为32位二进制表示。例如:
- **IP1**: `192.168.1.1` → `11000000.10101000.00000001.00000001`
- **IP2**: `192.168.1.5` → `11000000.10101000.00000001.00000101`
---
**步骤 2:比较每位,找出公共前缀**
从左到右比较每一位二进制数:
- 如果相同,保留该位;对应的网络掩码设置为1
- 如果不同,从此位置开始就没有公共前缀了。从第1个不同位开始到最后,网络掩码设置为0
### 网络知识补充阅读(选读)
#### IP地址和网络掩码
**IP地址**和**网络掩码**是计算机网络中非常重要的概念,用于标识设备并划分网络。
IP地址是分配给网络设备的唯一标识,用于在网络中标识一个设备的位置。
- IPv4地址由四组十进制数字组成,每组数字的范围是`0-255`,用点分隔,例如:`192.168.1.1`。
- 每个IPv4地址由**网络部分**和**主机部分**组成:
- **网络部分**:标识设备所在的网络。
- **主机部分**:标识该网络中的具体设备。
网络掩码(Subnet Mask)用于划分网络和主机的范围,帮助确定IP地址的**网络部分**和**主机部分**。
- IPv4网络掩码通常用`点分十进制`表示,例如:`255.255.255.0`。
- 每个网络掩码的作用是:
- **1**表示网络部分。
- **0**表示主机部分。
假设IP地址为`192.168.1.1`,网络掩码为`255.255.255.0`:
- 网络部分是`192.168.1`(由掩码的1决定)。
- 主机部分是`.1`(由掩码的0决定)。
IP地址和网络掩码结合可以确定设备所在的网络。例如:
- **IP地址**:`192.168.1.1`
- **网络掩码**:`255.255.255.0`
计算得到的网络地址是`192.168.1.0`,表示这个设备属于`192.168.1.0/24`的网络。
用斜杠表示网络掩码中连续的1的数量。例如:
- `255.255.255.0`可以写作`/24`。
- `255.255.0.0`可以写作`/16`。
#### 网络掩码的作用
网络掩码的主要作用是**划分网络**,帮助区分IP地址中的**网络部分**和**主机部分**,从而实现高效的网络管理和通信。
网络掩码通过将IP地址的某些位固定为网络部分,可以确定一个网络的范围。例如:
- **IP地址**:`192.168.1.1`
- **网络掩码**:`255.255.255.0`
- IP地址的前24位由掩码的`1`表示为网络部分,结果是:`192.168.1.0/24`。
- **网络范围**:`192.168.1.0`到`192.168.1.255`。
设备通信前需要判断是否在同一网络:
1. 将两台设备的IP地址分别与其网络掩码按位与(AND)运算。
2. 如果结果相同,说明它们在同一网络中,可以直接通信;否则需要通过网关通信。
比如:
- **设备A**:IP地址`192.168.1.1`,掩码`255.255.255.0`。
- **设备B**:IP地址`192.168.1.100`,掩码`255.255.255.0`。
计算网络地址:
- `192.168.1.1 & 255.255.255.0 = 192.168.1.0`
- `192.168.1.100 & 255.255.255.0 = 192.168.1.0`
结果相同,说明两台设备在同一网络中。