参考文
献:
-
定义
HTTP全称
超文本传输协议,是
应用层协议。在上网浏览网页的时候,浏览器和web服务器之间就会通过HTTP在Internet上进行数据的发送和接收。HTTP是一个
基于请求/响应(Request/Response)模式的、
无状态协议。
-
特点
-
支持客户端 /服务器模式(C/S系统)
-
通信速度快:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快;
-
传输类型多样: HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记;
-
无连接: 无连接是指限制每次连接只处理一个请求。服务器处理完客户端的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间;
-
无状态:HTTP协议是 无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续要用到前面的数据需要重传。在身份验证的时候,每次请求都要传递身份信息很浪费资源。
PS:
-
流(Stream):已建立的TCP连接上的双向字节流,可以承载一个或多个消息。
-
消息(Message):一个完整的HTTP请求或响应,由一个或多个帧组成。特定消息的帧在同一个流上发送,这意味着一个HTTP请求或响应只能在一个流上发送。
-
帧(Frame):通信的基本单位。一个TCP连接上可以有任意数量的流。
HTTP1.1
-
缺点
-
线头阻塞:若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞。
-
多个TCP连接:虽然HTTP1.1管线化可以支持请求并发,但是很多浏览器都禁用了管线化,所以1.1建立请求并发依赖于多个TCP连接,但是多个TCP连接成本高,还会存在 慢启动的问题。
-
客户端需要主动请求
-
头部冗余,采用文本格式:HTTP/1.X版本采用文本格式,首部未压缩,而且每一个请求都会带上cookie、user-agent等完全相同的首部。
PS:
一旦一个TCP连接建立之后,就进入了发送数据状态,刚开始TCP协议会采用一个非常慢的速度去发送数据,然后慢慢加快发送数据的速度,直到发送数据的速度达到一个理想状态,我们把这个过程称为慢启动。
你可以把每个TCP发送数据的过程看成是一辆车的启动过程,当刚进入公路时,会有从0到一个稳定速度的 提速过程,TCP的慢启动就类似于该过程。
慢启动是TCP为了减少网络拥塞的一种策略,我们是没有办法改变的。
HTTP2.0
-
改良
-
二进制分帧层: 2.0性能提升的核心就在于二进制分帧层,HTTP2是二进制协议,它采用二进制传输数据而不是1.X的文本格式
-
多路复用:让所有的通信都在一个TCP连接上完成。HTTP2建立一个TCP连接以后,一个连接上可以有多个流(stream),一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
-
头部压缩。
-
服务器端推送:服务器预测客户端需要的资源,主动推送到客户端。例如:客户端请求index.html。服务器端会推送script.js和style.css。实现原理就是客户端发出页面请求以后,服务器分析这个请求所依赖的其他资源,然后主动推送到客户端的缓存。
状态码
状态码
|
对应的信息
|
1XX(临时响应码)
|
临时响应,表示请求已接收,继续处理
|
100 Continue
|
请求者应当继续提出请求。
服务器已收到请求的一部分正在等待其余部分
|
101 Switching Protocols
|
切换协议,请求者已要求服务器切换协议,服务器已确认并准备切换,
只能切换到更高级的协议
|
2XX(成功状态码)
|
用于表示请求已被成功接收
|
200 OK
|
从客户端发来的请求在服务器端被正常处理了。一般用于POST和GET请求
|
204 No Content
|
请求已经成功处理但是没有内容返回也不允许返回任何实体的主体。一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。
|
206 Partial Content
|
表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求,响应报文中包含由Content-Range指定范围的实体内容
|
3XX(重定向状态码)
|
用于表示资源(网页等)被永久转移到其他URL,也就是所谓的重定向
|
301 Moved Permanently
|
永久性重定向,表示请求的资源已经被分配了新的URI(统一资源标识符),以后应该使用资源现在所指的URI
|
302 Found
|
临时性重定向,表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。
|
303 See Other
|
表示由于请求对应的资源存在另一个URI,应该使用GET方法定向获取请求的资源
|
304 Not Modified
|
如果客户端发送了一个带条件的GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变。(
协商缓存)
|
4XX(客户端错误状态码)
|
客户端错误——请求有语法错误/请求无法实现
|
400 Bad Request
|
报文中存在语法错误。浏览器会像对待200 OK一样对待该状态码
|
401 Unauthorized
|
发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。
若之前已进行过一次请求,则表示用户认证失败。
|
403 Forbidden
|
请求资源的访问被服务器拒绝了。未获得文件系统的访问授权,访问权限出现问题等情况都会出现403。
|
404 Not Found
|
服务器无法找到请求的资源。服务器端拒绝请求且不想说明理由时也可以使用。
|
405 Method Not Allowed
|
客户端请求的方法虽然能被服务器识别,但是服务器禁止使用该方法,GET和HEAD应该总是允许客户端进行访问,客户端可以通过OPTIONS方法来查看服务器允许的访问方法。
|
5XX(服务器错误状态码)
|
服务器端错误——服务器未能实现合法的请求
|
500 Internal Server Error
|
服务器端在执行请求时发生了错误,也有可能是web应用存在的bug或者某些临时的故障
|
502 Bad Gateway
|
扮演网关或代理角色的服务器从上游服务器收到的响应是无效的。该错误需要有途径的web服务器或者代理服务器对其修复
|
503 Service Unavailable
|
服务器暂时处于超负荷或正在进行停机维护,现在无法处理请求。
|