持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情
首先由一个面试常问问题:"当从输入url到页面加载完成发生了什么?"来进入本文。
输入网址按下回车后,发生了什么?
这个问题仔细研究起来可以回答很多,这里简单总结一下:
1.首先浏览器会对从地址栏的输入的url进行DNS域名解析,获得服务器的 IP 地址和端口号
DNS域名解析有两种方法,迭代查询和递归查询
首先浏览器会先检查本地hosts文件是否有这个url的映射关系,有则直接调用。
如果没有找到则会查找本地DNS解析器缓存,有则返回。
如果没有找到则会查找本地DNS服务器,有则返回。
最后迭代查询,按照根域服务器->顶级域服务器,然后根据顶级域->第二层域子域,最后根据域名找到相应的IP。
2.浏览器用 TCP 的三次握手与服务器建立连接
3.浏览器发起HTTP请求发送拼好的报文
4.服务器收到报文后处理请求,再将同样拼好的报文发给浏览器,浏览器接受HTTP响应
5.浏览器解析报文,渲染输出页面
该解析过程主要为:html 的词法分析,-->解析成 DOM 树->解析 css 生成 css 规则树->合并生成render 树-> layout 布局、painting 渲染、复合图层的合成、GPU绘制、外链接处理、loaded 和 documentloaded
6.关闭TCP链接(四次挥手)
接着我们就来深入了解一下这其中的HTTP请求。我们首先详细了解一下HTTP报文是什么样的。
HTTP报文
HTTP 协议的请求报文和响应报文的结构基本相同,主要由以下三大部分组成:
- 起始行:描述请求或响应的基本信息;
- 头部字段集合:使用 key-value 形式更详细地说明报文;
- 消息正文:实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。
通常,我们把起始行和头部字段称为请求头或响应头,消息正文又称为实体。 HTTP 协议规定报文必须有 header,但可以没有 body,而且在 header 之后必须要有一个空行。大致如下:
接着,我们分别来看看HTTP请求报文和响应报文:
HTTP请求报文
抓包可以看到一个真实的HTTP请求报文长这样:
可以看到,一个HTTP请求报文由请求行,请求头部,空行和请求数据四个部分组成。
请求行由三部分构成:
- 请求方法:是一个动词,如 GET/POST,表示对资源的操作;
- 请求目标:通常是一个 URI,标记了请求方法要操作的资源;
- 版本号:表示报文使用的 HTTP 协议版本。
HTTP响应报文
抓包可以看到一个真实的HTTP响应报文长这样:
可以看到,一个HTTP请求报文由状态行、响应头、空行、响应体(数据)四个部分组成。
状态行也是由三部分构成:
- 版本号:表示报文使用的 HTTP 协议版本;
- 状态码:一个三位数,用代码的形式表示处理的结果,比如 200 是成功,500 是服务器错误;
- 状态值:作为数字状态码补充,是更详细的解释文字,帮助人理解原因。