主要特点
特点 | 描述 |
---|---|
简单快速 | 客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。 |
灵活 | HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(数据类型)加以标记 |
无连接 | 服务器处理完客户的请求,并收到客户的应答后,即断开连接。 |
无状态 | HTTP是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive没能改变这个结果。单平请求时无法记录上一次和这一次是不是同一个请求,所以引入cookie和session |
报文组成部分
报文 | 组成 |
---|---|
请求报文 | 请求行、请求头、空行、请求体 |
响应报文 | 状态行、响应头、空行、响应体 |
1.请求行
由3部分组成,分别为:请求方法、URL(见备注1)以及协议版本,之间由空格分隔
请求方法包括GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE以及扩展方法,当然并不是所有的服务器都实现了所有的方法,部分方法即便支持,处于安全性的考虑也是不可用的
协议版本的格式为:HTTP/主版本号.次版本号,常用的有HTTP/1.0和HTTP/1.1
2.请求头部
请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔
常见请求头如下:
请求头 | 说明 |
---|---|
Host | 接受请求的服务器地址,可以是IP:端口号,也可以是域名 |
User-Agent | 发送请求的应用程序名称 |
Connection | 指定与连接相关的属性,如Connection:Keep-Alive |
Accept-Charset | 通知服务端可以发送的编码格式 |
Accept-Encoding | 通知服务端可以发送的数据压缩格式 |
Accept-Language | 通知服务端可以发送的语言 |
3.空行
请求头部的最后会有一个空行,表示请求头部结束
4.请求体
就是发过去的数据
1.状态行
由3部分组成,分别为:协议版本,状态码,状态码描述,之间由空格分隔
状态代码为3位数字,200~299的状态码表示成功,300~399的状态码指资源重定向,400~499的状态码指客户端请求出错,500~599的状态码指服务端出错(HTTP/1.1向协议中引入了信息性状态码,范围为100~199)
例子:
状态码 | 说明 |
---|---|
200 | 响应成功 |
302 | 跳转,跳转地址通过响应头中的Location属性指定(JSP中Forward和Redirect之间的区别) |
400 | 客户端请求有语法错误,不能被服务器识别 |
403 | 服务器接收到请求,但是拒绝提供服务(认证失败) |
404 | 请求资源不存在 |
500 | 服务器内部错误 |
2.响应头
请求头 | 说明 |
---|---|
Server | 服务器应用程序软件的名称和版本 |
Content-Type | 响应正文的类型(是图片还是二进制字符串) |
Content-Length | 响应正文长度 |
Content-Charset | 响应正文使用的编码 |
Content-Encoding | 响应正文使用的数据压缩格式 |
Content-Language | 响应正文使用的语言 |
3.空行
响应头部的最后会有一个空行,表示响应头部结束
4.响应体
返回数据
HTTP方法种类
方法名 | 方法用途 |
---|---|
GET | 获取资源 |
POST | 传输资源 |
PUT | 更新资源 |
DELETE | 删除资源 |
HEAD | 获得报文头部 |
持久链接
HTTP协议采用“请求-应答”模式,当时用普通模式,即非Keep-Alive模式时,每个请求/应答客户和服务器都要新建一个链接,完成之后立即断开(HTTP下一为无连接协议)
但是当使用Keep-Alive模式(持久链接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器 的后续请求时,Keep-Alive功能避免了简历或者重新建立连接
管线化
默认情况下http协议中每个传输层连接只能承载一个http请求和响应,然后结束。
- 管线化机制通过持久链接完成,仅HTTP/1.1支持此技术
- 只有Get和HEAD请求可以进行管线化,而POST则有所限制
- 初次创建连接时不起动管线机制,因为对方(服务器)不一定支持HTTP/1.1版本协议
- 管线化不会影响响应到来的顺序
- HTTP/1.1要求服务器端支持管线化,但并不要求服务器端也对相应进行管线化处理,只是要求对于管线化的请求不失败即可
- 由于上面提到的服务器端问题,开启管线化很可能并不会带来大幅度的性能提升,而且很多服务器端和代理程序对管线化的支持并不好,因此Chrome和Firefox默认并不开启管线化支持