应用层协议:HTTP协议(下)——请求方法与状态码、消息

应用层协议:HTTP协议(下)——请求方法与状态码、消息

请求方法与状态码

请求方法

HTTP/1.1协议中共定义了八种方法(也叫“动作”)来以不同方式操作指定的资源:

  • GET

    向指定的资源发出“显示”请求。使用GET方法应该只用在读取资料,而不应当被用于产生“副作用”的操作中,例如在网络应用程序中。其中一个原因是GET可能会被网络爬虫等随意访问。参见安全方法。浏览器直接发出的GET只能由一个url触发。GET上要在url之外带一些参数就只能依靠url上附带querystring。

  • HEAD

    与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。

  • POST

    向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。每次提交,表单的数据被浏览器用编码到HTTP请求的body里。浏览器发出的POST请求的body主要有两种格式,一种是application/x-www-form-urlencoded用来传输简单的数据,大概就是”key1=value1&key2=value2”这样的格式。另外一种是传文件,会采用multipart/form-data格式。采用后者是因为application/x-www-form-urlencoded的编码方式对于文件这种二进制的数据非常低效。

  • PUT

    向指定资源位置上传其最新内容。

  • DELETE

    请求服务器删除Request-URI所标识的资源。

  • TRACE

    回显服务器收到的请求,主要用于测试或诊断。

  • OPTIONS

    这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用’*’来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。

  • CONNECT

    HTTP/1.1协议中预留给能够将连接改为隧道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。

HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。当然,所有的方法支持的实现都应当符合下述的方法各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。例如:

  • PATCH

    用于将局部修改应用到资源。

状态码

所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。

状态代码的第一个数字代表当前响应的类型:

  • 1xx消息——请求已被服务器接收,继续处理
  • 2xx成功——请求已成功被服务器接收、理解、并接受
  • 3xx重定向——需要后续操作才能完成这一请求
  • 4xx请求错误——请求含有词法错误或者无法被执行
  • 5xx服务器错误——服务器在处理某个正确请求时发生错误

HTTP 消息

HTTP 消息是服务器和客户端之间交换数据的方式。有两种类型的消息:请求(request)——由客户端发送用来触发一个服务器上的动作;响应(response)——来自服务器的应答。

请求

img

HTTP 请求的一个例子:

A basic HTTP request

请求由以下元素组成:

  • 一个 HTTP 的请求方法,经常是由一个动词像 GETPOST 或者一个名词像 OPTIONSHEAD 来定义客户端的动作行为。通常客户端的操作都是获取资源(GET 方法)或者发送 HTML 表单(POST 方法),虽然在一些情况下也会有其他操作。
  • 要获取的资源的路径,通常是上下文中就很明显的元素资源的 URL,它没有 protocolhttp://),domaindeveloper.mozilla.org),或是 TCP 的 port (en-US)(HTTP 一般在 80 端口)。
  • HTTP 协议版本号。
  • 为服务端表达其他信息的可选标头
  • 对于一些像 POST 这样的方法,报文的主体(body)就包含了发送的资源,这与响应报文的主体类似。

标头(Header)

来自请求的 HTTP 标头遵循和 HTTP 标头相同的基本结构:不区分大小写的字符串,紧跟着的冒号(':')和一个结构取决于标头的值。整个标头(包括值)由一行组成,这一行可以相当长。

有许多请求标头可用,它们可以分为几组:

Example of headers in an HTTP request

主体(Body)

请求的最后一部分是它的主体。不是所有的请求都有一个主体:例如获取资源的请求,像 GETHEADDELETEOPTIONS,通常它们不需要主体。有些请求将数据发送到服务器以便更新数据:常见的的情况是 POST 请求(包含 HTML 表单数据)。

主体大致可分为两类:

响应

img

HTTP 响应的一个例子:

img

响应报文包含了下面的元素:

  • HTTP 协议版本号。
  • 一个状态码(状态码(status code)),来告知对应请求执行成功或失败,以及失败的原因。
  • 一个状态信息,这个信息是非权威的状态码描述信息,可以由服务端自行设定。
  • HTTP 标头,与请求标头类似。
  • 可选项,比起请求报文,响应报文中更常见地包含获取资源的主体。

状态行

HTTP 响应的起始行被称作状态行(status line),包含以下信息:

  1. 协议版本,通常为 HTTP/1.1
  2. 状态码(status code),表明请求是成功或失败。常见的状态码是 200404302
  3. 状态文本(status text)。一个简短的,纯粹的信息,通过状态码的文本描述,帮助人们理解该 HTTP 消息。

一个典型的状态行看起来像这样:HTTP/1.1 404 Not Found

标头(Header)

响应的 HTTP 标头遵循和任何其它标头相同的结构:不区分大小写的字符串,紧跟着的冒号(':')和一个结构取决于标头类型的值。整个标头(包括其值)表现为单行形式。

许多不同的标头可能会出现在响应中。这些可以分为几组:

Example of headers in an HTTP response

主体(Body)

响应的最后一部分是主体。不是所有的响应都有主体:具有状态码(如 201204)的响应,通常不会有主体。

主体大致可分为三类:

  • 单资源(Single-resource)主体,由已知长度的单个文件组成。该类型主体由两个标头定义:Content-TypeContent-Length
  • 单资源(Single-resource)主体,由未知长度的单个文件组成。通过将 Transfer-Encoding 设置为 chunked 来使用分块编码。
  • 多资源(Multiple-resource)主体,由多部分 body 组成,每部分包含不同的信息段。但这是比较少见的。

HTTP/2 帧

HTTP/1.x 消息有一些性能上的缺点:

  • 与主体不同,标头不会被压缩。
  • 两个消息之间的标头通常非常相似,但它们仍然在连接中重复传输。
  • 无法多路复用。当在同一个服务器打开几个连接时:TCP 热连接比冷连接更加有效。

HTTP/2 引入了一个额外的步骤:它将 HTTP/1.x 消息分成帧并嵌入到流(stream)中。数据帧和报头帧分离,这将允许报头压缩。将多个流组合,这是一个被称为多路复用(multiplexing)的过程,它允许更有效的底层 TCP 连接。

HTTP/2 modify the HTTP message to divide them in frames (part of a single stream), allowing for more optimization.

HTTP 帧现在对 Web 开发人员是透明的。在 HTTP/2 中,这是一个在 HTTP/1.1 和底层传输协议之间附加的步骤。Web 开发人员不需要在其使用的 API 中做任何更改来利用 HTTP 帧;当浏览器和服务器都可用时,HTTP/2 将被打开并使用。

QUIC 协议

QUIC 协议通过基于 UDP 自定义的类似 TCP 的连接、重试、多路复用、流量控制技术,进一步提升性能。

参考链接

1.维基百科,https://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE

2.web开发技术,https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Session

3.趣谈网络协议,https://time.geekbang.org/column/article/9410


应用层协议:HTTP协议(下)——请求方法与状态码、消息
https://blog.longpi1.com/2023/01/17/应用层协议:HTTP协议(下)——请求方法与状态码、消息/