HTTP 的 GET 与 POST 三重分析(公众号笔记)
ABSTRACT
2017-09 公众号笔记。从三个层次拆解 GET 与 POST:①表层语义区别(常被当标准答案);②本质同为 TCP 连接,区别来自 HTTP 规范与浏览器/服务器实现限制;③深层差异——GET 发一个 TCP 包,POST 通常发两个(100 continue 机制)。
核心要点
- 表层「标准答案」:GET 参数在 URL 可被收藏/缓存/留历史,POST 在 body;GET 回退无害、POST 重复提交;GET 有长度限制等——这些不是本质。
- HTTP 是基于 TCP/IP 的通信规则,GET/POST 底层都是 TCP 连接,能力上无差别;给 GET 加 body、给 POST 带 URL 参数技术上都行,只是不符合规范。
- 比喻:TCP 是汽车,HTTP 是交通规则(贴 GET/POST 标签、规定货放车顶还是车厢);浏览器和服务器是运输公司,装卸成本导致 URL 长度不成文限制(浏览器约 2K、服务器约 64K)。
- GET 带 body 的行为因服务器而异(有的读、有的忽略),不可依赖。
- 深层差异:GET 浏览器把 header+data 一起发,一次 200;POST 先发 header 收 100 continue 再发 data——一个 TCP 包 vs 两个 TCP 包。
- Yahoo 曾建议用 GET 替 POST 优化性能,但是坑:①语义不可混用;②网络好时单次/双次包时间差可忽略,网络差时两次包利于数据完整性校验;③并非所有浏览器都两次发包(Firefox 只发一次)。
关键实体与概念
HTTP、TCP/IP、GET/POST 语义、100 continue、URL 长度限制、无状态协议
关联概念
来源回溯
- 原始文件:
raw/ip/wechat_articles/Http的GET与POST三重分析.md(2017-09-27)
时效性评估
- 仍有效:「表层区别来自规范与实现、底层同为 TCP」的分析框架是面试与工程排障的持久知识;语义不可混用原则不变。
- 已过时:HTTP/2 与 HTTP/3(QUIC)下「几个 TCP 包」的粒度描述不再精确(多路复用、0-RTT);100 continue 行为在现代客户端库中常被禁用或超时跳过;但语义层与规范层的分析依然成立。