- 文档
- 教程
- 知识库
【免费下载链接】CS-Base
图解计算机网络、操作系统、计算机组成、数据库,共 1000 张图 + 50 万字,破除晦涩难懂的计算机基础知识,让天下没有难懂的八股文!🚀 在线阅读:https://xiaolincoding.com
本篇技术指南以 IP 基础知识全家桶 为骨架,系统梳理 IP 在网络层中的定位、IPv4 地址的分类与无分类(CIDR)机制、子网划分与路由控制、IP 分片重组、IPv6 与首部演进,以及 DNS、ARP、DHCP、NAT、ICMP、IGMP 等与 IP 紧密相关的协议。读完本文,你将能清晰区分网络层与数据链路层的职责,熟练计算网络号/主机号并进行子网划分,理解路由最长匹配与 NAT 的利弊,并掌握各相关协议的工作流程,直接用于网络排障与面试应答。
前菜:IP 的基本认识
IP 在网络模型中的位置:网络层的「端到端」定位
在 TCP/IP 参考模型中,IP 协议处于第三层,也就是网络层。网络层的主要作用是:实现主机与主机之间的通信,也就是点对点(end to end)通信。关于 TCP/IP 四层模型的整体分工,可参见仓库中的 TCP/IP 网络模型有哪几层:应用层负责提供应用功能,传输层提供端到端的数据传输服务,网络层负责寻址与路由,网络接口层负责在以太网等链路上完成帧的收发。
很多读者分不清 IP(网络层)和 MAC(数据链路层)的区别,其实一句话就能说清:
- IP 的作用是主机之间通信用的,负责在「没有直连」的两个网络之间进行通信传输;
- MAC 的作用则是实现「直连」的两个设备之间通信,负责在同一个链路的区间内传输。
用旅行的例子类比:去远方旅行需要一份行程表(相当于网络层),也要买飞机票、地铁票(相当于数据链路层)——每张票只能在某一限定区间内移动。区间内的出发点好比源 MAC 地址,目标地点好比目的 MAC 地址;整个行程的开始好比源 IP,终点好比目的 IP。只有行程表没有车票到不了目的地,只有车票没有行程表不知道该坐什么车、在哪换乘,数据链路层与网络层必须兼备,才能实现向最终目标地址的通信。
还有一个关键细节:旅行途中不断换乘交通工具,但行程的起点和终点始终不变。网络数据传输也是如此——源 IP 地址和目标 IP 地址在传输过程中不会变化,只有源 MAC 地址和目标 MAC 地址一直在变(每经过一个路由器都会改写 MAC 头部,详见 键入网址到网页显示,期间发生了什么 中的「两点传输——MAC」章节)。
主菜一:IP 地址的基础知识
32 位与点分十进制
在 TCP/IP 网络通信时,为了保证能正常通信,每个设备都需要配置正确的 IP 地址。IP 地址(IPv4 地址)由32 位正整数表示,计算机内部以二进制处理。人类为了方便记忆,采用点分十进制标记:把 32 位 IP 地址按每 8 位一组共分成 4 组,组间用「.」隔开,再把每组转换成十进制,例如192.168.1.10。
32 位二进制全为 1 时,IP 地址达到最大值255.255.255.255,理论最大允许约43 亿(2³²)台设备寻址。不过请注意两点:
- IP 地址不是按主机台数配置的,而是按网卡配置。服务器、路由器等设备往往有 2 个以上网卡,也就有 2 个以上 IP 地址;
- IP 地址由「网络标识」和「主机标识」两部分组成,真正能连接网络的计算机个数远少于 43 亿。
之所以今天设备远超 43 亿仍能上网,靠的是可以更换 IP 地址的 NAT 技术,它让可连接计算机数突破了 43 亿的限制,详见后文「点心」部分。
IP 地址的分类:A、B、C、D、E 五类
互联网诞生之初地址充裕,科学家设计了分类地址,把 IP 地址分成 A、B、C、D、E 五种类型,其中前几位为分类号。A、B、C 三类由网络号和主机号两部分组成,对应地址范围与最大主机个数如下表:
| 类别 | 分类号(首位) | 网络号位数 | 主机号位数 | 地址范围 | 最大主机数(2^主机号位数 − 2) |
|---|---|---|---|---|---|
| A 类 | 0 | 8 位 | 24 位 | 0.0.0.0 ~ 127.255.255.255 | 2²⁴ − 2 = 16,777,214 |
| B 类 | 10 | 16 位 | 16 位 | 128.0.0.0 ~ 191.255.255.255 | 2¹⁶ − 2 = 65,534 |
| C 类 | 110 | 24 位 | 8 位 | 192.0.0.0 ~ 223.255.255.255 | 2⁸ − 2 = 254 |
| D 类 | 1110 | 无主机号 | — | 224.0.0.0 ~ 239.255.255.255 | 用于多播 |
| E 类 | 1111 | 无主机号 | — | 240.0.0.0 ~ 255.255.255.255 | 预留未使用 |
最大主机数为什么都要减 2?因为 IP 地址中有两个特殊值不能分配给主机:
- 主机号全为 1:指定某个网络下的所有主机,用于广播;
- 主机号全为 0:指定某个网络(网络地址本身)。
广播地址:本地广播与直接广播
广播地址用于在同一个链路中相互连接的主机之间发送数据包。当主机号全为 1 时就表示该网络的广播地址。例如把172.20.0.0/16的主机部分全部改为 1,则得到广播地址172.20.255.255。
广播分两种:
- 本地广播:在本网络内广播,例如网络地址
192.168.0.0/24的广播地址是192.168.0.255。这个 IP 包会被路由器屏蔽,不会到达192.168.0.0/24以外的链路上; - 直接广播:在不同网络之间广播,例如
192.168.0.0/24的主机向192.168.1.255/24发 IP 包,收到包的路由器会转发给192.168.1.0/24,使该网段所有主机(192.168.1.1 ~ 192.168.1.254)都能收到。由于存在一定安全问题,多数路由器上会配置为不转发直接广播。
D 类与 E 类:多播与预留
D 类和 E 类地址没有主机号,不能用于主机 IP。D 类常用于多播(组播),E 类是预留分类。
多播用于将包发送给特定组内的所有主机。广播无法穿透路由,若想给其他网段发送同样的包,就需要使用能穿透路由的多播。多播使用 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 地址时,只需判断其首位是否为 0(为 0 即 A 类),就能快速找出网络地址和主机地址;A/B/C 类分别以 0、10、110 开头,D/E 类以 1110、1111 开头,判断简单明了,选路(基于网络地址)也很简单。
缺点有两个,直接催生了 CIDR:
- 同一网络下没有地址层次:例如一个公司用了 B 类地址,想按生产、测试、开发环境划分地址层次却做不到,缺少灵活性;
- 不能很好地与现实网络匹配:C 类最大 254 台主机太少,一个网吧都不够用;B 类最多 6 万多台又太多,一般企业达不到这个规模,闲置地址就是浪费。
主菜二:无分类地址 CIDR
表示形式与子网掩码
正因为分类地址存在上述缺点,后来提出了无分类地址方案 CIDR(Classless Inter-Domain Routing)。CIDR 不再有分类的概念,把 32 比特的 IP 地址划分为两部分:前面是网络号,后面是主机号。
表示形式为a.b.c.d/x,其中/x表示前 x 位属于网络号,x 的范围是0 ~ 32,这让 IP 地址划分极具灵活性。例如10.100.122.2/24,/24 表示前 24 位是网络号,剩余 8 位是主机号。
另一种划分网络号与主机号的形式是子网掩码:掩码的意思就是「掩盖掉主机号」,剩余的就是网络号。将子网掩码和 IP 地址按位计算 AND,即可得到网络号;将子网掩码取反后与 IP 地址按位与,则可得到主机号。
例如在 TCP/IP 网络模型 中提到的10.100.122.0/24:/24 表示子网掩码255.255.255.0,其二进制是 24 个 1 加 8 个 0,把10.100.122.2与255.255.255.0按位与,得到的网络号就是10.100.122.0。
为什么要分离网络号和主机号?因为两台计算机要通信,首先要判断是否处于同一个广播域(网络地址是否相同)。网络地址相同说明接收方在本网络,可以直接把数据包发送给目标主机;路由器寻址工作也正是通过匹配网络号,把数据包转发到对应网络内。
子网划分实例
子网掩码还有一个作用:划分子网。子网划分实际上是把主机地址分为两个部分——子网网络地址和子网主机地址:
- 未做子网划分的 IP 地址:网络地址 + 主机地址;
- 做子网划分后的 IP 地址:网络地址 +(子网网络地址 + 子网主机地址)。
以 C 类地址192.168.1.0、子网掩码255.255.255.192为例:C 类前 24 位是网络号,最后 8 位是主机号;255.255.255.192的二进制为11111111.11111111.11111111.11000000,说明从 8 位主机号中借用了 2 位作为子网号。
借用 2 位子网号后,可产生 4 个子网(00、01、10、11),划分结果如下表:
| 子网号(2 位) | 子网网络地址 | 可用主机地址范围 | 广播地址 |
|---|---|---|---|
| 00 | 192.168.1.0/26 | 192.168.1.1 ~ 192.168.1.62 | 192.168.1.63 |
| 01 | 192.168.1.64/26 | 192.168.1.65 ~ 192.168.1.126 | 192.168.1.127 |
| 10 | 192.168.1.128/26 | 192.168.1.129 ~ 192.168.1.190 | 192.168.1.191 |
| 11 | 192.168.1.192/26 | 192.168.1.193 ~ 192.168.1.254 | 192.168.1.255 |
可见通过改变掩码位长度,就可以灵活地控制子网规模——这也是「无分类」相比固定分类的核心优势。
公有 IP 地址与私有 IP 地址
在 A、B、C 分类地址中,实际上还有公有 IP 和私有 IP 之分。平时办公室、家里、学校用的 IP 一般是私有 IP 地址,这些地址允许组织内部 IT 人员自己管理、自己分配,而且可以重复——你学校的某个私有 IP 和我学校的可以一样,就像每个小区都可以有「1 栋 101 号」。
公有 IP 地址由某个组织统一分配,基本要求在整个互联网范围内保持唯一,就像「中山路 666 号」只能有一家。要开一个博客网站让全世界访问,就需要申请购买一个公有 IP。
公有 IP 地址由ICANN(互联网名称与数字地址分配机构)管理,其下属机构IANA负责按洲层层分配 IP 地址,五大区域注册机构如下:
| 注册机构 | 负责区域 |
|---|---|
| ARIN | 北美地区 |
| LACNIC | 拉丁美洲和一些加勒比群岛 |
| RIPE NCC | 欧洲、中东和中亚 |
| AfriNIC | 非洲地区 |
| APNIC | 亚太地区 |
其中中国国内由CNNIC负责管理,它是中国国内唯一指定的全局 IP 地址管理机构。
IP 地址与路由控制
IP 地址的网络地址部分用于路由控制。路由控制表中记录着网络地址与下一步应该发送至的路由器地址,主机和路由器上都有各自的路由表。发送 IP 包时,先确定 IP 包首部的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,把 IP 包转发给下一个路由器;若存在多条匹配记录,就选择相同位数最多的网络地址,即最长匹配。
以典型链路为例:
- 主机 A 发送一个源地址
10.1.1.30、目标地址10.1.2.10的 IP 包,主机 A 的路由表找不到与目标地址相同的网络地址记录,于是包被转发到默认路由(路由器 1); - 路由器 1 收到后在其路由表匹配到相同网络地址记录,把 IP 数据包转发到
10.1.0.2(路由器 2); - 路由器 2 同样比对路由表匹配成功,把 IP 包从
10.1.2.1接口发出,最终经交换机转发到目标主机。
在 Linux 中可用route -n命令查看路由表,键入网址到网页显示 中给出了真实的路由匹配过程:把目标地址与每条路由的Genmask做与运算,结果与Destination一致即匹配;其中目标地址和子网掩码均为0.0.0.0的条目是默认网关,其他条目都无法匹配时自动命中,把包发给Gateway列中的路由器 IP。
环回地址不会流向网络:环回地址是同一台计算机上程序之间进行网络通信时使用的默认地址。计算机使用特殊 IP127.0.0.1作为环回地址,与之同义的主机名是
localhost。使用该 IP 或主机名时,数据包不会流向网络。关于 127.0.0.1 与 localhost、0.0.0.0 的区别及「断网也能 ping 通」的原理,参见仓库文章 断网了,还能 ping 通 127.0.0.1 吗:断网后 ping 127.0.0.1 会走 lo0 本地回环接口("假网卡"),数据被推入共享的input_pkt_queue链表后触发软中断,由 ksoftirqd 内核线程取回并向上递交,全程不经过真实网卡。
IP 分片与重组
每种数据链路的最大传输单元MTU都不相同,例如 FDDI 数据链路 MTU 为 4352 字节,以太网的 MTU 是 1500 字节。MTU 不同是因为每种数据链路的使用目的不同。
当 IP 数据包大小大于 MTU 时,IP 数据包就会被分片;分片后的 IP 数据报重组只能由目标主机进行,路由器不会重组。例如发送方发送一个 4000 字节的大数据报,经以太网链路传输时需要分片成 3 个小数据报,再交由接收方重组成大数据报。
分片传输有一个致命问题:一旦某个分片丢失,整个 IP 数据报就会作废。因此:
- TCP 引入了 MSS(最大报文段长度),在 TCP 层就按 MSS 分块(MSS = MTU − IP 头 − TCP 头),从而避免 IP 层分片。数据以 MSS 为长度单位拆分,每一块加上 TCP 头后交给 IP 模块发送,即使某个分块丢失只需重传该分块;
- 对于UDP,尽量不要发送大于 MTU 的数据报文,否则一旦分片丢失,整个 UDP 报文都会作废且无法通过重传恢复。
关于 MTU/MSS 的关系及 Linux 协议栈中超过 MTU 的网络包在网络层分片、用 sk_buff 描述各层数据包(data/segment/packet/frame)的实现细节,可参考 Linux 系统是如何收发网络包的。
主菜三:IPv6 基本认识与首部演进
IPv6 的三大亮点
IPv4 地址 32 位,大约可提供 42 亿个地址,早在2011 年就已分配完毕。IPv6 地址为128 位,可分配地址数量惊人——有个广为流传的段子:IPv6 可以保证地球上的每粒沙子都被分配到一个 IP 地址。
IPv6 除了地址更多之外,还有更好的安全性和扩展性:
- 可自动配置:即使没有 DHCP 服务器也能自动分配 IP 地址,做到即插即用;
- 首部简化、性能提升:包头首部长度固定为 40 字节,去掉了包头校验和,减轻路由器负荷,大幅提高传输性能;
- 安全性提升:具备应对伪造 IP 地址的网络安全功能以及防止线路窃听的功能。
但 IPv4 与 IPv6 不能相互兼容,不仅需要电脑、手机等设备支持,还需要网络运营商升级现有设备,这正是 IPv6 普及较慢的原因。
IPv6 地址的标识方法
IPv4 地址 32 位,按每 8 位一组用点分十进制表示;IPv6 地址 128 位,按每 16 位一组、每组用冒号「:」隔开。若出现连续的 0 可以省略,并用两个冒号「::」隔开,但**一个 IP 地址中只允许出现一次「::」**。例如 IPv6 下的回环地址表示为::1(IPv4 下是127.0.0.1;IPv4 用ping 127.0.0.1,IPv6 用ping6 ::1,见 断网了,还能 ping 通 127.0.0.1 吗)。
IPv6 地址的结构与类型
IPv6 与 IPv4 类似,通过 IP 地址的前几位标识地址种类,主要有以下类型:
- 单播地址:用于一对一的通信;
- 组播地址:用于一对多的通信;
- 任播地址:用于通信最近的节点,最近的节点由路由协议决定;
- 没有广播地址(广播功能由组播承担)。
其中单播地址又划分为三类,每类有效范围不同:
| 单播地址类型 | 作用范围 | 对应关系 |
|---|---|---|
| 链路本地单播地址 | 同一链路单播通信,不经过路由器 | IPv4 没有此类型 |
| 唯一本地地址 | 内网里单播通信 | 相当于 IPv4 的私有 IP |
| 全局单播地址 | 互联网通信 | 相当于 IPv4 的公有 IP |
IPv4 首部与 IPv6 首部的差异
IPv6 相比 IPv4 的首部改进主要有三点:
- 取消了首部校验和字段:因为数据链路层和传输层都会校验,IPv6 直接取消了 IP 层的校验;
- 取消了分片/重组相关字段:分片与重组是耗时过程,IPv6 不允许中间路由器进行分片与重组,该操作只能在源与目标主机进行,大幅提高路由器转发速度;
- 取消了选项字段:选项字段不再是标准 IP 首部的一部分,而是可能出现在 IPv6 首部「下一个首部」指出的位置上。删除该字段使 IPv6 首部成为固定长度 40 字节。
点心:与 IP 协议相关的技术
与 IP 协议相关的技术不少,包括 DNS、ARP 与 RARP、DHCP、NAT、ICMP、IGMP 六种常见且重要的技术。
DNS:域名解析
上网时我们通常使用域名而非 IP 地址,因为域名方便人类记忆。实现这一转换的就是DNS 域名解析,它把域名网址自动转换为具体的 IP 地址。
域名的层级关系:DNS 中的域名用句点分隔,如www.server.com,句点代表不同层次间的界限;越靠右的位置层级越高。根域在最顶层(域名最后还有一个点,如www.server.com.),下一层是.com顶级域,再下面是server.com。因此域名层级类似树状结构:根 DNS 服务器 → 顶级域 DNS 服务器(com)→ 权威 DNS 服务器(server.com)。根域 DNS 服务器信息保存在互联网中所有 DNS 服务器里,客户端只要能找到任意一台 DNS 服务器,就能找到根域服务器,再顺藤摸瓜找到目标。
域名解析的工作流程:浏览器先看自己的缓存,没有就向操作系统缓存要,还没有就检查本机域名解析文件hosts,仍未命中才会向本地 DNS 服务器发起查询:
- 客户端发出 DNS 请求,询问
www.server.com的 IP,发给本地 DNS 服务器(客户端 TCP/IP 设置中填写的 DNS 服务器地址); - 本地域名服务器查缓存,若命中直接返回;否则去问根域名服务器;
- 根 DNS 发现后缀是 .com,告知
www.server.com归 .com 区域管理,给出 .com 顶级域名服务器地址; - 本地 DNS 向顶级域名服务器发起请求;
- 顶级域名服务器给出负责
www.server.com区域的权威 DNS 服务器地址; - 本地 DNS 转而询问权威 DNS 服务器(域名解析结果的原出处);
- 权威 DNS 服务器查询后把对应 IP 地址 X.X.X.X 告诉本地 DNS;
- 本地 DNS 再把 IP 返回客户端,客户端与目标建立连接。
整个过程与日常找人问路类似——只指路不带路。域名的完整解析链路还可参考 键入网址到网页显示 中的「真实地址查询——DNS」章节。
ARP 与 RARP
传输一个 IP 数据报时,确定了源 IP 和目标 IP 后,会通过路由表确定 IP 数据包的下一跳;而网络层的下一层是数据链路层,还需知道「下一跳」的MAC 地址。由于路由表中可以找到下一跳的 IP 地址,所以可以通过ARP 协议求得下一跳的 MAC 地址。
ARP 如何知道对方的 MAC 地址?借助ARP 请求与 ARP 响应两种包:
- 主机会广播发送 ARP 请求,包中包含想要知道的 MAC 地址的主机 IP;
- 同链路所有设备收到请求后拆包查看,若请求中的目标 IP 与自己的 IP 一致,就把自己的 MAC 地址塞入ARP 响应包单播返回给请求主机。
操作系统通常会把第一次通过 ARP 获取的 MAC 地址缓存起来,下次直接从缓存找;但缓存有一定期限,超期后会被清除。在 Linux 中可用arp -a查看 ARP 缓存内容;发包时先查缓存,未命中再发 ARP 广播查询(详见 键入网址到网页显示)。
RARP 协议与 ARP 正好相反:ARP 是已知 IP 求 MAC,RARP 是已知 MAC 求 IP,常用于把打印机服务器等小型嵌入式设备接入网络。通常需要架设一台 RARP 服务器,预先注册设备的 MAC 地址与 IP 地址,设备接入后发送「我的 MAC 地址是 XXXX,请告诉我我的 IP 地址」的请求,RARP 服务器应答「MAC 为 XXXX 的设备,IP 为 XXXX」,设备据此设置自己的 IP。
DHCP:动态获取 IP 地址
DHCP 在生活中非常常见,电脑通常通过 DHCP 动态获取 IP 地址,省去手动配置 IP 信息的繁琐过程。注意:DHCP 客户端进程监听 68 端口,DHCP 服务端进程监听 67 端口。获取 IP 分四步:
- DHCP 发现报文(DHCP DISCOVER):客户端没有 IP 地址,也不知道 DHCP 服务器地址,因此使用 UDP广播通信,广播目的地址
255.255.255.255(端口 67),源 IP 地址0.0.0.0(端口 68),链路层再把帧广播给网络中所有设备; - DHCP 提供报文(DHCP OFFER):DHCP 服务器收到发现报文后,仍用 IP 广播地址
255.255.255.255响应,携带可租约的 IP 地址、子网掩码、默认网关、DNS 服务器以及IP 地址租用期; - DHCP 请求报文(DHCP REQUEST):客户端收到一个或多个提供报文后选择一个服务器,回显配置的参数;
- DHCP ACK 报文:服务端应答所要求的参数。
收到 DHCP ACK 后交互完成,客户端即可在租用期内使用分配的 IP。若租约快过期,客户端会再发 DHCP 请求报文:服务器同意续租则回 DHCP ACK 延长租期,不同意则回DHCP NACK,客户端必须停止使用该 IP。整个 DHCP 交互全程使用 UDP 广播通信。
DHCP 中继代理:广播包无法被路由器转发,若 DHCP 服务器与客户端不在同一局域网,难道每个网段都要配一个 DHCP 服务器?解决方案是DHCP 中继代理——客户端向中继代理发送 DHCP 请求包,中继代理收到广播包后以单播形式发给 DHCP 服务器;服务器应答后,中继代理再把应答广播给客户端。这样,不同网段的 IP 地址分配也可以由一个 DHCP 服务器统一管理。
NAT 与 NAPT:缓解 IPv4 地址耗尽
IPv4 地址紧缺,无分类地址只能减缓耗尽速度,因此又提出网络地址转换 NAT:同公司、家庭、教室内的主机对外通信时,把私有 IP 地址转换成公有 IP 地址。
不过,普通 NAT 是「N 个私有 IP 就要 N 个公有 IP」,并没有真正缓解地址耗尽。由于绝大多数网络应用使用 TCP 或 UDP 传输,因此可以把IP 地址 + 端口号一起转换,这样用一个全球 IP 地址即可,这种技术叫网络地址与端口转换 NAPT。
NAPT 的例子:两个客户端192.168.1.10和192.168.1.11同时与服务器183.232.231.172通信,本地端口都是 1025。此时两个私有 IP 都转换为公有地址120.229.175.121,但以不同的端口号区分,NAPT 路由器生成一张转换表,正确转换地址与端口的组合,使两个客户端能同时与服务器通信。转换表在 NAT 路由器上自动生成:TCP 情况下,三次握手的 SYN 包一经发出即生成表项,收到关闭连接时 FIN 包的确认应答后从表中删除。
NAT 的缺陷(NAT/NAPT 都依赖转换表):
- 外部无法主动与 NAT 内部服务器建立连接,因为转换表没有对应记录;
- 转换表的生成与转换操作会产生性能开销;
- 通信过程中若 NAT 路由器重启,所有 TCP 连接都会被重置。
解决方案主要有两种:一是改用 IPv6——每台设备都可以配置公有 IP 地址,无需地址转换(但普及仍需时间);二是NAT 穿透技术——让网络应用程序主动发现自己位于 NAT 设备之后,主动获取 NAT 设备的公有 IP 并建立端口映射条目(由 NAT 设备后的应用程序自动完成),这样客户端主动配合 NAT 设备建立映射,无需 NAT 设备来进行转换。
ICMP:互联网控制报文协议
ICMP 全称Internet Control Message Protocol(互联网控制报文协议),核心关键词是「控制」。网络包在复杂的网络环境中会遇到各种问题,当遇到问题时需要传出消息报告问题原因,以便调整传输策略、控制整个局面。
ICMP 主要功能包括:确认 IP 包是否成功送达目标地址、报告发送过程中 IP 包被废弃的原因、改善网络设置等。例如主机 A 向主机 B 发数据包,途中路由器 2 未能发现主机 B 的存在,路由器 2 就会向主机 A 发送 ICMP 目标不可达数据包说明原因。ICMP 的这类通知消息使用 IP 发送,ICMP 报文封装在 IP 包里,工作在网络层,是 IP 协议的助手。
ICMP 报文大致分为两大类:
- 查询报文类型:用于诊断,典型如回送请求(类型
8)与回送应答(类型0),ping命令正是利用这两类消息实现的——在 ping 的工作原理 中有完整讲解; - 差错报文类型:通知出错原因,常见类型包括目标不可达(类型
3,代码 0/1/2/3/4 分别表示网络不可达、主机不可达、协议不可达、端口不可达、需要分片但设置了不分片位)、原点抑制(类型4)、重定向(类型5)、超时(类型11,TTL 减到 0 时由路由器发送)。
ICMP 差错报文还是traceroute(Windows 下为tracert)的工作原理:它故意从 TTL=1 开始递增发送 UDP 包,强制接收「时间超时」差错报文来追踪沿途路由器;再填入一个不可能的端口号(大于 3000),当收到「端口不可达」差错报文时即确认到达目的主机;同时利用「需要分片但设置了不分片位」(代码 4)做路径 MTU 发现。
IGMP:因特网组管理协议
ICMP 与 IGMP 一点关系都没有,不要混淆。前面提到组播地址(D 类地址),只有组内主机能收到组播数据包,那么如何管理主机是否属于某个组?这需要IGMP 协议。
IGMP 工作在主机(组播成员)与最后一跳路由器之间:
- IGMP 报文向路由器申请加入和退出组播组。默认情况下路由器不会把组播包转发给连接的主机,除非主机通过 IGMP 加入组播组;主机申请加入时路由器记录 IGMP 路由表,后续就把组播包转发给对应主机;
- IGMP 报文采用 IP 封装,IP 头部的协议号为 2,TTL 字段值通常为 1,因为 IGMP 只工作在主机与所连接的路由器之间。
IGMP 分三个版本:IGMPv1、IGMPv2、IGMPv3。以IGMPv2为例说明两个工作机制:
常规查询与响应:
- 路由器周期性发送目的地址为
224.0.0.1(表示同一网段内所有主机和路由器)的IGMP 常规查询报文; - 组内主机收到查询后启动「报告延迟计时器」(时间随机,通常 0~10 秒),计时器超时后发送IGMP 成员关系报告报文(源 IP 为主机 IP,目的 IP 为组播地址);若在定时器超时前收到同组其他主机的报告报文,则自己不再发送,以减少网络中多余的 IGMP 报文;
- 路由器收到成员关系报文后,在 IGMP 路由表中加入该组播组,此后组播数据到达即转发出去。
离开组播组(两种情形):
- 网段中仍有该组成员:主机 1 要离开组
224.1.1.1,发送目的地址为224.0.0.2(发向网段内所有路由器)的离组报文;路由器收到后以 1 秒为间隔连续发送 2 个 IGMP 特定组查询报文;主机 3 仍是组成员,立即响应,路由器确认组内仍有成员,继续转发该组播数据; - 网段中没有该组成员:路由器发出特定组查询后无主机响应,一定时间后认为该网段已无该组成员,不再向该网段转发该组播地址的数据包。
读者问答:组播与主机 IP 的关系
问:假设一台机器加入组播地址,需要把 IP 改成组播地址吗?如果离开某个组播地址,需要 DHCP 重新请求 IP 吗?
组播地址不是用于机器 IP 地址的,因为组播地址没有网络号和主机号,跟 DHCP 没关系。组播地址一般用于 UDP 协议:机器发送 UDP 组播数据时,目标地址填的是组播地址,组播组内的机器都能收到数据包。是否加入/离开组播组,是由socket 的一个接口实现的,主机 IP 不需要改变。
参考资料与延伸阅读
本篇内容整理自《图解网络》系列,参考资料包括《计算机网络——自顶向下方法》(陈鸣译,机械工业出版社)、《TCP/IP 详解 卷 1:协议》(范建华译,机械工业出版社)、《图解 TCP/IP》(竹下隆史,人民邮电出版社)。仓库内与本文强相关的延伸阅读:
- TCP/IP 网络模型有哪几层:网络层在四层模型中的定位、子网掩码与网络号/主机号计算;
- 键入网址到网页显示,期间发生了什么:DNS 解析、路由表匹配、ARP 获取 MAC 的完整调用链;
- ping 的工作原理:ICMP 查询报文与差错报文的类型、ping 与 traceroute 的底层机制;
- 断网了,还能 ping 通 127.0.0.1 吗:回环地址、localhost 与 0.0.0.0 的区别及本地回环收发路径;
- Linux 系统是如何收发网络包的:网络包在 Linux 协议栈中的封装、MTU 分片与 sk_buff 实现。
- 文档
- 教程
- 知识库
【免费下载链接】CS-Base
图解计算机网络、操作系统、计算机组成、数据库,共 1000 张图 + 50 万字,破除晦涩难懂的计算机基础知识,让天下没有难懂的八股文!🚀 在线阅读:https://xiaolincoding.com
相关推荐
IT-Tools网络工具深度解析:IP地址计算、子网划分、MAC地址查询
IT Tools网络工具深度解析:IP地址计算、子网划分、MAC地址查询 IT Tools是一个专为开发者和IT专业人员打造的在线工具集合,提供了超过80种实用
开发工具前端CS-Base 图解计算机基础:图解网络、图解系统、图解 MySQL、图解 Redis 知识库全览
CS Base 图解计算机基础:图解网络、图解系统、图解 MySQL、图解 Redis 知识库全览 CS Base 是一个以「图解 + 通俗讲解」为核心形式的计
文档教程知识库什么是OpenUPM?Unity开源包注册表的完整指南
什么是OpenUPM?Unity开源包注册表的完整指南 OpenUPM是一个开源的Unity Package Manager(UPM)包托管和构建服务,旨在为U
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考