HTTP 相关
一、OSI七层
OSI层数 | 名称 | 功能 | 协议 |
---|---|---|---|
第七层 | 应用层 (Application Layer) | 为应用程序提供网络服务 | https,ftp,ssh,telnet,ssl,tls |
第六层 | 表示层 (Presentation Layer) | 数据格式化,代码转换,数据加密 | / |
第五层 | 会话层 (Session Layer) | 互连主机通讯 | / |
第四层 | 传输层 (Transport Layer) | 端到端连接 | TCP,UDP |
第三层 | 网络层 (Network Layer) | 路由:确定地址和最佳路径 | ip,icmp…… |
第二层 | 数据链路层 (Data Link Layer) | 传输有地址的帧,CRC、奇偶校验 | arp,mtu…… |
第一层 | 物理层 (Physical Layer) | 二进制的传输 | IEEE802.11a/b/g,ISO2110 |
第一层物理层传输二进制信息,包含ISO2110(局域网有线协议)、IEEE802.11a/b/g(无线协议)。
第二层数据链路层传输的单位是帧,提供CRC校验,奇偶位校验等能力,包含arp,mtu等协议。
第三层网络传输层,主要功能是路由,包含ip,icmp协议等
第四层传输层提供端到端的连接能力,包含TCP,UDP协议
第五层传输层提供主机之间的通讯会话控制。
第六层表示层提供数据格式化,代码转换,数据加密等能力
第七层应用层,为应用程序提供网络服务,包含很多应用协议,http,ssh,ftp,map等协议。
- Http是基于TCP/IP协议的 应用层协议
- HTTPS 是在TCP/IP协议之上加了SSL/TLS(应用层协议)协议进行加密。
OSI是理论结构,SSL/TLS是实践协议不能准确的放入OSI七层协议的某一层。
SSL/TLS 其实是两层协议:下层SSL记录协议,上层是SSl握手协议。SSl握手协议是四种协议的统称SSL握手协议(SSL HandShake Protocol)、SSL密码参数修改协议(SSL Change Cipher Spec Protocol)、应用数据协议(Application Data Protocol)和SSL告警协议(SSL Alert Protocol))。
二、HTTP协议演进
2.1 http/0.9
1991年发布的,只有一个命令GET.
2.2 http/1.0
1996年五月发布,引入了POST HEAD命令,keep-alive(TCP复用,http1.0默认关闭,必须在header里写Connection:Keep-Alive)
2.3 http/1.1
1997年一月,目前应用最广的协议版本,持久连接 persistent connection 默认打开(客户端不用在header里写Connection:Keep-Alive就默认打开)
2.3.1 persistent connection 的两种方式
1)HTTP/1.0 + keep-alive 连接
- HTTP/1.1 + persistent 连接
2.3.2 管道机制
在同一个TCP连接里面,客户端可以同时发送多个请求,服务器按照顺序一个个返回这些请求。虽然允许复用TCP,但是服务器只有处理完一个请求,才会处理下一个。
如果前面的请求处理很慢,会造成"队头堵塞 head-of-line blocking"。
2.3.3 页面速度优化
要解决队头堵塞head-of-line这个问题,有两种方法:减少请求数。同时开启多个持久连接。这就是网页优化技巧的原则。
常用的页面优化技巧:合并表单样式表、将图片嵌入CSS代码、域名分片(一个域名只允许6个持久连接)。
如果http协议设计的更好一点,这些工作就是可以避免的。
2.3.4 Content-Length
一个TCP通过管道机制可以返回多个回应,那么就需要一种机制来区分这些回应。Content-Length就是这个作用。
2.3.5 分块传输
Content-Length可以使用的前提是服务器知道回应的长度。但是对一些耗时操作来说,这样效率很低。更好的方法是产生一块数据,采用"流模式steam"取代"缓存模式buffer"。
因此http/1.1可以不使用Content-Length,而使用分块传输编码(chunked transfer encoding)。只要请求或回应的header里有Transfer-Encoding字段,则表明将有数量未定的数据块。
Transfer-Encoding:chunked
每个非空数据块之前,有一个16禁止的数值,表示块长度。最后一个大小为0的块表示本次数据块已经全部发送完毕。
2.4 http/2 的前身:SPDY协议
2009年谷歌公开了自行研发的spdy协议,该协议在chrome上验证可行后,被当作http/2的基础。主要特性在http/2中得到继承。
2.5 http/2
叫http/2不是2.0,因为标准委员会不打算发布子版本了。下版将是http/3
2.5.1 二进制协议
http/1.1版的header是ASCII编码的文本信息。而http/2则是一个彻底的二进制协议。header和数据体都是二进制,并统称为"帧":头信息帧、数据帧。
2.5.2 多工
http/2复用TCP连接时,客户端和浏览器可以同时发送多个请求回应,并且不用按照顺序一一对应。避免了对头拥塞head-of-line blocking。
这样双向实时的通信就叫多工。
2.5.3 头信息压缩
- http协议不带状态,每次请求都必须附上所有信息,所以很多字段都是重复的,比如cookie和user agent。
- http/2对此做了优化:
1)一方面头信息经过gzip或者compress压缩后再发送,
2)另一方面,客户端和服务器同时维护一张头信息表。所有字段都存入这个表。生成一个索引号。以后就不发送同样的字段,只发送索引号。
2.5.4 服务器推送
支持主动向客户端发送资源。