# 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)
- html
- 冒泡/捕获/委托
- 前端路由
- Dom
- 创建节点API
- 页面修改型API
- 节点查询型API
- 节点关系型API
- 元素属性API
- DOM事件
- classList
- 性能优化
- 节流防抖
- localStorage sessionStorage
- BOM
- meta
- data属性
- js实现拖拽
- html5
- 关于meta
- 轮播图
- js实现拖放
- 电话号inputFormater
- js
- es6
- promise
- iterator
- generator
- async
- proxy
- Set
- Map
- Object的扩展
- String
- Iterator
- Symbol
- 解构赋值
- 函数式编程
- module
- 基本数据类型
- 数组相关codings
- for of/for in
- this
- call bind apply
- 闭包
- 作用域
- prototype与继承
- 深浅拷贝
- setTimeOut/setInterval
- 垃圾处理机制
- 设计模式
- 观察者模式
- 单例模式
- 策略模式
- RegExp
- with
- 其他玩意
- Error/Stack Trace
- 面向对象
- css
- 回流重绘
- %取值
- 属性继承/属性优先级
- flex
- BFC
- 盒模型
- 设置css的方法
- 定位机制
- 块级/行内元素
- hack和一些别的玩意
- css动画
- 几个布局
- 画图形
- css3
- animation对比transform
- 点击不同图片区域跳转不同
- css选择器性能问题
- vh rem em
- css选择器
- 伪类伪元素
- css匹配原理
- 数据结构与算法
- 数据结构
- 树
- 链表
- 栈和队列
- 排序
- 归并排序
- 插入排序
- 选择排序
- 冒泡排序
- 快速排序
- 递归
- 回溯法
- 搜索算法
- 动态规划
- http
- 跨域问题
- CORS
- GET/POST
- ajax
- ajax上传文件
- http缓存
- https
- TCP/UDP
- cookie/session
- http2.0
- spdy
- websocket
- React
- redux
- 生命周期
- 虚拟dom与diff
- 双向数据绑定
- mvvm
- setState
- contextApi props reudx
- 高阶组件
- react-redux
- Fiber
- react-router
- 受控/非受控组件
- 待整理
- webpack
- loader实现
- 前端安全
- 移动端适配
- Vue
- 传值
- 其他