0. 其实Http的水很深,一开始我当然是不相信的…
Http 1.1 新增~流支持 by segmentfault-henat9
springmvc demo Http 1.1 返回流 by oschina-文文1
HTTP1.0、HTTP1.1 和 HTTP2.0 的区别 by cnblog- _浪潮之巅.☆
HTTP/2 相比 1.0 有哪些重大改进?by 来自逼乎一众大佬的补充
Http研究的一个完整专题 by cnblog-月下小魔王
Http抓包工具wireshark使用教程(用到再说了) by Jack_孟
Java端的具体实现
okhttp&httpClient对比 by 360doc-liang1234_
HttpClient的两种负载数据demo:UrlEncodedFormEntity 和 StringEntity by oschina-LeoXu
MultipartEntityBuilder文件类型数据负载demo by 纯净天空
深入理解OkHttp源码 by CSDN-xingfeng_coder
OkHttp中响应的toString()只能有一次 by 开发者知识库-m_xiaoer
1.http 1.0
因为连接是无状态的,每次请求/应答都需要创建一顿"握手"操作
2. http 1.1
keep-alive
默认连接模式为keep-alive(新增的)
基于网络层TCP协议实现的
每隔一段时间ACK以等待客户端应答(有点“心跳”的意思)
长连接下传输多个内容如何辨识各自的偏移不会紊乱?
方式一:请求头属性Content-Length=>提前告知每个内容的长度
方式二:请求头属性:Transfer-Encoding:chunk=>此时传输内容被划分成若干个chunk(包、块的意思)=>读取到内容中的标识位即为不同的内容了
3. http 2.0(基于 google SPDY协议,顺带一提,SPDY不是首字母缩写,仅是’speedy’缩写)
Http 2.0 消息格式(抽象版):
Http 2.0 消息格式(美图版):
多路复用
允许多个请求/应答并行的共享一个TCP连接
每个TCP连接是一个session,每个请求拥有一个stream id
stream id允许配置之间的优先级、依赖关系
实现方式:二进制分帧
在应用层(Http)和传输层(TCP)中加入分帧层
将消息切分做一个一个“帧”(frame)单位来传输
服务端推送
对于客户端的一个请求,响应多个应答
支持缓存,即便是不同的页面之间
需要手动开启
同为长连接方案与websocket协议的关系?
websocket提供了一套API,并且有自己的帧协议
websocket建立/释放连接借助了Http,数据传输却没有关系
SPDY的长连接方案原意是优化web页面加载,websocket则强调双工通信的API
支持头部压缩
Http 2.0 多路复用的一次连接过程:
打开连接,握手x3
(x、y各自的序列号)
1.客户端 -> 服务端
syn=x
2.服务端 -> 客户端
ack=x+1(相当于消耗一个序列号)
syn=y
3.客户端 -> 服务端
ack=y+1
关闭连接,握手x4
(确认服务端关闭、给服务端返回响应的机会)
1.客户端 -> 服务端(半关闭:客户端不会再有数据推送)
FIN
2.服务端 -> 客户端
ACK
3.服务端 -> 客户端
FIN
4.客户端 -> 服务端
ACK
客户端会等上一段时间(保证服务端正常关闭)
4. Https
成本
需要CA证书,基本靠一手交费
传输
Http明文、Https基于SSL/TLS加密后
端口
Http 80,Https 443
防劫持
Https支持防止运营商的劫持
5. 不同版本迭代中的优化思路
不同于进程间的IO的性能因素,限制socketIO的性能因素:
带宽
可以理解做"网速",主要受通信设施的建设水平
=>那么程序需要做的就是保证客户端(浏览器)的接收不要受到队列阻塞,最大程序利用好带宽
延迟(从内到外,一步一步说)
Http基于TCP,那么Http也将收到重复多余的“握手”、大请求时的慢启动的影响
=>Http 2.0 支持的多路复用,可以减少重复的"握手"
=>Http 2.0 支持的多路复用,可以减少连接数,进而缩短TCP的慢启动时间
只要想请求服务,那么必将先过DNS查询,才能得知服务端IP(影响不大,可缓存DNS以优化)
浏览器等客户端环境带来的、著名的 Head-of-line blocking
=>绕过同源限制,搭建多个CDN
=>Http 2.0 支持的多路复用,可以减少占用的连接数
其他需要解决的问题:
向下兼容旧版本
SPDY协议 处于Http之下,TCP、SSL/TLS之上(这部分语义保留)
只是对Http 1.x的消息做了一次封装(frame)
HOL-blocking:
6. 遇到的问题
get方式的请求可以持有请求体,也就是说payload可以负载数据