从www.web.com输入到页面展现到底发生什么?
打开浏览器从输入网址www.web.com到网页呈现,到底经历怎么样的一个过程?
总结一下上图的过程就是:浏览器通过向 DNS 服务器发送域名,DNS 服务器查询到与域名相对应的 IP 地址,然后返回给浏览器,浏览器再将 IP 地址打在协议上,同时请求参数也会在协议搭载,然后一并发送给对应的服务器。接下来介绍向服务器发送 HTTP 请求阶段,HTTP 请求分为三个部分:TCP 三次握手、http 请求响应信息、关闭 TCP 连接。
- DNS 解析:将域名解析成 IP 地址
- TCP 连接:TCP 三次握手
- 发送 HTTP 请求
- 服务器处理请求并返回 HTTP 报文
- 浏览器解析渲染页面
- 断开连接:TCP 四次挥手
URL是什么?
URL(Uniform Resource Locator),统一资源定位符,用于定位互联网上资源,俗称网址。
比如 http://www.web.com.cn/main/index.html,遵守以下的语法规则:
scheme://host.domain:port/path/filename
分别解释就是:
scheme - 定义因特网服务的类型。常见的协议有 http、https、ftp、file,其中最常见的类型是 http,而 https 则是进行加密的网络传输。
host - 定义域主机(http 的默认主机是 www)。
domain - 定义因特网域名,比如 web.com。
port - 定义主机上的端口号(http 的默认端口号是 80)。
path - 定义服务器上的路径(如果省略,则文档必须位于网站的根目录中)。
filename - 定义文档/资源的名称。
域名解析(DNS)
在浏览器输入网址后,首先要经过域名解析,因为浏览器并不能直接通过域名找到对应的服务器,而是要通过 IP 地址。大家这里或许会有个疑问,为什么不一开始就赋予个 IP 地址?这样就可以省去解析麻烦。因为与 IP 地址的一组纯数字相比,用字母配合数字的表示形式来指定计算机名更符合人类的记忆习惯。但要让计算机去理解名称,相对而言就变得困难了。因为计算机更擅长处理一长串数字。为了解决上述的问题,DNS 服务应运而生。
1.IP 地址
IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写。IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。IP 地址是一个 32 位的二进制数,比如 127.0.0.1 为本机 IP,目前还有些ip代理软件,但大部分都收费。
2.什么是域名解析
域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。DNS 协议提供通过域名查找 IP 地址,或逆向从 IP 地址反查域名的服务。DNS 是一个网络服务器,我们的域名解析简单来说就是在 DNS 上记录一条信息记录(分布式数据库)。DNS最早于1983年由保罗·莫卡派乔斯(Paul Mockapetris)发明;原始的技术规范在882号因特网标准草案(RFC 882)中发布,1987年发布的第1034和1035号草案修正了DNS技术规范,早期的域名必须以英文句号“.”结尾,例如,当用户访问 www.web.com 的HTTP服务时必须在地址栏中输入:http://www.web.com.,这样DNS才能够进行域名解析。如今DNS服务器已经可以自动补上结尾的句号。
3. 浏览器如何通过域名去查询 URL 对应的 IP 呢
-
浏览器缓存:浏览器会按照一定的频率缓存 DNS 记录。
-
操作系统缓存:如果浏览器缓存中找不到需要的 DNS 记录,那就去操作系统中找。
-
路由缓存:路由器也有 DNS 缓存。
-
ISP (Internet Service Provider),互联网服务提供商,即向广大用户综合提供互联网接入业务、信息业务和增值业务的电信运营商的 DNS 服务器:ISP 有专门的 DNS 服务器应对 DNS 查询请求。
-
根服务器:ISP 的 DNS 服务器还找不到的话,它就会向根服务器发出请求,进行递归查询(DNS 服务器先问根域名服务器.com 域名服务器的 IP 地址,然后再问.baidu 域名服务器,依次类推)。
1.TCP 三次握手
“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。
三次握手(three times handshake;three-way handshake)所谓的“三次握手”即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。
第一次
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认(第一次握手,由浏览器发起,告诉服务器我要发送请求了);SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次
第二次握手:服务器收到syn包(第二次握手,由服务器发起,告诉浏览器我准备接受了,你赶紧发送吧),必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次
第三次握手:客户端收到服务器的SYN+ACK包(第三次握手,由浏览器发送,告诉服务器,我马上就发了,准备接受吧),向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:
2.发送 HTTP 请求
TCP 三次握手结束后,开始发送 HTTP 请求报文。
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,上图给出了请求报文的一般格式。
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。
① 请求行(request-line)
由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。
-
请求方法包含 8 种:GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
-
URL 即请求地址,由 <协议>://<主机>:<端口>/<路径>?<参数 组成
-
协议版本即 http 版本号
例如,GET /index.html HTTP/1.1。
以上代码中“GET”代表请求方法,“ /index.html ”表示 URL,“HTTP/1.1”代表协议和协议的版本。现在比较流行的是 Http1.1 版本
② 请求头部(headers)
由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,它包含许多有关的客户端环境和请求正文的有用信息。典型的请求头附加信息有:
User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
Accept:客户端可识别的内容类型列表(浏览器可接受的MIME类型)。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
Cookie:这是最重要的请求头信息之一。
Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。
③ 空行(blank line)
最后一个请求头之后是一个空行,发送回车符和换行符,它的作用是通过一个空行,告诉服务器请求头部到此为止,后面不再有请求头。
④ 请求体(request-body)
可以承载多个请求参数的数据,包含回车符、换行符和请求数据,并不是所有请求都具有请求数据。
name=tom&password=1234&realName=tomson
上面代码,承载着 name、password、realName 三个请求参数。
稍微完整的HTTP请求报文:
3.服务器处理请求并返回 HTTP 报文
① 服务器
服务器是网络环境中的高性能计算机(处理器、硬盘、内存、系统总线等,和通用的计算机架构类似),它侦听网络上的其他计算机(客户机)提交的服务请求,并提供相应的服务,比如网页服务、文件下载服务、邮件服务、视频服务。但是由于需要提供高可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高。
在网络环境下,根据服务器提供的服务类型不同,分为文件服务器、数据库服务器、应用程序服务器、WEB服务器等。
而客户端主要的功能是浏览网页、看视频、听音乐等等,两者截然不同。 每台服务器上都会安装处理请求的应用——web server。
常见的 web server 产品有 apache、nginx、IIS 或 Lighttpd 等。
web server 担任管控的角色,对于不同用户发送的请求,会结合配置文件,把不同请求委托给服务器上处理相应请求的程序进行处理(例如 CGI 脚本,JSP 脚本,servlets,ASP 脚本,服务器端 JavaScript,或者一些其它的服务器端技术等),然后返回后台程序处理产生的结果作为响应。
②MVC 过程
设计创建 Web 应用程序的模式,Web 应用开发现在有很多框架,但大部分都还是按照 MVC 设计模式进行搭建的。
MVC 是一个设计模式,将应用程序分成三个核心部件:模型(model)-- 视图(view)--控制器(controller),它们各自处理自己的任务,实现输入、处理和输出的分离。
1、视图(view)
是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。
2、模型(model)
是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。
3、控制器(controller)
它负责根据用户从"视图层"输入的指令,选取"模型层"中的数据,然后对其进行相应的操作,产生最终结果。控制器属于管理者角色,从视图接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示模型处理返回的数据。
这三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供接口(Interface),供上面一层调用。
至于这一阶段发生什么?简而言之,首先浏览器发送过来的请求先经过控制器,控制器进行逻辑处理和请求分发,接着会调用模型,这一阶段模型会获取 redis db 以及 MySQL 的数据,获取数据后将渲染好的页面,响应信息会以响应报文的形式返回给客户端,最后浏览器通过渲染引擎将网页呈现在用户面前。
③http 响应报文
响应报文由状态行、响应头部、数据主体(响应主体)三个部分组成。
(1) 响应行包含:协议版本,状态码,状态码描述。
- 1xx:指示信息--表示请求已接收,继续处理。
- 2xx:成功--表示请求已被成功接收、理解、接受。
- 3xx:重定向--要完成请求必须进行更进一步的操作。
- 4xx:客户端错误--请求有语法错误或请求无法实现。
- 5xx:服务器端错误--服务器未能实现合法的请求。
常见状态代码、状态描述的说明如下。
- 200 OK:客户端请求成功。
- 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
- 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
- 403 Forbidden:服务器收到请求,但是拒绝提供服务。
- 404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
- 500 Internal Server Error:服务器发生不可预期的错误。
- 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。
(2) 响应头部包含响应报文的附加信息,由 名/值 对组成。
(3) 响应主体包含回车符、换行符和响应返回数据,并不是所有响应报文都有响应数据。
这是一个实际的HTTP响应报文:
4.浏览器解析传回的数据渲染页面
浏览器解析渲染页面分为一下五个步骤:
根据 HTML 解析 DOM 树
-
根据 HTML 的内容,将标签按照结构解析成为 DOM 树,DOM 树解析的过程是一个深度优先遍历。即先构建当前节点的所有子节点,再构建下一个兄弟节点。
-
在读取 HTML 文档,构建 DOM 树的过程中,若遇到 script 标签,则 DOM 树的构建会暂停,直至脚本执行完毕。
根据 CSS 解析生成 CSS 规则树
-
解析 CSS 规则树时 js 执行将暂停,直至 CSS 规则树就绪。
-
浏览器在 CSS 规则树生成之前不会进行渲染。
结合 DOM 树和 CSS 规则树,生成渲染树
-
DOM 树和 CSS 规则树全部准备好了以后,浏览器才会开始构建渲染树。
-
精简 CSS 并可以加快 CSS 规则树的构建,从而加快页面相应速度。
根据渲染树计算每一个节点的信息(布局)
-
布局:通过渲染树中渲染对象的信息,计算出每一个渲染对象的位置和尺寸
-
回流:在布局完成后,发现了某个部分发生了变化影响了布局,那就需要倒回去重新渲染。
根据计算好的信息绘制页面
-
绘制阶段,系统会遍历呈现树,并调用呈现器的“paint”方法,将呈现器的内容显示在屏幕上。
-
重绘:某个元素的背景颜色,文字颜色等,不影响元素周围或内部布局的属性,将只会引起浏览器的重绘。
-
回流:某个元素的尺寸发生了变化,则需重新计算渲染树,重新渲染。
5.断开tcp 连接
当数据传送完毕,需要断开 tcp 连接,此时发起 tcp 四次挥手。
-
发起方向被动方发送报文,Fin、Ack、Seq,表示已经没有数据传输了。并进入 FIN_WAIT_1 状态。(第一次挥手:由浏览器发起的,发送给服务器,我请求报文发送完了,你准备关闭吧)。
-
被动方发送报文,Ack、Seq,表示同意关闭请求。此时主机发起方进入 FIN_WAIT_2 状态。(第二次挥手:由服务器发起的,告诉浏览器,我请求报文接受完了,我准备关闭了,你也准备吧)。
-
被动方向发起方发送报文段,Fin、Ack、Seq,请求关闭连接。并进入 LAST_ACK 状态。(第三次挥手:由服务器发起,告诉浏览器,我响应报文发送完了,你准备关闭吧)。
-
发起方向被动方发送报文段,Ack、Seq。然后进入等待 TIME_WAIT 状态。被动方收到发起方的报文段以后关闭连接。发起方等待一定时间未收到回复,则正常关闭。(第四次挥手:由浏览器发起,告诉服务器,我响应报文接受完了,我准备关闭了,你也准备吧)。
tcp四次挥手,由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。
服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
tcp 四次挥手后,至此从URL输入到页面展现整个过程执行完毕。