Luna Tech

Tutorials For Dummies.

IP Addressing

2021-08-18


0. 前言

上一篇讲了 networking 每个 layer 的关键部分和作用,这篇着重来讲一下 ip 地址相关的知识。


1. IPv4 and IPv6

区别

ipv4, 32 bits

ipv6,128 bits

为什么要有 ipv6?

因为 ipv4 的位数不够用了,network device 越来越多了。


2. IPv4

格式

32 bit 可以分为 4 组 8 bit 的数字。

00000000.00000000.00000000.00000000

我们一般会把 binary 数字转化成 decimal 数字。

比如 192.168.10.100 这种形式。

network portion and host portion

32 bit 的地址分为两部分,network portion 和 host portion。

每个 portion 具体占多少位呢?

1995年以前,人们采用的是 classful addressing,就是规定好每个 ip range 的 network portion 所占的位数;

后来改成了 classless addressing,这种方式可以采用任意位数作为 network portion。

如何计算 network portion 的位数

我们需要两个信息才能计算:

  1. ip address
  2. subnet mask

subnet mask的作用是确定 network portion 和 host portion。

比如下面这个例子,subnet = 0 的部分就是 host portion,也就是 00011001 这部分。

Decimal Binary
IPv4 Address 192.168.10.25 11000000 10101000 00001010 00011001
Subnet Mask 255.255.255.0 11111111 11111111 11111111 00000000

Broadcast address and network address

IP 广播地址是用来发送信息给所有在同一个 network address 的设备的(layer 3 用的较少,layer 2 用的比较多 - 也就是 MAC 广播地址)

上面那个例子的广播地址就是 host portion 全部为 1 的地址,网络地址就是 host portion 全部为 0 的地址。

Decimal Binary Broadcast Address Network Address
IPv4 Address 192.168.10.25 11000000 10101000 00001010 00011001 192.168.10.255 192.168.10.0
Subnet Mask 255.255.255.0 11111111 11111111 11111111 00000000

CIDR notation

我们经常会看到 192.168.10.25/24 这种写法,这其实就是把 subnet mask 的位数告诉了我们(网络地址是前24位)。

Private IP address

在 LAN 中我们应该用 private ip address 来识别设备,还记得吗?我们局域网中的设备跟外界交流需要经过 router 来进行 network address translation。

用 private ip 也可以更好地保护我们的设备隐私性。

有三个字段是保留为私人 ip 地址的:

Subnetting

假如 subnet mask 占的位数很少,比如 10.0.0.0 - 10.255.255.255 (subnet mask = 8) 这个字段,我们可以进一步把这个 subet 分成多个小的 subnet。

怎么分呢?只要改变 subnet mask 的位数就可以了。

比如分一个 subnet mask = 10 的 subnet。

在分割的时候需要注意 host 地址不能有重合,常用方法是 VLSM - Variable Length Subnet Masking(这个暂时没研究过)。


3. IPv6

格式

和 IPv4 的区别

如何简写 IPv6 地址?

正常的 IPv6 地址长这样:2001:0DB8:0002:008D:0000:0000:00A5:52F5

跟 IPv4 地址(十进制)相比,确实看上去复杂很多。。

我们能不能让这个地址看起来短一点呢?

有两个方法:

  1. omit leading 0s,假如一个 section = 0001,就写成 1

    比如地址 2001:0DB8:0002:008D:0000:0000:00A5:52F5

    简写成为 2001:DB8:2:8D:0000:0000:A5:52F5

  2. 假如一个 section 里面有四个零,要怎么简写呢?

    第一种方法是保留一个0 -> 2001:DB8:2:8D:0:0:A5:52F5

    第二种方法是合并全为 0 的 section,写成 ::

    在这个例子里面我们有 2 个连续的 0 的 section,可以合并为 2001:DB8:2:8D::A5:52F5

Q:假如有 4 个连续为 0 的 section 呢?

A:也一样是用 :: 来替代。比如 2001:db8:10::100 其实就是 2001:0db8:0010:0000:0000:0000:0000:0100。

Q:假如有 4 个 section,两两相连怎么办?

A:只能简写一个连续的 section,不然我们不知道合并的区域到底有几个 0。比如 2001:0db8:0000:0000:0010:0000:0000:0100 不能写成 2001:db8::0010::0100,可以写成 2001:db8:0:0:0010::0100

local and global IPv6 address

为什么我们会有两个 ipv6 地址呢?

第一个是 global 地址,也就是 layer 3 的地址,而第二个则是 layer 2 的地址,类似 MAC address,只在 LAN 里面使用。

假如我们要跟外界沟通的话,需要用第一个(global)ip address。

如何获取 ipv6 地址?

有三种方法:

Note:这三种方法大概了解了一下,没有深入研究。


4. 结语

IPv4 的 subnet masking 之前一直困扰着我,但是现在看起来也没有那么难~又攻克了一个自己的知识盲区,(^-^)V