文章目录
- 1. HTTP简介
- 2. HTTP工作原理
- 3. HTTP注意事项
- 4. HTTP消息结构
- 5. 客户端请求消息
- 6. 服务器响应消息
- 7. GET传递数据实例
- 8. HTTP请求方法
- 9. HTTP响应头信息
1. HTTP简介
HTTP(超文本传输协议,Hypertext Transfer Protocol)是一种用于传输超文本数据(如HTML、图片、视频等)的应用层协议。它允许互联网上的客户端和服务器之间通过请求和响应进行双向通信。HTTP 是互联网的基石,为 Web 浏览器和 Web 服务器之间的数据交换提供了标准规范。
HTTP 基于请求-响应模型。客户端(通常是 Web 浏览器)向服务器发送请求,请求中包含所需资源的 URL、请求方法(如 GET、POST 等)和可选的其他信息(如头部信息、请求正文等)。服务器接收到请求后,处理并返回一个响应,其中包含响应状态码(如 200 表示成功,404 表示未找到资源等),响应头部信息和响应正文(如HTML文档、图片等)。
HTTP 是无状态协议,这意味着每个请求都是独立的,服务器不会存储关于之前请求的信息。尽管如此,通常会使用 Cookie 等技术在客户端和服务器之间维护状态信息。
HTTP/1.1 是最常用的 HTTP 版本,但随着互联网的发展,HTTP/2 和 HTTP/3(基于 QUIC 协议)等更高效的版本逐渐普及。这些新版本在性能、安全性和可靠性方面进行了改进,以满足现代 Web 应用的需求。
2. HTTP工作原理
HTTP(超文本传输协议)是基于请求-响应模型的应用层协议,用于在客户端(如 Web 浏览器)和服务器之间传输超文本数据(如 HTML、图片、视频等),它工作于客户端-服务端架构上。浏览器作为 HTTP 客户端通过 URL 向 HTTP 服务端
即 WEB 服务器发送所有请求。
Web 服务器有:Apache 服务器,IIS 服务器(Internet Information Services)等。
Web 服务器根据接收到的请求后,向客户端发送响应信息。
HTTP 默认端口号为 80,但是你也可以改为 8080 或者其他端口。
下面是 HTTP 的工作原理的详细介绍:
-
建立连接:
客户端(如浏览器)首先需要与服务器建立连接。在 HTTP/1.1 中,这通常通过建立一个 TCP 连接来实现。而在 HTTP/3 中,使用基于 UDP 的 QUIC 协议建立连接。连接建立后,客户端和服务器可以进行双向通信。 -
发送请求:
客户端向服务器发送一个 HTTP 请求。请求包含以下几个部分:- 请求行:包括请求方法(如 GET、POST 等)、请求的 URL(统一资源定位符)和 HTTP 版本。
- 请求头部:包含一些描述请求的元数据,例如客户端类型(User-Agent)、支持的内容类型(Accept)等。
- 空行:用于分隔请求头部和请求正文。
- 请求正文(可选):包含要发送给服务器的数据,例如 POST 请求中的表单数据。
-
服务器处理请求:
接收到请求后,服务器会解析请求并根据请求内容进行处理。这可能包括查询数据库、执行服务器端脚本等操作。 -
发送响应:
服务器处理完请求后,会向客户端发送一个 HTTP 响应。响应包含以下几个部分:- 状态行:包括 HTTP 版本、状态码(如 200 表示成功,404 表示未找到资源等)和状态描述。
- 响应头部:包含一些描述响应的元数据,例如内容类型(Content-Type)、内容长度(Content-Length)等。
- 空行:用于分隔响应头部和响应正文。
- 响应正文:包含要返回给客户端的数据,例如 HTML 文档、图片、视频等。
-
关闭连接:
在数据传输完成后,客户端和服务器根据请求头部中的“Connection”字段来决定是保持连接(keep-alive)以便后续请求复用,还是关闭连接。在 HTTP/1.0 中,默认为关闭连接,而在 HTTP/1.1 及以后的版本中,默认为保持连接。
3. HTTP注意事项
-
了解 HTTP 的无连接性:HTTP 是无连接协议,这意味着每次连接只处理一个请求。服务器处理完客户的请求并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。但请注意,在 HTTP/1.1 及以后的版本中,默认使用“keep-alive”机制,可让连接在处理多个请求时保持打开状态,以减少建立和关闭连接所需的时间和资源消耗。
-
理解 HTTP 的媒体独立性:HTTP 是媒体独立的,这意味着只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过 HTTP 发送。客户端以及服务器指定使用适合的 MIME-type 内容类型。确保使用正确的 MIME 类型以便正确传输和处理数据。
-
认识 HTTP 的无状态性:HTTP 是无状态协议,这意味着协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。为了在客户端和服务器之间维护状态信息,可以使用 Cookie 等技术。
-
选择合适的请求方法:使用正确的 HTTP 请求方法(如 GET、POST、PUT、DELETE 等)是非常重要的。例如,GET 方法用于获取资源,而 POST 用于创建或修改资源。使用正确的请求方法有助于遵循 RESTful 架构原则,提高应用的可维护性和可扩展性。
-
使用 HTTPS:为了保护数据的安全性和隐私,建议使用 HTTPS(HTTP 安全)而非 HTTP。HTTPS 在 HTTP 上添加了 SSL/TLS 加密层,确保数据在传输过程中的安全性和完整性。
-
有效利用缓存:使用缓存机制(如 ETag、Cache-Control 等)可以提高性能和减轻服务器负载。合理设置缓存策略可以确保客户端在需要时获取最新数据,同时避免不必要的请求。
-
遵循 HTTP 状态码规范:正确使用 HTTP 状态码可以帮助客户端更好地理解服务器响应。例如,使用 200 表示成功,404 表示资源未找到,500 表示服务器内部错误等。遵循状态码规范可以提高应用的可维护性和可读性。
-
优化请求和响应头部:减小请求和响应头部的大小可以降低延迟和带宽消耗。移除不必要的头部信息、使用压缩等方法可以优化头部传输。
-
使用更高效的 HTTP 版本:尽量使用较新的 HTTP 版本(如 HTTP/2 或 HTTP/3),这些版本在连接管理、数据传输等方面进行了优化,以提高性能和可靠性。
-
限制和管理并发请求:合理设置并发请求的数量和速率可以避免服务器过载。可以使用队列、限流等技术来实现并发请求的管理。
-
避免使用明文传输敏感数据:在发送包含敏感信息(如密码、身份证号等)的请求时,务必使用加密技术(如 HTTPS、加密算法等)来确保数据的安全性。
-
使用身份验证和授权:为了保护资源的安全性,使用合适的身份验证(如基本认证、OAuth2 等)和授权机制来控制对资源的访问。
-
了解跨域限制:浏览器的同源策略限制了不同源之间的资源访问。了解 CORS(跨域资源共享)策略及其限制可以帮助正确处理跨域请求。
4. HTTP消息结构
HTTP(超文本传输协议,Hypertext Transfer Protocol)是基于客户端/服务器端(Client/Server, C/S)架构模型的应用层协议,其主要作用是在互联网上进行信息交流。HTTP 是一种无状态的请求/响应协议,意味着服务器不会保存关于客户端的请求历史信息。
HTTP 客户端通常是一个应用程序,例如 Web 浏览器或其他类型的客户端软件。客户端通过建立连接来向服务器发送一个或多个 HTTP 请求,获取所需资源或执行特定操作。
HTTP 服务器则是另一种应用程序,通常是 Web 服务程序,如 Apache Web 服务器或 Microsoft Internet Information Services (IIS) 等。服务器负责接收客户端的请求,并根据请求内容生成并发送 HTTP 响应数据。
HTTP 使用统一资源标识符(Uniform Resource Identifiers, URI)来定位和访问资源。URI 提供了一种简单的方式来识别互联网上的资源,并通过网络传输数据和建立连接。
在建立连接之后,HTTP 数据消息会通过类似于 Internet 邮件所使用的格式(RFC5322)和多用途 Internet 邮件扩展(MIME,RFC2045)进行传输。这些格式和扩展为数据传输提供了结构化的信息描述和编码方式,使得HTTP能够处理各种类型的数据,如文本、图片、音频、视频等。
HTTP 消息结构包括请求和响应两种类型。它们都有相似的结构,主要由三个部分组成:起始行、头部和正文。下面将会分别进行介绍。
在实际传输过程中,HTTP 消息通常会被压缩或分块传输,以提高传输效率。但其基本结构保持不变。
5. 客户端请求消息
- 请求行:包括请求方法(如 GET、POST 等)、请求的 URL(统一资源定位符)和 HTTP 版本。例如:
GET /index.html HTTP/1.1
。 - 请求头部:包含一些描述请求的元数据,例如客户端类型(User-Agent)、支持的内容类型(Accept)等。每个头部字段包含一个字段名和字段值,用冒号(:)分隔。头部字段之间用换行符分隔。
- 空行:用于分隔请求头部和请求正文,由一个换行符表示。
- 请求正文(可选):包含要发送给服务器的数据,例如 POST 请求中的表单数据。请求正文仅在某些请求方法(如 POST、PUT 等)中使用。
6. 服务器响应消息
- 状态行:包括 HTTP 版本、状态码(如 200 表示成功,404 表示未找到资源等)和状态描述。例如:
HTTP/1.1 200 OK
。 - 响应头部:包含一些描述响应的元数据,例如内容类型(Content-Type)、内容长度(Content-Length)等。头部字段的结构与请求头部相同。
- 空行:用于分隔响应头部和响应正文,由一个换行符表示。
- 响应正文:包含要返回给客户端的数据,例如 HTML 文档、图片、视频等。根据请求和服务器处理结果,响应正文的内容和长度可能会有所不同。
7. GET传递数据实例
在这个示例中,我们将请求一个名为 “example.html” 的网页。
客户端请求内容:
GET /example.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
服务器响应内容:
HTTP/1.1 200 OK
Date: Tue, 02 May 2023 10:30:00 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
Last-Modified: Mon, 01 May 2023 12:00:00 GMT
ETag: "3a012-58e1f422b5c10"
Accept-Ranges: bytes
Content-Length: 1024
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Vary: Accept-Encoding
<!DOCTYPE html>
<html>
<head>
<title>Example Page</title>
</head>
<body>
<h1>Welcome to the Example Page!</h1>
<p>This is an example of a simple HTML page.</p>
</body>
</html>
输出结果:
当客户端(如 Web 浏览器)接收到服务器的响应后,它会将响应内容渲染为可视化页面。在这个例子中,输出结果将显示一个简单的 HTML 页面,包含一个标题 “Welcome to the Example Page!” 和一段文本 “This is an example of a simple HTML page.”。
8. HTTP请求方法
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 用于请求指定的资源,不会对数据产生任何影响。只获取资源的信息。 |
2 | POST | 用于提交数据到指定资源。可能会导致服务器状态的变化或数据的改变。 |
3 | PUT | 用于更新指定资源的全部内容。如果资源不存在,则创建资源。 |
4 | PATCH | 用于对资源进行部分更新。仅更新资源的部分内容。 |
5 | DELETE | 用于删除指定的资源。删除资源后,资源将不再可访问。 |
6 | HEAD | 类似于 GET 请求,但只请求资源的头部信息,不返回资源的主体内容。 |
7 | OPTIONS | 用于描述指定资源的通信选项。返回服务器支持的 HTTP 请求方法。 |
8 | CONNECT | 用于建立网络连接,通常用于 HTTPS 或代理服务器。 |
9 | TRACE | 请求服务器回显收到的请求信息,主要用于调试。 |
9. HTTP响应头信息
HTTP 请求头提供了关于请求,响应或者其他的发送实体的信息。
在本章节中我们将具体来介绍 HTTP 响应头信息。
序号 | 应答头 | 说明 |
---|---|---|
1 | Accept-Ranges | 表明服务器是否支持请求的资源范围。 |
2 | Age | 从源服务器到代理缓存形成的估算时间(以秒为单位)。 |
3 | Allow | 提供对给定资源可用的请求方法的列表。 |
4 | Cache-Control | 指定请求和响应遵循的缓存机制。 |
5 | Connection | 控制网络连接的选项,如“keep-alive”保持连接或“close”关闭连接。 |
6 | Content-Encoding | 指定已应用于响应正文的编码。 |
7 | Content-Language | 描述资源所使用的自然语言。 |
8 | Content-Length | 表示响应正文的字节长度。 |
9 | Content-Location | 指示资源可在哪里找到的替代位置。 |
10 | Content-Disposition | 指示响应的附件的文件名和保存方式。 |
11 | Content-MD5 | 提供响应体的MD5校验和,用于校验数据完整性。 |
12 | Content-Type | 描述响应正文的媒体类型。 |
13 | Date | 响应生成的日期和时间。 |
14 | ETag | 表示资源的特定版本的标识符。 |
15 | Expires | 描述响应中资源过期的日期和时间。 |
16 | Last-Modified | 指示资源的最后修改日期和时间。 |
17 | Link | 表示资源之间的关系。 |
18 | Location | 用于重定向用户代理到新的资源位置。 |
19 | P3P | 表示网站的隐私策略。 |
20 | Pragma | 提供实现特定的指令,如禁用缓存。 |
21 | Proxy-Authenticate | 指示客户端必须对代理进行身份验证。 |
22 | Refresh | 定期刷新页面的时间间隔。 |
23 | Retry-After | 指示客户端应等待多长时间(秒)再次尝试请求。 |
24 | Server | 描述响应服务器的名称和版本。 |
25 | Set-Cookie | 将一个或多个Cookie设置到客户端。 |
26 | Strict-Transport-Security | 告知浏览器仅通过安全连接(如HTTPS)访问站点。 |
27 | Transfer-Encoding | 指定已应用于消息正文的传输编码。 |
28 | Vary | 告知代理服务器如何选择合适的缓存响应。 |
29 | Via | 指示请求经过的代理服务器。 |
30 | Warning | 提供关于消息的可能问题或附加信息。 |
31 | WWW-Authenticate | 指示客户端必须进行身份验证。 |