副标题 / 摘要

TCP 是传输层协议,HTTP 是应用层协议。二者的职责与语义完全不同,但经常被混淆。本文用工程视角梳理差异与选型。

目标读者

  • 需要排查网络问题的后端工程师
  • 想理解协议分层的开发者
  • Web 服务与客户端开发人员

背景 / 动机

很多线上问题都源于“层次混淆”:把 HTTP 的问题当 TCP 处理,或把 TCP 的问题当 HTTP 处理。
理解分层,是定位问题与做技术选型的基础。

核心概念

  • TCP:可靠、面向连接的字节流传输
  • HTTP:在传输层之上定义请求/响应语义
  • 分层模型:传输层解决“怎么送到”,应用层解决“送什么”

实践指南 / 步骤

  1. 先看连接层:是否能建立 TCP 连接(握手、丢包、重传)
  2. 再看应用层:请求是否符合 HTTP 协议(方法、头、状态码)
  3. 分层排查:TCP 通了但 HTTP 失败,多半是应用层问题
  4. 选型时分清职责:HTTP 可以跑在 TCP 或 QUIC 上

常用诊断命令:

# 看 TCP 连接建立
nc -vz host 80

# 看 HTTP 层返回
curl -v http://host/

可运行示例

先在本机启动一个 HTTP 服务:

python3 -m http.server 8000

再用 socket 直接发 HTTP 请求:

import socket

req = (
    "GET / HTTP/1.1\r\n"
    "Host: localhost:8000\r\n"
    "Connection: close\r\n\r\n"
).encode()

with socket.create_connection(("127.0.0.1", 8000)) as s:
    s.sendall(req)
    print(s.recv(1024).decode(errors="ignore"))

解释与原理

TCP 负责“可靠传输”,HTTP 负责“语义表达”。
HTTP 的状态码、方法、路径、头部等都属于应用层语义,TCP 并不理解。
因此,TCP 成功并不代表 HTTP 成功。

常见问题与注意事项

  1. HTTP 一定基于 TCP 吗?
    不一定。HTTP/3 基于 QUIC(UDP)。

  2. TCP 连接建立了但访问失败?
    可能是 HTTP 头不完整、路径错误、权限问题等。

  3. 为什么 HTTP 还能复用连接?
    HTTP/1.1 默认 keep-alive,HTTP/2 多路复用。

最佳实践与建议

  • 排查问题先分层定位
  • 线上监控同时关注连接指标与应用指标
  • 了解 HTTP/2、HTTP/3 的传输基础

小结 / 结论

TCP 与 HTTP 的区别本质是“层级不同、责任不同”。
掌握分层思维能让排查更精准、选型更清晰。

参考与延伸阅读

  • RFC 793 (TCP)
  • RFC 9110 (HTTP Semantics)
  • HTTP/2, HTTP/3 相关文档

元信息

  • 阅读时长:7~9 分钟
  • 标签:TCP、HTTP、网络基础
  • SEO 关键词:TCP, HTTP, 协议分层
  • 元描述:从分层角度解释 TCP 与 HTTP 的区别,并给出排查建议。

行动号召(CTA)

下次网络问题排查时,先把“连接层”和“应用层”分开看,你会更快定位问题。