【问题标题】: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") 事件是否有可能无序触发?

【问题讨论】:

    标签: node.js sockets networking tcp


    【解决方案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 事件中可以有多个消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    相关资源
    最近更新 更多