WebSocket的动机是什么?

目前的Web通信使用的是HTTP协议,HTTP协议是基于TCP协议的应用层协议,HTTP协议的工作模式是request/response模式。在一次通信中,必须首先由client向server发起TCP连接,然后server接受该TCP连接请求,在TCP连接建立之后,首先由client发起HTTP request,然后server再发出HTTP response。

 

因此,在这种标准HTTP工作模式的约定下,server是不被允许发起一个TCP请求的,因此也就不被允许在未收到HTTP request的情况下,发送一个HTTP response给client。在这种约束下,为了能够不断的随时从server发送内容到client端,就必须保证server端随时都有一个待响应的request(注意这与persistent connection不是同一个概念,persistent connection是用来复用HTTP之下的TCP连接)。

 

如何在现有的HTTP框架内,来获得这么一个时刻存在于server端的待响应请求呢?这就是COMET技术,具体说有2种方式:

  • 多个HTTP请求不断接力(long polling)
  • 单个HTTP请求不终止 (HTTP streaming)

 

但是,如果我们回过头来仔细想一下HTTP协议的细节,HTTP其实是建立在TCP之上的,所以当我们在进行HTTP通信时,client和server之间已经建立起了一个TCP连接,而任何TCP连接(从程序员角度来说,就是一个Berkeley socket)都是可以用来双向通信的,那么为什么不直接利用这个现成的TCP连接来实现client和server的双向通信呢?

 

没错!这就是WebSocket所做的事情!

WebSocket连接如何建立

我们建立WebSocket通信的过程是这样的:

  • Step 1 建立TCP连接(这一步是一切的基础,和HTTP一样)
  • Step 2 通过TCP连接,发送HTTP Get 请求,其中包含关键的Upgrade: websocket header。
  • Step 3 Server收到HTTP请求后,会把Step 1的TCP连接的用户层协议从HTTP转变为WebSocket。至此,HTTP部分就退出舞台了,WebSocket开始接管一切。

 

 

如何理解WebSocket可以和HTTP共享80端口?

准确的说,应该是WebSocket可以分享HTTP正在使用的端口,不一定是80。原因是WebSocket的initial handshake是一个valid HTTP request,所以除非我们自己重写一套解析HTTP handshake的逻辑,否则必须发送到现有的HTTP端口来解析。而仅仅发送到HTTP端口还是不够的,我们还需要在server实现中添加关于WebSocket的逻辑。然后,server根据HTTP协议解析了initial handshake request之后,由server来进行协议切换,把HTTP换成WebSocket。

 

所以,这里可以看出,HTTP协议自己并不需要了解WebSocket什么,也不需要知道它何时应该让位于WebSocket协议,HTTP协议只是规定了HTTP的通信格式(比如WebSocket所使用的custom header),是server根据HTTP协议规定的格式,发觉了WebSocket的连接请求,然后再进行协议切换,server是协议切换逻辑的载体和执行者,当我们要实现一个WebSocket server,就必须在server代码中加入以下逻辑:

  • 识别HTTP格式的WebSocket 请求
  • 协议切换
  • WebSocket的协议模块

 

 

参考

 

理解WebSocket的更多相关文章

  1. 理解WebSocket心跳及重连机制(五)

    理解WebSocket心跳及重连机制 在使用websocket的过程中,有时候会遇到网络断开的情况,但是在网络断开的时候服务器端并没有触发onclose的事件.这样会有:服务器会继续向客户端发送多余的 ...

  2. websocket教程(一) 非常有趣的理解websocket

    一.websocket与http WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有 1 ...

  3. 看完让你彻底理解 WebSocket 原理,附完整的实战代码(包含前端和后端)

    1.前言 最近有同学问我有没有做过在线咨询功能.同时,公司也刚好让我接手一个 IM 项目.所以今天抽时间记录一下最近学习的内容.本文主要剖析了 WebSocket 的原理,以及附上一个完整的聊天室实战 ...

  4. WebSocket - ( 一.概述 )

    说到 WebSocket,不得不提 HTML5,作为近年来Web技术领域最大的改进与变化,包含CSS3.离线与存储.多媒体.连接性( Connectivity )等一系列领域,而即将介绍的 WebSo ...

  5. WebSocket 介绍(二)-WebSocket API

    这一章介绍如何用WebSocket API来控制协议和创建应用,运用http://websocket.org 提供的现有WebSocket服务器,我们可以收发消息.创建一些简单的WebSocket应用 ...

  6. Websocket协议的学习、调研和实现

    本文章同时发在 cpper.info. 1. websocket是什么 Websocket是html5提出的一个协议规范,参考rfc6455. websocket约定了一个通信的规范,通过一个握手的机 ...

  7. WebSocket 实战

    http://www.ibm.com/developerworks/cn/java/j-lo-WebSocket/ 本文介绍了 HTML5 WebSocket 的由来,运作机制及客户端和服务端的 AP ...

  8. 微信、QQ这类IM App怎么做——谈谈Websocket

    前言 关于我和WebSocket的缘:我从大二在计算机网络课上听老师讲过之后,第一次使用就到了毕业之后的第一份工作.直到最近换了工作,到了一家是含有IM社交聊天功能的app的时候,我觉得我现在可以谈谈 ...

  9. 微信,QQ这类IM app怎么做——谈谈Websocket

    前言 关于我和WebSocket的缘:我从大二在计算机网络课上听老师讲过之后,第一次使用就到了毕业之后的第一份工作.直到最近换了工作,到了一家是含有IM社交聊天功能的app的时候,我觉得我现在可以谈谈 ...

随机推荐

  1. 在Debian下编译Postgresql

    今天起床看到床头上的那本<PostgreSQL数据库内核分析>,发觉这书买了这么长时间,虽然大致看了一遍,可还没亲手实践.今天就花了点时间搭了个调试环境. 环境:Debian 7.0 ## ...

  2. 谷歌(Chrome)浏览器调试JavaScript小技巧

    谷歌浏览器不仅仅可以用来上网,对于开发人员来说,它更像是一款强大的开发辅助工具. 工欲善其事必先利其器,接下来笔者给大家分享一些Chrome的使用方法. 假如读者了解如何在Chrome中添加JavaS ...

  3. 从配置sublimeClang插件中学到的

    1.不害怕失败的关键在于要事先为失败准备补救措施.2.人们害怕内部结构复杂的东西出错,并以自己缺乏对内部结构的认识为理由而放弃查错.其实某些情况下根本无需对内部结构有多么深入的认识,只需从外部观察就够 ...

  4. asp.net mvc 如何调用微信jssdk接口:分享到微信朋友(圈)| 分享到qq空间

    如何在asp.net mvc 项目里, 调用微信jssdk接口,现实功能: 分享到微信朋友(圈)| 分享到qq空间 1 创建一个Action,准备一些数据,初始化数据(签名): /// <sum ...

  5. SSL双向认证java实现(转)

    本文通过模拟场景,介绍SSL双向认证的java实现 默认的情况下,我认为读者已经对SSL原理有一定的了解,所以文章中对SSL的原理,不做详细的介绍. 如果有这个需要,那么通过GOOGLE,可以搜索到很 ...

  6. 基于iscroll.js实现下拉刷新和上拉加载特效

    现在已经不是纯Android独霸天下的时代了,H5嵌入Android的Hybrid混合开发是大势所趋.今天给大家带来的就是移动端中常见的"上拉刷新,下拉加载"特效,这个特效将会基于 ...

  7. [python爬虫] Selenium定向爬取海量精美图片及搜索引擎杂谈

    我自认为这是自己写过博客中一篇比较优秀的文章,同时也是在深夜凌晨2点满怀着激情和愉悦之心完成的.首先通过这篇文章,你能学到以下几点:        1.可以了解Python简单爬取图片的一些思路和方法 ...

  8. paip.互联网产品要成功的要素

    paip.互联网产品要成功的要素 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.net/atti ...

  9. atitit.提升开发效率---使用服务器控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比较

    atitit.提升开发效率---使用服务器控件生命周期  asp.net 11个阶段  java jsf 的6个阶段比较 如下列举了服务器控件生命周期所要经历的11个阶段. (1)初始化-- --在此 ...

  10. 祸福相依,大难之后的O2O迎来新福报?

    今天的O2O似乎已经成为了一个人人都不愿意提的名词,很多原本做O2O的创业者,如今都不提自己是O2O,只说是互联网+.创业者们实际上仍然是在干着O2O的事情,之所以不敢提不愿提,无非就是一提O2O,投 ...