输入URL过程
1. URL解析:
- 判断你输入的是一个合法的 URL 还是一个待搜索的关键词,并且根据你输入的内容进行自动完成、字符编码等操作。
- 由于安全隐患,会使用 HSTS 强制客户端使用 HTTPS 访问页面。(可能会有这一步)
- 其他操作: 浏览器还会进行一些额外的操作,比如安全检查、访问限制(之前国产浏览器限制 996.icu)。
- 检查缓存(强制缓存、协商缓存)(重点)
2. DNS查询
- 检查浏览器缓存—>检查本地的 Hosts 文件–>检查操作系统缓存–>没有则向 DNS 服务器发送查询请求。
- 路由器缓存–>本地域名服务器缓存:
- 在这,本地DNS主要指是指各地电信运营商提供的域名解析服务器。也就是我们在上网网卡里面你设置的DNS地址
- 一般本地 DNS 服务器地址由 ISP(互联网服务提供商)通过 DHCP 协议动态分配,我们仍可以手动把它修改为公共 DNS,比如 Google 提供的 8.8.8.8,国内的 114.114.114.114,它们分布在不同的地理位置上,借助 Anycast 技术,将请求路由到离用户最近的 DNS 服务器上。
- 本地域名服务器–>迭代或递归查询(根域名服务器,顶级域名服务器,权限域名服务器)
- 注意点:DNS劫持,DNS Prefetch,即DNS预获取
3. 建立TCP连接:
-
拿到服务器IP,在浏览器发送HTTP请求之前,需要在浏览器和服务器之间建立一条TCP/IP连接
-
传输层:三报文握手,建立连接,TCP 传输报文(主要掌握三次握手与四次挥手)
下面的了解就行
- 网络层:将数据段打包,并加入源IP地址及目标IP地址,IP协议查询MAC地址,使用 ARP 协议查询它的 Mac 地址。
- 数据链路层:直接把数据通过 ARP 协议,向本网络的所有机器发送,接收方根据标头信息与自身 Mac 地址比较,一致就接受,否则丢弃
- 物理层:发送接收信息
4. 发送HTTP请求
- 与服务器建立了连接后,就可以向服务器发起请求了
- 在前面的步骤我们已经得到服务器的 IP 地址,浏览器会开始构造一个 HTTP 报文:请求行,请求头,请求体
5. 服务器永久重定向
为什么服务器一定要重定向而不是直接发送用户想看的网页内容呢?其中一个原因跟搜索引擎排名有关。如果一个页面有两个地址,就像http://www.yy.com/和http://yy.com/,搜索引擎会认为它们是两个网站,结果造成每个搜索链接都减少从而降低排名。而搜索引擎知道301永久重定向是什么意思,这样就会把访问带www的和不带www的地址归到同一个网站排名下。还有就是用不同的地址会造成缓存友好性变差,当一个页面有好几个名字时,它可能会在缓存里出现好几次。
6. 服务器处理请求
-
后端从在固定的端口接收到TCP报文开始,它会对TCP连接进行处理,对HTTP协议进行解析(请求方法、域名、路径等),并且进行一些验证,并按照报文格式进一步封装成HTTP Request对象,供上层使用。
-
大点的网站可能会有Nginx反向代理
-
处理业务
![服务端处理](https://img-blog.csdnimg.cn/20210109110025177.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjE3MDk5,size_16,color_FFFFFF,t_70#pic_center)
7. 返回响应结果
将处理结果封装成响应报文发送给浏览器
8. 浏览器接受响应
- 浏览器接收到来自服务器的响应资源后,会对资源进行分析。
- 首先查看 Response header,根据不同状态码做不同的事(比如上面提到的重定向)。
- 如果响应资源进行了压缩(比如 gzip),还需要进行解压。
- 然后,对响应资源做缓存。
- 接下来,根据响应资源里的 MIME 类型去解析响应内容(比如 HTML、Image各有不同的解析方式)。
9. HTML解析https://juejin.cn/post/6844904020935606285
看另一篇笔记:HTML解析与CSS解析
解析过程是先构建dom树,再根据dom树构建渲染树,最后浏览器将渲染树绘制到页面上。
事件轮循机制
1. JS的解析是由浏览器中的JS解析引擎完成的,比如谷歌的是V8。JS是单线程运行,也就是说,在同一个时间内只能做一件事,所有的任务都需要排队,前一个任务结束,后一个任务才能开始。但是又存在某些任务比较耗时,如IO读写等,所以需要一种机制可以先执行排在后面的任务,这就是:同步任务(synchronous)和异步任务(asynchronous)。
2. JS的执行机制就可以看做是一个主线程加上一个任务队列(task queue)。同步任务就是放在主线程上执行的任务,异步任务是放在任务队列中的任务。所有的同步任务在主线程上执行,形成一个执行栈;异步任务有了运行结果就会在任务队列中放置一个事件;脚本运行时先依次运行执行栈,然后会从任务队列里提取事件,运行任务队列中的任务,这个过程是不断重复的,所以又叫做事件循环(Event loop)。
10. 断开连接
四次挥手
为什么要等待2MSL