小林图解网络HTTP篇
HTTP 是超文本传输协议,也就是HyperText Transfer Protocol。
- 协议:不同计算机之间约定好的一套行为规范或约定;
- 传输:HTTP是一个双向协议
- 超文本:超越了普通文本的文本,它是文字、图片、视频等的混合体,最关键有超链接,能从⼀个超文本跳转到另外⼀个超文本
HTTP 常见的状态码有哪些?
URI:统一资源标识符,可以标识http,ftp等其他的网络资源;
URL:统一资源定位符
请求头
- GET :获取一个资源,同时参数直接跟在URL后面,url长度受限制2048字节
- POST:不仅可以获取资源,还可以提交资源(譬如上传文件),参数放在请求体中,包大小4G
- HEAD:只要响应头,没有响应体,通常用于测试URL是否存在
- DELETE:删除一个资源
- PUT:通常修改一个资源
常用的头字段
- Host:ip 指定主机名称
- Content-Length:本次回应的数据长度
- Content-Type 字段用于服务器回应时,告诉客户端,本次数据是什么格式
- Content-Encoding 字段说明数据的压缩方法。
- Connection:Keep-Alive 或者 close 建立的请求通路保持激活
- Accept:能接受的文件类型
- Accept-Encoding :接受的内容类型,通常是gzip压缩的格式
- Accept-Language :能接受的语言 zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 q优先级
- User-Agent:指定客户端的信息
HTTP/1.1 的特性有哪些?
优点
HTTP 最突出的优点是「简单、灵活和易于扩展、应用广泛和跨平台」。
- 简单;HTTP 基本的报⽂格式就是 header + body ,头部信息也是 key-value 简单文本的形式, 易于理解,降低了学习和使用的门槛。
- 灵活和易于扩展
HTTP 协议里的各类请求方法、 URI/URL、状态码、头字段等每个组成要求都没有被固定死,都允许开发人员自定义和扩充 。
缺点
无状态,明文传输;带来的问题就是关联性操作十分麻烦,明文传输带来安全性问题。
针对无状态,使用Cookie技术,在请求和响应报文中写入 Cookie 信息来控制客户端的状态 ;
客户端第⼀次请求后,服务器会下发⼀个装有客户信息的「小贴纸cookie」,后续客户端请求服务器的时候,带上cookie,服务器就能认得了;
明文传输的问题:窃听,伪装和篡改;引入SSL/TLS子层,解决了安全性问题
HTTP/1.1 相比HTTP/1.0 性能上的改进:
- 使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。
- 支持管道(pipeline)网络传输,只要第⼀个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间
HTTP/1.1的性能瓶颈:
- 请求 / 响应头部(Header)未经压缩就发送,首部信息越多延迟越大。只能压缩 Body 的部分发送冗长的首部。每次互相发送相同的首部造成的浪费较多;
- 服务器是按请求的顺序响应的,如果服务器响应慢,会招致客户端⼀直请求不到数据,也就是队头阻塞;
- 没有请求优先级控制;
- 请求只能从客户端开始,服务器只能被动响应。
那 HTTP/2 相⽐ HTTP/1.1 性能上的改进:
- 头部压缩,如果同时发出多个请求,他们的头是⼀样的或是相似的,那么,协议会帮你消除重复的部分。
- 二进制格式,增加数据传输的效率。
- 并发传输,引出了 Stream 概念,多个 Stream 复用在⼀条 TCP 连接,客户端收到后,会根据相同的 Stream ID 有序组装成 HTTP 消息 。但是因为底层用的是TCP,也存在队头阻塞的问题。
- 服务器主动推送资源 ,客户端在访问 HTML 时,服务器可以直接主动推送 CSS 文件,减少了消息传递的次数。
HTTP/3 做了哪些优化?
- HTTP/1.1 中的管道( pipeline)虽然解决了请求的队头阻塞(一个请求出去,不用等其回来就可以进行第二个请求),但是没有解决响应的队头阻塞(也就是如果不响应,也会阻碍后面的请求),因为服务端需要按顺序响应收到的请求,如果服务端处理某个请求消耗的时间比较长,那么只能等响应完这个请求后, 才能处理下一个请求,这属于 HTTP 层队头阻塞。
- HTTP/2 虽然通过多个请求复用一个 TCP 连接解决了 HTTP 的队头阻塞 ,但是一旦发生丢包,就会阻塞住所有的 HTTP 请求,这属于 TCP 层队头阻塞。
HTTP/2 队头阻塞的问题是因为 TCP,所以 HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP!
因为有了Stream,队头阻塞只会阻塞当前的Stream,不会阻塞其他的Stream;
RPC:从发展历史来说, HTTP 主要用于 B/S 架构,而RPC 更多用于 C/S 架构。但现在其实已经没分那么清了, B/S 和 C/S 在慢慢融合。很多软件同时支持多端,所以对外⼀般用HTTP 协议,⽽内部集群的微服务之间则采用RPC 协议进行通讯。
WebSocket:同一时间段,通信双方能同时主动向对方发送数据,利用了TCP的全双工。HTTP在同一时间段只能有一方主动发数据,因此是半双工的。在一些需要服务端推送大量数据的场合,比如游戏,就需要WebSocket;
HTTPS 建立连接的过程,先进行TCP 三次握手,再进行TLS 四次握手;