探索互联网寻址机制 | 揭秘互联网技术的核心,解析网络寻址
揭秘互联网技术的核心,解析网络寻址题
- 前提介绍
- 局域网地址
- IP地址的分配方式
- 动态IP分配机制
- 内部网(intranet)
- ICANN负责IP分配
- DHCP协议获取IP地址
- 域名系统
- 域名是什么
- 域名工作方式
- hosts文件存储域名映射关系
- DNS分布式数据库
- DNS域名解析
- Java进行Internet寻址
- java.net.InetAddress类
- equals方法
- getAddress方法
- getHostAddress方法
- getAllByName
- getByName
- getLocalHost
前提介绍
Internet与局域网(LAN)在规模和特性上存在显著区别,Internet不仅跨越国界,更是一个由全球范围内数以亿计(预计将达到数十亿级别)的设备与机器交织而成的庞大互联网络。
随着这些接入设备的数量呈指数级增长,一个亟待解决的核心问题日益凸显:如何在如此错综复杂的网络海洋中精准地识别和定位某一特定的设备或机器。
网络地址,作为网络通信的基石,其重要性不言而喻。它就像是我们在网络世界中的身份证,是识别与定位每一个网络参与者的关键标识。没有网络地址,就如同在浩瀚无垠的宇宙中迷失了方向,我们既无法识别数据包的来源,也无法确定其最终的目的地。
局域网地址
局域网(LAN)中的设备均配备有独一无二的物理或硬件地址,确保网络中的数据包能准确送达,此地址仅局域有效,无法跨网络定位设备,尤其考虑到如笔记本及掌上设备的移动性。
开发者而言,无需深入了解LAN数据路由细节,也无法直接触及数据链路层协议,因支持各类协议及其各异的地址格式与特性是一项复杂工程。Java选择专注于支持TCP/IP协议,这一广泛适用的网络通信标准,它充当不同网络间的桥梁。
IP地址的分配方式
设备要能够直接访问互联网,都必须配备一个独一无二的标识符,我们称之为IP地址。IP地址分为静态和动态两种类型。静态IP地址是永久性地分配给特定机器或设备的,意味着这些地址不会随时间或网络条件的变化而更改。而动态IP地址则不同,它们是在某个时间段内临时分配给某台特定的机器或设备的。
动态IP分配机制
举例来说,许多互联网服务供应商(ISP)为了提供拨号连接服务,会采用动态IP地址分配方式,这种方式下,IP地址是从一个地址池中临时租用的,一旦连接断开,该地址可能会被分配给其他用户。
当大量设备需要在短时间内访问互联网时,动态IP地址分配方式尤为适用。这是因为动态IP地址允许从预先配置好的地址池中快速、灵活地分配和回收IP地址,从而确保网络资源的有效利用和访问的便捷性。
注意,只可以把IP地址绑定到单台机器,不可以并发地共亨IP地址,IP协议利用这个地址,把IP数据报路由到正确的位置。没有地址,就不能联系机器,因而,所有机器都应该拥有不相同的IP地址。
内部网(intranet)
在探讨网络地址配置的复杂性时,我们需特别关注一种特殊情况——TCP/IP局域网(LAN),通常也被业内称作内部网(intranet)。在内部网的环境中,存在着一个特殊的地址使用方式,即采用一系列共享地址范围。这些地址是专门为内部网络设计的,目的在于避免与公共互联网上的地址发生冲突。由于这些地址并不直接暴露于公共Internet,因此,用户可以将自己的设备绑定到这些地址上,无需担心与外部网络设备的地址冲突问题。
ICANN负责IP分配
在IP地址分配与管理的领域中,核心机构非ICANN(Internet Corporation for Assigned Names and Numbers)莫属,它肩负着分配和协调全球互联网命名和编号的重任。
ICANN的职能建立在IANA(Internet Assigned Numbers Authority)的历史积淀之上,后者作为早期的互联网编号分配管理机构,为ICANN的成立和运作奠定了坚实的基础。对于私有网络的建立与配置,管理者可以根据实际需求分配A类、B类或C类IP地址块。一旦获得了相应的地址块,管理员便可以为该网络内的每一台机器分配特定的主机地址。这两个机构的网址分别是:http://www.icann.org 和 http://www.iana.org。
DHCP协议获取IP地址
在获取IP地址的过程中,最常见的做法是由网络管理员、服务提供商(ISP)或其他网络服务实体来为您分配。特别是在建立拨号连接时,您通常会从服务提供商提供的可用地址池中动态地获取一个IP地址。这种动态分配方式意味着,每次您重新连接时,都有可能会获得一个与前次不同的IP地址。
而在内部网络环境中,网络管理员可能会为您的设备指定一个固定的、特定的IP地址。另一种常见的做法是通过DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)服务器来获取IP地址。DHCP服务器能够根据网络内设备的需求动态地分配IP地址,这尤其适用于那些频繁上线和离线的设备。通过使用DHCP,网络管理员可以更有效地管理IP地址资源,即使在网络中设备数量众多、IP地址资源相对紧张的情况下,也能通过更小的地址池来满足需求。
域名系统
尽管IP地址为网络管理员提供了强大的系统支持,但许多人发现,要记住这些由点分十进制数构成的地址是一项极其艰巨的任务。实际上,人们普遍发现,与这种纯数字格式的IP地址相比,文字形式的标识更加易于记忆。
比如,相比一组用于标识IP地址的点分十进制数,像“Amazon”或“Sun”这样的名字更容易被大脑所捕捉和回忆。因此,为了提升用户体验和便捷性,人们倾向于使用更具描述性和记忆性的名称来替代或标识IP地址。
域名是什么
域名系统(DNS)是互联网的核心组成部分,它通过将易于记忆的文本域名与复杂的IP地址相对应,极大地提升了用户体验,使得互联网变得更为用户友好。无论是商业机构、政府机构还是个人,都可以申请注册域名,这些域名随后便成为在浩瀚的网络世界中定位特定单位或个人的独特标识。
域名工作方式
当众多机器接入互联网时,处理域名到IP地址的映射数量变得异常庞大。即便有足够的系统来存储这些映射,也很快就会因请求过载而陷入困境。此外,在系统崩溃的情况下,将问题局限在互联网的一小部分范围内,相较于降低整个系统的响应速度,显然更为可取。
hosts文件存储域名映射关系
互联网最初的设想是将域名到IP地址的映射存储在名为hosts.txt
的文件中,这个文件会在互联网中被广泛下载和镜像。如今,尽管许多操作系统中仍保留了这个文件,但其用途已发生转变。它更多地被用作覆盖DNS映射或隐藏已丢失的、或本地DNS服务器无法解析的映射。
DNS分布式数据库
DNS是一个高度复杂且强健的系统,其设计巧妙地将自身打造成一个分布式数据库。在这个数据库中,新注册的接收和已有注册地址的查询响应任务被巧妙地分散至多个独立的主机之上。各类实体,如商业机构或教育机构,其域名注册事务由专门的注册服务器进行处理,确保高效且专业的服务。
下更为关键的是,国际注册机构负责维护其特定的映射(即country-code顶级域),并有权进一步将这些映射细分为更具体的子分类。这种结构构建了一个层次分明的体系,如xi图所示,尽管由于地址分类范围的快速变化,图中仅展示了该体系的一小部分子集。
DNS的分层设计不仅确保了系统的灵活性和可扩展性,也为其在面对海量注册和查询请求时提供了卓越的应对能力,确保互联网的稳定运行。
DNS域名解析
当软件应用程序需要查找主机名(例如www.xxx.com),它们并不直接联系.com注册机构。网络管理员或ISP会配置你的系统,使其能够访问应用程序指定的DNS服务器,这些服务器负责处理查找过程。
然而,通常情况下,DNS服务器会尽量避免向外部发送请求,特别是当请求是针对同一个站点(由多个或单个用户请求)时。这种方式类似于Web浏览器缓存网页,有效地减少了对网络的不必要的重复请求,从而提高了性能和效率。
局域网内的DNS服务器具备缓存功能,能够自动存储近期被频繁请求的域名解析地址。这一设计不仅有效减轻了根域名服务器(TLD服务器)的负担,防止其因过量请求而超载,同时也显著提升了网络的整体性能。通过减少域名请求与响应之间的时间间隔,缓存机制大幅降低了网络延迟,为用户带来了更为流畅和高效的上网体验。
Java进行Internet寻址
到目前为止,关于Internet上主机的标识,我们已经明确了两种方式:一种是使用点分十进制形式的IP地址,另一种则是通过主机名来标识,例如www.xxx.com
。在Java编程语言中,为了处理这两种形式的地址,我们有一个专门的类——java.net.InetAddress
。这个类不仅具有解析IP地址的功能,还能够执行诸如查找主机等多样化的任务。
java.net.InetAddress类
在Java网络编程中,InetAddress类用于表示IP地址,它在处理网络通信时扮演着关键角色。与其他许多类不同,InetAddress类并未提供公有的构造函数供直接实例化,这是出于封装和安全的考虑。
equals方法
boolean equals(Object obj)
:比较两个IP地址,如果它们匹配就返回“true”。
注意,某些机器可以通过多个IP地址标识,所以对于相等测试不是绝对的:被测试的只是两个地址是否相同,而并不是说它们是否是同一台机器。
getAddress方法
byte[] getAddress()
:InetAddress
类中,getBytes()
方法被用于以字节格式返回IP地址,通过底层调用getBytes()
方法,开发人员可以获取IP地址的原始字节表示,这在某些网络编程场景中可能非常有用,特别是当需要处理底层网络通信或执行特定的二进制操作时。
注意,字节序列与常见的点分十进制(IPv4)或冒分十六进制(IPv6)表示法相对应。这些字节是以网络字节顺序(big-endian)返回的,其中最高有效位字节(即最左侧的字节)位于数组的第一个位置(
bytearray[0]
)。
getHostAddress方法
String getHostAddress ()
:getHostAddress()方法特别用于返回该InetAddress实例所代表的IP地址的字符串表示形式,通常是以点分十进制数(IPv4)或冒分十六进制(IPv6)格式呈现。对于IPv4地址,getHostAddress()方法将返回一个形如“xxx.xxx.xxx.xxx”的字符串,其中每个“xxx”代表一个介于0到255之间的整数,这四个整数之间用点号(.)分隔。这种格式是IPv4地址的标准表示方式,易于人类阅读和理解。
除了以上的方法之外,它还提供了两个静态方法来返回InetAddress的实例,这些静态方法允许我们以不同的方式获取IP地址的InetAddress表示。
getAllByName
static InetAddress[]getAllByName (String hostname)
是一个静态方法,旨在将给定的主机名映射为InetAddress实例的数组。此方法适用于现代网络环境,其中一台主机可能拥有多个IP地址。它尝试解析主机名,并返回一个包含所有匹配IP地址的数组。
如果在解析过程中出现任何无法识别主机名的情况,或者解析操作违反了安全管理器的策略,该方法将分别抛出 java.net.UnknownHostException 和 java.lang.SecurityException 异常。
UnknownHostException
异常通常会在无法解析给定的主机名时抛出。这可能是因为主机名不存在、DNS服务无法访问或DNS查询超时等原因导致的。java.lang.SecurityException
异常可能会在解析主机名的操作与Java的安全策略发生冲突时抛出。例如,如果安全管理器(SecurityManager
)配置了特定的安全策略,限制了某些主机名的解析,那么在尝试解析这些受限主机名时就会抛出此异常。
getByName
static InetAddress getByName(String hostname)
:处理主机名与IP地址之间的转换时,我们常常会使用InetAddress
类。此类提供了将文本形式的主机名(如"xxx.com")或点分十进制格式的IP地址(如"192.168.1.1")转换为InetAddress
实例的方法。
getLocalHost
static InetAddress getLocalHost ()
:通过InetAddress类的静态方法getLocalHost(),我们可以尝试获取表示本地主机的InetAddress实例。可以使用getHostAddress()方法获取并返回该主机的IP地址。
InetAddress类在Java中扮演着关键角色,用于封装IP地址信息,但它并非直接实例化的对象。相反,InetAddress类提供了一系列静态方法,这些方法允许开发者在不直接实例化该类的情况下,获取特定IP地址或主机名所对应的InetAddress实例。
相关文章:

探索互联网寻址机制 | 揭秘互联网技术的核心,解析网络寻址
揭秘互联网技术的核心,解析网络寻址题 前提介绍局域网地址IP地址的分配方式动态IP分配机制内部网(intranet)ICANN负责IP分配DHCP协议获取IP地址 域名系统域名是什么域名工作方式hosts文件存储域名映射关系DNS分布式数据库DNS域名解析 Java进行…...

C语言学习笔记之结构篇
C语言是一门结构化程序设计语言。在C语言看来,现实生活中的任何事情都可看作是三大结构或者三大结构的组合的抽象,即顺序,分支(选择),循环。 所谓顺序就是一条路走到黑;生活中在很多事情上我们都…...

C++笔记之一个函数多个返回值的方法、std::pair、std::tuple、std::tie的用法
C++笔记之一个函数多个返回值的方法、std::pair、std::tuple、std::tie的用法 —— 2024-06-08 杭州 code review! 文章目录 C++笔记之一个函数多个返回值的方法、std::pair、std::tuple、std::tie的用法一.从一个函数中获取多个返回值的方法1. 使用结构体或类2. 使用`std::t…...

GDB:从零开始入门GDB
目录 1.前言 2.开启项目报错 3.GDB的进入和退出 4.GDB调试中查看代码和切换文件 5.GDB调试中程序的启动和main函数传参 6.GDB中断点相关的操作 7.GDB中的调试输出指令 8.GDB中自动输出值指令 9.GDB中的调试指令 前言 在日常开发中,调试是我们必不可少的技能。在专业…...

服务器权限管理
我们linux服务器上有严格的权限等级,如果权限过高导致误操作会增加服务器的风险。所以对于了解linux系统中的各种权限及要给用户,服务等分配合理的权限十分重要。(权限越大,责任越大) 1.基本权限 U--user用户,G-group…...

08 SpringBoot 自定定义配置
SpringBoot自定义配置有三种方式: 使用PropertySource进行自定义配置 使用ImportResource进行自定义配置 使用Configuration进行自定义配置 PropertySource 如果将所有的配置都集中到 application.properties 或 application.yml 中,那么这个配置文…...
Java之3DES(Triple DES)加密计算(DESede/ECB/ZeroPadding)
Java环境本身并不直接支持DESede/ECB/ZeroPadding。 不过,可以通过以下几种方式来实现DESede/ECB/ZeroPadding: 手动实现填充和去除填充:如前面示例代码所示,在加密之前进行填充,在解密之后去除填充。这是一个通用的方…...
从0开发一个Chrome插件:项目实战——广告拦截插件
前言 这是《从0开发一个Chrome插件》系列的第十七篇文章,本系列教你如何从0去开发一个Chrome插件,每篇文章都会好好打磨,写清楚我在开发过程遇到的问题,还有开发经验和技巧。 专栏: 从0开发一个Chrome插件:什么是Chrome插件?从0开发一个Chrome插件:开发Chrome插件的必…...

C++ 32 之 静态成员函数
#include <iostream> #include <string> using namespace std;// 特点: // 1.在编译阶段就分配了内存空间 // 2.类内声明,在类外进行初始化 // 3.所有对象共享一份静态成员数据 class Students02{ public:int s_c;static int s_d;// 静态成员函数&#…...
Python闯LeetCode--第1题:两数之和
Problem: 1. 两数之和 文章目录 思路解题方法复杂度Code 思路 看到这道题第一思路就是暴力破解,枚举,两个for循环遍历,直到找到满足要求的答案。主要因题目假设只有一组满足结果的答案,因此难度大大降低,作为第一道题&…...

SSM情侣购物系统-计算机毕业设计源码02387
目 录 摘要 1 绪论 1.1 开发背景与意义 1.2开发意义 1.3Vue.js 主要功能 1.3论文结构与章节安排 2 情侣购物系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分…...

09-Spark架构
相比MapReduce僵化的Map与Reduce分阶段计算,Spark计算框架更有弹性和灵活性,运行性能更佳。 1 Spark的计算阶段 MapReduce一个应用一次只运行一个map和一个reduceSpark可根据应用复杂度,分割成更多的计算阶段(stage)…...

挑战5分钟内基于Springboot+SpringMVC+Mybatis-plus快速构建web后端三层架构
目标 在清晨的代码编辑器上,一场新的挑战即将开始。程序员们肃立于安静的办公室,眼神专注地盯着屏幕,等待着编译器的一声提示。 随着编译器输出的激动人心的"start!"的提示,战斗的序幕拉开了。Bug如潮水般涌来&#x…...
浅谈JavaScript中的作用域
前言 今天就来简单聊聊JavaScript中的作用域吧!!! 正文 我们都知道,在任何一门编程语言里面都是有作用域这个概念的,不然岂不乱套了 在js中的作用域一共分为三种,全局域、函数域和块级作用域 全局域 全…...
Python | C++漂移扩散方程和无风险套利公式算法微分
🎯要点 🎯漂移扩散方程计算微分 | 🎯期权无风险套利公式计算微分 | 🎯实现图结构算法微分 | 🎯实现简单正向和反向计算微分 | 🎯实现简单回归分类和生成对抗网络计算微分 | 🎯几何网格计算微分…...

python如何对list求和
如何在Python中对多个list的对应元素求和,前提是每个list的长度一样。比如:a[1,2,3],b[2,3,4],c[3,4,5],对a,b,c的对应元素…...

如何解决mfc100u.dll丢失问题,关于mfc100u.dll丢失的多种解决方法
在计算机使用过程中,我们常常会遇到一些错误提示,其中之一就是“计算显示缺失mfc100u.dll”。这个问题可能会影响到我们的正常使用,因此了解它的原因、表现以及解决方法是非常重要的。小编将详细介绍计算显示缺失mfc100u.dll的问题࿰…...

算法day32
第一题 207. 课程表 步骤一: 通过下图的课程数组,首先画出DAG图(有向无环图) 步骤二: 其次我们按照DAG图,来构建该图的拓扑排序,等有效的点都按照规则排完序后,观察是否有剩下的点的入度不为0&…...

【QT】信号与槽
目录 概述 Q_OBJECT 自定义信号 自定义槽 带参数的信号和槽 信号与槽断开 定义槽函数时,使用lambda表达式 概述 所谓的信号槽,要解决的问题,就是响应用户的操作,这是QT与其他GUI开发框架比较不同的地方。其他的GUI开发框…...

【Java】解决Java报错:IllegalArgumentException
文章目录 引言1. 错误详解2. 常见的出错场景2.1 非法的参数值2.2 空值或 null 参数2.3 非法的数组索引 3. 解决方案3.1 参数验证3.2 使用自定义异常3.3 使用Java标准库中的 Objects 类 4. 预防措施4.1 编写防御性代码4.2 使用注解和检查工具4.3 单元测试 结语 引言 在Java编程…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...