网络编程—构建WebSocket服务

websocket

  1. 简介
      websocket是在tcp上定义的独立的协议,相比http,其更接近于传输层协议,没有同源限制,实现浏览器和服务器全双工通信;其协议主要分为:握手数据传输 — http一定是请求和响应一一对应,而websocket连接建立后,后续数据以帧序列的形式传输;

    http交互图

    websocket交互图

  2. Web实时性
    (1)轮询机制

    • 定时轮询:客户端以一定的时间间隔像服务端发出请求,以频繁请求的方式保持客户端和服务器端的同步;
      • 缺点:当客户端以固定频率向服务端发起请求时,服务端的数据可能没有更新,这样造成很多无谓的网络传输,非常低效;
    • 长轮询(comet): 当服务器端没有数据更新的时候,连接会保持一段时间周期直到数据或状态改变时间过期
      * 目的:降低无效的网络传输,但当服务端的数据变更非常频繁的话,该机制和定时轮询在性能上差不多;
      (2)流技术
    • 流:在客户端的页面使用一个隐藏的窗口向服务端发出一个长连接的请求,服务端收到这个请求后做出回应并不断更新连接状态以保证客户端和服务器端的连接不过期;
      • 缺点:需要针对不同的浏览器设计不同的方案来改进用户体验;
        注:以上两种方案在每次客户端和服务端交互时都是一次HTTP请求和应答的过程:
      • 每一次HTTP请求和应答都带有完整的HTTP头信息,增加了每次传输的数据量;
      • 需要构造两个HTTP连接来模拟客户端和服务端之间的双向通信;


        长轮询

        (3)WebSocket:使用js调用浏览器的API发出一个WebSocket请求至服务器,经过一次握手,和服务器建立TCP通信;

      • 优点:
        • 只建立一个TCP连接,就可以主动推送数据到客户端;
        • 更轻量级的协议头,减少数据传送量;
          Websocket

websocket协议组成

  1. websocket握手:由http完成;
    (1)客户端建立连接时,通过http发起请求报文:
  • 请求服务器升级协议为websocket:
    • Upgrade:websocket
    • Connection:Upgrade
  • 安全校验
    • Sec-WebSocket-Key:随机生成的Base64编码的字符串
  • 直到子协议及版本号
    • Sec-WebSocket-Protocol: chat, superchat
    • Sec-WebSocket-Version: 13
      客户端发起的请求

      (2)服务器:告诉客户端正在更新应用层协议为websocket协议,并在当前的套接字连接上应用新协议;
      报文头:HTTP/1.1 101 Switching Protocols;— 101状态码表示切换协议成功;
      Upgrade:Websocket;
      Connection:Upgrade;
      Sec-WebSocket-Accept : Sec-WebSocket-Key + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11' -> SHA1编码得到多组两位16进制数构成的加密串 -> 进行base64编码得到最终的key;
        客户端将校验Sec-WebSocket-Accept的值,若成功,将开始接下来的数据传输。
      服务端的响应

      注:Sec-WebSocket-Key和Sec-WebSocket-Accept作为重要的握手认证信息;
      2.** 数据传输**
      (1)方法
  • send():发送数据;
  • onmessage():接受数据时触发;
      为了安全,客户端需要对发送的数据帧进行掩码处理,服务器一旦收到无掩码帧(中间拦截破坏),连接将关闭;而服务器发送给客户端的数据帧则无须做掩码处理,若客户端收到了带掩码的数据帧,连接也关闭。

(2)数据帧的定义:一个字节8位;

  • fin(1位):标识该数据帧是否是最后一帧;(1:最后一帧;0:不是最后一帧)
  • rsv1、rsv2、rsv3(各1位长):3个标识用于扩展,当有已协商的扩展时,这些值为1,否则为0;
  • opcode(4位):用于解释当前数据帧 ;
    • 0表示附加数据帧;
    • 1表示文本数据帧;
    • 2表示二进制数据帧;
    • 8表示发送一个连接关闭的数据帧;
    • 9表示ping数据帧;
    • 10表示pong数据帧(9和10是成对的);
  • masked(1位):表示是否进行掩码处理;
    • 客户端发送给服务器时是1;
    • 服务器发送给客户端是0;
  • payload length(7bit、7bit+2byte、7bit+8byte):标识数据的长度;
    • 值是0~125之间,就是数据的真实长度;
    • 值是126(1111110),后面的16位是数据的真实长度;
    • 值是127(1111111),后面的64位是数据的真实长度;
  • masking key(32位):当masked为1时存在,用于解密数据;
  • payload data(8n位):目标数据;
    eg:客户端发送hello world!
      数据较短,不需要分割为多个数据帧,以文本方式发送,payload length为1100000=96(12字节*8位/字节),所以报文为:
    fin(1)+res(000)+opcode(0001)+maked(1)+payload length(1100000)+masking key(32位)+payload data(hello world!加密后的二进制)
      服务端在data事件(在tcp层封装的)中接收这些编码数据,然后解析为相应的数据帧,再以数据帧的格式,通过掩码将真正的数据解密出来,然后触发onmessage()执行;

eg:服务器端响应yakexi的报文:
fin(1)+res(000)+opcode(0001)+masked(0)+payload length(110000)+payload data(yakexi的二进制)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  • 一、内容概览 WebSocket的出现,使得浏览器具备了实时双向通信的能力。本文由浅入深,介绍了WebSocket...
    Calvin李阅读 2,515评论 2 10
  • 前言 本章主要介绍如下知识,通过了解这些知识,进一步理解node为何适合在分布式网络中扮演各种角色。另外,由于no...
    白昔月阅读 1,913评论 0 3
  • 近几年来,各类媒体都推崇“食尚”新风气,主张年夜饭下馆子或是定制年夜饭,确实挺有新意。年关将至,也有不少朋友在...
    路道文阅读 350评论 0 1
  • classUserViewController:UIViewController,UITableViewDeleg...
    刘波_ecae阅读 766评论 0 0
  • 近日,坐标位于安顺的我在塔山公园的路边坐着等朋友,那儿很是热闹,有许多可爱的爷爷奶奶在那儿唱歌跳舞,围着观看的...
    Sunny的心情阅读 333评论 0 1