首页 > 编程语言 >java构建TCP/IP协议:DNS,域名解析协议的基本原理介绍

java构建TCP/IP协议:DNS,域名解析协议的基本原理介绍

时间:2023-06-14 11:35:59浏览次数:59  
标签:java IP 域名解析 域名 DNS 字符串 服务器 对应


从本节开始,我们研究和实现一个体系较为复杂的协议,也就是域名解析协议,简写为DNS。该协议几乎也是我们”日用而不知“的幕后英雄,没有它肯定就没有现在的互联网繁荣。

当我们在浏览器上输入网址,例如www.baidu.com时,浏览器先通过DNS协议找到与该网址对应的IP地址,然后再使用IP去向服务器获取网页信息。也就是说互联网上的设备其实有两种辨认方法,一种是IP,一种是域名。就如同人的身份证,人有名字,同时也有几十位数字组成的身份证号。

人与人相互识别时,使用的都是名字,几乎没有人使用身份证号来识别他人的,即使身份证号相对于名字而言更加唯一和准确。说到底是因为人对数字识别很费劲,而记住名字很容易。

对计算机的访问也是如此。在互联网发展早期,计算机只是在局域网内互联,并且联网的机器非常有限,因此当时使用IP直接定位不同的机器。但是随着网络的发展,联网的机器越来越多,使用数字辨别每一台计算机变得越来越困难,于是人们开始想用更方便的记忆方式,于是自然就想到用字符串来替代难以记忆的数字。

然而对程序而言,它只能识别数字,于是字符串仅仅用作于方便记忆,在运行机制上,程序就得把字符串与IP数字进行转换。最早使用的转换机制很简单,甚至到现在还在使用,那就是hosts文件,它使用文本的方式将IP与字符串名字对应起来,如下图:

程序在运行时,先将该文件内容读入内存,当用户输入网址时,它先从里面的对应关系中,将网址直接转换成对应的IP地址。这种方法在主机数量少时适用,但现在网络上的主机数量数以千万计,如此我们得在文件中维护几万个对应关系,这显然不合情理,随着联网的设备越来越多,适用这种静态配置的方式越来越不合时宜,因此全网使用一种统一的IP字符串映射方式是势在必行。

如今能满足这种域名转换成IP需要机制,就是我们要研究和实现的DNS协议,它是极佳的分布式系统设计案例,互联网发展几十年来,接入网络的设备呈指数级增长,需要进行域名解析的请求自然也指数级增长,DNS自设计完成以来就具备了极佳的扩展性,因此它在没有大变动的情况下,满足日益增长的需求,可见其设计思路之巧妙。

相比于其他网络协议,DNS协议本身更像是一个系统。它主要包含以下三种系统功能:

显然我们不可能实现全部功能,但我们会选择一些重要模块进行研究和实现,事实上抓住局部原理,对整体功能的把握也就能做到心中有数。DNS分为三大块,紫色部分是名字空间,它规定了域名的层级构造标准,第二部分是名字注册,它负责添加新设备的名称并防止名字冲突,第三部分是名字解析,它负责将域名转换为对应IP。

在了解DNS协议时,我们需要掌握一个很重要的概念叫域名。”域名“其实是对一个特定领域的统一称呼。例如我的大学名叫”北京化工大学“,于是对于我母校而言,它是一级域名,在下面又分很多个学院,例如理学院,化工学院,文法学院等,这些学院名称就是二级”域名“,学院内又有很多个系,像我所在的理学院有:数学系,物理系,化工系,这些系的名称就是三级域名,系下面又分班,比如我所在的数学系分为1,2,3,4班,这四个班名称对应的是四级域名,每个班内的人都有自己的名字,于是就对应五级域名。

因此要定位我的时候就可以使用如下格式:北京化工大学.理学院.数学系.3班.陈屹,这个世界上与我同名的人肯定不少,但是所有层级的域名都给我一致的,那很可能就只有我一个,除非在班里有和我同名的人,倘若如此,我们可以把名字再当做一级域名,在底下进行区分,例如一个班内有两个陈屹时,上面域名就可以变为:北京化工大学.理学院.数学系.3班.陈屹.A,在任何一个层级出现冲突时,我们可以在该层级切分出多个子层级,从而避免冲突。

DNS中的域名以拓扑树的方式存在,如下图:

它以一个根节点开始,派生出一级域名,一级域名下面是二级域名,二级域名之后全都叫子域名。每一级域名可以使用数字和字符组合成的字符串来表示,其中字符串不区分大小写,同时一个域名下面的子域名不能相同,假设有一个一级域名叫"Black",那么它下层的子域名可以是"white",但必须只有一个,如果有另一个子域名叫”WHITE",由于域名不区分大小写,因此两个域名被认为相同,这是不允许的。

由此域名设定时可以从根到叶子节点,中间以符号".“隔开。上图中的Root始终对应空字符串,所以"www.baidu.com"对应于上图而言,第一级域名就是”",第二级域名就是"baidu",第三级域名就是"www",在解析的时候,该字符串域名就要倒转变成"www.baidu.com"。如果是百度知道,那么域名就是zhidao.baidu.com

一级域名由特定机构控制例如IANA这类互联网管理机构,而二级域名往往对应一个特定组织或团体,例如baidu对应百度公司,三级域名则由组织自己控制。域名对公司而言是非常重要的信息资产,早期有很多聪明人通过域名碰瓷,也就曾大公司或机构不注意,用他们的名字注册域名,结果这些公司想用时只能从他们手中高价购买,很多人就靠这种手段发了大财。

接下来我们看看域名解析的基本流程。首先要解析域名,我们先找到含有相关域名信息的服务器,然后向该服务器发送信息请求。问题在于,域名信息不是存储在固定服务器中,为了系统鲁棒性和扩展性,域名信息以分布式的形式存储在不同服务器里,因此第一步要查询哪个服务器包含了域名对应的信息。

假设我们要解析域名“C.B.A",首先我们将请求发送给所谓的根域名服务器,该服务器会把拥有域名A的服务器地址返回给我们,返回的服务器可能知道域名B.A的信息或者它把关于A的信息返回后,再给我们一个知道域名B的服务器地址,返回的服务器可能知道域名C的信息,或者返回域名B的信息后,再告诉我们哪个服务器知道域名C的信息,因此我们在解析过程中要根据服务器返回信息进行选择。

在下一节我们会就解析流程做深入介绍。

更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号:


标签:java,IP,域名解析,域名,DNS,字符串,服务器,对应
From: https://blog.51cto.com/u_16160261/6476525

相关文章

  • java构建TCP/IP协议:DNS,域名解析协议系统的运行流程
    DNS协议的运转需要客户端和服务器进行交互。由于服务器端需要存储大量的域名信息,同时每天需要应答海量的解析请求,因此它的设计必须遵循分布式系统。客户端向一台服务器请求解析服务时,对方可能没有相应的域名信息,于是它会向上一层查询,获得拥有给定域名信息的服务器,然后把对应服务器......
  • java开发系统内核:使用一个中断实现多个API调用
    在上一节,我们实现了通过中断访问内核API的功能,本节,我们进一步改进中断调用内核API的机制。当前,我们使用一个中断来对应一个API,问题是内核导出的API不可能只有一个,如果始终保持一个中断对应一个API的话,那么CPU只支持两百多个中断,也就是说,按照上一节的办法,我们内核最多只能导出两百......
  • java开发C语言编译器:jvm的return指令以及局部变量的操作
    jvm运行字节码时,代码的运行必须围绕两种数据结构,一种是堆栈,一种是队列,如果jvm执行某条指令时,该指令需要对数据进行操作,那么被操作的数据在指令执行前,必须要压倒堆栈上。如果堆栈上的数据需要暂时保持起来时,它就会被加载到局部变量队列上。java代码中,每个方法里面的局部变量包括函数......
  • java开发系统内核:应用程序与系统内核的内存隔离
    当前,我们可以开发运行在系统上的应用程序了,接下来的问题是如何保护系统内核免受恶意应用程序的危害。恶意程序要想侵犯系统,主要路径有两条,一是让内核执行它的代码,而是修改内核数据,通过修改数据改变内核的行为。我们看看,如何预防恶意程序侵入到系统内核的数据区域中。无论是内核还是......
  • 新版android studio无法新建java源码工程解决
    辣鸡股沟又特么一刀切了,新建的asandroid项目没法选java语言,默认就是kotlin,而且没有地方设置,具体解决办法是:在新建project的时候不要选EmptyActivity(会默认启用kotlin,无法选择java);可以选择如下图标红的1,2两种模版(NoActivity,EmptyViewsActivity)来新建项目,前者没有a......
  • myeclipse 不能正常加载项目
    问题不能加载项目,在选择项目后,DeployLocation是空的。 解决 1、网上查询后,提示,右键项目→ properties  →MyEclipse  →ProjectFacets  →web。修改項目名字。 2、但是在操作时,发现提示  thecurrentlydisplayedpagecontainsinvalidvalues。 ......
  • java开发操作系统内核:由实模式进入保护模式之32位寻址
    从时模式到保护模式,是计算法技术跨时代的发展。大家想想笨拙的Dos界面,黑底白字的那种冷漠界面到win95各种色彩斑斓的窗口,两者之间的区别其实就是实模式和保护模式的天壤之别。保护模式中,最重要的一个概念莫过于”保护”二字,有了“保护”功能后,CPU为软件提供了很多的功能,当然也有了......
  • java开发C语言解释器:数组元素的读取和赋值
    本节技术内容难度较大,请结合视频对代码的讲解和调试来理解本节内容:用java开发编译器一个成熟的编译器或解释器,要能够解析和执行目标语言开发的逻辑复杂的程序代码,我们用java开发的C语言解释器,能够执行用C语言开发的较为复杂的程序时,才称得上是合格的,从本节开始,我们致力于C语言解......
  • java开发C编译器:把函数调用编译成字节码
    本节,我们研究如何把函数声明和函数调用转换成可执行的java字节码,在完成本节代码后,我们的编译器能把下面代码编译成可被java虚拟机执行的字节码,示例代码如下:voidf(){printf("executefunctionf()");}voidmain(){f();}假设java一个类含有如下方法:publicfloatco......
  • java开发操作系统内核:让内核突破512字节的限制
    我们当前的系统内核,必须包含在虚拟软盘的第1扇区,由于一个扇区只有512字节,因此,系统内核的大小不可能超过512字节。但是,一个拥有完善功能的内核不可能只有512字节,因此要想越过512字节的限制,具体的做法就是做一个内核加载器,放入到第一扇区,加载器加载如内存后,再将内核从软盘加载到系统......