- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
一、写在前面
今天看到一道面试题,关于http
的不同版本的区别,觉得有点懵,所以写一篇博客来总结一下。
二、http的历史
早在 HTTP 建立之初,主要就是为了将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。也是说对于前端来说,我们所写的HTML页面将要放在我们的 web 服务器上,用户端通过浏览器访问url地址来获取网页的显示内容,但是到了 WEB2.0 以来,我们的页面变得复杂,不仅仅单纯的是一些简单的文字和图片,同时我们的 HTML 页面有了 CSS,Javascript,来丰富我们的页面展示,当 ajax 的出现,我们又多了一种向服务器端获取数据的方法,这些其实都是基于 HTTP 协议的。同样到了移动互联网时代,我们页面可以跑在手机端浏览器里面,但是和 PC 相比,手机端的网络情况更加复杂,这使得我们开始了不得不对 HTTP 进行深入理解并不断优化过程中。
三、HTTP的基本优化
影响HTTP网络请求的因素主要有两个:带宽和延迟
。带宽:
之前的带宽可能是网络请求比较严重的问题,但是现在的话,网络基础设施不断的完善,带宽已经不是什么大的问题了。延迟:——浏览器阻塞
延迟:——DNS解析
建立连接:——三次握手和慢启动
四、HTTP1.0和HTTP1.1的区别4.1、缓存处理
在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。4.2、允许断点续传
在HTTP1.0中如果想要服务器发送部分资源,是不行的,服务器会发送全部的资源过来,但是在HTTP1.1中,是允许断点续传的,其存在一个range头域,可以允许传输资源的一部分,返回的状态码为206,这样也就方便开发者利用宽带资源。4.3、错误通知的管理
HTTP1.1新增了24个错误资源响应码。4.4、长链接
HTTP1.1中默认使用的是长链接,也就是一个TCP连接可以支持多次HTTP请求。
五、HTTPS和HTTP之间的区别
1、HTTPs需要CA证书,证书免费的很少,一般需要缴费。
2、HTTP基于TCP的应用层协议,一般是明文传输,但是HTTPS是基于SSL/TLS层,在传输过程中会进行加密。
3、HTTP和HTTPS的连接端口不一样,HTTP是80端口,HTTPS是443端口。
4、HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题。
六、HTTP2.0和HTTP1.X相比的新特性二进制传输:
新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的
格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很
多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二
进制格式,实现方便且健壮。
多路复用:
多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享
机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接
的request可以随机的混杂在一起,接收方可以根据request的 id将request再归
属到各自不同的服务端请求里面。
header压缩
header压缩,如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且
每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方
各自cache一份header fields表,既避免了重复header的传输,又减小了需要传
输的大小。
服务器推送
例如我的网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务
端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直
接从缓存中获取到,不用再发请求了。
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!