Messages
HTTP消息是数据在服务器和客户端之间交换的方式。有两种类型的消息:请求客户端发送到触发服务器上的动作,并且响应,从服务器的答案。
HTTP消息由以ASCII编码的文本信息组成,并跨越多行。在HTTP / 1.1及其早期版本的协议中,这些消息是通过连接公开发送的。在HTTP / 2中,曾经人类可读的消息现在被划分为HTTP帧,从而提供优化和性能改进。
Web开发人员或网站管理员很少制作这些文本HTTP消息:软件,Web浏览器,代理或Web服务器,执行此操作。他们通过配置文件(代理或服务器),API(浏览器)或其他接口提供HTTP消息。
HTTP / 2二进制组帧机制被设计为不需要对应用的API或配置文件进行任何修改:它对用户来说是广泛透明的。
HTTP请求和响应共享相似的结构并由以下部分组成:
- 一个起始行描述的要求来实现,或者它无论成功或失败的状态。这条起始线总是一条线。
- 一组可选的HTTP标头,用于指定请求或描述消息中包含的主体。
- 表示请求的所有元信息的空白行已经发送。
- 包含与请求相关的数据的可选主体(如HTML表单的内容)或与响应关联的文档。主体和其大小的存在由开始行和HTTP标头指定。
HTTP消息的起始行和HTTP标头统称为请求头,而其有效负载称为主体。
HTTP请求
开始行
HTTP请求是客户端发送的消息,以在服务器上启动一个操作。他们的起点包含三个要素:
1.一个HTTP方法,动词(例如GET
,PUT
或POST
),或者名词(像HEAD
或OPTIONS
要被执行),描述动作。例如,GET
表示应该提取资源或者POST
意味着数据被推送到服务器(创建或修改资源或生成临时文档以发回)。
2.所述请求对象,通常是一个URL,或协议,端口和域的绝对路径通常特征在于请求上下文。这个请求目标的格式因不同的HTTP方法而异。有可能
- 绝对路径,最后是一个
'?'
查询字符串。这是最常见的形式,被称为起源形式,并用于与GET
,POST
,HEAD
,和OPTIONS
方法。POST / HTTP 1.1
GET /background.png HTTP/1.0
HEAD /test.html?query=alibaba HTTP/1.1
OPTIONS /anypage.html HTTP/1.0
- 当连接到代理服务器时,完整的URL称为绝对表单,主要用于
GET
。GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1
- URL的权威组成部分由域名和可选的端口(前缀为a
':'
)组成,称为权威表单。它仅CONNECT
在设置HTTP隧道时使用。CONNECT developer.mozilla.org:80 HTTP/1.1
- 的星号形式,一个简单的星号(
'*'
)用于OPTIONS
表示该服务器作为一个整体。OPTIONS * HTTP/1.1
3.HTTP版本,它定义了剩余的消息的结构,充当的预期版本的指示符以用于响应。
报头
来自请求的HTTP标头遵循HTTP标头的相同基本结构:不区分大小写的字符串,后跟冒号(':'
)和结构取决于标头的值。包括该值在内的整个标题由一条单独的行组成,该行可能相当长。
有许多请求头可用。他们可以分成几组:
- 一般标题,如
Via
整个应用于邮件。 - 请求标头,比如
User-Agent
,通过给定上下文(比如)或者通过有条件地限制它(比如)Accept-Type
来进一步指定它(比如Accept-Language
)来修改请求。Referer
If-None
- 实体标题,如
Content-Length
适用于请求的主体。显然,如果请求中没有主体,则不会传输此头。
主体
请求的最后部分是它的主体。并非所有的请求有一个:获取资源,如请求GET
,HEAD
,DELETE,或选项,通常不需要一个。有些请求会将数据发送到服务器以更新它:与POST
请求(包含HTML表单数据)的情况相同。
主体大致可以分为两类:
- 单资源主体,由一个单一文件组成,由两个标头定义:
Content-Type
和Content-Length
。 - 多资源主体,由多部分主体组成,每个主体包含不同位的信息。这通常与HTML表单相关联。
HTTP响应
状态行
HTTP响应的起始行(称为状态行)包含以下信息:
- 协议版本:通常为
HTTP/1.1
。 - 状态码:指示请求的成功或失败。常见的状态代码为
200
,404
或302
- 一个状态文本:简要的,纯粹的信息性的状态代码的文本描述,以帮助人们理解HTTP消息。
典型的状态行如下所示: HTTP/1.1 404 Not Found.
报头
响应的HTTP头与其他报头的结构相同:不区分大小写的字符串,后跟冒号(':'
)和结构取决于头部类型的值。包括其价值在内的整个表头呈现为一条线。
有许多响应头可用。这些可以分成几个组:
- 一般报头,如
Via
适用于整个消息。 - 响应报头,
Vary
并Accept-Ranges
提供有关不适合状态行的服务器的其他信息。 - 实体报头,如
Content-Length
适用于请求的主体。当请求中没有主体时显然不会传输这样的头文件。
主体
答复的最后部分是主体。并不是所有的答复都是:有状态代码的答复,就像201
或204
通常不会。
主体大致可以分为三类:
- 单一资源主体,由一个已知长度的单个文件组成,由两个标头定义:
Content-Type
和Content-Length
。 - 单一资源主体,由一个长度未知的单个文件组成,由块
Transfer-Encoding
设置为chunked
。 - 多资源主体,由多部分主体组成,每个主体包含不同的信息部分。这些比较少见。
HTTP / 2帧
HTTP / 1.x消息在性能方面有一些缺点:
- 与主体不同,标题是未压缩的。
- 从一条消息到另一条消息,标题通常非常相似,但仍然在连接中重复。
- 不能多路复用。多个连接需要在同一台服务器上打开:热TCP连接比冷连接更有效。
HTTP / 2引入了一个额外的步骤:它将HTTP / 1.x消息分成嵌入流中的帧。数据和标题帧是分开的,这允许标题压缩。多个流可以组合在一起,这个过程称为多路复用,允许更高效的底层TCP连接。
HTTP框架现在对Web开发人员是透明的。这是HTTP / 2中HTTP / 1.1消息和底层传输协议之间的附加步骤。Web开发人员使用HTTP帧所使用的API不需要进行任何更改; 当浏览器和服务器都可用时,HTTP / 2将打开并使用。
结论
HTTP消息是使用HTTP的关键; 它们的结构很简单,而且它们具有高度的可扩展性。HTTP / 2成帧机制在HTTP / 1.x语法和底层传输协议之间添加了一个新的中间层,而不需要从根本上对其进行修改:基于成熟的机制。