HTTP(HyperText Transfer Protocol) 超文本传输协议
是 浏览器 和 服务器 之间的传输数据规则,用来收发网页、图片、数据等
基于 TCP 传输,默认端口: 80
HTTP 请求报文 和 响应报文 以及 常见的字段
请求报文:
text
<方法> <请求URL> <版本>
<首部1>: <值1>
<首部2>: <值2>
...
<空行>
[请求体]
请求报文主要由四个部分组成:
- 请求行 : 包含了 方法 (比如GET、POST)、资源路径 、HTTP版本(如 HTTP/1.1)
- 请求头 :一堆键值对,用来传递额外信息
常见字段有:Host 指定服务器域名;Accept 告诉服务器客户端能接收什么类型的数据、Content-Type 如果是POST数据的话,指明发送的数据格式;Cookie 携带会话信息等等。 - 空行分隔请求头和请求体,代表首部结束
- 请求体主要是 POST 或 PUT 请求时 携带给服务器的数据
响应报文:
text
<版本> <状态码> <状态信息>
<首部1>: <值1>
<首部2>: <值2>
...
<空行>
[响应体]
响应报文,也由四个部分组成:
- 状态行 包括 HTTP版本、状态码 和 状态消息 比如 "HTTP/1.1 200 OK"。
- 响应头 也是 以键值对形式提供额外信息
Content-Type 返回数据类型; Content-Lenth 响应体长度;Set-Cookie 服务器向客户端设置 Cookie; Location 重定向目标 URL(配合 301/302/307等状态码) - 空行 分割 响应头和响应体,代表首部结束
- 响应体就是实际返回的内容,可能是HTML、JSON、图片等等,也可能为空
HTTP 请求方式?常用的 GET 请求和POST 请求区别?
请求方法包括:
-
GET 请求指定的资源,比如打开网页。
-
POST:向服务器提交数据,常用于表单提交或上传文件。
-
PUT:更新整个资源,一般需要提供完整的资源内容,非完整会替换为null或默认值。
-
PATCH:对资源进行部分更新,只传需要修改的字段。
-
DELETE:删除指定资源。
-
OPTIONS:查询服务器支持的请求方法,常用于跨域请求预检。
-
HEAD:类似GET,但只返回响应头,不返回实际内容,用于检查资源是否存在或获取元信息。
GET 请求 和 POST 请求的区别:
- 用途不同:GET 用于获取数据,POST 用于提交数据。
- 数据传输方式 :GET 把参数放在 URL 后面(如
?key=value),POST 把数据放在请求体里,不会显示在 URL 上。 - 安全性:安全性:GET请求由于参数暴露在URL中,安全性较低;POST请求参数不会暴露在URL中,相对更安全。
- 数据大小限制:GET 受 URL 长度限制(不同浏览器/服务器有差异,通常 2K 左右),POST 理论上没有大小限制,可以传大文件。
- 缓存:GET 请求可以被浏览器缓存,POST 默认不会被缓存。
HTTP 请求中常见的状态码

4xx 和 5xx 的核心区别在于:错误是谁造成的。
-
4xx(客户端错误):问题出在你这边。你的请求有语法错误、权限不足、找不到资源等。你需要修改请求。例如,401表示未授权,需要进行身份认证;403表示 服务器拒绝该请求;404表示 服务器未找到该资源。
-
5xx(服务器端错误):问题出在服务器那边。你的请求本身没问题,但服务器在处理时挂了、超时了、或者内部出错了。你只需等服务器修复,或者重试。例如 500表示服务器遇到错误,无法完成请求。503表示服务器正在维护中。
比较常用的状态码:
2xx:
200-请求成功、服务器返回相应的资源。最理想的状态码。
204-请求成功、服务器没有返回任何内容。常用与Delete请求,不需要返回数据。
206-
3xx:
301-永久重定向,请求的网页已永久移到了新的位置
302-临时重定向,请求的资源被临时移到了另一个URL
304-资源没有修改,客户端可以继续使用本地缓存
4xx:
400-请求有语法错误或参数错误,服务器无法理解
401-请求要求身份验证 ,未登录或认证失败
403-服务器理解了请求,但是拒绝处理,通常是权限不足(已登录,但权限不足)
404-服务器无法根据请求找到资源
5xx:
500-服务器内部错误,无法完成请求
502-服务器作为网关或代理,收到了上游服务器的无效请求,可能是上游应用进程挂了
503-服务器不可用,可能是在维护或过载
504-服务器作为网关或代理,没有从上游服务器接收到请求,因此关闭了与上游服务器的连接,可能是上游进程处理太慢
什么是强缓存和协商缓存:
强缓存和协商缓存是 HTTP 缓存机制的两种类型,它们用于减少服务器的负担和提高网页加载速度。
-
强缓存 :客户端在没有向服务器发送请求的情况下,直接从本地缓存中获取资源。强缓存通过 HTTP 响应头中的
Cache-Control字段实现,如max-age,告诉浏览器在指定时间内可以直接使用缓存数据,无需再次请求。 -
协商缓存 :当强缓存失效时,浏览器会发送请求到服务器,通过
ETag/If-None-Match或Last-Modified/If-Modified-Since这两对头部与服务器进行验证,以确定资源是否被修改。如果资源未修改,服务器返回 304 Not Modified 状态码,告知浏览器使用本地缓存;如果资源已修改,则返回新的资源,浏览器更新本地缓存。这种方式需要与服务器通信,但可以确保用户总是获取最新的内容。
Http 1.0 和 Http 1.1 的区别
持久连接
- HTTP/1.1 默认支持持久连接,即一个TCP连接上发送多个 HTTP 请求和响应,减少了连接建立和关闭的开销。
- HTTP/1.0 默认为短连接,每次请求都需要建立一个 TCP 连接,并通过
Connection: keep-alive头来实现持久连接。
管道化 - HTTP/1.1 支持管道化,允许客户端在第一个请求的响应到达之前发送多个请求,这可以减少等待时间,提高效率(管道化存在队头阻塞等问题,现代浏览器实际上更多是使用多个 TCP 连接来优化)。
- HTTP/1.0 不支持管道化。
缓存控制 - HTTP/1.1 则引入了更多的缓存控制策略 ,例如
Etag / If-None-Match等更多可供选择的缓存头来控制缓存策略。 - HTTP/1.0 主要使用
If-Modified-Since/Expires来作为缓存判断的标准
错误处理 - HTTP1.1 增加了一些新的 HTTP 状态码 ,如
100 Continue,用于增强错误处理和请求的中间响应。
例如:
HTTP/1.1 新增的 100 Continue 状态码,主要用于客户端上传大数据前先探路。
客户端发送带 Expect:100-continue 的请求头,先不发送请求体。
服务器检查权限、路径等是否合法,合法就返回 100 Continue。
客户端收到 100 后,才真正上传数据。
作用是避免大文件白传,节省带宽,提升上传效率。
Host头
- HTTP/1.1 引入了
Host头,允许客户端指定请求的主机名,这使得在同一台服务器上托管多个域名成为可能 - HTTP/1.0 没有这个字段
带宽优化 - HTTP/1.1 在请求头引入了
range头域,它允许只请求资源的某个部分,即返回码是206 (Partial Content) - HTTP1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能
Http 1.1 和 Http 2.0 的区别
二进制协议
- HTTP/2.0 采用二进制格式传输数据。字段位置、长度固定,更适合机器读取与解析
- HTTP/1.1 使用文本格式。
多路复用 - HTTP/2.0 支持多路复用,允许在单个 TCP 连接上并行交错发送多个请求和响应,解决了 HTTP/1.1 中的队头阻塞问题。
队头阻塞不是管道化造成的,根源在于 HTTP/1.1 响应必须严格按请求顺序返回
头部压缩
- HTTP/2.0 引入了 HPACK 压缩算法,对请求和响应的头部信息进行压缩,降低了头部信息的大小,提高了传输效率
服务器推送
- HTTP/2.0 允许服务器主动推送资源给客户端,而不需要客户端明确请求,这可以减少页面加载时间
Http 3.0
HTTP3.0 是 HTTP 协议的最新版本,它基于 QUIC 协议,有如下特点
安全性
- HTTP/3 默认使用 TLS 加密,确保了数据传输的安全性。
连接迁移 - QUIC 允许在网络切换(如从 Wi-Fi 到移动网络)时,将连接迁移到新的 IP 地址,从而减少连接的中断时间。
此外,QUIC 使用与 IP 无关的 Connection ID 标识连接,从而支持在移动网络切换(如 Wi-Fi 切换到 5G)时进行无缝连接迁移。
无队头阻塞
QUIC 使用 UDP 协议来传输数据。一个连接上的多个 stream 之间没有依赖,如果一个 stream 丢了一个 UDP 包,不会影响后面的 stream,不存在队头阻塞问题。
Https 和 Http 的区别
主要的区别是在安全性上:
- HTTPS 在 HTTP 的基础上添加了 SSL/TLS 协议作为加密层,保证数据传输的安全性。HTTP是明文传输
- HTTPS 的 端口是 443, HTTP 端口是 80
在TCP、HTTP之间加入了 SSL/TLS 安全协议 (TCP 三次握手后,需要进行 SSL/TLS的握手,使得报文能够加密传输
Https 的工作原理
HTTPS 主要基于 SSL/TLS 协议,确保了数据传输的安全性和完整性,其建立连接并传输数据的过程如下:
- 密钥交换:客户端发起 HTTPS 请求后,服务器会发送其公钥证书给客户端。 (客户端获得公钥证书)
- 证书验证:客户端会验证服务器的证书是否由受信任的证书颁发机构(CA)签发,并检查证书的有效性。(客户端验证公钥证书合法性)
- 加密通信:一旦证书验证通过,客户端会生成一个随机的对称加密密钥,并使用服务器的公钥加密这个密钥,然后发送给服务器。(客户端使用公钥加密 客户端随机生成的对称加密秘钥,然后发给服务器)
- 建立安全连接:服务器使用自己的私钥解密得到对称加密密钥,此时客户端和服务器都有了相同的密钥,可以进行加密和解密操作。(服务器使用私钥解密 获得对称加密秘钥。 此时获得了相同的加密秘钥,进行加密解密操作)
上述是获取对称加密秘钥的过程
- 数据传输:使用对称加密密钥对所有传输的数据进行加密,确保数据在传输过程中的安全性。接收方会进行解密,并进行完整性校验(数据传输)
- 结束连接:数据传输完成后,通信双方会进行会话密钥的销毁,以确保不会留下安全隐患。(销毁秘钥)
从输入 URL 到 页面展示 的过程
-
解析 URL:输入网址,解析URL信息,准备发送HTTP请求
-
查找缓存: 检查浏览器缓存里是否有缓存该资源,如果有直接返回;如果没有进入下一步网络请求。
-
DNS域名解析:网络请求前,进行DNS解析,以获取请求域名的IP地址。DNS解析时会按本地浏览器缓存 -> 本地Host文件 -> 路由器缓存 -> DNS服务器 -> 根DNS服务器的顺序查询域名对应IP,直到找到为止。
-
TCP三次握手建立连接:浏览器与服务器IP建立TCP连接。
-
客户端发送HTTP请求:连接建立后,浏览器端会构建请求行、请求头等信息,并把和该域名相关的Cookie等数据附加到请求头中,向服务器构建请求信息。如果是HTTPS的话,还涉及到HTTPS的加解密流程。
-
服务器处理请求并返回HTTP资源:服务器接收到请求信息,根据请求生成响应数据。
-
TCP四次挥手断开连接:浏览器与服务器IP断开TCP连接。
-
浏览器解析响应并渲染页面:
- 浏览器解析响应头。1、若响应头状态码为301、302,会重定向到新地址;2、若响应数据类型是字节流类型,一般会将请求提交给下载管理器;3、若是HTML类型,会进入下一部渲染流程。
- 浏览器解析HTML文件,创建DOM树,解析CSS进行样式计算,然后将CSS和DOM合并,构建渲染树;最后布局和绘制渲染树,完成页面展示。