http长轮询&短轮询

http 协议介绍:

http 协议是请求/响应范式的, 每个 http 响应都是由一个对应的 http 请求产生的; http 协议是无状态的, 多个 http 请求之间是没有关系的.html

http 长链接:

目前 http 协议广泛使用的是 1.1 版本, 以前有个 1.0 版本, 二者之间的一个区别是 1.1 支持 http 长链接, 或者叫持久链接.1.0 不支持 http 长链接, 每次一个 http 请求响应后都关闭 tcp 链接, 下个 http 请求会从新创建 tcp 链接.web

所谓 http 长链接, 就是多个 http 请求共用一个 tcp 链接; 这样能够减小屡次临近 http 请求致使 tcp 创建关闭所产生的时间消耗. http 1.1 中在请求头和相应头中用 connection字段标识是不是 http 长链接, connection: keep-alive, 代表是 http 长链接; connection:closed, 代表服务器关闭 tcp 链接浏览器

与 connection 对应的一个字段是 keep-live, http 响应头中出现, 他的格式是 timeout=30, max=5, timeout 是两次 http 请求保持的时间(s), , max 是这个 tcp 链接最多为几个 http 请求重用缓存

http 长轮询:

http 长轮询是服务器收到请求后若是有数据, 马上响应请求; 若是没有数据就会 hold 一段时间, 这段时间内若是有数据马上响应请求; 若是时间到了尚未数据, 则响应 http 请求;浏览器受到 http 响应后立在发送一个一样 http 请求查询是否有数据;服务器

http 长轮询的局限:异步

  1. 浏览器端对统一服务器同时 http 链接有最大限制, 最好同一用户只存在一个长轮询;
  2. 服务器端没有数据 hold 住链接时会形成浪费, 容易产生服务器瓶颈;

http 短轮询:

http端轮询是服务器收到请求无论是否有数据都直接响应 http 请求; 浏览器受到 http 响应隔一段时间在发送一样的 http 请求查询是否有数据;tcp

http 短轮询的局限是实时性低;htm

二者相同点:
能够看出 http 长轮询和 http 短轮询的都会 hold 一段时间;blog

二者不一样点
间隔发生在服务端仍是浏览器端: http 长轮询在服务端会 hold 一段时间, http 短轮询在浏览器端 “hold” 一段时间;get

应用:

长轮询通常用在 web im, im 实时性要求高, http 长轮询的控制权一直在服务器端, 而数据是在服务器端的, 所以实时性高;
像新浪微薄的im, 朋友网的 im 以及 webQQ 都是用 http 长轮询实现的;
NodeJS 的异步机制貌似能够很好的处理 http 长轮询致使的服务器瓶颈问题, 这个有待研究.

http 短轮询通常用在实时性要求不高的地方, 好比新浪微薄的未读条数查询就是浏览器端每隔一段时间查询的.

其余:

关于 http 长链接一个误解就是服务器主动推送数据, 这个在 http 协议下是没法实现的, 由于 http 请求/响应范式决定的, http 中服务器返回数据必需要有一个浏览器端的请求对应, 服务器没法主动推送给浏览器数据.
无论 http 长轮询仍是 http 短轮询 保证同一个用户在多 tab 下只存在一个定时查询是有好处的, 这能够经过在浏览器端缓存数据解决, 在 http 响应后在浏览器端缓存数据, 并设置一个有效期, 而后在每次发送 http 请求时检查是否有有效数据, 没有则发送请求获取

 

转自:http://blog.sina.com.cn/s/blog_70899b710101azb5.html

相关文章
相关标签/搜索