HTTP:
http 1.0要指定keep-alive来开启持久连接,默认是短连接,就是浏览器每次请求都要重新建立一次tcp连接,完事儿了就释放tcp连接。早 期的网页都很low,没啥东西,就一点文字,就用这个没问题。但是现在,一个网页打开之后,还要加载大量的图片、css、js,这就坑爹了, 发送多次请求。 早期,2000年之前,那个时候网页,都很low,当时你打开一个网页,就是说现场底层tcp三次握手,跟网站建立一个tcp连接,然后通过这个 tcp连接,发送一次http请求,网站返回一个http响应(网页的html,里面有一大段文字),浏览器收到html渲染成网页,浏览器就走tcp四 次挥手,跟网站断开连接了 到了后面,发现2000之后,2010之后更不用说了,网页发展很迅猛,一个网页包含着大量的css、js、图片等资源。比如你请求一个网页,这 个网页的html先过来,过来之后,浏览器再次发起大量的请求去加载css、js、图片,打开一个网页可能浏览器要对网站服务器发送几十次请 求。 http 1.0,疯了,刚开始请求网页的html,tcp三次握手建立连接 -> 请求/响应 -> tcp四次挥手断开连接,接着再次要加载css、js、图片,要 发送30个请求,上面的过程来30次,30次频繁的建立tcp连接以及释放tcp连接。很慢很慢。
其实最慢的不是发送请求和获取响应,打开和释放连接,这都是很重的过程 **http 1.1默认支持长连接,就是说,浏览器打开一个网页之后,底层的tcp连接就保持着,不会立马断开,之后加载css、js之类的请求,都 会基于这个tcp连接来走。**http 1.1还支持host头,也就可以支持虚拟主机;而且对断点续传有支持。 浏览器,第一次请求去一个网站的一个页面的时候,就会打开一个tcp连接,接着就在一段时间内都不关闭了,然后接下来这个网页加载css、 js、图片大量的请求全部走同一个tcp连接,频繁的发送请求获取响应,最后过了一段时间,这些事儿都完了,然后才会去释放那一个tcp连 接。大幅度的提升复杂网页的打开的速度,性能。
HTTP 的不足之处
通信内容使用明文——内容可能被窃听
不验证通信方的身份——可能遭遇伪装
无法验证报文的完整性——报文有可能已遭篡改
HTTPS优点:
1.采用了二进制格式而而且非文本格式
2.完全多路复用的,而非有序并且阻塞---只需一个连接就能实现并行
3.使用消息头压缩,降低了开销
4.http2.0会让服务器将响应主动推送到客户端缓存中(浏览器请求HTML的时候就会主动推送js,css等 其他资源,钱少网络空闲浪费)
HTTPS的通讯过程:
1.客户端发送HTTP请求把自己支持的加密方式告诉服务端
2.服务器从客户端浏览器选出一套加密算法和hash算法,然后把自己的身份信息通过证书的方式发回浏览器,证书里有加密公钥,网站地址,证书颁发机构
3.浏览器验证证书的合法性,浏览器生成一段随机密码,然后用证书的公钥进行加密,用约定好的hash算法生成握手消息的hash值,然后用密码进行加密,然后把所有的东西发送给服务器端。(加密后的随机密码,随机密码加密后的消息,hash值)
4.服务器端收到浏览器发来的消息,用私钥进行解密密码,然后解密加密消息,对比hash值是否一致,然后用密码加密发送握手消息,给客户端
5.浏览器客户端收到消息,密码进行解密,然后对比hash值,握手结束,后面所有的消息都是通过密码,对称加密进行通信。
详细如下图:
什么是长连接?http长连接是什么?
http本身没什么所谓的长连接短连接之说,其实说白了都是http下层的tcp连接是长连接还是短连接,tcp连接保持长连接,那么多个http请求 和响应都可以通过一个链接来走。其实http 1.1之后,默认都是走长连接了,就是底层都是一个网页一个tcp连接,一个网页的所有图片、 css、js的资源加载,都走底层一个tcp连接,来多次http请求即可。
http 1.0的时候,底层的tcp是短连接,一个网页发起的请求,每个请求都是先tcp三次握手,然后发送请求,获取响应,然后tcp四次挥手断 开连接;每个请求,都会先连接再断开。短连接,建立连接之后,发送个请求,直接连接就给断开了。
http 1.1,tcp长连接,tcp三次握手,建立了连接,无论有多少次请求都是走一个tcp连接的,走了n多次请求之后,然后tcp连接被释放掉了