HTTP

一个简单的请求响应协议

HTTP

HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于在计算机网络之间传输超文本和其他资源的应用层协议。通过客户端和服务器之间的请求-响应模式,实现了在全球范围内快速传输数据和资源的功能[0]。它是一个工作于TCP协议之上[3]通用的,最重要、最流行、应用最广泛的[4],无状态、面向对象的网络协议[1],是构建万维网(World Wide Web)的基础,对于互联网有着极其重要的影响[5]。设计HTTP的最初目的是提供一种发布和接收超文本标记语言(HTML)页面的方法[2]。每个HTTP请求和响应都由起始行、首部字段和实体主体组成,它允许将超文本标记语言(HTML)文档在Web服务器之间传输,这种结构使得HTTP在灵活性和可扩展性方面表现出色[6]。同时HTTP包含的命令和传输信息,不仅可用于Web访问,也可以用于其他因特网/局域网应用系统之间的通信,从而实现各类应用资源超媒体访问的集成[2]。

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

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

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

发展历史

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

HTTP(超文本传输协议)图
HTTP(超文本传输协议)图

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

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

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

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

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

版本演进

版本发布年份说明HTTP/0.91991最初的HTTP版本,只支持GET请求,没有头部信息和状态码[20]HTTP/1.01996引入了多种请求方法、头部字段、状态码和持久连接等功能 - 使用非持久连接(non-persistent connection),每次请求都需要重新建立连接,效率较低 - 不支持管道化(pipelining),即在一个连接上发送多个请求。  - 缺乏对传输的优化,大量的请求和响应可能导致性能下降[21]HTTP/1.11999 - 引入持久连接(persistent connection),同一个连接可以发送多个请求和响应,减少了连接建立的开销  - 支持管道化(pipelining),允许在一个连接上发送多个请求,提高了请求的并发性能。  - 引入Host头字段,使得一台服务器可以支持多个域名,促进了虚拟主机的发展。  - 支持范围请求(Range requests),允许只请求资源的一部分,对于大文件的下载有用[22]HTTP/22015基于SPDY协议 - 采用二进制协议而非文本协议,减少了解析开销,提高了效率。  - 引入多路复用(Multiplexing),允许在一个连接上同时发送多个请求和响应,解决了HTTP/1.x中的队头阻塞问题,提高了并发性能。  - 支持服务器推送(Server Push),允许服务器在客户端请求之前主动推送资源,加快页面加载速度[23]HTTP/32020基于QUIC协议,不再使用TCP作为传输层协议,提高了连接的可靠性和传输效率。  - 引入0-RTT连接建立,允许客户端在第一次连接时发送数据,加速了连接建立过程。  - 支持连接迁移,允许在网络切换时保持连接,提高了移动设备的连接稳定性[18]

基本工作原理

HTTP的工作原理简述如下:

http工作原理图
http工作原理图

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

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

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

基本结构

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

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

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

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

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

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

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

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

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

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

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

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

请求结构

HTTP请求报文结构
HTTP请求报文结构

请求行

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

GET /TheProject.html HTTP/1.0

请求方法

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

HTTP请求方法图
HTTP请求方法图

方法描述[28]GET请求指定的页面信息,并返回实体主体POST向指定资源提交数据进行处理请求,数据被包含在请求体中PUT用于向服务器上传数据并替换指定的资源DELETE请求服务器删除指定的资源HEAD请求获取指定资源的头部信息,不返回实体内容OPTIONS请求获取服务器支持的HTTP方法PATCH对服务器上的指定资源进行部分更新CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器TRACE回显服务器接收到的请求,主要用于测试或诊断

URI

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

codeURI = (absoluteURI | relativeURI) ["#" fragment] absoluteURI = scheme ":" *(uchar | reserved) relativeURI = net_path | abs_path | rel_path net_path = "//" net_loc [abs_path] abs_path = "/" rel_path rel_path = [path] [";" params] ["?" query] path = fsegment *("/" segment) fsegment = 1*pchar segment = *pchar params = param *(";" param) param = *(pchar | "/") scheme = 1*(ALPHA | DIGIT | "+" | "-" | ".") net_loc = *(pchar | ";" | "?") query = *(uchar | reserved) fragment = *(uchar | reserved) pchar = uchar | ":" | "@" | "&" | "=" | "+" uchar = unreserved | escape unreserved = ALPHA | DIGIT | safe | extra | national escape = "%" HEX HEX reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" extra = "!" | "*" | "'" | "(" | ")" | "," safe = "$" | "-" | "_" | "." unsafe = CTL | SP | <"> | "#" | "%" | "<" | ">" national = <任何除了ALPHA、DIGIT、reserved、extra、safe和unsafe之外的OCTET字符>

请求头部

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

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

Content-Type:指定请求或响应中所传输数据的媒体类型(MIME类型),例如text/html表示HTML文档[31]。Content-Length:指定请求或响应中所传输数据的长度,以字节为单位[32]。Authorization:用于进行身份验证的凭据信息,例如基于用户名和密码的基本身份验证[33]。User-Agent:标识发送请求的用户代理(浏览器或其他客户端应用程序)的信息[34]Cache-Control:用于控制缓存的行为,例如指定缓存的有效期、是否允许缓存等[35]。Location:指定重定向的目标URL,用于将请求重定向到新的位置[36]Cookie:包含服务器发送给客户端的Cookie信息,用于维护会话状态[35]。Set-Cookie:用于在服务器端设置Cookie信息,将Cookie存储在客户端[35]。Accept:指定客户端可以接受的响应内容类型[37]。Referer:指定引导请求的来源页面的URL[38]

请求体

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

请求结构示例
HTTP请求结构示例图
HTTP请求结构示例图

GET /example HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 Accept: text/html

响应结构

HTTP响应报文结构
HTTP响应报文结构

状态行

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

状态行的格式如下:

mathematicaCopy codeStatus-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

状态码

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

HTTP状态码图
HTTP状态码图

状态码描述1xx(信息性状态码):请求已接收,继续处理[40]100 Continue服务器收到请求的头部,客户端应该继续发送请求的主体部分101 Switching Protocols客户端请求切换协议,服务器同意切换2xx(成功状态码):请求已成功被服务器接收、理解和处理[28]200 OK请求已成功,服务器成功处理了请求201 Created请求已成功,并且服务器创建了新的资源202 Accepted已接受请求进行处理,但处理尚未完成203 Non-Authoritative Information 非授权信息。请求成功,但返回的meta信息不在原始的服务器,而是一个副本[40]204 No Content请求成功,但服务器不返回任何实体内容205 Reset Content服务器处理成功,用户终端应重置文档视图。可通过此返回码清除浏览器的表单域[40]206 Partial Content服务器成功处理了部分GET请求[40]3xx(重定向状态码):需要进一步操作来完成请求[28]301 Moved Permanently请求的资源已永久移动到新的URL,客户端应该使用新URL发送请求[41]302 Found/Temporary Redirect请求的资源临时移动到新的URL,客户端应继续使用原始URL304 Not Modified资源在上次请求后没有修改,客户端可以使用缓存的版本[42]305 Use Proxy使用代理。所请求的资源必须通过代理访问[40]4xx(客户端错误状态码):客户端发生错误,无法完成请求[28][40]400 Bad Request客户端请求有误,服务器无法理解401 Unauthorized请求需要身份验证,客户端未提供有效的凭据证403 Forbidden服务器拒绝请求,通常是因为客户端没有权限访问资源404 Not Found请求的资源不存在,服务器未能找到405 Method Not Allowed客户端请求中的方法被禁止406 Not Acceptable服务器无法根据客户端请求的内容特性完成请求408 Request Time-out服务器等待客户端发送的请求时间过长,超时409 Conflict服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突411 Length Required服务器无法处理客户端发送的不带Content-Length的请求信息412 Precondition Failed 客户端请求信息的先决条件错误413 Request Entity Too Large由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息414 Request-URI Too Large请求的URI过长(URI通常为网址),服务器无法处理415 Unsupported Media Type服务器无法处理请求附带的媒416 Requested range not satisfiable客户端请求的范围无效417 Expectation Failed服务器无法满足Expect的请求头信息5xx (服务器错误状态码):表示服务器在处理请求时发生错误[28][40]500 Internal Server Error服务器内部错误,无法完成请求501 Not Implemented服务器不支持客户端所请求的功能或方法,无法完成请求502 Bad Gateway网关错误,表示服务器作为网关或代理,无法从上游服务器收到有效的响应503 Service Unavailable服务器暂时无法处理请求(通常是由于过载或维护)504 Gateway Timeout充当网关或代理的服务器,未及时从远端服务器获取请求505 HTTP Version not supported服务器不支持请求的HTTP协议的版本,无法完成处理

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

响应头部

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

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

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用于指示对该类型数据的附加内容编码(例如数据压缩)[44]。HTTP/1.0消息中包含实体主体的请求应该包含有效的Content-Length标头字段来指定实体主体的长度(以字节为单位)。如果Content-Length标头字段未指定,则服务器可能会通过关闭连接来确定实体主体的结束[45]

响应结构示例

HTTP/1.1 200 OK Date: Tue, 03 Aug 2023 12:00:00 GMT Server: Apache/2.4.41 Content-Type: text/html; charset=utf-8 Content-Length: 1024 <!DOCTYPE html> <html> <head> <title>Example Page</title> </head> <body> <!-- HTML content here --> </body> </html>

响应结构示例图
响应结构示例图

连接管理

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

HTTP持久连接及非持久连接图
HTTP持久连接及非持久连接图

持久连接(Persistent Connection)

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

HTTP持久连接图
HTTP持久连接图

非持久连接(Non-Persistent Connection)

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

HTTP非持久连接图
HTTP非持久连接图

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

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

HTTP连接复用机制
HTTP连接复用机制

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

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

HTTP多路复用性图
HTTP多路复用性图

 

安全机制

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

HTTP安全机制
HTTP安全机制

加密原理

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

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

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

数字证书原理图
数字证书原理图

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

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

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

验证过程

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

HTTPS的安全机制
HTTPS的安全机制

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

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

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

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

 作用

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

安全机制图
安全机制图

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

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

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

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

缓存机制

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

HTTP缓存原理图
HTTP缓存原理图

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

HTTP中的缓存作用

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

会话管理:通过为每个用户分配一个唯一的会话标识(Session ID),服务器可以识别不同的用户并跟踪他们的会话状态。会话标识通常存储在Cookie中,并在每次请求时发送到服务器[62]。用户认证和授权:通过在Cookie中存储用户身份验证凭据,服务器可以验证用户的身份并授权其访问特定的资源或执行特定的操作。这在用户登录和访问受限资源时非常有用[63]。状态保持:通过在Cookie中存储一些状态信息,服务器可以在不同的HTTP请求之间保持用户的状态。这允许服务器跟踪用户的偏好设置、购物车内容、浏览历史等[64]

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

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

HTTP中的缓存控制指令

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

1. Cache-Control:这是最重要的缓存控制指令,用于定义缓存的行为[69]。常见的取值有:

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

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

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

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

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

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

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

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

 

应用

网页浏览

HTTP用于网页浏览
HTTP用于网页浏览

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

HTTP用于文件传输
HTTP用于文件传输

文件传输

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

RESTful API

HTTP用于实现RESTful API
HTTP用于实现RESTful API

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

HTTP实现基于Web的服务
HTTP实现基于Web的服务

Web服务

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

HTTP支持跨域通信
HTTP支持跨域通信

跨域通信

HTTP用于图片和媒体传输
HTTP用于图片和媒体传输

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

图片和媒体传输

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

HTTP的特点

支持客户/服务器模式:HTTP协议基于客户端和服务器之间的交互模式,客户端发送请求给服务器,服务器处理请求并返回响应[80]。简单快速:HTTP的设计简单,使得通信速度快。客户端只需传送请求方法和路径,服务器处理完请求后立即断开连接,节省了传输时间[80]。灵活性:HTTP允许传输任意类型的数据对象,通过Content-Type标记正在传输的数据类型,可以传输文本、图像、音频、视频等各种形式的数据[80]。无连接:每个HTTP请求都是独立的,服务器不会保留之前请求的任何信息。服务器处理完客户端的请求并发送响应后,即断开连接,这种无连接的特性节省了服务器资源[80]。无状态:HTTP是无状态的协议,即服务器不会保留客户端的状态信息。每个请求都是独立的,服务器不会记住之前的请求或会话,这要求每个请求都必须包含完整的信息,但也使得服务器处理请求的开销较小[80]

HTTP与HTTPS的区别

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

HTTP与HTTPS
HTTP与HTTPS
HTTP与HTTPS区别图
HTTP与HTTPS区别图

特点HTTPHTTPS传输方式明文传输使用SSL进行加密传输安全性传输数据容易被窃听和篡改数据经过加密保护,更难被窃听和篡改证书要求无需证书需要从证书颁发机构(CA)申请证书,用于证明服务器的身份和用途。只有使用CA证书的服务器,客户端才会信任该服务器端口使用80端口使用443端口状态无状态协议使用SSL和HTTP构建的可进行身份验证和加密传输的协议

参考资料 82

  1. 参考 1
  2. rfc1945 — datatracker
  3. 参考 3
  4. 参考 4
  5. 参考 5
  6. 参考 6
  7. 参考 7
  8. 参考 8
  9. HTTP协议介绍 — kb.hillstonenet.com
  10. 参考 10
  11. HTTP的发展 — MDN Web Docs
  12. 参考 12
  13. 参考 13
  14. rfc7230 — datatracker
  15. Hypertext Transfer Protocol Version 2 (HTTP/2) — HTTP2
  16. 参考 16
  17. 参考 17
  18. rfc9114 — datatracker
  19. The Status of HTTP/3 — infoq
  20. Summary of HTTP 0.9 — w3
  21. Hypertext Transfer Protocol -- HTTP/1.0 — w3
  22. Hypertext Transfer Protocol -- HTTP/1.1 — w3
  23. Note: This specification — w3
  24. 参考 24
  25. MDN Web 文档术语表:Web 相关术语的定义 — MDN
  26. Hypertext Transfer Protocol -- HTTP/1.0 — w3
  27. HTTP简介 — 云南农业大学-计算机网络
  28. Hypertext Transfer Protocol -- HTTP/1.0 — w3
  29. Hypertext Transfer Protocol -- HTTP/1.0 — w3
  30. Hypertext Transfer Protocol -- HTTP/1.0 — w3
  31. Hypertext Transfer Protocol -- HTTP/1.0 — w3
  32. Hypertext Transfer Protocol -- HTTP/1.0 — w3
  33. Hypertext Transfer Protocol -- HTTP/1.0 — w3
  34. Hypertext Transfer Protocol -- HTTP/1.0 — w3
  35. HTTP Semantics — rfc-editor
  36. Hypertext Transfer Protocol -- HTTP/1.0 — w3
  37. Hypertext Transfer Protocol -- HTTP/1.0 — w3
  38. Hypertext Transfer Protocol -- HTTP/1.0 — w3
  39. 参考 39
  40. HTTP 响应状态码 — MDN
  41. Code301 — w3
  42. Code304 — w3
  43. Hypertext Transfer Protocol -- HTTP/1.0 — w3
  44. 参考 44
  45. Hypertext Transfer Protocol -- HTTP/1.0 — w3
  46. 参考 46
  47. 参考 47
  48. 参考 48
  49. 参考 49
  50. 参考 50
  51. 参考 51
  52. 参考 52
  53. 参考 53
  54. 参考 54
  55. 参考 55
  56. 参考 56
  57. 参考 57
  58. 参考 58
  59. 参考 59
  60. 参考 60
  61. HTTP State Management Mechanism — rfc
  62. HTTP State Management Mechanism — rfc-editor
  63. 参考 63
  64. 参考 64
  65. HTTP State Management Mechanism — rfc6265
  66. HTTP State Management Mechanism — rfc6265
  67. HTTP State Management Mechanism — rfc6265
  68. 参考 68
  69. 参考 69
  70. 参考 70
  71. 参考 71
  72. 参考 72
  73. 参考 73
  74. 参考 74
  75. 参考 75
  76. 参考 76
  77. Hypertext Transfer Protocol -- HTTP/1.0 — w3
  78. 参考 78
  79. 参考 79
  80. 参考 80
  81. RFC 2818 — HTTPS
  82. HTTP 与 HTTPS 之间有什么区别? — amazon
广告位:底部(ad-bottom)—— 请到中台「公共区块」编辑此内容