Skip to content

HTTP 基础:分层、长短连接、GET/POST 与状态码 ​

问题 ​

  • HTTP 是哪一层的协议?底层基于什么实现?
  • HTTP 长连接和短连接有什么区别?什么是 Keep-Alive?
  • GET 和 POST 有什么区别?
  • HTTP 状态码有哪些类别?常见状态码是什么?

结论 ​

理解路径 ​

HTTP 是应用层协议,底层基于 TCP;理解这一层级关系后,长短连接的本质(TCP 连接复用)、GET/POST 的语义设计、状态码的分类都会更清晰。

HTTP 协议分层 ​

HTTP 是应用层协议,底层基于 TCP(传输层)实现。每次 HTTP 请求前需要先完成 TCP 三次握手建立连接。

长连接与短连接 ​

短连接长连接(Keep-Alive)
默认版本HTTP/1.0HTTP/1.1 起默认
连接行为每次请求新建 TCP 连接,响应后即断开TCP 连接保持,下次请求复用
请求头标志—Connection: keep-alive
保持时长—服务器可配置超时(如 Apache keepalivetimeout)

本质:HTTP 长/短连接就是 TCP 长/短连接,复用的是底层 TCP 通道。

适用场景:

  • 长连接:操作频繁、点对点通信、连接数可控(如数据库连接、即时通信)
  • 短连接:并发量大、每用户操作不频繁(如普通 Web 页面请求)

GET vs POST ​

本质相同:GET 和 POST 都是 TCP 连接,HTTP 协议层并没有限制 GET 不能带 body、POST 不能带 URL 参数。"POST 数据放 body、GET 数据放 URL"是 HTML 标准的约定,不是 HTTP 本身的要求。

语义区别:

GETPOST
语义获取资源提交/修改数据
幂等是(多次请求结果相同,不修改服务器状态)否(每次可能产生副作用)

应用层常见区别:

维度GETPOST
数据位置URL 参数(可见)请求 body(不可见)
长度限制受浏览器 / 服务器 URL 长度限制无硬性限制
浏览器缓存可被缓存默认不缓存

"GET 发一个 TCP 数据包、POST 发两个"(先 header → 收 100 Continue → 再 body)是部分客户端的实现策略,不是 HTTP 规范要求,Firefox 等浏览器并不这样做。不要把这条当作 GET/POST 的本质区别。

HTTP 状态码 ​

状态码三位数,第一位表示响应类型:

类别含义常见示例
1xx信息性:请求已收到,客户端可继续100 Continue
2xx成功200 OK
3xx重定向301 永久重定向、304 Not Modified
4xx客户端错误400 Bad Request、401 Unauthorized、403 Forbidden、404 Not Found
5xx服务端错误500 Internal Server Error、503 Service Unavailable

面试回答 ​

HTTP 是应用层协议,基于 TCP 实现。HTTP/1.0 默认短连接,每次请求都新建 TCP;1.1 起默认 keep-alive 长连接,复用同一条 TCP 通道,适合操作频繁的场景;高并发低频操作的 Web 页面通常用短连接。

GET 和 POST 本质都是 TCP 请求,协议层能做的事情相同。语义上 GET 幂等用于取数据,POST 非幂等用于写数据;应用层约定 GET 参数放 URL、POST 数据放 body,GET 可被缓存,POST 不行。"POST 发两个数据包"只是部分客户端行为,不是规范,不能作为本质区别。

状态码首位代表类型:1xx 继续、2xx 成功、3xx 重定向、4xx 客户端错误、5xx 服务端错误。前端常见:200、301、304、400、401、403、404、500。

HTTP 状态码 304:多好还是少好 ​

服务器对之前访问的部分页面指定缓存机制,当客户端再次请求时,若缓存内容与服务端一致,则返回 304,客户端直接使用缓存,不需二次下载。

304 不是错误,是对有缓存情况下服务端的一种响应。

304 过多的影响:搜索引擎蜘蛛通过状态码调节抓取频次,网站长期返回 304 意味着内容不更新,会导致:

  • 网站快照停止
  • 收录减少
  • 权重下降

产生过多 304 的原因:页面更新周期长或不更新、纯静态页面或强制生成静态 html。

keep-alive 的工作机制 ​

HTTP/1.0 默认短连接(每次请求/应答后断开),使用 Connection: keep-alive 头启用长连接;HTTP/1.1 默认长连接,关闭需发送 Connection: close。

Keep-Alive 建立过程:

  1. 客户端发送请求,附带 Connection: keep-alive
  2. 服务器收到请求并处理
  3. 服务器回送 Connection: keep-alive
  4. 客户端接收,长连接建立成功

优点:减少 CPU 和内存使用、允许 HTTP 管线化、降低拥塞控制(TCP 连接数减少)、减少后续请求延迟。

缺点:长时间 TCP 连接容易导致系统资源无效占用。

当在浏览器中输入 URL 并按下回车发生了什么 ​

  1. 解析 URL:分析传输协议和资源路径;对非法字符进行转义。
  2. 缓存判断:请求资源若在缓存中且未失效,直接使用;否则发起新请求。
  3. DNS 解析:浏览器缓存 → 本地 DNS 服务器 → 根域名服务器 → 顶级域名服务器 → 权威域名服务器,最终获得 IP。
  4. 获取 MAC 地址:通过 ARP 协议,根据目标 IP 获取 MAC 地址(同子网直接获取,跨子网获取网关 MAC)。
  5. TCP 三次握手:建立与服务器的 TCP 连接。
  6. HTTPS 握手(若使用 HTTPS):TLS 四次握手,协商加密方法和会话密钥。
  7. 发送 HTTP 请求 / 返回数据:服务器处理请求,返回 HTML 文件。
  8. 页面渲染:浏览器构建 DOM 树 + CSSOM 树 → 渲染树 → 布局 → 绘制。
  9. TCP 四次挥手:连接断开。

HTTP 协议的优点和缺点 ​

优点:

  • 支持客户端/服务器模式
  • 简单快速:只需传送请求方法和路径,服务器程序规模小,通信速度快
  • 无连接:每次连接只处理一个请求,节省传输时间
  • 无状态:服务器不保留通信历史,应答速度快
  • 灵活:允许传输任意类型的数据(通过 Content-Type 标记)

缺点:

  • 无状态:后续处理需要前面信息时必须重传,增加数据量
  • 明文传输:报文以文本形式传输,直接暴露给外界,不安全
  • 不安全:无加密(内容可窃听)、不验证通信方身份(可被伪装)、无法证明报文完整性(可被篡改)

端口号的作用 ​

一台主机(对应一个 IP 地址)可以提供多种服务(Web、FTP 等)。仅凭 IP 无法区分不同的网络服务,因此采用 IP + 端口号来区分不同服务。

常见端口:HTTP 默认 80,HTTPS 默认 443,FTP 默认 21,SSH 默认 22。

重定向 302、303、307 的区别 ​

302 是 HTTP/1.0 的临时重定向,实际使用中浏览器会把 POST 改成 GET。HTTP/1.1 为细化 302 引入了 303 和 307:

  • 302 Found:临时重定向;规范禁止 POST 变 GET,但浏览器实际上会改
  • 303 See Other:明确要求客户端用 GET 方法获取重定向资源(POST → GET)
  • 307 Temporary Redirect:严格遵守规范,不会将 POST 变为 GET,保持原方法

参考来源 ​