2016-04-20 腾讯前端开发工程师二面题目

匿名网友 匿名网友 发布于: 2016-04-28 00:00:00
阅读 320 收藏 0 点赞 0 评论 0

1.如何实现http长连接?

 *

 *  答:  HTTP实现长连接

         HTTP是无状态的

         也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。

         如果客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源,如JavaScript文件、

         图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话

         HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的 http1.0

         可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。

         如果浏览器或者服务器在其头信息加入了这行代码

         Connection:keep-alive

         TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。

         保持连接节省了为每个请求建立新连接所需的时间,还节约了带宽。

         实现长连接要客户端和服务端都支持长连接。

         如果web服务器端看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1

         (HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时

         (例如Applet,图片),显著地减少下载所需要的时间。要实现这一点, web服务器需要在返回

         给客户端HTTP头信息中发送一个Content-Length(返回信息正文的长度)头,最简单的实现方法

         是:先把内容写入ByteArrayOutputStream,然 后在正式写出内容之前计算它的大小

         无论客户端浏览器 (Internet Explorer) 还是 Web 服务器具有较低的 KeepAlive 值,

         它都将是限制因素。例如,如果客户端的超时值是两分钟,而 Web 服务器的超时值是一分钟,

         则最大超时值是一分钟。客户端或服务器都可以是限制因素

         在header中加入 –Connection:keep-alive

         在HTTp协议请求和响应中加入这条就能维持长连接。

         再封装HTTP消息数据体的消息应用就显的非常简单易用

     解释1

     所谓长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差,

     所谓短连接指建立SOCKET连接后发送后接收完数据后马上断开连接,一般银行都使用短连接

     解释2

     长连接就是指在基于tcp的通讯中,一直保持连接,不管当前是否发送或者接收数据。

     而短连接就是只有在有数据传输的时候才进行连接,客户-服务器通信/传输数据完毕就关闭连接。

     解释3

     长连接和短连接这个概念好像只有移动的CMPP协议中提到了,其他的地方没有看到过。

     通信方式

     各网元之间共有两种连接方式:长连接和短连接。所谓长连接,指在一个TCP连接上可以连续发送多个数据包,

     在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接。短连接是指通信双方有数据交互

     时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,即每次TCP连接只完成一对 CMPP消息的发送。

     现阶段,要求ISMG之间必须采用长连接的通信方式,建议SP与ISMG之间采用长连接的通信方式。

     解释4

     短连接:比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。

     长连接:有些服务需要长时间连接到服务器,比如CMPP,一般需要自己做在线维持。

     最近在看“服务器推送技术”,在B/S结构中,通过某种magic使得客户端不需要通过轮询即可以得到服务端的最新

     信息(比如股票价格),这样可以节省大量的带宽。

     传统的轮询技术对服务器的压力很大,并且造成带宽的极大浪费。如果改用ajax轮询,可以降低

     带宽的负荷(因为服务器返回的不是完整页面),但是对服务器的压力并不会有明显的减少。

     而推技术(push)可以改善这种情况。但因为HTTP连接的特性(短暂,必须由客户端发起),使得

     推技术的实现比较困难,常见的做法是通过延长http连接的寿命,来实现push。

     ===================================================================================

     HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保

     持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接。

      HTTP首部的Connection: Keep-alive是HTTP1.0浏览器和服务器的实验性扩展,当前的HTTP1.1 RFC

     2616文档没有对它做说明,因为它所需要的功能已经默认开启,无须带着它,但是实践中可以发现,浏览器的报

     文请求都会带上它。如果HTTP1.1版本的HTTP请求报文不希望使用长连接,则要在HTTP请求报文首部加上Conne

     ction: close。

    在实际使用中,HTTP头部有了Keep-Alive这个值并不代表一定会使用长连接,客户端和服务器端都可以无视这、

    个值,也就是不按标准来,譬如我自己写的HTTP客户端多线程去下载文件,就可以不遵循这个标准,并发的或者连

    续的多次GET请求,都分开在多个TCP通道中,每一条TCP通道,只有一次GET,GET完之后,立即有TCP关闭的四次

    握手,这样写代码更简单,这时候虽然HTTP头有Connection: Keep-alive,但不能说是长连接。正常情况下客

    户端浏览器、web服务端都有实现这个标准,因为它们的文件又小又多,保持长连接减少重新开TCP连接的开销很有

    价值。

    二、长连接的过期时间

    客户端的长连接不可能无限期的拿着,会有一个超时时间,服务器有时候会告诉客户端超时时间,譬如:

    图中的Keep-Alive: timeout=20,表示这个TCP通道可以保持20秒。另外还可能有max=XXX,表示这

    个长连接最多接收XXX次请求就断开。对于客户端来说,如果服务器没有告诉客户端超时时间也没关系,服

    务端可能主动发起四次握手断开TCP连接,客户端能够知道该TCP连接已经无效;另外TCP还有心跳包来检

    测当前连接是否还活着,方法很多,避免浪费资源。

    三、长连接的数据传输完成识别

    使用长连接之后,客户端、服务端怎么知道本次传输结束呢?两部分:1是判断传输数据是否达到了

    Content-Length指示的大小;2动态生成的文件没有Content-Length,它是分块传输(chunked),

    这时候就要根据chunked编码来判断,chunked编码的数据在最后有一个空chunked块,表明本次传输数据结束

     TCP的keep alive是检查当前TCP连接是否活着;HTTP的Keep-alive是要让一个TCP连接活久点。它们是不同层次的概念。

     TCP keep alive的表现:

     当一个连接“一段时间”没有数据通讯时,一方会发出一个心跳包(Keep Alive包),如果对方有回包则表明当前连接有效,继续监控。

 * */

评论列表
文章目录