简介

  • HTTP协议理论基础知识

分块传输编码

  • 分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由网页服务器发送给客户端应用( 通常是网页浏览器)的数据可以分成多个部分。分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供。
  • 通常,HTTP应答消息中发送的数据是整个发送的,Content-Length消息头字段表示数据的长度。数据的长度很重要,因为客户端需要知道哪里是应答消息的结束,以及后续应答消息的开始。然而,使用分块传输编码,数据分解成一系列数据块,并以一个或多个块发送,这样服务器可以发送数据而不需要预先知道发送内容的总大小。通常数据块的大小是一致的,但也不总是这种情况。

  • 分块传输编码的原理
    • HTTP分块传输编码允许服务器为动态生成的内容维持HTTP持久链接。通常,持久链接需要服务器在开始发送消息体前发送Content-Length消息头字段,但是对于动态生成的内容来说,在内容创建完之前是不可知的
    • 分块传输编码允许服务器在最后发送消息头字段。对于那些头字段值在内容被生成之前无法知道的情形非常重要,例如消息的内容要使用散列进行签名,散列的结果通过HTTP消息头字段进行传输。没有分块传输编码时,服务器必须缓冲内容直到完成后计算头字段的值并在发送内容前发送这些头字段的值。
    • HTTP服务器有时使用压缩 (gzip或deflate)以缩短传输花费的时间。分块传输编码可以用来分隔压缩对象的多个部分。在这种情况下,块不是分别压缩的,而是整个负载进行压缩,压缩的输出使用本文描述的方案进行分块传输。在压缩的情形中,分块编码有利于一边进行压缩一边发送数据,而不是先完成压缩过程以得知压缩后数据的大小。
  • 分块传输编码的格式
    • 如果一个HTTP消息(包括客户端发送的请求消息或服务器返回的应答消息)的Transfer-Encoding消息头的值为chunked,那么,消息体由数量未定的块组成,并以最后一个大小为0的块为结束
    • 每一个非空的块都以该块包含数据的字节数(字节数以十六进制表示)开始,跟随一个CRLF (回车及换行),然后是数据本身,最后块CRLF结束。在一些实现中,块大小和CRLF之间填充有白空格(0x20)。
    • 最后一块是单行,由块大小(0),一些可选的填充白空格,以及CRLF。最后一块不再包含任何数据,但是可以发送可选的尾部,包括消息头字段
    • 消息最后以CRLF结尾

HTTP Content-Type

  • Content-Type(内容类型),一般是指网页中存在的 Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些 PHP 网页点击的结果却是下载一个文件或一张图片的原因。
  • Content-Type 标头告诉客户端实际返回的内容的内容类型。
  • 语法格式:
    1
    2
    
    Content-Type: text/html; charset=utf-8
    Content-Type: multipart/form-data; boundary=something
    
  • 常见的媒体格式类型如下:
    • text/html : HTML格式
    • text/plain :纯文本格式
    • text/xml : XML格式
    • image/gif :gif图片格式
    • image/jpeg :jpg图片格式
    • image/png:png图片格式
  • 以application开头的媒体格式类型:
    • application/xhtml+xml :XHTML格式
    • application/xml: XML数据格式
    • application/atom+xml :Atom XML聚合格式
    • application/json: JSON数据格式
    • application/pdf:pdf格式
    • application/msword : Word文档格式
    • application/octet-stream : 二进制流数据(如常见的文件下载)
    • application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
  • 另外一种常见的媒体格式是上传文件之时使用的:
  • multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

HTTP 请求报文

HTTP 请求报文由请求行(Request Line)、请求头部(Headers)和请求主体(Body)三部分组成。下面是 HTTP 请求报文的一般格式:

1
2
3
4
5
6
<请求方法> <请求目标> <协议版本>
<请求头部字段>: <值>
<请求头部字段>: <值>
...
<空行>
<请求主体>

其中,各部分的含义如下:

  1. 请求方法(Request Method):表示客户端请求的动作类型,常见的方法有 GET、POST、PUT、DELETE 等。
  2. 请求目标(Request Target):指定请求的目标资源的位置,可以是一个 URL 或绝对路径。
  3. 协议版本(Protocol Version):指定所使用的 HTTP 协议的版本,通常是 HTTP/1.1 或 HTTP/2。
  4. 请求头部字段(Headers):包含了关于请求的附加信息,每个字段都以字段名和对应的值组成,每个字段占据一行。
  5. 空行:表示请求头部结束的标志,用于与请求主体进行分隔。
  6. 请求主体(Body):可选的,包含了实际要发送给服务器的数据,比如表单数据或上传的文件内容。

以下是一个示例 HTTP 请求报文:

1
2
3
4
5
6
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 48

{"username": "john_doe", "password": "secretpassword"}

在上面的示例中:

  • 请求方法为 POST,请求目标为 /api/users,协议版本为 HTTP/1.1
  • 请求头部包含了 HostContent-TypeContent-Length 等字段,用于指定主机名、请求体的类型和长度等信息。
  • 空行表示请求头部结束。
  • 请求主体为一个 JSON 格式的字符串,包含了用户名和密码的数据。

请注意,请求报文中的每一行都应该以回车符(\r)和换行符(\n)作为行结束符号。请求头部字段和值之间使用冒号和空格进行分隔(例如 Content-Type: application/json)。

以上是 HTTP 请求报文的基本结构,实际的请求报文内容和格式会根据具体的请求需求和要求而有所不同。


HTTP 协议文档

HTTP协议的官方文档是由互联网工程任务组(IETF)发布的一系列文档,主要包括以下两个规范:

  1. HTTP/1.1规范:HTTP/1.1是当前广泛使用的HTTP协议版本。其规范文档定义了HTTP/1.1协议的语义、语法、请求方法、状态码、首部字段、缓存机制等各个方面的内容。HTTP/1.1的规范文档由RFC 2616定义。

    可以通过以下链接访问HTTP/1.1的规范文档:

  2. HTTP/2规范:HTTP/2是HTTP协议的下一代版本,旨在提供更高的性能和效率。它引入了二进制协议、多路复用、头部压缩、服务器推送等新特性。HTTP/2的规范文档由RFC 7540定义。

    可以通过以下链接访问HTTP/2的规范文档:

除了上述主要的HTTP协议规范文档外,IETF还发布了其他与HTTP相关的文档,包括扩展协议、安全性、代理、缓存等方面的规范和建议。

可以通过IETF的官方网站访问这些文档的在线版本:

注意:HTTP/1.1的规范文档(RFC 2616)发布于1999年,并于2014年被废弃。后续对HTTP/1.1的修订和更新工作由HTTPbis工作组负责,并将最新的规范文档发布为一系列独立的RFC文档。因此,最新的HTTP/1.1规范文档应该参考HTTPbis工作组发布的相关文档。


HTTP 表单是什么

HTTP表单(HTTP form)是一种用于在Web应用程序中收集和提交用户数据的机制。它是基于HTTP协议的一种数据传输方式,通过在Web页面上展示给用户一组输入字段(例如文本框、复选框、下拉列表等),用户可以在这些字段中输入数据,并将数据提交到服务器进行处理。

HTTP表单常用于实现用户注册、登录、搜索、提交评论等交互性操作。用户在表单中输入数据后,通过点击提交按钮,表单数据将被封装为HTTP请求发送给服务器。服务器接收到请求后,可以解析表单数据,并根据需要进行相应的处理,例如保存数据到数据库、执行搜索操作、生成动态内容等。

HTTP表单通过使用HTML(Hypertext Markup Language)和一些特定的表单元素来定义和呈现表单。HTML表单元素包括<form>标签、<input>标签、<select>标签、<textarea>标签等,它们用于定义表单的结构、各种输入字段以及提交按钮。

在提交表单时,可以使用不同的HTTP请求方法,常见的有GET和POST方法。GET方法将表单数据附加在URL的查询字符串中,而POST方法将表单数据包含在请求的主体中。这取决于表单的性质和数据的敏感性。

在服务器端,可以使用不同的技术(如PHP、Python、Java等)来处理接收到的表单数据。这些技术提供了解析和处理表单数据的函数、类或库,使开发人员能够轻松地处理表单提交的数据,并进行相应的业务逻辑操作。

总结起来,HTTP表单是一种用于在Web应用程序中收集和提交用户数据的机制,它利用HTML表单元素定义和呈现表单,通过HTTP协议将用户输入的数据发送到服务器进行处理。


HTTP协议 表单数据

HTTP 协议中的表单数据是通过 POST 请求或 GET 请求来传输的,具体的格式和处理方式如下:

  1. GET 请求传输表单数据:
    • 表单数据会被附加在 URL 的查询字符串中,即通过 URL 参数传递。
    • 数据以键值对的形式出现,使用key=value的格式。
    • 多个键值对之间使用&符号进行分隔。
  2. POST 请求传输表单数据:
    • 表单数据会被放置在请求体中,并通过 Content-Type 头部指定数据的编码方式,常见的编码方式有 application/x-www-form-urlencoded 和 multipart/form-data。
    • application/x-www-form-urlencoded 编码方式:
      • 表单数据以键值对的形式出现,使用key=value的格式。
      • 多个键值对之间使用&符号进行分隔。
    • multipart/form-data 编码方式:
      • 表单数据会以多部分的形式进行传输。
      • 每个部分都有自己的头部信息,包括 Content-Disposition 和 Content-Type。
      • 表单字段会出现在各自的部分中,以字段名作为标识。
      • 文件上传时,文件数据会以二进制形式出现在对应的部分中。

对于服务器端的处理,常见的 Web 框架会提供相应的解析和处理表单数据的功能,开发者可以根据框架的文档和要求来编写处理表单数据的代码。

需要注意的是,HTTP 协议的表单数据传输并不加密,因此在传输敏感信息时应使用安全的 HTTPS 协议来保护数据的安全性。

application/x-www-form-urlencoded 详解

application/x-www-form-urlencoded是一种常见的MIME类型,用于在HTTP请求中传输表单数据。它是一种URL编码的数据格式,适用于通过HTTP POST请求将表单数据发送到服务器。

详细解释application/x-www-form-urlencoded的含义如下:

  1. 数据格式:application/x-www-form-urlencoded表示表单数据以URL编码的形式进行传输。它使用特定的编码规则将表单字段和值进行编码,并使用”&”符号分隔字段。例如,假设有一个表单字段name的值为John Doe,编码后的数据格式将是name=John%20Doe

  2. 字符编码:application/x-www-form-urlencoded使用URL编码对特殊字符进行转义。这样可以确保数据能够在HTTP请求中正确传输,不会被解析为URL的特殊字符或者参数分隔符。

  3. 请求方法:application/x-www-form-urlencoded通常与HTTP POST请求方法一起使用。表单数据会被封装在请求的主体部分,并以key=value的形式进行传输。服务器端可以根据具体的编程语言或框架,解析这些键值对数据并进行处理。

  4. Content-Type头部:在HTTP请求中,Content-Type头部用于指定请求主体的媒体类型。当使用application/x-www-form-urlencoded传输表单数据时,可以设置Content-Type头部为application/x-www-form-urlencoded来标识数据格式。

使用示例:

1
2
3
4
5
POST /submit-form HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded

name=John%20Doe&email=johndoe%40example.com&message=Hello%20World

在上述示例中,我们通过HTTP POST请求将表单数据发送到example.com/submit-form路径。请求头部指定了Content-Type: application/x-www-form-urlencoded,表示表单数据以application/x-www-form-urlencoded格式进行传输。请求主体部分包含了编码后的表单数据。

总结:application/x-www-form-urlencoded是一种URL编码的数据格式,常用于HTTP POST请求中传输表单数据。它使用特定的编码规则对字段和值进行编码,并以key=value的形式传输数据。服务器端可以根据Content-Type头部为application/x-www-form-urlencoded来解析和处理这些数据。


HTTP协议 响应报文

HTTP协议中的响应报文包含多个字段,每个字段都有特定的作用和含义。以下是HTTP响应报文中常见的字段及其详细解释:

  1. 状态行(Status Line):状态行包含了HTTP协议的版本号、状态码和状态消息。它的格式如下:
    1
    
    HTTP/1.1 200 OK
    

    其中,HTTP/1.1表示使用的HTTP版本号,200是状态码,OK是状态消息。

  2. 响应头(Response Headers):响应头包含了关于响应的附加信息。它的格式为字段名: 值,每个字段占据一行。常见的响应头字段包括:
    • Content-Type:指定响应体的媒体类型,例如text/html表示HTML文档。
    • Content-Length:指定响应体的长度,以字节为单位。
    • Date:指定响应发送的日期和时间。
    • Server:指定服务器的软件名称和版本号。
    • Set-Cookie:用于在客户端存储会话信息的HTTP Cookie。
  3. 空行(Blank Line):空行用于分隔响应头和响应体。

  4. 响应体(Response Body):响应体包含了实际的响应数据,例如网页的HTML内容或者文件的内容。

需要注意的是,除了以上常见的字段之外,HTTP响应报文还可以包含其他自定义的字段,具体的字段内容和含义可以根据应用程序和服务器的需求进行定义和解析。


HTTP Cache-Control

HTTP的Cache-Control字段用于控制缓存的行为,指示缓存如何处理响应以及如何在将来的请求中使用缓存。Cache-Control字段可以在HTTP请求头和响应头中使用。

在HTTP请求头中,Cache-Control字段用于指示客户端对服务器的请求希望如何进行缓存。常见的指令包括:

  • no-cache:表示客户端要求服务器每次都提供最新的响应,不使用缓存副本。
  • no-store:表示客户端和中间缓存都不应该存储请求或响应的任何副本。
  • max-age=<seconds>:表示响应的有效时间,以秒为单位。客户端可以在这个时间内使用缓存副本而不向服务器发起新的请求。
  • min-fresh=<seconds>:表示客户端希望在指定的时间内获取新的响应,而不使用缓存。如果缓存的响应的新鲜度低于指定的时间,客户端将向服务器发起新的请求。
  • max-stale[=<seconds>]:表示客户端允许使用过期的缓存副本,即使超过了缓存的有效时间。可选的秒数表示允许的最大过期时间。
  • only-if-cached:表示客户端只接受缓存的响应,不向服务器发起新的请求。

在HTTP响应头中,Cache-Control字段用于指示缓存如何处理响应。常见的指令包括:

  • public:表示响应可以被任何缓存(包括客户端和中间缓存)缓存。
  • private:表示响应只能被客户端缓存,中间缓存不能缓存该响应。
  • no-cache:表示响应可以被缓存,但必须先与服务器确认其有效性。
  • no-store:表示响应不能被缓存,客户端和中间缓存都不应该存储该响应。
  • max-age=<seconds>:表示响应的有效时间,以秒为单位。
  • s-maxage=<seconds>:表示响应在共享缓存(如代理服务器)中的有效时间,以秒为单位。

以上是Cache-Control字段的一些常见指令和用法,可以根据具体的需求和情况进行灵活设置,以实现更好的缓存控制和性能优化。


HTTP Cache-control must-revalidate

HTTP头字段”Cache-Control: must-revalidate”用于指示客户端在使用缓存响应之前必须与服务器进行重新验证,即使缓存的响应具有新鲜的过期时间。

当响应中包含”Cache-Control: must-revalidate”指令时,意味着缓存的响应在未经服务器重新验证之前不应被视为有效。客户端必须向服务器发送一个条件请求(通常是带有”If-Modified-Since”或”If-None-Match”头字段),以检查缓存的响应是否仍然有效。

如果服务器以304 Not Modified状态码响应,表示缓存的响应仍然有效,客户端可以使用缓存副本。然而,如果服务器响应了新版本的资源或不同的状态码,客户端需要相应地更新其缓存。

“Cache-Control: must-revalidate”指令在确保缓存的响应是最新且准确的情况下非常有用。通过要求重新验证,它有助于保持客户端和服务器之间的数据一致性。

以下是带有”Cache-Control: must-revalidate”指令的HTTP响应头的示例:

1
2
3
4
HTTP/1.1 200 OK
Cache-Control: must-revalidate
Content-Type: text/html
Content-Length: 1024

在上述示例中,”Cache-Control: must-revalidate”头字段指示客户端在使用缓存响应之前必须重新验证。

需要注意的是,”must-revalidate”只是Cache-Control头字段的一个指令,还可以有其他指令,如”max-age”或”no-cache”等,用于修改缓存行为。这些指令的组合可以提供对特定资源的缓存处理进行精细控制。


HTTP Cache-control max-age

HTTP头字段”Cache-Control: max-age”用于指定缓存的响应在被认为过期之前的最长时间(以秒为单位)。

“max-age”指令用于定义响应的新鲜度期限,即客户端可以在该期限内使用缓存的响应而无需向服务器发送请求。如果一个资源的缓存副本在”max-age”指定的时间内仍然有效,则客户端可以使用该缓存副本而无需向服务器进行请求。

以下是一个使用”Cache-Control: max-age”的HTTP响应头的示例:

1
2
3
4
HTTP/1.1 200 OK
Cache-Control: max-age=3600
Content-Type: text/html
Content-Length: 1024

在上述示例中,”Cache-Control: max-age=3600”指示客户端可以在3600秒(1小时)内使用该缓存的响应而无需向服务器发送请求。如果在此期限内发起的请求与此资源相关,则客户端可以直接使用缓存副本。

“max-age”指令是相对于响应的日期和时间来计算的。当客户端接收到带有”max-age”指令的响应时,它会根据响应的日期和时间以及”max-age”指定的秒数来计算出响应的有效期限。

需要注意以下几点:

  1. “max-age”指令优先级高于其他指令,如”no-cache”或”must-revalidate”。如果同时存在这些指令,”max-age”会覆盖它们。

  2. “max-age”指令不依赖于服务器的时间,而是依赖于响应中的日期和时间。这可以避免因为客户端和服务器之间的时钟不一致而导致缓存失效。

  3. 如果同时存在”Expires”头字段和”max-age”指令,”max-age”优先级更高。”max-age”用于指定相对时间,而”Expires”用于指定绝对时间。

总结起来,”Cache-Control: max-age”指令用于指定缓存的响应在被认为过期之前的最长时间。客户端可以在指定的时间内使用缓存副本而无需发送请求。这可以提高性能并减轻服务器负载,特别是对于不经常更改的静态资源。


HTTP Pragma

HTTP Pragma字段是一种HTTP头字段,用于向服务器传递特定的指令或控制信息。它是HTTP/1.0版本中引入的,目的是为了提供与缓存相关的指令。

在HTTP请求头中,Pragma字段可以用于向服务器发送请求指令。在实践中,Pragma字段很少被使用,因为在HTTP/1.1中引入了更强大和灵活的Cache-Control字段来管理缓存。常见的Pragma指令包括:

  • no-cache:表示客户端要求服务器每次都提供最新的响应,不使用缓存副本。与Cache-Control中的no-cache指令功能类似。

在HTTP响应头中,Pragma字段用于向客户端传递响应的指令或信息。在实践中,Pragma字段同样很少被使用,因为Cache-Control字段已经提供了更广泛和强大的缓存控制功能。

需要注意的是,HTTP/1.1规范中建议不再使用Pragma字段来控制缓存,而是使用Cache-Control字段。因此,当处理HTTP协议时,应优先考虑Cache-Control字段,而将Pragma字段视为过时和不推荐使用的。


HTTP Expires

HTTP Expires字段是一种响应头字段,用于指定响应的过期时间。它告诉客户端在过期时间之前可以直接使用缓存的响应,而无需向服务器发起新的请求。

Expires字段的值是一个日期时间,表示响应的过期时间点。客户端可以在该时间点之前使用缓存的响应。如果客户端在过期时间之后发起请求,缓存将被视为无效,客户端需要向服务器获取最新的响应。

例如,下面是一个使用Expires字段的响应头示例:

1
2
3
HTTP/1.1 200 OK
Content-Type: text/html
Expires: Thu, 17 Jun 2023 12:00:00 GMT

在这个例子中,Expires字段的值是”Thu, 17 Jun 2023 12:00:00 GMT”,表示响应的过期时间为2023年6月17日12:00:00 GMT。在过期时间之前,客户端可以直接使用缓存的响应。

需要注意的是,Expires字段的缺点是它使用的是服务器的时间,而客户端的时间可能与服务器的时间不一致。为了解决这个问题,HTTP/1.1引入了Cache-Control字段,其中的max-age指令提供了更可靠的缓存过期时间控制,并以秒为单位指定相对时间。相比之下,Expires字段更适用于在HTTP/1.0环境下进行缓存控制。在HTTP/1.1中,Cache-Control字段被认为是更优先和更可靠的缓存控制机制。


HTTP Content-Type

HTTP Content-Type是一种HTTP头字段,用于指示传输的实体(如请求体或响应体)的媒体类型(Media Type)。它告诉接收方如何解析和处理实体的内容。

Content-Type字段通常出现在HTTP请求头和响应头中。在请求头中,它指示客户端发送的实体的媒体类型。在响应头中,它指示服务器返回的实体的媒体类型。

Content-Type字段的值通常由两部分组成:

  1. 主类型(Main Type):表示实体的大类,例如文本(text)、图像(image)、音频(audio)、视频(video)、应用程序(application)等。
  2. 子类型(Sub Type):表示主类型下的具体细分,例如文本可以是纯文本(plain)或HTML文档(html),图像可以是JPEG(jpeg)或PNG(png)等。

Content-Type字段的格式如下:

1
Content-Type: 主类型/子类型

例如,下面是一些常见的Content-Type值示例:

  • 文本类型:
    • 纯文本:text/plain
    • HTML文档:text/html
    • XML文档:text/xml
  • 图像类型:
    • JPEG图像:image/jpeg
    • PNG图像:image/png
    • GIF图像:image/gif
  • 音频类型:
    • MP3音频:audio/mpeg
    • WAV音频:audio/wav
  • 视频类型:
    • MPEG视频:video/mpeg
    • MP4视频:video/mp4
  • 应用程序类型:
    • JSON数据:application/json
    • PDF文档:application/pdf

通过Content-Type字段,客户端和服务器可以彼此了解和解释实体的内容类型,从而正确处理和解析数据。这对于正确显示网页、处理文件上传、进行API通信等非常重要。

HTTP Content-Type multipart/x-mixed-replace

HTTP Content-Type字段中的multipart/x-mixed-replace是一种特殊的媒体类型,用于在单个HTTP响应中连续发送多个部分(或实体)。它常用于实时流式传输或服务器推送,其中每个部分都代表一个独立的数据块或事件。

multipart/x-mixed-replace的工作原理是,服务器发送一系列的部分,每个部分都有自己的Content-Type和内容。接收方(通常是浏览器)会逐个解析和处理这些部分,并按照其各自的Content-Type进行相应的处理。

每个部分由一个唯一的分隔符(boundary)分隔。分隔符是一个随机生成的字符串,用于标识部分的起始和结束。在响应中,Content-Type字段中的boundary参数指定了分隔符。

下面是一个示例HTTP响应头,展示了使用multipart/x-mixed-replace的格式:

1
2
HTTP/1.1 200 OK
Content-Type: multipart/x-mixed-replace; boundary=boundary123

在上述示例中,multipart/x-mixed-replace指定了响应使用该媒体类型。boundary=boundary123指定了分隔符为”boundary123”。

响应体的内容将按照以下格式进行发送:

1
2
3
4
5
6
7
8
9
--boundary123
Content-Type: image/jpeg

<JPEG image data>
--boundary123
Content-Type: text/plain

Some text data
--boundary123--

在这个示例中,首先发送了一个JPEG图像部分,然后是一个纯文本部分。每个部分都以--boundary123开头,并以--boundary123--表示结束。

客户端会解析每个部分,并根据各自的Content-Type进行相应的处理,例如显示图像或显示文本数据。

multipart/x-mixed-replace的特点是,在接收到一个部分后,客户端会立即丢弃之前接收到的部分。这使得它适用于实时更新的场景,如视频流、监控摄像头等,因为客户端只处理最新的部分,而不会保留之前的部分。

注意:由于multipart/x-mixed-replace在HTTP/1.1中没有官方标准,不同的实现可能会有差异。因此,对于具体使用情况,最好查阅相关文档或参考实现的要求。


HTTP Content-Length

HTTP Content-Length是一个HTTP响应头字段,用于指示响应体的长度(以字节为单位)。它告诉接收方在接收完指定长度的数据后停止接收,可以用于确定完整的响应体的大小。

Content-Length字段的值是一个十进制整数,表示响应体的字节长度。例如,Content-Length: 1024表示响应体的长度为1024字节。

使用Content-Length字段的好处是接收方可以根据指定的长度来正确读取和处理响应体。这在处理固定长度的数据时非常有用,如文件下载、二进制数据传输等。

以下是一个使用Content-Length字段的HTTP响应头示例:

1
2
3
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 4096

在这个示例中,Content-Length字段的值为4096,表示响应体的长度为4096字节。

需要注意的是,Content-Length字段仅适用于具有确定长度的响应体。对于动态生成的或以流式传输的方式提供的响应,Content-Length字段可能无法准确指示响应体的总长度。在这种情况下,通常使用分块传输编码(chunked transfer encoding)或其他适当的机制来指示响应体的传输方式和结束。

另外,Content-Length字段通常不会出现在HTTP请求头中,因为请求体的长度往往由客户端动态确定,并在请求头中使用Transfer-Encoding或其他字段进行传输长度的指示。


HTTP Connection

HTTP Connection字段(或头字段)是一个HTTP请求头和响应头中的字段,用于指示是否需要在请求或响应完成后关闭TCP连接或保持连接打开。

在HTTP/1.0中,Connection字段的值可以是”keep-alive”或”close”,分别表示保持连接打开或关闭连接。如果使用”keep-alive”,则表示客户端或服务器希望保持TCP连接打开,以便在后续请求或响应中复用该连接。如果使用”close”,则表示请求或响应完成后关闭连接。

以下是一个示例,在HTTP/1.0中使用Connection字段的请求头和响应头:

请求头:

1
2
3
GET /example HTTP/1.0
Host: www.example.com
Connection: keep-alive

响应头:

1
2
3
4
HTTP/1.0 200 OK
Content-Type: text/html
Content-Length: 1024
Connection: close

在HTTP/1.1中,Connection字段的语义有所变化。它成为一个逐跳(hop-by-hop)头字段,用于指示仅对单个连接有效,而不是整个传输链路。常见的Connection字段值包括:

  • “keep-alive”:表示请求或响应后保持连接打开,以便进行后续请求或响应的复用。
  • “close”:表示请求或响应完成后关闭连接。
  • 其他特定的头字段:表示请求或响应中有特定的头字段需要逐跳处理,如”Upgrade”、”Transfer-Encoding”等。

以下是一个示例,在HTTP/1.1中使用Connection字段的请求头和响应头:

请求头:

1
2
3
GET /example HTTP/1.1
Host: www.example.com
Connection: keep-alive

响应头:

1
2
3
4
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1024
Connection: close

需要注意的是,HTTP/1.1默认使用持久连接(persistent connection),即默认情况下会保持连接打开。如果不希望保持连接打开,可以在请求头或响应头中使用”Connection: close”指示关闭连接。

在HTTP/2中,Connection字段被废弃,取而代之的是使用专门的帧(frame)来管理连接的生命周期。连接的打开和关闭由协议自身管理,而不需要应用层显式地指示。

总之,HTTP Connection字段用于指示是否保持连接打开或关闭,具体的语义和行为取决于HTTP协议版本和字段的值。


HTTP 响应报文字段Server

HTTP响应报文中的Server字段是一个可选的响应头字段,用于指示提供HTTP响应的服务器软件或应用程序的名称和版本信息。

Server字段的值通常是服务器软件的名称和版本号的组合。例如,Server: Apache/2.4.29表示使用的是Apache HTTP Server软件的2.4.29版本。

这个字段可以提供有关服务器的一些信息,但并不是强制要求的,因此服务器可以选择是否在响应中包含Server字段。

以下是一个示例HTTP响应头,展示了使用Server字段的格式:

1
2
3
4
HTTP/1.1 200 OK
Server: Apache/2.4.29
Content-Type: text/html
Content-Length: 1024

在上述示例中,Server: Apache/2.4.29指示服务器使用的是Apache HTTP Server软件的2.4.29版本。

需要注意的是,由于Server字段提供了有关服务器的信息,因此在安全性方面需要谨慎处理。恶意用户可能会利用这些信息来进行攻击或针对特定的服务器漏洞。

出于安全性的考虑,一些服务器管理员可能选择隐藏或修改Server字段的值,以减少被攻击的风险。这可以通过配置服务器软件或使用专门的安全模块来实现。

总结:Server字段是HTTP响应报文中的一个可选字段,用于指示提供响应的服务器软件或应用程序的名称和版本信息。它提供了有关服务器的一些信息,但在安全性方面需要注意保护。


HTTP Access-Control-Allow-Origin

HTTP Access-Control-Allow-Origin是一个HTTP响应头字段,用于指示允许访问资源的跨域请求源。

在跨域资源共享(CORS)机制中,浏览器会在发送跨域请求时向服务器发送一个预检请求(OPTIONS请求),以确定是否允许该跨域请求。服务器在预检请求的响应中可以包含Access-Control-Allow-Origin字段,用于指定允许访问资源的来源。

Access-Control-Allow-Origin字段的值可以是以下三种情况之一:

  1. 具体的源:可以指定一个具体的来源,例如Access-Control-Allow-Origin: https://www.example.com,表示只允许来自https://www.example.com的请求访问资源。

  2. 通配符(*):可以使用通配符来表示允许任何来源的请求访问资源,例如Access-Control-Allow-Origin: *

  3. 不包含该字段:如果响应中不包含Access-Control-Allow-Origin字段,或者该字段的值为空,浏览器会阻止跨域请求访问资源。

需要注意的是,服务器返回的Access-Control-Allow-Origin字段仅在预检请求的响应中才起作用。对于实际的跨域请求,浏览器会根据预检请求中的结果来判断是否允许访问资源。

以下是一个示例,展示了Access-Control-Allow-Origin字段的使用:

1
2
3
4
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://www.example.com
Content-Type: text/html
Content-Length: 1024

在上述示例中,Access-Control-Allow-Origin字段的值为https://www.example.com,表示只允许来自该来源的请求访问资源。

通过设置Access-Control-Allow-Origin字段,服务器可以控制哪些跨域请求被允许访问资源,提供了一种基于服务器端的跨域访问控制机制。


HTTP Access-Control-Allow-Methods

HTTP Access-Control-Allow-Methods是一个HTTP响应头字段,用于指示服务器支持的跨域请求方法。

在跨域资源共享(CORS)机制中,浏览器会发送一个预检请求(OPTIONS请求)到服务器,以确定是否允许特定跨域请求。预检请求中会包含一个Access-Control-Request-Method字段,用于指示实际请求所使用的方法(如GET、POST、PUT、DELETE等)。

服务器在预检请求的响应中可以包含Access-Control-Allow-Methods字段,用于指示服务器支持的跨域请求方法。

Access-Control-Allow-Methods字段的值是一个逗号分隔的HTTP方法列表,表示服务器允许的跨域请求方法。例如,Access-Control-Allow-Methods: GET, POST, PUT表示服务器允许使用GET、POST和PUT方法的跨域请求。

以下是一个示例,展示了Access-Control-Allow-Methods字段的使用:

1
2
3
4
5
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://www.example.com
Access-Control-Allow-Methods: GET, POST, PUT
Content-Type: text/html
Content-Length: 1024

在上述示例中,Access-Control-Allow-Methods字段的值为GET, POST, PUT,表示服务器支持GET、POST和PUT方法的跨域请求。

通过设置Access-Control-Allow-Methods字段,服务器可以明确指定支持的跨域请求方法,从而对跨域请求进行细粒度的控制。

需要注意的是,Access-Control-Allow-Methods字段只在预检请求的响应中起作用。对于实际的跨域请求,浏览器会根据预检请求的结果来判断是否允许使用特定的请求方法。

此外,服务器还可以使用其他相关的响应头字段,如Access-Control-Allow-Headers和Access-Control-Allow-Credentials,来进一步控制和配置跨域资源共享。

总结:HTTP Access-Control-Allow-Methods是一个HTTP响应头字段,用于指示服务器支持的跨域请求方法。通过设置该字段,服务器可以明确指定允许的跨域请求方法,实现跨域资源共享的细粒度控制。