NAT、代理服务、内网穿透与五种IO模型

一、NAT技术背景

之前我们讨论了,IPv4协议中,IP地址数量不充足的问题

NAT技术当前解决IP地址不够用的主要手段,是路由器的⼀个重要功能

  1. NAT能够将私有IP对外通信时转为全局IP;也就是就是⼀种将私有IP和全局IP相互转化的技术方法
  2. 很多学校,家庭,公司内部采用每个终端设置私有IP,而在路由器或必要的服务器上设置全局IP
  3. 全局IP要求唯⼀,但是私有IP不需要;在不同的局域网中出现相同的私有IP是完全不影响的

(1) NAT IP转换过程

  • NAT路由器将源地址从10.0.0.10替换成全局的IP:202.244.174.37
  • NAT路由器收到外部的数据时,又会把目标IP从202.244.174.37替换回10.0.0.10
  • 在NAT路由器内部,有⼀张自动生成的,用于地址转换的表
  • 当 10.0.0.10 第⼀次向163.221.120.9 发送数据时就会生成表中的映射关系

(2) NAPT

那么问题来了,如果局域网内,有多个主机都访问同⼀个外网服务器,那么对于服务器返回的数据中,目的IP都是相同的;那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?

这时候NAPT来解决这个问题了;使用IP+port来建立这个关联关系

这种关联关系也是由NAT路由器自动维护的;例如在TCP的情况下,建立连接时,就会生成这个表项;在断开连接后,就会删除这个表项

(3) NAT技术的缺陷

由于NAT依赖这个转换表,所以有诸多限制:

  1. 无法从NAT外部向内部服务器建立连接
  2. 装换表的生成和销毁都需要额外开销
  3. 通信过程中⼀旦NAT设备异常,即使存在热备,所有的TCP连接也都会断开

二、代理服务器

(1) 正向代理

  • 正向代理(Forward Proxy)是⼀种常见的网络代理方式,它位于客户端和目标服务器之间,代表客户端向目标服务器发送请求;正向代理服务器接收客户端的请求,然后将请求转发给目标服务器,最后将目标服务器的响应返回给客户端;通过这种方式,正向代理可以实现多种功能,如提高访问速度、隐藏客户端身份、实施访问控制等

a. 工作原理

  • 客户端将请求发送给正向代理服务器
  • 正向代理服务器接收请求,并根据配置进行处理,如缓存查找、内容过滤等
  • 正向代理服务器将处理后的请求转发给目标服务器
  • 目标服务器处理请求,并将响应返回给正向代理服务器
  • 正向代理服务器将响应返回给客户端
  • Nginx

b. 功能特点

  • 缓存功能:正向代理服务器可以缓存经常访问的资源,当客户端再次请求这些资源时,可以直接从缓存中获取,提高访问速度
  • 内容过滤:正向代理可以根据预设的规则对请求或响应进行过滤,如屏蔽广告、阻止恶意网站等
  • 访问控制:通过正向代理,可以实现对特定网站的访问控制,如限制员工在工作时间访问娱乐网站
  • 隐藏客户端身份:正向代理可以隐藏客户端的真实IP地址,保护客户端的隐私
  • 负载均衡:在多个目标服务器之间分配客户端请求,提高系统的可扩展性和可靠性

c. 应用场景

企业网络管理:企业可以通过正向代理实现对员工网络访问的管理和控制,确保员工在工作时间内专注于工作,避免访问不良网站或泄露公司机密

公共网络环境:在公共场所如图书馆、学校等提供的网络环境中,通过正向代理可以实现对网络资源的合理分配和管理,确保网络使用的公平性和安全性

内容过滤与保护:家长可以通过设置正向代理来过滤不良内容,保护孩子免受网络上的不良信息影响

提高访问速度:对于经常访问的网站或资源,正向代理可以通过缓存机制提高访问速度,减少网络延迟

跨境电商与海外访问:对于跨境电商或需要访问海外资源的企业和个人,正向代理可以帮助他们突破网络限制,顺畅地访问海外网站和资源

(2) 反向代理

  • 反向代理服务器是⼀种网络架构模式,其作为Web服务器的前置服务器,接收来自客户端的请求, 并将这些请求转发给后端服务器,然后将后端服务器的响应返回给客户端;这种架构模式可以提升网站性能、安全性和可维护性等

a. 基本原理

  • 反向代理服务器位于客户端和Web服务器之间,当客户端发起请求时,它首先会到达反向代理服务器;反向代理服务器会根据配置的规则将请求转发给后端的Web服务器,并将Web服务器的响应返回给客户端;在这个过程中,客户端并不知道实际与哪个Web服务器进行了交互,它只知道与反向代理服务器进行了通信

b. 应用场景

  • 负载均衡:反向代理服务器可以根据配置的负载均衡策略,将客户端的请求分发到多个后端服务器上,以实现负载均衡;这有助于提升⽹站的整体性能和响应速度,特别是在高并发场景下
  • 安全保护:反向代理服务器可以隐藏后端Web服务器的真实IP地址,降低其被直接攻击的风险;同时,它还可以配置防火墙、访问控制列表(ACL)等安全策略,对客户端的请求进行过滤和限制, 以保护后端服务器的安全
  • 缓存加速:反向代理服务器可以缓存后端Web服务器的响应内容,对于重复的请求,它可以直接从缓存中返回响应,而无需再次向后端服务器发起请求;这可以大大减少后端服务器的负载,提升网站的响应速度
  • 内容过滤和重写:反向代理服务器可以根据配置的规则对客户端的请求进行过滤和重写,例如添加或删除请求头、修改请求路径等;这有助于实现⼀些特定的业务需求,如URL重写、用户认证等
  • 动静分离:在大型网站中,通常需要将静态资源和动态资源分开处理;通过将静态资源部署在反向代理服务器上,可以直接从反向代理服务器返回静态资源的响应,而无需再次向后端服务器发起请求;这可以大大提升静态资源的访问速度
  • CDN(Content Delivery Network,内容分发⽹络)就是采用了反向代理的原理

(3) NAT和代理服务器

路由器往往都具备NAT设备的功能,通过NAT设备进行中转,完成子网设备和其他子网设备的通信过程

代理服务器看起来和NAT设备有⼀点像;客户端像代理服务器发送请求,代理服务器将请求转发给真正要请求的服务器;服务器返回结果后,代理服务器又把结果回传给客户端

🔺 那么NAT和代理服务器的区别有哪些呢?

  1. 从应用上讲,NAT设备是网络基础设备之⼀,解决的是IP不足的问题;代理服务器则是更贴近具体应用,比如通过代理服务器进行翻墙,另外像迅游这样的加速器,也是使用代理服务器
  2. 从底层实现上讲,NAT是工作在网络层,直接对IP地址进行替换;代理服务器往往工作在应用层
  3. 从使用范围上讲,NAT⼀般在局域网的出口部署,代理服务器可以在局域网做,也可以在广域网做,也可以跨网
  4. 从部署位置上看,NAT⼀般集成在防火墙,路由器等硬件设备上,代理服务器则是⼀个软件程序,需要部署在服务器上

📍 代理服务器是⼀种应用比较广的技术

  • 翻墙:广域网中的代理
  • 负载均衡:局域网中的代理

🔺 代理服务器又分为正向代理和反向代理

正向代理用于请求的转发(例如借助代理绕过反爬虫)

反向代理往往作为⼀个缓存

三、内网穿透

四、内网打洞

五、五种IO模型

(1) 阻塞IO

在内核将数据准备好之前,系统调用会⼀直等待;所有的套接字,默认都是阻塞方式

(2) 非阻塞IO

如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回EWOULDBLOCK错误码

🔺 非阻塞IO往往需要程序员循环的方式反复尝试读写文件描述符,这个过程称为轮询;这对CPU来说是较大的浪费,⼀般只有特定场景下才使用

(3) 信号驱动IO

内核将数据准备好的时候,使用SIGIO信号通知应用程序进行IO操作

(4) IO多路转接

虽然从流程图上看起来和阻塞IO类似;实际上最核心在于IO多路转接能够同时等待多个文件描述符的就绪状态

(5) 异步IO

由内核在数据拷贝完成时,通知应用程序(而信号驱动是告诉应用程序何时可以开始拷贝数据)

📍 小结:任何IO过程中,都包含两个步骤;第⼀是等待,第⼆是拷贝;而且在实际的应用场景中,等待消耗的时间往往都远远高于拷贝的时间;让IO更高效,最核心的办法就是让等待的时间尽量少

六、高级IO重要概念

(1) 同步通信 vs 异步通信

同步和异步关注的是消息通信机制

  1. 所谓同步,就是在发出⼀个调用时,在没有得到结果之前,该调用就不返回;但是⼀旦调用返回,就得到返回值了;换句话说,就是由调用者主动等待这个调用的结果
  2. 异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果;换句话说,当⼀个异步过程调用发出后,调用者不会立刻得到结果;而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用

另外,我们回忆在讲多进程多线程的时候,也提到同步和互斥;这里的同步通信和进程之间的同步是完全不相干的概念

  1. 进程/线程同步也是进程/线程之间直接的制约关系
  2. 是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系;尤其是在访问临界资源的时候

(2) 阻塞 vs 非阻塞

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态

  1. 阻塞调用是指调用结果返回之前,当前线程会被挂起;调用线程只有在得到结果之后才会返回
  2. 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程

七、补充

  • 子网地址中,最后一位全0代表网络号,不用;最后一位全1,代表广播号,也不用
  • 运营商
  1. 基础工作都是运营商完成的,电缆、光纤等设施都是他们完成的,所以我们要交钱给他们,否则他们可以把我们和抖音、淘宝等服务器的连接断开
  2. 我们所有人,都不可能直接连接公网,我们都是通过先连到局域网中,通过局域网入的公网
  3. 私有IP可以重复------>IP不足问题,就被大大缓解了
  • NAT技术
  1. 内网到公网的过程中,途径路由器都会雁过拔毛,替换源IP,变成自己的WAN口IP
  2. 公网内就不做替换了,这个替换工作,只在内网转发进行
  3. 我们所有人都在局域网中
  4. 内网的IP+端口与NAT转化完的IP+端口;会护卫键值;若同一局域网中的主机请求同一服务器的端口,那么源port也会替换
  • 内网打洞技术

🔺 前提:运营商的出入口路由器要开放和支持打洞技术

  1. 双方主机先连公网服务器,然后各自路由器NAT生成公网映射端口
  2. 公网服务器分别把对方的公网地址发送给对方
  3. 双方同时发包
  4. 双方路由器都看到内网主动向外发过,就允许对方的外网包进来,从此两方形成P2P直连,不再经过公网
  • 内网穿透技术

🔺 让外网能主动访问无公网IP的内网设备

  1. 把学校 / 公司的机器的某个本地端口,连接到frps上
  2. 云服务器上也有frp服务端,它把学校 / 公司的机器发来的端口转化一下,形成自己的本地端口
  3. 我自己就可以直接访问云服务器上的端口,就相当于直接访问这个机器上的本地端口
  4. 内网打洞是内网穿透技术的一种
  • NAT与代理服务器的区别
  1. NAT设备解决IP问题不足;代理服务器更加贴近具体应用,例如翻墙、游戏加速等
  2. NAT工作在网络层,代理服务器工作在应用层
  3. NAT一般在局域网的出口部署,代理服务器可在局域网 / 广域网 / 跨网做
  4. NAT一般集成在防火墙、路由器等硬件设备上,代理服务器则是一个软件服务,需部署在服务器上
  • 正向代理

我们在学校使用校园网访问学校的代理服务器,去访问外网或者内部电子图书馆,这才算正向代理;如果使用别的浏览器或者仅是使用校园网访问外网,不算代理

🔺 提客户端上网 客户端------>代理服务器------>外网

  • 反向代理

一般需要一台十分高配的反向代理服务器,进行负载均衡算法向内网服务器发送外网请求

🔺 替服务器接待 外网用户------>反向代理------>内网业务服务器

  • IO
  1. 本质:IO=等+拷贝
  2. 外设<------>:网络通信本质是属于IO范畴的
  3. output=等空间就绪+拷贝
  4. input=等数据就绪+拷贝
  • 高效的IO,就是在单位时间内,IO中等的比例越低,IO效率越高
  • 常见的5中IO模型
  1. 张三:一直关注鱼漂,鱼上钩立马识别,完成钓鱼;如果鱼漂不动,什么都不做,一直关注鱼漂(阻塞IO)
  2. 李四:轮询式关注鱼漂,不会因为鱼漂没有鱼咬住而卡住(非阻塞IO)
  3. 王五:铃铛通知自己(信号驱动IO)
  4. 赵六:同时检测多个鱼竿上的鱼漂事件(多路复用)
  5. 田七:小王替老板钓鱼(异步IO)
  • 异步IO:就是只负责发起IO,不参与IO任何细节
  • 同步IO:只要参与IO的过程,就是同步IO
相关推荐
振浩微433射频芯片9 小时前
工业环境下的“硬核”选择:如何科学评估国产433芯片的可靠性?
网络·人工智能·科技·单片机·物联网·学习
Ha_To9 小时前
26.5.19 未授权漏洞
linux·服务器·网络
日取其半万世不竭9 小时前
Docker 网络模式详解:bridge、host、overlay 和 macvlan
网络·docker·容器
有个人神神叨叨9 小时前
[特殊字符] 东芝天氟地水 + 宏云智能 → 米家/HA 统一控制,智能家居整合方案 - 手残党求骂醒版
网络·智能家居
AI科技星9 小时前
全域粒子质量几何曲率统一公式体系(通俗易懂版)
c语言·开发语言·网络·量子计算·agi
minji...9 小时前
Linux 网络基础之传输层协议TCP(九)从内核源码的角度打通系统与网络之间的关系,套接字多态的体现
linux·运维·服务器·网络·网络协议·tcp/ip·http
yyuuuzz9 小时前
独立开发者线上服务运维的几点实践经验
运维·服务器·网络·云计算·aws
想唱rap9 小时前
IO多路转接Select
运维·服务器·网络·数据库·sql·tcp/ip·mysql
沪漂阿龙10 小时前
Docker 面试题详解:容器、镜像、Dockerfile、网络、Volume、Compose、安全与生产实践一次讲透
网络·安全·docker