| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 前端网络基础-应用层DNS协议 -> 正文阅读 |
|
[网络协议]前端网络基础-应用层DNS协议 |
目录 初识域名? ?一个网址组成如上图所示 其中服务器地址部分,既支持IP地址,也支持域名。如上图的服务器地址就是域名。 但是我们无法直接通过域名找到服务器,而是需要将域名解析为IP地址后,通过IP地址在网络中找到服务器。 因为网络分层模型设计中,网络层寻址工作只能依赖于IP地址。 有了IP地址为什么还要域名?直接使用IP地址访问服务器不好吗? 好是好,但是IP地址是一串数字,数字本身没有实际意义,无法关联记忆。 这个问题,还可以解释为 有了手机号码,为啥还要备注手机号主人的名字。 为什么网络通信中使用IP地址来表示网络设备位置,而不使用域名? 二者虽然都可以生成一个唯一标识,但是IP地址可以占用更少的内存,更加规范的格式。 比如IP地址只需要 32位二进制,就可以产生 255 * 255 * 255 * 255 =?4228250625 个网络地址,而域名本身组成可以是数字字母下划线,或者中文字符,而一个字符至少需要占用1个字节,也就是8位二进制,所以域名想要产生4228250625个网络地址,需要占用的内存太大。 另外 IP地址格式固定,使用十进制表示就是 0.0.0.0 到 255.255.255.255 之间,这种固定的,简单的格式,有利于网络传输数据包的设计,因为在网络层,需要将源目IP地址都封装进IP头部中,随着数据包一起传输过去。 但是使用域名的话,由于其格式多样,内存占用不固定,所以不利于网络传输数据包的设计。 正向解析和反向解析域名的产生只是为了更加方便使用者记忆。而在底层网络传输前,域名必须要先解析为IP地址。此时解析称为正向解析。 而对应的反向解析就是指 通过IP地址获取域名。 反向解析的应用主要是 识别垃圾邮件。通过查询垃圾邮件的IP地址对应的域名,来判断对方是否为垃圾邮件。 DNS解析DNS(Domain name system),即域名系统,作用是将域名解析为IP地址。 主机本地hosts文件实现DNS解析一般网络主机中都存在一个hosts文件,该文件中会配置好域名和IP的映射关系,然后当主机访问某域名时,就会优先去hosts文件中根据域名查找IP地址。 比如windows电脑中,C:\Windows\System32\drivers\etc\hosts ? 浏览器缓存实现DNS解析浏览器经常需要通过域名访问远程服务器,但是底层每次都需要将域名解析为IP地址后,才能发起真正的HTTP请求。 所以域名解析的速度直接影响了浏览器请求资源的速度,进而影响了网页的加载速度。 所以为了不被重复的域名解析工作耽误,浏览器会缓存每次解析到的IP和对应的域名到本地,这样下次请求相同域名时,就可以直接从浏览器缓存中获取域名对应的IP地址了。 本地DNS服务器实现DNS解析网络主机一般都需要配置一个默认的本地DNS服务器,方便网络主机单靠自身找到域名对应的IP地址时,可以寻求本地DNS服务器的帮助。 比如windows电脑就需要配置本地DNS服务器 而我们家用的路由器一般都内置了一个DNS服务器,这里的192.168.1.1其实就是默认网关:路由器的地址。? DNS服务器的作用也是将域名解析为IP地址。 而当本地DNS服务器也无法找到域名对应的IP地址时,就会请求根域名服务器查找域名对应的IP地址。当找到之后就会将域名和IP地址缓存在本地,这样下次遇到相同的域名,就可以在本地DNS服务器完成解析了。 域名的组成每个域名其实都有一个根域名,根域名是一个点号,它默认是可以省略的。 即 www.baidu.com? 其实完整写法是 www.baidu.com. 当本地域名服务器找不到域名对应的IP地址时,就会去根域名服务器去查找。 即域名地址最后一个 点号 代表的是根域名服务器地址 而其他的点,分别从右往左按照顺序,代表了顶级域名服务器地址,二级域名服务器地址,三级域名服务器地址,..... 而实际上,域名服务器之间有从属关系,即层级关系,根域名服务器下面有多个顶级域名服务器,一个顶级域名服务器下又有多个二级域名服务器,....... 根域名服务器:最高层次的域名服务器,本地DNS服务器解析不了域名时,就会去找根域名服务器。全球一个13台根域名服务器。 顶级域名服务器:通常表示某个国家,地区,组织,公司,学校等,比如 cn 表示中国, jp表示日本,us表示美国,hk表示香港地区,com表示公司,org表示组织,edu表示学校 二级域名服务器:具体公司或组织的名字,如baidu,bilibili,huawei ?三级域名服务器:通过表示某公司或组织的某个具体产品或业务项,比如 www 通常表示主页,image表示图片业务 DNS迭代解析迭代解析过程: 比如查找www.baidu.com 1、本地DNS服务器,首先去根域名服务器获取域名对应的IP地址,但是根域名服务器也找不到,所以根域名服务器就将顶级域名服务器的地址(com)返回,让本地DNS服务器去顶级域名服务器查找。 2、本地DNS服务器,再去顶级域名服务器(com)获取域名对应的IP地址,但是顶级域名服务器也找不到,所以顶级域名服务器就将二级域名服务器的地址(baidu)返回,让本地DNS服务器去二级域名服务器查找。 3、本地DNS服务器,再再去请求二级域名服务器(baidu)查找,发现二级也找不到,于是就返回三级域名服务器地址(www),......... 4、本地DNS服务器,再去三级域名服务器查找,最终找到了对应的IP地址 DNS递归解析DNS递归解析,其实相对于DNS迭代解析的区别就是 本地DNS服务器只需要发送一次请求,就可以得到最终结果IP地址。类似于递归函数。? 通常情况下,本地DNS服务器 向根域名服务器查询,采用迭代方式。 因为根域名服务器需要服务很多很多DNS服务器,所以不能让根域名服务器承担所有压力,需要将压力转移到每个DNS服务器身上。 而 主机 向 本地DNS服务器查询时,一般采用递归。 因为如果本地有多台DNS服务器,由于这多台DNS服务器,服务的对象是可数的,少量的,所以本地DNS服务器可以承担更多的任务,而主机服务器需要更多的资源去处理面向用户的任务。 DNS协议前面说了DNS的迭代和递归解析,那么DNS请求是如何发送出去的呢?它的请求是否需要符合一种格式?在传输层,DNS请求又是基于什么协议发送出去的呢? DNS请求是发生在应用层的,而应用层有一种协议:DNS协议,来规范了DNS请求报文格式。 而DNS请求在运输层,既可以使用TCP协议,也可以使用UDP协议,但是默认使用UDP协议。 因为我们期望DNS请求可以快速得到解析结果,而不是数据完整性。 我们可以通过抓包来查看DNS请求过程 访问某个域名,必然触发域名解析 抓包结果 DNS请求 DNS响应 另外可以发现,无论是请求还是响应抓包结果中,传输层都是使用的UDP协议? ? 浏览器地址栏输出一个网址后的DNS解析流程这里面涉及到一个DNS解析优先级的问题。 在浏览器输入一个域名网址后,肯定是优先在浏览器缓存中找到域名,如果找到则直接取出IP地址返回,如果没有,则继续后续流程 之后在主机的hosts文件上查找,如果找到则直接取出IP地址返回,如果没有,则继续后续流程, 之后在本地DNS服务器上查找,如果找到则直接取出IP地址返回,如果没有,则继续后续流程, 之后在根域名服务器上查找,如果找到则直接取出IP地址返回,如果没有,则继续迭代查找。 |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 11:27:17- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |