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. Xperf Basics: Recording a Trace(转)

    http://randomascii.wordpress.com/2011/08/18/xperf-basics-recording-a-trace/   This post is obsolete ...

  2. 找出数组中最长的连续数字序列(JavaScript实现)

    原始题目: 给定一个无序的整数序列, 找最长的连续数字序列. 例如: 给定[100, 4, 200, 1, 3, 2], 最长的连续数字序列是[1, 2, 3, 4]. 小菜给出的解法: functi ...

  3. [读书笔记]C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器

    前言 C#1.0的委托特性使方法作为其他方法的参数来传递,而C#2.0 中提出的泛型特性则使类型可以被参数化,从而不必再为不同的类型提供特殊版本的实现方法.另外C#2.0还提出了可空类型,匿名方法和迭 ...

  4. 在sublime text 中的Emmet快捷键动态图演示

    Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演示: ...

  5. 使用gulp进行React任务的构建

    如果你不熟悉gulp的操作,可以看下下面的教程: gulp学习笔记1 gulp学习笔记2 gulp学习笔记3 gulp学习笔记4 对于gulp在react中的构建,找了很多资料,看了很多文章,也根据文 ...

  6. iphone6 plus 为什么打印出的宽度是375

    首先看一张比较简单明了的 iPhone 6 与 iPhone 6 Plus 对比图,来自 PaintCode 的<The Ultimate Guide To iPhone Resolutions ...

  7. MFC如何使用静态MFC库

    大部分MFC程序都是使用 在共享DLL中使用MFC ,但是VS每一个版本都需要一个 MFC运行库,实在是有点烦人. 所以我选择了使用静态MFC库,虽然文件会大一些,但是至少不麻烦了. VS这个做的不够 ...

  8. NEWS - InstallShield 2014正式发布

    InstallShield又迎来了新的版本InstallShield 2014,开发版本号Ver 21.0,相关产品信息已经可以从厂商Flexera Software(富莱睿)官方网站获得. 对于中国 ...

  9. How do I check if a type is a subtype OR the type of an object?

    To check if a type is a subclass of another type in C#, it's easy: typeof (SubClass).IsSubclassOf(ty ...

  10. Spring框架下的 “接口调用、MVC请求” 调用参数、返回值、耗时信息输出

    主要拦截前端或后天的请求,打印请求方法参数.返回值.耗时.异常的日志.方便开发调试,能很快定位到问题出现在哪个方法中. 前端请求拦截,mvc的拦截器 import java.util.Date; im ...