Производительность сети I2P: скорость, соединения и управление ресурсами
Сеть I2P полностью динамична. Каждый клиент известен другим узлам и тестирует локально известные узлы на достижимость и производительность. Только достижимые и производительные узлы сохраняются в локальную NetDB. Во время процесса построения туннелей из этого пула выбираются лучшие ресурсы для создания туннелей. Поскольку тестирование происходит непрерывно, пул узлов изменяется. Каждый узел I2P знает разную часть NetDB, что означает, что каждый router имеет различный набор узлов I2P для использования в туннелях. Даже если два router’а имеют одинаковое подмножество известных узлов, тесты на достижимость и производительность, вероятно, покажут разные результаты, поскольку другие router’ы могут быть под нагрузкой именно в момент тестирования одним router’ом, но быть свободными, когда тестирует второй router.
Это объясняет, почему каждый I2P узел использует разные узлы для построения tunnel’ов. Поскольку каждый I2P узел имеет разную задержку и пропускную способность, tunnel’ы (которые строятся через эти узлы) имеют разные значения задержки и пропускной способности. И поскольку каждый I2P узел строит разные tunnel’ы, ни у каких двух I2P узлов нет одинаковых наборов tunnel’ов.
Сервер/клиент называется “destination”, и каждый destination имеет как минимум один входящий и один исходящий tunnel. По умолчанию в каждом tunnel используется 3 hop’а. В итоге для полного цикла клиент-сервер-клиент используется 12 hop’ов (то есть 12 различных I2P узлов).
Каждый пакет данных проходит через 6 других I2P узлов, прежде чем достичь сервера:
client - hop1 - hop2 - hop3 - hopa1 - hopa2 - hopa3 - server
и на обратном пути 6 различных I2P узлов:
server - hopb1 - hopb2 - hopb3 - hopc1 - hopc2 - hopc3 - client
Трафик в сети требует ACK перед отправкой новых данных, необходимо ждать возвращения ACK от сервера: отправить данные, ждать ACK, отправить больше данных, ждать ACK. Поскольку RTT (время прохождения сигнала в оба конца) складывается из задержки каждого отдельного I2P узла и каждого соединения в этом маршруте туда и обратно, обычно требуется 1-3 секунды, пока ACK вернется к клиенту. Из-за особенностей TCP и транспортного протокола I2P пакет данных имеет ограниченный размер. Вместе эти условия устанавливают максимальную пропускную способность на tunnel в 20-50 кбайт/сек. Однако, если ТОЛЬКО ОДИН узел в tunnel имеет лишь 5 кб/сек пропускной способности, весь tunnel ограничивается 5 кб/сек, независимо от задержки и других ограничений.
Шифрование, задержка и процесс построения tunnel делают его довольно затратным по времени CPU для создания tunnel. Вот почему destination может иметь максимум 6 входящих и 6 исходящих tunnel для передачи данных. При максимальной скорости 50 кб/сек на tunnel, destination может использовать примерно 300 кб/сек общего трафика (на самом деле может быть больше, если используются более короткие tunnel с низкой анонимностью или без неё). Используемые tunnel отбрасываются каждые 10 минут и строятся новые. Эта смена tunnel, а иногда клиенты, которые отключаются или теряют соединение с сетью, иногда могут нарушить tunnel и соединения. Пример этого можно увидеть в IRC2P Network при потере соединения (ping timeout) или при использовании eepget.
При ограниченном наборе назначений и ограниченном количестве tunnel’ов на назначение, один I2P узел использует только ограниченный набор tunnel’ов через другие I2P узлы. Например, если I2P узел является “hop1” в небольшом примере выше, мы видим только 1 участвующий tunnel, исходящий от клиента. Если мы суммируем всю I2P сеть, может быть построено только довольно ограниченное количество участвующих tunnel’ов с ограниченной пропускной способностью в целом. Если распределить эти ограниченные числа по количеству I2P узлов, для использования доступна только часть доступной пропускной способности/ёмкости.
Для сохранения анонимности один router не должен использоваться всей сетью для построения туннелей. Если один router действует как туннельный router для ВСЕХ узлов I2P, он становится реальной единой точкой отказа, а также центральной точкой для сбора IP-адресов и данных клиентов. Именно поэтому сеть распределяет трафик между узлами в процессе построения туннелей.
Еще одним соображением для производительности является способ обработки mesh-сетей в I2P. Каждый переход hop-hop использует одно TCP или UDP соединение на узлах I2P. При 1000 соединений видно 1000 TCP соединений. Это довольно много, и некоторые домашние и офисные router’ы малого размера позволяют только небольшое количество соединений. I2P пытается ограничить эти соединения до менее чем 1500 на каждый тип UDP и TCP. Это также ограничивает объем трафика, маршрутизируемого через узел I2P.
Если узел доступен и имеет настройку пропускной способности >128 кбайт/сек для совместного использования и доступен 24/7, он должен использоваться через некоторое время для участия в трафике. Если он отключается в промежутке, тестирование I2P узла, выполняемое другими узлами, сообщит им, что он недоступен. Это блокирует узел как минимум на 24 часа на других узлах. Таким образом, другие узлы, которые протестировали этот узел как недоступный, не будут использовать его в течение 24 часов для построения tunnel’ов. Вот почему ваш трафик снижается после перезапуска/отключения вашего I2P router’а минимум на 24 часа.
Кроме того, другим узлам I2P необходимо знать I2P router для проверки его доступности и пропускной способности. Этот процесс можно ускорить, взаимодействуя с сетью, например, используя приложения или посещая I2P сайты, что приведет к большему количеству tunnel строительства и, следовательно, к большей активности и доступности для тестирования узлами сети.
Улучшения производительности
Для возможных будущих улучшений производительности см. Будущие улучшения производительности .
Для просмотра улучшений производительности в прошлом см. Историю производительности .