Skip to main content

http

📅 2026-02-12 ✏️ 2026-03-12 CS NET

1 · http#

应用层协议(TCP上层协议);客户端请求,服务端响应;

无状态协议:每次请求/响应都是独立的,协议本身不负责保存状态,需要额外机制(比如Cookie/Token)

https://developer.mozilla.org/en-US/docs/Web/HTTP

https://www.ietf.org/rfc/rfc9110.txt

请求报文 = 请求行(method + URI + version)、请求头、请求体

响应报文 = 状态行(version + Status Code)、响应头、响应体

1.1 · methods#

GET, POST, PUT, PATCH, DELETE,

HEAD 确认资源有效性,获得报文首部 OPTIONS 查询对请求URI,支持的方法

请求方法有各自的语义

1.2 · status code#

2** OK 3** 重定向 4** 请求错误 5** 服务错误

1.3 · headers#

  • 有请求头,描述:我是谁、我要什么、我能接受什么;
  • 有响应头,描述:这是什么、这怎么处理;
  • 关注消息体本身:类型、长度、编码、范围等;
  • 缓存相关
  • 状态相关
  • 代理,真实IP相关

1.3.1 · Referer#

请求从哪个页面跳转来的

1.3.2 · Origin#

请求来源(协议 + 域名 + 端口),CORS 常用

1.3.3 · Location#

重定向地址

1.3.4 · X-Forwarded-For#

X-Forwarded-For: client, proxy1, proxy2

从左到右依次是:客户端 → 第一层代理 → 第二层代理 … 最左边是原始客户端 IP,最右边是最后一个代理 IP。

1.3.5 · X-Real-IP#

场景表现
只有一层 Nginx 做反向代理原始客户端 IP(≈ XFF 第一个)
多层代理 / LB / API Gateway当前服务看到的“直连客户端”(≈ XFF 最后一个,即上一跳)

1.3.6 · X-Forwarded-Proto#

原始协议

1.3.7 · Forwarded#

标准化版本,替代 X-Forwarded-*

Forwarded: for=1.2.3.4;proto=https;host=example.com

1.3.8 · Connection#

  • keep-alive 希望复用连接

HTTP基于TCP协议,TCP协议使用”3次握手”建立连接,如果相同客户端/服务端每次发送请求都建立TCP连接,每次都会有3次握手,造成服务器资源浪费;

HTTP1.1引入持久连接(HTTP keep-alive):只要一方没有提出断开tcp连接,则一直维持tcp状态;减少重复建立/断开连的额外开销; 同时支持同一个TCP连接上,连续发多个HTTP请求(对头阻塞问题);

http2 进行了一定优化。

  • close 这次响应后把连接关掉

1.3.9 · Transfer-Encoding#

  • chunked 分块传输编码

发送方不必一开始就知道完整消息体长度,数据可以一块一块发出去,接收方按块读取直到结束块