Java 网络原理 ③-NAT || DHCP

devtools/2025/2/4 17:32:56/

 这里是Themberfue 

 上篇文章我们简单介绍了 IP 协议 的首部字段的含义,这节课我们将继续深入 IP 协议~~~


DHCP

  • 上节课我们提到,IPv4 使用点分十进制的方式管理地址,但是 IPv4 最多分配43亿个地址,早在2019年,IPv4 的地址就已经全部分配完了,为了解决这些问题,人们想到了一系列方法:动态IP分配、NATIPv6......
  • 动态IP分配:每台需要使用网络的机器的地址并不是每时每刻都是该台机器的,如果该机器未在使用网络,在不分配 IP 地址,此时就会空出一个,把这空出来的给另一个正在使用网络的机器,DHCP 便充当该角色,但 DHCP 的功能并非只有这个。
  • DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),动态 IP 分配指的是通过自动化方式(通常由专门的服务器完成)给网络中的设备分配 IP 地址,而不是手动为每台设备静态配置 IP 地址。这种方式主要通过 DHCP(动态主机配置协议) 来实现。下面详细介绍动态 IP 分配的原理、过程和优缺点。
  • 在大型网络中,手动为每台设备配置IP地址既繁琐又容易出错;而设备经常加入或离开网络IP 地址 资源需要灵活管理。动态 IP 分配使得网络管理员能够集中管理 IP 地址池,设备接入网络时自动获得 IP 地址,降低维护成本,提高网络的可管理性与灵活性。
  • 动态IP分配通过 DHCP 协议 自动为客户端分配 IP 地址 及相关网络配置信息,极大地简化了网络管理工作。它通过租约机制确保 IP 地址 资源的高效利用,同时为设备频繁加入和退出网络提供灵活支持。尽管存在对中心服务器依赖和安全问题,但通过恰当的管理和防护措施,动态 IP 分配已成为现代网络的标准配置方式。

DHCP协议的主要步骤

DHCP发现(DHCP Discover)

  • 当客户端(例如一台电脑或手机)首次连接网络时,它不知道可用的IP地址。
  • 客户端发送一个 DHCP Discover 广播消息,寻找局域网内的 DHCP服务器

DHCP提供(DHCP Offer)

  • 网络中的 DHCP服务器 收到广播后,从其IP地址池中挑选一个可用的IP地址,并发送一个 DHCP Offer 消息。
  • 该消息中包含了可分配的IP地址、子网掩码、网关、DNS服务器等配置信息,以及租约时间(lease time)。

DHCP请求(DHCP Request)

  • 客户端从收到的多个DHCP Offer中选择一个(通常第一个响应的),然后发送一个 DHCP Request 消息给选定的 DHCP服务器,确认请求该IP地址。
  • 这个消息也会被其他 DHCP服务器 收到,从而让它们知道客户端选择了某个服务器的配置。

DHCP确认(DHCP ACK)

  • 选定的 DHCP服务器 收到客户端的请求后,发送一个 DHCP ACK 消息,确认IP地址分配。
  • 客户端收到ACK后,就正式使用该IP地址,并根据租约时间使用该地址,直到租约到期或续租。

  • 上述提到的租约是什么
  • 租约(Lease):动态IP分配并非永久性的。分配给客户端的IP地址有一个租用期限(lease time)。在租期结束前,客户端可以发起续租请求;如果续租失败或客户端离网,DHCP服务器会将该IP地址收回,供其他设备使用。
  • 租期管理:租期机制确保了IP地址资源的有效利用,并防止由于设备长时间不更新状态而造成的资源浪费。
  • 集中管理DHCP服务器集中管理网络中的IP地址池和相关配置信息,一旦IP地址发生冲突或网络结构变化,管理员可以统一调整设置。

💎凡事皆有优劣,使用 动态 IP 分配也不例外

优点

  • 自动化管理:客户端自动获取IP地址,简化了网络配置工作。

  • 灵活性IP地址可以在设备间动态分配,适应设备频繁加入或离开的情况。

  • 降低错误:避免手动配置可能导致的地址冲突和错误配置问题。

  • 集中控制:管理员可以通过 DHCP服务器 集中管理整个网络IP地址和其他网络参数(如DNS、网关)。

缺点

  • 依赖中心服务器:如果DHCP服务器故障或不可达,新设备可能无法获得IP地址,导致网络接入受阻。

  • 租约管理带来的额外开销:租期到期后,设备需要发起续租操作,增加了网络交互次数。

  • 安全问题DHCP本身缺乏认证机制,可能受到攻击者伪装的DHCP服务器(如DHCP欺骗)的威胁。


DHCP 的应用场景非常丰富

  • 家庭网络:家用路由器内置DHCP服务器,自动为连接的电脑、手机等设备分配IP地址。
  • 企业网络:企业内部网络通过专用的DHCP服务器分配IP地址,并结合DNS、网络管理工具实现集中控制。

  • 移动网络:移动运营商利用动态IP分配管理大量的用户终端连接。

  • 公共Wi-Fi热点:在咖啡馆、机场等场所,公共Wi-Fi通常也依赖DHCP为访问者分配临时IP地址。


NAT 

  • 单纯靠动态 IP 分配解决 IPv4 地址短缺的问题是不够的。目前,NAT 机制才是解决 IPv4 地址短缺的可靠方案。
  • 在进入 NAT 前,学计算机的宝宝们有没有这样一个疑惑,我知道你的 IP 地址,你也知道我的,那我和你为什么不能直接通信,比如联机游戏不能直接连接,而是需要听过某些方法才可以一起娱乐的玩耍,这就是 NAT 机制造成的了~~~
  • NAT(Network Address Translation,网络地址转换) 是一种用于 IPv4 网络的技术,主要用于在私有网络(如家庭、公司局域网)与公有网络(如互联网)之间进行 IP 地址转换。它允许多个私有 IP 通过一个或多个公网 IP 访问互联网,从而缓解 IPv4 地址耗尽的问题,并提供一定的安全性。

  • NAT 机制将 IP 分为 公网IP/外网IP私网IP/内网IP,私网IP 在同一个局域网下不可重复,但在不同的局域网下可以重复,其表示范围通常在 10.*、172.16-172.31.*、192.168.*。公网IP 则必须是唯一的,除了 私网IP 表示的范围除外,其他都可以用来表示 公网IP


  • 在同一局域网下的设备,任何设备之间都是可以直接通信的,其本身不受 NAT 机制的限制。
  • 拥有 公网IP 的设备,每个设备之间也是可以直接通信的,因为其本身就是暴露在公共场合下,同样不受 NAT 机制的影响。
  • 处于不同局域网下的设备,设备A处于局域网A,设备B处于局域网B,设备A 和 设备B 是不可以直接进行通信的,这便是 NAT 机制的限制,如需通信,则需通过某些特殊手段才可进行通信。
  • 公网设备A 是不可以直接访问 私网设备B 的,如需让 公网设备 访问你的 私网设备,同样需要某些特殊手段。
  • 私网设备如何访问公网设备呢?通过网络地址映射,内网设备 192.168.100 访问 百度(220.181.38.148)NAT 会把数据包的源 IP192.168.1.100 改为你的设备绑定的 公网 IP(例如 203.0.113.1)。
  • 路由转发过程中会经过多个节点,这些节点可能会是多个 公网IP,其会进行多次地址转换吗?答案是不会的,在转换前,它会检查你的 源IP 是否为 私网IP,否则不进行 网络地址映射。
  • 返回的数据如何找到被替换之前的 源IP 呢?通过端口号查找,例如:
  • 192.168.1.100:5001 → 203.0.113.1:60001 → 220.181.38.148:80
  • 192.168.1.101:5002 → 203.0.113.1:60002 → 220.181.38.148:80
  • NAT 设备维护一个 NAT 映射表,记录私有 IP、端口号和公网 IP、端口号的对应关系。服务器返回数据时,NAT 设备根据 NAT 映射表,将目的 IP 和端口号修改回私有 IP 和端口号,并将数据包转发回正确的内网设备。

❓端口号是否会冲突

  • NAT网络地址转换) 中,如果多个内网设备同时访问外部网络,并且它们的源端口号相同,NAT 设备如何处理端口冲突呢?
  • 如果两个内网设备使用相同的源端口访问 相同的目标 IP 和端口NAT 设备会调整映射,避免冲突。
  • 1. 修改源端口:NAT 设备会动态修改源端口,确保映射唯一。
  • 例如:
    • 192.168.1.100:5000 → 203.0.113.1:60001 → 220.181.38.148:80
    • 192.168.1.101:5000 → 203.0.113.1:60002 → 220.181.38.148:80
  • NAT 设备在 NAT 映射表中记录新的端口号,并在返回数据时修改回原来的端口号。
  • 2. 使用五元组映射
  • 有些高级 NAT 设备不仅使用四元组,还会记录协议类型(TCP/UDP),实现五元组映射:
    • IP + 源端口 + 目标 IP + 目标端口 + 协议类型
  • 这样,即使两个设备的 IP 和端口相同,但访问的目标服务器不同,NAT 仍然可以区分。
  • 3. 使用多个 公网IP
  • 在大规模 NAT 设备(如 ISP 级 CGNAT)中,如果单个公网 IP 的端口资源耗尽,NAT 设备可能会分配多个公网 IP 来均衡负载。

❓端口号耗尽怎么办

  • 由于 端口号范围只有 0-65535,如果 NAT 设备的公网 IP 过少,而同时连接数过多,可能会导致端口资源耗尽。解决方案:

  • 引入多个公网 IP(负载均衡 NAT)。
  • 回收闲置端口(超时回收 NAT 映射)。
  • 限制 NAT 连接数(部分 ISP 会限制单个用户的 NAT 连接数)。

优点

  • 节省 IPv4 地址:多个设备共享一个公网 IP
  • 增强内网安全性:外部无法直接访问内网设备,提供一定的防火墙功能。
  • 灵活的 IP 管理:内网 IP 规划更加自由,无需公网 IP 资源。

缺点

  • 破坏端到端通信NAT 修改了 IP 地址,影响 P2P 应用、VoIP、在线游戏等需要直接通信的服务。
  • 增加网络延迟NAT 设备需要处理地址转换,增加了一定的延迟和计算开销。
  • 影响某些协议:如 FTP、SIP(VoIP 语音协议)等,需使用 NAT 穿透技术 才能正常工作。

NAT 穿透(NAT Traversal)

由于 NAT 阻止了外部网络主动访问内网设备,有些应用(如 P2P 下载、VoIP)需要额外技术来穿透 NAT

常见 NAT 穿透技术
  • STUN(Session Traversal Utilities for NAT让设备知道自己在公网的 NAT 地址,适用于对称 NAT 以外的情况。

  • TURN(Traversal Using Relays around NAT使用中继服务器转发数据,适用于严格 NAT 网络,但增加了服务器负担。

  • UPnP(通用即插即用)允许应用程序向路由器请求打开端口,实现内外部通信(但存在安全隐患)。

  • NAT-PMP(NAT 端口映射协议)Apple 提出的协议,可动态申请端口映射,类似 UPnP。


  • 具体解决 IP 协议 更多内容,我们下节再见~~~
  • 毕竟不知后事如何,且听下回分解 
  • ❤️❤️❤️❤️❤️❤️❤️

 


http://www.ppmy.cn/devtools/156060.html

相关文章

Flink报错Caused by: java.io.FileNotFoundException: /home/wc.txt

当在提交一个flink任务报如下的错误时: Caused by: java.io.FileNotFoundException: /home/wc.txt (没有那个文件或目录)at java.io.FileInputStream.open0(Native Method)at java.io.FileInputStream.open(FileInputStream.java:195)at java.io.FileInputStream.&…

基于微信小程序的新闻资讯系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

Java篇之继承

目录 一. 继承 1. 为什么需要继承 2. 继承的概念 3. 继承的语法 4. 访问父类成员 4.1 子类中访问父类的成员变量 4.2 子类中访问父类的成员方法 5. super关键字 6. super和this关键字 7. 子类构造方法 8. 代码块的执行顺序 9. protected访问修饰限定符 10. 继承方式…

MySQL(3)

约束 概述 约束演示 外键约束 概念:约束是作用在表中字段上的规则,用于限制存储在表中的数据 目的:保证数据库中数据的正确,有效性和完整性 not null 非空约束 unique 唯一约束 primary key 主键约束 主键是一行数据的唯一…

使用 Docker + Nginx + Certbot 实现自动化管理 SSL 证书

使用 Docker Nginx Certbot 实现自动化管理 SSL 证书 在互联网安全环境日益重要的今天,为站点或应用部署 HTTPS 已经成为一种常态。然而,手动申请并续期证书既繁琐又容易出错。本文将以 Nginx Certbot 为示例,基于 Docker 容器来搭建一个…

2025_2_3 C语言中关于枚举类型,动态内存分配

1.枚举类型 枚举类型是用来表示一些离散值的 枚举常量默认从0开始,依次递增1 typedef enum{s1,s2,s3,s4 }num;以上:s10,s2 1, s3 2, s4 3 可以为枚举常量显式指定值 typedef enum{s1 1,s2 2,s3 3,s4 4 }num;枚举常量的调用有两种方法 直接使用…

15 刚体变换模块(rigid.rs)

rigid.rs是一个表示三维刚体变换(Rigid Transformation)的结构体定义,用于在计算机图形学、机器人学以及物理模拟等领域中表示物体在三维空间中的旋转和平移。在这个定义中,所有长度在变换后都保持不变,这是刚体变换的…

Qt文件操作

目录 一、文件操作相关类 1.QFile 2.QFileInfo 3.QTextStream 4.QDataStream 5.QDir 6.QFileSystemWatcher 7.QTemporaryFile 二、文件操作示例 1.文本文件操作 2.目录操作 3.二进制文件操作 一、文件操作相关类 1.QFile QFile类用于文件的创建、读写、复制、删除…