Hyper Text Transfer Protocol(HTTP
)协议:超文本传输协议。
是一种无状态的,应用层的,以请求/应答方式运行的协议,它使用可扩展的语义和自描述消息格式,与基于网络的超文本信息系统灵活的互动。
HTTP特点
-
无状态:HTTP是无状态的协议,即连续的两个请求中,后一个请求不能依赖前一个请求中相应的字段或者head头部等。有会话的,可以通过HTTP Cookies 携带会话。
-
请求/应答:HTTP是以请求/应答方式运行的协议,一种client-server协议,也就是说一定是基于一个连接,首先由客户端来发起请求,然后服务器才能在这个连接上发起一个响应。
-
可扩展:HTTP使用的语义是可扩展的,在HTTP/1.0中出现的HTTP headers让协议扩展变得非常容易。只要服务端和客户端就新 headers 达成语义一致,新功能就可以被轻松加入进来。
-
自描述:HTTP传递的消息是一个自描述消息,即从一个请求中就可以知道这段消息是一个图片还是一个视频或者一段音频,而不需要依赖于其它的请求。
-
超文本:HTTP所传输的不止有文档,还有图片,音频,视频等内容。
HTTP请求的典型场景
HTTP1.x链接管理
短连接
HTTP/1.0 的默认模型 ,在 HTTP/1.1 中,只有当 Connection 被设置为
close
时才会用到这个模型。
HTTP 最早期的模型,也是 HTTP/1.0 的默认模型,每一个 HTTP 请求之前都会有一次 TCP 握手。TCP 协议握手本身就是耗费时间的,所以 TCP 可以保持更多的热连接来适应负载,短连接破坏了 TCP 具备的热连接能力,新的冷连接降低了其性能。
长连接
HTTP/1.1 的默认模型, Connection 值为 keep-alive。
短连接有两个比较大的问题:创建新连接耗费的时间尤为明显,另外 TCP 连接的性能只有在该连接被使用一段时间后 (热连接) 才能得到改善。 一个长连接会保持一段时间,重复用于发送一系列请求,节省了新建 TCP 连接握手的时间,还可以利用 TCP 的性能增强能力。当然这个连接也不会一直保留着:连接在空闲一段时间后会被关闭(Keep-Alive 协议头来指定一个最小的连接保持时间)。
长连接也还是有缺点的: 就算是在空闲状态,它还是会消耗服务器资源,而且在重负载时,还有可能遭受攻击。仍然会存在 队头阻塞(Head-of-line blocking,缩写:HOL blocking)的问题。
HTTP流水线(管道化)
HTTP 流水线在现代浏览器中并不是默认被启用的。
HTTP管道化还有一些限制:
- 管道化只能解决客户端的队头阻塞,服务端还是要以FIFO的形式进行返回,原因很简单,HTTP请求和响应并没有序号标识,无法将乱序的响应与请求关联起来。
- 当客户端在支持管道化时需要保持未收到响应的请求,当连接意外中断时,需要重新发送这部分请求。如果这个请求只是从服务器获取数据,那么并不会对资源造成任何影响,而如果是一个提交信息的请求如post请求,那么可能会造成资源多次提交从而改变资源,这是不允许的。只有 幂等请求 方式,比如 GET、HEAD、PUT、DELETE。
HTTP Request Methods
- GET:请求一个指定资源的表示形式,使用GET的请求应该只被用于获取数据。明文传递,安全性不高,没有副作用,浏览器一般限制在2KB
- HEAD:请求一个与GET请求的响应相同的响应,但没有响应体。
- POST:用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用。报文主体内传递,安全性高,有副作用,无大小限制。
- PUT:用请求有效载荷替换目标资源的所有当前表示。
- DELETE:用于删除指定的资源。
- CONNECT:建立一个到由目标资源标识的服务器的隧道。
- OPTIONS:用于描述目标资源的通信选项。
- PATCH:用于对资源应用部分修改。
HTTP status code
1xx 消息响应
请求已被服务器接收到,需要进一步处理。
- 101 Switching Protocol (切换协议、协议升级)。
2xx 成功响应
- 200 OK
- 201 Created (新资源在服务端创建)
- 202 Accepted (服务器已接受请求,但尚未处理,最终该请求可能会也可能不会被执行,例如异步、需要长时间处理的任务)。
- 204 No Content(该响应没有响应内容,只有响应头,暗示客户端无需更新视图)
- 205 Reset Content (该响应没有响应内容,暗示客户端更新视图)
3xx 重定向
- 300 Multiple Choice (多种选择,该请求有多种可能的响应,用户代理或者用户必须选择它们其中的一个,服务器没有任何标准可以遵循去代替用户来进行选择。)
- 301 Moved Permanently (永久重定向)
- 302 Found (临时重定向)
- 304 | Not Modified (未修改,可以使用缓存)
4xx 客户端错误
- 400 Bad Request (请求语法错误,且服务器无法明确判断错误) - 401 Unauthorized (未授权,需要身份验证)
- 403 Forbidden (禁止访问,无权限访问)
- 404 Not Found (未找到)
- 405 Method Not Allowed (不允许使用该方法)
- 407 Proxy Authentication Required (要求代理身份验证,类似于状态码 401,不过需要通过代理才能进行验证)
- 408 Request Timeout (请求超时)
- 414 Request-URI Too Long (请求网址过长, 客户端请求所包含的URI地址太长,以至于服务器无法处理)
5xx 服务端错误
- 500 Internal Server Error (内部服务器错误,服务器遇到未知的无法解决的问题)
- 501 Implemented (服务器不支持该请求中使用的方法)
- 502 Bad Gateway (网关错误)
- 503 Service Unavailable (服务不可用)
- 504 Gateway Timeout (网关超时)
- 505 HTTP Version Not Supported (服务器不支持客户端发送的HTTP请求中所使用的HTTP协议版本)