1、HTTP协议的主要特点
(1) 简单快速
每个资源得到URI是固定的,想访问某个资源,只需要输入这个资源对应的URI就可以了。
(URL(Uniform Resource Location)统一资源定位符,URI(Uniform Resource Identifier)统一资源标识符。URL是URI的子集,URL就是用定位的方式实现的URI。)(2) 灵活
每个HTTP头部有个Content-Type
,一个HTTP协议通过设置不同的Content-Type
值,可以完成不同类型的资源的传输。(3) 无连接
限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。(4) 无状态
HTTP协议对于事务处理没有记忆能力。知乎一句简单回单很好:就是第二次来你无法识别它曾经来过。(人生若只如初见)
但是,在通过增加cookie和session机制的前提下,现在的网络请求其实是有状态的。
2、HTTP报文
HTTP报文分为请求报文和响应报文
-
(1) 请求报文:由 请求行、请求头、空行和请求体组成
① 请求行包含HTTP方法,页面地址、HTTP协议和版本
② 请求头包含一些key: value值来告诉服务端需要哪些内容,要注意哪些类型
③ 空行: 最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
④ 请求体:即请求正文。
如下是一个HTTP请求报文示例:
-
(2) 响应报文:由 状态行、响应头、空行和响应体组成
① 状态行由3部分组成,分别为:协议版本,状态码,状态码描述,之间由空格分隔
② 响应头与请求头部类似,为响应报文添加了一些附加信息
③ 空行: 最后一个响应头之后是一个空行,发送回车符和换行符,通知客户端以下不再有响应头。
④ 响应体:即响应正文。
如下是一个HTTP响应报文示例:
3、HTTP方法
常用的HTTP方法有如下5种:
GET:获取资源
POST:传输资源
PUT:更新资源
DELETE:删除资源
HEAD:获取报文首部
4、POST和GET的区别
主要的区别有如下几点:
- ① GET在浏览器回退是无害的,而POST会再次提交请求
- ② GET产生的URL地址可以被收藏,而POST不可以
- ③ GET请求会被浏览器主动缓存,而POST不会,除非手动设置
- ④ GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留
- ⑤ GET请求在URL中传送的参数长度是有限制的,基本为2Kb,所以传送参数不要太长,否则会被浏览器截断,而POST没有限制
- ⑥ GET参数通过URL传递,而POST放在Request body中
- ⑦ POST比GET安全,因为GET请求参数直接暴露在URL上,所以不能用来传递敏感信息
5、HTTP状态码
- ① 1xx:指示信息。表示请求已经接受,继续处理
- ② 2xx:成功。表示请求已被成功接受
- ③ 3xx:重定向。要完成请求必须进行更进一步的操作
- ④ 4xx:客户端错误。请求有有语法错误或请求无法实现
- ⑤ 5xx:服务器错误。服务器未能实现合法的请求
常用HTTP状态码:
200 OK:客户端请求成功
206 Partual Content:客户发送了一个带有Range头的GET请求,服务器完成了它
301 Moved Permanently:所有请求的页面已经转移至新的URL(永久重定向)
302 Found:所有请求的页面已经临时转移到新的URL(临时重定向)
304 Not Modifiled:客户端有缓冲的文档并发出了一个条件性的请求,服务器告诉客户,原来缓冲的文档还可以继续使用
400 Bad Request:客户端请求有语法错误,不能被服务器所理解
401 Unauthorized:请求未经授权,这个状态码必须和WWW-Authenticate报头域一起使用
403 Forbidden:请求页面禁止被访问,一般某个地址只允许服务端访问,客服端访问时就会给出403
404 Not Found:请求资源不存在
500 Internal Server Error:服务器错误
503 Server Unavailable:请求未完成,服务器临时过载或宕机,一段时间后可能恢复正常
6、持久连接
HTTP协议采用“请求-应答”模式,当使用普通模式,即非 Keep-Alive(持久连接)模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议无连接的协议)
当使用Keep-Alive模式时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
Keep-Alive只有在HTTP/ 1.1才支持,HTTP 1.0版本是不支持的。
6、管线化
(1) 什么是管线化?
在持久连接(Keep-Alive)的情况下,某个连接上消息的传递类似于:
请求1 —> 响应1 —> 请求2 —> 响应2 —> 请求3 —> 响应3
这个过程中请求一直没有断开的
HTTP管线化(HTTP pipelining) 连接上的消息变成了这样:
请求1 —> 请求2 —> 请求3 —> 响应1 —> 响应2 —> 响应3
请求通道是持久建立的,但并不是请求一次,响应一次,而是将所有请求一次打包过去,然后响应也一次打包回来。
(2) 管线化特点
- 管线化通过持久连接完成,仅HTTP/ 1.1支持此技术
- 只有GET和HEAD请求可以进行管线化,而POST则有所限制
- 初次创建连接时,不应启动管线机制,因为对方(服务器)不一定支持HTTP/1.1版本协议
- 管线化不会影响响应到来的顺序,如上面箭头所示,响应返回的顺序并未改变。
- 开启管线化很可能并不会带来性能上的大幅度提升,而且很多服务端和代理程序对管线化支持并不好,因此现代浏览器像 Chrome 和 Firefox 默认并未开启管线化支持。