Node net.Socket.on("data") 事件是不是有保证的顺序?

Posted

技术标签:

【中文标题】Node net.Socket.on("data") 事件是不是有保证的顺序?【英文标题】:Do Node net.Socket.on("data") events have a guaranteed order?Node net.Socket.on("data") 事件是否有保证的顺序? 【发布时间】:2019-08-25 17:54:32 【问题描述】:

我正在使用net.connect(host, port) 在 Node.js 中创建一个套接字,向其中写入一些数据,然后在套接字上监听结果。

TCP 协议内置了排序信息;数据包可以乱序发送或到达,然后由客户端使用数据包元数据中内置的信息重新排列。

Node.js 会触发一系列.on("data") 事件,让您知道套接字上已接收到数据。这些事件按某种顺序触发 - 只有一个执行线程,因此它们不能同时处理。

触发数据事件的顺序是否保证为 TCP 数据包顺序?对于在套接字上接收到的数据,.on("data") 事件是否有可能无序触发?

【问题讨论】:

【参考方案1】:

TCP 数据由操作系统按顺序或根本不按顺序传送到 TCP 套接字。 AFAIK NodeJS 基本上在打开的套接字上执行epoll()(通过 libuv)并在数据到达时读取数据。然后它将一个data 事件排队,并按顺序传递给我们的事件处理程序。

所以我不认为有可能形成data 事件让套接字被乱序处理。如果可能的话,在 NodeJS 中可靠地处理 TCP 流量将非常困难。

【讨论】:

如果服务器发送 5k 数据并且 TCP 决定拆分该缓冲区并且只向客户端发送部分缓冲区,例如1k,net 是否会保留 1k 的数据直到挖掘块到达,然后仅在完整的 5k 缓冲区到达时才呈现单个“on data”事件?或者会为每个块触发多个“on data”事件。在这种情况下,客户端如何在不知道预期的原始大小的情况下知道所有块何时到达? TCP 是基于流的协议,没有离散消息的概念。如果您需要通过 TCP 连接发送离散消息,则必须在应用程序协议中实现某种“框架”来分隔消息。例如,您可以通过为每条消息添加长度或添加分隔符来执行此操作。应用程序消息可以拆分为多个data 事件并且单个data 事件中可以有多个消息。

以上是关于Node net.Socket.on("data") 事件是不是有保证的顺序?的主要内容,如果未能解决你的问题,请参考以下文章

Node升级——Node Binary管理模块"n"

/// <reference types="node" /> 是啥意思?

错误 TS2305:模块 '"react"' 没有导出的成员 'Node'

process.env.NODE_ENV === "开发" 即使在生产中

[Node.js] Use "prestart" in scripts

SVN小乌龟忽略node_modules文件夹提交