HTTP 协议

HTTP 协议

HTTP是超文本传输协议(HyperText Transfer Protocol)的缩写,属于应用层协议,默认使用传输层的80/tcp端口。

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

超文本: 不限于纯文本内容,还可以包含图像、视频、音频和动画等内容,是一种一种复合型的信息表达方式。


HTTP协议由来:

简单来说,HTTP(超文本传输协议)的发展是为了支持万维网(WWW)的运作。

在 1989 年,蒂姆·伯纳斯-李(Tim Berners-Lee)在欧洲核子研究组织(CERN)提出了一个全球信息共享的概念,这个概念后来发展成为我们今天所知的万维网。他的想法是创建一个基于超链接的信息系统,允许科学家们从任何地方通过网络互相分享文档。

为了实现这一目标,伯纳斯-李设计了一套简单的规则和标准,以便文档能够在网络上被有效地请求和传输,这套规则和标准就是早期的 HTTP 协议。HTTP 协议的核心是一个基于请求-响应模式的通信协议,客户端(如浏览器)发送一个请求给服务器,然后服务器返回一个响应。

后面随着技术的不断发展,HTTP 协议也在不断演进,以适应新的网络环境和性能要求。


WWW 介绍

WWW是万维网(World Wide Web)的简称,是一个巨大的信息系统,通过超链接技术,让文档和其他资源互相关联,形成一个互联的网络。

蒂姆·伯纳斯-李最初设计万维网的目的是为了满足国际物理学研究社区分享文档和数据的需求。他基于“超文本”概念进行设计,通过在文本中的引用链接到其他文档或资源,使用户能够轻松地从一个文档跳转到另一个文档。

为了实现这种设想,蒂姆·伯纳斯-李设计了HTML,HTML是一种内容标记语言。通过HTML能够描述文档的结构,并允许文档通过超链接相互关联。通过HTML编写的文档(网页),就形成了万维网的基本单元。


WWW、HTTP、HTML之间的工作流程:

1、客户端通过 HTTP 协议与 Web 服务器进行交互:客户端(通常是 Web 浏览器)向 Web 服务器发送 HTTP 请求。

2、Web 服务器上存储的资源通常以 HTML 文档的形式表示:若干资源通过超链接相互关联,构成了万维网的内容。

3、web服务器处理请求后,通过 HTTP 协议响应客户端的请求

4、客户端渲染并显示 HTML 文档:浏览器解析 HTML 文档,并处理其中的 CSS 和 JavaScript,将文档渲染为用户可视的网页。

说明: WWW就是一个大的概念,由遍布全球的成千上万个 Web 服务器组成的庞大网络。这些服务器存储着网页、应用程序和其他资源数据。


web服务器的客户端

浏览器: 当浏览器向WWW发送请求以获取HTML格式的资源(如网页)时,服务器通常会响应并返回HTML文档。浏览器接收到这个HTML文档后,会解析并渲染出网页供用户查看。如果是非HTML格式资源(例如图像、视频、CSS文件或JavaScript文件),服务器会返回相应格式的资源。浏览器根据资源类型相应地处理这些资源。

例如:谷歌浏览器、Linux中的curl等

非浏览器: 例如API客户端或编程脚本,它可以发送HTTP请求来获取各种类型的数据。这些请求可能是为了获取JSON、XML或其他特定格式的数据。务器的响应将根据请求的内容类型进行格式化,通常与请求中指定的“Accept”头部相对应,或者基于服务器的配置。


浏览器介绍

最早的浏览器是蒂姆·伯纳斯-李在1990年开发的“WorldWideWeb”(后来改名为Nexus)。浏览器的作用是访问www相关信息的工具。

  • 1990年,蒂姆·伯纳斯-李开发最早的浏览器Nexus

  • 1990年后期,微软推出Internet Explorer

  • 2008年,Google推出Chrome浏览器


HTTP协议特点:

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

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

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

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


HTTP协议版本:

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

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

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

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

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


持久连接的概念:

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

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


HTTP协议的报文结构

HTTP协议的报文可以分为两类:请求(Request)报文和响应(Response)报文

报文: 报文(Message)是指在网络中传输的数据单元。因为HTTP协议是应用层协议(TCP/IP 模型),所以HTTP协议的传输单元教座位报文,也可以叫作数据。


HTTP 请求报文:

作用:是客户端发送给服务器以请求某种服务的消息。

组成:由请求行、请求头、空行、消息体组成

  1. 请求行:包括请求方法、资源的URI地址、HTTP版本信息

  2. 请求头:包括请求信息和客户端信息

  3. 空行:用于标示请求头部的结束

  4. 消息体:这部分是可选的,包含了发送给服务器的数据。


HTTP 响应报文:

作用:是服务器回应客户端请求后返回的消息。

组成:由状态行、响应头、空行和消息体组成

  1. 状态行:包括 HTTP 版本、状态码(如 200、404)和状态码的文本描述。

  2. 响应头:包含关于服务器和响应的信息

  3. 空行:用于标示响应头部的结束

  4. 消息体:这部分可选,包含了服务器返回的数据。


HTTP 请求方法:

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

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

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

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

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


GET和POST区别:

请求参数位置:

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

  • POST请求:用于向服务器提交数据,参数是存放在请求体中。

功能区别:

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

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

产生缓存:

  • GET请求:会被浏览器缓存和留下历史记录

  • POST请求:不会产生缓存和历史记录

使用场景:

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

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

  • POST请求不会产生缓存和历史记录,更适用于某些场景。


HTML中的请求方法对比:

本质上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请求用于向服务器提交数据,以进行处理(如数据库更新、表单数据提交等)。


URL、URI和URN:

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

  • URL:统一资源定位符。不仅标识资源,还提供了找到这个资源的具体位置的信息。

  • URN:统一资源名称。只标识资源而不提供位置信息。

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

URL格式组成:

协议:// + IP地址或者域名 + :端口号 + 服务器上资源的具体路径。资源路径中使用斜线(/)来分隔不同的路径组件

例如:

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

说明:

  • 协议和地址之间通过 ://分隔

  • 地址和端口号之间通过:分隔

  • 资源路径之间通过/分隔


HTP 响应状态码

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 无状态连接解决方案:

HTTP 是一种无状态的协议,意味着它不会自然地保持用户状态信息。每个 HTTP 请求都是独立的,服务器默认不会记住前一个请求的信息。


session + cookie 方案

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

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


Cookie和Session区别:

存储位置:

  • Cookiie:客户端

  • Session:服务端

存储内容:

  • Cookiie:存放Session ID

  • Session:存放用户的各种会话数据

容量大小:

  • Cookiie:每个 Cookie 4 KB

  • Session:由服务器的内存和资源决定。

数据发送:

  • Cookiie:同域请求时,Cookie 数据都会自动附加在 HTTP 请求头中发送到服务器。

  • Session:通过在 Cookie 中存储唯一的会话标识符来引用,数据本身不在每次请求中发送。


Token 机制:

Token 的主要作用确实是身份验证,但它也在一定程度上解决了 HTTP 协议的无状态问题。

身份验证: 用户首次登录时,服务端验证其凭证(如用户名和密码),然后生成一个 Token 发送给客户端。此后,客户端每次发送请求时都会附上这个 Token,服务端通过验证 Token 来识别用户身份。这个过程使得每个请求都能够被授权和验证,而无需每次都进行完整的登录过程。

解决HTTP无状态问题: Token 本身不会改变 HTTP 协议的无状态特性,但它提供了一种机制来在客户端维护状态信息(如用户的登录状态)。通过在客户端保存 Token,并在每次请求中将其发送到服务器,可以实现跨请求的状态维护。服务器不需要保存会话信息,只需要验证传入请求中的 Token 即可识别用户状态。


Token的购物车操作流程:

1、用户登录并获得服务端颁发的Token。

2、用户浏览商品并选择选择添加到购物车时,每次客户端的请求都会在 HTTP 请求中附带 Token。

3、服务器接收到请求,会验证 Token 的有效性。确认用户身份后,根据请求更新该用户的购物车数据。

4、用户可以继续浏览并添加或移除商品,服务器根据每个经过验证的请求更新购物车。


JWT介绍:

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

posted on 2024-01-15 14:29  背对背依靠  阅读(20)  评论(0编辑  收藏  举报