HTTP
HTTP超文本传输协议,应用层协议建立在TCP之上。
请求报文
- 首行:[方法]空格[URL]空格[协议版本]
- GET http://example.com HTTP/1.1
- 然后是请求头,多个字段组成,一个字段一行
- [字段名]:[值]
- 然后是请求体,即数据部分
响应报文
- 首行:[协议版本]空格[状态码]空格[状态描述]
- 响应头:与请求头类似
- 响应体:即服务器返回的数据
HTTP1.0
一个TCP链接只能发送一个请求,数据发送完毕,链接关闭。如还有请求其它资源,就必须再新建一个链接。为解决这个问题增加了一个Connection字段,要求服务器不要关闭TCP连接
Connection: keep-alive
HTTP1.1
- 长连接
默认长连接不再需要Connection:keep-alive要求TCP连接不关闭。 - 管道机制
一个TCP连接里客户端可以同时发送多个请求,不再等到前一个请求得到响应再发送第二个请求。
但服务端依然按照先后顺序依次响应各个请求。 - Content-Length
一个TCP连接可以传送多个回应,需要区分数据属于哪一个回应。
Content-Length:666
声明本次响应的数据字段的长度。第667个字节为下一个响应。 - 分块传输
要使用Content-Length,必须知道响应的数据长度。当响应数据较大或耗时较长时,必须等待所有操作完成数据准备号才能发送数据,效率较低。
最好产生一块数据就发送一块,采用流模式取代缓存模式。
可以不是用Content-Length,使用分块传输编码
Transfer-Encoding:chunked
表明响应由数量不定的数据块组成。
每个非空数据块之前有一个16进制的数值,表示这个块的长度。最后是一个大小为0的块,表示数据发送完毕。
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
25
This is the data in the first chunk
1C
and this is the second one
3
con
8
sequence
0
HTTP 2.0
- 二进制
1.1版本的头信息为文本,数据体可以是文本也可以是二进制。HTTP2.0要求头信息和数据都是二进制。 - 多工
HTTP1.1客户端可以同时发送多个请求,而服务端只能按顺序响应每个请求。
HTTP2.0服务端也可以同时响应多个请求。比如服务端收到了请求A和请求B。请求A耗时较长,可以先发送A处理好的部分,然后响应B,完成后再发送A请求剩下的部分。 - 数据流
HTTP 2.0 的数据包并非按顺序发送。需要标识同一个请求或响应的所有数据包,HTTP2.0会把每个请求或回应的所有数据包称为一个数据流,并用一个ID来标识数据包属于哪一个数据流。
客户端发出的数据流ID为奇数,服务端为偶数。
客户端还可以指定数据流的优先级,优先级越高,服务器响应越早。
数据流发送到一半时,客户端和服务端都可以取消这个数据流,而不关闭TCP连接,1.1种只能通过关闭TCP连接来取消数据流。 - 头部压缩
头部信息压缩后发送。客户端和服务端同时维护一张头信息表,所有字段都生成一个索引号,以后不再发送同样字段只发送索引。 - 服务器推送
未经请求,服务端主动向客户端发送数据。
参考:
https://www.ruanyifeng.com/blog/2016/08/http.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用