Appearance
HTTP 基础:分层、长短连接、GET/POST 与状态码
问题
- HTTP 是哪一层的协议?底层基于什么实现?
- HTTP 长连接和短连接有什么区别?什么是 Keep-Alive?
- GET 和 POST 有什么区别?
- HTTP 状态码有哪些类别?常见状态码是什么?
结论
理解路径
HTTP 是应用层协议,底层基于 TCP;理解这一层级关系后,长短连接的本质(TCP 连接复用)、GET/POST 的语义设计、状态码的分类都会更清晰。
HTTP 协议分层
HTTP 是应用层协议,底层基于 TCP(传输层)实现。每次 HTTP 请求前需要先完成 TCP 三次握手建立连接。
长连接与短连接
| 短连接 | 长连接(Keep-Alive) | |
|---|---|---|
| 默认版本 | HTTP/1.0 | HTTP/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 本身的要求。
语义区别:
| GET | POST | |
|---|---|---|
| 语义 | 获取资源 | 提交/修改数据 |
| 幂等 | 是(多次请求结果相同,不修改服务器状态) | 否(每次可能产生副作用) |
应用层常见区别:
| 维度 | GET | POST |
|---|---|---|
| 数据位置 | 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 建立过程:
- 客户端发送请求,附带
Connection: keep-alive - 服务器收到请求并处理
- 服务器回送
Connection: keep-alive - 客户端接收,长连接建立成功
优点:减少 CPU 和内存使用、允许 HTTP 管线化、降低拥塞控制(TCP 连接数减少)、减少后续请求延迟。
缺点:长时间 TCP 连接容易导致系统资源无效占用。
当在浏览器中输入 URL 并按下回车发生了什么
- 解析 URL:分析传输协议和资源路径;对非法字符进行转义。
- 缓存判断:请求资源若在缓存中且未失效,直接使用;否则发起新请求。
- DNS 解析:浏览器缓存 → 本地 DNS 服务器 → 根域名服务器 → 顶级域名服务器 → 权威域名服务器,最终获得 IP。
- 获取 MAC 地址:通过 ARP 协议,根据目标 IP 获取 MAC 地址(同子网直接获取,跨子网获取网关 MAC)。
- TCP 三次握手:建立与服务器的 TCP 连接。
- HTTPS 握手(若使用 HTTPS):TLS 四次握手,协商加密方法和会话密钥。
- 发送 HTTP 请求 / 返回数据:服务器处理请求,返回 HTML 文件。
- 页面渲染:浏览器构建 DOM 树 + CSSOM 树 → 渲染树 → 布局 → 绘制。
- 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,保持原方法