# IP的知识

By [leaf](https://paragraph.com/@leaf-6) · 2022-12-01

---

一、对 IP地址

基本的认识 IP地址

在 TCP/IP地址 参考模型中处于第三层，也就是网络层。

网络层的主要作用是：实现主机与主机之间的通信，也叫点对点（end to end）通信。

![](https://storage.googleapis.com/papyrus_images/0ff6582fbb1555ef6876a8b59f42e5fd3b54fe882b402c34e251b5ad12b403d2.png)

*   网络层与数据链路层有什么关系呢？ 有的小伙伴分不清 IP地址（网络层） 和 MAC （数据链路层）之间的区别和关系。
    

其实很容易区分，在上面我们知道 IP地址 的作用是主机之间通信用的，而 MAC 的作用则是实现「直连」的两个设备之间通信，而 IP地址 则负责在「没有直连」的两个网络之间进行通信传输。

举个生活的栗子，小林要去一个很远的地方旅行，制定了一个行程表，其间需先后乘坐飞机、地铁、公交车才能抵达目的地，为此小林需要买飞机票，地铁票等。

飞机票和地铁票都是去往特定的地点的，每张票只能够在某一限定区间内移动，此处的「区间内」就如同通信网络中数据链路。

在区间内移动相当于数据链路层，充当区间内两个节点传输的功能，区间内的出发点好比源 MAC 地址，目标地点好比目的 MAC 地址。

整个旅游行程表就相当于网络层，充当远程定位的功能，行程的开始好比源 IP地址，行程的终点好比目的 IP地址。

![](https://storage.googleapis.com/papyrus_images/3f305361d12c79571917c7e3193b7f14dd7a0c32e27def7373d1c5e3977288fa.png)

如果小林只有行程表而没有车票，就无法搭乘交通工具到达目的地。相反，如果除了车票而没有行程表，恐怕也很难到达目的地。因为小林不知道该坐什么车，也不知道该在哪里换乘。

因此，只有两者兼备，既有某个区间的车票又有整个旅行的行程表，才能保证到达目的地。与此类似，计算机网络中也需要「数据链路层」和「网络层」这个分层才能实现向最终目标地址的通信。

还有重要一点，旅行途中我们虽然不断变化了交通工具，但是旅行行程的起始地址和目的地址始终都没变。

其实，在网络中数据包传输中也是如此，源IP地址和目标IP地址在传输过程中是不会变化的（前提：没有使用 NAT 网络），只有源 MAC 地址和目标 MAC 一直在变化。

二、IPv4协议 在 TCP/IP地址 网络通信时，为了保证能正常通信，每个设备都需要配置正确的 IP地址，否则无法实现正常的通信。

IPv4 地址由 32 位正整数来表示，IP地址在计算机是以二进制的方式处理的。

而人类为了方便记忆采用了点分十进制的标记方式，也就是将 32 位 IP地址以每 8 位为组，共分为 4 组，每组以「.」隔开，再将每组转换成十进制

![](https://storage.googleapis.com/papyrus_images/aa29c70c99ad3ad34fd1f7f55d3f1822dd9963a1760acb8ccd0deaa7406f6505.png)

那么，IP地址最大值也就是

![](https://storage.googleapis.com/papyrus_images/b2430a158cac739d83761501a396297696585cf86fa013e3c1a8c563807aa89e.png)

理论上，最大允许 43 亿台计算机连接到网络。 实际上，IP地址并不是根据主机台数来配置的。像服务器、路由器等设备都是有 2 个以上的网卡，也就是它们会有 2 个以上的 IP地址。

![](https://storage.googleapis.com/papyrus_images/0441b3bc5095c97a698c97258882b845368512214999823eec6f3f0dccc0be65.png)

因此，让 43 亿台计算机全部连网其实是不可能的，更何况 IP地址是由「网络标识」和「主机标识」这两个部分组成的，所以实际能够连接到网络的计算机个数更是少了很多。

可能有的小伙伴提出了疑问，现在不仅电脑配了 IP地址， 手机、平板 等电子设备都配了 IP地址 呀，照理来说肯定会超过 43 亿啦，那是怎么能够支持这么多 IP地址 的呢？

因为会根据一种可以更换 IP地址的技术 NAT，使得可连接计算机数超过 43 亿台。 NAT 技术后续会进一步讨论和说明。

IP地址的分类 互联网诞生之初，IP地址显得很充裕，于是计算机科学家们设计了分类地址。

IP地址分类成了 5 种类型，分别是 A 类、B 类、C 类、D 类、E 类。

![](https://storage.googleapis.com/papyrus_images/e75cd1b6968f66974253e3e1fb3a94775e4733139af6f0bdfe89c7dbd1ccce67.png)

上图中黄色部分为分类号，用以区分 IP地址类别。

什么是 A、B、C 类地址？

其中对于 A、B、C 类主要分为两个部分，分别是网络号和主机号。这很好理解，好比小林是 A 小区 1 栋 101 号，你是 B 小区 1 栋 101 号。

我们可以用下面这个表格， 就能很清楚的知道 A、B、C 分类对应的地址范围、最大主机个数。

![](https://storage.googleapis.com/papyrus_images/d8afb1dfafa091e7c5bb7b914043f3e393190f9346cabe08e5f318565b48da7a.png)

为什么要减 2 呢？因为在 IP地址中，有两个 IP地址 是特殊的，分别是主机号全为 1 和 全为 0 地址。

![](https://storage.googleapis.com/papyrus_images/92feea0eac353885e4d4af26bec82a38a356fde44d498268256271db0c146083.png)

主机号全为 1 指定某个网络下的所有主机，用于广播 主机号全为 0 指定某个网络 因此，在分配过程中，应该去掉这两种情况。

广播地址有什么用？

广播地址用于在同一个链路中相互连接的主机之间发送数据包。

学校班级中就有广播的例子，在准备上课的时候，通常班长会喊：“上课， 全体起立！”，班里的同学听到这句话是不是全部都站起来了？这个句话就有广播的含义。

当主机号全为 1 时，就表示该网络的广播地址。例如把 172.20.0.0/16 用二进制表示如下：

将这个地址的主机部分全部改为 1，则形成广播地址：

再将这个地址用十进制表示，则为 172.20.255.255。

广播地址可以分为本地广播和直接广播两种。

在本网络内广播的叫做本地广播。例如网络地址为 192.168.0.0/24 的情况下，广播地址是 192.168.0.255 。因为这个广播地址的包会被路由器屏蔽，所以不会到达 192.168.0.0/24 以外的其他链路上。 在不同网络之间的广播叫做直接广播。例如网络地址为 192.168.0.0/24 的主机向 192.168.1.255/24 的目标地址发送包。收到这个包的路由器，将数据转发给 192.168.1.0/24，从而使得所有 192.168.1.1~192.168.1.254 的主机都能收到这个包。（由于直接广播有一定的安全问题，多数情况下会在路由器上设置为不转发）

![](https://storage.googleapis.com/papyrus_images/2f5f194cacd3203f9ce9b22e09fd38c42ca948a2ad5a744c1c7b88326c8bc155.png)

什么是 D、E 类地址？

D 类和 E 类地址是没有主机号的，不可用于主机 IP地址。D 类常被用于多播，E 类是预留的分类，暂时未使用

![](https://storage.googleapis.com/papyrus_images/67e2580ab8047d975b00637170ed6c8ca1a729db24f86a09917f99154c8154d8.png)

多播地址用于什么？

多播用于将包发送给特定组内的所有主机。

还是举班级的栗子，老师说：“最后一排的同学，上来做这道数学题。”，老师指定的是最后一排的同学，也就是多播的含义了。

由于广播无法穿透路由，若想给其他网段发送同样的包，就可以使用可以穿透路由的多播

![](https://storage.googleapis.com/papyrus_images/00dcad605d29493fc59d2b11c5aea5567d64c5dc05158098be210f4e987a3898.png)

*   多播使用的 D 类地址，其前四位是 1110 就表示是多播地址，而剩下的 28 位是多播的组编号。
    

从 224.0.0.0 ~ 239.255.255.255 都是多播的可用范围，其划分为以下三类：

224.0.0.0 ~ 224.0.0.255 为预留的组播地址，只能在局域网中，路由器是不会进行转发的。 224.0.1.0 ~ 238.255.255.255 为用户可用的组播地址，可以用于 Internet 上。 239.0.0.0 ~ 239.255.255.255 为本地管理组播地址，可供内部网在内部使用，仅在特定的本地范围内有效。 IP地址 分类的优点

不管是路由器还是主机解析到一个 IP地址时候，我们判断其 IP地址的首位是否为 0，为 0 则为 A 类地址，那么就能很快的找出网络地址和主机地址。

其余分类判断方式参考如下图：

![](https://storage.googleapis.com/papyrus_images/8e438d216af4a7e117ca22cb88e2a30132925b6893adb26278afe20b740e9120.png)

所以，这种分类地址的优点就是简单明了、选路（基于网络地址）简单。

IP地址 分类的缺点

缺点一 同一网络下没有地址层次，比如一个公司里用了 B 类地址，但是可能需要根据生产环境、测试环境、开发环境来划分地址层次，而这种 IP地址 分类是没有地址层次划分的功能，所以这就缺少地址的灵活性。

缺点二 A、B、C类有个尴尬处境，就是不能很好的与现实网络匹配。

C 类地址能包含的最大主机数量实在太少了，只有 254 个，估计一个网吧都不够用。

而 B 类地址能包含的最大主机数量又太多了，6 万多台机器放在一个网络下面，一般的企业基本达不到这个规模，闲着的地址就是浪费。

这两个缺点，都可以在 CIDR (无类别域间路由)解决。

无类别域间路由(CIDR) 正因为 IP地址 分类存在许多缺点，所以后面提出了无分类地址的方案，即 CIDR。

这种方式不再有分类地址的概念，32 比特的 IP地址被划分为两部分，前面是网络号，后面是主机号。

怎么划分网络号和主机号的呢？

表示形式 a.b.c.d/x，其中 /x 表示前 x 位属于网络号， x 的范围是 0 ~ 32，这就使得 IP地址更加具有灵活性。

比如 10.100.122.2/24，这种地址表示形式就是 CIDR，/24 表示前 24 位是网络号，剩余的 8 位是主机号

![](https://storage.googleapis.com/papyrus_images/05934d3aa064ac34cc428fd482fb70532444f2ea5f7f6548e455130b1aea434f.png)

还有另一种划分网络号与主机号形式，那就是子网掩码，掩码的意思就是掩盖掉主机号，剩余的就是网络号。将子网掩码和 IP地址按位计算 AND，就可得到网络号。

![](https://storage.googleapis.com/papyrus_images/41922cd4059552ebc4fd73c5de6ed6a1e5a37e796a18a66d299467017efd36e6.png)

为什么要分离网络号和主机号？

因为两台计算机要通讯，首先要判断是否处于同一个广播域内，即网络地址是否相同。如果网络地址相同，表明接受方在本网络上，那么可以把数据包直接发送到目标主机。

路由器寻址工作中，也就是通过这样的方式来找到对应的网络号的，进而把数据包转发给对应的网络内

![](https://storage.googleapis.com/papyrus_images/11b2f3adf6271679696d508e1a0ce07213ee464f3dbc143830d2b8008d75b646.png)

怎么进行子网划分？

在上面我们知道可以通过子网掩码划分出网络号和主机号，那实际上子网掩码还有一个作用，那就是划分子网。

子网划分实际上是将主机地址分为两个部分：子网网络地址和子网主机地址。形式如下：

![](https://storage.googleapis.com/papyrus_images/f936bc4856776384a96131be2f03bad7dbb89e848c156381523b4e93f84c537f.png)

未做子网划分的 IP地址：网络地址＋主机地址 做子网划分后的 IP地址：网络地址＋（子网网络地址＋子网主机地址） 假设对 C 类地址进行子网划分，网络地址 192.168.1.0，使用子网掩码 255.255.255.192 对其进行子网划分。 C 类地址中前 24 位是网络号，最后 8 位是主机号，根据子网掩码可知从 8 位主机号中借用 2 位作为子网号。

![](https://storage.googleapis.com/papyrus_images/ec4bc2d0fc3ba4ae272c8a25d04f5d03c872612daedaa7e042a2fc56006c9656.png)

于子网网络地址被划分成 2 位，那么子网地址就有 4 个，分别是 00、01、10、11，具体划分如下图：

![](https://storage.googleapis.com/papyrus_images/5875f421b399558d99841bebdb06bb6b85150727f6c6a4a130129da7b7e34dbb.png)

划分后的 4 个子网如下表格：

![](https://storage.googleapis.com/papyrus_images/818e11600990a3df28f450f5a6c12bd47e26b6962f40ecee093886d2e5fb54a9.png)

公有 IP地址与私有 IP地址 在 A、B、C 分类地址，实际上有分公有 IP地址和私有 IP地址

![](https://storage.googleapis.com/papyrus_images/e316246f4f69db97c78ae4ca779b5fd909974a6dbb20b7854f2b3d2e9d2b314a.png)

平时我们办公室、家里、学校用的 IP地址，一般都是私有 IP地址。因为这些地址允许组织内部的 IT 人员自己管理、自己分配，而且可以重复。因此，你学校的某个私有 IP地址和我学校的可以是一样的。

就像每个小区都有自己的楼编号和门牌号，你小区家可以叫 1 栋 101 号，我小区家也可以叫 1 栋 101，没有任何问题。但一旦出了小区，就需要带上中山路 666 号（公网 IP地址），是国家统一分配的，不能两个小区都叫中山路 666。

所以，公有 IP地址是有个组织统一分配的，假设你要开一个博客网站，那么你就需要去申请购买一个公有 IP地址，这样全世界的人才能访问。并且公有 IP地址基本上要在整个互联网范围内保持唯一

![](https://storage.googleapis.com/papyrus_images/331addca958216492e403f783d44b6ad5dee62b41d590f366dfc6f5755fec7a5.png)

公有 IP地址由谁管理呢？

私有 IP地址通常是内部的 IT 人员管理，公有 IP地址是由 ICANN 组织管理，中文叫「互联网名称与数字地址分配机构」。

IANA 是 ICANN 的其中一个机构，它负责分配互联网 IP地址，是按洲的方式层层分配。

![](https://storage.googleapis.com/papyrus_images/db6928d18e8d01df9d316697108db5b1ce13a6c25dc173c525060c323ad1ee11.png)

ARIN 北美地区 LACNIC 拉丁美洲和一些加勒比群岛 RIP地址E NCC 欧洲、中东和中亚 AFRINIC 非洲地区 APNIC 亚太地区 其中，在中国是由 CNNIC 的机构进行管理，它是中国国内唯一指定的全局 IP地址管理的组织。 IP地址与路由控制 IP地址的网络地址这一部分用于进行路由控制。

路由控制表中记录着网络地址与下一步应该发送至路由器的地址。在主机和路由器上都会有各自的路由器控制表。

在发送 IP 包时，首先要确定 IP 包首部中的目标地址，再从路由控制表中找到与该地址具有相同网络地址的记录，根据该记录将 IP 包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录，就选择相同位数最多的网络地址，也就是最长匹配。

下面以下图的网络链路作为例子说明：

![](https://storage.googleapis.com/papyrus_images/bb5f17748fb94d411231df490cf79741825bd1731bb588db1dc4823d9a0ebb69.png)

主机 A 要发送一个 IP 包，其源地址是 10.1.1.30 和目标地址是 10.1.2.10，由于没有在主机 A 的路由表找到与目标地址 10.1.2.10 相同的网络地址，于是包被转发到默认路由（路由器 1 ） 路由器 1 收到 IP 包后，也在路由器 1 的路由表匹配与目标地址相同的网络地址记录，发现匹配到了，于是就把 IP 数据包转发到了 10.1.0.2 这台路由器 2 路由器 2 收到后，同样对比自身的路由表，发现匹配到了，于是把 IP 包从路由器 2 的 10.1.2.1 这个接口出去，最终经过交换机把 IP 数据包转发到了目标主机 本机使用一个特殊的 IP 地址 127.0.0.1， 称为环回地址。与该地址具有相同意义的是一个叫做 localhost 的主机名。使用这个 IP 或主机名时，数据包不会流向网络。

IP 的分片与重组 每种数据链路的最大传输单元 （MTU） 都是不相同的，如 FDDI 数据链路 MTU 为4352、以太网的 MTU 是 1500 字节等。

每种数据链路的 MTU 之所以不同，是因为每个不同类型的数据链路的使用目的不同。使用目的不同，可承载的 MTU 也就不同。

其中，我们最常见数据链路是以太网，它的 MTU 是 1500 字节。

那么当 IP 数据包大小大于 MTU 时， IP 数据包就会被分片。

经过分片之后的 IP 数据包在被重组的时候，只能由目标主机进行，路由器是不会进行重组的。

假设发送方发送一个 4000 字节的大数据包，若要传输在以太网链路，则需要把数据包分片成 3 个小数据包进行传输，再交由接收方重组成大数据包

![](https://storage.googleapis.com/papyrus_images/58dce2aa371e9a67cfdba9ef3840d5f1afac7a8bcf69637f81f2eb50500caac8.png)

分片传输中，一旦某个分片丢失，则会造成整个 IP 数据报作废，所以 TCP 引入了最大分段大小（ MSS） 也就是在 TCP 层进行分片不由 IP 层分片，所以对于 UDP 我们尽量不要发送一个大于 MTU 的数据报文。

IPv6地址 最后再来谈谈IPv6.

IPv4 的地址是 32 位的，大约可以提供 42 亿个地址，但是早在 2011 年 IPv4 地址就已经被分配完了。

但是 IPv6 的地址是 128 位的，这可分配的地址数量是大的惊人，据说 IPv6 可以保证地球上的每粒沙子都能被分配到一个 IP 地址。

但 IPv6 除了有更多的地址之外，还有更好的安全性和扩展性，说简单点就是 IPv6 相比于 IPv4 能带来更好的网络体验。

但是因为 IPv4 和 IPv6 不能相互兼容，所以不但要我们电脑、手机之类的设备支持，还需要网络运营商对现有的设备进行升级，所以这可能是 IPv6 普及率比较慢的一个原因。

IPv6 的亮点 IPv6 不仅仅只是可分配的地址变多了，它还有非常多的亮点。

IPv6 可自动配置，即使没有 DHCP 服务器也可以实现自动分配IP地址，真是便捷到即插即用啊。 IPv6 包头包首部长度采用固定的值 40 字节，去掉了包头校验和，简化了首部结构，减轻了路由器负荷，大大提高了传输的性能。 IPv6 有应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能，大大提升了安全性。 ... IPv6 地址的标识方法 IPv4 地址长度共 32 位，是以每 8 位作为一组，并用点分十进制的表示方式。

IPv6 地址长度是 128 位，是以每 16 位作为一组，每组用冒号 「:」 隔开。

![](https://storage.googleapis.com/papyrus_images/2834d1660a1a79bffc1921e9508b1af3c879ba4443cf49f6bf64f61082e930c6.png)

如果出现连续的 0 时还可以将这些 0 省略，并用两个冒号 「::」隔开。但是，一个 IP 地址中只允许出现一次两个连续的冒号。

![](https://storage.googleapis.com/papyrus_images/5ff1ba5b43e6d97b48dd4ccc20f64cbb06e71a46d1c13f8912ebd0ab8446bfaf.png)

Pv6 地址的结构 IPv6 类似 IPv4，也是通过 IP 地址的前几位标识 IP 地址的种类。

IPv6 的地址主要有以下类型地址：

单播地址，用于一对一的通信 组播地址，用于一对多的通信 任播地址，用于通信最近的节点，最近的节点是由路由协议决定 没有广播地址

![](https://storage.googleapis.com/papyrus_images/7dfc4a1c5d045e402b063875a3d3f0b354911f9f88a7611425be6f9942f4f102.png)

IPv6 单播地址类型 对于一对一通信的 IPv6 地址，主要划分了三类单播地址，每类地址的有效范围都不同。

在同一链路单播通信，不经过路由器，可以使用链路本地单播地址，IPv4 没有此类型 在内网里单播通信，可以使用唯一本地地址，相当于 IPv4 的私有 IP 在互联网通信，可以使用全局单播地址，相当于 IPv4 的公有 IP

![](https://storage.googleapis.com/papyrus_images/b467e498d56ad797f18bbb4a712fe66fae6a80d11c17a33ed0dce28fe18936ae.png)

---

*Originally published on [leaf](https://paragraph.com/@leaf-6/ip)*
