概述
超文本传输协议 (HTTP) 是一种用于分布式、协作式、超媒体信息系统的应用级协议。这是1990年以来万维网 (即因特网) 数据通信的基础。HTTP 是一种通用
和无状态的协议, 它可以用于其他目的, 以及使用其请求方法、错误代码和标头的扩展。基本上, HTTP 是一种基于 tcp/ip 的通信协议, 用于在万维网上传送数据
(HTML 文件、图像文件、查询结果等)。默认端口为 TCP 80, 但也可以使用其他端口。它为计算机提供了一种标准化的通信方式。HTTP 规范指定如何构造客户端的
请求数据并将其发送到服务器, 以及服务器如何响应这些请求。
基本功能
基本结构
下图显示了 web 应用程序的一个非常基本的体系结构, 并描述了 HTTP 所处的位置:
http 协议是一种请求/响应协议, 基于基于客户端/服务器的体系结构, 其中 web 浏览器、机器人和搜索引擎等行为类似于 http 客户端, web 服务器充当服务器。
Client
HTTP 客户端以请求方法、URI 和协议版本的形式向服务器发送请求, 后跟一个类似 MIME 的消息, 其中包含请求修饰符、客户端信息以及通过 tcp/ip 连接的可能的正文内容。
Server
HTTP 服务器使用状态行进行响应, 包括消息的协议版本和成功或错误代码, 后跟类似 MIME 的消息, 其中包含服务器信息、实体元和可能的实体正文内容。
PARAMETERS
这里将列出一些重要的 HTTP 协议参数以及它们在通信中使用的语法。例如, 日期格式、URL 格式等。这将帮助您在编写 HTTP 客户端或服务器程序时构造请求和响应消息。
HTTP VERSION
HTTP 使用 <major>. <minor> 编号方案来指示协议的版本。http 消息的版本由第一行中的 http 版本字段指示。下面是指定 HTTP 版本号的一般语法:
HTTP-Version = "HTTP" "/" 1*DIGIT "." 1*DIGIT
统一资源标识符
统一资源标识符 (URI) 是简单格式化的, 包含名称、位置等的 case-insensitive 字符串, 用于标识资源, 例如网站、web 服务等。用于 HTTP 的 URI 的一般语法如下:
URI = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]
如果端口为空或未给定, 则假定端口80为 HTTP, 空 abs_path 等效于 "/" 的 abs_path。在保留的和不安全的集合中的字符与它们的 "%" 十六进制十六进制编码等效。
时间格式
所有 HTTP 日期/时间戳都必须以格林尼治标准时间 (GMT) 表示, 无例外。允许 HTTP 应用程序使用下列三个日期/时间戳表示法:
Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
编码
我们使用字符集来指定客户端首选的字符集。可以列出多个字符集, 用逗号分隔。如果未指定值, 则默认为 US ASCII。
内容编码
内容编码值表示在通过网络传递内容之前, 已使用编码算法对其进行编码。内容编码是主要用于允许文档被压缩或在不丢失身份的情况下进行有用的转换。所有的内容
编码值都是 case-insensitive 的。HTTP/1.1 在接受编码和内容编码标头字段中使用内容编码值, 我们将在后面的章节中看到。
类型媒体
HTTP 在内容类型中使用 Internet 媒体类型并接受标头字段, 以便提供开放式和可扩展的数据类型和文字协商。所有媒体类型的值都在 Internet 指定的数字颁发机构 (IANA)
中注册。指定媒体类型的常规语法如下:
media-type = type "/" subtype *( ";" parameter )
如:
Accept: image/gif
语言标签
HTTP 在接受语言和内容语言字段中使用语言标记。语言标记由一个或多个部分组成: 主要语言标记和可能的空系列子:
language-tag = primary-tag *( "-" subtag )
标签内不允许空格, 所有标签都是 case-insensitive 的。其中任何两个字母的主标签是一个 ISO-639 的语言缩写和任何两个字母的初始子是一个 ISO-3166 国家代码。
消息
HTTP-message = <Request> | <Response> ; HTTP/1.1 messages
http 请求和 http 响应使用 RFC 822 的通用消息格式来传输所需的数据。此通用邮件格式包括以下四项。
A Start-line
Zero or more header fields followed by CRLF
An empty line (i.e., a line with nothing preceding the CRLF) indicating the end of the header fields
Optionally a message-body
起始行将具有以下通用语法:
start-line = Request-Line | Status-Line
我们将在讨论 http 请求和 http 响应消息时分别讨论请求行和状态行。现在, 让我们看看在请求和响应的情况下开始行的示例:
GET /hello.htm HTTP/1.1 (This is Request-Line sent by the client)
HTTP/1.1 200 OK (This is Status-Line sent by the server)
Header Field
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.example.com
Accept-Language: en, mi
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
如您对我写的内容感兴趣,可扫描如下二维码关注我的公众号,谢谢!!!