62、探索超文本传输协议(HTTP):原理与应用

探索超文本传输协议(HTTP):原理与应用

1. 超文本与HTML基础

超文本标记语言(HTML)是互联网中广泛使用的一种标准标记语言。标记语言是一种在普通字符集(如ASCII)中呈现文档的方法,通过嵌入文本中的标签来提供格式化指令,这些标签能与文本轻松区分,并告知显示或打印文档的应用程序如何操作。例如,熟悉C语言字符串的程序员会认识到转义字符“/”和参数格式字符“%”就是标签的形式。

所有文字处理器在生成文档时都会使用某种形式的标签来表示格式,但这些标签通常采用专有编码,导致文档保存到磁盘时为二进制形式,其他应用程序难以或无法解释。而HTML使用具有通用且易懂含义的标准标签集,任何应用程序都能读取HTML文件并理解其中的格式化指令。此外,HTML将标签可用的字符集限制为可打印字符,使得即使是简单的文本编辑器也能读取HTML文档。

HTML文档的精确布局由读取该文档的应用程序负责。应用程序可以选择限制对某些标签的支持,或将其他标签映射到相同的输出样式。标签的标准含义使应用程序能够轻松生成一致且清晰的输出。

2. 统一资源定位符(URLs)

超文本链接提供了一种在文档或同一文档的不同部分之间进行点击引用的功能。当用户点击链接时,浏览器会重定向到同一文档中的另一段文本或另一个文件。简单的超文本链接可能指向单个文档内的标签或标记。如果链接跳转到另一个文件,链接目标必须表示为路径名、文件名和标签。如果链接将读者带到存储在另一台计算机上的文件,目标表示还必须包括存储该文件的主机的标识符。

统一资源定位符(URLs)在RFC 1738中定义,它基于主机名的定义。每个URL指示用于访问资源的服务(如HTTP、电子邮件或FTP)、主机位置(以IP地址或主机名表示)、访问目标主机上服务器的端口(即TCP或UDP端口号)以及资源的路径和文件名。常见的URL抽象表示如下:
- file://[<host_name_or_address>]/<path_and_file_name>
- http://<host_name_or_address> [:<port>]/<path_and_file_name> [<additional_tags>]
- mailto:<user_name> @ <host_name_or_address>
- gopher://<host_name_or_address> [:<port>]/<path_and_file_name>
- telnet://<user> [:<password>] @ <host_name_or_address> [:<port>]

URL是统一资源标识符(URIs)的子集,可用于以唯一且全球可识别的方式标识任何对象、文件或人员。URL的特殊之处在于它包含访问所标识资源的方法。当用户在应用程序的命令提示符中输入URL,或点击引用URL的超文本链接时,应用程序会使用服务类型来确定使用何种应用协议和方法访问链接,然后使用主机名或IP地址将应用协议定向到正确的位置。如果提供了主机名,应用程序必须使用DNS将名称解析为IP地址。HTTP URL还可能包含额外的标签,如“?”用于表示用户填写表单后形成的URL的一部分,“#”用于指示指定文件内的位置标记标签。

3. HTTP的诞生与概述

早期用于访问远程存储文档的应用协议Gopher,它允许用户搜索和检索远程站点上的文档,最初具有基于菜单的用户界面,用户可以选择主机、路径或文件进行搜索或检索。但随着图形用户界面的普及,Gopher显得明显不足,它的菜单界面无法与精美的图形相媲美,更重要的是它没有将文档浏览与文档检索集成在一起。

因此,利用HTML提供的机会,开发了Web浏览器,为用户提供了可以访问和浏览远程存储文件的高功能应用程序。随着Web浏览器功能的增加,需要发明一种新的协议来与存储文件的服务器进行通信,这就是超文本传输协议(HTTP)。

RFC 2616将HTTP描述为“一种通用的、无状态的协议,可用于超文本之外的许多任务”。该协议使用请求和响应机制,客户端希望在远程服务器上执行某些操作时,使用TCP向服务器的默认端口80发送请求并等待回复。每个请求或回复消息使用HTTP消息头,其后可能跟随使用多用途互联网邮件扩展(MIME)编码的消息体。HTTP应用程序可以选择使用KeepAlive交换,以便在长时间无操作时保持TCP连接打开。

4. HTTP的角色与参与者

HTTP中的客户端通常被称为用户代理,存储用户访问数据的服务器称为源服务器,数据本身称为实体。客户端不一定直接连接到源服务器,也可以使用代理服务器的服务。代理服务器是一个中间程序,它既作为客户端的服务器,又作为源服务器的客户端,并代表客户端发出请求。代理服务器可以原封不动地转发请求,也可以为客户端增加价值。代理服务器常用于提供对私有网络的进出访问,既为了安全,也为了只在服务器上进行DNS解析。

网关服务器也介于客户端和源服务器之间,但它通过返回请求的数据,使客户端可能不知道自己正在与网关而不是源服务器通信。网关服务器通过从源服务器检索数据(可能使用除HTTP之外的其他协议)并进行内容转换,使数据符合客户端请求的形式,从而增加价值。

代理服务器和网关服务器可以缓存之前根据客户端请求检索的实体。如果是这种情况,客户端的请求可以更快地得到处理,而无需与源服务器交换请求和响应。缓存条目有一个由源服务器在首次发送数据时指定的有限生命周期,客户端也可以要求使用源服务器的真实数据而不是缓存条目来处理请求。

5. HTTP请求方法

HTTP请求方法是客户端可以向服务器请求执行的操作,以下是常见的HTTP请求方法及其用途:
| 请求方法 | 用途 |
| ---- | ---- |
| OPTIONS | 向服务器请求有关从客户端到服务器路径上的通信选项的信息,允许客户端在不启动对资源的操作的情况下了解其对资源和服务器的选项。 |
| GET | 是Web浏览期间HTTP的主要用途,用于检索请求中URL标识的实体。GET请求可以通过附加参数进行限定,例如仅在对象自指定日期或时间以来已(或未)修改,或者对象存储的标签与请求中提供的标签匹配(或不匹配)时才检索数据。GET请求也可以限制为部分GET,只请求传输实体的一部分。GET请求响应中返回的实体可以由网关和代理服务器根据响应中给出的权限和生命周期进行缓存。 |
| HEAD | 与GET相同,只是服务器在响应中不返回任何实体数据。可用于了解数据大小和编码,以确定是否有必要开始实际传输,也可用于确定实体的缓存版本是否仍然是最新的。 |
| POST | 支持客户端向公告板发布消息等功能,也包括将填写好的表单返回给服务器进程。在所有情况下,上传到服务器的数据都从属于之前使用GET从服务器检索的资源。 |
| PUT | 客户端使用PUT方法独立地将数据存储在服务器上,与POST操作不同,因为它不依赖于之前的GET请求。通过这种方式存储在服务器上的实体可以在请求通过时由代理服务器和网关服务器进行缓存,以便在其他客户端的GET请求时可用。请注意,如果服务器请求失败,应删除缓存副本。 |
| DELETE | 用于客户端从服务器删除资源。当网关和代理服务器处理成功响应时,它们也应从其缓存中删除已删除实体的副本。 |
| TRACE | 用于调用请求消息的远程应用层回环。请求的最终接收者应将收到的消息作为OK响应的实体主体返回给客户端。 |
| CONNECT | 保留供可以为其他协议进行请求隧道传输的代理服务器使用。 |

6. 多用途互联网邮件扩展(MIME)

许多应用层协议(如用于电子邮件和Web访问的协议)是基于字符的。它们交换字节,但这些字节被假定为限于可打印或控制打印的有限字符集,每个8位字节仅使用低7位。这种方式在交换简单的可打印文本时没问题,甚至在数据包含使用基于文本的标签系统(如HTML)编码的格式化指令时也可以,但它不允许协议交换二进制文件,如图像、音频剪辑或可执行文件。这些文件使用每个字节的所有8位,任何将它们视为可打印文本的尝试都会导致数据损坏,因为每个字节的最高位会被丢弃。这些限制甚至适用于使用扩展字符集以支持外语中带重音字母的文本文件。

解决方案是使用多用途互联网邮件扩展(MIME)。MIME允许使用标准头描述数据体,然后通过映射到可打印字符集来呈现数据。MIME支持三种基本编码:
1. 7位纯文本:表示数据仅包含可打印字符。
2. 可引用打印:主要由可打印字符组成,偶尔包含以转义字符“= ”后跟一个8位二进制数据字节表示的打印控制字符。
3. base64编码:用于传输二进制文件,每3个8位二进制数据字节被映射为4个7位可打印字符。该过程比最初看起来要复杂,需要五个RFC(2045 - 2049)来全面描述。其基本原理是将源二进制字节分组为3字节序列,并逐位映射到一组4个索引字节的低6位,这些索引用于从可接受的有效负载字符集中生成四个字符序列。该过程可以使用相同的查找表进行反向操作。

7. HTTP消息格式

HTTP是一种应用层协议,其消息基于文本。每条消息的控制部分由一系列字段组成,每个字段都是一个文本字符串标签,而有效负载(如正在传输的文件)则使用MIME进行编码。

每条HTTP消息使用RFC 822定义的应用程序文本消息的标准编码,即由通用请求或状态头、任意数量的消息头和消息体组成,如下所示:

generic-message::=
(Request-Line | Status-Line)
*(message-header CRLF)
CRLF
[message-body]

请求行和状态行分别用于区分请求和响应:

Request-Line::=
Request-Method SP Request-URI SP HTTP-Version CRLF
Status-Line::=
HTTP-Version SP Status-Code SP Reason-Phrase CRLF
HTTP-Version: =
“HTTP” “/” 1*DIGIT “.” 1*DIGIT

请求方法是客户端希望在服务器上执行的操作,以单字标签编码;请求URI指定执行请求操作的统一资源定位符。状态码是一个三位响应码,指示请求的结果,第一位数字表示结果的类别,如下表所示:
| 状态码第一位 | 含义 |
| ---- | ---- |
| 1 | 信息性。请求已收到,正在继续处理 |
| 2 | 成功。请求已成功收到、理解并接受 |
| 3 | 重定向。客户端必须采取进一步行动才能完成请求 |
| 4 | 客户端错误。请求包含错误语法,服务器无法满足 |
| 5 | 服务器错误。服务器未能满足看似有效的请求 |

第二位和第三位数字给出详细的响应代码,常见的HTTP响应状态代码如下:
| 状态码 | 含义 | 状态码 | 含义 |
| ---- | ---- | ---- | ---- |
| 100 | 继续 | 404 | 未找到 |
| 101 | 切换协议 | 405 | 方法不允许 |
| 200 | OK | 406 | 不可接受 |
| 201 | 创建 | 407 | 代理认证所需 |
| 202 | 已接受 | 408 | 请求超时 |
| 203 | 非权威信息 | 409 | 冲突 |
| 204 | 无内容 | 410 | 已消失 |
| 205 | 重置内容 | 411 | 长度必需 |
| 206 | 部分内容 | 412 | 前提条件失败 |
| 300 | 多个选择 | 413 | 请求实体太大 |
| 301 | 永久移动 | 414 | 请求URI太大 |
| 302 | 找到 | 415 | 不支持的媒体类型 |
| 303 | 查看其他 | 416 | 请求范围不可满足 |
| 304 | 未修改 | 417 | 期望失败 |
| 305 | 使用代理 | 500 | 内部服务器错误 |
| 307 | 临时重定向 | 501 | 未实现 |
| 400 | 错误请求 | 502 | 错误网关 |
| 401 | 未授权 | 503 | 服务不可用 |
| 402 | 需要付款 | 504 | 网关超时 |
| 403 | 禁止 | 505 | HTTP版本不支持 |

原因短语包含用户可见的文本,用于解释错误或状态,文本可以跨多行,但不能包含回车符,以免与状态行的结尾混淆。

请求消息由请求行、一个或多个从通用头、请求头和实体头中选择的消息头以及可选的消息体组成;响应消息由状态行、一个或多个从通用头、响应头和实体头中选择的消息头以及可选的消息体组成。每个消息头以一个单字标签后跟冒号分隔符的通用格式开始。

8. HTTP示例消息和事务

以下是一个HTTP使用的简单示例:用户希望访问网页 http://www.elsevier.com/index.html ,即从服务器 www.elsevier.com 的根目录读取 index.html 文件。客户端连接到代理服务器 proxy.yournetwork.net ,该代理服务器负责通过检索缓存实体或将请求转发到源服务器来处理请求。

客户端发送的请求示例:

GET www.elsevier.com/index.html HTTP/1.1

服务器可能返回的响应示例:

HTTP/1.1 408 Server timed out attempting to service request

这个示例展示了HTTP请求和响应的基本流程,客户端发送请求,服务器根据请求进行处理并返回相应的状态码和原因短语。在实际应用中,HTTP的使用更为复杂,涉及更多的请求方法、消息头和错误处理,但基本原理是相同的。通过理解HTTP的这些核心概念和机制,我们可以更好地开发和优化Web应用程序,提高用户体验和系统性能。

探索超文本传输协议(HTTP):原理与应用

9. HTTP事务流程

HTTP事务是客户端与服务器之间的一次完整交互,包括请求和响应两个阶段。下面是一个简化的HTTP事务流程 mermaid 流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px

    A([客户端发起请求]):::startend --> B{请求是否需要代理}:::decision
    B -->|是| C(通过代理服务器转发请求):::process
    B -->|否| D(直接向源服务器发送请求):::process
    C --> E(源服务器接收请求):::process
    D --> E
    E --> F{请求是否可由缓存满足}:::decision
    F -->|是| G(从缓存获取数据):::process
    F -->|否| H(源服务器处理请求):::process
    G --> I(返回响应给客户端):::process
    H --> I
    I --> J([客户端接收响应]):::startend

这个流程图展示了HTTP事务的基本步骤:
1. 客户端发起请求:用户在浏览器中输入URL或点击超链接,触发HTTP请求。
2. 代理判断:客户端检查是否需要通过代理服务器发送请求。
3. 请求转发:如果需要代理,请求会先发送到代理服务器,由代理服务器转发到源服务器;否则直接发送到源服务器。
4. 缓存检查:源服务器或代理服务器检查缓存中是否有请求的资源。
5. 数据获取:如果缓存中有可用资源,直接从缓存中获取;否则源服务器处理请求并生成响应。
6. 响应返回:将响应发送回客户端。
7. 客户端接收:客户端接收响应并进行处理。

10. HTTP的性能优化

为了提高HTTP的性能,可以采取以下一些优化策略:
- 压缩数据 :使用Gzip等压缩算法对响应数据进行压缩,减少数据传输量。例如,服务器可以在响应头中添加 Content-Encoding: gzip 来指示数据已压缩。
- 缓存策略 :合理设置缓存头,如 Cache-Control Expires ,让客户端和代理服务器可以缓存资源,减少重复请求。例如,对于静态资源(如图片、CSS、JavaScript文件),可以设置较长的缓存时间。
- 合并文件 :将多个CSS或JavaScript文件合并为一个文件,减少HTTP请求次数。例如,将多个CSS文件合并为一个 styles.css 文件。
- 使用CDN :内容分发网络(CDN)可以将资源分发到离用户较近的节点,加快资源加载速度。例如,使用CDN来提供jQuery库。
- 优化请求头 :减少请求头的大小,避免不必要的头信息。例如,移除一些不必要的自定义头。

11. HTTP与安全

HTTP是一种明文协议,数据在传输过程中容易被窃取和篡改。为了提高安全性,通常会使用HTTPS(HTTP over SSL/TLS)。HTTPS在HTTP的基础上加入了SSL/TLS协议,通过加密和身份验证来保护数据传输的安全。

HTTPS的工作原理如下:
1. 客户端发起请求 :客户端向服务器发送HTTP请求,请求中包含支持的SSL/TLS版本和加密算法。
2. 服务器响应 :服务器选择一个SSL/TLS版本和加密算法,并发送证书给客户端。
3. 客户端验证证书 :客户端验证服务器证书的有效性,包括证书的颁发机构、有效期等。
4. 生成会话密钥 :客户端和服务器通过协商生成一个会话密钥,用于加密后续的数据传输。
5. 加密通信 :使用会话密钥对HTTP数据进行加密,确保数据在传输过程中的保密性和完整性。

12. HTTP的未来发展

随着互联网的不断发展,HTTP也在不断演进。HTTP/2和HTTP/3是HTTP的新一代协议,它们在性能和安全性方面有了显著提升。
- HTTP/2 :HTTP/2在性能上有了很大的改进,它采用了二进制分帧、多路复用、头部压缩等技术,提高了数据传输效率和响应速度。例如,多路复用允许在一个连接上同时处理多个请求和响应,避免了HTTP/1.1中的“队头阻塞”问题。
- HTTP/3 :HTTP/3基于QUIC协议,进一步优化了性能和安全性。QUIC协议在UDP的基础上提供了可靠传输、加密和拥塞控制等功能,减少了连接建立的延迟。

以下是HTTP不同版本的主要特性对比:
| 版本 | 主要特性 |
| ---- | ---- |
| HTTP/1.1 | 支持持久连接、请求头压缩、分块传输等 |
| HTTP/2 | 二进制分帧、多路复用、头部压缩、服务器推送 |
| HTTP/3 | 基于QUIC协议,减少连接延迟,提高安全性 |

13. 总结

HTTP作为互联网中最常用的应用层协议之一,在Web开发和数据传输中起着至关重要的作用。通过了解HTTP的基本原理、请求方法、消息格式、事务流程等知识,我们可以更好地开发和优化Web应用程序。同时,关注HTTP的性能优化和安全问题,以及未来的发展趋势,有助于我们跟上技术的步伐,为用户提供更高效、安全的服务。在实际应用中,我们需要根据具体的需求和场景选择合适的HTTP版本和优化策略,以提高系统的性能和用户体验。

希望通过本文的介绍,能让大家对HTTP有更深入的理解和认识,在实际工作中更好地运用HTTP协议。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值