一、IP 协议
1.1 为什么需要 IP 协议
主机 B 将数据包发送给主机 C,并不是直接将数据包发送到主机 C,而是需要通过网络这个复杂的环境,才能将数据包发送给主机 C。
IP 协议提供了一种能力,跨网络将数据包从一个主机发送给另一个主机。这种能力只能保证较高的传输概率,而非绝对的百分百成功。
而 TCP 协议则通过一系列策略,在报文出现丢失情况时进行重传,以此保障数据传输的可靠性。
综合来看,TCP/IP 协议提供一种能力,跨网络将数据包可靠的从一个主机发送给另一个主机。
基本概念
- 主机:配有 IP 地址,但是不进行路由控制的设备
- 路由器:即配有 IP 地址,又能进行路由控制
- 节点:主机和路由器的统称
路由控制是网络通信中的核心机制,它决定了数据包在网络中如何从源节点传输到目标节点。

1.2 IP 协议报文头部格式

- 4 位版本:指定 IP 协议的版本,对于 IPv4 来说,就是 4
- 4 位首部长度:IP 头部的长度(单位 4 字节)
- 8 位服务类型:3 位优先权字段(已经弃用),4 位 TOS 字段,和 1 位保留字段(必须置为 0)。
- 4 位 TOS 分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。对于 ssh / telnet 这样的应用程序,最小延时比较重要。对于 ftp 这样的程序,最大吞吐量比较重要
- 16 位总长度:IP 数据报整体占多少个字节
- 16 位标识:唯一的标识主机发送的报文,如果 IP 报文在数据链路层被分片了,那么每一个片里面的这个 id 都是相同的
- 3 位标志字段:
- 第一位保留(保留的意思是现在不用,但是还没想好说不定以后要用到)
- 第二位置为 1 表示禁止分片,这时候如果报文长度超过 MTU,IP 模块就会丢弃报文
- 第三位表示"更多分片",如果分片了的话,其他分片置为 1,最后一个分片置为 0,类似于一个结束标记
- 13 位分片偏移:是分片相对于原始 IP 报文开始处的偏移,其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此,除了最后一个报文之外,其他报文的长度必须是 8 的整数倍(否则报文就不连续了)
- 8 位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数,一般是 64,每次经过一个路由,TTL = 1,一直减到 0 还没到达,那么就丢弃了,这个字段主要是用来防止出现路由循环
- 8 位协议:表示上层协议的类型
- 16 位头部校验和:使用 CRC 进行校验,来鉴别头部是否损坏
- 32 位源 IP 地址和 32 位目标 IP 地址:表示发送端和接收端的 IP 地址
- 如何解决报头与有效载荷分离的问题
IP 报头中,有 20 字节固定长度,其中包含一个字段 4 位首部长度,它的单位为 4 字节,4 位比特位能表示 [0,15],也就是首部长度最大为 60 字节,减去 20 字节的固定长度,剩下的就是选项,这样就完整的找到了报头,剩下的就是有效载荷了 - 如何解决有效载荷向上交付的问题
IP 报头中有一个字段叫做 8 位协议,TCP 就是通过不同值将有效载荷交付给上层的,例如:TCP(6),UDP(17)
1.3 网段划分
假设阿建现在在重庆,并且他想去故宫玩,他首先要做的并不是直接坐动车/飞机到达故宫,而是需要先坐到北京,然后再去故宫。在现实生活中,目的地址 = 所在城市 + 具体景点。
同样 IP 地址分为两个部分,网络号和主机号
- 网络号:保证相互连接的两个网段具有不同的标识
- 不同的子网其实就是把网络号相同的主机放到一起。
- 如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中的其他主机重复
主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号

通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的 IP 地址都不相同
那么问题来了,手动管理子网内的 IP,是一个相当麻烦的事情
- 有一种技术叫做 DHCP,能够自动的给子网内新增主机节点分配 IP 地址,避免了手动管理 IP 的不便
- 一般的路由器都带有 DHCP 功能,因此路由器也可以看做一个 DHCP 服务器。
1.3.1 传统分类编址(ABCDE 类)
过去曾经提出一种划分网络号和主机号的方案,把所有 IP 地址分为五类,如下图所示

- A 类:0.0.0.0 ~ 127.255.255.255
- B 类:128.0.0.0 ~ 191.255.255.255
- C 类:192.0.0.0 ~ 223.255.255.255
- D 类:224.0.0.0 ~ 239.255.255.255
- E 类:240.0.0.0 ~ 247.255.255.255
随着 Internet 的飞速发展,这种划分方案的局限性很快显现出来,由于 A 类地址支持的主机太多,C 类地址支持的主机数太少,大多数组织都申请 B 类网络地址,导致 B 类地址很快就分配完了,而 A 类却浪费了大量地址。
例如,申请了一个 B 类地址,理论上一个子网内能允许 6 万 5 千多个主机。A 类地址的子网内的主机数更多然而实际网络架设中,不会存在一个子网内有这么多的情况,因此大量的 IP 地址都被浪费掉了。
1.3.2 子网掩码和 CIDR
针对传统分类编址出现的问题提出了新的划分方案,称为 CIDR(Classless Interdomain Routing):
- 引入一个额外的子网掩码来区分网络号和主机号
- 子网掩码也是一个 32 位的正整数,通常用一串 "0" 来结尾
- 将 IP 地址和子网掩码进行 "按位与" 操作,得到的结果就是网络号
- 网络号和主机号的划分与这个 IP 地址是 A 类、B 类还是 C 类无关
CIDR 表示法(斜杠表示法):
- IP 地址/前缀长度(如 140.252.20.0/24)
- 前缀长度:子网掩码中连续 1 的个数(如 /24 = 255.255.255.0)。

可见,IP 地址与子网掩码做与运算可以得到网络号,主机号从全 0 到全 1 就是子网的地址范围。
1.4 特殊的 IP 地址
- 将 IP 地址中的主机地址全部设为 0,就成为了网络号,代表这个局域网
- 将 IP 地址中的主机地址全部设为 1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包
- 127.* 的 IP 地址用于本机环回测试,通常是 127.0.0.1
1.5 IP 地址的数量限制
我们知道,IP 地址(IPv4)是一个 4 字节 32 位的正整数。那么一共只有 2 的 32 次方 个 IP 地址,大概是 43 亿左右,而 TCP/IP 协议规定,每个主机都需要有一个 IP 地址,这意味着,一共只有 43 亿台主机能接入网络么?
实际上,由于一些特殊的 IP 地址的存在,数量远不足 43 亿,另外 IP 地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个 IP 地址。
CIDR 在一定程度上缓解了 IP 地址不够用的问题(提高了利用率,减少了浪费,但是 IP 地址的绝对上限并没有增加),仍然不是很够用,这时候有三种方式来解决:
- 动态分配 IP 地址:只给接入网络主机分配 IP 地址,因此同一个 MAC 地址的主机,每次接入互联网中,得到的 IP 地址不一定是相同的
- NAT 技术:后面会重点介绍
- IPv6:IPv6 并不是 IPv4 的简单升级版,这是互不相干的两个协议,彼此并不兼容,IPv6 用 16 字节 128 位来表示一个 IP 地址,但是目前 IPv6 还没有普及
1.6 私有 IP 地址和公网 IP 地址
如果一个组织内部组建局域网,IP 地址只用于局域网内的通信,而不直接连到 Internet 上,理论上使用任意的 IP 地址都可以,但是 RFC 1918 规定了用于组建局域网的私有 IP 地址:
- 10.*,前 8 位是网络号,共 16,777,216 个地址
- 172.16.到 172.31.,前 12 位是网络号,共 1,048,576 个地址
- 192.168.*,前 16 位是网络号,共 65,536 个地址
包含在这个范围中的,都称为私有 IP,其余的则称为全局 IP(或公网 IP)
1.7 网络路由
1.7.1 路由器(子网划分、WAN 口 IP 和 LAN 口 IP)
以下是路由器的主要功能:
- 子网划分
- 通过设置不同的子网掩码(如 255.255.255.0),将一个局域网(LAN)划分为多个逻辑子网。
- WAN 口 IP 和 LAN 口 IP
- 一个路由器可以配置两个 IP 地址,一个是WAN 口 IP,一个是LAN 口 IP(子网 IP)
- 路由器 LAN 口连接的主机,都从属于当前这个路由器的子网
- 不同的路由器,子网 IP 其实都是一样的(通常都是 192.168.1.1),子网内的主机 IP 地址不能重复,但是子网之间的 IP 地址就可以重复了
- 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器,WAN 口 IP 就是一个公网 IP 了
- 子网内的主机需要和外网进行通信时,路由器将 IP 首部中的 IP 地址进行替换(替换成 WAN 口 IP),这样逐级替换,最终数据包中的 IP 地址成为一个公网 IP,这种技术称为 NAT(Network Address Translation,网络地址转换)
- 网络连接与数据转发
- 可将局域网与广域网连接,实现不同网络间的数据传输。例如,家庭路由器通过宽带接入互联网,让多台主机共享网络。
- 自动为局域网内的主机分配 IP 地址、子网掩码、网关等网络参数,无需手动配置,简化主机联网流程。
- 根据数据包的目标 IP 地址,查找路由表并选择最优路径,将数据从源网络转发到目标网络。

1.7.2 路由表
路由表是一个 结构化数据集,包含多条路由条目,每条条目指明:
'去往目标网络 X.X.X.X 的数据包,应该从哪个接口发出,下一跳地址是谁'
下面这张图片就是我的 Linux 操作系统查出来的路由表。

网络中的大部分设备都有路由表,当设备收到数据报后,会按照路由表条目顺序,查找报文的下一跳。当设备需要发送的数据包目的 IP 不在本地直连子网时,会根据路由表将数据包转发给路由器。

1.7.3 路由
路由是指网络中数据报文从源节点到目标节点的路径选择与转发过程,其本质是通过一系列规则(存储于路由表)决定'数据该往哪里走'。
在下面的图中,主机 B 发送的报文有很多方式去到主机 C,而路由会选择最优的一条路线。

1.8 分片与组装
1.8.1 分片与组装是什么
- 分片:当数据单元(如数据包)超过传输路径的最大传输单元(MTU,1500 字节)时,将其拆分为多个更小的片段(分片)进行传输的过程。
- 组装:接收端将多个分片按顺序重新组合成完整数据单元的过程。
1.8.2 为什么要分片
- 若数据包大小超过链路 MTU,会导致传输失败或效率下降,因此需将大数据包分片为符合 MTU 的小片段。
- 不进行分片,当大数据包超过 MTU 时,路由器可能直接丢弃数据包(或要求上层协议重传),导致传输延迟和带宽浪费。
1.8.3 IP 分片与组装
下面以一个实际的例子讲解 IP 分片与组装的过程,假设数据到达网络层时的大小为 3000 字节。
MTU 为 1500 字节,IP 头部为 20 字节,因此每个分片的最大数据部分为 1500 - 20 = 1480 字节。
1.8.3.1 分片过程
- 总数据量:3000 字节
- 单分片最大数据:1480 字节
- 分片数量:
- 前两个分片各承载 1480 字节,剩余 3000 - 1480×2 = 40 字节 由第三个分片承载
- 分片总长度:
- 前两个分片:1480(数据) + 20(IP 头) = 1500 字节
- 第三个分片:40(数据) + 20(IP 头) = 60 字节
- 片偏移计算:
- 第二个分片偏移:1480 / 8 = 185(表示从第 1480 字节开始)。
- 第三个分片偏移:(1480×2) / 8 = 370(表示从第 2960 字节开始)。

1.8.3.2 组装过程
- 分片缓存与排序
- 分组与缓存:接收端根据 IP 头部的标识 ID 将分片存入缓存,同一 ID 的分片归为一组。
- 按偏移排序:根据片偏移字段(以 8 字节为单位)确定分片顺序。例如,片偏移 0 的分片排在最前,185 的次之,370 的最后。
- 分片完整性检查
- MF 标志判断:当收到 MF=0 的分片(第三个分片)时,接收端确认所有分片已到齐。
- 数据连续性验证:
- 计算各分片数据范围是否连续。例如:
- 分片 1:0~1479 字节
- 分片 2:1480~2959 字节
- 分片 3:2960~2999 字节
- 若分片数据存在重叠或间隙,视为无效分片
- 计算各分片数据范围是否连续。例如:
- 数据重组与交付
- 拼接数据:按片偏移顺序将分片数据拼接,恢复 3000 字节原始有效载荷。
- 丢弃分片头部:去除 IP 头部,将完整数据报交付上层协议(如 TCP 或 UDP)。
- 超时处理:若分片在超时时间内未收齐,接收端丢弃已缓存的分片,触发上层协议重传。
1.8.4 分片的缺点
- 目标主机需等待所有分片按序到达才能重组,若分片丢失或延迟,主机会等待超时后丢弃全部分片,触发整包重传
- 每个分片需携带完整 IP 头部,分片越多,头部总开销越大
- 主机需为每个未完成重组的分片维护状态,大量分片同时传输时会占用大量内存,并增加 CPU 重组计算负载。
二、NAT 技术(网络地址转换技术)
2.1 为什么需要 NAT 技术
在互联网早期设计中,IPv4 采用 32 位地址(约 43 亿个),但随着终端设备爆发式增长,IP 地址面临耗尽风险。
在网络中私有地址不可路由:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 无法在互联网直接通信。
NAT 技术当前解决 IP 地址不够用的主要手段,是路由器的一个重要功能:
- NAT 能够将私有 IP 对外通信时转为全局 IP,也就是就是一种将私有 IP 和全局 IP 相互转化的技术方法
- 很多学校、家庭、公司内部采用每个终端设置私有 IP,而在路由器或必要的服务器上设置全局 IP
- 全局 IP 要求唯一,但是私有 IP 不需要,在不同的局域网中出现相同的私有 IP 是完全不影响的
NAT(网络地址转换,Network Address Translation)技术通过'地址复用'机制,让多个内网设备共享一个公网 IP 访问互联网,从根本上缓解了 IP 地址短缺问题,现在的 NAT 技术通常会在 IP 地址转换的同时,将端口号也进行转换。
2.2 NAT IP 转换过程
2.2.1 NAT 映射关系(NAT 映射表)
2.2.1.1 NAT 映射关系的核心原理
NAT(网络地址转换)的本质是通过映射表记录私有 IP 与公网 IP 的对应关系,实现内网主机访问公网的地址转换,现在的 NAT 技术通常会在 IP 地址转换的同时,将端口号也进行转换。
2.2.1.2 NAT 映射表的核心结构
| 内网地址(私有 IP: 端口) | 公网地址(公网 IP: 端口) | 协议类型(TCP/UDP/ICMP) | 会话超时时间 |
|---|---|---|---|
| 192.168.1.201:1025 | 122.77.241.4:3060 | TCP | 300 秒 |
2.2.1.3 NAT 映射关系的记录过程
- 家用路由器 NAT 映射表的建立(第一次转换)
- 触发条件:内网主机(192.168.1.201:1025)向公网服务器(122.77.241.3:8080)发送 TCP SYN 包
- 记录逻辑:
- 家用路由器(WAN 口 IP 为 10.1.1.2,私有 IP)生成临时端口 1025,创建映射:
(192.168.1.201:1025, TCP) --> (10.1.1.2:1025, TCP) - 动作:将数据包源 IP: 端口替换为 10.1.1.2:1025,发送至运营商路由器
- 家用路由器(WAN 口 IP 为 10.1.1.2,私有 IP)生成临时端口 1025,创建映射:
- 运营商路由器映射表的建立(第二次转换,若家用路由器为私有 IP)
- 触发条件:携带 10.1.1.2:1025 的数据包到达运营商服务器(公网 IP 为 122.77.241.4)
- 记录逻辑:
- 运营商路由器生成临时端口 3060,创建映射:
(10.1.1.2:1025, TCP) --> (122.77.241.4:3060, TCP)
- 运营商路由器生成临时端口 3060,创建映射:
- 动作:将数据包源 IP: 端口替换为 122.77.241.4:3060,发送至公网服务器
2.2.2 内网主机访问公网服务器过程
下面就是用来讲解本小点的网络状况。
我下面讲解的是家用路由器的 WAN 口 IP 为私有 IP 的情况,若大家需要理解 WAN 口 IP 为公网 IP 的情况,只需要省略运营商路由器 NAT 转换的步骤,并且修改 NAT 转换表即可。

当私有 IP 的主机访问公网 IP 的服务器时,需要经过以下步骤:
- 构建原始数据包
- 内网主机(如私有 IP:192.168.1.201)需要访问公网服务器(公网 IP:122.77.241.3)
- 数据包的源 IP 为内网地址(192.168.1.201),目标 IP 为公网服务器地址(122.77.241.3),并包含源端口号和目标端口号
- 数据包发送至家用路由器
- 内网主机通过网关将数据包发送到家用路由器。
- NAT 将内网主机的'私有 IP + 端口'映射到家用路由器 WAN 口 IP 的一个临时端口
- 将数据包的源 IP 替换为家用路由的 WAN 口 IP,源端口替换为映射后的临时端口
- 数据包发送至运营商路由器
- 家用路由器通过网关将数据包发送到运营路由器
- 这里根据家用路由器的 WAN 口 IP 是公网 IP 还是私有 IP 分为两种情况:
- 公网 IP:后序不在进行 NAT 转换,数据包通过路由到达公网服务器
- 私有 IP:还需要进行 NAT 转换,直到数据包的 IP 被替换为公网 IP
- NAT 将数据包中的的'IP + 端口'映射到运营商路由器 WAN 口 IP(公网 IP)的一个临时端口
- 将数据包的源 IP 替换为运营商路由器的 WAN 口 IP(122.77.241.4),源端口替换为映射后的临时端口
- 转发数据包至公网服务器
运营商将修改后的数据包发送到公网,数据包通过路由到达公网服务器,此时服务器接收到的数据包源 IP 为 122.77.241.4,目标 IP 为自身地址(122.77.241.3)。

2.2.3 公网服务器响应内网主机过程
私有 IP 是不能存在公网中的,假设如果没有路由器的 NAT 映射表,公网服务器是无法找到内网主机的,而有了 NAT 映射表,就可以通过映射关系,将数据响应给内网主机了。
由于内网主机的 IP 通过一次或多次 NAT IP 转换,最终被转化为公网 IP,最终到达公网服务器时,数据包中源 IP 地址就是这个公网 IP,公网服务器响应时,最多只能将数据包路由到这个公网 IP,这个公网 IP 所对应的路由器,我们可以称之为入口路由器,数据包到达入口路由器后,需要通过 NAT 路由表反向查询,最终才可以到达内网主机。
我下面讲解的是家用路由器的 WAN 口 IP 为私有 IP 的情况,若大家需要理解 WAN 口 IP 为公网 IP 的情况,只需要省略运营商路由器 NAT 转换的步骤,并且修改 NAT 转换表即可。
以下就是公网服务器响应内网主机过程:
- 公网服务器发送响应数据包
- 场景:内网主机(192.168.1.201:1025)向服务器(122.77.241.3:8080)发送请求后,服务器生成响应数据。
- 数据包结构:
- 源 IP:服务器公网 IP(122.77.241.3)
- 目标 IP:(分家用路由器 WAN 口 IP 是私有 IP 还是公网 IP)
- 公网:家用服务器的公网 IP
- 私有:运营商服务器的公网 IP(122.77.241.4)
- 源端口:服务器端口(8080)
- 目标端口:(分家用路由器 WAN 口 IP 是私有 IP 还是公网 IP)
- 公网:家用服务器的公网 IP
- 私有:运营商服务器的临时端口(3060)
- 若存在多层 NAT(看情况执行该步骤)
- 场景:若家用路由器的 WAN 口 IP 是私有 IP(如 10.1.1.2),则响应包需先经过运营商路由器的 NAT 转换:
- 运营商路由器接收响应包:
- 服务器响应包的目标 IP 是运营商路由器的公网 IP(122.77.241.4),目标端口是运营商 NAT 分配的临时端口(如 3060)。
- 运营商 NAT 反向转换:
- 运营商路由器查询映射表,找到映射关系:
公网 IP:端口(122.77.241.4:3060)<--> 内网 IP:端口(10.1.1.2:2000)- 将目标 IP 替换为家用路由器的私有 IP(10.1.1.2),目标端口替换为对应的临时端口(如 2000),然后转发给家用路由器。
- 响应包到达家用路由器
- 步骤 1:查询 NAT 映射表
- 家用路由器收到数据包后,根据目标端口(2000)查询 NAT 表,找到映射关系:
公网 IP:端口(10.1.1.2:2000)<--> 内网 IP:端口(192.168.1.201:1025)
- 步骤 2:修改数据包地址
- 将数据包的目标 IP 替换为内网主机 IP(192.168.1.201)
- 将目标端口替换为内网主机的源端口(1025)
- 步骤 3:转发至内网主机
- 路由器将修改后的数据包发送给内网主机。
- 步骤 1:查询 NAT 映射表

2.3 NAT 技术的缺陷
由于 NAT 依赖这个转换表,所以有诸多限制:
- NAT 设备通常只允许'响应已建立连接'的数据包通过,导致外网设备无法主动向内网设备发起连接(除非内网设备先发起请求)
- NAT 转换需对每个数据包进行包头修改和查表操作,增加处理延迟,
- NAT 映射表的生成和销毁都需要额外开销;
- 通信过程中一旦 NAT 设备异常,所有的 TCP 连接也都会断开,需要重新进行连接
2.4 NAT 技术 VS 代理服务器
2.4.1 代理服务器是什么
代理服务器(Proxy Server)是一种位于客户端与目标服务器之间的中间服务器,它充当'中间人'角色,负责接收客户端的请求并转发给目标服务器,同时将目标服务器的响应返回给客户端。其核心作用是转发请求与响应,并可在此过程中实现缓存、安全控制、负载均衡等功能。
2.4.2 正向代理和反向代理
2.4.2.1 代理的对象和所处的网络位置
- 正向代理
- 代理对象:为客户端提供代理服务,隐藏客户端真实身份。
- 网络位置:位于客户端所在的网络(如内网),客户端明确知道代理服务器的存在。
- 反向代理
- 代理对象:为服务器提供代理服务,隐藏服务器真实地址。
- 网络位置:位于服务器所在的网络(如公网),客户端不知道代理的存在,以为直接访问的是目标服务器。
2.4.2.2 工作流程
-
正向代理工作流程:
- 客户端向正向代理服务器发送请求,指定目标服务器
- 代理服务器接收请求后,以自身名义向目标服务器发送请求
- 目标服务器响应后,代理服务器将数据返回给客户端
-
反向代理工作流程:
- 客户端向反向代理服务器发送请求(认为代理服务器就是目标服务器)
- 代理服务器根据规则(如 URL、端口等)将请求转发给后端的真实服务器
- 真实服务器响应后,代理服务器将数据返回给客户端,客户端认为响应来自代理服务器
示例:网站使用反向代理隐藏真实服务器集群地址,同时实现负载均衡

示例:内网用户通过正向代理访问外网,代理服务器作为'中介'转发请求,隐藏用户的内网 IP

2.4.2.3 核心功能与应用场景
- 正向代理的典型功能:
- 突破网络限制:如内网访问公网时绕过防火墙限制。
- 缓存资源:减少重复请求,加快访问速度(如浏览器代理缓存网页)。
- 隐藏客户端身份:通过代理 IP 访问目标服务器,保护用户隐私。
- 反向代理的典型功能:
- 负载均衡:将请求分发到多个后端服务器,避免单台服务器过载(如电商网站应对高并发)。
- 安全防护:隐藏真实服务器地址,阻挡直接攻击(如 DDoS 攻击首先针对代理服务器)。
- 服务整合:统一接口对外提供服务,屏蔽后端服务器的差异(如微服务架构中的网关)。
2.4.2.4 客户端与服务器的感知差异
- 正向代理:客户端明确配置代理服务器地址(如浏览器设置代理),知道自己通过代理访问目标服务器。
- 反向代理:客户端直接访问代理服务器的地址(如域名),完全不知道后端真实服务器的存在,认为代理就是目标服务器。
2.4.3 NAT 技术 VS 代理服务器
内网设备向公网发送请求时,NAT 设备(如路由器)会将数据包的源 IP(内网 IP)替换为自身的公网 IP,并记录'内网 IP: 端口'与'公网 IP: 临时端口'的映射关系。当公网服务器响应时,NAT 设备根据映射关系将数据包转发给对应的内网设备。
客户端向代理服务器发送请求,代理服务器解析请求后,以自身名义向目标服务器发送请求,并将目标服务器的响应返回给客户端。代理服务器无需修改 IP 地址(反向代理场景中,客户端认为代理就是目标服务器),而是在应用层处理请求与响应。
NAT 技术和代理服务器均作为网络通信的'中转站',实现数据转发,下面就讲述两者的区别:
- 从应用上讲:
- NAT 设备是网络基础设备之一,解决的是 IP 不足的问题
- 代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙,另外像 UU 这样的加速器,也是使用代理服务器
- 从底层实现上讲
- NAT 是工作在网络层,直接对 IP 地址进行替换
- 代理服务器往往工作在应用层
- 从使用范围上讲
- NAT 一般在局域网的出口部署
- 代理服务器可以在局域网做,也可以在广域网做,也可以跨网
- 从部署位置上看
- NAT 一般集成在防火墙,路由器等硬件设备上
- 代理服务器则是一个软件程序,需要部署在服务器上.
2.5 内网穿透(内网打洞)
2.5.1 内网穿透的定义
内网穿透,又称NAT 穿透 或内网打洞,是指通过技术手段使位于内网(私有网络)中的设备能够被公网(互联网)或其他内网的设备直接访问的过程。
2.5.2 内网穿透的实际应用
2.5.2.1 两台不同局域网主机的通信
主机向服务器发送请求,服务器一定可以知道主机对应运营商的出口路由器的公网 IP 地址和对应端口,服务器一定也可以将主机对应运营商的出口路由器的公网 IP 地址和对应端口作为响应正文,发送给请求方,并且在这个过程中,NAT 设备会建立 NAT 映射表。
- 主机 A 向服务器发送请求,服务器就知道主机 A 对应运营商的出口路由器的公网 IP 地址和对应端口,服务器可以将该信息作为响应正文发送给主机 A,主机 A 就知道自己对应运营商的出口路由器的公网 IP 地址和对应端口
- 同理,主机 B 向服务器发送请求,主机 B 和服务器都可以知道主机 B 对应运营商的出口路由器的公网 IP 地址和对应端口
- 服务器知道了主机 A 和主机 B 对应运营商的出口路由器的公网 IP 地址和对应端口
- 主机 A 可以再次发送请求,让服务器将主机 B 对应运营商的出口路由器的公网 IP 地址和对应端口发送给给主机 A
- 同理,主机 B 也可以再次发送请求,获取主机 A 的这些信息
- 这样,主机 A 和主机 B 就知道了对方的运营商的出口路由器的公网 IP 地址和对应端口,主机 A 和主机 B 就可以不再通过服务器就进行通信了
通过上面的步骤就可以实现两个在不同局域网的主机进行通信了。

2.5.2.2 远程控制内网设备
远程控制内网设备与两台不同局域网主机的通信的原理基本一致。
- 主机 A 和主机 B 首次访问服务器时,各自的运营商路由器会将私有 IP 替换为公网 IP 和端口。服务器记录这些信息,并通过响应返回给主机,并且在这个过程中,NAT 设备会建立 NAT 映射表
- 主机 A 可以向服务器发送请求,服务器会将主机 B 运营商路由器公网 IP 和端口作为响应发送给主机 A
- 后序主机 A 可以通过向主机 B 发送控制协议数据包或者其他方式,使得主机 A 可以直接控制主机 B
三、ICMP 协议
ICMP(Internet Control Message Protocol,互联网控制报文协议),主要用于在 IP 设备间传递网络状态和控制信息(如错误报告、可达性测试)。其核心价值在于提升网络诊断能力和管理效率。
ICMP 协议也是基于 IP 协议工作的,但是它并不是传输层的功能,因此人们仍然把它归结为网络层协议。
3.1 ICMP 协议的主要功能
- 验证主机与网关或目标设备的直接连通性。
- 若 ICMP 应答延迟过高或丢失,说明网络拥塞或链路故障。
- 通过域名 Ping 测试 DNS 解析是否正确,同时验证目标服务器可达性。
3.2 ICMP 报文格式

- 类型:标识报文功能(如 8 为请求回显,0 为回显应答)。
- 代码:对类型的进一步细分(如类型 3'目标不可达'包含 13 种代码,如代码 1 表示'网络不可达')。
- 校验和:用于检测报文传输中的错误。
3.3 常见 ICMP 报文类型

3.4 Ping 命令
3.4.1 Ping 命令是什么
Ping 是基于 ICMP 协议设计的网络诊断工具,其核心通过发送和接收 ICMP 回显报文实现连通性检测。具体依赖以下两种 ICMP 报文类型:
- ICMP 回显请求(Echo Request):类型码为 8,由发送方主动发出,用于测试目标可达性。
- ICMP 回显应答(Echo Reply):类型码为 0,目标主机收到请求后返回,确认通信正常。
3.4.2 Ping 命令输出关键指标
注意,此处 ping 的是域名,而不是 url,一个域名可以通过 DNS 解析成 IP 地址。

- 生存时间(Time to Live),每经路由器减 1,用于推算网络跳数:初始 TTL - 收到 TTL ≈ 跳数
- 往返延迟(RTT),单位毫秒(ms)
- 丢包率(反映网络稳定性)
- 最小/平均/最大延迟(评估网络质量)
3.4.3 Ping 命令常见误区
有些面试官可能会问:telnet 是 23 端口,ssh 是 22 端口,那么 ping 是什么端口?
注意:这是面试官的圈套,Ping 命令基于 ICMP 协议,是在网络层,而端口号,是传输层的内容,在 ICMP 协议中根本就不关注端口号这样的信息。


