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 行为在现代客户端库中常被禁用或超时跳过;但语义层与规范层的分析依然成立。