一: 结构图:

二 : http特性
状态码:
1: http响应报文中状态码的意义: 不仅作为错误码使用, 而且有指示客户端下一步如何行动的用途. 有点像连麦服务器: 推流过载时返回客户端(“尝试下一个ip”)
2:状态码不见得只有200是正确的, 204也是ok的
3:实际项目中可以用状态码, 作为客户端是否可以继续重试的标准
重要头部字段学习
1:accept语义: 希望我这边接受什么数据类型,Content-Type: 对方应该按什么类型解析
http传输大文件的方法
1: 压缩
2: 化整为零: 分块传输:chunk
3: 范围请求: accept-range
总结:以上3中方法, 可以混合使用
http连接管理
1: 短连接: 效率慢
2: 长链接: 解决1的问题, 提高传输效率
3: pipeline: 解决4问题: 但是有缺点: 可以发送一批请求, 某种意义上做到了并发. 但是有限制: 就是不能立即回复, 按请求顺序发送回复. 严格意义并没有解决队头阻塞问题, 本质原因: 没有办法将请求和响应用序号对应起来. 所以必须按顺序发送回复
4: 队头阻塞: 只有前面的请求处理处理完之后收到回复才会发送下一个请求
解决方案: 1: 并发连接 2: {3}
http中的重定向
应用场景: 网站变更, 域名变更, 服务器临时维护
http中的cookie机制
1: 弥补无状态的缺点
2: 增加记忆能力
3: 使用第三方cookie: 意味无论你在那里服务器都会认识你, 实现广告的精准投放
4: 服务器生成, 浏览器缓存
http中的缓存机制
1: 服务器告诉浏览器是否可以缓存, 并且可以告诉缓存的时间大小
2: 浏览器也可以强制刷新数据, 无视缓存
http代理
1: http代理如果想要知道客户端的真实IP地址,可以使用字段“X-Forwarded-For”和“X-Real-IP“.
2: 专门的“代理协议”可以在不改动原始报文的情况下传递客户端的真实IP。
http缓存服务器:
1: 类似于代理服务器
2: 需要cache-control和purge的控制
http优缺点
优点:
1:简单, 灵活, 易于扩展,
2:无状态
缺点:
1: head用明文传输, 用抓包工具可以看到, 不安全
2:队头阻塞
三: http/2
1: 主要目标: 对http做性能优化
2: 头部压缩: http/1主要的压缩是对body进行的, 但却忽视了header: 采用hpack算法
3: 采用二进制形式: 体积小, 速度快, 原来的header和body变成二进制帧
4: 虚拟化stream概念: 同消息往返的帧有相同唯一的stream_id, 可以理解为里面流动的有许多steam, 但是同stream的帧是有先后顺序的. 从stream层面看, 二进制帧是有顺序的, 但是从连接层面的, 是无序的; 由于有了streamid, 可以将请求和回复对应在一起, 也就没有了队头阻塞问题
5: 改变了请求-应答模型, 服务器可以主动push消息

在概念上,⼀个HTTP/2的流就等同于⼀个HTTP/1⾥的“请求-应答”。在HTTP/1⾥⼀个“请求-响应”报⽂来回是⼀次HTTP通信,在HTTP/2⾥⼀个流也承载了相同的功能。
四: http3.0
1:完全解决了队头阻塞的问题: 将底层的tcp换成udp, 因为tcp的有序性天然存在队头阻塞问题
2:使用quic协议: 支持连接迁移 比如网络切换不需要重新建立连接
五: Cdn
1: 可以加速访问http服务
2: 解决跨网访问慢的问题
3: cdn运行原理: 全局负载均衡 + 缓存系统
全局负载均衡: 寻找边缘节点, 按地理位置, 运营商网络, 负载能力.
六: Websocket
1: 解决http实时通信难的问题
2: 全双工, http是半双工
3: 采用二进制帧结构
七: http性能优化

1: cdn解决了中间一公里的问题
2:企业应该致力于解决第一公里的问题
3:最后一公里无法控制