作家
登录

WebSocket实现原理

作者: 来源: 2017-07-11 16:29:23 阅读 我要评论

之前我们将 CocoaAsyncSocket 作为底层实现,在其膳绫擎封装了一套 Socket 通信机制以及营业接口,比来我们开端研究 WebSocket ,并用来调换掉落本来的 CocoaAsyncSocket ,简单来说一下两者的关系,WebSocket 和 Socket 固然名称上很像,但两者是完全不合的器械, WebSocket 是建立在 TCP/IP 协定之上,属于应用层的协定,而 Socket 是在应用层和传输层中的一个抽象层,它是将 TCP/IP 层的复杂操作抽象成就个简单的接口来供给给应用层调用。为什么要做此次调换呢?原因是我们办事端在做改革,同时网页版 IM 已经应用了 WebSocket ,客户端也采取的话对于办事妒攀来说保护一套代码会更好更便利,并且 WebSocket 在体积、及时性和扩大上都具有必定的优势。

WebSocket 最新的协定是 13 RFC 6455 ,要懂得 WebSocket 的实现,必定要去懂得它的协定!~

媒介

WebSocket 的实现分为握手,数据发送/攫取,封闭连接。

这里起首放上一张我们组 @省长 (推荐大年夜家去读一读省长的博客,干货很多👍)整顿出来的流程图,便利大年夜家去懂得:

https://www.zhihu.com/question/20122137/answer/14049112#

握手

握手要大年夜请求头去懂得。

WebSocket 起首提议一个 HTTP 请求,在请求头加上 Upgrade 字段,该字段用于改变 HTTP 协定版本或者是换用其他协定,这里我们把 Upgrade 的值设为 websocket ,将它进级为 WebSocket 协定。

同时要留意 Sec-WebSocket-Key 字段,它由客户端生成并发给办事端,用于证实办事端接收到的是一个可受信的连接握手,可以赞助办事端清除自身接收到的由非 WebSocket 客户端提议的连接,该值是一串随机经由 base64 编码的字符串。

  1. GET /chat HTTP/1.1 
  2.  
  3. Host: server.example.com 
  4.  
  5. Upgrade: websocket 
  6.  
  7. Connection: Upgrade 
  8.  
  9. Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== 
  10.  
  11. Origin: http://example.com 
  12.  
  13. Sec-WebSocket-Protocol: chat, superchat 
  14.  
  15. Sec-WebSocket-Version: 13  

数据解析:

我们可以简化请求头,将请求以字符串方法发送出去,当然别忘了最后的两个空行作为包停止:

  1. const char * fmt = "GET %s HTTP/1.1\r\n" 
  2.  
  3. "Upgrade: websocket\r\n" 
  4.  
  5. "Connection: Upgrade\r\n" 
  6.  
  7. "Host: %s\r\n" 
  8.  
  9. "Sec-WebSocket-Key: %s\r\n" 
  10.  
  11. "Sec-WebSocket-Version: 13\r\n" 
  12.  
  13. "\r\n"
  14.  
  15. size = strlen(fmt) + strlen(path) + strlen(host) + strlen(ws->key); 
  16.  
  17. buf = (char *)malloc(size); 
  18.  
  19. sprintf(buf, fmt, path, host, ws->key); 
  20.  
  21. size = strlen(buf); 
  22.  
  23. nbytes = ws->io_send(ws, ws->context, buf, size);  

背景

收到请求后,办事端也会做一次响应:

  1. HTTP/1.1 101 Switching Protocols 
     1/9    1 2 3 4 5 6 下一页 尾页

      推荐阅读

      Linux_基于Docker搭建Redis集群

    应用redis-6379为主机,其余两台为大年夜机应用 docker exec -ti 容器ID /bin/bash 分别进入三个Redis容器进入容器后,应用 redis-cli 敕令,连接redis办事端连接办过后,应用 info replication 查看当前机械的角色未>>>详细阅读


    本文标题:WebSocket实现原理

    地址:http://www.17bianji.com/lsqh/36156.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)