【Linux | 网络】网络层(IP协议、NAT技术和ICMP协议)
- 一、IP协议
- 1.1为什么需要IP协议
- 1.2 IP协议段格式
- 1.3 网段划分
- 1.3.1 传统分类编址(ABCDE类)
- 1.3.2 子网掩码和CIDR
- 1.4 特殊的IP地址
- 1.5 IP地址的数量限制
- 1.6 私有IP地址和公网IP地址
- 1.7 网络路由
- 1.7.1 路由器(子网划分、WAN口IP和LAN口IP)
- 1.7.2 路由表
- 1.7.3 路由
- 1.8 分片与组装
- 1.8.1 分片与组装是什么
- 1.8.2 为什么要分片
- 1.8.3 IP 分片与组装
- 1.8.3.1 分片过程
- 1.8.3.2 组装过程
- 1.8.4 分片的缺点(分片一定是不好的)
- 二、NAT技术(网络地址转换技术)
- 2.1 为什么需要NAT技术
- 2.2 NAT IP转换过程
- 2.2.1 NAT 映射关系(NAT 映射表)
- 2.2.1.1 NAT 映射关系的核心原理
- 2.2.1.2 NAT 映射表的核心结构
- 2.2.1.3 NAT 映射关系的记录过程
- 2.2.2 内网主机访问公网服务器过程
- 2.2.3 公网服务器响应内网主机过程
- 2.3 NAT技术的缺陷
- 2.4 NAT技术 VS 代理服务器
- 2.4.1 代理服务器是什么
- 2.4.2 正向代理和反向代理
- 2.4.2.1 代理的对象和所处的网络位置
- 2.4.2.2 工作流程
- 2.4.2.3 核心功能与应用场景
- 2.4.2.4 客户端与服务器的感知差异
- 2.4.3 NAT技术 VS 代理服务器
- 2.5 内网穿透(内网打洞)
- 2.5.1 内网穿透的定义
- 2.5.2 内网穿透的实际应用
- 2.5.2.1 两台不同局域网主机的通信
- 2.5.2.2 远程控制内网设备
- 三、ICMP协议
- 3.1 ICMP协议的主要功能
- 3.2 ICMP 报文格式
- 3.3 常见 ICMP 报文类型
- 3.4 Ping命令
- 3.4.1 Ping命令是什么
- 3.4.2 Ping命令输出关键指标
- 3.4.3 面试关于Ping命令的坑
- 结尾
一、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,发送至运营商路由器
-
- 运营商路由器映射表的建立(第二次转换,若家用路由器为私有 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)。
- 运营商将修改后的数据包发送到公网,数据包通过路由到达公网服务器,此时服务器接收到的数据包源 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:转发至内网主机
- 路由器将修改后的数据包发送给内网主机。
-
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 工作流程
-
正向代理工作流程:
- 客户端向正向代理服务器发送请求,指定目标服务器
- 代理服务器接收请求后,以自身名义向目标服务器发送请求
- 目标服务器响应后,代理服务器将数据返回给客户端
- 示例:内网用户通过正向代理访问外网,代理服务器作为 “中介” 转发请求,隐藏用户的内网 IP
-
反向代理工作流程:
- 客户端向反向代理服务器发送请求(认为代理服务器就是目标服务器)
- 代理服务器根据规则(如 URL、端口等)将请求转发给后端的真实服务器
- 真实服务器响应后,代理服务器将数据返回给客户端,客户端认为响应来自代理服务器
- 示例:网站使用反向代理隐藏真实服务器集群地址,同时实现负载均衡
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协议中根本就不关注端口号这样的信息。
结尾
如果有什么建议和疑问,或是有什么错误,大家可以在评论区中提出。
希望大家以后也能和我一起进步!!🌹🌹
如果这篇文章对你有用的话,希望大家给一个三连支持一下!!🌹🌹