拆解 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