「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。
本文是有关http的几个问题的思考。
http是什么
http是应用层的一种网络协议。 http是使用文本协议的,编码简单。 HTTP协议是超文本传输协议的缩写,英文是Hyper Text Transfer Protocol。
-
它是从WEB服务器传输超文本标记语言(HTML)到本地浏览器的传送协议。
-
设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
-
HTPP有多个版本,目前广泛使用的是HTTP/1.1版本。
格式
请求:
- 起始行
- POST /test/a HTTP/1.1
- 头部
- 空行
- 内容
GET 请求没有body内容,可以有头部; POST请求也可以没有头部和body内容;
那么响应长什么样子呢?
- header不区分大小写
常见的头部
那些常见的头部是为了解决各种各样的问题,并没有必要去记录去背诵这些东西。但是这块的内容因为用途广泛,因为实际的使用场景多,内容也有点多。
用于缓存的
- Cache-Control
- if-modifyed系列
- ETAG
用于压缩的
- Chunk
用于内容的
- Content-Type
- Content-Length
- 媒体类型
用于连接的
- Connection
- Upgrade
用于传输过程的信息
- host
- date
- forwarded-for
用于状态的
- cookie
- Authorization
- cookie+ session
为什么说http是文本协议
即协议里的报文(主要指的是头部)不使用二进制数据,而是文本形式。
- 明文传输也就是说这个是使用的通用的字符串编码
- 字符编码UTF-8
- 网络的字节流使用UTF-8就可以转码为真正的明文了
文本协议和二进制协议的区别究竟在哪里?
- 比如protobuf是一种二进制协议,而不是文本协议
- 发送端使用编码器将数据序列化为二进制, 接收端使用解码器将收到的二进制流进行反序列化从而取得原始信息
- 二进制协议的意思就是别人获取到但是难以破解你的内容
- 有协议文件 ,没有拿到协议文件就拿不到关键信息。
- 二进制协议比http安全
http1发展的历程是怎样的?
HTTP/1.0
- 请求响应之后就断开连接
- Connection:close
HTTP/1.1 keep-alive可复用TCP连接
- Connection:keep-alive
- 一段时间空闲后就会主动关闭连接。可见,检测心跳或空闲的机制几乎是所有的协议都会有的
一般浏览器的实现单个 TCP 连接在同一时刻只能处理一个请求,即两个请求的生命周期不能重叠。
- HTTP/1.1,如果三个包想同时发送,
- 则队头先发送,其他的需要等待
- 这就是队头阻塞
- 如果想要并发,需要启动多个TCP连接
- 但浏览器支持的最大连接数是6
究竟为何两个请求的生命周期不能重叠
其实是协议设计的缺陷。 我们之前看到请求-响应的格式可以知道:如果一次发起两个请求,那么响应是给哪个请求的呢,没有任何的标志,不得而知。所以两个请求的生命周期不能重叠。
- 6个并发这是浏览器的限制。
- 一个请求一个响应依次进行。
一个完整的http请求响应会怎么看待这个网络世界?
- 经过了这个TCP连接的排队,我终于可以发送出去了
- 我发到了网络层,到达了服务器,服务器处理我的请求
- 服务器发送响应,通过TCP连接给到我
- 我下面排队的请求又继续了