Node.js 是否存在阻止TCP在NodeJ上合并数据包的方法?
我正在做一个学校的项目来实现一些算法,在这个算法中,我可以根据数据包丢失的情况,通过增加或减少数据包,动态地改变我从客户端发送到服务器的数据包的速率 问题是它每次只发送4个数据包,然后开始合并数据包并一起发送,所以我无法确定是否有数据包丢失 我是否可以阻止TCP进行这种行为 客户端代码: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()
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。因为操作系统堆栈中的拥塞控制实现保持其自己的发送和接收窗口,并在需要时调整传输速率。它将干扰您从应用程序控制它的意图
根据您提供的示例代码,您似乎需要保留消息边界的功能。您可以使用普通的oldUDP
来实现这一点。还有其他协议,如SCTP
,DCCP
,但它们提供拥塞控制。也可以使用应用层协议,如HTTP
或实现序列化机制(即protobuf
),但它仍将通过TCP连接进行操作
我建议您使用
UDP
。这不是可靠的,只是尽力而为的交付。然而,您可以实现您自己的可靠性机制,您可以连接到顶部的传输控制机制。要获得灵感,请阅读TCP
、DCCP
和SCTP
是如何运行的。TCP连接通常被视为来自服务器和客户端的流(在另一个流下它使用IP数据包)。为了分离更高级别/应用程序级别的数据包,您可以使用指示每个数据包的长度的报头,或者使用某种分隔符。您可能会从中得到启发,这似乎有点像是一个挑战。使用TCP,您无法直接控制您发送的数据如何分组成数据包,或者确切地说是如何传递的。如果您需要将其划分为这样的单元,那么您必须在应用程序级别对数据进行某种划分,以便在交付时进行排序,或者在TCP之上使用协议(如webSocket或socket.io)为您执行此操作。仅供参考,用于发送数据,TCP有一个内置的延迟过程,当您发送一小段数据时,它会等待很短的时间,以查看是否有更多的数据到来,以便TDP可以将这些数据合并到一个公共数据包中。您可以在nodejs中使用.禁用该功能,但是,即使使用setNoDelay()
,也不能指望数据包以与发送数据包完全相同的方式到达。那是TCP。TCP被允许将小块数据合并成一个更大的数据包(这通常会提高效率)。