前言
这篇笔记记录了与IP有关的基础知识,包含IP地址的结构以及IP协议的相关技术。本篇笔记之前,需要了解基础的网络结构层次,了解网络收发过程:
https://hoyue.fun/network1_2.html
废话不多说,直接开始笔记部分。
IP协议
我们知道,网络层中最著名的协议就是IP协议了,网络层协议并不只是IP协议,还包括ICMP(Internet Control Message Protocol)协议、IPX(Internet Packet Exchange)协议等。
我们这一篇主要记录的是IP协议。IP是Internet Protocol的缩写。 Internet Protocol本身是一个协议文件的名称,该协议文件的内容非常少,主要是定义并阐述了IP报文的格式。IP报文在网络收发过程中已经提及了,我们这里来分析其中的几个重要的组成部分。
IPv4头部如图所示:

从第一层开始,这些字段分别为:
- 版本 (Version)字段记录了数据报属于协议哪个版本。IP协议目前有IPv4和IPv6版本。
- 头部长度 (Internet Header Length, IHL):由于存在可选长度,头的长度不固定,所以头的IHL 字段指明了头到底有多长(以32 位字长度为单位)。IHL 的最小值为5(0101) ,最大值为15(1111) ,可以把头的长度限制为最大60字节,因此选项(Options)字段最多为40 字节。
- 区分服务 (Differentiated services)/ 服务类型 (Type of service)用来区分不同的服务种类,前6位用来标记数据包的服务类型,例如加速服务和确保服务,后2位用来携带显式拥塞通知信息,比如数据包是否经历了拥塞。
- 总长度 (Total Length)。字段包含了该数据报中的所有内容,即头和数据。最大长度是65535 个字节。
我们知道,TCP传输的时候会将报文分割成多个片段,同理网络中转发的IP报文的长度可以不同,但如果报文长度超过了数据链路所支持的最大长度,则报文就需要分割成若干个较小的片段才能够在链路上传输,称为 分片 。
- 标识 (Identification)字段的用途是让目标主机确定一个新到达的分段属于哪一个数据报。 同一个数据报的所有段包含同样的标识值 。
- Flag字段分为三位,第一位为 未使用位 ,第二位为 DF 不分段(Don’t Fragment)标志位,第三位为 MF 更多的段(More Fragment)标志位。DF用于让 发送方 知道这个数据包要么完整地到达目的地,要么有个报错消息反馈回来。MF用于让 接收方 可以知道什么时候一个数据报的所有分段都已经到达了。
- 分段偏移量 (Fragment offset)字段指明了该段在当前数据报中的位置。
- 生存时间 (Time to Live, TTL)设置了数据包可以经过的路由器数目。 一旦经过一个路由器,TTL值就会减1,当该字段值为0时,数据包将被丢弃。 最大的生存期为255 秒。
- 协议 (Protocol)标识了将会继续处理该报文的协议,以便目的主机的IP层将数据部分上报给哪个进程处理。其中常见协议及取值为:TCP: 6, UDP: 17, IMCP: 1
IPv6的头部相比IPv4有了一些变化:

IPv6 相比 IPv4 改进:
- 取消了IHL和校验和。 因为在数据链路层和传输层都会进行校验,因此 IPv6 直接取消了 IP 的校验。
- 取消了分片。 分片是耗时的过程,IPv6 不允许在中间路由器进行分片与重组,这种操作只能在源与目标主机,这将大大提高了路由器转发的速度。
- 取消选项字段。 IPv6中采用类似链表的结构,存在下一个头部字样指向下一个其他头部。删除了选项字段使得 IPv6 的头部成为固定长度的
40字节。
IP地址
在 TCP/IP 网络通信时,为了保证能正常通信,每个设备都需要配置正确的 IP 地址,否则无法实现正常的通信。它有如下两个功能:
- IP地址在网络中用于标识一个节点(或者网络设备的接口)。
- IP地址用于IP报文在网络中的寻址。
IPv4
一个IPv4地址有32 bit。Internet 上的每台主机和每个路由器都有一个IP 地址,可用在IP 数据包的Source address 和Destination address 字段。
为了方便记忆采用了 点分十进制 的标记方式,也就是将 32 位 IP 地址以每 8 位为组,共分为 4 组,每组以「 . 」隔开,再将每组转换成十进制。

因为其有32bits,可以得出IPv4的范围:0.0.0.0~255.255.255.255。
实际上,IP 地址并不是根据主机台数来配置的,而是 以网络接口/网卡进行分配 的。
我们又可以把IP地址分成两个部分——网络部分和主机部分
- 网络部分 :用来标识一个网络。又称为 前缀 (prefix)。
- 主机部分 :用来区分一个网络内的不同主机。
但是计算机不知道这个网络中有多少主机,也不知道主机部分有多少位,故我们使用 子网掩码 (subnet mask)来方便计算机识别。子网掩码同样有32位,当该位为网络部分时为1,主机部分时为0。子网掩码只可以是0、128、192、224、240、248、252、254以及255。

如上图这个例子,我们可以用简单的长度描述前缀长度,网络部分有24位,故写作 /24 ,读作” slash 24 ”。
前缀的主要优势是路由器 仅仅根据地址的网络部分即可转发数据包 ,只要每个网络都有一个唯一的地址块。对路由器来说网络地址的主机部分并不重要,因为同一网络上的所有主机都在同一个方向,只有当数据包到达它们的目的地网络后才被转发到正确的主机。
互联网诞生之初,IP 地址显得很充裕,为了方便IP地址的管理及组网,IP地址分成五类:

其中,A/B/C类默认子网掩码:
- A类:8 bit, 1.0.0.0~126.255.255.255/8, 其中0和127被保留了。
- B类:16 bit,128.0.0.0~191.255.255.255/16
- C类:24 bit,192.0.0.0~223.255.255.255/24
我们通常把一个网络号所定义的网络范围称为一个 网段 (network segment)。
一个网段其中又可以分为:
- 网络地址 :位于网段首位,用于标识一个网络。
- 广播地址 :位于网段末尾,用于向该网络中的所有主机发送数据的特殊地址。
- 可用地址 :可分配给网络中的节点或网络设备接口的地址。
网络地址和广播地址 不能 直接被节点或网络设备所使用。一个网段可用地址数量为: 2ⁿ-2 。
根据上面的知识,举个例子:计算IP地址,计算10.128.20.10/8这个A类地址的网络地址、广播地址以及可用地址数。
- 网络地址是将主机部分全置为0,得到10.0.0.0/8。
- 广播地址是将主机部分全置为1,得到10.255.255.255/8。
- 可用地址数是将网络掩码转换为二进制,然后计算其中0的个数n,得到2^n - 2(减去网络地址和广播地址),得到2^24 - 2 = 16777214。
但是IP地址的分类存在这些问题:
- 同一网络下没有地址层次。这个可以通过子网划分解决。
- 不能很好的与现实网络匹配,C类地址太少,B类地址太多等。这个可以通过
CIDR无分类地址解决。
子网划分
我们知道一个B类地址有2¹⁶ = 65536个地址,用于一个广播域,地址浪费。有时候你需要给一个类地址划分不同的部门/区域等,这个时候就需要用到 子网划分 (subnetting)。分割一个大型网络得到的一系列结果网络称为 子网 (subnet)。
子网划分将一个网络号划分成多个子网,每个子网分配给一个独立的广播域。如此一来广播域的规模更小、网络规划更加合理。同时,IP地址得到了合理利用。
例如,给不同学院划分不同的子网:

子网划分需要三步: 原网段分析、向主机借位、计算子网地址 。我们使用一个C类网络 192.168.10.0/24 为例,它的子网掩码为:255.255.255.0
- 原网段分析:根据我们之前学到的知识,很容易得到原网段的信息。 网络地址:192.168.10.0/24 广播地址:192.168.10.255 IP地址数: 2⁸=256个 可用IP地址数:2⁸-2=254个
- 向主机借位:根据我们需要生成的子网个数向主机借位。例如我们需要2个子网,那就需要借log2 = 1位,需要n位就借
⌈log n⌉位。此时子网掩码中有24+1位是固定的,形成的两个的子网分别是:192.168.10.0/25和192.168.10.128/25,它们的子网掩码为255.255.255.128。如图:
此时每个子网中,IP地址数: 2⁷=128个,可用IP地址数:2⁷-2=126个。 - 计算子网地址:此时因为子网的划分,我们需要重新为子网计算它们的网络地址和广播地址。网络地址即主机位全为0,广播地址即主机位全为1。子网1:192.168.10.0、192.168.10.127;子网2:192.168.10.128、192.168.10.255

我们进行子网划分是为了提高IP地址的管理效率,IP地址的规划应尽可能和网络层次相对应,应该是自顶向下的一种规划。IP地址规划的目标是: 易管理、易扩展、利用率高。
无分类地址 CIDR
无分类地址 CIDR这种方式不再有固定的分类地址的概念,32 bits的 IP 地址被划分为两部分,前面是 网络号 ,后面是 主机号 。
表示形式 a.b.c.d/x ,其中 /x 表示前 x 位属于 网络号 , x 的范围是 0 ~ 32 ,这就使得 IP 地址更加具有灵活性。
例如:10.100.122.2/24,说明前24位都是网络号。它的子网掩码:255.255.255.0。 将子网掩码和 IP 地址按位计算 AND,就可得到网络号。 And得到10.100.122.0。
公有地址与私有地址
在 A、B、C 分类地址,实际上有分公有 IP 地址和私有 IP 地址。

平时我们局域网内用的 IP 地址,一般都是私有 IP 地址。因为这些地址允许组织内部的 IT 人员自己管理、自己分配,而且可以重复。
公有 IP 地址是由ICANN统一分配的,用于接入互联网的IP地址。这样全世界的人才能访问。并且公有 IP 地址基本上要在整个互联网范围内保持唯一。
除此之外还有一个特殊地址——环回地址。
环回地址是在同一台计算机上的程序之间进行网络通信时所使用的一个默认地址。
计算机使用一个特殊的 IP 地址 127.0.0.1 作为环回地址 。与该地址具有相同意义的是一个叫做 localhost 的主机名。使用这个 IP 或主机名时,数据包不会流向网络。
除此之外,还有 255.0.0.0,169.254.0.0,255.255.0.0 会作为保留地址不会公用。
其中, 255.255.255.255 是一个默认的本地广播地址。
在2019年其子组织AFRINIC宣布IPv4地址分配完毕,至此IPv4已经枯竭。接下来就是介绍IP协议的另外版本——IPv6。
IPv6
IPv6地址的长度为128 bit。一般用冒号分割为8段,每一段16 bits,每一段内用十六进制表示。
与IPv4地址类似,IPv6也用”IPv6地址/掩码长度”的方式来表示IPv6地址。
例如2001:0DB8:2345:CD30:1230:4567:89AB
/64,它的子网掩码为:FFFF:FFFF:FFFF:FFFF::,子网号为:2001:0DB8:2345:CD30::/64
因为IPv6地址过于复杂,有如下规则可以简化它:
- 每组16 bit的单元中的 前导0 可以省略,但是如果16 bit单元的所有比特都为0,那么 至少要保留一个”0”字符 ;拖尾的0不能被省略。
- 一个或多个连续的16 bit字符为0时,可用”::“表示,但整个IPv6地址缩写中只允许有一个”::”。
- 若缩写后的IPv6地址出现两个”::“,会导致无法还原为原始IPv6地址。
例如:
缩写前 0000:0000:0000:0000:0000:0000:0000:0001 缩写后 ::1
缩写前 2001:0DB8:0000:0000:FB00:1400:5000:45FF 缩写后 2001:DB8::FB00:1400:5000:45FF
缩写前 2001:0DB8:0000:0000:0000:2A2A:0000:0001 缩写后 2001:DB8::2A2A:0:1
缩写前 2001:0DB8:0000:1234:FB00:0000:5000:45FF 缩写后 2001:DB8::1234:FB00:0:5000:45FF 或 2001:DB8:0:1234:FB00::5000:45FF
根据IPv6地址前缀,可将IPv6地址分为为单播地址、组播地址和任播地址。

对于一对一通信的 IPv6 地址,主要划分了三类单播地址,每类地址的有效范围都不同。
- 在同一链路单播通信,不经过路由器,可以使用 链路本地单播地址 ,IPv4 没有此类型
- 在内网里单播通信,可以使用 唯一本地地址 ,相当于 IPv4 的私有 IP
- 在互联网通信,可以使用 全局单播地址 ,相当于 IPv4 的公有 IP
ICMP
Internet控制消息协议 ICMP (Internet Control Message Protocol)是IP协议的辅助协议。
ICMP主要的功能包括: 确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因和改善网络设置等。
在IP通信中如果某个IP包因为某种原因未能达到目标地址,那么这个具体的原因将 由 ICMP 负责通知 。

如上图例子,主机 A 向主机 B 发送了数据包,由于某种原因,途中的路由器 2 未能发现主机 B 的存在,这时,路由器 2 就会向主机 A 发送一个 ICMP 目标不可达数据包,说明发往主机 B 的包未能成功。
ICMP 的这种通知消息会使用 IP 进行发送 。
因此,从路由器 2 返回的 ICMP 包会按照往常的路由控制先经过路由器 1 再转发给主机 A 。收到该 ICMP 包的主机 A 则分解 ICMP 的首部和数据域以后得知具体发生问题的原因。
ICMP 大致可以分为两大类: 差错检测和错误报告
- ICMP Echo消息常用于诊断源和目的地之间的网络连通性,同时还可以提供其他信息,如报文往返时间等。例如Ping
- ICMP定义了各种错误消息,用于诊断网络连接性问题;根据这些错误消息,源设备可以判断出数据传输失败的原因。如:当网络设备无法访问目标网络时,会自动发送ICMP目的不可达报文到发送端设备。例如Tracert
ICMP的格式如下:

后记
在这篇笔记中,介绍了与IP有关的基础知识,包括IP地址的结构、IP协议的相关技术、子网划分的方法和无分类地址的概念。希望这些内容能够帮助理解IP网络的工作原理和设计思想,以及如何在实际应用中合理规划和管理IP地址。当然,这篇笔记并不涵盖所有的IP相关的话题,还有很多细节和高级功能需要进一步学习和探索。例如,IPv6的地址类型和应用场景、ICMP的消息格式和功能、IP路由的算法和协议等。谢谢你阅读这篇笔记,希望有所帮助。😊