websocket 对于 raw socket

这里 raw socket 指的就是 直接使用 posix socket api

为什么会有这个对比呢?
因为最近我在做 websocket 测试的时候 ( nodejs, c#, erlang), 发现 websocket 确实方便。

就拿 c# 举例子

  • 异步
    因为现成的库是基于事件机制的,我只要写callback就行。再也不用管要自己写异步处理,捕获异常,或者多线程。

  • 其他好处
    网上说的很多,因为websocket握手是一个 http 请求过程,所以http的基础设施都能拿来用。 session, auth, proxy, load blance...

  • 服务端的实现也很容易。
    总之就是要提高生产力

但是 担心 websocket 发送的数据包 体积过大,造成不必要的网络浪费,于是估算了一下 websocket 一个 frame 比 一个 raw tcp 包到底多 多少 字节。

websocket 包格式

websocket 有自己定义的 frame 格式 https://tools.ietf.org/html/rfc6455

frame.jpg

每一个 frame 包含 头部 2Bytes 的固定长度,后面根据发送的数据长度可能会包含 0/2/8 Bytes 的长度

如果是客户端发给服务器的,那么还要包含 4Bytes 的Masking-key长度。

raw socket 包格式

+---------+--------------+
| Header  |    Body      |
+---------+--------------+

Header 表示 Body 长度, 一般 都是 2 Bytes, 或者 4 Bytes .
下面用 4 Bytes 做对比。

包体额外长度对比

根据要发送数据的长度,将对比分为以下情况:

  • A: 数据长度<= 125
  • B: 数据长度<= 2^16
  • C: 数据长度 <= 2^32
  • D: 数据长度 <= 2^64

A: 数据长度<= 125

  • 客户端
    • websocket: 2 + 4
    • raw socket: 4
  • 服务端
    • websocket: 2
    • raw socket: 4

B: 数据长度<= 2^16

  • 客户端
    • websocket: 2 + 2 + 4
    • raw socket: 4
  • 服务端
    • websocket: 2 + 2
    • raw socket: 4

C: 数据长度 <= 2^32

  • 客户端
    • websocket: 2 + 8 + 4
    • raw socket: 4
  • 服务端
    • websocket: 2 + 8
    • raw socket: 4

D: 数据长度 <= 2^64

  • 客户端
    • websocket: 2 + 8 + 4
    • raw socket: 8
  • 服务端
    • websocket: 2 + 8
    • raw socket: 8

websocket比raw socket多出字节数

+---------------------------------------------------+
|  数据长度   |   125   |   2^16  |  2^32  |  2^64   |
+------------+---------+---------+--------+---------+
| 客户端多出  |    2    |    4    |   10   |    6    |
+------------+---------+---------+--------+---------+
| 服务端多出  |   -2     |    0    |   6     |    2    |
+------------+---------+---------+--------+---------+
  • 对于实际情况,大部分情况下, 客户端发送的数据长度都在 2^16一下,
    此时websocket包比raw socket额外多出2/4个字节

  • 同样对于服务器,大部分长度都在 125 到 2^32 之间
    此时 websocket包比 raw socket 额外多出 0/6个字节

结论

  • 包体长度 websocket 对于 raw socket 还是稍微有点 overhead。

  • 服务器接受到的数据得解码一次。也是稍微对CPU有点 overhead

但是在快速容易开发的角度看,还是可以接受的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,282评论 19 139
  • 前言 关于我和WebSocket的缘:我从大二在计算机网络课上听老师讲过之后,第一次使用就到了毕业之后的第一份工作...
    一缕殇流化隐半边冰霜阅读 59,164评论 157 1,065
  • 如果明天我将死去 我要静静地 一个人 坦然离去 终于 我可以没有任何心里负担心安理得的好好放松一天 没有工作 没有...
    陌生人的独白阅读 2,166评论 0 0
  • 很多人说:熬过现在的痛苦,前途就是快乐。 所有的积极向上不过只是自欺欺人。 人生就像投硬币,无论你抱着怎样的心情去...
    我的黑天使阅读 1,324评论 0 1
  • 如果没有因为同学给了我一张去看篮球赛的门票,如果那天没有室友一起去,如果那天同学不用去做兼职,如果那天我没有坐在你...
    美_b96a阅读 1,670评论 0 0

友情链接更多精彩内容