iugo / blog

https://iugo.github.io/blog
3 stars 0 forks source link

什么是 IP 网段 CIDR #51

Open iugo opened 3 years ago

iugo commented 3 years ago

什么是 IP 网段

先说 IPv4, 我们知道 IP 比如 8.8.8.8, 127.0.0.1, 192.168.1.1 这样.

首先将所有 IP 写为这种格式:

(0~255).(0~255).(0~255).(0~255)

之所以是 0 到 255 是因为储存的容器为 8 位(bit). 所以我们也能写成:

(2 ** 8).(2 ** 8).(2 ** 8).(2 ** 8)

网段的意思就是固定前面多少, 比如 127.0.0.0/8 就代表固定前 8 位, 前 8 位是 127,

127.(2 ** 8).(2 ** 8).(2 ** 8), 或者 127.*.*.*.

那么 /8, /16, /24 就容易理解了.

/36 呢? 就只代表自己.

/19 呢? 我们就要拆 IP 细说了, 我们将 x 表示为 0 或者 1, 那么全部 IP 为:

xxxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx

此时我们就完全理解 IPv4 的地址是 32 位, 每 8 位一组共 4 组.

比如 119.27.0.0/19 就可以先写出 IP 的二进制形式, 然后固定前面 19 位:

01110111.00011011.00000000.00000000

01110111.00011011.000xxxxx.xxxxxxxx

因为是固定前面多少位, 所以如果出现如 119.27.0.1/19 这样的 IP 段则是没有意义的, 原因就是后面的 0 会被变量 x 替代, 但如果后面出现了 1, 这个 1 无法被保留.

我们说的 /24 这样的 IP 段表述并不能表述任意子网, 只是为了分配.

然后再说 IPv6, 地址上的不同就是共有 128 位, 每 16 位一组共 8 组. 为了区分, 写法上不用 . 隔开, 而是使用 :. 为了缩短写作长度, 使用 16 进制数而非 10 进制.

二进制所有地址可以写为:

xxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxx :xxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxx

16 位即 xxxxxxxxxxxxxxxx 表示的数为 0~65535, 如果使用 y 表示 0~f, 可以写为:

yyyy:yyyy:yyyy:yyyy:yyyy:yyyy:yyyy:yyyy

这里有两个 16, 一个是地址每组为 16 位, 一个是使用 16 进制表示, 二者无关, 别搞混.

鉴于 IPv6 地址比较长, 我们可以使用 :: 表示四组为 0 的地址来简写.

比如 ::ffff:0.0.0.0/96 来表示所有 IPv4 地址映射.

小工具: https://www.ultratools.com/tools/netMask