HTTP1.1
1. IP地址和Mac地址
1.IP用于网络层,Mac用于链路层。
2.IP是网络拓扑结构层面的设备唯一标志,可能会改变。Mac是设备出厂自带的标志信息,不会变。IP可以理解为人的住址,Mac可以理解为人的指纹。
3.依靠ARP,就能通过IP地址查到对应的Mac地址。
2.分块传输编码
服务生端成HTTP回应有时候是无法确定消息大小的,比如大文件的下载,或者后台需要复杂的逻辑才能全部处理页面的请求,这时用需要实时生成消息长度,用chunked编码。如前端请求交大图片时会出现分块显示的现象,就是在分块加载资源。
HTTP 分块传输编码允许服务器为动态生成的内容维持 HTTP 持久链接。通常,持久链接需要服务器在开始发送消息体前发送 Content-Length 消息头字段,但是对于动态生成的内容来说,在内容创建完之前是不可知的。
分块传输编码允许服务器在最后发送消息头字段。对于那些头字段值在内容被生成之前无法知道的情形非常重要,例如消息的内容要使用散列进行签名,散列的结果通过 HTTP 消息头字段进行传输。没有分块传输编码时,服务器必须缓冲内容直到完成后计算头字段的值并在发送内容前发送这些头字段的值。
HTTP 服务器有时使用压缩 (gzip 或 deflate)以缩短传输花费的时间。分块传输编码可以用来分隔压缩对象的多个部分。在这种情况下,块不是分别压缩的,而是整个负载进行压缩,压缩的输出使用本文描述的方案进行分块传输。在压缩的情形中,分块编码有利于一边进行压缩一边发送数据,而不是先完成压缩过程以得知压缩后数据的大小。
最后一个大小为 0 的块为结束。
3.Keep-Alive长连接
一定时间内,同一域名多次请求数据,只建立一次HTTP请求,其他请求可复用每一次建立的连接通道,解决需要多次建立连接问题。但存在如下效率问题:
- 第一个:串行的文件传输。当请求a文件时,b文件只能等待,等待a连接到服务器、服务器处理文件、服务器返回文件,这三个步骤。我们假设这三步用时都是1秒,那么a文件用时为3秒,b文件传输完成用时为6秒,依此类推。(注:此项计算有一个前提条件,就是浏览器和服务器是单通道传输)
- 第二个:连接数限制。假设Apache设置了最大并发数为300,因为浏览器限制,浏览器发起的最大请求数为6,也就是服务器能承载的最高并发为50,当第51个人访问时,就需要等待前面某个请求处理完成。
HTTPS
和HTTP的唯一区别就是加了SSL
HTTP/2
HTTP/2是建立在HTTPS基础上的。通过支持请求与响应的多路复用来减少延迟,通过压缩HTTP首部字段将协议开销降至最低,同时增加对请求优先级和服务器端推送的支持。
1.二进制分帧,流
- HTTP/2 采用二进制格式传输数据,解析起来更高效
- 流:存在于连接中的一个虚拟通道,可以承载双向消息,每个流都有一个唯一的整数ID
2.多路复用
代替原来的序列和阻塞机制,所有请求都是通过一个 TCP连接并发完成。
- 同域名下所有通信都在单个连接上完成,只占用一个TCP
- 单个连接可以承载任意数量的双向数据流,可并行交错的请求和响应,之间互不干扰
- 数据流以消息的形式发送,而消息又由一个或多个帧组成,多个帧之间可以乱序发送,因为根据帧首部的流标识可以重新组装
- 每个请求都可带一个31bit的优先值,0表示最高优先级,数值越大优先级越低。客户端和服务器就在处理不同的流时,根据优先级采取不同的策略,以最优的方式发送流、消息和帧
3.服务器主动推送
服务端可以在发送页面HTML时主动推送其它资源,而不用等到浏览器解析到相应位置,发起请求再响应
4.头部压缩
对消息头采用HPACK(专为http/2头部设计的压缩格式)进行压缩传输。
- 在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键-值对,之后只需发送差异数据,减少冗余数据,降低开销
- 首部表在HTTP/2的连接存续期内始终存在,由客户端和服务器共同渐进地更新
- 每个新的首部键-值对要么被追加到当前表的末尾,要么替换表中之前的值
websocket
websocket是长连接协议,只要不断开,连接一直都在,而且服务端可以主动推消息。
和HTTP一样都是通过传输层的TCP建立连接,且websocket的握手用的也是HTTP,只不过请求头和响应头里面都有特殊字段,请求返回HTTP状态码101表示接下来要把协议切换为websocket。
(参考 https://www.cnblogs.com/staff/p/13252182.html)