type
status
date
slug
summary
tags
category
password

1、HTTP是什么

HTTP(HyperText Transfer Protocol)的中文名是超文本传输协议,从字面上可以拆成三个部分:
  • 超文本
  • 传输
  • 协议
重点是什么叫超文本?我们先来理解「文本」,在互联网早期的时候只是简单的字符文字,但现在「文本」的涵义已经可以扩展为图片、视频、压缩包等,在 HTTP 眼里这些都算作「文本」。
再来理解「超文本」,它就是超越了普通文本的文本,它是文字、图片、视频等的混合体,最关键有超链接,能从一个超文本跳转到另外一个超文本。例如HTML 就是最常⻅的超文本了,它本身只是纯文字文件,但内部用很多标签定义了图片、视频等的链接,再经过浏览器的解释,呈现给我们的就是一个文字、有画面的网⻚了。
综合以上定义,HTTP 协议是一个在计算机世界里专⻔在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」
notion image
HTTP 规定在 HTTP 客户与 HTTP 服务器之间的每次交互,都由一个 ASCII 码串构成的请求和一个类似的通用因特网邮件扩充,即“类MIME (MIME-like)”的响应组成。HTTP 报文通常都使用 TCP 连接传送。HTTP 报文有以下特点:
  • 无连接。HTTP协议本身是无连接的。这就是说,虽然 HTTP 使用了 TCP 连接,但通信的双方在交换 HTTP 报文之前不需要先建立 HTTP 连接。但是需要先建立 TCP 连接。请求一个万维网文档所需的时间是该文档的传输时间(与文档大小成正比)加上两倍往返时间RTT(一个RTT用于连接TCP连接,另一个RTT用于请求和接收万维网文档。这里 TCP 建立连接的三次握手的第三个报文段中捎带了客户对万维网文档的请求)。
  • 无状态。也就是说,同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问时的相同(假定现在服务器还没有把该页面更新),因为服务器并不记得曾经访问过的这个客户,也不记得为该客户曾经服务过多少次。HTTP 的无状态特性简化了服务器的设计,使服务器更容易支持大量并发的 HTTP 请求。

2、HTTP的报文结构

HTTP有两类报文:
  • 请求报文:从客户向服务器发送请求报文。
  • 响应报文:从服务器到客户的回答。
notion image
HTTP请求报文和响应报文都是四个部分组成(这两种报文格式的区别就是开始行不同):
  1. 开始行:用于区分是请求报文还是响应报文。在请求报文中的开始行叫做请求行(Request Line),而在响应报文中的开始行叫做状态行(Status Line)。开始行包含三个部分,之间以空格分隔开,最后的 CRLF 分别代表“回车”和“换行”:
      • 方法(Method):请求类型,如 GETPOSTPUTDELETE 等。
      • 请求目标(Request-URI):资源的路径,例如 /index.html 或 /api/data
      • HTTP版本:如 HTTP/1.1 或 HTTP/2
  1. 请求头(Request Headers):用来说明浏览器、服务器或报文主体的一些信息,键值对形式,每行一个头部字段,格式为 Header-Name: value。例如:
    1. 空行:请求头和请求体之间必须有一个空行(即连续的两个 \r\n)。
    1. 请求体(Request Body):可选,仅用于需要传输数据的请求(如 POSTPUT)。格式由 Content-Type 指定。例如 JSON 请求体如下:
      示例:
      1、GET请求(无请求体)
      2、POST请求(带JSON请求体)

      2.1 HTTP状态码

      notion image
      1xx 类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。
      • 2xx 类状态码表示成功处理,服务器成功处理了客户端的请求,也是我们最愿意看到的状态。
        • 「200 OK」是最常⻅的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。
        • 「204 No Content」也是常⻅的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。
        • 「206 Partial Content」是应用于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。
      • 3xx 类状态码表示重定向,客户端请求的资源发送了变动,需要客户端用新的 URL 新发送请求获取资源。
        • 「301 Moved Permanently」表示永久定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。
        • 「302 Found」表示临时定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。301 和 302 都会在响应头里使用字段 Location ,指明后续要跳转的 URL,浏览器会自动􏰀定向新的 URL。
        • 「304 Not Modified」不具有跳转的含义,表示资源未修改,􏰀定向已存在的缓冲文件,也称缓存定向,用于缓存控制。
      • 4xx 类状态码表示客户端错误,客户端发送的报文有误,服务器无法处理。
        • 「400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。
        • 「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。
        • 「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。
      • 5xx 类状态码表示服务器错误,客户端请求报文正确,但是服务器处理时内部发生了错误。
        • 「500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。
        • 「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。
        • 「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
        • 「503 Service Unavailable」表示服务器当前很忙,暂时无法响应服务器,类似“网络服务正忙,请稍后试”的意思。

      2.2 HTTP头部(Headers)

      HTTP 头部(Headers)是 HTTP 请求和响应中的关键部分,用于传递额外的信息。以下是一些常用的 HTTP 头部字段:
      • 通用头部(General Headers)
        • Cache-Control:控制缓存行为(如 no-cachemax-age=3600)。
        • Connection:控制连接是否保持(如 keep-alive 或 close)。
        • Date:消息发送的日期和时间。
        • Pragma:旧版缓存控制(如 no-cache),通常用于向后兼容。
        • Transfer-Encoding:传输编码方式(如 chunked)。
        • Upgrade:升级协议(如切换到 WebSocket)。
        • Via:代理服务器信息。
      • 请求头部(Request Headers)
        • Accept:客户端可接受的响应内容类型(如 text/htmlapplication/json)。
        • Accept-Encoding:客户端支持的压缩编码(如 gzipdeflate)。
        • Accept-Language:首选语言(如 en-USzh-CN)。
        • Authorization:身份验证凭据(如 Bearer token)。
        • Cookie:客户端发送的 Cookie 数据。
        • Host:请求的目标主机和端口(如 example.com:80)。
        • Referer:当前请求的来源 URL。
        • User-Agent:客户端信息(如浏览器或爬虫标识)。
        • Content-Type(请求体类型,如 application/json)。
        • Content-Length(请求体的大小)。
        • Connection:客户端要求服务器使用 TCP 持久连接,以便其他请求复用。例如 Connection: keep-alive
      • 响应头部(Response Headers)
        • Content-Type:响应体的 MIME 类型(如 text/html; charset=utf-8)。
        • Content-Length:响应体的字节大小。
        • Content-Encoding:响应体的压缩方式(如 gzip)。
        • Set-Cookie:服务器设置 Cookie(如 sessionid=abc123; Path=/)。
        • Location:重定向目标 URL(状态码 3xx 时使用)。
        • Server:服务器软件信息(如 nginx/1.18.0)。
        • WWW-Authenticate:要求客户端认证(如 Basic realm="Secure Area")。
        • Access-Control-Allow-Origin(CORS 相关,如  或 https://example.com)。
      • 安全相关头部(Security Headers)
        • Strict-Transport-Security (HSTS):强制 HTTPS(如 max-age=31536000)。
        • X-Content-Type-Options:阻止 MIME 类型嗅探(nosniff)。
        • X-Frame-Options:防止点击劫持(如 DENYSAMEORIGIN)。
        • X-XSS-Protection:启用 XSS 过滤(如 1; mode=block)。
        • Content-Security-Policy (CSP):限制资源加载来源(如 default-src 'self')。
      • 自定义头部(Custom Headers)
        • 通常以 X- 开头(如 X-Request-IDX-Custom-Header)。

      3、HTTP版本的升级演变

      3.1 HTTP/1.0(1996年)

      • 短连接:每个请求/响应需要独立的 TCP 连接,频繁握手导致高延迟。
      • 无状态:默认不保持连接状态,每次请求需重新传输头部等信息。
      • 基础功能:支持 GET、POST 等基本方法,但缺乏缓存控制等高级特性。
      • 性能瓶颈:并行请求需多个 TCP 连接,资源占用高。

      3.2 HTTP/1.1(1997年,主流版本)

      HTTP/1.1 相比 HTTP/1.0 性能上的改进:
      • 长连接(Keep-Alive):改善了 HTTP/1.0 短连接造成的性能开销。
      • 管道传输(Pipelining):只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。
      • 分块传输(Chunked Encoding):支持流式传输,无需预先知道内容长度。
      • 缓存控制:引入 Cache-ControlETag 等头部,优化缓存策略。
      • Host 头:支持虚拟主机(一个 IP 托管多个域名)。
      但 HTTP/1.1 还是有性能瓶颈:
      • 头部冗长。只能压缩 Body 的部分,请求/响应头部(Header)未经压缩就发送,首部信息越多延迟越大。每次互相发送相同的头部造成的浪费较多。
      • 队头阻塞。服务器是按请求的顺序响应的,如果服务器响应慢,会导致客户端一直请求不到数据。
      • 没有请求优先级控制。
      • 请求只能从客户端开始,服务器只能被动响应。

      3.2 HTTP/2(2015年,基于 SPDY 协议)

      那 HTTP/2 相比 HTTP/1.1 性能上的改进:
      • 头部压缩(HPACK):通过 HPACK 算法,在客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,每个字段对应一个索引号,以后就不发送同样字段了,使用索引号代替字段,大大减小头部长度。
      • 二进制协议:不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式,头信息和数据体都是二进制,并且统称为帧(frame):头信息帧和数据帧。
      • Stream 和多路复用(Multiplexing):每个请求或回应的所有数据包,称为一个数据流(Stream)。每个Stream有独立的编号,客户端可以指定Stream的优先级。优先级高的Stream会被服务器优先响应。多个 Stream 复用一条 TCP 连接,不同 Stream 的帧是可以乱序发送的(Stream内部必须是有序的),达到并发的效果。
      • 服务器推送(Server Push):服务器可以主动向客户端发送消息。例如在浏览器刚请求 HTML 的时候,就提前把可能会用到的 JS、CSS 文件等静态资源主动发给客户端,减少延时的等待
      • 安全性:HTTP/2 协议是基于 HTTPS 的,所以 HTTP/2 的安全性也是有保障的。
      notion image
      对比总结:
      特性
      HTTP/1.0
      HTTP/1.1
      HTTP/2
      连接方式
      短连接
      长连接
      多路复用
      传输格式
      文本
      文本
      二进制
      队头阻塞
      严重(每个连接)
      存在(管道化按序响应)
      解决(单个连接并行)
      头部压缩
      HPACK 压缩
      服务器推送
      不支持
      不支持
      支持
      协议复杂度
      简单
      中等
      高(需 TLS 优先)

      4、SSL/TLS协议

      HTTP 是明文传输,存在安全⻛险的印花。为了保证 HTTP 报文在传输过程中不会被篡改、伪造、窃听,需要在 TCP 和 HTTP 网络层之间加入了一层安全协议,使得报文能够加密传输。目前广泛使用的安全协议有两个:
      • SSL(Secure Socket Layer)协议:SSL 协议是 Netscape 公司在 1994 开发的安全协议,广泛应用于基于万维网的各种网络应用(但不限于万维网应用)。SSL 作用在端系统应用层的 HTTP 和运输层之间,在 TCP 之上建立起一个安全通道,为通过 TCP 传输的应用层数据提供安全保障。主要版本:SSL 1.0(未发布)、SSL 2.0(1995年,已废弃)、SSL 3.0(1996年,已废弃)。目前 SSL 协议已经被淘汰,现代系统已禁用 SSL。
      • TLS(Transport Layer Security)协议:1995 年 Netscape 公司把 SSL 转交给 IETF,希望能够把 SSL 进行标准化。于是 IETF 在 SSL 3.0 的基础上设计了 TLS 协议,为所有基于 TCP 的网络应用提供安全数据传输服务。主要版本:TLS 1.0(1999年,基于SSL 3.0)、TLS 1.1(2006年)、TLS 1.2(2008年)、TLS 1.3(2018年)。
      对比项
      SSL
      TLS
      版本
      SSL 2.0/3.0(已废弃)
      TLS 1.0-1.3(1.2/1.3为主流)
      安全性
      弱,已知漏洞
      强,持续改进
      密钥交换
      支持不安全的RSA
      TLS 1.3仅前向安全算法
      性能
      握手慢
      TLS 1.3优化握手速度
      现状
      已淘汰
      行业标准
      虽然技术上不同,但“SSL”一词仍被广泛使用(如“SSL证书”),实际指的是 TLS 协议。证书本身与协议无关(如 X.509 证书可用于 SSL 或 TLS)。
      最佳实践:始终使用 TLS 1.2 或 1.3,禁用所有 SSL 版本以确保安全。
      SSL/TLS 协议的应用场景:
      • HTTPS:HTTP over TLS(默认端口443),最常用场景。
      • SMTPS/IMAPS:加密的邮件传输。
      • VPN:如 OpenVPN 基于 TLS 加密隧道。
      以 HTTP 使用 SSL/TLS 协议的场景为例(也被称为 HTTPS)。SSL/TLS 工作在应用层和运输层之间,在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
      notion image

      4.1 SSL/TLS 的握手过程

      SSL/TLS 的握手过程可以简化为两步:
      1. 握手阶段:协商加密方式、验证数字证书
      1. 传输阶段:使用握手阶段协商的对称加密算法(如 AES)加密应用数据并传输。
      握手阶段是建立安全连接的关键过程,分为以下步骤:
      1. ClientHello:客户端向服务器发送以下信息:
          • 客户端支持的 SSL/TLS 协议版本,如 TLS 1.2 版本。
          • 客户端生产的随机数(Client Random),后面用于生产「会话秘钥」。
          • 客户端支持的加密方法,如 RSA 加密算法。
          • 客户端支持的压缩方法。
      1. SeverHello:服务器响应客户端:
          • 确认 SSL/ TLS 协议版本,如果浏览器不支持,则关闭加密通信。
          • 服务器生产的随机数(Server Random),后面用于生产「会话秘钥」。
          • 使用的加密方法,如 RSA 加密算法。
          • 服务器的数字证书(包含服务器公钥)
      1. 验证证书:客户端首先通过浏览器或者操作系统中的 CA 公钥,确认服务器的数字证书的真实性。 如果证书没有问题,客户端会从数字证书中取出服务器的公钥,然后使用它加密报文,向服务器发送如下信息:
          • 一个随机数(Pre-Master Secret)。该随机数会被服务器公钥加密。
          • 加密通信算法改变通知,表示随后的信息都将用「会话秘钥」加密通信。
          • 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时把之前所有内容的发生的数据做个摘要,用来供服务端校验。
      1. 密钥交换:服务器收到客户端的第三个随机数(Pre-Master Secret)之后,使用三个随机数(Client RandomServer RandomPre-Master Secret)通过协商的加密算法计算出本次通信的「会话秘钥」(用于对称加密)。然后,向客户端发生最后的信息:
          • 加密通信算法改变通知,表示随后的信息都将用「会话秘钥」加密通信。
          • 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时把之前所有内容的发生的数据做个摘要,用来供客户端校验。
      notion image
      至此,整个 SSL/TLS 的握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的 HTTP 协议,只不过用「会话秘钥」加密内容
      简单的来说,SSL/TSL通过四次握手,主要交换三个信息:
      • 数字证书:该证书包含了公钥等信息,一般是由服务器发给客户端,接收方通过验证这个证书是不是由信赖的CA签发,或者与本地的证书相对比,来判断证书是否可信;假如需要双向验证,则服务器和客户端都需要发送数字证书给对方验证;
      • 三个随机数:这三个随机数构成了后续通信过程中用来对数据进行对称加密解密的“对话密钥”。首先客户端先发第一个随机数N1,然后服务器回了第二个随机数N2(这个过程同时把之前提到的证书发给客户端),这两个随机数都是明文的;而第三个随机数N3(这个随机数被称为Premaster secret),客户端用数字证书的公钥进行非对称加密,发给服务器;而服务器用只有自己知道的私钥来解密,获取第三个随机数。这样,服务端和客户端都有了三个随机数N1+N2+N3,然后两端就使用这三个随机数来生成“对话密钥”,在此之后的通信都是使用这个“对话密钥”来进行对称加密解密。因为这个过程中,服务端的私钥只用来解密第三个随机数,从来没有在网络中传输过,这样的话,只要私钥没有被泄露,那么数据就是安全的。
      • 加密通信协议:就是双方商量使用哪一种对称加密方式,假如两者支持的加密方式不匹配,则无法进行通信。常用的对称加密算法有两种,分别是 RSA 算法ECDHE 算法。RSA 是比较传统的密钥交换算法,它不具备前向安全的性质,因此现在很少服务器使用的。而 ECDHE 算法具有前向安全,所以被广泛使用。

      4.2 非对称加密&对称加密

      SSL/TLS 协议采用对称加密 + 非对称加密结合的「混合加密」方式:
      • 在通信建立前采用非对称加密的方式交换「会话秘钥」。服务器保存私钥,客户端保存公钥,双方验证成功后生成「会话秘钥」,
      • 在通信过程中全部使用对称加密的「会话秘钥」的方式加密明文数据。

      4.3 数字证书

      客户端验证服务器的公钥的合法性是 SSL/TSL 交互过程的关键,验证结果可以确定该地址是否正确的服务器地址而不是钓鱼网站地址。
      如何保证公钥不被篡改和信任度?为了提高公钥传输的安全性,第三方机构应运而生——证书颁发机构(CA,Certificate Authority)。CA 机构默认是受信任的第三方,由 CA 机构签发的数字证书称为 CA 证书(Certificate Authority Certificate)。一个标准的CA证书包含以下信息(基于X.509标准):
      • 颁发者(Issuer):签发证书的CA名称。
      • 主题(Subject):证书持有者的标识(如域名、组织名)。
      • 公钥(Public Key):用于加密或验证签名。
      • 有效期:起止日期(通常为1-2年,现代标准趋向更短)。
      • 签名算法:如SHA-256 with RSA。
      • 扩展字段:如密钥用途(Key Usage)、主题备用名称(SAN)等。
      CA 证书通常采用层级结构(根CA → 中间CA → 终端证书)。需确保整个链条完整且未被篡改。
      • 根证书:由 CA 机构自签发的顶级证书,预装在操作系统或浏览器中(如DigiCert、GlobalSign)。用于签发中间 CA 证书,通常离线保存以确保安全。
      • 中间证书:由根 CA 签发的次级证书,用于实际签发终端用户证书。作用是减少根证书暴露风险,增强灵活性。
      • 终端实体证书:颁发给最终用户的证书,如 SSL/TLS证书(用于网站,如https://)、代码签名证书(验证软件来源)、客户端证书(用户身份认证)。
      基于 CA 证书的通信过程:
      1. 服务器把自己的公钥注册到 CA。
      1. CA 对服务器的公钥采用散列技术生成一个摘要,使用 CA 私钥对该摘要进行加密,附在数字证书上,然后向服务器返回数字证书。
      1. 客户端向服务器发起请求,在三次握手成功后服务器向客户端返回包含服务器公钥的数字证书。
      1. 客户端使用 CA 公钥(一般已经事先存在系统上或浏览器上)对数字证书进行解密,同时对消息进行散列处理,得到摘要。比较摘要,验证数字证书的真实性。
      1. 客户端确认证书真实性后,使用服务器公钥对数据进行加密返回。
      1. 服务器收到数据使用服务器私钥进行解密,基于数字证书的通信过程完成。
      notion image

      4.3 HTTP和HTTPS的区别

      notion image
       
      计算机网路系列(三):传输层(TCP和UDP)计算机网络系列(一):基础篇
      Loading...