结合具体问题:在浏览器输入一个网址并访问,具体发生了什么?
1. 对这个网址进行DNS域名解析,得到对应的IP地址
DNS怎么找到域名的?
DNS域名解析采用的是递归查询的方式,过程是,先去找DNS缓存->缓存找不到就去找根域名服务器->根域名又会去找下一级,这样递归查找后,找到了,返回给我们的浏览器
2. 根据这个IP,找到对应的服务器,发起TCP的三次握手,即建立连接
TCP连接的建立(三次握手)?
1、客户端采用TCP协议将带有SYN标志的数据包发送给服务器,等待服务器的确认。(客户端:一个SYN)
2、服务器端在收到SYN的数据包后,必须确认SYN,即向客户端发送一个ACK标志,同时,也发送一个SYN标志。(服务端:一个ACK+一个SYN)
3、客户端在接收到服务器端的SYN+ACK数据包后,会再向服务器发送一个ACK,完成三次握手。客户端和服务器正式建立了连接,开始传输数据。(客户端:一个ACK)
3. 建立TCP连接后发起HTTP请求
为什么HTTP协议要基于TCP来实现?
TCP是一个端到端的可靠的面向连接的协议,HTTP基于传输层TCP协议,发生数据传输问题时,有重传机制。
4. 服务器响应HTTP请求,浏览器得到HTML代码
5. 浏览器解析HTML代码,并请求HTML代码需要的资源(js,css,图片等)
6. 浏览器对页面进行渲染呈现给用户 *
如何渲染页面?
a)解析html文件构成 DOM树
b)解析CSS文件构成渲染树
c)边解析,边渲染
d) 等到渲染树构建完成后,浏览器开始布局渲染树,并将其绘制到屏幕上。
e)JS 单线程运行,JS有可能修改DOM结构,意味着JS执行完成前,后续所有资源的下载是没有必要的,所以JS是单线程,会阻塞后续资源下载