URL2—网络篇
一、查找强缓存
先检查强缓存,如果命中直接使用,否则进入下一步。
二、DNS 解析
基本步骤
解析过程
- 浏览器搜索自己的 DNS 缓存。
- 在浏览器缓存中没找到,就在操作系统缓存中查找,这一步中也会查找本机的 hosts 看看有没有对应的域名映射。
- 在系统中也没有的话,就到你的路由器来查找,因为路由器一般也会有自己的 DNS 缓存。
- 若没有,则操作系统将域名发送至 本地域名服务器——递归查询方式,本地域名服务器 查询自己的 DNS 缓存,查找成功则返回结果,否则,采用迭代查询方式。本地域名服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。
- 本地域名服务器 将得到的 IP 地址返回给操作系统,同时自己也将 IP 地址缓存起来。
- 操作系统将 IP 地址返回给浏览器,同时自己也将 IP 地址缓存起来,以备下次别的用户查询时,可以直接返回结果,加快网络访问。
- 至此,浏览器已经得到了域名对应的 IP 地址。
关于 DNS 还有两个细节:
DNS
解析也是需要时间的,可以通过预解析的方式来预先获得域名所对应的IP
。<link rel="dns-prefetch" href="//blog.poetries.top" />
- 对于静态资源,DNS 还可以和 CDN 相结合,让用户访问延迟最小的节点。
三、建立 TCP 连接
TCP 是一种面向有连接的传输层协议。 > 它可以保证两端(发送端和接收端)通信主机之间的通信可达。 > 它能够处理在传输过程中丢包、传输顺序乱掉等异常情况;此外它还能有效利用宽带,缓解网络拥堵。
这里要提醒一点,Chrome 在同一个域名下要求同时最多只能有 6 个 TCP 连接,超过 6 个的话剩下的请求就得等待。
建立 TCP 连接经历了下面三个阶段:
- 通过三次握手(即总共发送 3 个数据包确认已经建立连接)建立客户端和服务器之间的连接。
- 进行数据传输。这里有一个重要的机制,就是接收方接收到数据包后必须要向发送方
确认
, 如果发送方没有接到这个确认
的消息,就判定为数据包丢失,并重新发送该数据包。当然,发送的过程中还有一个优化策略,就是把大的数据包拆成一个个小包
,依次传输到接收方,接收方按照这个小包的顺序把它们组装
成完整数据包。 - 断开连接的阶段。数据传输完成,现在要断开连接了,通过四次挥手来断开连接。
读到这里,你应该明白 TCP 连接通过什么手段来保证数据传输的可靠性,一是三次握手
确认连接,二是数据包校验
保证数据到达接收方,三是通过四次挥手
断开连接。
四、发送 HTTP 请求
现在TCP连接
建立完毕,浏览器可以和服务器开始通信,即开始发送 HTTP 请求。浏览器发 HTTP 请求要携带三样东西:请求行、请求头和请求体。
首先,浏览器会向服务器发送请求行,关于请求行, 我们在这一部分的第一步就构建完了,贴一下内容:
// 请求方法是GET,路径为根路径,HTTP协议版本为1.1
GET / HTTP / 1.1
结构很简单,由请求方法、请求 URI和HTTP 版本协议组成。
同时也要带上请求头,比如我们之前说的Cache-Control、If-Modified-Since、If-None-Match都由可能被放入请求头中作为缓存的标识信息。当然了还有一些其他的属性,列举如下:
Date: Sat, 21 Mar 2020 04:35:58 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Sun, 22 Mar 2020 04:35:58 GMT
Connection: Keep-Alive
Content-Type: text/html
最后是请求体,请求体只有在POST
方法下存在,常见的场景是表单提交。
HTTP 协议是基于 TCP 协议的,所以它使用面向连接的方式发送请求,通过 stream 二进制流的方式传 给对方。当然,到了 TCP 层,它会把二进制流变成一个的报文段发送给服务器。