【网络协议-4】IP 基础知识(二)

Demon.Lee 2021年10月31日 1,160次浏览

本文是对《图解TCP/IP》中第 4 章相关内容的学习总结。

IP 地址也算最熟悉的陌生人之一吧,比如个人使用的 Windows 电脑,经常需要配置 IP 地址,子网掩码,默认网关等等,那这些地址到底有啥作用呢。在前一篇文章中,笔者梳理了 IP 地址的定义和基础分类,在这篇笔记中,我们就来聊一聊子网掩码,默认网关等各种概念,争取跟它们做上朋友。

广播地址

前面提到 IP 地址(IPv4)按照网络号(网络标识)和主机号(主机标识)进行划分,传统上可以将 32 bit 的 IP 地址划分为5类,即 A~E 类。

而广播地址就是将 IP 地址中主机标识部分的二进制位全设置为 1,比如下面的 192.168.0.8 是一个 C 类地址,其主机标识部分的长度为 8,故广播地址就是 192.168.0.255。广播地址是给同一链路(网段)中互联的主机发送广播消息使用的。

# IP 地址
11000000. 10101000. 00000000. 00001000
192.      168.      0.        8

# 广播地址
11000000. 10101000. 00000000. 11111111
192.      168.      0.        255

广播根据 IP 包是否在不同的网络(即能否穿越路由器)之间传输而划分为本地广播和直接广播。本地广播只能在当前网段内广播消息,广播地址(比如 192.168.0.255)的数据包会被路由器屏蔽,不会发给 192.168.0(网络标识) 以外的网段。而直接广播通过路由器相关设置(一般因为安全问题不建议这么做),可跨网段广播消息。比如 192.168.0.8 向 192.168.1.255 发送数据,此时 192.168.1.1 ~ 192.168.1.254 对应的主机都能收到消息。

读者可能有疑问,给 192.168.1.255(广播地址)发送消息时,收到消息的是 192.168.1.1 ~ 192.168.1.254 这 254 台主机,还有一台 192.168.1.0 呢?与广播地址类似,主机标识部分中的二进制位设置为全 0 的 IP 地址也是保留地址,即这个网段的网络地址。

子网掩码与 CIDR

在前面的文章中,笔者在最后提到了一个问题:A,B 和 C 类网络,一个网段可以分配的 IP 地址数要么太大,要么又比较小。比如 B 类地址的一个网段中可以分配 65534 个 IP 地址,可现实中需要这么多主机进行互联的组织是很少的。假设一个组织需要互联的主机数为 1000 的话,如果给它分配一个 B 类地址的网段,那么这个网段中额外的 64534 个 IP 地址配额就完全浪费了。

那有没有一种方法可以根据实际情况进行按需分配 IP 地址呢?有的,它就是 CIDR。

既然 A 类,B 类 和 C 类对应的子网网络粒度太粗,那么就从主机标识中拿出一部分划到网络标识里,或者反过来。网络标识段变长了,一个网段中的主机标识段也就变短了,这样就将一个大网络进一步细化成了多个不同的子网络。这种划分的机制,需要有一个识别码来标识一个 IP 地址中的网络号部分,这个识别码就叫“子网掩码”。

子网掩码如果用二进制表示,也是一个 32 bit 的数字。其对应 IP 地址网络号部分的二进制位都为 1,对应 IP 地址主机号部分的二进制位都为 0。

与 IP 地址的表示类似,通常情况下,我们会把 32 bit 的子网掩码转成十进制。这里仍然以 192.168.0.8 这个 IP 地址为例,假设它的网络号部分占 26 位,主机号部分则占 6 位,那么此时它就不再是一个 C 类地址了。

# IP 地址(前 26 位为网络号)
11000000. 10101000. 00000000. 00 001000
192.      168.      0.        8

# 对应的子网掩码
11111111. 11111111. 11111111. 11 000000
255.      255.      255.      192

# 对应的广播地址
11000000. 10101000. 00000000. 00 111111
192.      168.      0.        63

为什么子网掩码要这样定义呢?细心的同学可能已经看出来了,当我们把子网掩码与 IP 地址按位进行与计算,就得到了网络号。如下示例演示了计算过程,26 位网络号长度的 IP 地址 192.168.0.67,其网络号是 192.168.0.64。

# IP 地址 192.168.0.67(前 26 位为网络号)
11000000. 10101000. 00000000. 01 000011
# 对应的子网掩码
11111111. 11111111. 11111111. 11 000000
# 按位与之后
11000000. 10101000. 00000000. 01 000000
# 换算成十进制
192.      168.      0.        64

除了上面独立的表示方式,子网掩码还可以用另一种更简单的方式来表达,即在 IP 地址后面追加 /{网络号长度}。比如上面的 192.168.0.8,其网络号长度为 26,那就表示为:

# IP 地址 192.168.0.8(前 26 位为网络号)
192.168.0.8/26

# IP 地址 192.168.0.0(前 24 位为网络号)
192.168.0.0/24
192.168.0/24  # 可以省略后面的 0 

有了子网掩码后,通过扩大(或缩小)网络号(或主机号),来调整子网络的大小。比如原来的 192.168.0.0/24 是一个 C 类网络,其一个网段(比如 192.168.0.0 ~ 192.168.0.255)可以分配的 IP 地址个数为 254 个。但网络被重新划分为 192.168.0.0/26 之后,192.168.0.0 ~ 192.168.0.63,192.168.0.64 ~ 192.168.0.127,192.168.0.128 ~ 192.168.0.191,192.168.0.192 ~ 192.168.0.255 不再是一个子网了,而是 4 个子网,每个子网可以分配的 IP 地址个数为 62 个。同样,也可以将多个 C 类网络,合并到一个大的子网中,这样一个组织中可以分配的主机数就可以不断翻倍了。

也就是说,通过这种划分方式,IP 网络实现了动态分配,以适应不同大小的组织类型。而这种方式,有一个专业名词,叫做 CIDR(Classless Inter-Domain Routing,无类型域间选路)

但这种分配方式还不是完美的,因为一个组织内不同部门的规模各不相同,有的需要 50 台主机,有的只需要 20 台。如果都使用统一的标准,同样会浪费 IP 地址,并且传输效率不高。
以上面的 192.168.0.0/26 为例,其新增的 4 个子网(192.168.0.0 ~ 192.168.0.63,192.168.0.64 ~ 192.168.0.127,192.168.0.128 ~ 192.168.0.191,192.168.0.192 ~ 192.168.0.255)对应的子网掩码长度都是固定的,即 26 位。

于是便有了 VLSM(Variable Length Subnet Mark,可变成子网掩码), 前面固定长度的子网掩码就叫 FLSM(Fixed Length Subnet Mark)。VLSM 可以将一个网段划分为不同长度的子网,而不是统一长度的子网,所以子网的个数不再是 2^n(n 为主机部分划到网络部分的比特位数)了。比如 192.168.0.0/26 可以划分为:

  • 192.168.0.0/26,网络地址范围为:192.168.0.0 ~ 192.168.0.63,可用主机数 62
  • 192.168.0.64/27,网络地址范围为:192.168.0.64 ~ 192.168.0.95,可用主机数 30
  • 192.168.0.96/28,网络地址范围为:192.168.0.96 ~ 192.168.0.111,可用主机数 14
  • ......

当然,要实现 CIDR,VLSM 等,需要相关路由协议的支撑,比如 BGP,RIP2,OSPF 等,后续有机会,笔者会对它们进行梳理,这里有个印象即可。

公有/私有 IP 地址

IPv4 地址的总数是固定的,如果给每一台主机都分配一个 IP 地址的话,那地址很快就会用完。于是便有了公有地址和私有地址,其中给局域网分配的 IP 地址就是私有地址,而接入互联网的 IP 地址就是公有地址,或者叫全局地址。

私有地址,不同的局域网可以重复使用,比如我们家里使用的宽带路由器,基本上都是 192.168.xx.xx。这个放在现实生活中也很好理解,比如不同小区中的楼号,大家都是 10 栋 1 单元,但出了小区,就要带上小区名了。以下表格列出了官方分配的私有 IP 地址范围:

分类
IP 地址范围私有 IP 地址范围CIDR 表示
A0.0.0.0 ~ 127.255.255.25510.0.0.0 ~ 10.255.255.25510/8
B128.0.0.0 ~ 191.255.255.255172.16.0.0 ~ 172.31.255.255172.16/12
C192.0.0.0 ~ 223.255.255.255192.168.0.0 ~ 192.168.255.255192.168/16

除了上面三类私有地址,以及 0/8(本网络上的某台主机),127/8(内部主机回环地址)两个保留地址段外,其他的地址都是公有地址。公有地址在互联网中是全局唯一的,但不能免费获取,需要向相关机构购买。不过,作为普通使用者一般都直接通过购买 ISP 的服务而自动获得一个公网 IP ,比如家里的宽带或是公有云上的服务器等,换句话说,就是 ISP 帮我们搞定了公网 IP。

默认网关与 DNS 服务器地址

在《网络的构成要素与分类》这篇文章中,笔者也提到了网关,它是一个在传输层上进行协议转换和数据转发的设备。而这里说的网关,其实是指一个网络到达另一个网络的关口,更多的是在 OSI 参考模型的第三层,即网络层上。比如 A 网段内的主机 A1 要给 B 网段的主机 B1 发送数据,数据包先要发给 A 网段的网关,网关再通过路由协议,从某个口将数据发送给 B 网段的网关,B 网段的网关再将数据发给主机 B1。

大多数情况下,这里说的网关是一台路由器(或是有路由功能的服务器,代理服务器等),一台主机可以有多个网关,而默认网关就是给当前主机配置网络包的默认路由方式。文章开头那张图上配置的默认网关为 192.168.xx.254,即给网关路由器配置的 IP 为 192.168.xx.254。

最后简单提一下 DNS 服务器地址,它是用来解析域名的,比如 www.baidu.com 这个网址,其对应的实际公网 IP 地址是多少呢?到 DNS 服务器上就可以查到了,查到之后,我们才能跟它进行通信。因为域名虽然好记,但 TCP/IP 整个网络协议栈的底层用的还是 MAC 地址和 IP 地址。

小结

1、CIDR,VLSM 等技术在一定程度上缓解了 IPv4 全局地址不够用的困境,另外还有 NAT,代理服务器等技术。当然,现在 IPv4 还是不够,所以有了 IPv6。

2、很多组织都是一个局域网,为了最大化利用 IP 地址,便分配出了私有地址,私有地址在不同组织内可以重复利用。

3、货物发往国外,要走海关,同样,数据包想走出当前网段,要先发往网关,网关即出口。

参考资料