一、阅前热身

什么是keep-alive

1、keep-alive只是客户端的一种建议

我们打开百度首页,进一步查看header。

image_1b2idfp2k4ecu8pagh1mkutf39.png-415.7kB

如图,我们看到请求header中有一行:

Connection:keep-alive复制代码

keep-alive是通知服务器,在这个HTTP Request/Responset结束后,不要立即断开TCP连接(注意是TCP连接,和HTTP没有关系),后面的HTTP Request仍然可以通过这个TCP连接继续传送。

但是!这只是个建议,服务器可能不支持,也可能忽略掉这个建议。也可能因为时间太久而直接断开TCP连接

通俗点解释就是:keep-alive只是通知服务器,您先别挂,一会儿可能还有活儿,至于它挂不挂还是看它心情。

所以,keep-alive只是客户端建议的一种复用TCP连接的方式,至于服务器支持不支持,就由不得客户端了。

2、keep-alive只是http协议中的一部分

keep-alive是http协议中的一部分,也即客户端可以主动的发起request到服务器,服务器只能被动的response给客户端。

我要想实现服务器主动的push消息给客户端,keep-alive是无能无力的。

二、服务器的消息如何发给客户端

long long ago~ 服务器端要想主动的push消息给客户端(比如网页聊天室消息的即时收发),这是不可能滴。
但是,我可以使用ajax轮询、long poll 技术造一个服务端给客户端主动push消息的假象。

①:什么是ajax轮询?

ajax轮询的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。

场景再现:

客户端:啦啦啦,有没有新信息(Request)
服务端:没有(Response)
客户端:啦啦啦,有没有新信息(Request)
服务端:没有。。(Response)
客户端:啦啦啦,有没有新信息(Request)
服务端:你好烦啊,没有啊。。(Response)
客户端:啦啦啦,有没有新消息(Request)
服务端:好啦好啦,有啦给你。(Response)
客户端:啦啦啦,有没有新消息(Request)
服务端:。。。。。没。。。。没。。。没有(Response) ---- loop复制代码

但是这样,有没有发现,大大增加了服务端的负载,并且速度还慢。

②:什么是long poll?

long poll和ajax差不多,原理都是采用轮询的方式。只不过long poll是采取的阻塞的方式去轮询。
也即客户端发起一个请求连接,这个连接会阻塞住,直到服务端有了消息,才会response给客户端。

注:阻塞、非阻塞的理解,请参考我之前的文章:nginx、swoole高并发原理初探

场景再现:

客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request)
服务端:额。。 等待到有消息的时候。。来 给你(Response)
客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request) -loop复制代码

long pull 虽然降低了服务器的负载,但是需要服务器有很高的并发能力才可以。
而目前处理高并发的模型基本都是异步非阻塞的模型(比如nginx)。

既想阻塞,又想高并发,几乎不可能。

③:总结

ajax轮询、long poll技术虽然都能实现服务端消息的实时通知,但是各有缺点,都不是根本的解决办法。
计算机界急需一种新的技术去处理这些需求~

三、websocket来啦

既然ajax轮询、long poll都不怎么样。我们发明一种新的协议吧!

Websocket协议解决了服务器与客户端全双工通信的问题。

注:什么是单工、半双工、全工通信?
信息只能单向传送为单工;
信息能双向传送但不能同时双向传送称为半双工;
信息能够同时双向传送则称为全双工。

websocket协议解析

wensocket协议包含两部分:一部分是“握手”,一部分是“数据传输”。
为了便于演示,我们采用swoole建立一个websocket服务器来演示。

1、握手

①客户端向服务端发起连接请求

image_1b2igg66d159v128qt59v2l48cm.png-59.3kB

如图,我们在请求服务器的时候,发送了这样的request header。

下面我们就一些比较重要的字段信息进行说明:

Connection:Upgrade #通知服务器协议升级
Upgrade:websocket  #协议升级为websocket协议
Host:0.0.0.0:9501  #升级协议的服务主机:端口地址
Sec-WebSocket-Key:K8o1cNIxO2pR6inTIDBSgg== #传输给服务器的key
Sec-WebSocket-Version:13 #websocket协议版本13复制代码

Sec-WebSocket-Key有什么用呢?
客户端将这个key发送给服务器,服务器将这个key进行处理,将处理后的key返回给客户端,客户端根据这个key是否正确来判断是否建立连接。

②:服务端返回握手应答

image_1b2ih7ard1oet1kangfig2uo01g.png-14.7kB

如图,我们看到websocket协议状态码是101.

101表示协议切换成功。


我们查看websocket的response header。如图:

image_1b2ih030qjdc1dllmshto0eph13.png-29.6kB

下面解释下reponse header字段的含义

Connection:Upgrade #协议升级成功
Sec-WebSocket-Accept:GnoYH/ip/ZMh+a5rX5P/YR6e68g= #服务端处理之后的key
Sec-WebSocket-Version:13#websocket 协议版本号
Upgrade:websocket#协议升级为websocket复制代码

至此,websocket握手成功!下面就尽情的传输数据吧!

2、数据传输

数据传输需要客户端,没什么好说的了。

  • Chrome/Firefox/高版本IE/Safari等浏览器内置了JS语言的WebSocket客户端
  • 可以使用一些扩展来实现websocket客户端。如php的swoole、workerman。

    注意:非WebSocket客户端不能与WebSocket服务器通信

四、参考文章

Websocket协议之握手连接
WebSocket 是什么原理?为什么可以实现持久连接?

更多精彩,请关注公众号“聊聊代码”,让我们一起聊聊“左手代码右手诗”的事儿。

websocket 历史及使用详解相关推荐

  1. WebSocket安卓客户端实现详解(一)–连接建立与重连

    http://blog.csdn.net/zly921112/article/details/72973054 前言 这里特别说明下因为WebSocket服务端是公司线上项目所以这里url和具体协议我 ...

  2. c++ websocket客户端_WebSocket协议详解与c++amp;c#实现

    摘要: 随着手机游戏.H5游戏以及微信小游戏的普及,越来越多的客户端-服务器端的通讯采用websocket协议.Websocket协议是全双工的.基于数据帧的.建立在tcp之上的长连接协议.Webso ...

  3. sudo: apt-get:找不到命令_Linux重复执行历史命令方法详解

    Linux 下,如果要执行一条或多条之前输过的指令,要怎么处理?很多人会想到使用上下箭头去翻查历史输入的命令.这当然是可以了,除了这种方法,本文再介绍另外 5 种方法来实现这样的效果. 在正式开始之前 ...

  4. websocket网络层详解_【技术分享】WebSocket漏洞与防护详解

    2017-05-02 14:15:48 阅读:1889次 预估稿费:120RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 socket简介 一个socket是一次网络通信 ...

  5. WebSocket子协议STOMP详解

    为什么80%的码农都做不了架构师?>>>    1. STOMP简介 STOMP即Simple (or Streaming) Text Orientated Messaging Pr ...

  6. WebSocket四种事件详解 入门篇(二)

    示例代码  在文章最下方,可以根据示例代码和讲解来理解整个WebSocket流程.代码用SpringBoot 和 maven搭建 服务端和客户端四种事件 1.打开事件 此事件发生在端点上建立新连接时并 ...

  7. ARM开发工具历史及分类详解 (最详尽的区分和介绍ARM DS-5,RVD...

    如今ARM体系架构的处理器在嵌入式市场上呼风唤雨,从低端的MCU应用到高端的多媒体消费电子,移动设备领域,工业控制,医疗设备,汽车电子等,到处是ARM架构处理器大军的身影. ARM开发工具就是ARM公 ...

  8. Spring websocket+Stomp+SockJS 实现实时通信 详解

    Spring websocket+Stomp+SockJS 实时通信详解 一.三者之间的关系 Http连接为一次请求(request)一次响应(response),必须为同步调用方式.WebSocke ...

  9. WebSocket协议详解及应用

    标签:websocket WebSocket协议详解及应用(七)-WebSocket协议关闭帧 本篇介绍WebSocket协议的关闭帧,包括客户端及服务器如何发送并处理关闭帧.关闭帧错误码及错误处理方 ...

最新文章

  1. SQL Server (MSSQLSERVER) 服务因 2148081668 服务性错误而停止。
  2. 用js改变embed标签的src值
  3. Python入门100题 | 第039题
  4. 信用模型评分卡入门介绍
  5. 请检查virtualboxapi是否正确安装_电机行业安装绝缘轴承规范
  6. c语言如何关闭线程,如何用C语言实现多线程
  7. web.xml中的主要元素说明(listener, filter, servlet)
  8. IDEA 配置 SpringBoot 启动端口
  9. Struts2 Result 类型和对应的用法详解 2
  10. python 长度queue_Python基础知识梳理
  11. 双鉴探测器是哪两种探测方式结合_报警的基本知识
  12. html页面网页打开乱码怎么解决方法,网页乱码怎么解决?
  13. java开发中的dorado_dorado7开发常用技巧及代码
  14. 1064用ctype库解决
  15. 英语简单句——英语句子的基本结构、句子的成分(谓语、主语)、简单句的考点分析
  16. 资本寒冬之下的聚美优品私有化
  17. 从CarLife音乐切换回蓝牙音乐音量变小
  18. 如何计算对数收益率和净值化转换
  19. Alpha阶段敏捷冲刺⑦
  20. javascript 模板_了解JavaScript中的模板文字

热门文章

  1. Jquery中 实现气泡消息提示
  2. node不是内部命令时配置node环境变量
  3. 【LeetCode】414.第三大的数
  4. 作为项目的直接上级通过问题和风险来帮助项目
  5. 春招不迷茫,模板刷题101实验室上线啦
  6. JAVA的JDK环境变量的配置JAVA_HOME;PATH;CLASSHOME
  7. 金山云最新财报:Q4营收7.27亿,同比增长81%
  8. 剑指Offer 包含min函数的栈
  9. java 网站源码 四套模版 兼容手机平板PC 在线编辑模版 freemaker 静态引擎
  10. linux下epoll如何实现高效处理