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 的位数
我们需要两个信息才能计算:
- ip address
- subnet mask
subnet mask的作用是确定 network portion 和 host portion。
-
subnet mask = 1 的部分是 network portion
-
subnet mask = 0 的部分是 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 地址的:
- 10.0.0.0 - 10.255.255.255 (subnet mask = 8)
- 172.16.0.0 - 172.31.255.255 (subnet mask = 12)
- 192.168.0.0 - 192.168.255.255 (subnet mask = 16)
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
格式
- 128 bits
- hexdecimal(16进制)
- network portion - 64 bits
- interface identifier = host portion = 64 bits
和 IPv4 的区别
- subnet masking is commonly not applied
如何简写 IPv6 地址?
正常的 IPv6 地址长这样:2001:0DB8:0002:008D:0000:0000:00A5:52F5
跟 IPv4 地址(十进制)相比,确实看上去复杂很多。。
我们能不能让这个地址看起来短一点呢?
有两个方法:
-
omit leading 0s,假如一个 section = 0001,就写成 1
比如地址 2001:0DB8:0002:008D:0000:0000:00A5:52F5
简写成为 2001:DB8:2:8D:0000:0000:A5:52F5
-
假如一个 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 地址?
有三种方法:
- SLAAC:自动分配
- DHCP:找 DHCP server 要一个
- IPv6 Tunneling:在两个 router 之间建立一个 ipv6 tunnel,这样可以在 ipv4 的网络中使用 ipv6 地址
Note:这三种方法大概了解了一下,没有深入研究。
4. 结语
IPv4 的 subnet masking 之前一直困扰着我,但是现在看起来也没有那么难~又攻克了一个自己的知识盲区,(^-^)V