低延迟的WebSocket HTML 5游戏中的数据包大小

5

我正在制作一个HTML 5国际象棋游戏。将棋盘用一个无符号8位二进制数组表示,长度为64,因为国际象棋棋盘上有64个位置。

var board = Uint8Array(64);

在棋盘上,每个棋子都用一个(显然)8位无符号整数表示。在客户端上,有一个将棋子的二进制表示与文本字符串相关联的映射,例如:

var pieceMap = { 01: 'BlackKnight', 112: 'WhitePawn', 6: 'BlackRook' ... }

数据通过socket.io连接发送(假设我们使用的是websockets),TCP协议,对吧?因此问题是:TCP会按照我提供的数据大小(包括TCP开销)发送我的数据包,还是TCP有最小数据包大小,并将我的200字节数据包发送为1024字节数据包?
为什么如此关注大小?我知道这并不重要,但我会利用这个去学习经验,在未来的游戏中,我将使用它来降低延迟...我知道国际象棋不需要低延迟。

这可能会有所帮助:http://superuser.com/questions/243008/whats-the-minimum-size-of-a-tcp-packet - vinayr
谢谢,这在某种程度上解释了我想要的。虽然不是全部。我假设这意味着(忽略其他层),一个100字节的TCP数据包+20字节的头部将总共发送120字节?并且没有添加额外的填充来达到最小TCP数据包大小? - AndrewMcLagan
1个回答

5

根据RFC的规定,分组成帧:

https://www.rfc-editor.org/rfc/rfc6455#section-5

每个消息片段最多会增加10字节的开销。每个片段发送的字节数由有效载荷长度(成帧的一部分)决定。片段可以相当大,除非您发送非常大的消息,否则我认为这不是一个问题。

根据成帧和分片的工作方式,如果成帧+数据仅在100字节左右,则不应发送/接收1024字节的数据。

我猜有些实现可能会有细微的差异,但是除非你开始看到应用程序的压力问题,否则不要过于关注这样的细节。

"过早优化是万恶之源" Donald Knuth

另一个细节:如果您真的想追求极低的延迟,您将必须开始研究使用UDP或多播等技术。问题是:WebSocket不支持这些技术。减小数据包大小并不是网络通信中唯一重要的事情,而只是其中的一部分......从我的socket.io经验来看,当消息量很小时,CPU成为瓶颈,RAM也可能在带宽之前受到重创。当然,这完全取决于您的应用程序,我只是谈论经验。


非常棒的回答。感谢您提醒关于使用socket.io时的系统资源问题,我会注意的。 - AndrewMcLagan
我的所有与 socket.io 相关的工作都是使用四核处理器(有时使用 AMD A6 处理器,更好的情况下会使用 core i7 或 xeon 处理器),配备 768MB 到 4096MB 的内存和 100Mbps 的连接来完成的。我不知道您将运行什么硬件或应用程序的处理流程是什么。 - Mamsaac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接