网络编程 02:IP 地址,IP 地址的作用、分类,通过 Java 实现 IP 地址的信息获取
一、概述
记录时间 [2024-12-18]
前置文章:网络编程 01:计算机网络概述,网络的作用,网络通信的要素,以及网络通信协议与分层模型
本文讲述网络编程相关知识——IP 地址,包括 IP 地址的作用、分类,以及特殊的 IP 等。
IP 地址的作用在于唯一定位一台网络上的计算机。文章中通过 Java 编程,实现了 IP 地址的信息获取。
通过获取 IP 和端口,同时基于相关的网络协议,我们能实现不同计算机之前的通信。
二、IP 地址的分类
1. IPv4 / IPv6
IPv4 和 IPv6 是互联网协议(IP)的两个版本,用于定义数据在网络中的传输格式和寻址方式。
IPv6 作为 IPv4 的继任者被开发出来,以解决地址空间不足的问题,并引入了其他改进。
IPv4
IPv4(Internet Protocol version 4)
- 地址格式:
- IPv4 使用 32 位二进制数表示地址,例如
192.168.1.1。 - 以点分十进制记法书写,每 8 位用
.隔开,共 4 组,每组二进制都转换成十进制。 - 这种格式大约提供 43 亿个唯一的 IP 地址。其中30 亿都在北美,亚洲 4 亿,基本用尽了。
- IPv4 使用 32 位二进制数表示地址,例如
- 子网掩码:
- 使用子网掩码来区分网络部分和主机部分。
- 子网掩码同样由 32 位组成,例如,
255.255.255.0表示前 24 位是网络部分。 - 在
192.168.1.0/24子网中,前 24 位是网络部分。
- 广播地址:
- 每个子网都有一个广播地址,用于向该子网内的所有设备发送消息。
- 例如,在
192.168.1.0/24子网中,广播地址是192.168.1.255。
- 私有地址:
- 为了缓解公有 IP 地址的短缺,定义了私有地址范围,这些地址可以在内部网络中重复使用。
- NAT(网络地址转换):
- 由于 IPv4 地址资源有限,很多网络使用 NAT 技术,允许多个内部设备通过一个或少数几个公有 IP 地址访问互联网。
IPv6
IPv6(Internet Protocol version 6)
- 地址格式:
- IPv6 使用 128 位二进制数表示地址。
- 以冒号十六进制记法书写,每 16 位用
:隔开,共 8 组,每组二进制都转换成十六进制。 - 例如
2001:0db8:85a3:0000:0000:8a2e:0370:7334,简化后的表示可以省略前导零和连续的零段,如2001:db8:85a3::8a2e:370:7334。
- 地址空间:
- IPv6 设计时就考虑到了足够的地址空间,因此原则上不再需要 NAT。
- IPv6 提供了几乎无限的地址空间,每个设备都可以拥有一个全球唯一的 IP 地址。
- 相比于 IPv4 的优点:
- 多播支持:IPv6 对多播的支持更加高效,取消了广播概念,所有通信都基于单播或多播。
- 自动配置:IPv6 支持无状态地址自动配置(SLAAC),允许设备在没有 DHCP 服务器的情况下自动获取 IP 地址和其他网络设置。
- 移动性:IPv6 内置了对移动节点的支持,使得移动设备能够在不同网络之间无缝切换。
- 更好的头部格式:IPv6 头部比 IPv4 更简洁,去除了不必要的字段,并将选项移动到扩展头部,这有助于提高路由器处理效率。
- 安全性增强:IPv6 强制要求支持 IPsec(IP 安全协议),提高了通信的安全性。
2. 公网 / 私网
公网(互联网)
- 公网是指连接到全球互联网的网络;
- 其 IP 地址在全球范围内唯一;
- 可以直接通过互联网进行通信。
私网(局域网)
- 私网是指不直接连接到互联网的内部网络;
- 私网使用的是特定保留的 IP 地址段,可以在多个不同的私有网络中重复使用。
- 私网内的设备可以相互通信,如
192.168.x.x,给组织内部使用,要考虑安全性。 - 通过 NAT 技术,私网中的多台设备可以通过同一个公网 IP 地址访问外部资源。
三、域名
-
域名是为了方便人类记忆而设计的,是人类可读的、层次化的名称,用于标识互联网上的资源或服务。例如,
www.example.com。 -
IP 地址是计算机网络用来标识和定位设备的实际地址。
-
域名系统(Domain Name System, DNS)是一个分布式数据库,负责将域名转换为对应的 IP 地址。
-
域名解析:使用域名系统将域名转换为对应的 IP 地址的过程。
四、ABCDE 类地址
IPv4 地址被划分为 A、B、C、D、E 五个类别,其中 A、B、C 类主要用于单播传输,D 类用于组播传输,E 类保留为将来使用。
下面是这五个类别的详细划分。
1. A ~ C 类
A ~ C 类主要用于单播传输。
观察这个 IP 地址:192.168.1.1/24,一共 4 个字节,包含网络部分和主机部分。
- 网络部分:
24表示前 3 个字节表示网络; - 主机部分:剩下的 1 个字节表示主机。
根据网络部分和主机部分的不同表示,划分了 A、B、C 三类地址。
A 类
A 类:网络 1 + 主机 3(从左往右,下同)
- 例如
192.168.1.1/8,适用于大型网络,能够支持大量的主机。 - 默认子网掩码:
255.0.0.0
B 类
B 类:网络 2 + 主机 2
- 例如
192.168.1.1/16,适用于中型网络。 - 默认子网掩码:
255.255.0.0
C 类
C 类:网络 3 + 主机 1
- 例如
192.168.1.1/24,适用于小型网络。 - 默认子网掩码:
255.255.255.0
2. D ~ E 类
D 类用于组播传输,E 类保留为将来使用。
- D 类:
- 主要用于组播(多播),即从一个源发送数据到多个接收者。
- 不使用传统的子网掩码,不遵循传统的网络部分和主机部分的划分方式。
- E 类:
- 目前主要保留用于实验和研究目的。
- 不使用传统的子网掩码,不遵循传统的网络部分和主机部分的划分方式。
3. A ~ E 类地址的范围
xxx 表示主机范围。
| 地址 | 二进制表示 | 十进制表示 |
|---|---|---|
| A 类 | 00000001.xxxxxxxx.xxxxxxxx.xxxxxxxx ~ 01111111.xxxxxxxx.xxxxxxxx.xxxxxxxx | 1.0.0.0 ~ 127.255.255.255 |
| B 类 | 10000000.00000000.xxxxxxxx.xxxxxxxx ~ 10111111.11111111.xxxxxxxx.xxxxxxxx | 128.0.0.0 ~ 191.255.255.255 |
| C 类 | 11000000.00000000.00000000.xxxxxxxx ~ 11011111.11111111.11111111.xxxxxxxx | 192.0.0.0 ~ 223.255.255.255 |
| D 类 | 11100000.00000000.00000000.00000000 ~11101111.11111111.11111111.11111111 | 224.0.0.0 ~ 239.255.255.255 |
| E 类 | 11110000.00000000.00000000.00000000 ~ 11111111.11111111.11111111.11111111 | 240.0.0.0 ~ 255.255.255.255 |
4. 第 1 个字节上的区别
十进制划分
从左数,第 1 个字节上,范围 0 ~ 255(十进制),A ~ E 类地址的划分如下。

二进制划分
从左数,第 1 个字节上,范围 00000001 ~ 11111111(二进制),A ~ E 类地址的划分如下。
- A 类:
0xxxxxxx - B 类:
10xxxxxx - C 类:
110xxxxx - D 类:
1110xxxx - E 类:
1111xxxx
xxx 才是它们的范围。例如,A 类 7 个 x,范围 00000001 ~ 01111111。
五、特殊 IP 地址
特殊 IP 地址,是指在互联网协议(Internet Protocol, IP)中,具有特定用途或保留用于特殊目的的地址。
这些地址通常不能直接用于公共互联网上的常规通信。
以下是几种常见的特殊 IP 地址及其用途:
127.0.0.1:回环地址,又名localhost,用于标识本地主机,允许计算机上的程序与同一台计算机上的其他程序进行通信,不必通过网络接口卡。0.0.0.0:表示 “本网络”,常用于默认网关配置。255.255.255.255:有限广播地址,用于向本地网络中的所有设备发送数据。
六、代码实现
1. 检测网络
一些检测网络的方法
# 联网检查:ping 网络ip地址
ping baidu.com# 查看网络配置
ipconfig# 本机回环地址
ping 127.0.0.1
2. InetAddress 类
Java 提供的 InetAddress 类,用于实现网络应用程序。例如,可以获取 IP 地址。
InetAddress 类没有构造器,因此不能使用 new 关键字构造实例对象。

3. 测试 IP 地址
查询本机 IP 地址
查询本机 IP 地址的 3 种方式:
getByName("127.0.0.1"):回环地址。getByName("localhost"):回环地址。getLocalHost():主机名和主机的 IP 地址。
// InetAddress 是一个没有构造方法的类,所以直接用类名获取方法
// inetAddress1 就是获取到的一个 InetAddress 对象// 查询本机地址
InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");
System.out.println(inetAddress1);InetAddress inetAddress3 = InetAddress.getByName("localhost");
System.out.println(inetAddress3);InetAddress inetAddress4 = InetAddress.getLocalHost();
System.out.println(inetAddress4);
查询网站 IP 地址
查询网站 IP 地址的方式:
- IP
- 域名
// 查询网站 IP 地址
InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");
System.out.println(inetAddress2);
分析 IP 地址中的信息
注意:实际输出将依赖于 DNS 配置和当前的网络环境。
getAddress():返回一个字节数组,表示该InetAddress对象的原始 IP 地址。getCanonicalHostName():返回该地址的规范主机名,即,完全限定域名,它包含了主机名和域名,可以唯一地标识网络上的一个设备或服务。getHostAddress():返回该InetAddress对应的文本表示形式的 IP 地址,例如,192.0.2.1(点分十进制)。getHostName():返回该InetAddress对应的主机名。如果该对象是由 IP 地址创建的,可能会进行反向 DNS 查找以确定主机名(域名)。
InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");// 一组地址
System.out.println(inetAddress2.getAddress());
// 规范的名字 IP
System.out.println(inetAddress2.getCanonicalHostName());
// IP
System.out.println(inetAddress2.getHostAddress());
// 域名、主机名
System.out.println(inetAddress2.getHostName());
4. 完整代码
// 测试 IP
public class TestInetAddress {public static void main(String[] args) {// InetAddress 是一个没有构造方法的类,所以直接用类名获取方法try {// 查询本机地址// inetAddress1 就是获取到的一个 ip 对象InetAddress inetAddress1 = InetAddress.getByName("127.0.0.1");System.out.println(inetAddress1);InetAddress inetAddress3 = InetAddress.getByName("localhost");System.out.println(inetAddress3);InetAddress inetAddress4 = InetAddress.getLocalHost();System.out.println(inetAddress4);// 查询网站 IP 地址InetAddress inetAddress2 = InetAddress.getByName("www.baidu.com");System.out.println(inetAddress2);// 一组地址System.out.println(inetAddress2.getAddress());// 规范的名字 IPSystem.out.println(inetAddress2.getCanonicalHostName());// IPSystem.out.println(inetAddress2.getHostAddress());// 域名、主机名System.out.println(inetAddress2.getHostName());} catch (UnknownHostException e) {e.printStackTrace();}}
}
参考资料
狂神说 - 网络编程:https://www.bilibili.com/video/BV1LJ411z7vY
Java 8 帮助文档:https://docs.oracle.com/javase/8/docs/api/
相关文章:
网络编程 02:IP 地址,IP 地址的作用、分类,通过 Java 实现 IP 地址的信息获取
一、概述 记录时间 [2024-12-18] 前置文章:网络编程 01:计算机网络概述,网络的作用,网络通信的要素,以及网络通信协议与分层模型 本文讲述网络编程相关知识——IP 地址,包括 IP 地址的作用、分类ÿ…...
如何使用Python WebDriver爬取ChatGPT内容(完整教程)
大背景 虽然我们能用网页版chatGPT来聊天、写文章,但是我们采集大量的内容,就得不断地手动输入提问来获取答案,并且将结果复制到数据库来保存。如果整个过程能使用程序来做自然要节省很多的人力,精力和时间。 Python webdirver …...
WSL切换默认发行版
查看适用于wsl的子系统有哪些: wslconfig /list 设置wsl的默认发行版 wslconfig /setdefault Ubuntu-20.04...
全志H618 Android12修改doucmentsui功能菜单项
背景: 由于当前的文件管理器在我们的产品定义当中,某些界面有改动的需求,所以需要在Android12 rom中进行定制以符合当前产品定义。 需求: 在进入File文件管理器后,查看...功能菜单时,有不需要的功能菜单,需要隐藏,如:新建窗口、不显示的文件夹、故代码分析以及客制…...
移动网络(2,3,4,5G)设备TCP通讯调试方法
背景: 当设备是移动网络设备连接云平台的时候,如果服务器没有收到网络数据,移动物联设备发送不知道有没有有丢失数据的时候,需要一个抓取设备出来的数据和服务器下发的数据的方法。 1.服务器系统是很成熟的,一般是linu…...
网络安全概论——入侵检测系统IDS
一、入侵检测的概念 1、入侵检测的概念 检测对计算机系统的非授权访问对系统的运行状态进行监视,发现各种攻击企图、攻击行为或攻击结果,以保证系统资源的保密性、完整性和可用性识别针对计算机系统和网络系统或广义上的信息系统的非法攻击,…...
Linux通信System V:消息队列 信号量
Linux通信System V:消息队列 & 信号量 一、信号量概念二、信号量意义三、操作系统如何管理ipc资源(2.36版本)四、如何对信号量资源进行管理 一、信号量概念 信号量本质上就是计数器,用来保护共享资源。多个进程在进行通信时&a…...
计算机网络基础图解
注:本文为来自 猿小许 的 “计算机网络” 相关系列文章合辑。 一、计算机网络概述 猿小许于 2021-06-03 18:39:47 发布 一、计算机网络的概念 1.1 计算机网络 概念 计算机网络: 是一个将分散的、具有独立功能的计算机系统,通过通信设备与…...
TDesign:NavBar 导航栏
NavBar 导航栏 左图,右标 appBar: TDNavBar(padding: EdgeInsets.only(left: 0,right: 30.w), // 重写左右内边距centerTitle:false, // 不显示标题height: 45, // 高度titleWidget: TDImage( // 左图assetUrl: assets/img/logo.png,width: 147.w,height: 41.w,),ba…...
hive注释comment中文乱码解决
问题描述 当使用以下命令查看表的元数据信息时出现中文乱码(使用的是idea连接hive) desc formatted test.t_archer; 解决 连接保存hive元数据的MySQL数据库,执行以下命令: use hive3; show tables;alter table hive3.COLUMNS_…...
电脑提示ntdll.d缺失是什么原因?不处理的话会怎么样?ntdll.dll文件缺失快速解决方案来啦!
电脑提示ntdll.dll缺失:原因、影响与解决方案 在日常的电脑使用中,我们偶尔会遇到一些令人困惑的系统错误,其中“ntdll.dll缺失”便是较为常见的一种。作为软件开发从业者,我深知这一错误给用户带来的不便,因此&#…...
MFC/C++学习系列之简单记录——序列化机制
MFC/C学习系列之简单记录——序列化机制 前言简述六大机制序列化机制使用反序列化总结 前言 MFC有六大机制,分别是程序启动机制、窗口创建机制、动态创建机制、运行时类信息机制、消息映射机制、序列化机制。 简述六大机制 程序启动机制:全局的应用程序…...
二十、服务发布Ingress
Ingress Kubernetes使用了一个Ingress策略定义和一个具体提供转发服务的Ingress Controller,两者结合,实现了基于灵活Ingress策略定义的服务路由功能。如果是对Kubernetes集群外部的客户端提供服务,那么IngressController实现的是类似于边缘路由器(Edge Router)的功能。需…...
计算机网络 八股青春版
什么是HTTP?HTTP和HTTPS的区别 HTTP HTTP是超文本运输协议,是一种无状态(每次请求都是独立的)的应用层协议。用于在客户端和服务器之间传输超文本数据(如HTML文件)。默认端口是80数据以明文形式传输&#…...
java全栈day18--Web后端实战(java操作数据库2)
前言:在上节入门程序当中我们见到了JDBC所提供的API,本节来详细说明一下。 一、JDBC--API详解 1.1DriverManager(驱动管理器) 回顾:作用获取连接,调用它里面的getConnection。即如下 作用 1.注册驱动解…...
electron-vite【实战】自定义标题栏【组件封装】(含异形标题栏,指定区域拖拽,窗口置顶,窗口最小化,窗口最大化,取消最大化,隐藏窗口到托盘等)
效果预览 技术要点 透明背景 src/main/index.ts 的 new BrowserWindow 中添加 transparent: true, // 设置窗口背景透明frame: false, // 隐藏窗口边框仅图标和标题部分可拖拽 仅图标和标题部分添加样式 drag .drag {-webkit-app-region: drag; }图标与标题栏的融合 标题栏的…...
vue2 项目webpack 4升5
项目背景 公司项目需要将进行微前端改造.主应用和子应用会需要共享依赖,考虑使用模块联邦进行依赖共享. 由于模块联邦要升级到webpack 5才能用,所以老项目要从webpack 4升级到webpack 5 实现思路 原来的项目用的是vue-cli 3,查了一下可以vue-cli 5用的就是webpack 5,所以可以…...
前端开发性能监控中的数据采集与性能调优方法
🌟 前端开发性能监控中的数据采集与性能调优方法 📖 前言 在现代 Web 应用中,性能是用户体验的关键因素之一。性能问题不仅会影响用户满意度,还可能导致业务损失。如何高效地监控前端性能并进行性能调优,成为每个开发…...
S32K324 Stack异常分析及解决方案
文章目录 前言正向排查尝试反向排查问题原因分析问题解决处理总结前言 在项目开发过程中,在一次软件变更时,调整了task优先级之后导致应用层软件中的float数据经常性的变为NAN,导致应用层功能失效。本文记录下这个bug的分析及解决过程。 正向排查尝试 由于问题复现的概率…...
[创业之路-202]:任正非管理华为的思想与毛泽东管理党、军队、国家的思想的相似性与差异性
目录 一、相似性 1、指导思想 2、管理策略 3、危机意识与自我否定 4、理想主义与奋斗精神 二、差异性 1、哲学基础与思想倾向 2、管理方法与策略 3、组织文化与价值观 一、相似性 任正非管理华为的思想与毛泽东管理党、军队、国家的思想在多个方面存在相似性。 以下…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
