Http首次访问较慢的问题以及Http和Https的区别

1 http第一次访问比较慢
2 https第一次访问会比较慢
3 http 和https存在非常明显的差异,http和https第一访问用时性能差距十分明显,但第二次访问用时差距不大了。
虽然服务器在墙外,但这个速度还是无法接受,整理了下需要回答这三个问题所需要用到的知识,关于更专业的tcp http https知识以后再整理成文章。

文章目录

1 HTTP和HTTPS
1.1 HTTP
1.2 HTTPS
1.3 TCP握手
2 http长连接和短连接
2.1 HTTP短连接
2.2 HTTP长连接
2.3 TCP层长连接与短连接
2.3.1 TCP短连接
2.3.2 TCP长连接
3 结论
4 如何优化http用时
4.1 nginx 配置长连接参数
4.2 https 握手时间优化
4.3 websocket带来的优势
5 参考链接
1 HTTP和HTTPS

1.1 HTTP

        HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。HTTP协议是无状态的,打开一个服务器上的网页和上一次打开这个服务器上的网页之间没有任何联系,但HTTP是一个无状态的面向连接(传输层为tcp协议)的协议。
HTTP = TCP 握手+ http发送数据

1.2 HTTPS

          HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层(传输过程加密 双匙加密),HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS= TCP握手 + SSL握手 + http发送数据
第一次测试:1258ms 第二次625ms

1.3 TCP握手

                        http和https 传输层均为TCP,所以在正式传输数据前,TCP都会三次握手建立链接


2 http长连接和短连接

2.1 HTTP短连接

在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。每遇到一个Web资源,浏览器就会重新建立一个HTTP会话。
流程:建立连接-传输数据-断开连接 ………. 建立连接-传输数据-断开连接

2.2 HTTP长连接

        从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:

         Connection:keep-alive
             在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如nginx)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
流程:建立连接-传输数据- 保持连接 -传输数据- 断开连接

从本质上来讲,HTTP仅仅是应用层的协议,TCP才是真正的传输层协议,因此TCP才有真正的长连接短连接的说法。

2.3 TCP层长连接与短连接

2.3.1 TCP短连接

            TCP短连接的流程:client向server发起连接请求,server接到请求,然后双方建立连接。client向server发送消息,server回应client,请求完成,这时候双方任意都可以发起close操作,不过一般都是client先发起close操作。上述可知,短连接一般只会在 client/server间传递一次请求操作。

2.3.2 TCP长连接

             TCP长连接的流程:client向server发起连接,server接受client连接,双方建立连接,client与server完成一次请求后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。

             TCP的保活功能主要为服务器应用提供。如果客户端已经消失而连接未断开,则会使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,此时服务器将永远等待客户端的数据。保活功能就是试图在服务端器端检测到这种半开放的连接。

在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。

3 结论

1 http第一次访问比较慢
        因为HTTP是建立在TCP上,TCP握手会占用一定时间,而之后因为nginx设置,即该链接并没有被关闭(http长连接)
一定时间内访问不用握手。

2 https第一次访问会比较慢
      原理同上,但建立链接时应该加上SSL握手时间。

3 http 和https存在非常明显的差异,http和https第一访问用时性能差距十分明显,但第二次访问用时差距不大了。
        第一次差距明显的原因是SSL握手较为耗时,而第二次访问时间均下降并相差不多的原因是因为保持了Http长连接均未再次握手,所以差距不大。nginx 对ssl握手后的状态用session ID 进行了缓存,https访问不会差异较大。

4 如何优化http用时

           4.1 nginx 配置长连接参数

     http {
       keepalive_timeout 20; --长连接timeout
            keepalive_requests 8192; --每个连接最大请求数
    }
4.2 https 握手时间优化

   关于https耗时有一篇非常好的文章可供参考:http://baijiahao.baidu.com/s?id=1559840813865463

   https握手非常耗时的原始在:RSA算法,它对性能的影响占了75%左右。
以上文章提出的优化策略:

  1.  首先第一步也是最简单的一个优化策略,就是减少完全握手的发生,因为完全握手它非常消耗时间;
  2. 对于不能减少的完全握手,对于必须要发生的完全握手,对于需要直接消耗CPU进行的握手,我们使用代理计算;
  3. 对称加密的优化;

4.3 websocket带来的优势

           HTTP1.1带来了长连接,不用每一次都重新三次握手建立连接,省略了握手的浪费,但是长连接里每一次请求仍然会发送重复http头造成资源浪费,这里就有一个WebSocket协议用来解决这种需要频繁传输数据的情况。

5 参考链接

      https://www.cnblogs.com/gotodsp/p/6366163.html
      https://www.jianshu.com/p/b0b6b88fe9fe
      https://segmentfault.com/a/1190000011589144
https耗时分析文章:
      http://baijiahao.baidu.com/s?id=1559840813865463

      https://www.cnblogs.com/mylanguage/p/5635524.html
 

发布了35 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41331645/article/details/84629520