HTTP 协议

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 分组中,所以只提交一个分组即可同时发出多个请求,借此可减少网络上多余的分组并降低线路负载。

管线化的几个特点: