ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# HTTP > HyperText Transfer Protocol 超文本传输协议 计算机应用层。是一种短连接,是一种无状态的连接。无状态指的是浏览器每次向服务器发起请求的时候,不是通过一个连接,而是每次都建立一个新的连接。 ## 常用HTTP请求方法 1. GET 获取资源 1. POST 传输资源 1. PUT 更新资源 1. DELETE 删除资源 1. HEAD 获得报文首部 1. OPTIONS 允许客户端查看服务器的性能 ## http传输流 ![](https://user-gold-cdn.xitu.io/2018/4/17/162d19df66466f6b?imageView2/0/w/1280/h/960/format/webp/ignore-error/1) ## 状态码 #### 2XX 成功 * 200 OK,表示从客户端发来的请求在服务器端被正确处理 * 204 No content,表示请求成功,但响应报文不含实体的主体部分 * 206 Partial Content,进行范围请求 #### 3XX 重定向 * 301 moved permanently,永久性重定向,表示资源已被分配了新的 URL * 302 found,临时性重定向,表示资源临时被分配了新的 URL * 303 see other,表示资源存在着另一个 URL,应使用 GET 方法定向获取资源 * 304 not modified,表示服务器允许访问资源,但因发生请求未满足条件的情况 * 307 temporary redirect,临时重定向,和302含义相同 #### 4XX 客户端错误 * 400 bad request,请求报文存在语法错误 * 401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息 * 403 forbidden,表示对请求资源的访问被服务器拒绝 * 404 not found,表示在服务器上没有找到请求的资源 #### 5XX 服务器错误 * 500 internal sever error,表示服务器端在执行请求时发生了错误 * 503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求 ## 浏览器中输入url后,发生了什么? 这个应该算是经典问题了,基本都会问一次.. > 主要可以分为六个步骤,DNS解析,TCP连接,发送HTTP请求,如果有重定向,浏览器需要跟踪重定向地址,服务器处理HTTP请求并返回数据,浏览器渲染解析页面,连接结束。 > #### DNS解析 就是网址到IP地址的一个转换。比如查询www.google.com,查询的顺序就是从本地域名服务器中查询->根域名服务器->COM顶级域名服务器查询->google.com->www.google.com.。 如下图: ![](https://sfault-image.b0.upaiyun.com/161/828/1618288278-57f00bf9444dd_articlex) **DNS解析优化** 从上面我们可以看出,整个查询过程需要的步骤很多。就出现了**DNS缓存**来进行优化。 DNS缓存主要有:浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存。 **负载均衡** DNS负载均衡,又叫做DNS重定向,DNS服务器会返回一个跟用户最接近的点的IP地址给用户。 #### 浏览器解析渲染页面 > 这一步骤简单说是这样, 1.构建DOM树。 2.构建CSSDOM。 3.执行JS。 4.构建渲染树。 5.布局。 6.绘制。 浏览器是一个边解析边渲染的过程。首先浏览器解析HTML文件构建DOM树,然后解析CSS文件构建渲染树,等到渲染树构建完成后,浏览器开始布局渲染树并将其绘制到屏幕上。 JS的解析是由浏览器中的JS解析引擎完成的。JS是单线程运行,也就是说,在同一个时间内只能做一件事,所有的任务都需要排队,前一个任务结束,后一个任务才能开始。但是又存在某些任务比较耗时,如IO读写等,所以需要一种机制可以先执行排在后面的任务,这就是:同步任务(synchronous)和异步任务(asynchronous)。JS的执行机制就可以看做是一个主线程加上一个任务队列(task queue)。同步任务就是放在主线程上执行的任务,异步任务是放在任务队列中的任务。所有的同步任务在主线程上执行,形成一个执行栈;异步任务有了运行结果就会在任务队列中放置一个事件;脚本运行时先依次运行执行栈,然后会从任务队列里提取事件,运行任务队列中的任务,这个过程是不断重复的,所以又叫做事件循环(Event loop)。 浏览器在解析过程中,如果遇到请求外部资源时,如图像,iconfont,JS等。浏览器将重复1-6过程下载该资源。请求过程是异步的,并不会影响HTML文档进行加载,但是**当文档加载过程中遇到JS文件**,HTML文档会挂起渲染过程,不仅要等到文档中JS文件加载完毕还要等待解析执行完毕,才会继续HTML的渲染过程。原因是因为JS有可能修改DOM结构,这就意味着JS执行完成前,后续所有资源的下载是没有必要的,这就是JS阻塞后续资源下载的根本原因。**CSS文件的加载不影响JS文件的加载**,但是却影响JS文件的执行。JS代码执行前浏览器必须保证CSS文件已经下载并加载完毕。 >所以我们由此也应该注意: >1. 将样式或 CSS 文件定义在 head 中,并且在处理此类请求的时候应该尽快能够响应(CDN 什么的),如果像上面请求一个 CSS 文件都要 10s 的话,那你这页面估计没多少人有耐心等下去。 >2. 将 JS 脚本文件放在 body 底部,让 DOM 结构能优先渲染出来,避免 DOM 被阻塞。 ## 参考 [HTTP,HTTP2.0,SPDY,HTTPS你应该知道的一些事](http://www.alloyteam.com/2016/07/httphttp2-0spdyhttps-reading-this-is-enough/) [那些前端应该知道的HTTP知识](https://juejin.im/post/5afad7f16fb9a07abf72ac30) [tcp、http面试指南](https://juejin.im/post/5ad4094e6fb9a028d7011069) [输入url后发生了什么](https://segmentfault.com/a/1190000006879700)