HTTP

HTTP超文本传输协议,应用层协议建立在TCP之上。

请求报文

  1. 首行:[方法]空格[URL]空格[协议版本]
  2. 然后是请求头,多个字段组成,一个字段一行
    • [字段名]:[值]
  3. 然后是请求体,即数据部分

响应报文

  1. 首行:[协议版本]空格[状态码]空格[状态描述]
  2. 响应头:与请求头类似
  3. 响应体:即服务器返回的数据

HTTP1.0

一个TCP链接只能发送一个请求,数据发送完毕,链接关闭。如还有请求其它资源,就必须再新建一个链接。为解决这个问题增加了一个Connection字段,要求服务器不要关闭TCP连接

Connection: keep-alive

HTTP1.1

  1. 长连接
    默认长连接不再需要Connection:keep-alive要求TCP连接不关闭。
  2. 管道机制
    一个TCP连接里客户端可以同时发送多个请求,不再等到前一个请求得到响应再发送第二个请求。
    但服务端依然按照先后顺序依次响应各个请求。
  3. Content-Length
    一个TCP连接可以传送多个回应,需要区分数据属于哪一个回应。
    Content-Length:666
    声明本次响应的数据字段的长度。第667个字节为下一个响应。
  4. 分块传输
    要使用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.1版本的头信息为文本,数据体可以是文本也可以是二进制。HTTP2.0要求头信息和数据都是二进制。
  2. 多工
    HTTP1.1客户端可以同时发送多个请求,而服务端只能按顺序响应每个请求。
    HTTP2.0服务端也可以同时响应多个请求。比如服务端收到了请求A和请求B。请求A耗时较长,可以先发送A处理好的部分,然后响应B,完成后再发送A请求剩下的部分。
  3. 数据流
    HTTP 2.0 的数据包并非按顺序发送。需要标识同一个请求或响应的所有数据包,HTTP2.0会把每个请求或回应的所有数据包称为一个数据流,并用一个ID来标识数据包属于哪一个数据流。
    客户端发出的数据流ID为奇数,服务端为偶数。
    客户端还可以指定数据流的优先级,优先级越高,服务器响应越早。
    数据流发送到一半时,客户端和服务端都可以取消这个数据流,而不关闭TCP连接,1.1种只能通过关闭TCP连接来取消数据流。
  4. 头部压缩
    头部信息压缩后发送。客户端和服务端同时维护一张头信息表,所有字段都生成一个索引号,以后不再发送同样字段只发送索引。
  5. 服务器推送
    未经请求,服务端主动向客户端发送数据。
    参考:
    https://www.ruanyifeng.com/blog/2016/08/http.html
posted @   店里最会撒谎白玉汤  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示