从输入url到页面展现的过程经历了什么?
简写版:
- 输入url
- 域名解析
- 发起TCP的3次握手
- 建立TCP连接后发起http请求 --> -服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等)
- 浏览器对页面进行渲染呈现给用户
- 传输完成,四次挥手结束。
详细版:
1,在浏览器输入URL
URL:统一资源定位符,用于定位互联网上的资源。
url对应有协议、域名、端口号。
协议是从该计算机获取资源的方式,常见的协议有:http,https,ftp,file;不同协议有不同的通讯内容格式;
2,域名解析
首先,浏览器会解析输入URL的域名去查找对应的IP地址
域名解析流程:
2.1 浏览器缓存
首先搜索浏览器自身的DNS缓存(缓存时间比较短,大概只有1分钟,且只能容纳1000条缓存),看自身的缓存中是否有与输入域名对应的条目,而且没有过期,如果有且没有过期则解析到此结束。
2.2 DNS缓存
如果浏览器自身的缓存里面没有找到对应的条目,那么浏览器会搜索操作系统自身的DNS缓存,如果找到且没有过期则停止搜索解析到此结束.
2.3 路由器缓存
如果在系统DNS缓存也没有找到,那么尝试读取系统hosts文件(位于C:\Windows\System32\drivers\etc),看看这里面有没有该域名对应的IP地址,如果有则解析成功。
2.4 ISP DNS缓存
如果在hosts文件中也没有找到对应的条目,浏览器就会发起一个DNS的系统调用,就会向
本地配置的首选DNS服务器(一般是电信运营商提供的)发起域名解析请求,(通过的是UDP协议向DNS的53端口发起请求,这个请求是递归的请求,也就是运营商的DNS服务器必须得提供给我们该域名的IP地址),运营商的DNS服务器首先查找自身的缓存,找到对应的条目,且没有过期,则解析成功。
2.5 如果仍没有找到对应的条目,则由运营商的DNS代浏览器发起迭代DNS解析请求,直到找到对对应IP地址
1.首先 是找到根域的DNS的IP地址,向其发起请求:(请问www.xxxxxx.com这个域名的IP地址是多少啊?),根域发现这是一个顶级域com域的一个域名,于是就告诉运营商的DNS我不知道这个域名的IP地址,但是我知道com域的IP地址,你去找它去,于是运营商的DNS就得到了com域的IP地址;
2.然后 com域的IP地址发起了请求:(请问www.xxxxxx.com这个域名的IP地址是多少啊?),com域这台服务器告诉运营商的DNS我不知道www.xxxxxx.com这个域名的IP地址,但是我知道xxxxxx.com这个域的DNS地址,你去找它要IP地址去;
3.于是运营商的DNS又向xxxxxx.com这个域名的DNS地址(这个一般就是由域名注册商提供的,像万网,新网等)发起请求:(请问www.xxxxxx.com这个域名的IP地址是多少啊?),这个时候xxxxxx.com域的DNS服务器一查,诶,果真在我这里,于是就把找到的结果发送给运营商的DNS服务器;
这个时候运营商的DNS服务器就拿到了www.xxxxxx.com这个域名对应的IP地址,并返回给操作系统内核,内核又把结果返回给浏览器,终于浏览器拿到了www.xxxxxx.com对应的IP地址,进行下一步操作。
3.浏览器向web服务器发起TCP 连接请求
拿到域名对应的IP地址之后,User-Agent(一般是指浏览器)向WEB服务器发起TCP的连接请求:发起TCP的3次握手。
4.建立TCP连接后发起http请求
经过TCP 3次握手之后,浏览器会通过tcp连接向远程服务器发送 HTTP 的 GET请求。
5.服务器端响应http请求,浏览器得到html代码
服务器端WEB程序接收到http请求以后,就开始处理该请求,处理之后就返回给浏览器html文件。
6.浏览器解析html代码,并请求html代码中的资源
浏览器拿到index.html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,就向服务器端去请求下载(会使用多线程下载,每个浏览器的线程数不一样),这个时候就用上keep-alive特性了,建立一次HTTP连接,可以请求多个资源,下载资源的顺序就是按照代码里的顺序。
HTML字符串被浏览器接受后,就会被一句句读取解析
解析到link标签后,重新发送请求获取css
解析到script标签后发送请求获取js
解析到img标签后发送请求获取图片资源等
7.浏览器对页面进行渲染呈现给用户
浏览器根据html和css计算得到渲染树,绘制到屏幕上,js会被执行。
8.传输完成,断开连接
4次挥手断开