浏览器从输入网址到页面展示的过程
浏览器从输入网址到页面渲染分以下几个过程:
- URL输入
- DNS解析
- 建立TCP连接
- 发送HTTP/HTTPS请求
- 服务器响应请求
- 浏览器解析渲染页面
- HTTP 请求结束,断开 TCP 连接
DNS解析
因为浏览器不能直接通过域名找到对应的服务器 IP 地址,所以需要进行 DNS 解析,查找到对应的 IP 地址进行访问。
- 在浏览器中输入 hzfe.org 域名,操作系统检查浏览器缓存和本地的 hosts 文件中,是否有这个网址记录,有则从记录里面找到对应的 IP 地址,完成域名解析。
- 查找本地 DNS 解析器缓存中,是否有这个网址记录,有则从记录里面找到对应的 IP 地址,完成域名解析。
- 使用 TCP/IP 参数中设置的 DNS 服务器进行查询。如果要查询的域名包含在本地配置区域资源中,则返回解析结果,完成域名解析。
- 检查本地 DNS 服务器是否缓存该网址记录,有则返回解析结果,完成域名解析。
- 本地 DNS 服务器发送查询报文至根 DNS 服务器,根 DNS 服务器收到请求后,用顶级域 DNS 服务器地址进行响应。
- 本地 DNS 服务器发送查询报文至顶级域 DNS 服务器。顶级域 DNS 服务器收到请求后,用权威 DNS 服务器地址进行响应。
- 本地 DNS 服务器发送查询报文至权威 DNS 服务器,权威 DNS 服务器收到请求后,用 hzfe.org 的 IP 地址进行响应,完成域名解析。
查询通常遵循以上流程,从请求主机到本地 DNS 服务器的查询是递归查询,DNS 服务器获取到所需映射的查询过程是迭代查询。
TCP 三次握手和四次挥手
建立 TCP 连接时 server 与 client 会经历三次握手
-
浏览器向服务器发送 TCP 数据:SYN(seq=x)
-
服务器向浏览器发送 TCP 数据:ACK(seq=x+1) SYN(y)
-
浏览器向服务器发送 TCP 数据:ACK(seq=y+1)
关闭 TCP 连接时 server 与 client 会经历四次挥手
-
浏览器向服务器发送 TCP 数据:FIN(seq=x)
-
服务器向浏览器发送 TCP 数据:ACK(seq=x+1)
-
服务器向浏览器发送 TCP 数据:FIN(seq=y)
-
浏览器向服务器发送 TCP 数据:ACK(seq=y+1)
为什么 2、3 步骤不合并起来呢?看起来是脱裤子放屁。
答:2、3 中间服务器很可能还有数据要发送,不能提前发送 FIN。