1、HTTP 协议的主要特点
- 简单快速
uri 是固定的,访问简单 - 灵活
HTTP 头部表明了数据类型,通过一个 HTTP 协议有可以完成不同数据类型的传输 - 无连接
连接一次就断开,不会保持持久连接 - 无状态
客户端向服务端建立连接,完成后连接断开;下次客户端发送请求,服务端无法判断是否是同一个身份。即服务端是不记录状态的。
2、HTTP 报文的组成部分
2.1 请求报文
- 请求行
- HTTP 方法
- 页面地址
- HTTP 协议
- HTTP 版本
- 请求头
- key-value 值
- 空行
- 用于分隔请求头和请求体
- 请求体
举个栗子:
2.2 响应报文
- 状态行
- HTTP 协议
- HTTP 版本
- HTTP 状态码
- 响应头
- key-value 值
- 空行
- 响应体
举个栗子:
3、HTTP 方法
- GET - 获取资源
- POST - 传输资源
- PUT - 更新资源
- DELETE - 删除资源
- HEAD - 获得报文首部
POST 和 GET 的区别:
4、HTTP 状态码
- 1xx: 指示信息 - 表示请求已接收,继续处理
- 2xx: 成功 - 表示请求已被成功接收
- 3xx: 重定向 - 要完成请求必须进行更进一步的操作
- 4xx: 客户端错误 - 请求有语法错误或请求无法实现
5xx: 服务器错误 - 服务器未能实现合法的请求
200 OK:请求成功。一般用于 GET 与 POST 请求
- 206 Partial Content:部分内容。客户发送了一个带有Range 头的 GET 请求,服务器完成了它(video/audio 标签请求内容时常用改状态码)
- 301 Moved Permanently:永久重定向。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
- 302 Found:临时重定向。与 301 类似。但资源只是临时被移动。客户端应继续使用原有URI,服务器高速客户,原来缓冲的文档还可以继续使用
- 304 Not Modified:未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。服务器告诉客户端,原来缓存的文件可以继续使用
- 400 Bad Request:客户端请求的语法错误,服务器无法理解
- 401 Unauthorized:请求要求用户的身份认证,请求未经授权,这个状态代码必须和 www-authenticate 报头域一起使用
- 403 Forbidden:被请求页面的访问被禁止(例如:某些页面不允许直接访问,只能通过服务器访问)
- 404 Not Found:请求资源不存在
- 500 Internal Server Error:服务器内部错误,无法完成请求
- 503 Service Unavailable:请求未完成,服务器临时过载或当机,一段时间后可恢复正常
5、HTTP 持久连接
HTTP 协议采用“请求-应答”模式,当使用普通模式,即非 Keep-Alive 模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP 协议为无连接的协议)
当使用 Keep-Alive 模式时(又称持久连接、连接重用)时,Keep-Alive 功能使客户端到服务器端的连接持续有效,当出现对服务器的后续请求时,Keep-Alive 功能避免了简历或者重新建立连接。
注:HTTP 1.1 才支持持久连接。
HTTP 1.0 中默认是关闭的,需要在 HTTP 头加入 Connection: Keep-Alive
,才能启用 Keep-Alive;HTTP 1.1 中默认启用 Keep-Alive
,如果加入Connection: close
,才关闭。目前大部分浏览器都是用http 1.1 协议,也就是说默认都会发起 Keep-Alive 的连接请求了,所以是否能完成一个完整的 Keep-Alive 连接就看服务器设置情况。
优点:当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。
6、管线化
HTTP 管线化是将多个 HTTP 请求(request)整批提交的技术,而在传送过程中不需先等待服务端的回应。管线化机制须通过:
1、永久连接(persistent connection)完成
2、仅 HTTP/1.1 支持此技术(HTTP/1.0 不支持)
3、并且只有 GET 和 HEAD 要求可以进行管线化,而 POST 则有所限制。
此外,初次创建连接时也不应启动管线机制,因为对方(服务器)不一定支持 HTTP/1.1 版本的协议。
浏览器将 HTTP 要求大批提交可大幅缩短页面的加载时间,特别是在传输延迟(lag/latency)较高的情况下(如卫星连接)。此技术之关键在于多个 HTTP 的要求消息可以同时塞入一个 TCP 分组中,所以只提交一个分组即可同时发出多个请求,借此可减少网络上多余的分组并降低线路负载。
管线化的几个特点: