深入浅出HTTP(1)

80 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情

首先由一个面试常问问题:"当从输入url到页面加载完成发生了什么?"来进入本文。

输入网址按下回车后,发生了什么?

这个问题仔细研究起来可以回答很多,这里简单总结一下:

1.首先浏览器会对从地址栏的输入的url进行DNS域名解析,获得服务器的 IP 地址和端口号

DNS域名解析有两种方法,迭代查询和递归查询

首先浏览器会先检查本地hosts文件是否有这个url的映射关系,有则直接调用。

如果没有找到则会查找本地DNS解析器缓存,有则返回。

如果没有找到则会查找本地DNS服务器,有则返回。

最后迭代查询,按照根域服务器->顶级域服务器,然后根据顶级域->第二层域子域,最后根据域名找到相应的IP。

2.浏览器用 TCP 的三次握手与服务器建立连接

image.png

3.浏览器发起HTTP请求发送拼好的报文

4.服务器收到报文后处理请求,再将同样拼好的报文发给浏览器,浏览器接受HTTP响应

5.浏览器解析报文,渲染输出页面

该解析过程主要为:html 的词法分析,-->解析成 DOM 树->解析 css 生成 css 规则树->合并生成render 树-> layout 布局、painting 渲染、复合图层的合成、GPU绘制、外链接处理、loaded 和 documentloaded

6.关闭TCP链接(四次挥手) image.png

接着我们就来深入了解一下这其中的HTTP请求。我们首先详细了解一下HTTP报文是什么样的。

HTTP报文

HTTP 协议的请求报文和响应报文的结构基本相同,主要由以下三大部分组成:

  1. 起始行:描述请求或响应的基本信息;
  2. 头部字段集合:使用 key-value 形式更详细地说明报文;
  3. 消息正文:实际传输的数据,它不一定是纯文本,可以是图片、视频等二进制数据。

通常,我们把起始行和头部字段称为请求头或响应头,消息正文又称为实体。 HTTP 协议规定报文必须有 header,但可以没有 body,而且在 header 之后必须要有一个空行。大致如下:

image.png

接着,我们分别来看看HTTP请求报文和响应报文:

HTTP请求报文

抓包可以看到一个真实的HTTP请求报文长这样:

image.png

可以看到,一个HTTP请求报文由请求行,请求头部,空行和请求数据四个部分组成。

image.png

请求行由三部分构成:

  1. 请求方法:是一个动词,如 GET/POST,表示对资源的操作;
  2. 请求目标:通常是一个 URI,标记了请求方法要操作的资源;
  3. 版本号:表示报文使用的 HTTP 协议版本。

HTTP响应报文

抓包可以看到一个真实的HTTP响应报文长这样:

image.png

可以看到,一个HTTP请求报文由状态行、响应头、空行、响应体(数据)四个部分组成。

image.png

状态行也是由三部分构成:

  1. 版本号:表示报文使用的 HTTP 协议版本;
  2. 状态码:一个三位数,用代码的形式表示处理的结果,比如 200 是成功,500 是服务器错误;
  3. 状态值:作为数字状态码补充,是更详细的解释文字,帮助人理解原因。