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

embedded/2024/12/24 1:06:31/

一、概述

记录时间 [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 地址。
java">// 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
  • 域名
java">// 查询网站 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 查找以确定主机名(域名)。
java">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. 完整代码

java">// 测试 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/


http://www.ppmy.cn/embedded/148214.html

相关文章

Flink调优----资源配置调优与状态及Checkpoint调优

目录 第 1 章 资源配置调优 1.1 内存设置 1.1.1 TaskManager 内存模型 1、内存模型详解 2、案例分析 1.1.2 生产资源配置示例 1.2 合理利用 cpu 资源 1.2.1 使用 DefaultResourceCalculator 策略 1.2.2 使用 DominantResourceCalculator 策略 1.2.3 使用 DominantRes…

ubuntu安装Goland

ubuntu安装Goland 最近在学习MIT6.824的课程,发现调试工具太重要了,在安装vscode后,再安装用来调试的插件,发现根本成功不了。所以安装Goland,但是网上的在ubuntu上安装Goland教程很少,所以我来写一下。 …

【论文解读】CVPR 2019 目标检测:CenterNet技术,以点代框,可扩展性强(附论文地址)

论文地址:https://arxiv.org/pdf/1904.07850​ 论文代码:https://github.com/xingyizhou/CenterNet​ 这篇论文的标题是《Objects as Points》,作者是Xingyi Zhou、Dequan Wang和Philipp Krhenbhl,来自UT Austin和UC Berkeley。…

设计模式-读书笔记2

结构型模式 适配器模式 不兼容结构的协调 220v接入20v的笔记本电脑 别名包装器 Wrapper 适配器类Adapter 适配者类Adaptee 目标抽象类 Target //demo1 class Adapter extends Target{private Adaptee adaptee; //维持对一个适配者对象的引用public Adapter (Adaptee adapte…

VSCode:Markdown插件安装使用 -- 最简洁的VSCode中Markdown插件安装使用

VSCode:Markdown插件安装使用 1.安装Marktext2.使用Marktext 本文,将在Visual Studio Code中,安装和使用Markdown插件,以Marktext插件为例。 1.安装Marktext 打开VSCode,侧边栏中找到扩展模块(或CtrlShiftX快捷键)&am…

解释 Git 的基本概念和使用方式。

Git是一个分布式版本控制系统,它可以跟踪和管理项目中的代码变动。它具有以下基本概念和使用方式: 1. 仓库(Repository):Git将代码存储在仓库中,仓库可以被认为是一个项目的工作空间。一个项目可以有多个仓…

Python的sklearn中的RandomForestRegressor使用详解

文章目录 Python的sklearn中的RandomForestRegressor使用详解一、引言二、RandomForestRegressor简介1、随机森林回归原理2、RandomForestRegressor的主要参数 三、构建和训练模型1、数据准备2、数据划分3、模型训练 四、模型评估1、预测2、评估指标 五、特征重要性分析六、可视…

面向微服务的Spring Cloud Gateway的集成解决方案:用户登录认证与访问控制

🎯导读:本文档详细描述了一个基于Spring Cloud Gateway的微服务网关及Admin服务的实现。网关通过定义路由规则,利用负载均衡将请求转发至不同的后端服务,并集成了Token验证过滤器以确保API的安全访问,同时支持白名单路…