问题描述
我正在编程一个批量端口扫描器。当尝试由于线程数量而提高速度时,我预料到会遇到这样的事实:在某个时刻,延迟 (ping) 达到了 300-800 毫秒的极高值。当然,很可能这可能与我的电脑没有直接关系,而是会让我的路由器超载,但我想确定一下。这就是问题所在。我只是不知道如何评价这种超载。我之前问过类似的问题,但是通过比较每秒流量和接口吞吐量来估算的方法并没有显示拥塞(网络负载标记保持在5%左右)。我认为重点是 TCP 连接的批量创建/关闭不会占用大量流量,因为我没有发送任何内容,只是检查连接是否成功。有一个想法是使用每秒数据包进行评估,但我面临的事实是,我根本不知道如何找出接口在开始过载之前每秒可以通过多少个数据包,从而增加延迟。
我的应用程序如何工作的描述
为了简化答案的工作,有必要稍微介绍一下应用程序本身。它是用 Golang 编写的,正如已经提到的,该应用程序的目的是大规模扫描端口并将结果输入数据库(尚未完成)。它创建了许多 goroutine(根据经验,500 个扫描线程只会稍微增加延迟 20-30 毫秒,当 600 个线程将延迟增加到 300 毫秒)尝试创建 TCP 连接,如果成功,则认为端口打开。下面您可以看到代码,其中有两个函数ScannerThread
,scanHost
第一个是聚合器(获取 IP 地址,运行扫描函数,获取结果),第二个按顺序迭代端口以检查它们。
// ScannerThread является сканирующей горутиной, сюда попадают адреса после пингования
func ScannerThread(IPChannel chan string) {
defer WorkWG.Done()
for {
ip, ok := <-IPChannel
if ok {
ports := scanHost(ip)
if len(ports) != 0 {
for _, port := range ports {
println(ip, port)
}
}
} else {
break
}
}
}
// Функция сканирует порты конкретного адреса
func scanHost(ip string) []int {
openPorts := make([]int, 0)
for port := 1; port <= 1024; port++ {
d := net.Dialer{Timeout: time.Millisecond * 100}
conn, err := d.Dial("tcp", ip+":"+strconv.Itoa(port))
if err == nil {
conn.Close()
openPorts = append(openPorts, port)
}
}
return openPorts
}
我想收到什么
我需要一种方法来估计此类流量的网络接口拥塞情况。即使最终发现超载的不是我设备的网络接口,而是沿途的节点,我仍然想确保这不是我的设备的问题。然而,我仍然很乐意接受其他想法和解释,解释为什么这项任务的延迟会增加这么多。
请,如果您想提供某种可以测量某些参数的实用程序,请尝试还包括对该实用程序测量哪些参数的解释,因为我需要在我的程序中实现这一点,并且使用控制台输出解析是不礼貌的。
附加信息
- 我使用的是主板内置的 Realtek RTL8118AS 网卡,标称带宽为 1 Gbps。
- 在整个本地网络中,我使用 UTP cat 5e。
- 我使用 Linux,或者更确切地说是 Arch Linux。
- 我用不同的工具测试了处理器负载,负载平均增加了10-15%,即处理器没有过载。