当前位置: 首页 > news >正文

计算机网络八股——HTTP协议与HTTPS协议

前言:

到时候我想要写一篇文章就是:在浏览器中输入URL并按下回车会发生什么?

然后将几篇文章全部串联到一起,现在几天的任务就是将这里的每个小部分进行一个详细的介绍

HTTP1.1简述与特性

Web 上的通信都是建⽴在 HTTP 协议上的:

1. 客户端发起 HTTP 请求;

2. 服务器做出响应处理后,返回 HTTP 响应报⽂;

HTTP协议主要有以下特点:(注意这里指的是HTTP1.1协议的特性,对于更高级版本的HTTP协议里,很多特性已经不再适合。)

  • 报文格式简单,易于阅读
  • 灵活和易于扩展
  • ⽆状态
  • 明⽂传输、不安全

下面我将详细介绍以下HTTP协议的这几个特点:

1. 报文清晰易读

HTTP基本报⽂格式为header+body,头部信息也是key-value简单⽂本的形式,易于理解。

HTTP/1.1 的报文格式非常便于阅读,因为它:

  1. 是文本格式: 请求行、状态行和头部都是由可读的 ASCII/ISO-8859-1 字符组成的文本行。
  2. 结构清晰: 头部是简单的 "Key: Value" 形式,每行一个头部字段,以空行结束头部,后面跟着报文体(如果存在)。

这使得开发者、系统管理员等可以很方便地使用 telnetcurl -v 或者查看网络抓包工具(如 Wireshark)中的文本视图来直接阅读、理解和调试 HTTP/1.1 报文。

2. 灵活和易于扩展

HTTP协议⾥的各种请求⽅法、URI/URL、状态码、头字段等每个组成要求都没有被固定死,允许开发⼈员⾃ 定义和扩充; HTTP⼯作在应⽤层(OSI第七层),下层可以随意变化;

HTTPS就是在HTTP与TCP之间增加了SSL/TSL安全传输层,HTTP/3把TCP换成了基于UDP的QUIC。

常见状态码详细介绍

HTTP 协议规范(以及后续的 RFC 文档)定义了大量的标准状态码,用于表示服务器对客户端请求的处理结果。这些状态码被分组在不同的类别中:

HTTP 状态码(Status Code)只包含在 HTTP 响应报文中。它是响应报文的起始行(Status-Line)的一部分。

如果客户端收到了来自目标地址的有效的 HTTP 响应报文,并且其中包含了 HTTP 状态码,那么这基本上可以确定您已经成功连接到了目标服务器。

1xx

1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。

2xx

2xx 类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。 「200 OK」是最常见的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都 会有 body 数据。 「204 No Content」也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。 「206 Partial Content」是应用于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源 的全部,而是其中的一部分,也是服务器处理成功的状态。

3xx

3xx 类状态码表示客户端请求的资源发送了变动,需要客户端用新的 URL 重新发送请求获取资源, 也就是重定向。 「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次 访问。 「302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。

301 和 302 都会在响应头里使用字段 Location ,指明后续要跳转的 URL,浏览器会自动重定向新的

URL。 「304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定 向,用于缓存控制。

4xx

4xx 类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。 「400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。 「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。 「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。

5xx

5xx 类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误 码。 「500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并 不知道。 「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问 后端服务器发生了错误。 「503 Service Unavailable」表示服务器当前很忙,暂时无法响应服务器,类似“网络服务正忙,请稍 后重试”的意思。

3. ⽆状态

无状态

服务器不会保留任何关于客户端在之前请求中的信息或状态。每一次 HTTP 请求都是完全独立的,服务器处理当前的请求时,不会记住或依赖于客户端之前发送的任何请求。

简单来说,就像服务器得了“短期失忆症”。客户端每发送一个请求给服务器,服务器就像是第一次见到这个客户端一样,它只根据当前请求报文中的信息来进行处理和响应。

无状态带来了什么影响?

优点:

最大的优点就是:服务器设计简单: 服务器不需要为每个客户端维护大量的状态信息,大大简化了服务器的设计。

缺点:

  • 每次请求需要携带足够的信息: 由于服务器不记事儿,客户端每次发送请求时,必须携带所有必要的信息来完成本次请求。例如,如果要访问需要登录才能看到的页面,每次请求都需要带上身份认证信息。
     
  • 需要额外的机制来管理会话状态: 对于需要保持用户状态的应用(如购物车、用户登录),仅仅依赖无状态的 HTTP 是不够的。为了记住用户是谁、购物车里有什么,需要在 HTTP 协议之上引入其他的技术或方法来管理状态。

通过 Cookie(在客户端存储标识符)和 Session(在服务器端存储具体状态),我们就可以在无状态的 HTTP 协议上构建有状态的 Web 应用。

Cookie和Session

Cookie(客户端)中常见的保存内容包括:

  1. 会话标识符 (Session ID): 这是最常见和核心的用途。Cookie 中通常存储一个由服务器生成的唯一的 Session ID,用于在服务器端查找对应的 Session 数据。这个 Session ID 是服务器在用户第一次访问时生成的,并通过 HTTP 响应头部的 Set-Cookie 发送给浏览器。之后,浏览器在向同一个网站发送后续请求时,会自动在请求头部的 Cookie 字段中带上这个 Session ID 发送给服务器。
     
  2. 用户偏好设置: 比如用户选择的语言、主题、页面布局、是否记住用户名等简单的配置信息。
     
  3. 跟踪信息: 用于网站分析或广告跟踪,记录用户的访问行为、来源、最后访问时间等标识符或简单数据。
     
  4. 状态标志: 例如,用户是否已经看过某个新手引导、某个弹窗广告,或者接受了 Cookie 政策等。
     
  5. “记住我”功能相关的 Token: 为了实现长期登录(“记住我”),Cookie 中会存储一个由服务器生成的、用于下次访问时自动登录的 Token 或标识符,而不是直接存储用户名和密码(非常不安全)。

Cookie 保存的是用于在客户端和服务器之间传递或在客户端本地持久化少量信息的文本数据,主要用于用户识别、状态管理和个性化设置等方面,绝对不应该在 Cookie 中直接存储敏感信息,特别是用户的密码。

Cookie 一般可以被设置为在客户端长久保存,几天、几个月甚至几年。

Session(服务器端): Session 机制则负责在服务器端存储用户的具体状态信息。服务器接收到客户端发送的请求后,从 Cookie 中读取 Session ID。然后根据这个 Session ID,在服务器端的内存、数据库、文件或缓存(如 Redis)中查找对应的用户状态数据(例如:用户是否已登录、用户的用户名、购物车中的商品列表、用户的权限等)。

Session 的目的是为了在一次连续的、相对短暂的用户访问过程中维持状态。一旦用户离开、长时间不活动或明确结束会话,相关的 Session 数据就会被清理,以确保服务器资源的有效利用和数据安全。

服务器端的 Session 是临时存在的

4. 明⽂传输、不安全

HTTP 报文(特别是头部信息、请求 URL、以及报文体如果是文本格式的内容)在客户端和服务器之间传输时,是不经过加密的,直接以文本(字符串)的形式在网络上传输。

  • 易于理解和调试: 正因为是明文,开发者或管理员可以使用抓包工具(如 Wireshark)或者在浏览器开发者工具中直接看到 HTTP 请求和响应的详细内容,非常便于理解和调试。

  • 安全性风险: 这是明文传输最大的问题。由于数据是直接可读的,如果传输的内容包含敏感信息,比如:登录的用户名和密码,用户在表单中输入的个人信息,请求的 URL 本身(可能包含敏感参数)。

任何能够截获网络流量的第三方(比如在同一个 Wi-Fi 下的人、互联网服务提供商、网络路由器等)都可以直接读取这些信息,造成数据泄露的风险。

为了解决 HTTP 的明文传输带来的安全问题,就引入了 HTTPS。HTTPS 是在 HTTP 和 TCP 之间增加了一层 SSL/TLS 加密层。这样一来,即使 HTTP 报文内容是明文的,但在通过网络传输之前,整个报文会被 SSL/TLS 层加密,变成只有服务器(拥有私钥)才能解密的密文。传输过程中的第三方截获到的将是无法解读的乱码,大大提高了通信的安全性。

HTTP协议发展过程

⽬前为⽌,HTTP 常⻅的版本有 HTTP/1.1 , HTTP/2.0 , HTTP/3.0 ,不同版本的 HTTP 特性是不⼀样的。我们上面介绍到的HTTP/1.1的很多特点已经不适用 HTTP/2.0 , HTTP/3.0了。

关于HTTP1.1之前的版本我们就来进行简单了解一下就行啦:

HTTP/0.9

HTTP/0.9 是最早的HTTP版本,在1991年就已经发布,只⽀持 GET ⽅法,也没有请求头,服务器只能返回 HTML格式的内容。

HTTP/1.0

HTTP/1.0 是HTTTP 协议的第⼀个正式版本, 主要具有以下特性:

引⼊了请求头和响应头,⽀持多种请求⽅法和状态码

不⽀持持久连接,每次请求都需要建⽴新的连接,属于短连接

为了解决 HTTP/1.0 每次请求都需要建⽴新的连接的问题, HTTP/1.1 提出了⻓连接(持久连接),只要客户端和 服务器任意⼀端没有明确提出断开连接,则保持TCP连接状态

 

HTTP/1.1的不足

首先说一下HTTP/1.1的一些其他缺点,当然这是相对于HTTP/2.0的改进来说的啦。

1. 在 HTTP/1.1 中,为了确保通信的正确性和可靠性,客户端通常会等待接收到一个请求的完整响应后,才在同一个持久连接上发送下一个请求。

关于HTTP请求,我想先补充一下:访问一个网页(输入一次网址)需要发出多次 HTTP 请求这个知识。

一个标准的 HTTP 请求是为了获取一个特定的“资源”(Resource)。在很多情况下,这个“资源”对应于服务器上的一个文件(比如一个 HTML 文件、一个 CSS 文件、一个图片文件)。

一个网页是由多个文件进行组成的,所以访问一个网页需要多次发出HTTP请求,而我们的HTTP1.1协议的请求必须等到上一个HTTP请求的响应到达才可以发送下一个。这就导致浏览器渲染页面时候渲染得很慢,因为数据可能需要一段时间才能完全准备好。

虽然HTTP/1.1 理论上有一个叫做**管线化(Pipelining)**的功能,允许客户端在收到上一个请求的响应之前就发送下一个请求。如果管线化被完全启用且工作正常,那么就不需要等收到响应再发送下一个请求。但是几乎没有浏览器会采用HTTP/1.1的管线化。

因为HTTP1.1的管线化要求数据必须顺序响应,比如请求了1,2,3,响应也必须按照1,2,3来响应。

在 HTTP/1.1 开启管线化后,接收响应的顺序和请求顺序不一致(比如请求 1, 2, 3,响应收到 2, 1, 3),通常会导致直接的错误,浏览器也很难进行有效的暂存和重组

原因在于 HTTP/1.1 是基于文本流的协议,并且在同一个连接上,客户端解析响应必须是严格按照顺序来的。感觉HTTP/1.1的管线化很鸡肋,所以一般不开启HTTP1.1的管线化也正常!

为了提高HTTP/1.1请求响应速度,我们可以采用如下优化方式:

1. 建立多条tcp连接,这是现代浏览器在处理 HTTP/1.1 网页时默认采用的策略。它们通常会限制对同一个域名同时建立的连接数(一般是 6-8 个)。

2. 将一些文件内容尽可能合并,减少需要传输的文件数量,例如,将多个 CSS 文件合并成一个 CSS 文件,将多个 JS 文件合并成一个 JS 文件,将多个小图片合并成一个雪碧图 - Sprite Image)。

雪碧图:

  • 将网页中多个小图片(例如各种图标、按钮背景、小装饰图等)合并到一张大的图片文件中。
  • 在网页中使用这些小图片时,不再分别引用原始的单个图片文件。而是将需要使用小图片元素的背景图片设置为这张大的雪碧图
  • 然后,通过 CSS 的 background-position 属性,精确地控制元素的背景图片显示区域,只显示雪碧图中的某个特定小图片部分。同时设置元素的 widthheight 来定义这个显示区域的大小。

HTTP/2.0

二进制分帧层 (Binary Framing Layer):

  • 特点: 这是 HTTP/2 最基础的变化。HTTP/2 不再是 HTTP/1.1 那样的纯文本协议,而是在应用层和传输层之间增加了一个二进制分帧层。HTTP/2 的所有通信都被分解为更小的、带有标识符和长度前缀的二进制帧 (Frames)
  • 工作原理: 不同类型的消息(如头部、数据)都被封装在不同类型的帧中。这些帧拥有流标识符 (Stream Identifier),用于区分它们属于哪个请求或响应。
  • 带来的改进: 这是实现 HTTP/2 其他所有高级特性的基础。将报文分割成帧使得多路复用、优先级控制等成为可能,改变了 HTTP/1.1 基于文本和顺序解析的模式。

多路复用 (Multiplexing):

  • 特点: 允许在单个 TCP 连接上同时发送和接收多个 HTTP 请求和响应,并且它们可以乱序发送和到达。
  • 工作原理: 通过二进制分帧和流(Stream)的概念实现。每个请求/响应都在一个独立的逻辑流中进行,由唯一的 Stream ID 标识。不同流的帧可以在同一个 TCP 连接上交错发送。客户端和服务器根据帧的 Stream ID 将它们重新组装成完整的请求或响应。
  • 带来的改进 (解决 HTTP/1.1 队头阻塞和多连接开销): 这是 HTTP/2 解决 HTTP/1.1 应用层队头阻塞问题的核心机制。一个请求/响应的延迟不会阻塞同一连接上的其他请求/响应。同时,它大幅减少了 HTTP/1.1 中为了提高并行度而不得不建立多个 TCP 连接的开销(三次握手、四次挥手、慢启动等),降低了延迟和服务器资源消耗。

头部压缩 (Header Compression - HPACK):

  • 特点: 有效地压缩 HTTP 头部,减少重复数据的传输。
  • 工作原理: HTTP/2 使用 HPACK 压缩算法。它在客户端和服务器之间维护和更新一个共享的头部信息表,包括静态表(预定义常见的头部字段)和动态表(记录本次连接中发送过的头部)。传输头部时,如果头部字段是表中已有的,只需发送其索引;如果是新的字段,则发送其值并更新表。此外,还使用了 Huffman 编码对字符串进行压缩。
  • 带来的改进 (解决头部冗余): 大幅减少了重复发送的头部数据量,特别是在请求同一个网站的多个资源时,头部通常非常相似,压缩效果显著,节省了带宽,提高了传输效率。

强制使用 HTTPS (De Facto Requirement for HTTPS):

  • 特点: 虽然 HTTP/2 规范本身允许在明文 TCP 上运行(称作 h2c),但目前绝大多数主流浏览器(如 Chrome, Firefox, Edge, Safari)只支持在 TLS/SSL 加密连接上运行 HTTP/2(称作 h2)。
  • 带来的影响: 实际上促使了网站向 HTTPS 迁移,因为只有使用了 HTTPS,才能享受到 HTTP/2 带来的性能优势,从而提高了整个 Web 的安全性。

HTTP/3.0

HTTP/2.0仍然可能面临传输层(TCP 层面)的队头阻塞问题

因为 HTTP/2 的所有流(Streams)的数据帧都是在同一个 TCP 连接上进行传输的,它们的数据是被混合(多路复用)在一起发送的。如果 TCP 连接中的一个数据包丢失了,并且这个数据包中包含了多个 HTTP/2 流的帧数据,那么 TCP 层面的阻塞会导致所有这些流以及后续流的数据都无法及时递交给 HTTP/2 层进行处理和重组,直到丢失的数据包被恢复。

HTTP/3: 基于 UDP 的 QUIC 协议,提供了传输层面的多路复用。QUIC 的流是独立的,一个流的丢包不会阻塞其他流的数据传输。因此,HTTP/3 彻底解决了队头阻塞问题(包括应用层和传输层)。但是目前HTTP/3.0应用不广泛,目前用的最多的还是HTTP/2.0。

HTTPS协议

HTTP协议和HTTPS协议的区别

HTTP:超文本传输协议

HTTPS:超文本安全传输协议

HTTPS 本质上不是一个全新的、独立的协议,它更准确地说是一个 在安全层上运行的 HTTP 协议。它是在标准的 HTTP 协议与底层的传输协议(主要是 TCP)之间插入了 TLS/SSL(传输层安全/安全套接层) 协议。

当您建立一个安全的 HTTPS 连接时,实际使用的是 TLS 协议(通常是 TLS 1.2 或 TLS 1.3)

TLS 是 SSL 的继任者(或升级版本)。它是基于 SSL 3.0 演变而来的。SSL 版本(特别是 SSL 2.0 和 SSL 3.0)由于存在已知的严重安全漏洞,已经被弃用了。我们现在可以认为HTTPS = HTTP + TLS。

  • 安全性 (Security):

    • HTTP: 数据在客户端和服务器之间以明文形式传输。这意味着任何能够截获网络流量的第三方(如网络管理员、ISP、攻击者)都可以直接读取传输的数据内容,包括敏感信息(用户名、密码、支付信息等)。数据也容易被篡改而客户端无法得知。
       
    • HTTPS: 数据在传输前会经过 TLS/SSL 加密。截获的数据是加密后的密文,难以解读。TLS/SSL 还提供数据完整性检查,确保数据在传输过程中没有被篡改。此外,通过服务器身份认证(通常基于数字证书),客户端可以确认正在通信的服务器是合法的,防止中间人攻击。

  • 协议层级 (Protocol Stack):

    • HTTP: 直接运行在 TCP 协议之上。
    • HTTPS: 运行在 TLS/SSL 协议之上,而 TLS/SSL 又运行在 TCP/UDP 协议之上。简而言之,是 HTTP -> TLS/SSL -> TCP/UDP

  • URL 前缀 (URL Scheme):

    • HTTP: 使用 http://
    • HTTPS: 使用 https://

  • 默认端口 (Default Port):

    • HTTP: 默认使用端口 80
    • HTTPS: 默认使用端口 443

  • 证书要求 (Certificate Requirement):

    • HTTP: 不需要任何证书。
    • HTTPS: 服务器必须拥有由受信任的证书颁发机构 (CA) 颁发的 SSL/TLS 数字证书。这个证书用于证明服务器的身份。虽然获取证书曾需要付费,但现在有许多机构提供免费证书(如 Let's Encrypt)。

  • 连接建立过程 (Connection Process):

    • HTTP: TCP 三次握手即可开始传输 HTTP 数据。
    • HTTPS: 在 TCP 三次握手之后,还需要进行 TLS/SSL 握手过程。这个握手过程用于协商加密算法、交换密钥、进行身份验证等。这会增加一些初始连接建立的延迟。

HTTP 本身不加密,HTTPS 的加密是由 TLS/SSL 层完成的,通过复杂的握手过程(利用非对称加密和证书认证)来安全地协商出会话期间用于数据传输的对称密钥,然后使用该对称密钥对所有 HTTP 数据进行快速加密传输。

HTTPS中的加密方式

对称加密

对称加密也称为私钥加密,使⽤相同的密钥来进⾏加密和解密。 在加密过程中,明⽂数据通过应⽤特定的算法和密钥进⾏加密,⽣成密⽂数据。解密过程则是将密⽂数据应⽤ 同样的算法和密钥进⾏解密,恢复为明⽂数据。 由于加密和解密都使⽤相同的密钥,因此对称加密算法的速度通常较快,但密钥的安全性很重要。如果密钥泄漏,攻击者可以轻易地解密数据

对称加密指的就是,双方都知道加密的算法,并且都拥有解密的钥匙,但是这个钥匙如果不小心被攻击者知道的话,即使双方通信时使用的是加密好的文件,攻击者也可以用偷来的钥匙进行解开。你可能会想为什么这个私钥有机会被攻击者偷到呢?因为这个私钥一定是需要一方通过网络明文传递给另一方的,这样就给了攻击者可乘之机。

⾮对称加密

⾮对称加密也称为公钥加密,使⽤⼀对不同但相关的密钥:公钥和私钥。 公钥⽤于加密数据,私钥⽤于解密数据。如果使⽤公钥加密数据,只有拥有相应私钥的⼈才能解密数据;如果 使⽤私钥加密数据,可以使⽤相应公钥解密。 除了加密和解密,⾮对称加密还⽤于【数字签名】,可以验证消息的来源和完整性。

非对称加密实际上是把制作这把锁的方法公开,任何人都可以按照你说的方法来制造这把锁并且把想要保密的内容锁上,然后只有你自己有这把钥匙打开!钥匙一直掌握在你自己的手中,没有进行传播,不可能出现泄露。

你可能会想就是为什么制作锁的方式公布出去了之后,难道不能通过这个锁推断出钥匙是什么样子的吗?这就涉及数学中的陷门单向函数

        例如 RSA 算法。生成密钥时,你选择两个非常大的素数作为私钥的一部分,然后将它们相乘得到一个更大的合数,这个合数就是公钥的一部分。乘法是容易的。但给定一个非常大的合数,想要找出它的两个原始素数因子(分解因数),在目前没有任何已知的快速算法,计算量会随着数字的增大呈指数级增长。

HTTPS中的 非对称加密+对称加密

HTTPS 中采用的加密算法是 非对称加密 + 对称加密 的混合加密方式

  1. 在握手阶段 (Handshake Phase):

    • 主要使用非对称加密。这是为了安全地协商和交换用于后续数据传输的对称密钥。因为非对称加密的公钥(锁的制作方法)是公开的,发送方可以用公钥加密一个密钥,只有拥有对应私钥的接收方能解密得到,这样发送方和接收方就都获得了对称加密算法中的私钥,并且这个私钥没有在网络中以明文的方式传播,所以黑客是获取不到对称加密的私钥的。
       
    • 同时,非对称加密(通过数字签名)也用于验证服务器的身份(客户端使用 CA 的公钥验证服务器证书上的签名)。
  2. 在数据传输阶段 (Data Transfer Phase):

    • 一旦握手完成,双方就使用在握手阶段协商和生成好的对称密钥来对实际传输的大量 HTTP 数据(请求头、体、响应头、体)进行对称加密

为什么采用混合方式?

  • 非对称加密虽然安全(密钥交换和身份验证),但计算开销大,速度慢,不适合用来加密大量的数据。
  • 对称加密计算开销小,速度快,适合用来加密大量的数据,但它的问题在于如何安全地在通信双方之间共享密钥。

HTTPS 的混合加密正是解决了这个矛盾:利用非对称加密的安全性来解决对称密钥的共享问题(安全地交换对称密钥),然后利用对称加密的高效性来解决大量数据加密的问题。

HTTPS中建立连接的方式

HTTPS 连接的建立过程可以分解为两个主要步骤:

  1. 底层 TCP 连接建立 :

    • 这是任何基于 TCP 的网络通信(包括 HTTP 和 HTTPS)都需要的第一步。
    • 客户端和服务器之间进行经典的 TCP 三次握手 (Three-Way Handshake)
      • 客户端 -> 服务器: SYN (同步序列号)
      • 服务器 -> 客户端: SYN-ACK (同步序列号并确认)
      • 客户端 -> 服务器: ACK (确认)
    • 握手成功后,客户端和服务器之间就建立了一个可靠的、双向的 TCP 连接。
  2. TLS/SSL 安全连接建立
    • 客户端向服务器索要并验证服务器的公钥(非对称加密)。
    • 双⽅协商⽣产「会话秘钥」(对称加密)。
    • 双⽅采⽤「会话秘钥」进⾏加密通信。

相关文章:

计算机网络八股——HTTP协议与HTTPS协议

前言: 到时候我想要写一篇文章就是:在浏览器中输入URL并按下回车会发生什么? 然后将几篇文章全部串联到一起,现在几天的任务就是将这里的每个小部分进行一个详细的介绍 HTTP1.1简述与特性 Web 上的通信都是建⽴在 HTTP 协议上的…...

JAVAEE(网络原理—UDP报头结构)

我们本篇文章要讲的是UDP的报头结构以及注意事项。 下面呢,我先说一下UDP是什么? 1.UDP是什么? UDP是一种网络协议。网络协议是计算机网络中,为了使不同设备之间能够准确、高效地进行数据交换和通信,而预先制定的一…...

Redis-分布式锁

Redis-分布式锁 文章目录 Redis-分布式锁1.基本原理和不同方式实现方式对比2.Redis分布式锁的基本实现思路3.分布式锁误删问题一4.分布式锁误删问题二5.Redission1.功能介绍2.快速入门3.可重入锁原理4.锁重试和WatchDog机制1.锁重试2. WatchDog 机制(锁自动续期&…...

如何优雅地为 Axios 配置失败重试与最大尝试次数

在 Vue 3 中,除了使用自定义的 useRequest 钩子函数外,还可以通过 axios 的拦截器 或 axios-retry 插件实现接口请求失败后的重试逻辑。以下是两种具体方案的实现方式: 方案一:使用 axios 拦截器实现重试 实现步骤: 通…...

Windows使用SonarQube时启动脚本自动关闭

一、解决的问题 Windows使用SonarQube时启动脚本自动关闭,并发生报错: ERROR: Elasticsearch did not exit normally - check the logs at E:\Inori_Code\Year3\SE\sonarqube-25.2.0.102705\sonarqube-25.2.0.102705\logs\sonarqube.log ERROR: Elastic…...

MYSQL初阶(暂为自用草稿)

目录 基本操作 database操作 table操作 数据类型 INT类型 bit类型 FLOAT类型 CHAR类型 DATE类型 SEL类型 表的约束 列约束 NULL DEFAULT PRIMARY KEY UNIQUE KEY 表约束 PRIMARY KEY FOREIGN KEY 其他补充 AUTO_INCREMENT COMMENT ZEROFILL 表的CRUD …...

交换排序——快速排序

交换排序的基本思路:把序列中的两个元素进行比较,根据需求对两个元素进行交换。特点是较大的元素向序列的尾部移动,较小的元素向序列的前部移动。 hoare法 在序列中任取一个元素作为基准值,一趟排序完成之后,以基准值为…...

资源-又在网上淘到金了

前言: 本期再分享网上冲浪发现的特效/动画/视频资源网站。 一、基本介绍: mantissa.xyz,about作者介绍为:Midge “Mantissa” Sinnaeve (米奇辛纳夫)是一位屡获殊荣的艺术家和导演,提供动画、…...

CSS中的`transform-style`属性:3D变换的秘密武器

在CSS中,当我们尝试创建复杂的3D场景时,transform-style属性变得尤为重要。它决定了子元素是在3D空间中呈现还是被展平到2D平面中。本文将深入探讨transform-style的用法,并通过具体的代码示例来展示如何利用这个属性来增强你的网页设计。 什…...

Step文件无法编辑怎么办?

Step文件无法编辑怎么办? 这里介绍两种方法, 1、 直接导入 准备step文件,solidworks导入后是这样,不能在上面直接编辑 图 1 点击右键,选择解除特征(不同版本的可能不太一样,这里是solidworks2…...

从 LabelImg 到 Label Studio!AI 数据标注神器升级,Web 版真香

视频讲解: 从 LabelImg 到 Label Studio!AI 数据标注神器升级,Web 版真香 Label Studio 支持图像、文本、音频、视频、时间序列等多类型数据标注,覆盖计算机视觉(目标检测、语义分割)、自然语言处理&#x…...

纯FPGA实现驱动AD9361配置的思路和实现之一 概述

我们在做ZYNQ系统开发时候做的IP基本都是AXI_LITE_SLAVE,是SLAVE,从设备。就是提供了若干寄存器接口供MASTER进行读写。SLAVE里面的逻辑通过读写动作或者读写的数据进行响应的动作。这种方式的好处是硬件层面可以访问寄存器,软件层面是可以实…...

Nacos配置中心服务端源码解析

文章目录 概述一、配置持久化到数据库二、发布事件2.1、事件发布者端2.1.1、DefaultPublisher#publish2.1.2、DefaultPublisher#run2.1.3、DefaultPublisher#receiveEvent 2.2、事件订阅者端2.2.1、Subscriber#onEvent2.2.2、ConfigCacheService#dump 总结:Nacos 配…...

SAP系统工艺路线的分配物料出现旧版包材

问题:工艺路线的物料错了 这是3月份技术部发现的问题,10000209这个成品有两个版本的BOM, 在创建新版的工艺路线里,发现分配的物料仍然是旧版的物料. 原因排查: 1 BOM中物料错误? 2 选错了生产版本,选了版本1? 3 生产版本设置中的可选BOM错误? 解决:把可选的BOM…...

JVM虚拟机--JVM的组成

(一)JVM的组成 一、JVM介绍 (1)JVM的作用 我们知道,Java代码要想在计算机中正常运行,就需要经过编译为class二进制字节码文件,而JVM就提供了class二进制字节码的运行环境。 一次编写,到处运行 因为JVM是…...

科学研究:怎么做

科研(科学研究)​​ 是指通过系统化的方法,探索自然、社会或人文领域的未知问题,以发现新知识、验证理论或解决实际问题的活动。它的核心是​​基于证据的探索与创新​​,旨在推动人类认知和技术的进步。 科研的核心要…...

PyTorch数据操作基础教程:从张量创建到高级运算

本文通过示例代码全面讲解PyTorch中张量的基本操作,包含创建、运算、广播机制、索引切片等核心功能,并提供完整的代码和输出结果。 1. 张量创建与基本属性 import torch# 创建连续数值张量 x torch.arange(12, dtypetorch.float32) print("原始张…...

微服务治理与可观测性

服务注册与发现 核心功能 服务实例动态变化:实例可能因扩缩容、故障或迁移导致IP变动。服务依赖解耦:调用方无需硬编码服务地址,降低耦合度。负载均衡:自动选择健康实例,提升系统可用性。 核心组件 服务注册中心&am…...

如何对docker镜像存在的gosu安全漏洞进行修复——筑梦之路

这里以mysql的官方镜像为例进行说明,主要流程为: 1. 分析镜像存在的安全漏洞具体是什么 2. 根据分析结果有针对性地进行修复处理 3. 基于当前镜像进行修复安全漏洞并复核验证 # 镜像地址mysql:8.0.42 安全漏洞现状分析 dockerhub网站上获取该镜像的…...

OpenCV 04.19 练习

1. 创建一个 PyQt 应用程序,该应用程序能够: 1.使用 OpenCV 加载一张图像。 2.在 PyQt 的窗口中显示这张图像。 3.提供四个按钮(QPushButton): - 一个用于将图像转换为灰度图 - 一个用于将图像恢复为原始彩色图 - 一个…...

uv:重新定义Python开发效率的下一代工具链

在Python生态系统中,包管理和项目工具链的复杂性一直是开发者面临的一大挑战。从依赖管理、虚拟环境创建到多版本Python切换,传统的工具链(如pip、virtualenv、poetry等)虽然功能强大,但操作繁琐、性能不足的问题长期存在。而uv的出现,以颠覆性的速度和功能集成,为Pytho…...

【Easylive】​​Gateway模块 bootstrap.yml 解析

【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版 Gateway模块 bootstrap.yml 常规解析 该配置文件定义了 Spring Cloud Gateway 的核心配置,包括 环境配置、服务注册、动态路由规则 等。以下是逐项解析: 1. 基础配…...

Warcraft Logs [Classic] [WCL] Usage Wizard <HTOC>

‌HTOC(十字军的试炼)副本中各个BOSS的ID如下‌: ‌629 - 诺森德野兽‌ ‌633 - 加拉克苏斯大王‌ ‌637 - 派系冠军‌ ‌641 - 瓦格里双子‌ ‌645 - 阿努巴拉克‌ encounterID!637 and encounterID!641 encounterID NOT IN (637,641) 伤害 …...

多模态大语言模型arxiv论文略读(二十八)

MM-SAP: A Comprehensive Benchmark for Assessing Self-Awareness of Multimodal Large Language Models in Perception ➡️ 论文标题:MM-SAP: A Comprehensive Benchmark for Assessing Self-Awareness of Multimodal Large Language Models in Perception ➡️…...

JavaScript数据类型简介

在JavaScript中,理解不同的数据类型是掌握这门语言的基础。数据类型决定了变量可以存储什么样的值以及这些值能够执行的操作。JavaScript支持多种数据类型,每种都有其特定的用途和特点。本文将详细介绍JavaScript中的主要数据类型,并提供一些…...

CasualLanguage Model和Seq2Seq模型的区别

**问题1:**Causal Language Modeling 和 Conditional Generation 、Sequence Classification 的区别是什么? 因果语言模型(Causal Language Model): 预测给定文本序列中的下一个字符,一般用于文本生成、补全句子等,模型…...

在Qt和OSG中动态改变部分3D模型数据

要在Qt和OSG环境中导入3D模型并只对部分数据进行动态改变,你可以采用以下方法: 基本实现步骤 加载模型:使用OSG的读取器加载3D模型文件 访问特定部分:识别并获取模型中需要修改的部分 动态修改:在Qt界面或逻辑中设置修改这些部分的机制 更新显示:确保修改后的模型能够实…...

命令update-alternatives

❯ which pip /home/ying/anaconda3/bin/pipying192 ~ [2]> which pip /usr/bin/pip使用update-alternatives对他们进行管理和切换 快捷方式 和 实际路径不可以相同 所以我这边选择了/usr/local/bin目录作为介质存储快捷方式,另外该快捷方式会自己创建我们只需选…...

10.thinkphp的响应

响应输出 响应操作 1. 响应输出,有好几种:包括return、json()和view()等等; 2. 默认输出方式是以html格式输出,如果你发起json请求,则输出json; 3. 而背后是response对象,可以用response()输…...

【技术派后端篇】技术派中的白名单机制:基于Redis的Set实现

在技术派社区中,为了保证文章的质量和社区的良性发展,所有发布的文章都需要经过审核。然而,并非所有作者的文章都需要审核,我们通过白名单机制来优化这一流程。本文将详细介绍技术派中白名单的实现方式,以及如何利用Re…...

Keil A51汇编伪指令

以下是 Keil A51 汇编器支持的常用伪指令 及其详细说明,涵盖代码结构、数据定义、条件编译等关键功能,结合实际应用场景进行分类和示例: 一、程序结构与地址控制 伪指令功能语法示例说明ORG设置代码/数据起始地址ORG 0000H后续代码从指定地址…...

Windows上安装FFmpeg的详细指南

1.下载FFmpeg 访问FFmpeg官方下载页面:https://ffmpeg.org/download.html 点击"Windows builds from gyan.dev"或"Windows builds by BtbN" gyan.dev版本:https://www.gyan.dev/ffmpeg/builds/ BtbN版本:https://githu…...

jmeter利用csv进行参数化和自动断言

1.测试数据 csv测试数据如下(以注册接口为例) 2.jemer参数化csv设置 打开 jmeter,添加好线程组、HTTP信息头管理器、CSV 数据文件设置、注册请求、响应断言、查看结果树 1) CSV 数据文件设置 若 CSV 中数据包含中文,…...

《Android 应用开发基础教程》——第二章:Activity 与生命周期详解

目录 第二章:Activity 与生命周期详解 2.1 什么是 Activity? 作用: 2.2 创建一个 Activity 示例代码 Manifest 注册: 2.3 Activity 生命周期(Life Cycle) 生命周期图解: 2.4 生命周期代…...

[Java]反射、String类补充

目录 1、反射定义 2、用途(了解) 3、反射相关的类 4、Class类(反射机制的起源) 4.1、相关方法 5、反射示例 5.1、获取Class对象 5.2、反射的使用 6、反射优点和缺点 7、String类补充 7.1、创建对象的思考 8、字符串常量池 9、再谈String对象创建 10、intern方法 …...

word表格批量操作——宏

word中所有表格代码 这个是表格的模板代码 Sub 表格通用代码() For i ActiveDocument.Tables.Count To 1 Step -1ActiveDocument.Tables (i) Next End Sub1、根据内容自动调整表格 Sub 表格适用内容() For i ActiveDocument.Tables.Count To 1 Step -1ActiveDocument.Tabl…...

eSTK.me

eSTK.me 调用 USIM 卡的 Applet 实现在 iOS 内自助切换 Profile。写卡仍然需要借助硬件读卡器或者兼容 eSIM 的 Android 手机。支持国行 iPhone。 eSTK.me(固件 v2.x 及以后的版本)基于 ETSI 的 Bearer Independent Protocol (BIP) 协议,使…...

四级英语备考指南

一、引言 大学英语四级考试是对大学生英语综合能力的一次重要检验。无论是为了学业要求,还是提升自身竞争力,顺利通过四级考试都有着重要意义。本文将为大家详细介绍四级英语的备考策略,帮助大家高效备考,取得理想成绩。 二、了…...

Java Web 之 互联网协议 100问

HTTP是什么? HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最广泛的协议之一,用于在客户端(如浏览器)和服务器之间传输数据。它是 Web 通信的基础,支持浏览器访…...

【单倍型理解及计算系列之二】单倍型基本概念以及其与遗传定位中Bin的定义区别

问题:如何理解单倍型,与遗传定位中Bin的定义区别: 简而言之:就是单倍型是基于LD,通常为连锁不平衡(LD)较高的区域形成。但bin是人为划分的,如以固定SNP数量/固定长度设置&#xff0…...

ArcPy Mapping 模块基础

在地理信息系统(GIS)的应用中,地图制作是一个非常重要的环节。无论是生成用于展示的静态地图,还是动态更新的地图服务,都需要高效且灵活的工具来实现。ArcPy 提供了强大的mapping模块,可以帮助用户自动化地…...

AcWing 11:背包问题求方案数 ← 0-1背包

【题目来源】 https://www.acwing.com/problem/content/11/ 【题目描述】 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总…...

Redis增删改查

### 进入redis控制台 redis-cli --raw #加上raw,防止中文乱码### 增 127.0.0.1:6379> LPUSH list0 "hello" #增加一个list 1 127.0.0.1:6379> LRANGE list0 0 -1 #查看list hello### 删 127.0.0.1:6379> DEL list0 #删除list 1 127.0.0.1:6379> LRANG…...

多道程序和多任务操作系统区别

多道程序 vs. 多道任务:对比分析 ✅ 共同点 方面共同特征核心机制都依赖于进程/任务切换执行需求实现多个程序或任务"并发"执行系统支持都需要操作系统的支持(如调度算法、内存管理)本质目标提高资源利用率(CPU不空转…...

【MySQL】MySQL建立索引不知道注意什么?

基本原则: 1.选择性原则: 选择高选择性的列建立索引(该列有大量不同的值) 2.适度原则:不是越多越好,每个索引都会增加写入开销 列选择注意事项: 1.常用查询条件列:WHERE字句中频繁使用的列 2.连接操作列…...

区块链木材业务服务平台:商贸物流新变革

区块链木材业务服务平台:商贸物流新变革 在全球商贸物流行业不断发展的当下,木材贸易作为其中重要的一环,面临着诸多挑战。区块链木材业务服务平台的出现,为木材商贸物流领域带来了全新的解决方案,正逐步引领行业走向…...

【AI提示词】经济学家

提示说明 经济学家致力于提供深入的经济分析和预测,帮助用户理解经济趋势、政策影响以及市场动态。他们通过专业的经济模型和数据分析,为用户在投资、决策等方面提供指导。 提示词 # 角色 经济学家## 注意 1. 经济学家专家需要具备深入分析经济现象的…...

C++用于保留浮点数的两位小数,使用宏定义方法(可兼容低版本Visual Studio)

文章目录 一、 描述二、 样例二、 结果输出 一、 描述 这个宏定义(可放入.h头文件里)使用基本的数学运算,几乎兼容所有版本的VS,以下可对正数做四舍五入: #define ROUND_TO_TWO(x) ( (floor((x) * 100 0.5) / 100) …...

kimi+deepseek制作PPT

文章目录 KIMI简介一、基本信息二、核心特点三、服务理念 Deepseek简介PPT关键词提示 KIMI简介 KIMI官网:Kimi - 会推理解析,能深度思考的AI助手 一、基本信息 名称 :KIMI开发团队 :月之暗面科技有限公司上线时间 :…...

Linux-进度条小程序

1. 回车和换行的差异 在输出文本时,回车和换行符的作用是非常不同的。了解它们的行为有助于我们控制输出的方式。 回车(\r):回车符将光标移到当前行的开头,但并不会自动换行。它的作用是覆盖当前行的内容。 换行&…...