回想上一章

在上一章《为什么我们须要HTML5 WebSocket》中,我简单的介绍了下WebSocket的前世今生。相信大家已对WebSocket有了初步的了解。那么今天我们继续深入学习WebSocket的机制。

WebSocket机制

我们知道WebSocket是HTML5一种新的协议。它实现了浏览器与server全双工通信(不知道的能够看下全双工通信RS-422标准),能更好的节省server资源和带宽并达到实时通讯,它建立在TCP之上。同HTTP一样通过TCP来数据传输,可是它和HTTP最大不同是:

WebSocket是一种双向通信协议,在建立连接后,WebSocketserver和Browser/Client Agent都能主动的向对方发送或接收数据,就像Socket一样;

WebSocket须要相似TCP的client和server端通过握手连接,连接成功后才干相互通信。

非WebSocket模式传统 HTTP client与server的交互例如以下:

传统 HTTP 请求响应clientserver交互图

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

使用 WebSocket 模式client与server的交互例如以下:
WebSocket 请求响应clientserver交互图

依据上面两张图对照能够看出。相对于传统的HTTP每次请求-应答都须要client与服务端建立连接的模式。WebSocket是相似Socket的TCP长连接的通讯模式,一旦WebSocket连接建立后,兴许数据都以帧序列的形式传输。

在client断开WebSocket连接或Server端断掉连接前。不须要client和服务端又一次发起连接请求。

在海量并发及client与server交互负载流量大的情况下。极大的节省了网络带宽资源的消耗,有明显的性能优势,且client发送和接受消息是在同一个持久连接上发起。实时性优势明显。

WebSocket和HTTP的报文

我们再来看看WebSocket通讯与传统HTTP的不同交互的报文:

在client(浏览器端js),创建WebSocket 实例化一个新的 WebSocket client对象,连接相似 ws://yourdomain:port/path 的服务端 WebSocket URL。WebSocket client对象会自己主动解析并识别为 WebSocket 请求,从而连接服务端端口,运行两方握手过程,client发送数据格式相似:

WebSocket client连接报文

能够看到,client发起的 WebSocket 连接报文相似传统 HTTP 报文,”Upgrade:websocket”參数值表明这是WebSocket类型请求。“Sec-WebSocket-Key”是WebSocketclient发送的一个base64编码的密文。要求服务端必须返回一个相应加密的“Sec-WebSocket-Accept”应答,否则client会抛出“Error during WebSocket handshake”错误,并关闭连接。

服务端收到报文后返回的数据格式相似:

WebSocket 服务端响应报文

“Sec-WebSocket-Accept”的值是服务端採用与client一致的密钥计算出来后返回client的,“HTTP/1.1 101 Switching Protocols”表示服务端接受WebSocket协议的client连接,经过这种请求-响应处理后。client服务端的WebSocket连接握手成功, 兴许就能够进行TCP通讯了。

欢迎大家关注我的博客。关注我的微博,如有疑问。请加qq群:454796847、135430763 共同进步!

浅谈HTML5 WebSocket的机制的更多相关文章

  1. 浅谈HTML5单页面架构(二)——backbone + requirejs + zepto + underscore

    本文转载自:http://www.cnblogs.com/kenkofox/p/4648472.html 上一篇<浅谈HTML5单页面架构(一)--requirejs + angular + a ...

  2. 浅谈html5网页内嵌视频

    更好的阅读体验:浅谈html5网页内嵌视频 如今在这个特殊的时代下:flash将死未死,微软和IE的历史问题,html5标准未定,苹果和谷歌的闭源和开源之争,移动互联网的大势所趋,浏览器各自为战... ...

  3. AngularJS进阶(二十五)requirejs + angular + angular-route 浅谈HTML5单页面架构

    requirejs + angular + angular-route 浅谈HTML5单页面架构 众所周知,现在移动Webapp越来越多,例如天猫.京东.国美这些都是很好的例子.而在Webapp中,又 ...

  4. 浅谈html5 video 移动端填坑记

    这篇文章主要介绍了浅谈html5 video 移动端填坑记,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 本文介绍了html5 video 移动端填坑记,分享给大家,具体 ...

  5. 浅谈Java的反射机制和作用

    浅谈Java的反射机制和作用 作者:Java大师 欢迎转载,转载请注明出处 很多刚学Java反射的同学可能对反射技术一头雾水,为什么要学习反射,学习反射有什么作用,不用反射,通过new也能创建用户对象 ...

  6. 浅谈:Redis持久化机制(一)RDB篇

    浅谈:Redis持久化机制(一)RDB篇 ​ 众所周知,redis是一款性能极高,基于内存的键值对NoSql数据库,官方显示,它的读效率可达到11万次每秒,写效率能达到8万次每秒,因为它基于内存以及存 ...

  7. 浅谈:Redis持久化机制(二)AOF篇

    浅谈:Redis持久化机制(二)AOF篇 ​ 上一篇我们提及到了redis的默认持久化方式RDB,是一种通过存储快照数据方式持久化的机制,它在宕机后会丢失掉最后一次更新RDB文件后的数据,这也是由于它 ...

  8. 浅谈HTML5单页面架构(一)——requirejs + angular + angular-route

    心血来潮,打算结合实际开发的经验,浅谈一下HTML5单页面App或网页的架构. 众所周知,现在移动Webapp越来越多,例如天猫.京东.国美这些都是很好的例子.而在Webapp中,又要数单页面架构体验 ...

  9. 浅谈C语言中断处理机制

    一.中断机制 1.实现中断响应和中断返回 当CPU收到中断请求后,能根据具体情况决定是否响应中断,如果CPU没有更急.更重要的工作,则在执行完当前指令后响应这一中断请求.CPU中断响应过程如下:首先, ...

随机推荐

  1. codevs 3083 二叉树

    题目描述 Description 同学们都知道二叉树的定义,也都知道3个结点的二叉树有5种, 现给你二叉树的结点个数n,要你编程输出不同形态二叉树的种数. 输入描述 Input Description ...

  2. 转:典型开源3D引擎分类比较

    常见的3D引擎有:Unreal.Quake.Lithtech.OGRE.Nebula.Irrlicht.Truevision3D... 其中开源免费的有:OGRE.irrlicht.fly3d.Neo ...

  3. 【php正则】php正则匹配UTF-8格式的中文汉字 和 【,】【,】【。】等符号

    1.php正则匹配UTF-8格式的中文汉字 和 [,][,][.]等符号 if (preg_match_all("/([\x{4e00}-\x{9fa5}]+((,)?)+((,)?)+(( ...

  4. 微信小程序组件

  5. Log4Net的应用教程之保存日志到数据库中

    关于Log4Net的应用,网上有很多教程,但大多数都是拷贝复制,有些按照他的代码来,运行起来发现也出不来效果,但是Log4net的作用实在是非常大的,或者这里说的不对,应该说系统的日志功能是很重要的也 ...

  6. 导致线程死锁容易忽略的一点 SendMessage

    假如主线程 某一个按钮 点击的 响应要操作与另一个线程共享的 变量. 在这个点击响应里先lock 之后,假如另一个线程的变量正在 “使用”状态,并且内部又调用了SendMessage试图更新界面的某些 ...

  7. jenkins+maven+git+ 邮件自动转发 持续化集成 图文教程

    1.所需要的插件,安装plugin ,进入mangae Jenkins→ manage Plugins, 切换到Available tab, 选择如下plugin 安装 Gitplugin, GitH ...

  8. Nginx官方版本说明##Mainline &Stable&Legacy versions

    Nginx (Mainline Stable Legacy)区别 Nginx官网提供了三个类型的版本Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发 ...

  9. Magento模型与ORM基础

    参考网址:http://www.ruiwant.com/magento-for-dev-part-5-magento-models-and-orm-basics.html

  10. EF的表左连接方法Include和Join

    在EF中表连接常用的有Join()和Include(),两者都可以实现两张表的连接,但又有所不同. 例如有个唱片表Album(AlbumId,Name,CreateDate,GenreId),表中含外 ...