Как надежно воспроизвести время ожидания curl_multi при тестировании публичных прокси - PullRequest
0 голосов
/ 22 февраля 2019

Соответствующая информация: выпуск 3602 на GitHub

Я работаю над проектом, который собирает и тестирует публичные / бесплатные прокси, и заметил, что когда я использую интерфейс curl_multi для тестирования этихпрокси, иногда я получаю много 28(timeout) ошибок.Этого никогда не произойдет, если я протестирую каждый прокси отдельно.

Проблема в том, что эта проблема ненадежно воспроизводима, и она не всегда обнаруживается, это может быть что-то в завитке иличто-то еще .

К сожалению, я не такой отладчик глубоких сетей, и я не знаю, как отладить эту проблему на более глубоком уровне, однако я написал 2 программы для тестирования C (одна из нихизначально написано Даниэлем Стенбергом , но я изменил его вывод в тот же формат, что и другая программа на Си).Эти 2 C-программы тестируют 407 общедоступных прокси-серверов, используя curl

  1. с интерфейсом curl_multi (в котором есть проблема)

  2. с curl во многих потоках, каждыйзавиток действует на поток.(без проблем)

Это программы на 2 C, которые я написал для тестирования Я не разработчик C, поэтому, пожалуйста, дайте мне знать, если вы что-то не такобратите внимание на 2 программы.

Это оригинальный класс PHP , который я использовал для воспроизведения проблемы месяц назад.

И это 2 Cрезультаты тестов программ .Вы можете заметить, что тесты выполнены с тайм-аутом curl_multi, в то время как тайм-ауты, сделанные curl-threadами, стабильны (около 50 из 407 прокси работают).

Это пример из результатов теста. Обратите внимание на столбцы 4 и 5 , чтобы увидеть, как потоки завитков прерывают ~ 170 раз и успешно соединяются ~ 40 раз.Из них curl_multi делает 0 успешных соединений и тайм-аутов ~ 300 раз из 407 прокси.

column(1) : #
column(2) : time(UTC)
column(3) : total execution time (seconds)
column(4) : no error 0 (how many requests result in no error CURLE_OK)
column(5) : error 28 (how many requests result in error 28 CURLE_OPERATION_TIMEDOUT)
column(6) : error 7 (how many requests result in error 7 CURLE_COULDNT_CONNECT)
column(7) : error 35 (how many requests result in error 35 CURLE_SSL_CONNECT_ERROR)
column(8) : error 56 (how many requests result in error 56 CURLE_RECV_ERROR)
column(9) : other errors (how many requests result in errors other than the above)
column(10) : program that used the curl
column(11) : cURL version

c(1)    c(2)           c(3)c(4)c(5)c(6)c(7)c(8)c(9) c(10)                  c(11)
267 2019-3-28 01:58:01  40  43  176 183 1   4   0   C (curl - threads) (Linux Fedora)   7.59.0
268 2019-3-28 01:59:01  30  0   286 110 1   10  0   C (curl-multi one thread) (Linux Fedora)    7.59.0
269 2019-3-28 02:00:01  30  46  169 181 1   8   2   C (curl - threads) (Linux Fedora)   7.59.0
270 2019-3-28 02:01:01  31  0   331 74  1   1   0   C (curl-multi one thread) (Linux Fedora)    7.59.0
271 2019-3-28 02:02:01  30  42  173 186 1   4   1   C (curl - threads) (Linux Fedora)   7.59.0
272 2019-3-28 02:03:01  30  0   277 116 1   13  0   C (curl-multi one thread) (Linux Fedora)    7.59.0

Почему curl_multi тайм-аут несовместим с большинством соединений, в то время как curl-threads никогда этого не делает?

Я скачал Wireshark и использовал его для захвата трафика во время работы каждой из программ 2C, я также отфильтровал трафик в списке прокси, используемых программами 2C, и сохранил файлы на GitHub.

программа curl-threads (ожидаемое поведение)

63 успешных соединения и 158 тайм-аутов соединения из 407 прокси.

программа curl_multi ( un ожидаемое поведение)

0 успешных соединений и время ожидания 272 соединений из 407 прокси.

Вы можете открыть файлы .pcapng с помощью Wireshark и просмотреть записанный трафик на моем компьютере, одновременно ожидая / ожидая непредвиденного поведения.Я отфильтровал трафик к 407 прокси-IP-адресам и оставил Wireshark открытым некоторое время после 30 секунд ограничения скручивания, потому что я заметил, что некоторые пакеты все еще отображаются.Я не знаю Wireshark и этот уровень сетевого взаимодействия, но я подумал, что это может быть полезно.


Примечание по пропускной способности:

Откройте .pcapng файл программы curl_threads (нормальное поведение) в wireshark и перейдите в раздел Статистика> Беседы.вы увидите следующее окно

enter image description here

Я скопировал данные и сохранил их здесь на GitHuB, теперь вычислите Sum байтов, отправленных из A-> B и B-> A.

ВЕСЬ полоса пропускания, необходимая для нормальной работы, составляет около 692,8 КБ.

Ответы [ 2 ]

0 голосов
/ 31 марта 2019

Попробуйте , а не , имея 400 открытых соединений в одном потоке.Или даже процесс, в этом отношении.Возможно, вы перегружаете прокси-серверы, поэтому они могут занести вас в черный список (безопасность отказа в обслуживании).Или ваша исходящая сеть может ограничивать количество открытых соединений.

0 голосов
/ 30 марта 2019

Мне кажется, что у вас нет проблем с самим curl, но вы делаете слишком много соединений одновременно с прокси-серверами, если в соединениях отказано.Вы можете быть внесены в черный список навсегда или на определенный период.

Проверьте это, запустив свой локатор с текущего IP-адреса, и выполните статистику: сколько соединений было установлено, сколько отказано, сколько истекло время ожидания.Сделайте это несколько раз и наберите в среднем.Затем измените сервер на другой, который имеет другой IP-адрес, и проверьте, какая у вас там статистика.При первом запуске у вас должна быть намного лучшая статистика, которая, вероятно, если вы повторите тест на новом IP, станет только хуже.Хорошей идеей может быть не использовать весь пул прокси-серверов для подключения к статистике, а выбрать из них срез, проверить фактический IP-адрес и повторить эту проверку нового IP-адреса, поэтому, если причина в том, что вы злоупотребляете сервисом, вы не попадете в черный списоквсе прокси, но все еще будут иметь следующую группу «нетронутых» прокси, чтобы проверить их на новом IP, если это действительно так.Помните, что даже если IP-адреса прокси находятся в разных местах, они могут принадлежать одному и тому же поставщику услуг.Вероятно, у него есть один список злоупотреблений для всех их прокси-серверов, поэтому, если вас плохо видят количество запросов, которые вы делаете в одной стране, вас могут заблокировать и в другой стране, даже до того, как вы подключитесь к прокси-серверу другой страны.

Если вы все еще хотите проверить, не скручивается ли это, вы можете настроить тестовую среду с несколькими подачами.Эту среду тестирования вы можете передать сопровождающему curl, чтобы он мог воспроизвести ошибку.Вы можете использовать docker и создавать 10, 20 или 100 прокси-серверов и подключаться к ним, чтобы узнать, есть ли у curl проблема.

вам понадобится docker , его можно установить на Win /Mac / Linux
один из образа прокси для создания прокси
создание сети учебное пособие для контейнеров (мост должен быть в порядке)
подключение контейнеров к сети - сеть
хорошо установить для каждого прокси-контейнера их - ip
сделать для каждого прокси-контейнера возможным чтение конфигурации и запись журнала ошибок (так что вы можете прочитать, почему ониотключить, если это произойдет) с помощью mountig журнала ошибок / файлов конфигурации / direcotires с - томом
, и все прокси-контейнеры должны быть запущены

, вы можете подключиться к прокси, которыйработает внутри контейнера двумя способами.если вы хотите, чтобы curl находился за пределами этих контейнеров, вам необходимо открыть с помощью -p порты этих прокси-серверов из контейнера во внешний мир (curl в вашем случае).

или

вы можете использовать другой контейнерный образ с linux + curl.Например, Alpine linux + curl и подключите его к той же сети, что и с прокси.Если вы делаете это, вам не нужно публиковать (выставлять) порты прокси и не нужно думать о том, какое количество прокси-портов я должен предоставлять для этого конкретного прокси.

на каждом шаге, который вы можете выполнитькоманда

docker ps -a

, чтобы увидеть все контейнеры и их состояние.

, чтобы остановить и удалить все контейнеры (не изображения, из которых они приходят, а запущенные контейнеры), если у вас возникли ошибки сконтейнер, который вышел.

docker stop $(docker ps -aq) && docker rm $(docker ps -aq)

или чтобы остановить и удалить из списка определенный контейнер

docker stop <container-id>
docker rm <container-id>

, чтобы увидеть все контейнеры, которые подключены к мостовой сети (по умолчанию)

docker network inspect bridge

Если вы подтвердите, что действительно существует проблема с подключением к прокси, которые находятся на вашем локальном компьютере, то это то, что сопровождающий curl может воспроизвести.

просто поместите все команды, как указано выше, чтобы создать все прокси, соединяющие ихк сети и т. д. в файле, например, сценарий replicate.sh, начинающийся с

#!/bin/sh

and your comands here

, сохраните этот файл и выполните команду

chmod +x ./replicate.sh

для mСделайте его исполняемым.

Вы можете запустить его, чтобы дважды проверить, все ли работает должным образом

./replicate.sh

и отправить сопровождающего curl в среду репликации, в которой возникла проблема.

Если вы не хотите запускать прокси для запуска множества команд, таких как doker run, вы можете использовать docker compose , что позволяет вам определять всю среду тестирования в одном файле.

Если вы запускаете много контейнеров, вы можете ограничить ресурсы, например память , каждый из которых потребляет, может помочь вам в случае такого количества прокси

...