网站访问速度优化
本文最后更新于:2023年8月21日 中午
域名
为了更好地理解域名、DNS 等内容首先抛出一个技术向的问题(当然可以跳过不看),这个问题也经常是面试问题:当你在浏览器中输入 URL(Uniform Resource Locator)回车之后发生了什么?比如我在浏览器中输入了 https://xyzlab.ai/index.html,根据 URI 标准,它由以下几个部分组成:
- 传输协议(https)
- 域名(xyzlab.ai)
- 路径(/index.html)
根据域名获取服务器的 IP 地址,也称 DNS 解析
DNS 就像一本很大的表格,记录了域名所对应的 IP 地址,首先浏览器中会有一个 DNS 缓存器,会记录我们之前一段时间访问记录中域名指向的 IP 地址,浏览器会现在自己的 DNS 缓存中查找这个域名,如果浏览器缓存中不存在,则会去系统缓存中查找,如果没有会去到路由器 DNS 缓存中查找目标域名与 IP 的映射,如果没有才会去 ISP (Internet Service Provider)的 DNS 查找。浏览器向服务器的 IP 端口号发起 TCP 三次握手建立连接
- 先从客户端,这里指浏览器向服务端发送连接请求报文并进入 SYN_SENT 状态,让服务器知道我要发起连接,等待服务器确认
- 等到服务器收到 SYN 包接受连接后回复一个 SYN + ACK 包并为这次连接分配资源,表示服务器知道你要发送数据,并且准备好接收数据,此时服务器进入 SYN_RECV 状态;
- 客户端接收到 SYN + ACK 包后也向服务端发送确认包 ACK 并分配资源,当 ACK 包发送完毕之后,客户端与服务端进入 ESTABLISHED 状态,完成三次握手,这样 TCP 连接就建立了。
浏览器向服务器发送 HTTP 请求报文
服务器根据 HTTP 请求报文的参数找到请求的资源
服务器给浏览器发送 HTTP 响应报文,把资源返回给客户端
常用的状态码:
200:OK 成功
302:Found 临时重定向
400:Bad Request 请求报文中存在语法错误
403:Forbidden 访问被拒绝
404:Not Found 没找到
500:Internal Server Error 服务器内部错误
503:Service Unavailable 服务器超负载或在维护浏览器渲染页面
通过四次挥手释放 TCP 连接
- 客户端发送中断连接请求,也就是发送 FIN 结束报文。这个时候客户端就进入了 FIN_WAIT 状态,等待服务端的 FIN 报文。
- 服务端发送 ACK 报文,服务端进入关闭状态,此时服务端会向上层应用发送通知,表明客户端数据已经发送完毕,是否需要发送数据给客户端了。
- 当服务端确定数据发送完毕之后,就可以向客户端发送 FIN 报文了。
- 客户端接收到 FIN 报文之后,知道服务端要准备断开连接了,客户端给服务端发送 ACK 报文之后进入 TIME_WAIT 状态,告诉服务端可以断开连接了,如果服务端没有收到 ACK 报文就重传,当服务端收到 ACK 报文之后就可以断开连接了。当客户端一段时间没收到回复,就知道服务端已经关闭,所以自己也可以关闭连接了。