一、前言
我们在浏览器的地址栏中输入 url 地址到页面呈现,实际上是客户端向服务器端发送请求,服务器端处理请求并返回请求结果,最终呈现页面的过程。那么究竟这期间发生了什么奇妙的事情呢?
二、过程分析
假设我们在浏览器中输入http://baidu.com:80/index.html,且假设它的 ip 地址为112.34.112.40。
1. 域名解析
浏览器解析出域名为 www.baidu.com。
2. 查询 ip 地址
如果浏览器曾经访问过该地址,那么该域名的 ip 地址(112.34.112.40)就会形成映射关系保存在 dns 服务器中,同时还缓存在浏览器和 hosts 文件里。
当域名解析时,浏览器会先去本地缓存中找 ip 地址,如果没有就去 hosts 文件中找,找到就键入ip地址。如果还是没有,那么就会向本地 dns 服务器的缓存中查找,如果仍然没有,最后就去顶级域 dns 进行查询并逐级返回了。
3. 获取端口号
浏览器获取 80 端口。如果是 https 协议,端口号为 443。
4. 建立连接(三次握手)
通过 TCP/IP 协议进行通讯并建立连接。
(1) 请求连接。浏览器向服务器发送 SYN 数据包和 seq 序列号,告诉服务器我能发送请求。
(2) 确认信息。服务器向浏览器发送 ACK、SYN数据包和 seq 序列号,告诉浏览器我能接收请求。
(3) 握手结束。浏览器向服务器发送 ACK、SYN数据包和 seq 序列号,告诉服务器我知道你能接收请求了。
5. 发送请求
成功建立连接后,浏览器向服务器发送请求。
6. 处理请求
服务器接收到请求并分析处理请求。
7. 返回结果
服务器将请求的数据结果返回给浏览器。
8. 断开连接(四次挥手)
通过 TCP/IP 协议断开连接。
(1) 请求断开。服务器向浏览器发送 FIN 数据包,告诉浏览器,我数据发送完毕可以断开连接了。
(2) 已接收断开请求。浏览器向服务器发送 ACK 数据包,告诉服务器,我知道你数据发送完毕了,但是我还在继续接收数据中。
(3) 同意断开。浏览器向服务器发送 FIN 数据包,告诉服务器,数据我接收完毕了我同意断开连接了。
(4) 已接收同意请求。服务器接收到同意断开的信息,正式断开连接。
9. 页面呈现
接收完数据的浏览器开始解析 DOM 结构,渲染页面。至此完成整个过程。