我们经常访问一些网址的时候,浏览器里输入类似于 www.baidu.com 这样的地址,那么在浏览器里输入这个地址---> 百度服务器给我们返回这个百度的页面,中间的过程是什么样的呢?
带着这个问题,我们一起来解析一下其中的过程。
1、域名和 IP 的关系
首先,类似于‘www.baidu.com’和‘www.sina.com.cn’这样的地址我们统一叫做域名。那么,使用域名访问后,这个请求直接就能到达对应的服务器么?
不是的!
在这个过程中是需要把这个域名转换为 IP 地址的,只有通过 IP 地址去寻找才可以找到这个服务器的位置,服务器才能收到请求。
为什么要在域名和 IP 之间进行这个转化操作呢?我们来回答两个问题:
那么我们为什么不直接用 IP 地址通信?
因为 IP 地址对于用户来说不方便记忆,域名更加方便于用户记忆和使用,例如 www.baidu.com 这是百度的域名;www.sina.com.cn 就是新浪的域名,非常好理解和记忆;
那为什么不干脆直接用域名来找服务器?
这是因为域名的长度是不固定的,不便于计算机进行处理;而 IP 地址是固定长度的,如果是 IPv4 地址就是 32 位的,IPv6 的地址就是 128 位的,长度固定计算机更方便处理。
所以,总结一点就是 IP 地址是面向主机的,而域名则是面向用户的。所以我们需要将域名和 IP 地址进行相互转化。
2、域名转化为 IP 地址
在最开始的时候,人们都用电脑的 hosts 文件进行域名和 IP 的转化。
在我们电脑 C:\Windows\System32\drivers\etc 路径下面有一个 host 文件,可以保存域名和 IP 的对应关系,如下图所示:
如果你想学习自动化测试,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的接口自动化测试教程,同时在线人数到达1000人,并且还有笔记可以领取及各路大神技术交流:798478386
【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)_哔哩哔哩_bilibili【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)共计200条视频,包括:1.【接口自动化】目前软件测试的市场行情以及测试人员能力标准。、2.【接口自动化】全面熟练Requests库以及底层方法调用逻辑、3.【接口自动化】接口自动化实战及正则和JsonPath提取器的应用等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337&vd_source=488d25e59e6c5b111f7a1a1a16ecbe9a
图中框起来的这行,就是把 120.24.89.47 这个 IP 地址映射为 www.tricy1.com 这个域名。当配置完成之后,就算 www.tricy1.com 这个域名不是一个真实注册的域名,在本台电脑里依然可以访问 www.tricy1.com 这域名就可以访问到这个 IP 地址对应的网站(柠檬班的测试派论坛)。
最初,通过互联网信息中心来管理这个 hosts 文件,如果有一个新的计算机想接入网络,或者某个计算 IP 变更都需要到信息中心申请变更 hosts 文件。其他计算机也需要定期更新,才能上网。但是这样太麻烦了。为了更加简便的操作,就出现了 DNS 协议。
DNS 协议,全称 Domain Name System,它是一个应用层协议,它建立在 UDP 或 TCP 协议之上,默认使用 53 号端口。
客户端默认通过 UDP 协议进行通讯,但是由于广域网中不适合传输过大的 UDP 数据包,因此规定当报文长度超过了 512 字节时,应转换为使用 TCP 协议进行数据传输。所以,DNS 协议是少有的既可以用 UDP 协议,又可以用 TCP 协议作为底层协议的应用层协议。
该协议的功能就是将人类可读的域名 (如,www.qq.com) 转换为机器可读的 IP 地址 (如,119.147.15.13)。
域名的层级结构:
如上图可见的域名中间是用点分割开的。这个每个点隔开的代表什么呢?
我们就需要了解一下域名是分层结构,域名服务器也是对应的层级结构,分别为根域名,顶级域名系统,二级域名系统,三级域名系统等如下图所示:
全球共有 13 台根服务器,这 13 台根域名服务器中文名字分别为“A”至“M”,其中 10 台设置在美国,另外三台分别设置在英国、瑞典、日本。1 个主根服务器放置在美国,其余 12 个均为辅根服务器。
比如www.baidu.com这个域名的层级结构就如下:
com: 顶级域名。表示这是一个企业域名。
baidu: 二级域名,指公司名。
www: 网络协议(World Wide Web)
域名一般不能超过 5 级,从左到右域的级别变高,高的级域包含低的级域。域名在整个 Internet 中是唯一的,当高级子域名相同时,低级子域名不允许重复。
有了域名结构,还需要有一个东西去解析域名,那就是域名服务器。
域名需要由遍及全世界的域名服务器去解析,域名服务器实际上就是装有域名系统的主机。
DNS 解析过程
如上如所示,我们来解析一下 DNS 解析的过程:
用户希望通过客户端浏览器访问百度服务器-域名为 www.baidu.com:
用户在浏览器里输入 www.baidu.com 域名,默认优先查找浏览器缓存,看缓存中是否含有域名对应的 IP 地址
当浏览器中找不到时,会检测系统中的 Hosts 文件中是否有对应的 IP 地址
如果 hosts 里没有这个域名的映射,则查找本地 DNS 服务器;
若没有,通过 DNS 服务器就向根域名服务器中进行查找;根域名服务返回可供查询的顶级域名服务器 IP 地址;
顶级域名服务器返回 DNS 响应消息;
主机收到响应消息后,可以正常访问该服务器了;并将结果保存,以备下一次使用
而 DNS 协议的查询方法又分为以下两种:
递归查询:本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以 DNS 客户机的身份向其它域名服务器查询,直到得到最终的 IP 地址告诉本机
迭代查询:本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询。
通俗地说,递归就是把一件事情交给别人,如果事情没有办完,哪怕已经办了很多,都不要把结果告诉我,我要的是你的最终结果,而不是中间结果;如果你没办完,请你找别人办完。
迭代则是我交给你一件事,你能办多少就告诉我你办了多少,然后剩下的事情就由我来办。