Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 是否存在阻止TCP在NodeJ上合并数据包的方法?_Node.js_Sockets_Tcp - Fatal编程技术网

Node.js 是否存在阻止TCP在NodeJ上合并数据包的方法?

Node.js 是否存在阻止TCP在NodeJ上合并数据包的方法?,node.js,sockets,tcp,Node.js,Sockets,Tcp,我正在做一个学校的项目来实现一些算法,在这个算法中,我可以根据数据包丢失的情况,通过增加或减少数据包,动态地改变我从客户端发送到服务器的数据包的速率 问题是它每次只发送4个数据包,然后开始合并数据包并一起发送,所以我无法确定是否有数据包丢失 我是否可以阻止TCP进行这种行为 客户端代码: const net = require('net') const PORT = 8550 const HOST = '127.0.0.1' const client = new net.Socket()

我正在做一个学校的项目来实现一些算法,在这个算法中,我可以根据数据包丢失的情况,通过增加或减少数据包,动态地改变我从客户端发送到服务器的数据包的速率

问题是它每次只发送4个数据包,然后开始合并数据包并一起发送,所以我无法确定是否有数据包丢失

我是否可以阻止TCP进行这种行为

客户端代码:

const net = require('net')

const PORT = 8550
const HOST = '127.0.0.1'

const client = new net.Socket()

client.setTimeout(1000)

let windowSize = 1
let sentPackets = 0

client.on('error', () => {
  console.log('Finishing connection...')
  process.exit()
})

client.connect(PORT, HOST, () =>
  console.log('Connected to ' + HOST + ':' + PORT)
)

client.on('connect', () => {
  sendPackets()
})

client.on('data', data => {
  sentPackets++

  if (sentPackets >= windowSize) {
    windowSize *= 2
    sentPackets = 0
    sendPackets()
  }
})

const sendPackets = () => {
  for (let i = 0; i < windowSize; i++) {
    const message = (i + 1).toString()

    client.write(message, err => {
      if (err) console.log(err)
    })
  }
}

client.on('timeout', () => {
  windowSize /= 2
  sentPackets = 0
  sendPackets()
})
const net = require('net')

const PORT = 8550
const HOST = '127.0.0.1'

const server = net.createServer()

server.on('error', err => console.log(error.toString()))

server.listen(PORT, HOST, () =>
  console.log('Servidor listening to ' + HOST + ':' + PORT)
)

server.on('connection', socket => {
  socket.on('data', data => {
    console.log('Received: ' + data.toString())

    socket.write(data)
  })

  socket.on('error', err => {
    console.log(err.toString())
  })
})
我知道它会收集数据包,因为当服务器出现以下输出时:

收到:1
收到:1
收到:2
收到:1
收到:234

然后它遵循相同的顺序。

先生

TCP
是面向流的协议。这意味着它正在发送和接收字节流。未保留写入的有效载荷的边界。更重要的是,TCP的栈中已经内置了拥塞控制

对于您的项目来说,这不是一个好的传输协议选择,除非您正在实现自己版本的
TCP/IP
stack。因为操作系统堆栈中的拥塞控制实现保持其自己的发送和接收窗口,并在需要时调整传输速率。它将干扰您从应用程序控制它的意图

根据您提供的示例代码,您似乎需要保留消息边界的功能。您可以使用普通的old
UDP
来实现这一点。还有其他协议,如
SCTP
DCCP
,但它们提供拥塞控制。也可以使用应用层协议,如
HTTP
或实现序列化机制(即
protobuf
),但它仍将通过TCP连接进行操作


我建议您使用
UDP
。这不是可靠的,只是尽力而为的交付。然而,您可以实现您自己的可靠性机制,您可以连接到顶部的传输控制机制。要获得灵感,请阅读
TCP
DCCP
SCTP
是如何运行的。

TCP连接通常被视为来自服务器和客户端的流(在另一个流下它使用IP数据包)。为了分离更高级别/应用程序级别的数据包,您可以使用指示每个数据包的长度的报头,或者使用某种分隔符。您可能会从中得到启发,这似乎有点像是一个挑战。使用TCP,您无法直接控制您发送的数据如何分组成数据包,或者确切地说是如何传递的。如果您需要将其划分为这样的单元,那么您必须在应用程序级别对数据进行某种划分,以便在交付时进行排序,或者在TCP之上使用协议(如webSocket或socket.io)为您执行此操作。仅供参考,用于发送数据,TCP有一个内置的延迟过程,当您发送一小段数据时,它会等待很短的时间,以查看是否有更多的数据到来,以便TDP可以将这些数据合并到一个公共数据包中。您可以在nodejs中使用.禁用该功能,但是,即使使用
setNoDelay()
,也不能指望数据包以与发送数据包完全相同的方式到达。那是TCP。TCP被允许将小块数据合并成一个更大的数据包(这通常会提高效率)。