HTTPHTTP入门


备注

超文本传输​​协议 (HTTP)使用客户端请求/服务器响应模型。 HTTP是无状态协议,这意味着它不要求服务器在多个请求期间保留有关每个用户的信息或状态。但是,出于性能原因并避免TCP的连接延迟问题,可以使用诸如持久,并行或流水线连接之类的技术。

版本

笔记) 预计发布日期
HTTP / 0.9 “已实施” 1991-01-01
HTTP / 1.0 HTTP / 1.0的第一个版本,最后一个版本尚未成为RFC 1992-01-01
HTTP / 1.0 r1 HTTP的第一个官方RFC 1996年5月1日
HTTP / 1.1 连接处理方面的改进,支持基于名称的虚拟主机 1997-01-01
HTTP / 1.1 r1 消除了明确的关键字使用,修复了消息框架的可能问题 1999-06-01
HTTP / 1.1 r2 重大改革 2014-06-01
HTTP / 2 HTTP / 2的第一个规范 2015年5月1日

HTTP请求和响应

HTTP客户端和服务器分别发送HTTP请求和响应

HTTP描述了HTTP客户端(例如Web浏览器)如何通过网络向HTTP服务器发送HTTP请求,然后HTTP服务器将HTTP响应发送回客户端。

HTTP请求通常是对在线资源(例如网页或图像)的请求,但也可以包括附加信息,例如在表单上输入的数据。 HTTP响应通常是在线资源的表示,例如网页或图像。

HTTP / 0.9

出现的第一个HTTP版本是0.9,通常称为“ HTTP As Implemented” 。 0.9的常见描述是“完整HTTP [即1.0]协议的子部分”。然而,这极大地无法说明0.9和1.0之间的能力差异。

0.9功能标题中的请求和响应都没有。请求由单个CRLF终止的GET 行组成,后跟一个空格,后跟请求的资源URL。响应应该是单个HTML文档。通过删除连接服务器端来标记所述文档的结尾。没有设施来指示操作的成功或失败。唯一的交互属性是与<isindex> HTML标记紧密相关的搜索字符串

现在,HTTP / 0.9的使用非常罕见。在嵌入式系统中偶尔会看到它作为tftp的替代品。

HTTP / 1.0

RFC 1945中描述了HTTP / 1.0。

HTTP / 1.0没有Web上事实上所需的某些功能,例如虚拟主机的Host 头。

但是,如果HTTP客户端和服务器的HTTP / 1.1协议实现不完整(例如没有分块传输编码或流水线操作),有时仍会声明它们使用HTTP / 1.0,或者兼容性被认为比性能更重要(例如,当连接到本地代理时)服务器)。

GET / HTTP/1.0
User-Agent: example/1

HTTP/1.0 200 OK
Content-Type: text/plain

Hello
 

HTTP / 1.1

HTTP / 1.1最初于1999年在RFC 2616(协议)和RFC 2617(身份验证)中指定,但这些文档现已过时,不应用作参考:

不要使用RFC2616。将其从硬盘驱动器,书签中删除,然后刻录(或负责任地回收)打印出的任何副本。

- HTTP WG主席Mark Nottingham

HTTP / 1.1的最新规范,与今天的HTTP实现方式相匹配,在新的RFC 723x中:

增加了HTTP / 1.1,以及其他功能:

  • 分块传输编码,允许服务器可靠地发送未知大小的响应,
  • 持久性TCP / IP连接(HTTP / 1.0中的非标准扩展),
  • 用于恢复下载的范围请求,
  • 缓存控制。

HTTP / 1.1尝试引入流水线技术,允许HTTP客户端通过一次发送多个请求而无需等待响应来减少请求 - 响应延迟。遗憾的是,此功能从未在某些代理中正确实现,导致流水线连接丢失或重新排序响应。

GET / HTTP/1.0
User-Agent: example/1
Host: example.com

HTTP/1.0 200 OK
Content-Type: text/plain
Content-Length: 6
Connection: close

Hello
 

HTTP / 2

HTTP / 2( RFC 7540 )将HTTP的线上格式从简单的基于文本的请求和响应头更改为以帧发送的二进制数据格式。 HTTP / 2支持压缩标头( HPACK )。

这减少了请求的开销,并允许通过单个TCP / IP连接同时接收多个响应。

尽管数据格式发生了很大变化,HTTP / 2仍然使用HTTP标头,并且可以在HTTP / 1.1和2之间准确地转换请求和响应。