若是你从事WEB开发相关的职业, 我能够很肯定的说,有人会问你这个问题 :“在浏览器导航栏输入URL并按下回车,到底发生了什么?”。 对于浏览器背后发生的事情以及信息是如何经过互联网传输到计算机, 有一个基本的了解老是好的。html
==让咱们想象下这样一个情景,你想访问google地图的网页,maps.google.com,查看你从公司到心仪的晚餐饭馆预估的路程时间。==web
==Tips: 学习经验,你能够代入这个场景多想象和回忆几回,这样你就不用死记硬背了。==windows
当咱们身处这个应用场景,整个过程发生了什么呢?浏览器
与URI(统一资源标识符)相比, 咱们更熟悉URL( Uniform Resourse Locator), 统一资源定位符。缓存
URL表示资源的地点(互联网上所处的位置)服务器
URL也正是使用Web浏览器等访问Web页面时须要输入的网页地址, maps.google.com。cookie
关于URI,作个简单的了解。网络
==URI, Uniform Resourse Identifier的缩写。==架构
URI就是就是由某个协议方案表示的资源的定位标识符。 协议方案是指访问资源所使用的协议类型名称。app
采用HTTP协议时,协议方案就是http。除此以外,还有ftp、mailto、telnet、file协议等。
==URI与URL的区别==
URI用字符窜标识某一互联网资源的全部信息,而URL表示资源的地点(互联网上所处的位置)。可见URL是URI的子集。
DNS(Domain Name System)协议是和HTTP协议同样位于应用层的协议。它提供域名到IP地址之间的解析服务。
就像现实生活中的电话簿, URL和IP地址的映射关系,就像联系人和电话号码。
计算机既能够被赋予IP地址,也能够被赋予主机名和域名。 好比, www.baidu.com
用户一般使用主机名或域名来访问对象的计算机,而不是直接经过IP地址访问。 与IP地址的一组纯数字相比,用字母配合数字的表示方法来制定计算机名更符合人类的记忆习惯。
计算机去理解字符窜,显然是很困难的,它更擅长跟数字打交道。
DNS协议提供经过域名查找IP地址,或逆向从IP地址反查域名的服务。
举个例子, www.google.com的IP地址为: http://209.85.227.104 。
你也能够在浏览器地址栏输入 http://209.85.227.104, 来访问www.google.com。 可是很难记住,不是吗?咱们更愿意记住www.google.com这个域名。
==浏览器的DNS解析机制的过程是怎么样呢?==
你也许会问为何会在这么多层级保存着DNS记录缓存?
信息缓存了那么屡次,感受隐私被侵犯了。
可是缓存对于节约网络流量,提升数据传输效率是很是重要的。
ISP(Internet Service Provider, 网络服务提供者)的DNS服务器将发起DNS查询, 以查找maps.google.com对应服务器的IP地址。
前面提到过,为了让个人电脑链接到maps.google.com这个主机域名的服务器,我须要它对应的IP地址。
DNS查询的目的就是在互联网上搜索多个DNS服务器,直到在某个DNS服务器上找到网站正确的IP地址。
这种类型的搜索,成为递归搜索。 由于搜索是持续重复从一个DNS服务器到另一个DNS服务器,直到找到咱们须要的IP地址,或返回一个错误响应:没法找到对应的IP地址。
在这歌情景下,咱们更愿意将ISP的DNS服务器解析称为DNS递归查询,它的主要职责是经过在互联网上询问其余DNS服务器以找到目标域名所对应的正确的IP地址。
其余的DNS服务器,在此情景下,被称为域服务器,由于他们基于域的架构执行DNS搜索。
若是上述内容没有绕晕你的话,下面我将解释下什么是“域架构”?
通常而言,网站的URL们通常包含着: 一个三级域(a third-level domain), 一个二级域(a second-level domain),一个顶级域(a top-level domain)和 一个根域(root domain)。在DNS查询过程当中, 每一个域级别都有专属于本身的域服务器。
对于maps.google.com而言。
ISP的DNS递归查询,从根域服务器开始。 maps.google.com. ,主要后面带了“.", 表示根域服务器。
根域名服务器定向到.com域服务器。
.com域服务器定向到google.com域服务器。
google.com域服务器将在它的DNS记录中找到maps.google.com的匹配的IP地址,并将IP地址返回给ISP的DNS服务器,最后发送给你的浏览器。
ISP的DNS递归查询过程 maps.google.com. => Root Domain "." => Top-Level Domain ".com" => Second-Level Domain "google.com" => Third-Level Domain "maps.google.com => Ip: 212.23.42.42 => Return IP to ISP DNS Server => Your web Broswer get the IP address from ISP DNS Server
上述的DNS查询请求时使用小数据包发送的。这些数据包包含着,诸如请求内容和如若查找到IP地址,查询结果返回对象。
这些数据包在到达正确的DNS服务器以前,在客户端和服务器之间的多个网络设备进行传输。
网络设备经过“路由表” (Router Table)来肯定数据包到达“目标DNS服务器”的最快方式。若是这些数据包丢失,会获得一个请求失败。 不然,它们将到达正确的DNS服务器, 获取正确的IP地址,IP地址返回给ISP的DNS服务器,最后返回给您的浏览器。
一旦, 浏览器从ISP的DNS服务器那里接收到正确的IP地址,它就会与匹配IP地址的服务器创建链接,从而能够传输信息。
那么客户端(你的电脑)如何和服务器创建链接呢?
客户端使用互联网协议创建这样的链接, 有许多不一样的协议可使用, TCP是用于处理HTTP请求,最多见的传输协议。
创建TCP链接的做用就是为了在客户端(你的电脑)和服务器之间传送数据包。
整个TCP创建链接过程当中,TCP/IP三次握手。
客户端和服务器,交换SYN(synchronize 同步)数据包和 ACK(acknowledge 确认)数据包,创建TCP链接。
TCP/IP 三次握手的过程:
而后TCP链接就创建了。
// TCP/IP 握手过程 1. Client.send(SYN packet) => Asking Server? open for new connection 2. get SYN from Client Server (ports) &&( accept new connection), response(SYN/ACK packet) => Client 3. Client received response SYN/ACK packet from Server and confirm it by sending ACK packet to Server TCP connection established
一旦,创建了TCP链接,能够开始传送数据了。
浏览器会发送一个GET请求,请求maps.google.com网页。若是你提交的是验证信息或表单信息,这多是一个POST请求。
这个请求还将包含额外的信息,例如: 浏览器类型(用户代理),接受的数据类型,链接类型,域名,cookie信息等等。
// GET 请求样本 GET http://facebook.com/ HTTP/1.1 Accept: application/x-ms-application, image/jpeg, application/xaml+xml,[...] User-Agent: Mozilla/4.0 (compatible); MSIE8.0; Windows NT 6.1; WOW64;[...] Accept-Encoding: gzip, deflate Connection: Keep-Alive Host: facebook.com Cookie: datr=12323232-[....]; locale=en us; ls=WW[...]
若是你对幕后发生的事情感到好奇,可使用Chrome浏览器的控制台,按F12键(在windows系统可使用快捷键 Ctrl + Shift + J), 在控制台的区域有个Network,那里你能到这些幕后发生的事情。
服务器收到浏览器请求,而后交给专门处理浏览器请求的应用程序。
处理浏览器请求的应用程序(用ASP.NET,PHP, Ruby等语言编写)读取并检查请求的信息(请求头、cookie),必要时更新服务器上的信息。最后,它以特定的数据格式(JSON, XML, HTML) 组装响应。
服务器返回HTTP响应给浏览器,响应中包含你所请求的网页内容,以及协议版本、响应状态码、状态码缘由语句、编码方式、缓存类型、cookie设置、隐私信息、响应报文(服务器返回给浏览器的文本信息,一般HTML, CSS, JS, 图片等文件就放在这一部分)等等。
//服务器HTTP响应 范例 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-Connection: close Transfer-Encoding: chunked Date: Fri, 12 Feb 2010 09:05:55 GMT
第一行显示了状态码,很是重要,由于它告诉咱们响应的状态。
响应状态码描述了五种状态:
所以,若是你遇到了一个错误,能够查看一下HTTP响应,以检查您收到的状态代码类型,从而对错误的缘由有个基本的判断。
浏览器对内容的解析渲染, 这一部分(渲染树构建、布局及绘制),又能够分为下面五个部分。
尽管这彷佛是一个很是冗长乏味的过程,但咱们知道,在按下键盘上的回车键以后,页面呈现的时间不到几秒钟。全部这些步骤都在几毫秒内发生,咱们甚至都没有注意到。
我真诚地但愿本文可以对您有了解“输入URL到页面呈现” 有一个大概的了解!