从输入网址到网页显示期间发生了什么?
1. 浏览器解析 url
当你在浏览器的导航栏输入网址后,浏览器会对输入的 url 进行解析,从而发送给 web 服务器的请求信息。
2. 生成对应的 http 请求后,浏览器就会通过 DNS 去查询 web 服务器的真实 IP 地址
DNS 解析流程:(以www.baidu.com为例)
- 首先客户端 (浏览器) 会向本地 DNS 发送一条消息询问 web 服务器的地址,如果本地缓存表中有则直接返回
- 如果本地没有,本地 DNS 则会请求顶级 DNS(只指路不带路) ,询问是否有该域名信息
- 根 DNS 接受来自本地的请求后,根据对应的后缀(.com)将请求转发送给对应的顶级域名服务器
- 本地域名服务器收然后就会顺着根 DNS 给指明的道路来到顶级 DNS
- 顶级域名服务器又根据后缀(baidu.com)将请求转发给权威 DNS
- 本地 DNS 这是就会来到权威 DNS 询问该域名对应的 IP 地址
- 权威 DNS 查询后将查询结果告知本地 DNS
- 本地 DNS 再将 IP 地址返回客户端,客户端和目标建立连接
3. 浏览器通过本地 DNS 的一系列请求后拿到具体的 IP 地址,然后就会进行远程定位,通过 TCP 协议和远程服务器进行连接
TCP 建立连接的过程:(三次握手)
- 刚开始客户端和服务器端都是 closed 状态
- 服务器端主动监听某一端口处于 listening 状态。
- 客户端主动发起连接 SYN,之后处于 syn-sent 状态。
- 服务器端接收到发起的连接请求,返回 SYN ,并且返回客户端 SYN 的 ACK,然后处于 SYV-RCVD 状态
- 客户端收到服务器端的 SYN 和 ACK 之后,就会发送对服务器端 SYN 的 ACK,之后处于 ESTABLISHED 状态
- 服务器端收到自身 ACK 的 ACK 之后,处于ESTABLISHED 状态,至此,三次握手完成。
4. 进行 url 解析之后,浏览器就确定了具体的服务器地址和文件名,接下来就是根据这些信息来生成对应的 http 请求
5. 服务器接受到 http 请求后会解析这个请求,然后生成一个具体的响应头和响应内容。响应头就是服务器告诉浏览器的一些必要信息,响应内容就是请求对应的具体内容
6. 浏览器根据响应内容进行 HTML 的渲染,一部分一部分的显示,知道完全解析完毕
7. 当浏览器解析完服务器传来的全部内容后就会进行 TCP 四次挥手和服务器断开连接
四次挥手:
- 客户端打算关闭连接,此时会发送一个 TCP 首部
FIN
标志位被置为1
的报文,也即FIN
报文,之后客户端进入FIN_WAIT_1
状态。 - 服务端收到该报文后,就向客户端发送
ACK
应答报文,接着服务端进入CLOSE_WAIT
状态。 - 客户端收到服务端的
ACK
应答报文后,之后进入FIN_WAIT_2
状态。 - 等待服务端处理完数据后,也向客户端发送
FIN
报文,之后服务端进入LAST_ACK
状态。 - 客户端收到服务端的
FIN
报文后,回一个ACK
应答报文,之后进入TIME_WAIT
状态 - 服务端收到了
ACK
应答报文后,就进入了CLOSE
状态,至此服务端已经完成连接的关闭。 - 客户端在经过
2MSL
一段时间后,自动进入CLOSE
状态,至此客户端也完成连接的关闭。