网络编程 02:IP 地址,IP 地址的作用、分类,通过 Java 实现 IP 地址的信息获取

news2025/2/28 12:27:30

一、概述

记录时间 [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 亿,基本用尽了。
  • 子网掩码
    • 使用子网掩码来区分网络部分和主机部分。
    • 子网掩码同样由 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.xxxxxxxx1.0.0.0 ~ 127.255.255.255
B 类10000000.00000000.xxxxxxxx.xxxxxxxx ~ 10111111.11111111.xxxxxxxx.xxxxxxxx128.0.0.0 ~ 191.255.255.255
C 类11000000.00000000.00000000.xxxxxxxx ~ 11011111.11111111.11111111.xxxxxxxx192.0.0.0 ~ 223.255.255.255
D 类11100000.00000000.00000000.00000000 ~11101111.11111111.11111111.11111111224.0.0.0 ~ 239.255.255.255
E 类11110000.00000000.00000000.00000000 ~ 11111111.11111111.11111111.11111111240.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());
            // 规范的名字 IP
            System.out.println(inetAddress2.getCanonicalHostName());
            // IP
            System.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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2264723.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【pycharm】远程服务器之后如何打开终端

【pycharm】远程服务器之后如何打开终端 在pycharm中,我们通过远程连接服务器,此时如果我们需要在终端运行的话,并不能直接在本地终端运行,而是需要连接到服务器终端才能运行命令 设置如下: 输入服务器的ip、端口、…

C#+OpenCv深度学习开发(常用模型汇总)

在使用 OpenCvSharp 结合深度学习进行机器视觉开发时,有许多现成的模型可以使用。以下是一些常用的深度学习模型,适用于不同的机器视觉任务,包括物体检测、图像分类和分割等。 使用示例 在 OpenCvSharp 中加载和使用这些模型的基本示例&…

dolphinscheduler服务注册中心源码解析(三)RPC提供者服务整合注册中心注册服务实现源码

RPC提供者服务整合注册中心注册服务实现源码 1.概述2.源码解读思路3.实现2.1.应用服务的RPC服务接口定义2.1.1.MasterServer应用中提供的RPC接口服务2.1.2.WorkerServer应用中提供的RPC接口服务2.2.应用服务的RPC服务接口实现2.2.1.MasterServer应用中提供的RPC接口服务实现类2…

重生之我在异世界学编程之C语言:数据在内存中的存储篇(上)

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 目录 引言正文一、数据类型介绍1.内置类型2.自定义…

线程的概念及基本应用

目录 线程的概念 Java中多线程应用 继承Thread类 实现Runnable接口 实现Callable接口 线程的生命周期 线程的基本操作及原理 Thread.join的使用及原理 Thread.sleep的作用 问题 Thread.sleep的工作流程 wait和notify的使用 wait notify 例子 生产者消费者模式 Th…

联通软研院:基于OceanBase落地检索增强生成 (RAG) 的应用实践

本文作者:邱永刚,联通软件研究院OceanBase研发负责人,主要负责中国联通自研关系型数据库分布式CUDB研发、支撑、运维工作。 近年来,生成式人工智能技术取得了飞速进步,很多大模型在自然语言处理及对话系统领域的运用吸…

【更新】LLM Interview

课程链接:BV1o217YeELo 文章目录 LLM基础相关1. LLMs概述2. 大语言模型尺寸3. LLMs的优势与劣势4. 常见的大模型分类5. 目前主流的LLMs开源模型体系有哪些(Prefix Decoder,Causal Decoder,Encoder-Decoder的区别是什么&#xff09…

模型 课题分离

系列文章 分享 模型,了解更多👉 模型_思维模型目录。明确自我与他人责任。 1 课题分离的应用 1.1课题分离在心理治疗中的应用案例:李晓的故事 李晓,一位28岁的软件工程师,在北京打拼。他面临着工作、家庭和感情的多重…

sqlite 自定以脚本解释器

应用程序使用 libfdt 解析设备树,获取兼容性配置 内核源码支持libfdt 标准设备树语法,不用自己再创造 非常的爽,因为设备树支持预编译 一些可以跑类 BSD 系统的设备也可以使用这样的方法,不仅仅是在linux 系统上跑 有pylibfdt 支持解析设备树,校验设备树是否是正确的…

某医院vsan部署技术手册

环境配置 服务器4900G5五台 配置信息:cpu 8368*2颗 ,内存256GB ,双口万兆网卡两个,四口千兆,RAID卡LSI9361-8i12G SAS RAID ,两块固态盘480SSD ,2*1.92TB NVME盘,5*8T盘。 万兆交换机两台H3C…

【编辑器扩展】打开持久化路径/缓存路径/DataPath/StreamingAssetsPath文件夹

代码 [MenuItem("Assets/Open Explorer/PersistentDataPath")]public static void OpenPersistentDataPath(){Application.OpenURL(Application.persistentDataPath);}[MenuItem("Assets/Open Explorer/DataPath")]public static void OpenDataPath(){Appl…

【day14】异常处理与Object类深入解析

【day13】回顾 在深入探讨异常处理与Object类之前,让我们回顾一下【day13】中的关键内容: 权限修饰符: public:最广的访问范围,任何地方都可以访问。protected:在同包和子类中可以访问。默认(无…

【NLP 17、NLP的基础——分词】

我始终相信,世间所有的安排都有它的道理;失之东隅,收之桑榆 —— 24.12.20 一、中文分词的介绍 1.为什么讲分词? ① 分词是一个被长期研究的任务,通过了解分词算法的发展,可以看到NLP的研究历程 ② 分词…

11.vector的介绍及模拟实现

1.vector的介绍 记得之前我们用C语言实现过顺序表,vector本质上也是顺序表,一个能够动态增长的数组。 vector 的底层实现机制 - 动态数组:vector 的底层实现是动态数组。它在内存中连续存储元素,就像一个可以自动调整大小的数…

# 起步专用 - 哔哩哔哩全模块超还原设计!(内含接口文档、数据库设计)

↑ 上方下载文档 (大小374KB) 接口文档预览 (超过50个接口) 一、数据库25张表er-关系清晰构图!(tip: 鼠标右键图片 > 放大图像) 二、难点/经验 详细说明 热门评论排序评论点赞列表|DTO封装经验分享|精华接口文档说明 组员都说喜欢分档对应枚举码 如果这篇文章…

android RecyclerView 垂直显示示例(java)

RecyclerView垂直列表显示示例&#xff0c;显示图片加文字。 1、RecyclerView.Adapter适配器 public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder> {private Context mContext;private List<TitleBean> titleBeans;public ListAdapt…

华为云语音交互SIS的使用案例(文字转语音-详细教程)

文章目录 题记一 、语音交互服务&#xff08;Speech Interaction Service&#xff0c;简称SIS&#xff09;二、功能介绍1、实时语音识别2、一句话识别3、录音文件识别4、语音合成 三、约束与限制四、使用1、API2、SDK 五、项目集成1、引入pom依赖2、初始化 Client1&#xff09;…

GitCode 光引计划投稿|智能制造一体化低代码平台 Skyeye云

随着智能制造行业的快速发展&#xff0c;企业对全面、高效的管理解决方案的需求日益迫切。然而&#xff0c;传统的开发模式往往依赖于特定的硬件平台&#xff0c;且开发过程繁琐、成本高。为了打破这一瓶颈&#xff0c;Skyeye云应运而生&#xff0c;它采用先进的低代码开发模式…

网络刷卡器的功能和使用场景

网络刷卡器是一种连接互联网的设备&#xff0c;能够通过网络将读取到的各种卡片信息传输至服务器进行处理。这类刷卡器通常支持多种类型的卡片&#xff0c;如银行卡、身份证、会员卡、公交卡等&#xff0c;并运用现代信息技术确保数据的安全性和高效性&#xff0c;功能十分强大…

从零开始C++游戏开发之第七篇:游戏状态机与回合管理

在游戏开发的道路上&#xff0c;状态管理是一个无法绕开的重要课题。尤其是在棋牌类游戏中&#xff0c;游戏的进行需要有条不紊地按照回合推进&#xff0c;同时管理多个游戏状态&#xff0c;如“等待玩家加入”、“游戏进行中”、“结算阶段”等。如何优雅且高效地实现这些逻辑…