为什么一些TCP套接字在Node.js需要更多的时间来连接比大多数其他人?



我创建了一个小库tcp-exists来检查tcp端点是否存在。只需要在网络中迭代以查找特殊端口上的任何内容。

github上的lib代码

但是当我迭代时-一些tcp套接字(由libtcp-exists创建)需要大量的时间(1-3s而不是5-20ms)在100%现有的端点上建立连接。

import tcpExists from 'tcp-exists'
async function main () {
for (let i = 1; i < 250; ++i) {
let time = performance.now()
const exists = await tcpExists('192.168.1.87', 80, 2000)
time = performance.now() - time
console.log(`time [${i}]:`, time)
if (time > 500) console.log('=====STRANGE=====')
if (!exists) console.log('exists')
}
}
main()

检查同一IP上的相同端口或不同端口,或检查不同IP之间没有区别。其中一些连接将花费x100多倍的时间来建立连接。这可能导致存在一个端点,但函数将返回false,因为一个小超时的情况。

我不能为一次检查设置大于25ms的超时。因为如果我想要扫描从192.168.0.0到192.168.255.255(65536个端点)-其中大多数IP没有端点,应该通过超时返回false-并使用例如1s作为超时-那么它将需要65536秒或~18小时…

TCP握手意味着客户端向服务器发送SYN,服务器对客户端SYN进行ACK,并发送自己的SYN回送(通常在单个数据包中,即SYN+ACK),然后客户端用自己的ACK响应服务器的SYN。因此,握手的速度取决于客户端和服务器之间的网络延迟以及服务器对连接请求(SYN)的反应速度。任何在途中丢失的数据包都需要在超时后重新传输,这进一步增加了TCP握手的时间。

所有这些都是客户端无法控制的,即没有办法加速它。因此,高性能扫描器不会一个接一个地尝试连接,而是并行地尝试多个连接。

最新更新