http/0.9
http/0.9一般只是用来请求HTML文件的
流程:
- 客户端根据IP,端口与服务器建立TCP(进行三次握手)
- 建立连接后,发送GET,例如:GET/index.html来获取index.html
- 服务端收到后,以ASCLL字符流返回给客户端
特点:
- 只有请求行,没有http请求头与请求体
- 服务端也没有返回头信息
- 都是以ASCLL字符流来传输的,因为都是HTML格式文件
http/1.0
http/1.0支持js,css,img,音视频等文件,不能简单使用ASCLL编码
特点:
- 引入请求头与响应头,以key-value格式存储,在请求发送时携带上
// 请求头
accept:text/html
accept-encoding: 指定压缩
accept-Charset:指定编码
accept-languege:指定语言
// 响应头
content-encoding:
content-type
- 引入了状态码
- 提供了cache机制
- 提供了用户代理
- http1.1
每次http通信,都需要建立TCP,传输数据,断开TCP。
特点
- 添加持久连接的方法,一个TCP可以传输多次HTTP,只要没有某一段确认要断开
在http/1.1,持久连接默认是开启的,如果不需要,添加connection:close。对于浏览器同一个域名,默认同时建立6个TCP持久连接
- 管线化
持久连接可以减少TCP的建立与断开,但是需要等待前面的请求返回之后,才能进行下一次请求,所以可能会出现堵塞的问题
管线化:把多个http请求一起交给服务端,可以一起发送但是服务器还是需要按顺序来执行,这个技术最终没有成功
- 虚拟主机的支持
- 对动态生成内容的支持
在http/1.0里,会在响应头里设置完整数据大小,contnet-lenght,
但是可能存在,数据是动态的,不知道最终的大小,浏览器也不知道何时接收完全部文件数据
http/1.1引入chunk transfer机制,把数据切割为小块,每一块发送附上数据块的长度。
最后一块传递0,表示完毕
- 客户端cook,
- 优化:CDN实现域名分片机制
域名分片其实很简单,就是申请多个域名,但这些域名最后都映射到同一个网站服务器,这样就可以突破浏览器的限制,让连接数是8*域名的个数。
缺点:
-
对宽带(每秒最大能发送或接收的字节数)利于不好
原因
-
tcp启动慢
-
多个TCP,竞争固定宽带,假设请求多个域名,每个域名6个TCP,下载时候,宽带不足,每个TCP动态减少接收数据速度,所以可能影响关键资源下载
-
1.1对头堵塞
http2多路复用
- http/2.0是一个域名用一个TCP长连接,一个页面只需要一次慢启动,同时也避免了多个TCP的竞争问题
- http/2.0实现了资源的并行请求(解决队头堵塞问题),任何请求都可以四u是发送,不需要登台其他请求的完成
- 多路复用机制:每个请求都有一个ID,可以把请求分为一帧一帧的数据传输,这样的好处,可以优先处理请求
过程:
- 发送会经过二进制分证层,被转换为带有ID的争
- 服务端收到,把相同id争,进行合并
- 然后服务端进行处理,在返回给二进制层,浏览器收到在处理
其他特点:
- 可以设置请求的优先级
- 服务器推送:例如:请求一个html页面后,服务器知道了需要用的其他资源,可以直接发送过去
- http2/对请求头,响应头进行了压缩