HTTP基于客户端 - 服务器体系结构模型和无状态请求/响应协议该协议通过可靠的TCP/IP连接交换消息来运行。
HTTP 客户端是为了发送一个或多个HTTP请求消息而与服务器建立连接的程序(Web浏览器或任何其他客户端)。HTTP“服务器”是一个程序(通常是Web服务器,如Apache Web服务器或Internet信息服务IIS等),它接受连接以通过发送HTTP响应消息来提供HTTP请求。
HTTP利用统一资源标识符(URI)来标识给定资源并建立连接。建立连接后,HTTP消息的传递格式类似于Internet邮件[RFC5322]和多用途Internet邮件扩展(MIME)[RFC2045]所使用的格式。这些消息包括从客户端到服务器的请求以及从服务器到客户端的响应,其具有以下格式 -
HTTP-message = <Request> | <Response> ; HTTP/1.1 messages
HTTP请求和HTTP响应使用RFC 822的通用消息格式来传输所需的数据。此通用消息格式包含以下四个项目 -
- 一个起始行
- 零个或多个标题字段后跟CRLF
- 空行(即,CRLF之前没有任何内容的行),表示标题字段的结尾
- 可选的消息体
以下部分将解释HTTP消息中使用的每个实体。
消息起始行
起始行将具有以下通用语法 -
start-line = Request-Line | Status-Line
我们将分别讨论HTTP请求,以及HTTP响应消息时的Request-Line
和Status-Line
。现在让我们看一下请求和响应的起始行示例 -
GET /hello.html HTTP/1.1 (这是客户端发送的Request-Line)
HTTP/1.1 200 OK (这是服务器发送的状态行)
标头字段
HTTP标头字段提供有关请求或响应的所需信息,或有关在邮件正文中发送的对象的信息。有以下四种类型的HTTP消息头 -
- 通用标头 - 这些标头字段具有用于请求和响应消息的一般适用性。
- 请求标头 - 这些标头字段仅适用于请求消息。
- 响应标头 - 这些标头字段仅适用于响应消息。
- 实体标头 - 这些标头字段定义有关实体主体的元信息,或者,如果没有主体,则定义元信息。
所有上述标题都遵循相同的通用格式,每个标题字段由一个名称后跟冒号(:
)和字段值组成,如下所示 -
message-header = field-name ":" [ field-value ]
以下是各种标题字段的示例 -
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.xuhuhu.com
Accept-Language: en, mi
Date: Mon, 27 Jul 2019 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2019 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
消息正文
消息正文部分对于HTTP消息是可选的,但如果它可用,则它用于携带与请求或响应相关联的实体主体。如果实体主体是关联的,那么通常Content-Type
和Content-Length
标题行指定相关主体的性质。
消息体是承载来自服务器的实际HTTP请求数据(包括表单数据和上传等)和HTTP响应数据的消息体(包括文件,图像等)。以下是一个HTML格式消息正文的简单内容 -
<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>