一 恳求和解析全流程 阅读器输入一个网址出现了什么 揭秘 DNS
从本系列文章开局将围绕着“往阅读器输入网址后出现了什么”引见计算机网络的相关基础常识。
本文将引见往阅读器中输入一个网址后客户端如何封装http信息和发送dns恳求查问指标主机的ip的环节。
一、客户端(如阅读器)解析url
url的组成局部如下所示:
客户端会依照 协定、域名、文件门路以及恳求参数 对url启动解析(就是解析出以上信息)。
url假设没有以/开头示意访问一个指定文件,以/开头示意访问指定目录下的自动文件,例如:
二、生成http恳求信息
解析完url后,客户端会依据恳求的类型(这里以GET和POST为例)生成http恳求信息。http恳求信息和照应信息如下所示:
PS:get恳求没有信息体,post才有。
如下为get和post恳求报文格局:
客户端会依据上述(a)的格局生成http信息。
头信息罗列
通用头:
恳求头:
照应头:
照应信息中的形态码概述:
三、向DNS主机查问域名对应IP
客户端生成http信息后会委托操作系统将信息发送给web主机。操作系统拿到http报文后为了将其发送给web主机,会先依据域名查问指标主机的IP地址。
1.繁难了解IP相关常识
在网络中,一切设施都会被调配一个IP地址,IP地址相当于是主机的坐标,客户端得悉这个坐标能力将信息发送到主机主机。
实践的IP是一串32比特的数字(IPv4规范),并按8比特分为4组,每组用原点隔开,每组以十进制示意。除了IPv4规范外还有IPv6规范,IPv6下的IP地址则是128比特的长度用于允许更多或者的地址,这里只引见IPv4下的内容。
IP地址分为网络号和主机号两局部,网络号代表主机所在的子网网络,子网与子网间经过路由器和集线器衔接和通讯,主机号代表某台主机在子网中的详细位置。
IP地址被分为A~E类,每类的网络号和主机号长度是不定的,例如C类IP的前3个字节是网络号,第4个字节是主机号;而B类IP地址前2个字节是网络号,后两个字节是主机号。
IP地址会用附加信息来示意哪局部是IP的网络号,哪局部是IP的主机号。这个附加信息就是子网掩码。子网掩码是一串与IP长度相反的32比特数字,也分为主机号和网络号,其中左边一半全为1,左边一半全为0,全为1的局部为网络号,全为0的局部为主机号。
例如:10.11.12.13/255.255.255.0中255.255.255.0就是子网掩码,它的前3字节是1,第四字节为0,因此示意10.11.12.13中前3字节是网络号,第4字节是主机号。
此外还可以用 网络号比特数 示意子网掩码,如24。24示意前三字节为网络号(8*3),16示意前两个字节为网络号(8*2),8示意只要第一个字节是网络号。
域名也代表某一主机的地址,但域名的经常使用是为了繁难人类的记忆,而IP才是主机所在主机的真正位置。
回到正题。
2.对于DNS解析器
DNS解析器实质上是操作系统socket库中的一段程序,用于向dns主机发送查问恳求并失掉域名对应的IP并前往给客户端。而socket库是用于调用网络性能的通用程序组件。
客户端经过DNS解析器动员dns恳求的环节如下所示:
客户端(阅读器)委托操作系统调用socket库的gethostbyname()这个系统调用函数,此时用户程序(阅读器)的上班会暂停并切换到操作系统的dns解析器运转,即用户态切换到内核态。
DNS解析器依据阅读器提供的域名生成DNS查问信息(DNS查问报文)并交给操作系统中的TCP/IP协定栈,由协定栈经过网卡以UDP传输的模式发送给DNS主机。在这里,操作系统必需得悉道DNS主机的IP,这样操作系统才该把报文发送给那个DNS主机,而这个DNS主机的IP是曾经事前设置好的,如下所示:
而这个设置好的DNS主机普通是距离客户端主机所在市区内不远处的一个DNS主机,咱们称之为本地DNS主机。
发送DNS查问报文后,DNS主机会前往对应域名的IP地址给协定栈(至于DNS主机依据域名前往对应ip的环节会在之后引见),并按原路前往给DNS解析器,解析器将IP写入到阅读器指定的内存地址中(从内核态切回用户态),这样当该阅读器待会再想知道这个域名的IP时就间接从用户程序内存中取即可,无需在做DNS查问。此外,操作系统和阅读器还会对这个域名与IP的映射相关做缓存,即使封锁了阅读器下次再关上并恳求也无需做DNS查问恳求。除非缓存时期过时。
失掉IP的值的阅读器终于可以开局发送HTTP恳求信息。
四、DNS报文在多个DNS主机间的传递
当客户主机的操作系统将DNS查问报文发送给本地DNS主机到DNS主机前往IP给客户端主机这段时期出现了什么?这里须要引见一下DNS查问报文的内容和DNS主机。
1.DNS查问报文和回答报文
DNS 查问和回答报文的格局是分歧的,如下所示:
报文头部的12个字节蕴含了一些控制信息如,报文是查问还是回答报文,回答报文中通知客户端它访问的能否为威望DNS主机,客户端能否宿愿DNS主机提供递归查问,以及该DNS主机能否允许递归查问,回答的RR数等。
查问报文的实体局部须要包括2个局部:要查问的域名和记载类型。
记载类型示意域名对应何种类型的记载(即通知DNS主机,依据传上来的域名,它应该前往什么类型的照应内容)。
dns主机中保留着多条资源记载(RR),资源记载不仅包括域名与IP的映射,但包括域名与其余信息的映射,而资源记载中保留的究竟是域名与什么信息的映射取决于记载类型。
如下所示:
除了上述类型,还有其余的记载类型。感兴味的好友可以自行查阅。
回答报文会蕴含多条资源记载(RR),每条资源记载包括4个字段:(Name, Value, Type, TTL)。区分是域名,域名对应的值(如IP、威望DNS域名、邮箱域名等),记载类型,记载的有效时期。
2.域名层级
一个域名的层级从左到右依次优化,每个层级用.分开。以www.abc.com为例,com是顶级域名,com域的下一层是abc域,再下一层是www这个名字。
3.DNS主机
DNS主机实质是一个存储着域名与相应信息映射相关的具备层级的、散布式数据库集群。
(1) 存储着域名与相应信息映射相关
DNS主机外面保留的数据咱们称之为资源记载,如下所示:
当带有 域名、class和记载类型 的恳求报文抵达DNS主机后,它会依据这3个信息从资源记载中找到这3个字段都婚配的记载前往给客户端。相当于select `照应数据` from表where `域名`="xxx" and `class`="xxx" and `记载类型`="xxx";
(2) 具备层级的、散布式数据库集群
全环球的根域DNS主机大略有十几台。
每一台根域名主机都知道一切顶级域名DNS主机的域名和IP,而且不论哪一个本地区名主机要对某个域名启动解析而自己无法解析都会首先求助于根域名主机。
每一层DNS主机都保留着下一层DNS主机的一切IP地址,并且一切层级的每一台DNS主机会保留一切根域的DNS主机IP。这么一来就能做到在本地DNS主机能找到根域DNS主机IP,再从依据主机逐层往下找到其余DNS主机。
当某一台威望DNS主机不能给出最后的查问回答,就会通知恳求者下一步应该找到哪个威望DNS主机。
用户主机向本地区名主机的查问都是驳回递归查问(所以用户主机只用收回一次性DNS恳求即可失掉想要的IP地址,其余的恳求交给本地DNS主机和其余DNS主机即可),本地区名主机向根域名主机的查问通常驳回迭代查问,但也可以驳回递归查问。
如下图所示:
有了上方的裁减常识后,咱们再来说DNS报文发送到本地DNS主机后出现了什么:
以www.lab.glasscom.com为例:
上方这种DNS查问模式是迭代查问,每次都是由本地DNS主机动员恳求,此外还有其余查问模式如递归查问,以及间接查问DNS缓存。
上方咱们看看递归查问和迭代查问的区别:
如下图展现了递归查问环节:
如下图:
下节预报: 阅读器输入一个网址出现了什么(二) TCP模块封装和传输机制