百度牛掰面试题-当在浏览器地址栏输入一个URL后回车,将会发生的事情

1. 首先嘛,你得在浏览器里输入要网址:php

2. 浏览器查找域名的IP地址css

导航的第一步是经过访问的域名找出其IP地址。DNS查找过程以下:html

 

  • 浏览器缓存 – 浏览器会缓存DNS记录一段时间。 有趣的是,操做系统没有告诉浏览器储存DNS记录的时间,这样不一样浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。
  • 系统缓存 – 若是在浏览器缓存里没有找到须要的记录,浏览器会作一个系统调用(windows里是gethostbyname)。这样即可得到系统缓存中的记录。
  • 路由器缓存 – 接着,前面的查询请求发向路由器,它通常会有本身的DNS缓存。
  • ISP DNS 缓存 – 接下来要check的就是ISP缓存DNS的服务器。在这通常都能找到相应的缓存记录。
  • 递归搜索 – 你的ISP的DNS服务器从跟域名服务器开始进行递归搜索,从.com顶级域名服务器到Facebook的域名服务器。通常DNS服务器的缓存中会有.com域名服务器中的域名,因此到顶级服务器的匹配过程不是那么必要了。

DNS递归查找以下图所示:web

做者:何伟鹏
连接:https://www.zhihu.com/question/34873227/answer/70038032
来源:知乎
著做权归做者全部,转载请联系做者得到受权。ajax

DNS具备两层含义:①一个由分层的DNS服务器实现的分布式数据库;②一个容许主机查询分布式数据库的应用层协议。有三种类型的DNS服务器:根DNS服务器、顶级DNS服务器和权威DNS服务器。这些服务器如下图的层次结构组织起来。除此以外,还有一类重要的DNS,称为本地DNS服务器。严格来讲本地DNS服务器并不属于DNS服务器的层次结构,但它在整个查询的过程当中却扮演着重要的角色。
首先,浏览器所在的主机向本地DNS服务器发送一个含有知乎域名的DNS查询报文。本地DNS服务器把查询报文转发到根DNS服务器,该根DNS服务器注意到其com后缀并向本地DNS服务器返回com的顶级域名服务器的IP地址。该本地DNS服务器再次向comDNS服务器发送查询请求,comDNS服务器注意到其http://zhihu.com后缀并用负责该域名的权威DNS服务器的IP地址做为回应。最后,本地域名服务器将含有http://zhihu.com的IP地址的响应报文发送给客户端主机。

这里的查询过程是包含递归查询和迭代查询的,客户端主机发送给本地服务器的查询是递归查询,然后面的三个查询是迭代查询算法

 

DNS有一点使人担心,这就是像数据库

wikipedia.org

或者windows

facebook.com

这样的整个域名看上去只是对应一个单独的IP地址,不过事实上后面可能对应着多个ip地址也是学习到了,一个ip地址能够对应多个域名据说一个IP能够绑定多个域名,那么…? - 互联网,一个域名也能够对应多个ip地址负载均衡实现,一个域名对应多个IP地址,cry!)还好,有几种方法能够消除这个瓶颈:浏览器

  • 循环 DNS 是DNS查找时返回多个IP时的解决方案。举例来讲,
    Facebook.com
    实际上就对应了四个IP地址。
  • 负载平衡器 是以一个特定IP地址进行侦听并将网络请求转发到集群服务器上的硬件设备。 一些大型的站点通常都会使用这种昂贵的高性能负载平衡器。
  • 地理 DNS 根据用户所处的地理位置,经过把域名映射到多个不一样的IP地址提升可扩展性。这样不一样的服务器不可以更新同步状态,但映射静态内容的话很是好。
  • Anycast是一个IP地址映射多个物理主机的路由技术。 美中不足,Anycast与TCP协议适应的不是很好,因此不多应用在那些方案中。

大多数DNS服务器使用Anycast来得到高效低延迟的DNS查找。缓存



关于DNS的获取流程,我想再补充些知识:
DNS是应用层协议,事实上他是为其余应用层协议工做的,包括不限于HTTP和SMTP以及FTP,用于将用户提供的主机名解析为ip地址。
具体过程以下:
①用户主机上运行着DNS的客户端,就是咱们的PC机或者手机客户端运行着DNS客户端了
②浏览器将接收到的url中抽取出域名字段,就是访问的主机名,好比

http://www.baidu.com/

, 并将这个主机名传送给DNS应用的客户端
③DNS客户机端向DNS服务器端发送一份查询报文,报文中包含着要访问的主机名字段(中间包括一些列缓存查询以及分布式DNS集群的工做)
④该DNS客户机最终会收到一份回答报文,其中包含有该主机名对应的IP地址
⑤一旦该浏览器收到来自DNS的IP地址,就能够向该IP地址定位的HTTP服务器发起TCP链接

DNS服务的体系架构是怎样的?

DNS domain name system 主要做用就是将主机域名转换为ip地址

假设运行在用户主机上的某些应用程序(如Webl浏览器或者邮件阅读器)须要将主机名转换为IP地址。这些应用程序将调用DNS的客户机端,并指明须要被转换的主机名。(在不少基于UNIX的机器上,应用程序为了执行这种转换须要调用函数gethostbyname())。用户主机的DNS客户端接收到后,向网络中发送一个DNS查询报文。全部DNS请求和回答报文使用的UDP数据报通过端口53发送(至于为何使用UDP,请参看为何域名根服务器只能有13台呢? - 郭无意的回答)通过若干ms到若干s的延时后,用户主机上的DNS客户端接收到一个提供所但愿映射的DNS回答报文。这个查询结果则被传递到调用DNS的应用程序。所以,从用户主机上调用应用程序的角度看,DNS是一个提供简单、直接的转换服务的黑盒子。但事实上,实现这个服务的黑盒子很是复杂,它由分布于全球的大量DNS服务器以及定义了DNS服务器与查询主机通讯方式的应用层协议组成。


关于DNS的进一步了解能够参看DNS解析的过程是什么,求详细的? - 郭无意的回答

3. 浏览器给web服务器发送一个HTTP请求

由于像Facebook主页这样的动态页面,打开后在浏览器缓存中很快甚至立刻就会过时,毫无疑问他们不能从中读取。

因此,浏览器将把一下请求发送到Facebook所在的服务器:

GET http://facebook.com/ HTTP/1.1
 Accept: application/x-ms-application, image/jpeg, application/xaml+xml, [...]
 User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; [...]
 Accept-Encoding: gzip, deflate
 Connection: Keep-Alive
 Host: facebook.com
 Cookie: datr=1265876274-[...]; locale=en_US; lsd=WW[...]; c_user=2101[...]

GET 这个请求定义了要读取的URL

“http://facebook.com/”

。 浏览器自身定义 (User-Agent 头), 和它但愿接受什么类型的相应 (Accept and Accept-Encoding 头). Connection头要求服务器为了后边的请求不要关闭TCP链接。

请求中也包含浏览器存储的该域名的cookies。可能你已经知道,在不一样页面请求当中,cookies是与跟踪一个网站状态相匹配的键值。这样cookies会存储登陆用户名,服务器分配的密码和一些用户设置等。Cookies会以文本文档形式存储在客户机里,每次请求时发送给服务器。

 

用来看原始HTTP请求及其相应的工具不少。做者比较喜欢使用fiddler,固然也有像FireBug这样其余的工具。这些软件在网站优化时会帮上很大忙。

 

除了获取请求,还有一种是发送请求,它常在提交表单用到。发送请求经过URL传递其参数

(e.g.: RoboZZle stats for puzzle 85)

。发送请求在请求正文头以后发送其参数。

“http://facebook.com/”

中的斜杠是相当重要的。这种状况下,浏览器能安全的添加斜杠。而像

“http: //example.com/folderOrFile”

这样的地址,由于浏览器不清楚folderOrFile究竟是文件夹仍是文件,因此不能自动添加 斜杠。这时,浏览器就不加斜杠直接访问地址,服务器会响应一个重定向,结果形成一次没必要要的握手。

4. facebook服务的永久重定向响应

图中所示为Facebook服务器发回给浏览器的响应:

HTTP/1.1 301 Moved Permanently
 Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0,
 pre-check=0
 Expires: Sat, 01 Jan 2000 00:00:00 GMT
 Location: http://www.facebook.com/
 P3P: CP="DSP LAW"
 Pragma: no-cache
 Set-Cookie: made_write_conn=deleted; expires=Thu, 12-Feb-2009 05:09:50 GMT;
 path=/; domain=.facebook.com; httponly
 Content-Type: text/html; charset=utf-8
 X-Cnection: close
 Date: Fri, 12 Feb 2010 05:09:51 GMT
 Content-Length: 0

服务器给浏览器响应一个301永久重定向响应,这样浏览器就会访问“

http://www.facebook.com/

” 而非

“http://facebook.com/”

 

为何服务器必定要重定向而不是直接发会用户想看的网页内容呢?这个问题有好多有意思的答案。

其中一个缘由跟搜索引擎排名有 关。你看,若是一个页面有两个地址,就像

http://www.igoro.com/ 和http://igoro.com/

,搜索引擎会认为它们是两个网站,结果形成每个的搜索连接都减小从而下降排名。而搜索引擎知道301永久重定向是 什么意思,这样就会把访问带www的和不带www的地址归到同一个网站排名下。

还有一个是用不一样的地址会形成缓存友好性变差。当一个页面有好几个名字时,它可能会在缓存里出现好几回。

 

5. 浏览器跟踪重定向地址

如今,浏览器知道了

“http://www.facebook.com/”

才是要访问的正确地址,因此它会发送另外一个获取请求:

GET http://www.facebook.com/ HTTP/1.1
 Accept: application/x-ms-application, image/jpeg, application/xaml+xml, [...]
 Accept-Language: en-US
 User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; [...]
 Accept-Encoding: gzip, deflate
 Connection: Keep-Alive
 Cookie: lsd=XW[...]; c_user=21[...]; x-referer=[...]
 Host: www.facebook.com

头信息以以前请求中的意义相同。

6. 服务器“处理”请求

服务器接收到获取请求,而后处理并返回一个响应。

这表面上看起来是一个顺向的任务,但其实这中间发生了不少有意思的东西- 就像做者博客这样简单的网站,况且像facebook那样访问量大的网站呢!

  • Web 服务器软件
    web服务器软件(像IIS和阿帕奇)接收到HTTP请求,而后肯定执行什么请求处理来处理它。请求处理就是一个可以读懂请求而且能生成HTML来进行响应的程序(像ASP.NET,PHP,RUBY…)。举 个最简单的例子,需求处理能够以映射网站地址结构的文件层次存储。像
    http://example.com/folder1/page1.aspx
    这个地 址会映射/httpdocs/folder1/page1.aspx这个文件。web服务器软件能够设置成为地址人工的对应请求处理,这样 page1.aspx的发布地址就能够是
    http://example.com/folder1/page1。
  • 请求处理
    请求处理阅读请求及它的参数和cookies。它会读取也可能更新一些数据,并讲数据存储在服务器上。而后,需求处理会生成一个HTML响应。

所 有动态网站都面临一个有意思的难点 -如何存储数据。小网站一半都会有一个SQL数据库来存储数据,存储大量数据和/或访问量大的网站不得不找一些办法把数据库分配到多台机器上。解决方案 有:sharding (基于主键值讲数据表分散到多个数据库中),复制,利用弱语义一致性的简化数据库。

 

委 托工做给批处理是一个廉价保持数据更新的技术。举例来说,Fackbook得及时更新新闻feed,但数据支持下的“你可能认识的人”功能只须要每晚更新 (做者猜想是这样的,改功能如何完善不得而知)。批处理做业更新会致使一些不过重要的数据陈旧,但能使数据更新耕做更快更简洁。

 

7. 服务器发回一个HTML响应

图中为服务器生成并返回的响应:

HTTP/1.1 200 OK
 Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0,
 pre-check=0
 Expires: Sat, 01 Jan 2000 00:00:00 GMT
 P3P: CP="DSP LAW"
 Pragma: no-cache
 Content-Encoding: gzip
 Content-Type: text/html; charset=utf-8
 X-Cnection: close
 Transfer-Encoding: chunked
 Date: Fri, 12 Feb 2010 09:05:55 GMT

 2b3Tn@[...]

整个响应大小为35kB,其中大部分在整理后以blob类型传输。

内容编码头告诉浏览器整个响应体用gzip算法进行压缩。解压blob块后,你能够看到以下指望的HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"    
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
 lang="en" id="facebook">
 <head>
 <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
 <meta http-equiv="Content-language" content="en" />
 ...

关于压缩,头信息说明了是否缓存这个页面,若是缓存的话如何去作,有什么cookies要去设置(前面这个响应里没有这点)和隐私信息等等。

 

请注意报头中把Content-type设置为“text/html”。报头让浏览器将该响应内容以HTML形式呈现,而不是以文件形式下载它。浏览器会根据报头信息决定如何解释该响应,不过同时也会考虑像URL扩展内容等其余因素。

 

8. 浏览器开始显示HTML

在浏览器没有完整接受所有HTML文档时,它就已经开始显示这个页面了:

9. 浏览器发送获取嵌入在HTML中的对象


在浏览器显示HTML时,它会注意到须要获取其余地址内容的标签。这时,浏览器会发送一个获取请求来从新得到这些文件。

下面是几个咱们访问http://facebook.com时须要重获取的几个URL:

  • 图片
    http://static.ak.fbcdn.net/rsrc.php/z12E0/hash/8q2anwu7.gif
    http://static.ak.fbcdn.net/rsrc.php/zBS5C/hash/7hwy7at6.gif

  • CSS 式样表
    http://static.ak.fbcdn.net/rsrc.php/z448Z/hash/2plh8s4n.css
    http://static.ak.fbcdn.net/rsrc.php/zANE1/hash/cvtutcee.css

  • JavaScript 文件
    http://static.ak.fbcdn.net/rsrc.php/zEMOA/hash/c8yzb6ub.js
    http://static.ak.fbcdn.net/rsrc.php/z6R9L/hash/cq2lgbs8.js

这些地址都要经历一个和HTML读取相似的过程。因此浏览器会在DNS中查找这些域名,发送请求,重定向等等…

但 不像动态页面那样,静态文件会容许浏览器对其进行缓存。有的文件可能会不须要与服务器通信,而从缓存中直接读取。服务器的响应中包含了静态文件保存的期限 信息,因此浏览器知道要把它们缓存多长时间。还有,每一个响应均可能包含像版本号同样工做的ETag头(被请求变量的实体值),若是浏览器观察到文件的版本 ETag信息已经存在,就立刻中止这个文件的传输。

 

试着猜猜看“http://fbcdn.net”在地址中表明什么?聪明的答案是”Facebook内容分发网络”。Facebook利用内容分发网络(CDN)分发像图片,CSS表和JavaScript文件这些静态文件。因此,这些文件会在全球不少CDN的数据中心中留下备份。

静态内容每每表明站点的带宽大小,也能经过CDN轻松的复制。一般网站会使用第三方的CDN。例如,Facebook的静态文件由最大的CDN提供商Akamai来托管。

举例来说,当你试着ping http://static.ak.fbcdn.net的时候,可能会从某个http://akamai.net服务器上得到响应。有意思的是,当你一样再ping一次的时候,响应的服务器可能就不同,这说明幕后的负载平衡开始起做用了。

 

10. 浏览器发送异步(AJAX)请求

在Web 2.0伟大精神的指引下,页面显示完成后客户端仍与服务器端保持着联系。

以 Facebook聊天功能为例,它会持续与服务器保持联系来及时更新你那些亮亮灰灰的好友状态。为了更新这些头像亮着的好友状态,在浏览器中执行的 JavaScript代码会给服务器发送异步请求。这个异步请求发送给特定的地址,它是一个按照程式构造的获取或发送请求。仍是在Facebook这个例 子中,客户端发送给

http://www.facebook.com/ajax/chat/buddy_list.php

一个发布请求来获取你好友里哪一个 在线的状态信息。

提起这个模式,就必需要讲讲”AJAX”– “异步JavaScript 和 XML”,虽然服务器为何用XML格式来进行响应也没有个一清二白的缘由。再举个例子吧,对于异步请求,Facebook会返回一些JavaScript的代码片断。

 

除了其余,fiddler这个工具可以让你看到浏览器发送的异步请求。事实上,你不只能够被动的作为这些请求的看客,还能主动出击修改和从新发送它们。AJAX请求这么容易被蒙,可着实让那些计分的在线游戏开发者们郁闷的了。(固然,可别那样骗人家~)

 

Facebook聊天功能提供了关于AJAX一个有意思的问题案例:把数据从服务器端推送到客户端。由于HTTP是一个请求-响应协议,因此聊天服务器不能把新消息发给客户。取而代之的是客户端不得不隔几秒就轮询下服务器端看本身有没有新消息。

这些状况发生时长轮询是个减轻服务器负载挺有趣的技术。若是当被轮询时服务器没有新消息,它就不理这个客户端。而当还没有超时的状况下收到了该客户的新消息,服务器就会找到未完成的请求,把新消息作为响应返回给客户端。

。。。。百度这个更变态:http://fex.baidu.com/blog/2014/05/what-happen/

相关文章
相关标签/搜索