HTTP :一个简单的请求响应协议

更新时间:2023-05-30 16:30

HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于在计算机网络之间传输超文本和其他资源的应用层协议。通过客户端和服务器之间的请求-响应模式,实现了在全球范围内快速传输数据和资源的功能。它是一个工作于TCP协议之上通用的,最重要、最流行、应用最广泛的,无状态、面向对象的网络协议,是构建万维网(World Wide Web)的基础,对于互联网有着极其重要的影响。

设计HTTP的最初目的是提供一种发布和接收HTML(HTML)页面的方法。每个HTTP请求和响应都由起始行、首部字段和实体主体组成,它允许将超文本标记语言(HTML)文档在Web服务器之间传输,这种结构使得HTTP在灵活性和可扩展性方面表现出色。同时HTTP包含的命令和传输信息,不仅可用于Web访问,也可以用于其他因特网/局域网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成。

HTTP还利用缓存机制来减少网络资源的重复传输,提高响应速度和带宽利用率。通过控制缓存指令,服务器和客户端可以灵活地管理资源的缓存策略。随着时间的推移,HTTP不断演进,多年来最常见的版本是HTTP/1.1。HTTP/2和HTTP/3引入了更高效的多路复用和传输协议(如QUIC),以改进性能和响应时间。为了保证数据传输的安全性,https应运而生,通过加密和数字证书验证来保护用户数据的隐私。

发展历史

HTTP(超文本传输协议)诞生于1989年。它是由欧洲粒子物理学研究所的蒂姆·李(Tim Berners-Lee)博士,出于与远方的研究人员进行知识共享的目的提出。

最早的HTTP版本为HTTP/0.9,它于1990年问世。由于当时HTTP并没有正式发布的版本,便被称为HTTP/0.9。该版本仅支持GET请求方法,仅能传输HTML格式的文本,并没有Header等其他信息。

1996年发布了HTTP/1.0版本,它引入了请求头和响应头的概念及多种请求方法,如GET、POST、HEAD等,同时支持传输更多类型的数据,不仅限于HTML文本。其引入的Header字段,允许在请求和响应中传递元数据信息。然而其每次请求都需要建立新的TCP连接,这导致性能相对较低。虽然HTTP/1.0是早期的规范,但是多年来仍然在许多服务器上工作。

HTTP/1.1于1997年由主要发明人罗伊·菲尔丁(Roy Fielding)发布,它是近些年的主流协议。该版本引入了持久连接(keep-alive),避免了每次请求都要重新建立连接的性能问题。同时支持流水线方式,允许同时发送多个请求,提高了传输效率。HTTP/1.1还引入了缓存控制、虚拟主机分块传输编码等新特性,提高了提升了性能和灵活性的同时增强了安全性。

HTTP/1.1的广泛应用带来了更多的需求,为了解决其性能瓶颈和安全问题,伊恩·斯万(Ian Swett)、弗拉德·博尔科夫(Vlad Krasnov)等于2015年发布了HTTP/2。HTTP/2采用二进制协议,取代了HTTP/1.x的文本协议,减少了解析复杂性。引入了多路复用特性,允许在一个TCP连接上同时处理多个请求,提高了并发性能。此外,HTTP/2还使用头部压缩技术(HPACK)减少了数据传输的大小,进一步提高效率。

HTTP/3由贝尔福尔·卡默(Belford Campey)、Jana Iyengar等于2020年发布,基于UDP协议的新一代HTTP协议,其基于UDP 之上的 QUIC 协议,取代TCP作为传输层协议,旨在进一步提升性能和安全性。它引入了0-RTT握手,加快了连接建立速度。通过使用UDP协议,解决了TCP拥塞控制导致的队头阻塞问题。HTTP/3还支持更快的流控制和错误恢复机制,提高了传输的稳定性。

版本演进

基本工作原理

HTTP的工作原理简述如下:

1. 客户端发起请求:客户端(如Web浏览器)向服务器发出HTTP请求,请求特定的资源,这通常通过URL来指定。

2. 服务器响应请求:服务器接收到客户端的请求后,根据请求内容,返回相应的HTTP响应,其中包含所请求的资源和相关的元数据。

3. 客户端处理响应:客户端接收到服务器的响应后,会根据响应内容进行处理,例如渲染网页、下载文件等。

基本结构

HTTP请求和响应都由以下几部分组成:

1. 起始行:请求行(请求方法、URL和HTTP版本)或响应行(HTTP版本、状态码和状态消息)。

2. 首部字段:包含键值对,用于传递请求或响应的元数据。例如,User-Agent表示客户端的信息,Content-Type表示响应的内容类型。

HTTP首部字段通常可以分为通用首部字段、请求首部字段、响应首部字段和实体首部字段。

- 通用首部字段:在请求和响应的消息中均可使用,如缓存Control、Date、Connection等。

- 请求首部字段:包含有关客户端的信息,如User-Agent、Host、Accept等。

- 响应首部字段:包含有关服务器的信息和响应实体的信息,如Server、Content-Type、Set-cookie等。

- 实体首部字段:描述请求或响应实体的信息,如Content-Length、Content-Encoding等。

HTTP首部字段可以根据需要进行扩展,使用自定义的字段名称,但应避免与标准字段冲突。在扩展时,使用"X-"前缀是一种常见的做法,例如"X-Custom-Header: value"。

3. 空行:用于分隔首部字段和消息主体。

4. 消息主体(可选):用于传递实际的请求数据(POST请求)或响应数据(服务器返回的资源)。

通过请求-响应模型,客户端和服务器可以进行双向通信,实现数据的传输和交互。

请求结构

请求行

请求行包含了请求的方法(例如GET、POST、PUT等),请求的目标资源的URI以及所使用的协议版本,例如

请求方法

HTTP请求方法(HTTP Request Methods)是客户端向服务器发出请求时使用的动词,用于指定所需的操作类型。每个请求方法都具有特定的含义和用途,服务器根据请求方法来确定如何处理请求。以下是一些所有的HTTP请求方法。

URI

URI(Uniform Resource Identifier)是一个通用的标识符,用于标识和定位任何网络上还是本地系统中的任意类型的资源,在HTTP协议中,URI是一种格式化的字符串,通过名称、位置或其他特征来标识网络资源。URI可以使用绝对形式或相对于已知基本URI的形式表示,具体取决于使用的上下文

请求头

请求头部

使用请求头字段包含了与请求相关的附加信息,请求标头字段允许客户端将有关请求和客户端本身的附加信息传递给服务器。这些字段充当请求修饰符,其语义等同于编程语言方法(过程)调用的参数。

以下是一些常见的HTTP头部字段及其用途:

请求体

请求报头体也称为请求正文,是可选部分,例如GET请求就没有请求体。使用POST方法请求时,参数被放到请求体中。

请求结构示例

响应结构

状态行

状态行(Status-Line)是HTTP响应消息的第一行,包括协议版本、状态码和状态短语,每个元素之间用空格(SP字符)分隔。除了最后的回车和换行符外,不允许出现回车或换行字符。

状态行的格式如下:

状态码

HTTP状态码(HTTP Status Codes)是服务器响应HTTP请求时返回的三位数字代码,用于表示服务器对客户端请求的响应状态。每个状态码都有特定的含义,用于指示请求的处理结果或错误情况。它们分为五类,每类代表不同的意义和用途:

状态码的分类和用途帮助客户端了解请求状态和服务器处理结果,可以在开发和调试过程中用于判断请求是否成功、资源是否存在权限问题或服务器问题。

响应头

响应头部

响应头部使用头字段包含了与响应相关的不能放在状态行中的附加信息,这些字段提供了关于服务器的信息。

服务器接收并解释请求消息后,以 HTTP 响应消息的形式进行响应。响应可以是简单响应(Simple-Response)或完整响应(Full-Response)。简单响应(Simple-Response)包括一个可选的实体主体(实体Body),它是服务器对请求的简单回复。完整响应(Full-Response)包括状态行、头部字段、回车换行符和响应体。

1. Content-Type:指定响应实体的MIME类型,告诉客户端如何解析内容。

2. Content-Length:指定响应实体的长度,用于在接收时做正确的数据处理。

3. server:表示响应的服务器软件名称和版本。

4. Set-cookie:设置Cookie信息,将数据保存在客户端。

5. Expires:指定响应实体的过期时间,用于缓存控制。

6. Last-Modified:指定响应实体的最后修改时间,用于缓存验证。

7. ETag:指定响应实体的唯一标识,也用于缓存验证。

8. Location:指定重定向的目标URL,常用于实现页面跳转。

响应体(Response Body)

响应体是HTTP请求或响应中可选的部分,用于传输实际的数据内容。响应体的存在取决于请求方法和响应代码,不同的组合可能会决定是否包含响应体。响应体的数据类型由Content-Type和Content-Encoding字段定义。Content-Type指定了基础数据的媒体类型,而Content-Encoding用于指示对该类型数据的附加内容编码(例如数据压缩)。HTTP/1.0消息中包含实体主体的请求应该包含有效的Content-Length标头字段来指定实体主体的长度(以字节为单位)。如果Content-Length标头字段未指定,则服务器可能会通过关闭连接来确定实体主体的结束。

响应结构示例

连接管理

持久连接和非持久连接是HTTP中连接管理的两种不同方式

持久连接(Persistent Connection)

在持久连接中,一次TCP连接可以用于发送多个HTTP请求和响应。在HTTP/1.1中,默认情况下,连接是持久的,除非显式地设置Connection首部字段为"close"来关闭连接。在客户端发起的第一个HTTP请求之后,服务器在响应中设置Connection首部字段为"keep-alive"来指示连接保持打开状态,不立即关闭,以便在同一连接上发送更多的请求。这样可以减少每次请求时建立和断开TCP连接的开销,提高性能和效率。

非持久连接(Non-Persistent Connection)

在非持久连接中,每次HTTP请求和响应都会单独建立一个新的TCP连接。即每次请求完成后,TCP连接会立即关闭,每个请求都需要单独建立连接和关闭连接,导致一定的延迟和性能开销。这种方式在HTTP/1.0中较为常见。

HTTP/1.1中的连接复用(keep-alive)机制

 在HTTP/1.1中,持久连接的默认设置允许在同一TCP连接上发送多个请求和响应,避免了频繁地建立和关闭连接,从而提高性能和减少延迟。当服务器在响应中设置Connection首部字段为"keep-alive"时,它告诉客户端保持连接打开,直到达到某个预定义的超时时间或请求数量上限。

HTTP/2和HTTP/3中的多路复用特性

HTTP/2和HTTP/3引入了多路复用特性,允许在同一个TCP连接上同时发送多个HTTP请求和响应。在HTTP/2中,通过二进制帧和流的概念实现多路复用,而HTTP/3使用QUIC协议来支持多路复用。这样多个请求可以同时进行,而无需按照先后顺序等待。这种特性可以避免HTTP/1.x中的"队头阻塞"问题,提高了性能,尤其在高延迟网络环境下效果更为显著。多路复用的使用使得服务器可以更高效地处理并发送多个请求,提高了网页加载速度和性能。

 

安全机制

https是超文本传输协议(HTTP)的安全版本,用于在客户端和服务器之间进行加密的数据传输,它通过使用加密来保护数据传输的安全性和完整性。HTTPS在传输数据之前,先将数据加密,然后再进行传输,使用安全套接层(SSL)或传输层安全(TLS)协议来保护数据的隐私和完整性,防止数据在传输过程中被窃听或篡改。

加密原理

HTTPS使用公钥加密和对称加密相结合的方式来实现数据的安全传输。当客户端(通常是浏览器)与服务器建立连接时,会进行以下步骤:

 1. 握手过程:在建立https连接时,客户端和服务器进行握手过程。首先,服务器发送包含公钥的数字证书给客户端。客户端验证证书的有效性,确保其来源可信。如果验证通过,客户端生成一个用于加密通信的随机对称密钥,并使用服务器的公钥加密该密钥,然后发送给服务器。

2. 加密通信:一旦握手成功,客户端和服务器之间的通信将使用对称密钥进行加密。这意味着数据在传输过程中只有掌握该密钥的两端能够解密和读取数据,保护了通信的隐私性。

数字证书的作用和验证过程

数字证书是由证书颁发机构(CA)签发的包含公钥和相关信息的电子文件,用于验证通信方的身份和提供公钥加密机制。

数字证书是由受信任的第三方机构(认证机构)签发的电子文档,用于证明一个实体(例如网站)的身份。数字证书包含证书持有者的公钥、证书的有效期、证书颁发者的信息、数字签名等

验证过程

- 客户端收到服务器发送的数字证书。

- 客户端检查证书的有效性,包括检查证书是否过期,是否由受信任的CA签发等。

- 如果证书有效,客户端继续握手过程,否则会发出警告或中止连接。

- 在握手过程中,客户端使用CA的公钥来验证数字签名,确保证书的完整性和真实性。

- 如果一切验证通过,客户端使用证书中的公钥加密生成一个用于通信的随机对称密钥,并发送给服务器。

 作用

- 身份验证:证书包含与实体(通常是网站或服务器)相关的信息,可以确保用户连接到正确的实体。

- 数据加密:证书中的公钥用于加密通信中的对称密钥,确保安全地交换密钥并保护数据传输的隐私性。

- 完整性保护:证书可以用于生成数字签名,用于验证数据在传输过程中是否被篡改。

通过https的加密和验证过程,确保了用户与服务器之间的通信安全可靠,防止敏感信息泄露和数据篡改。

通过这样的验证过程,客户端可以确认服务器的身份,并且可以确保与服务器之间的通信是安全和可信的。这是HTTPS实现安全通信的关键步骤之一。

缓存机制

缓存是指将一些计算结果、数据或资源存储在临时存储器中,以便在后续的请求中能够更快地访问和获取这些数据,而不需要重新从原始源获取。缓存的目的是为了提高系统性能和减轻服务器负载,通过减少网络传输和服务器计算,加快响应时间,提供更好的用户体验。

在HTTP(Hypertext Transfer Protocol)中,cookie和会话管理是用于在客户端和服务器之间跟踪和管理用户状态的机制。Cookie是由服务器响应到客户端的小型数据片段,存储在客户端的Set-Cookie头中。它通常包含一个名称、一个值和其他可选属性,用于唯一标识和跟踪用户。当客户端向服务器发送请求时,会自动将相关的Cookie信息包含在请求中。服务器可以读取这些Cookie,并根据其内容进行相应的处理。

HTTP中的缓存作用

通过使用Cookie,服务器可以实现以下功能:

除了上述功能,Cookie还具有一些属性,例如过期时间、域名限制、路径限制等,可以控制其在客户端的行为。

然而,需要注意的是,使用cookie进行会话管理存在一些安全和隐私方面的考虑。Cookie可能被不良网站滥用,用户的敏感信息可能被窃取或跟踪。因此,在设计和使用Cookie时,需要遵循一些最佳实践,如使用安全的传输协议(如https)、设置合理的过期时间、避免存储敏感信息等。

HTTP中的缓存控制指令

HTTP协议中定义了一些缓存控制指令,它们允许服务器和客户端在请求和响应中传递有关缓存处理的信息,以便优化缓存机制。以下是一些常用的缓存控制指令:

1. 缓存ctrl:这是最重要的CPU缓存控制指令,用于定义缓存的行为。常见的取值有:

   - public:表示响应可以被任意缓存(包括客户端和代理服务器)缓存。

   - private:表示响应只能被客户端缓存,不能被代理服务器缓存。

   - no-cache:表示缓存之前必须先与服务器确认响应是否过期。

   - max-age:定义响应的最大缓存时间,以秒为单位。

2. Expires:指定响应的过期时间,是一个具体的日期和时间,在该时间之后响应将被认为过期。

3.ETag(实体标签):这是HTTP头部字段,用于标识资源的特定版本。服务器可以为每个资源分配一个唯一的ETag值,当客户端发起请求时,通过比较客户端提供的ETag和服务器端的ETag,判断资源是否发生了变化。如果ETag匹配,则表示资源未修改,可以使用缓存副本,否则需要重新获取最新的资源。

4. Last-Modified:指示服务器上资源的最后修改时间。客户端可以通过发送If-Modified-Since头部字段,将先前获得的Last-Modified值发送给服务器,如果资源未发生变化,服务器将返回304 Not Modified状态码。

通过这些缓存控制指令,客户端和代理服务器可以根据资源的状态来决定是否使用缓存副本,或者是否向服务器请求最新的资源。这样能够更有效地利用缓存,提高性能和节省带宽。

 

应用

网页浏览

HTTP最初设计用于在客户端浏览器和服务器之间传输HTML页面和相关资源。通过HTTP,用户可以通过浏览器请求网页,服务器会将网页内容作为HTTP响应发送回客户端,从而实现网页浏览功能。HTTP的可扩展性使得网页能够包含丰富的内容,如文本、图像、视频和声音等,使用户能够以多样化的方式浏览和交互网页。

文件传输

HTTP可以用于文件传输。通过HTTP的GET请求,客户端可以向服务器请求下载文件。服务器会将文件作为HTTP响应的一部分发送回客户端,完成文件的传输。这种方式使得文件的获取变得简单和快速,用户可以通过浏览器或其他HTTP客户端直接从服务器下载文件。

RESTful API

HTTP被广泛用于实现RESTful(Representational State Transfer)风格的API。RESTful API是一种设计理念,通过使用HTTP协议中的不同方法(如GET、POST、PUT、DELETE等)来实现对资源的访问和操作。开发者可以使用HTTP的不同请求方法来创建、读取、更新和删除远程资源。这种基于HTTP的API设计风格简洁而灵活,被广泛用于构建各种类型的Web服务和应用程序接口。

Web服务

HTTP也可以用于实现基于Web的服务。通过HTTP的POST请求,客户端可以向服务器提交数据,并触发服务器执行相应的操作。服务器将执行结果作为HTTP响应返回给客户端。这种方式使得客户端和服务器之间的通信更加简单和可靠,可以实现各种业务逻辑和数据处理操作,如用户注册、数据存储、搜索和计算等。

跨域通信

HTTP支持跨域通信,使不同的网站和不同的服务器之间实现通信。通过设置 HTTP 头部字段,使客户端有资格跨域访问资源。通过服务器的验证和授权后,浏览器有责任支持这些HTTP头部字段

图片和媒体传输

HTTP可以用于传输图片、音频、视频等媒体资源。客户端可以使用HTTP请求来获取远程服务器上的媒体文件,并将其显示或播放在用户界面中。HTTP支持不同的媒体格式和编码方式,使得多种类型的媒体资源能够以高效和可靠的方式在互联网上进行传输和共享。

HTTP的特点

HTTP与HTTPS的区别

HTTP(Hypertext Transfer Protocol)和HTTPS(Hypertext Transfer Protocol Secure)是两种不同的协议,它们在数据传输和安全性方面有一些重要的区别,HTTP与HTTPS的区别如下表。

免责声明
隐私政策
用户协议
目录 22
0{{catalogNumber[index]}}. {{item.title}}
{{item.title}}
友情链接: