低延迟 websocket html 5 游戏的数据包大小
Posted
技术标签:
【中文标题】低延迟 websocket html 5 游戏的数据包大小【英文标题】:Packet Size for low latency websocket html 5 games 【发布时间】:2012-09-26 04:09:18 【问题描述】:我正在制作一个 html 5 国际象棋游戏。我用一个长度(大小)为 64 的无符号 8 位二进制数组来表示棋盘。因为国际象棋棋盘上有 64 个位置。
var board = Uint8Array(64);
每个棋子在棋盘上通过(显然)8 位无符号整数表示。然后在客户端上,有一个将片段的二进制表示与文本字符串相关联的映射,例如:
var pieceMap = 01: 'BlackKnight', 112: 'WhitePawn', 6: 'BlackRook' ...
数据是通过 socket.io 连接发送的(假设我们使用的是 websockets),我认为是 TCP 吗?所以问题是: TCP 是否会发送与我提供给它的数据一样小的数据包(带有 TCP 开销)或者 TCP 是否具有最小数据包大小并将我的 200 字节数据包作为 1024 字节数据包发送?
为什么对尺寸如此着迷?我知道这没关系,但我将其用于学习体验,在未来的游戏中我将使用它来降低延迟......我知道国际象棋不需要低延迟。
【问题讨论】:
这可能有助于superuser.com/questions/243008/… 谢谢,这有助于表达我想要的东西。虽然不是一路。我假设这意味着(不考虑其他层)一个 100 字节 + 20 字节的标头 tcp 数据包将以总共 120 字节发送?并且没有添加额外的填充来构成最小 tcp packt 大小?? 【参考方案1】:按照 RFC 的指示,成帧的数据包:
https://www.rfc-editor.org/rfc/rfc6455#section-5
每个消息的开销最多为 10 个字节,或者每个消息片段更少。每个片段发送多少字节由有效载荷长度(帧的一部分)决定。不过,片段可能非常大。除非您发送非常大的消息,否则我认为这不是问题。
根据成帧和分段的工作方式,如果成帧 + 数据只有 100 字节左右,则不应发送/接收 1024 字节的数据。
我的猜测是,某些实现可能会有细微差别,但你不应该过多关注这样的细节,除非你开始看到我们的应用程序存在压力问题。
“过早的优化是万恶之源”Donald Knuth
另一个细节:如果您真的想实现非常低的延迟,您将不得不开始研究使用 UDP 或多播之类的东西。问题是:websockets 不支持这些。减少数据包大小对于网络来说并不是唯一重要的事情,而只是其中的一部分……根据我对 socket.io 的经验,CPU 成为带宽之前小消息的瓶颈,RAM 也可能会受到很大的打击在带宽之前以及当消息处于低千位时。当然,这完全取决于你的应用,我只是在谈论经验经验。
【讨论】:
很棒的答案。感谢您对 socket.io 系统资源的提醒,我会留意的。 我对 socket.io 的所有工作都是在四核处理器(有时是 AMD A6,在更好的情况下是核心 i7 或至强)上使用 4 个实例完成的,具有 768mb-4096mb 的 RAM 和 100mbps 的连接。我不知道您将运行什么硬件或您的应用程序可能具有什么处理流程。以上是关于低延迟 websocket html 5 游戏的数据包大小的主要内容,如果未能解决你的问题,请参考以下文章