网络编程 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 亿,基本用尽了。
  • 子网掩码
    • 使用子网掩码来区分网络部分和主机部分。
    • 子网掩码同样由 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/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

tryhackme-Pre Security-HTTP in Detail(HTTP的详细内容)

任务一:What is HTTP(S)?(什么是http(s)) 1.What is HTTP? (HyperText Transfer Protocol)(什么是 HTTP?(超文本传输协议)) http是你查看网站的时候遵循的…

UDP网络编程套接

目录 本文核心 预备知识 1.端口号 认识TCP协议 认识UDP协议 网络字节序 socket编程接口 sockaddr结构 UDP套接字编程 服务端 客户端 TCP与UDP传输的区别 可靠性: 传输方式: 用途: 头部开销: 速度: li…

MyBatis-Plus中isNull与SQL语法详解:处理空值的正确姿势

目录 前言1. 探讨2. 基本知识3. 总结 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全&#x…

EGO Swarm翻译

目录 摘要 Ⅰ 介绍 Ⅱ 相关工作 A . 单四旋翼局部规划 B . 拓扑规划 C. 分布式无人机集群 Ⅲ 基于梯度的局部规划隐式拓扑轨迹生成 A.无需ESDF梯度的局部路径规划 B.隐式拓扑轨迹生成 Ⅳ 无人机集群导航 A 机间避碰 B. 定位漂移补偿 C. 从深度图像中去除agent Ⅴ …

电商数据采集电商,行业数据分析,平台数据获取|稳定的API接口数据

电商数据采集可以通过多种方式完成,其中包括人工采集、使用电商平台提供的API接口、以及利用爬虫技术等自动化工具。以下是一些常用的电商数据采集方法: 人工采集:人工采集主要是通过基本的“复制粘贴”的方式在电商平台上进行数据的收集&am…

PostgreSQL和Postgis安装

Windows下PostgreSQL和对应的版本的Postgis安装 PostgreSQL安装 1、官网下载地址 https://www.enterprisedb.com/downloads/postgres-postgresql-downloads 2、根据自己的系统下载完成,Windows下可以直接傻瓜式安装就OK 建议不要通过自带的这个程序安装postgis,…

代码开发相关操作

使用Vue项目管理器创建项目:(vue脚手架安装一次就可以全局使用) windowR打开命令窗口,输入vue ui,进入GUI页面,点击创建-> 设置项目名称,在初始化git下面输入:init project&…

Vulnhub DC-6靶机攻击实战(一)

导语   之前的分享中我们介绍了关于Vulnhub虚拟机前五个机器的攻防演练测试,接下来我们继续分享Vulnhub DC-6靶机攻击实战。 文章目录 搭建测试环境第一步、信息采集第二步、wpscan爆破第三步、开始查找其他的用户第四步、提权总结搭建测试环境 首先需要从Vulnhub官网中下载…

深度学习之超分辨率算法——FRCNN

– 对之前SRCNN算法的改进 输出层采用转置卷积层放大尺寸,这样可以直接将低分辨率图片输入模型中,解决了输入尺度问题。改变特征维数,使用更小的卷积核和使用更多的映射层。卷积核更小,加入了更多的激活层。共享其中的映射层&…

深度学习从入门到精通——图像分割实战DeeplabV3

DeeplabV3算法 参数配置关于数据集的配置训练集参数 数据预处理模块DataSet构建模块测试一下数据集去正则化模型加载模块DeepLABV3 参数配置 关于数据集的配置 parser argparse.ArgumentParser()# Datset Optionsparser.add_argument("--data_root", typestr, defa…

大数据操作实验一

1.Postgresql 1.1 数据库的对象创建 1.1.1 创建数据库(Database) 鼠标右键database进行创建 1.1.2 创建图(Schema) 鼠标右键schema,然后创建schema图纸 1.1.3 创建表(Table) 鼠标右键Table,创建表 1.2数据库实列化 1.2.1 实列化静态数据 提…

IDEA2024如何创建一个普通的Java Web项目工程(JSP)

本章教程,主要介绍如何在IDEA2024 专业版本中,创建一个普通的Java Web项目。 一、新建项目 二、配置项目 依次点击File——Project Structure——Modules 修改路径中的web为webapp,然后点击Create Artifact默认保存。 至此,一个基础的Java web就创建完成了。

Linux下mysql 8.0安装教程

本文介绍了如何在Linux下安装MySQL8.0,供大家参考,具体内容如下 准备工作: mysql8.0 rpm文件 测试工具(比如 idea的database工具) 安装步骤: 1. 下载mysql的repo源,下载地址: 进入Linux系统,输入指令: 1 wgethttps://dev.mysql.com/get/mysql80-community-rele…

libaom 源码分析:熵编码模块介绍

AV1 熵编码原理介绍 关于AV1 熵编码原理介绍可以参考:AV1 编码标准熵编码技术概述libaom 熵编码相关源码介绍 函数流程图 核心函数介绍 av1_pack_bitstream 函数:该函数负责将编码后的数据打包成符合 AV1 标准的比特流格式;包括写入序列头 OBU 的函数 av1_write_obu_header…

[数据结构#1] 并查集 | FindRoot | Union | 优化 | 应用

目录 1. 并查集原理 问题背景 名称与编号映射 数据结构设计 2. 并查集基本操作 (1) 初始化 (2) 查询根节点 (FindRoot) (3) 合并集合 (Union) (4) 集合操作总结 并查集优化 (1) 路径压缩 (2) 按秩合并 3. 并查集的应用 (1) 统计省份数量 (2) 判断等式方程是否成…

Centos创建共享文件夹拉取文件

1.打开VMware程序,鼠标右检你的虚拟机,打开设置 2.点击选项——共享文件夹——总是启用 点击添加,设置你想要共享的文件夹在pc上的路径(我这里已经添加过了就不加了) 注意不要中文,建议用share&#xff0c…

Element@2.15.14-tree checkStrictly 状态实现父项联动子项,实现节点自定义编辑、新增、删除功能

背景:现在有一个新需求,需要借助树结构来实现词库的分类管理,树的节点是不同的分类,不同的分类可以有自己的词库,所以父子节点是互不影响的;同样为了选择的方便性,提出了新需求,选择…

java版电子招投标采购|投标|评标|竞标|邀标|评审招投标系统源码

招投标管理系统是一款适用于招标代理、政府采购、企业采购和工程交易等领域的企业级应用平台。该平台以项目为主线,从项目立项到项目归档,实现了全流程的高效沟通和协作。通过该平台,用户可以实时共享项目数据信息,实现规范化管理…

【Verilog HDL 入门教程】 —— 学长带你学Verilog(基础篇)

文章目录 一、Verilog HDL 概述1、Verilog HDL 是什么2、Verilog HDL产生的背景3、Verilog HDL 和 VHDL的区别 二、Verilog HDL 基础知识1、Verilog HDL 语言要素1.1、命名规则1.2、注释符1.3、关键字1.4、数值1.4.1、整数及其表示1.4.2、实数及其表示1.4.3、字符串及其表示 2、…

龙迅#LT7911E适用于EDP/DP/TPYE-C转MIPIDSI应用,支持图像处理功能,内置I2C,主应用副屏显示,投屏领域!

1. 描述 LT7911E 是一款高性能 eDP 转 MIPI D-PHY 转换器,旨在将 eDP 源连接到 MIPI 显示面板。 LT7911E 集成了一个符合 eDP1.4 标准的接收器,支持 1.62Gbps 至 5.67Gbps 的输入数据,以 270Mbps 的递增步长,以及一个 2 端口 D…