拆解 HTTP 协议

让我们来拆解 HTTP 协议  

如果你想要自己编写 HTTP 服务端,他可能对你有帮助
该拆解基于 HTTP/1.1 版本

本文由 ChatGPT 提供部分信息收集,但是绝对为人工编写

HTTP/3 不再使用 TCP,转而使用 QUIC 来增加稳定性和速度,不在本文讨论范围内

HTTP/2 不再使用纯文本传输信息,转而使用二进制帧传输信息,不在本文讨论范围内

HTTP 协议基于 TCP 协议,消息结构包含以下内容

发:

请求行,格式为 方法 URL HTTP/版本 CRLF 换行符(如 GET /path/resource HTTP/1.1)

头(Headers),格式为名字:值,CRLF 换行

一个空行

可选请求体(如 JSON 或纯文本内容,给 POST 等带数据的请求方法用)

常见方法:GET(安全、幂等)、HEAD(仅头)、POST(非幂等)、PUT(幂等)、DELETE(幂等)、PATCH(部分修改)、OPTIONS、TRACE(诊断)、CONNECT(用于建立隧道,常用于 HTTPS 通过代理)

接:

状态行,格式为 HTTP/版本 状态码 CRLF 换行符(如 HTTP/1.1 200 OK)

响应头

一个空行

可选响应体(给返回数据用的)

常见状态码(按类别)

  • 1xx:信息(100 Continue 等)
  • 2xx:成功(200 OK,201 Created,204 No Content)
  • 3xx:重定向(301 永久,302 临时,307/308 保留方法)
  • 4xx:客户端错误(400 Bad Request,401 Unauthorized,403 Forbidden,404 Not Found,429 Too Many Requests)
  • 5xx:服务器错误(500 Internal Server Error,502 Bad Gateway,503 Service Unavailable,504 Gateway Timeout)

比如上次 Cloudflare 崩溃就是因为代码出现错误,直接爆炸,服务端返回 500

请求和响应头这里由于太多只讲一部分

请求头:

Host:请求目标的域名或者 IP

User-Agent:你是谁?

Accept:可以用啥

Accept-Encoding:自己看得懂的编码

Accept-Language:自己希望收到的语言

Authorization:通常用于 api 服务的身份验证

Cookie:存储身份信息等的小饼干

Referer:请求来自哪个域名或 IP,这里出现了拼写错误,但不知道咋了,真进了 HTTP 标准

响应头:

Server:啥子服务端

Set-Cookie:设置 Cookie

Location:跟 3xx 状态码是兄弟,3xx 告诉要跳转,他告诉要去哪

WWW-Authenticate:跟 401 坐一桌,没验证他告诉客户端怎么验证

Retry-After:跟 429 坐一桌,请求超限他告诉要等多久

实体头:

Content-Type:啥类型

Content-Length:多长

Content-Encoding:什么编码

HTTPS 因为我还没搞懂,需要等下一篇

顺带一提,HTTP 418 I'm a teapot 其实真是个状态码,虽然文本莫名其妙,但实际上他的诞生和 HTTP 没啥关系,而是因为一种叫做 HTCPCP 的协议诞生的(虽然这玩意是 HTTP 协议的扩展),一般用来表示服务端不想管这个请求,比如发现这是人机请求的(我是一个茶壶,冲不了咖啡)

Comments