错觉与突然的察觉

大多数人都知道HTTP1.0不支持长连接,知道HTTP1.1支持长连接。
这是业界的一个常识。
然而这样的描述导致了一些不做网络底层开发的开发者都下意识的认为HTTP1.1是一个可以建立长连接的的协议。
小弟之前也是如此认为的。
这边是一个很多人都存在的错觉。

偶然在一篇文章中发现了字眼“HTTP是一种应用层的网络协议”,突然想起,长连接是存在于网络层的一种连接状态,而实现它则需要在传输层进行开发,因为它是基于对真实数据的收发,需要在底层进行管控。那么作为应用层的HTTP协议,如何能实现“长连接呢“?

探索

经过一些查阅,才了解到,HTTP作为应用层协议,其实它的生命周期在服务器返回结果时就已经结束了,而所谓的支持长连接,其实是基于'Keep-Alive'请求头所约定,从而向下进行长连接发起的一种机制。该长连接依然是基于TCP的。
因此:
所谓HTTP1.1及以上支持长连接,并不是HTTP1.1可以建立长连接,而是它支持以请求头的方式进行长连接发起(并且要求客户端与服务端都要具备 ‘Keep-Alive: true’ )。

So?这都是些什么?

那么就再来理一理这几个概念的思路吧

  • 短连接
    所谓短连接,及连接只保持在数据传输过程,请求发起,连接建立,数据返回,连接关闭。它适用于一些实时数据请求,配合轮询来进行新旧数据的更替。

  • 长连接
    长连接便是在连接发起后,在请求关闭连接前客户端与服务端都保持连接,实质是保持这个通信管道,之后便可以对其进行复用。
    它适用于涉及消息推送,请求频繁的场景(直播,流媒体)。连接建立后,在该连接下的所有请求都可以重用这个长连接管道,避免了频繁了连接请求,提升了效率。

容易混淆的长短连接长短轮询

所谓轮询,即是在一个循环周期内不断发起请求来得到数据的机制。只要有请求的的地方,都可以实现轮询,譬如各种事件驱动模型。它的长短是在于某次请求的返回周期。

  • 短轮询
    短轮询指的是在循环周期内,不断发起请求,每一次请求都立即返回结果,根据新旧数据对比决定是否使用这个结果。

  • 长轮询
    而长轮询及是在请求的过程中,若是服务器端数据并没有更新,那么则将这个连接挂起,直到服务器推送新的数据,再返回,然后再进入循环周期。

由上可以看到,长短轮询的理想实现都应当基于长连接,否则若是循环周期太短,那么服务器的荷载会相当重;当然,即便是在长连接下,访问人数过多,长短轮询都有可能造成服务器的瞬时访问量庞大,这就需要一些相应的优化实践了。

 

作者:Asambojur
链接:https://www.jianshu.com/p/00daa2d84266
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

js小技巧(二)的更多相关文章

  1. [转载]Js小技巧||给input type=“password”的输入框赋默认值

    http://www.cnblogs.com/Raywang80s/archive/2012/12/06/2804459.html [转载]Js小技巧||给input type="passw ...

  2. js小技巧总结

    js小技巧总结 1.Array.includes条件判断 function test(fruit) { const redFruits = ["apple", "stra ...

  3. html/css/js小技巧实例

    一些学习中碰到的小技巧 让div自动撑起来: .clearfix:after{ content: "."; clear: both; display: block; visibil ...

  4. ( 译、持续更新 ) JavaScript 上分小技巧(二)

    考虑到文章过长,不便于阅读,这里分出第二篇,如有后续,每15个知识点分为一篇... 第一篇地址:( 译.持续更新 ) JavaScript 上分小技巧(一) 第三篇地址:( 译.持续更新 ) Java ...

  5. javascript小技巧-js小技巧收集(转)

    本文转载自:http://blog.csdn.net/ocean20/article/details/2498699 每一项都是js中的小技巧,但十分的实用! 1.document.write(&qu ...

  6. JS小技巧大本事(持续更新)

    1. 复制N个字符 String.prototype.repeat = function(num){ return (new Array(++num)).join(this); } var a = ' ...

  7. 可以提升幸福感的js小技巧(下)

    4.数字 4.1 不同进制表示法 ES6中新增了不同进制的书写格式,在后台传参的时候要注意这一点. 29 // 10进制 035 // 8进制29 原来的方式 0o35 // 8进制29 ES6的方式 ...

  8. js小技巧(收集的)

    一.事件源对象 event.srcElement.tagName //IE浏览器 event.srcElement.type event.target.tagName //dom浏览器 event.t ...

  9. js小技巧

    js判断字符长度 直接使用String对象的属性,空格亦算一个字符 myString = "Hello world"; length = myString.length js比较字 ...

随机推荐

  1. 在.net程序中使用System.Net.Mail来发送邮件

    System.Net.Mail是微软自家提供的工具,在.net程序中可以使用该空间中的SmtpClient实例来实现邮件的发送. 使用System.Net.Mail空间与Web.config配置相配合 ...

  2. C#取枚举描述

    一直都觉得枚举是个很不错的东西,可以给我们带来很多方便,而且也增加代码的可读性. 我在之前已经介绍过枚举的简要应用了,再次再来写下怎么获取枚举的描述. 源码如下: 首先,我们定义个含有描述的枚举类型 ...

  3. java数据结构和算法------堆排序

    package iYou.neugle.sort; public class Heap_sort { public static void HeapSort(double[] array) { for ...

  4. 46.谈谈SDRAM的作用

    SDRAM这个至今还在用的存储器,虽然被后来的DDR取代,掌握好它还是很重要的.之前在调试时,确实费了好大劲,它的复杂性毋庸置疑,一般人要想弄懂他,得花1个月左右吧,至少我这么认为.话说回来,SDRA ...

  5. UIAlertControl swift

    let alertController = UIAlertController(title: "开始!", message: "游戏就要开始,你准备好了吗?", ...

  6. com.ibatis.sqlmap.client.SqlMapException: There is already a statement named search in this SqlMap.

    Caused by: com.ibatis.common.xml.NodeletException: Error parsing XML.  Cause: java.lang.RuntimeExcep ...

  7. Log4j的常见用法

    对于log4j,一般常用的只要保存如下的内容为属性文件即可: #log4j.rootLogger=DEBUG,A1,R log4j.rootLogger=INFO,A1,R log4j.appende ...

  8. Teamwork-Week3 职责划分及团队分数分配原则

    本组人数:5. 一.人员职责划分 PM:1            柴泽华 PM的职责: 1)根据项目范围.质量.时间与成本的综合因素的考虑,进行项目的总体规划与阶段计划. 2)设置项目组中的各种角色, ...

  9. Android中的单位及测试相关概念

    android中的单位: in 英寸 pt 点距 px 像素  dp(dip) 密度无关的像素单位,自适应device屏幕的比例,通常涉及长宽高时采用 sp 与范围无关的像素单位,通常在设置字体大小时 ...

  10. Posix线程编程指南(1) 线程创建与取消

    线程创建 1.1 线程与进程 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列.在串行程序基础上引入线程和进程是为了提高程序的 ...