浏览器中输入url后发生的事情有什么?这是面试的时候可能会遇到的问题,下面是我根据从图解http和网上的博客中学习整理的过程,如果哪一步有问题,希望正指出来,十分感谢。
输入url后可以大概分为六个部分
- DNS域名解析
- 建立TCP连接
- 发起HTTP请求
- 接受响应结果shu
- 浏览器解析html
- 浏览器布局渲染
在说明这之前我们需要知道数据传输的层次顺序
(图一选自图解http协议1.3.3 TCP/IP 通信传输流)
数据根据传输的层次根据层层的封装发送到服务器中,在又服务器层层解封来
1.DNS域名解析
1.1 DNS产生背景
用户与互联网的某台主机进行通讯时必须知道对方的IP地址,但是要用户很记住32位ip地址时件很反人类的事情(即使是用点分十进制也不容易记住),而我们睿智的程序员早已经料到这一点,在应用层为了方便用户记忆,连接在互联网上的主机不仅有ip地址还有主机名字。DNS域名系统能够把主机的名字转换为ip地址。
在上古年代,准确的说是在APRPANET(1969年),整个网络只有数百台计算机,有一个host文件,里面列出了有关主机名和ip地址的映射,用户只要输入有关计算机主机名就能得到相应的ip地址。
题外话:为什么主机处理ip报文需要32位IP地址(如果是ipv6就是128位ip地址)而不是域名?
答案是因为ip地址无论是32位还是128位都是定长的,而域名长度则是不固定的,主机处理起来比较麻烦,所以需要ip地址。
到了现代,理论上我们能用一个服务器储存所有的有关主机名和ip地址的映射,可惜想法很美好,但是现在的互联网规模已经不能同日而语了,如果只有一台服务器,它会因为负荷过大而无法运行,而这台服务器一旦无法运行,整个互联网就会big-bang了。
睿智的攻城狮早再1983年规定了域名的树装层次命名,并且使用分布式的DNS域名系统。
DNS使得大多数的域名都在本地进行解析,仅需要少量的信息需要传到网上查询,因为是分布式的,所以即使某一台服务器出现了故障问题也不大。
一个域名转为ip的过程位:当一个应用程序需要将域名转化为ip,首先会调用解析程序,成为DNS服务的客户,将要转化的域名写入到DNS请求报文中以UDP的方式发送(主要是为了节约资源)本地域名服务器中,本地域名服务器在查询到相关的ip后就会将ip地址以回答报文中返回,应用进程获得ip地址后即可通讯。
若本地域名服务器无法回答此请求,本地域名服务器就会成为DNS服务的另一个客户,向其他的域名服务器发出请求,直到找到ip地址。
开始的时候我们可以理解,不过首先我们要了解几个概念
1.2 互联网的域名系统
早起的互联网使用了非等级的名字结构,其优点是名字简短。但是当互联网上的用户数急剧增加时,用非等级的名字空间来管理一个很大的而且是经常变化的名字集合是非常困难的。因此,互联网后来就采用了层次树状结构的命名方法。采用这种命名方法,任何一个连接在互联网上的主机或路由器,都有一个唯一的层次结构的名字,即域名。这里“域”是名字空间中间中一个可被管理的划分。域可以划分为子域,而子域还可以继续划分为子域的子域,就这样就形成了顶级域,二级域,三级域,等等。如下图所示。
上图出自计算机网络第七版
DNS规定:域名中的标号由英文字母和数字组成,每一个标号不超过63个字符(但为了方便记忆,最好不要超过12个字符),也不区分大小写字母。标号中除连接字符外不能使用其他的标点符号。级别最低的域名写在最左边,而级别最高的顶级域名写在最右边。由多个标号组成的完整域名总共不超过266个字符。
DNS既不规定一个域名需要包含多少下级域名,也不规定每一级的域名代表什么意思。各级域名由其上一级的域名管理机构管理,而最高级的顶级域名管理机构则由ICANN进行管理。用这种方法可使每一个域名在整个互联网范围内是唯一的,并且也容易设计出一种查询域名的机制。
需要注意的是,域名只是个逻辑概念,并不代表计算机所在的物理地点。变长的域名和使用有助记忆的字符串,是为了便于人使用。而IP地址是定长的32位二进制进制数字则非常便于机器进行处理。这里需要注意,域名中的“点”和点分十进制IP地址中的点并无一一对应的关系。点分十进制IP地址中一定是包含三个点,但是每一个域名中的点的数目不一定是三个。
我们可以用一颗树来形象的表示域名系统
上面是一个n叉树,每一个父节点的域名管理下面的子节点的域名,就这样分下去,直到树叶是一个个计算机,一旦某个单位有了自己的域名自己就可以决定是否往下分割,而不必向上级域名请示。域名树的树叶就是单台计算机的名字,它不能再继续往下划分了。互联网的域名划分是按照机构的组织来划分的,与物理的网络无关,与IP地址中的子网也没关系。
1.3域名服务器
上面的互联网域名空间是逻辑上,而现实中,我们既不需要那么多域名服务器,会使效率降低,因此DNS使用划分区的方式解决这个问题。
一个区就是一个服务器负责的范围,区中的节点要保证互相连通,每个区都有一个权限域名服务器,实际上DNS是以区为单位而不是以域为单位的。
下面的例子节选自《计算机网络第七版》
实际上笔者开始也对DNS的服务器的单位有误会,误以为每一个域都要配一个服务器,实际上不需要。(汗)
搞完了上面的基础概念,我们可以对DNS干的事情进行讨论了。
1.4域名解析过程
这里要了解两个概念,递归查询和迭代查询。
迭代查询是指:一般是主机向本地域名服务器查询方式,当本地域名服务器向根服务器请求查询的域名,根服务器告诉本地服务器下一步应该去哪个顶端服务器查找,将该顶端服务器的ip告诉本地域名服务器,到了该顶端服务器要么把该域名解析的ip地址告诉本地域名服务器,要么告诉本地域名服务器,下一步应该到哪个二级域名服务器,依次类推直到找到域名对应的ip地址,然后把这个ip地址发给主机。
递归查询是指:一般是本地域名服务器向根域名服务器查询方式,如果主机询问的本地域名服务器不知道ip地址,本地域名服务器以DNS客户的身份向根域名发送DNS请求报文,而不是让该主机进行查询。
其实笔者在写这个查询时脑袋是晕晕的,看不出两个查询有什么区别,不过加上下面这幅图应该能看明白。
所谓的迭代查询,使让本地域名服务器来一个个访问其他的域名服务器直到找到IP,而递归查询是让每个相应主机,自己查询下一层的域名服务器直到找到ip,将结果返回个主机。
总结起来就是 自己动 和 自己躺着别人动的区别(φ(≧ω≦*)♪)
顺便说一下,本地域名服务器也是有记忆的,如果它在自己的记录里找到了对应的ip地址,就不会向根域名服务器发送DNS请求报文,如果记录里虽然没有ip地址但是又顶端域名服务器的ip,也不会向根域名服务器发送DNS请求报文,而是直接向顶端域名服务器发送DNS请求报文,这样做可以达到的减少网络负担,每隔一段时间,域名服务器就会从缓存中删掉,又重新查询,为了内容正确。
所有的DNS的概念零件已经介绍完毕,下面我们来看DNS域名解析的全貌
当一个用户在地址栏输入www.taobao.com时,DNS解析有大致十个过程如下:
- 浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束。同时域名被缓存的时间也可通过TTL属性来设置。
- 如果浏览器缓存中没有(专业点叫还没命中),浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程。在windows中可通过c盘里一个叫hosts的文件来设置,如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。
- 如果至此还没有命中域名,才会真正的请求本地域名服务器(LDNS)来解析这个域名,这台服务器一般在你的城市的某个角落,距离你不会很远,并且这台服务器的性能都很好,一般都会缓存域名解析结果,大约80%的域名解析到这里就完成了。
- 如果LDNS仍然没有命中,就直接跳到Root Server 域名服务器请求解析
- 根域名服务器返回给LDNS一个所查询域的主域名服务器(gTLD Server,国际顶尖域名服务器,如.com .cn .org等)地址
- 此时LDNS再发送请求给上一步返回的gTLD
- 接受请求的gTLD查找并返回这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器
- Name Server根据映射关系表找到目标ip,返回给LDNS
- LDNS缓存这个域名和对应的ip
- LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束
下面为相应的流程图。
2.建立TCP连接
得到了ip地址后,
(图2选自图解http协议1.6 各种协议与 HTTP 协议的关系)
参考资料:
详解DNS域名解析全过程
当在浏览器地址栏输入一个URL后回车,将会发生的事情?
DNS解析过程详解
图解http(日)上野宣
《计算机网络第七版》谢希仁