Фон:
Я читал Black Hat Go, где автор представляет простой сканер портов, использующий подпрограммы go1:
package main
import (
"fmt"
"net"
)
func main() {
for i := 1; i <= 9000; i++ {
go func(j int) {
address := fmt.Sprintf("127.0.0.1:%d", j)
conn, err := net.Dial("tcp", address)
if err != nil {
return
}
conn.Close()
fmt.Printf("%d open\n", j)
}(i)
}
}
И далее он упоминает следующее:
Одновременное сканирование чрезмерного количества хостов или портов может привести к тому, что сетевые или системные ограничения исказят ваши результаты.
Чтобы проверить это, я запустил 2 php-сервера2 на портах. 8000 и 8500 и запустил приведенный выше код для сканирования моих локальных портов.
Каждый раз это давало мне противоречивые результаты. Иногда он обнаруживал оба открытых порта, иногда нет.
Вопрос:
Являются ли противоречивые результаты следствием некоторых ограничений TCP?
Есть ли способ рассчитать оптимальное количество портов, которые можно сканировать параллельно, чтобы результаты оставались правильными?
Изменить:
Кажется, я пропустил группы ожидания в приведенном выше коде.
Помимо этого, есть ли что-нибудь еще (ограничение ОС или ограничение протокола), которое препятствует одновременному сканированию портов в большом диапазоне?
err
и добавить несколько примеров вывода на свой вопрос? Одним из ограничений может быть количество дескрипторов открытых файлов, которые может иметь каждый процесс. - person Mark Plotnick   schedule 31.05.2020socket: too many open files
. Можете ли вы написать это как ответ, чтобы я мог принять его? - person athul.sure   schedule 31.05.2020