theme: condensed-night-purple
上一节梳理了大概的流程,但是dns解析器和浏览器一样没有网络访问的功能,因此都需要委托操作系统的协议栈进行下一步操作;
上文遗漏点
dns解析器和浏览器一样解析请求生成对应的请求消息,委托协议栈的udp模块向dns服务器发起请求;dns服务器收到后也是通过协议栈处理查询将数据发送给dns解析器
协议栈:网络控制模块,拥有tcp/ip协议,udp协议
向dns服务器发送请求同样也需要知道dns服务器的ip地址,这个在tcp/ip设置项中可以手动设置dns的ip地址
如果对应的域名ip映射能够在dns服务器中找到就完成了链路,但是一个计算机能够存储的映射表是有限的,这个之后讲解,~~
dns请求格式
先看下dns解析器生成的请求信息格式:
- 域名
服务器名称
- class
识别网络信息,目前只有互联网,该值永远为N
- 记录类型
域名对应的查询类型,当该值为A代表对应的是通过域名查询ip地址,当为MX时代表查询的是邮件服务器名称
查询流程
dns服务器会从资源记录表中查找到请求信息对应的ip地址或邮件服务器名称
如何存储资源记录表
一个dns服务器所存储的资源是有限的,如何能够映射所有的资源?通过层级关系划分,将域名按照.进行分割,每个部分即是一个层次一个域, 最右边的域层次最高依次往左层次下降。
每个域只可以存在于一个dns服务器中,不能存储在多个服务器中;但是一个dns服务器可以存放多个域;可以在域下创建下级域
www.glass.com
com是最大的域结构,接下来下一层
去找glass域,那么如何知道存储glass域 ,com域的dns服务器ip地址呢?
域存储结构
下一层的域要注册到上层域中,这样上层域就可以找到存放下层域的dns服务器ip; 从右至左查找,右边的服务器域名最大保管的是下一级的解析这个域名的dns服务器的ip地址,每个计算机dns客户端都会保存一些映射表,互联网里面所有的dns服务器里面就会保存最上层域的dns服务器ip
如果当前有对应的域名映射表就直接返回,如果没有就需要一层一层从上往下查找各个不同层级的dns的ip地址从而找到存储这个域名对应的ip地址dns服务器
还有一个跟域最容易被忽略,在com,cn等服务器的后面还可以在家一个点.代表跟域;跟域保存着com,cn等解析这些域名的dns服务器地址
大致流程:
每次都从根域进行查找太浪费时间了,因此DNS有缓存功能,缓存最近访问过的域名IP映射信息;但是缓存的信息可能会更改比如域名更换了,因此缓存会设置一个有效期,到期之后会进行清除,客户端在收到对应IP的时候也会有相应的表示此次结果是缓存命中还是所属DNS服务器返回的