HTTP 协议

发布时间 2023-12-20 10:09:48作者: 背对背依靠

HTTP 协议

HTTP: HyperText Transfer Protocol的缩写,译为超文本传输协议。

层级: 应用层协议

端口: 基于TCP/IP协议簇,默认使用80/tcp端口

作用: http协议定义了客户端和服务器之间数据交换的规则和格式,从而实现客户端和服务器之间的超文本数据传输


超文本: 不限于纯文本内容,还可以包含图像、视频、音频和动画等内容。超文本一种复合型的信息表达方式,它打破了传统文本的界限,提供了更为丰富和动态的用户体验。

HTTP 特点

  1. 无状态协议:HTTP协议本身不会存储过去请求的状态信息。每个HTTP请求都是独立的,服务器不会记住前后请求之间的关联。

  2. 客户端-服务器模型:客户端发送请求给服务器,服务器处理请求后返回响应信息。使得一个服务端可以为多个客户端提供响应。

  3. 请求/响应模式:客户端发送一个请求到服务器,服务器处理请求并返回一个响应。这种一问一答的交互使得通信过程清晰、有序,编译追踪调试。

  4. 支持多种数据类型:HTTP最初设计是为了传输HTML文档,即“超文本”,但它的能力远远超出了仅传输文本。

HTTP 版本演变

  1. HTTP/0.9:的确是在1991年首次出现,它非常基础,只支持GET请求,没有HTTP头部,只能传输纯文本类型的数据。

  2. HTTP/1.0:发布于1996年,开始支持多种HTTP方法(如GET、POST、HEAD),引入了HTTP头部,允许传输多种类型的内容,不仅限于文本。

  3. HTTP/1.1:首次发布于1997年,并在1999年进行了更新。它加入了持久连接功能(也称为连接复用),以及更复杂的请求和响应头部,改进了缓存机制,并支持虚拟主机。

  4. HTTP/2:发布于2015年,专注于提高性能,引入了多路复用、头部压缩、服务器推送等功能,以优化加载速度和整体用户体验。

  5. HTTP/3:正在开发中,基于QUIC协议,其目标是减少延迟并提高网络通信的整体可靠性和性能,特别是在移动网络和高丢包环境下。

持久连接:

HTTP/1.1之前:每个HTTP请求/响应对通常需要一个单独的TCP连接。每完成一个请求/响应交换,连接就会被关闭,下一个请求需要重新建立新的连接。就造成了对服务器资源使用效率变低(因为每个请求都需要进行TCP连接的三次握手)。

HTTP/1.1:有了持久连接后,允许在一个TCP连接上进行多个HTTP请求/响应交换。避免了频繁建立和关闭连接的过程,特别是在需要多个请求的场景中,从而减少了TCP连接建立和关闭的开销,提高了网络传输的效率。

HTTP 请求方式

  • HTTP提供了多种请求方法,通过不同的请求方法可以实现对服务器资源的不同操作。

  • GET请求:用于获取服务器的资源,而不应当引起服务器上的状态变化。

  • POST请求:用于提交数据给服务器,POST请求可能会导致服务器上的状态改变或数据变更。

  • PUT请求:用于上传文件或更新服务器上的资源。

  • DELETE请求:用于删除服务器的指定资源

HTTP 响应码

HTTP响应码是服务器在响应HTTP请求时返回的状态码,用于告知客户端请求的处理结果。

信息状态码(1xx)

作用:表示服务端接收到请求并继续处理。**


例如:100(Continue)表示客户端应继续发送请求的其余部分。

成功状态码(2xx)

作用:表示服务端请求已被成功接收、理解和接受。**


例如:200(OK)表示请求成功,201(Created)表示请求成功并且服务器创建了新的资源。

重定向状态码(3xx)

作用:表示服务端需要进一步操作需要以完成请求。


例如:301(Moved Permanently)表示资源已永久移动到新位置,302(Found)表示临时重定向。

客户端错误状态码(4xx)

作用:表示客户端的请求有误


例如:400(Bad Request)表示服务器无法理解请求格式,401(Unauthorized)表示请求需要用户认证,404(Not Found)表示服务器找不到请求的资源。

服务器错误状态码(5xx)

作用:表示服务端处理请求时发生了错误


例如:500(Internal Server Error)表示服务器遇到了意外情况,无法完成请求,503(Service Unavailable)表示服务器当前无法处理请求但可能稍后可以。

HTTP 报文结构

请求(Request)报文:

由起始行、请求头和请求体三部分组成。

  • 起始行:包含请求方法、请求资源的URI、http的版本信息

  • 请求头:以键值对的方式组成,里面包含了关于请求和客户端信息的多个头部字段

  • 请求体:包含要发送给服务器的数据。请求体可以没有,例如GET请求就没请求体。

响应(Response)报文:

由状态行、响应头部和响应体三部分组成。

  • 状态行:包含HTTP版本、状态码和状态消息

  • 响应头部:包含了关于服务器和响应信息的多个头部字段

  • 响应体:包含服务器返回的数据。

WWW:

WWW:是World Wide Web的缩写,译为万维网。它是一个巨大的数据集合(文本、图像、音频、视频等多种媒体形式),这些数据之间通过超链接形成一个互联的网络。

这些多媒体数据存储在世界各地的服务器上。用户发送资源请求时,实际上是在请求这些服务器上存储的数据。因为 WWW 基于客户端-服务器模型,所以客户端需要向服务器发送请求来获取数据,服务器才会处理请求并返回相应的响应

WWW、HTTP和HTML关系

蒂姆·伯纳斯-李设想了一个基于超链接的全球性信息系统,即万维网(WWW)。这个系统旨在使文档和其他资源可以通过超链接相互关联和访问。


为了使WWW成为现实,伯纳斯-李开发了HTML。HTML是一种用于创建和结构化网页的标记语言,允许文档通过超链接相互连接。HTML成为了定义和展示WWW上内容的标准方法。


为了实现客户端(如浏览器)和服务器之间的数据交互,伯纳斯-李接着开发了HTTP协议。HTTP定义了如何传输和接收网页数据,包括请求和响应的格式。


所以 WWW作为全球信息网络,HTML作为定义网页内容和结构的语言,以及HTTP作为通信协议——共同构成了现代互联网的基础。

HTML

HTML是HyperText Markup Language的缩写,译为超文本标记语言(不是一门编程语言)。蒂姆·伯纳斯-李在发明万维网(WWW)的过程中开发了HTML,通过HTML从而实现WWW中超链接的设想。

HTML中的请求方法和HTTP中的请求方法区别:

本质上HTML和HTTP中的GET和POST请求方法在本质上是相同的,但是上下文略有差别。

HTML:GET和POST定义了如何通过表单(<form>标签)提交数据

  • GET:当表单设置为GET方法时,提交的数据会附加在URL中。但是URL的长度是有限,所以显示了发送的数据量。

  • POST:当表单设置为POST方法时,提交的数据包含在请求体中,不会显示在URL里。,所以适合发送大量数据和敏感信息。


HTTP:GET和POST定义了客户端和服务器之间数据交换的方式

  • GET:HTTP中的GET请求用于请求服务器上的特定资源,请求参数包含在URL中。

  • PoST:HTTP中的POST请求用于向服务器提交数据,以进行处理(如数据库更新、表单数据提交等)。


说明:

  • HTTP的GET请求具有幂等性,即只能用来请求数据,不能修改服务端数据。

  • HTTP的POST请求一般用来修改服务端数据,但是也可以用来请求服务端的数据。


使用场景:

  • GET请求的URL长度有限,并且查询参数时附加在URL后面,如果有大量需要查询的参数,可以用PSOT实现。

  • POST请求的查询参数是放在请求体中,不是URL上,包含敏感信息或需要复杂结构可以用POST来实现。

  • GET请求会被浏览器缓存和留下历史记录,POST请求不会产生缓存和历史记录。

URL、URN和URI

URI

URI(统一资源标识符):这是一个更广泛的概念,用于唯一标识互联网上的资源。它包括两个子类别:URL和URN。

URL

URL(统一资源定位符):URL是URI的子集。它不仅标识资源,还提供了找到这个资源的具体位置的信息。


例如:http://www.example.com 是一个URL,同时也是一个URI。

URL格式:

URL的标准格式主要包含这几部分:

  1. 访问资源所使用的协议,根据约定,协议后面要加(://),用于分隔协议部分和后续的资源地址部分

  2. IP地址或者域名

  3. 端口号,使用冒号和IP地址分隔

  4. 服务器上资源的具体路径。资源路径中使用斜线(/)来分隔不同的路径组件,使得资源在服务器上的层级结构表示清晰。


例如:

http://192.168.0.92:8000/display#/realTime

URN

URN(统一资源名称):URN也是URI的一种形式,但它只标识资源而不提供位置信息。


例如:书的ISBN号是一个URN,用于唯一标识一本书,但不告诉您书在哪里可以找到。

解决HTTP无状态连接

session和cookie

因为HTTP协议的一个特性就是无状态协议,它本身不会记住之前的请求或响应,所以需要借助一些方法来使http记得之前的请求或响应。

  • Cookie:一个小型数据片段(存放Session ID),由服务器发送到用户浏览器并保存在浏览器上。下次HTTP请求时,Cookie都会被自动附加到请求头中发送给服务器。

  • Session:存放用户和服务端的交互信息,每个用户都有一个独特的session,通常通过一个session ID来标识。Session存储在服务端。

通过这种方式,即使HTTP本身是无状态的,服务器仍然能够“记住”用户的状态(如是否登录、购物车内容等),实现状态保持。

Token:

Token是用于身份验证和授权的一种机制,与session和cookie有所不同。Token常用于实现无状态的认证系统

Token特点:

  • 无状态:意思就是服务端不需要存储用户的登录记录或会话信息。Token自身就包含了所有必要的信息。

  • 自包含:Token中包含的信息通常以JSON Web Token(JWT)的形式编码和加密。

Token作用:

身份验证:用户登录后,服务器会生成一个token并发送给客户端。客户端将此token存储(通常在本地存储或cookie中),并在随后的请求中将其作为身份验证信息发送给服务器。服务器在接收到带有token的请求后,会验证token的有效性。如果验证通过,服务器会根据token中的信息提供相应的服务。

Token和session/cookie区别:

Token不需要服务器端存储用户状态,有利于减少服务器负担。适用于构建可扩展的大规模应用。

Token和JWT的关系:

  • Token:一个广泛的概念,用于表示访问资源的凭证或身份验证信息。

  • JWT(JSON Web Token):是Token的一种具体实现,一般是由头部(Header)、载荷(Payload)和签名(Signature)组成。特别适合用于Web API的身份验证和跨服务的信息交换。