面试中的网络协议(下:HTTP/HTTPS)
HTTP协议概述
HTTP(HyperText Transfer Protocol)是应用层协议,用于客户端与服务器之间的通信。它定义了请求方法、状态码、报文格式等规则,支持文本、图片、音视频等多种数据传输。HTTP的演进经历了多个版本,核心目标始终是提升性能、安全性和灵活性。
HTTP/0.9:简单超文本传输
HTTP/0.9诞生于早期网络环境,功能极为基础。它仅能传输小型HTML超文本,请求结构仅包含请求行,如“GET /index.html” ,无请求头和请求体。服务端响应也简单,没有返回头信息,且以ASCII字符流形式传输内容,应用场景局限于简单文本页面获取,无法满足复杂数据传输需求。
- 特点:
- 仅支持
GET方法,无请求头/响应头。 - 返回内容为ASCII字符流,仅传输HTML。
- 仅支持
- 示例:
GET /index.html
HTTP/1.0:引入头信息与多类型支持
- 1.0 需要解决的问题
- 浏览器需要知道服务器返回的内容是什么类型
- 浏览器需要知道服务器用的是什么压缩方式(文件越来越大需要压缩)
- 浏览器要能告诉服务器自己需要的语言类型
- 浏览器需要知道文件的编码类型
- 改进:
- 增加请求头(
Accept、User-Agent)和响应头(Content-Type、Content-Encoding)。 - 支持非ASCII编码(如图片、JS、CSS)。
- 引入状态码(如200、404)。
- 增加请求头(
- 缺陷:
- 短连接:每次请求需新建TCP连接,效率低。
| 特性 | 详情 |
|---|---|
| 请求头 | accept指定可接受媒体类型;accept-encoding表明支持的压缩方式;accept-language和accept-charset分别表示接受的语言和编码类型 |
| 响应头 | content-type说明返回数据类型;content-encoding是压缩方式;content-language是语言类型 |
此外,HTTP/1.0还引入了http状态码,不同范围的状态码代表不同含义:
| 状态码范围 | 含义 | 具体示例 |
|---|---|---|
| 2xxx | 成功状态 | 201:成功创建资源;204:成功,但没有返回内容;205:成功,报文不包含实体;206:成功,报文只含有实体的一部分 |
| 3xxx | 重定向 | 301:永久重定向;302:临时重定向;303:临时重定向,使用GET请求;304:协商缓存 |
| 4xxx | 客户端错误 | 400:客户端请求错误(报文存在语法问题);401:未授权;403:禁止访问;404:未找到 |
| 5xxx | 服务器错误 | 500:服务器内部错误;501:服务器不支持当前请求所需的某个功能;502:作为网关或代理的服务器从远程服务器接收到无效响应;503:服务器暂时超负载或停机维护,无法处理请求 |
HTTP/1.1:持久连接
1.1需要解决的问题
- 1.0 缺陷: 每一次请求都要重新建立连接,浪费资源
改进:
- 增加了 TCP 的持久连接(一个 TCP 连接中可传输多个 HTTP 请求)
- 允许同时建立 6 个 TCP 持久连接
- 增加了带宽优化机制(文件切片)
- 增加了 Host 字段(主机名)
- 客户端增加了 cookie
| 特性 | 详情 |
|---|---|
| 连接改进 | 引入持久连接,默认开启“Connection: keep-alive” ,允许同时建立6个TCP持久连接 |
| 新增功能 | 增加host字段支持虚拟主机;客户端引入cookie用于状态管理;具备带宽优化机制 |
| 问题 | 队头阻塞,前序请求未完成会阻塞后续请求 |
- 缺陷:
- 队头阻塞:同一连接中前序请求未完成,后续请求被阻塞。
- 带宽竞争:浏览器限制同一域名下最多6个TCP连接。
HTTP/2.0:二进制分帧与多路复用
2.0需要解决的问题
-
1.1 的缺陷
- 队头阻塞
- 带宽利用率低 (100M应该有12.5M/s,但是只有2.5M/s)
-
TCP 的慢启动
-
同时建立了 6 个 tcp 连接,导致每个连接之间竞争带宽
-
http队头阻塞
-
改进:
- 二进制分帧层:将请求全部打包成帧,帧与帧之间互不干扰,并打上编号,服务端可以根据编号的优先级来处理加急请求
- 多路复用:单连接内并行传输多个请求,解决队头阻塞。一个域名仅需建立一个TCP连接,请求和响应数据拆分成独立帧传输
- 头部压缩:HPACK算法减少冗余头信息。
- 服务器推送:主动推送静态资源(如CSS/JS)。
-
局限:
- 仍依赖TCP协议,存在TCP层队头阻塞。
HTTP/2的多路复用类似“切水果装箱”——将请求切分为碎片(帧),独立传输后重组,避免因一个大文件阻塞整个连接。
HTTP/1.1存在队头阻塞和带宽利用率低的问题。HTTP/2.0采用多路复用技术,一个域名只需建立一个TCP连接。通过二进制分帧层,将请求和响应数据拆分成独立帧,帧间互不干扰且有编号,服务端按编号优先级处理,解决了HTTP层面的队头阻塞。同时,使用HPACK算法压缩头部,减少传输开销,并支持服务器推送静态资源。
HTTP/3.0
2.0需要解决的问题
- TCP 的队头阻塞(超时重传)
- TCP 的慢启动
- TCP 建立连接和关闭连接(耗时)
- TCP 协议僵化
-
途径-底层协议:弃用TCP,改用UDP+QUIC协议。
- QUIC: 基于UDP协议 - 多路复用 - 有序性 - 快速握手 - 可靠 - 加密传输 - 流量控制
-
挑战:
- 网络设备对UDP支持不足,设备更换根本导致 3.0 没有普及开来,普及仍需时间。
HTTPS:安全的HTTP协议
HTTPS由HTTP与SSL/TLS协议组成,是HTTP的安全版本。TLS加密采用混合加密机制,非对称加密用于交换会话密钥,对称加密用于加密业务数据。
HTTPS = HTTP + SSL/TLS,通过加密传输和身份验证保障数据安全。
HTTP与HTTPS对比
| 特性 | HTTP | HTTPS |
|---|---|---|
| 协议 | 明文传输 | 加密传输(SSL/TLS) |
| 默认端口 | 80 | 443 |
| 安全性 | 数据可被窃听/篡改 | 防窃听、防篡改、身份认证 |
| 性能开销 | 无加密开销,速度快 | 加密计算增加延迟(优化后差异小) |
| SEO优化 | 无加成 | 搜索引擎排名优先 |
TLS加密:
-
对称加密:两边拥有相同的密钥,两边都知道如何解密
-
非对称加密:为了让两边拥有相同的密钥。过程如下:
- 客户端生成 密钥
- 服务端生成 公钥+私钥
- 服务端将 公钥 发送给客户端
- 客户端利用 公钥 加密 密钥 并传输给服务端
- 服务端用私钥解开 公钥 得到 密钥
TLS加密流程
源网侵删
非对称加密用于交换会话密钥
- Client Hello:客户端发送支持的加密套件和随机数。
- Server Hello:服务端选择加密套件,返回数字证书和随机数。
- 证书验证:客户端验证证书合法性(CA机构签发)。
- 密钥协商:客户端生成预主密钥,用证书公钥加密后发送。
- 生成会话密钥:双方基于随机数和预主密钥生成对称密钥
对称加密用于加密业务数据。
- 加密通信:后续数据使用对称密钥加密传输。
面试常见问题解答
(一)HTTP队头阻塞解决办法
HTTP/2.0通过多路复用和二进制分帧解决队头阻塞。在一个域名下建立一个TCP连接,请求拆成带编号的帧独立传输,接收端按编号重组,避免单个请求阻塞整体连接。HTTP/3.0基于QUIC协议,实现多路复用独立流,每个请求流独立传输,从根本上解决队头阻塞。
(二)HTTP与HTTPS区别
从协议层面看,HTTP明文传输,HTTPS加密传输;默认端口上,HTTP用80,HTTPS用443;安全性上,HTTP易被窃听篡改,HTTPS有多重安全保障;性能方面,HTTP无加密开销速度快,HTTPS因加密有延迟但优化后差距缩小;SEO优化上,HTTPS更具优势。
(三)对HTTP 3.0的理解
HTTP 3.0是基于QUIC协议的新一代HTTP协议。它抛弃TCP选用UDP,解决了TCP的诸多弊端。QUIC协议使HTTP 3.0具备快速连接、多路复用、前业纠错、可靠有序传输等特性,大幅提升性能。但因UDP在网络设备支持上的不足,普及进度受限。
(四)HTTP状态码
1常见HTTP状态码
| 状态码 | 含义 | 典型场景 |
|---|---|---|
| 200 | 请求成功 | 正常返回网页或API数据 |
| 301 | 永久重定向 | 域名更换后跳转新URL |
| 304 | 协商缓存生效 | 客户端资源未过期,直接使用缓存 |
| 404 | 资源未找到 | 请求的页面不存在 |
| 502 | 网关错误 | 后端服务无响应 |
总结
HTTP/HTTPS是Web通信的基石,其演进始终围绕性能、安全、兼容性展开。理解各版本特性、加密原理及协议差异,是应对网络协议面试题的关键。未来随着HTTP/3的普及,基于UDP的QUIC协议或将成为新一代标准。