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. C++ WIN32控制台异常关闭回调函数

    /* This is an example of the SetConsoleCtrlHandler function that is used to install a control handle ...

  2. 微软发布手机版 Sample Browser。7000多示例代码一手掌握

    今天早上,Sample Browser发布其全新的Windows Phone版本.至此,自2012年相继推出Desktop版.Visual Studio版,以及2013年推出Windows Store ...

  3. Oracle dmp文件导入(还原)到不同的表空间和不同的用户下

    ------------------------------------- 从生产环境拷贝一个dmp备份文件,在另外一台电脑上搭建测试环境,用imp命令导入dmp文件时提示如下错误: 问题描述: IM ...

  4. Javascript创建对象的学习和使用

    <html> <head> <meta charset="utf-8"> <title>javascript对象的学习</ti ...

  5. JAVA学习中Swing部分JDialog对话框窗体的简单学习

    package com.swing; import java.awt.Color;import java.awt.Container;import java.awt.event.ActionEvent ...

  6. Leetcode 155 Min Stack

    题意:设计一个能输出栈内最小值的栈 该题设计两个栈,一个栈是正常的栈s,而另一个是存最小值的栈sm 在push时要判断sm是否为空,如果为空或者非空但是栈顶元素大于等于插入值的 需要在sm中插入x 同 ...

  7. CreateJSのeasel.js(一)

    CreateJS是基于HTML5开发的一套模块化的库和工具. 基于这些库,可以非常快捷地开发出基于HTML5的游戏.动画和交互应用. CreateJS为CreateJS库,可以说是一款为HTML5游戏 ...

  8. jq滚动监听-导航滚动

    github地址:https://github.com/yutaogege/jquery.nav.js 代码: <!DOCTYPE html> <html> <head& ...

  9. sqlserver数据库安全函数、配置函数、游标函数、行级函数、排名函数、元数据函数、系统统计函数 、文本和图像函数--收藏着有用

    行级函数:下列行集函数将返回一个可用于代替 Transact-SQL 语句中表引用的对象. CONTAINSTABLE 返回具有零行.一行或多行的表,这些行的列中包含的基于字符类型的数据是单个词语和短 ...

  10. SqlServer2008R2用Windows身份登录18456错误解决

    // 重装系统后发现SqlServer2008R2使用Windows身份验证不能进行连接,如下图: 以前经常会碰到SqlServer 身份验证连接失败,Windows身份验证的连接失败还是第一次,试了 ...