Нажмите здесь, чтобы просмотреть английскую версию
Любой, кто пользовался домашним широкополосным доступом трех основных операторов и нуждается в домашнем широкополосном соединении, почти всегда сталкивается с ограничением скорости UDP. Чтобы избежать QoS трех основных операторов для UDP, я сделал еще один инструмент под названием UDP Hop. Принцип заключается в регулярном установлении новых соединений (изменении номеров портов и подключении к новым адресам).
Однако UDP Hop поддерживает только пересылку UDP-трафика. Чтобы иметь возможность использовать UDP для пересылки TCP-трафика, существует KCP Tube. Надежная повторная передача KCP используется для обеспечения того, чтобы пересылаемые TCP-пакеты не были потеряны.
Другая причина создания KCP Tube заключается в том, что другие инструменты пересылки KCP могут пересылать только TCP-трафик, но мне нужно использовать KCP для пересылки UDP-трафика. В основном для удобства игр.
Конечно, на самом деле udhop и kcptube были задуманы в одно и то же время. Поэтому ради удобства мы сначала настроили KCP Tube и настроили фреймворк, а потом врезали его в UDP Hop на основе KCP Tube. Затем выполните обратное слияние кода исправления UDP Hop обратно в KCP Tube.
Чтобы облегчить пользователям домашнего широкополосного доступа Full Cone NAT, KCP Tube может использовать STUN для сверления отверстий при работе в базовом режиме сервера и поддерживает как IPv4, так и IPv6.
Как и цель самого KCP, основная цель KCP Tube — уменьшить задержку, а не способствовать передаче чрезвычайно большого трафика. Так может ли он передавать чрезвычайно большой трафик? Да, но эффект может быть не таким хорошим, как у существующего инструмента пересылки TCP-KCP.
На данный момент поддерживаются 3 режима:
Обратите внимание , что время клиента и время сервера должны быть синхронизированы, а разница во времени не может превышать 255 секунд.
Пожалуйста, перейдите на вики-страницу или на страницу документации.
Если вам нужен генератор профилей, перейдите сюда: Генератор KCPTube.
kcptube config.conf
Пример режима клиента:
mode=client
kcp=regular3
inbound_bandwidth=500M
outbound_bandwidth=50M
listen_port=59000
destination_port=3000
destination_address=123.45.67.89
encryption_password=qwerty1234
encryption_algorithm=AES-GCM
Пример режима сервера:
mode=server
kcp=regular3
inbound_bandwidth=1G
outbound_bandwidth=1G
listen_port=3000
destination_port=59000
destination_address=::1
encryption_password=qwerty1234
encryption_algorithm=AES-GCM
stun_server=stun.qq.com
log_path=./
Примечание. При первом подключении сервер сообщит клиенту свой диапазон портов, поэтому listen_port
в режиме клиента не обязательно должен быть равен destination_port
в режиме сервера. Порты на обеих сторонах могут быть несовместимыми, но они могут быть несовместимыми. диапазон номеров портов, записанный клиентом, не может выходить за пределы сервера, чтобы клиент не выбрал неправильный порт и не смог подключиться.
Если вы хотите указать прослушивающую сетевую карту, то укажите IP-адрес сетевой карты и добавьте одну строку.
listen_on=192.168.1.1
Если вы хотите прослушивать несколько портов и несколько сетевых карт, разделите несколько файлов конфигурации.
kcptube config1.conf config2.conf
Если вы хотите проверить, работает ли соединение перед подключением, вы можете добавить опцию --try
kcptube --try config1.conf
или
kcptube config1.conf --try
Используйте опцию --check-config
, чтобы убедиться в правильности файла конфигурации:
kcptube --check-config config1.conf
или
kcptube config1.conf --check-config
Пример режима клиента:
mode=client
kcp=regular3
inbound_bandwidth=500M
outbound_bandwidth=50M
listen_port=6000
destination_port=3000-4000
destination_address=123.45.67.89
dport_refresh=600
encryption_password=qwerty1234
encryption_algorithm=AES-GCM
Пример режима сервера:
mode=server
kcp=regular3
inbound_bandwidth=1G
outbound_bandwidth=1G
listen_port=3000-4000
destination_port=6000
destination_address=::1
encryption_password=qwerty1234
encryption_algorithm=AES-GCM
Пример режима клиента:
mode=client
kcp=manual
kcp_mtu=1400
kcp_sndwnd=512
kcp_rcvwnd=2048
kcp_nodelay=1
kcp_interval=10
kcp_resend=2
kcp_nc=true
udp_timeout=300
listen_port=6000
destination_port=3000-4000
destination_address=123.45.67.89
dport_refresh=600
encryption_password=qwerty1234
encryption_algorithm=AES-GCM
Пример режима сервера:
mode=server
kcp=manual
kcp_mtu=1400
kcp_sndwnd=512
kcp_rcvwnd=2048
kcp_nodelay=1
kcp_interval=10
kcp_resend=2
kcp_nc=true
udp_timeout=300
listen_port=3000-4000
destination_port=6000
destination_address=::1
encryption_password=qwerty1234
encryption_algorithm=AES-GCM
имя | Устанавливаемое значение | Необходимый | Примечание |
---|---|---|---|
режим | клиент сервер реле | да | Узел ретрансляции клиент-сервер |
слушать_он | Доменное имя или IP-адрес | нет | Можно указать только доменное имя или IP-адрес. Пожалуйста, разделяйте несколько адресов запятыми |
прослушивающий_порт | 1-65535 | да | При работе в качестве сервера вы можете указать диапазон портов |
порт назначения | 1-65535 | да | Диапазоны портов можно указать при работе в качестве клиента. Пожалуйста, разделяйте несколько адресов запятыми |
адрес_назначения | IP-адрес, доменное имя | да | При заполнении IPv6-адреса квадратные скобки не требуются. |
dport_refresh | 0 - 32767 | нет | Агрегат «второй». Если оставить пустым, будет использовано значение по умолчанию — 60 секунд. От 1 до 20 рассчитывается как 20 секунд, а значение больше 32767 рассчитывается как 32767 секунд. Установите значение 0, чтобы отключить. |
алгоритм_шифрования | AES-GCM АЕС-OCB чача20 xchacha20 никто | нет | AES-256-GCM-AEAD AES-256-OCB-AEAD ЧаЧа20-Поли1305 XChaCha20-Poly1305 Нет шифрования |
шифрование_пароль | любой персонаж | Зависит от ситуации | Требуется, если установлен алгоритм шифрования и не равен нулю. |
udp_timeout | 0 - 65535 | нет | Агрегат «второй». Значение по умолчанию — 180 секунд. Если установлено значение 0, используется значение по умолчанию. Этот параметр представляет настройку времени ожидания между приложением UDP ↔ kcptube. |
держать_живым | 0 - 65535 | нет | Агрегат «второй». Значение по умолчанию — 0, что эквивалентно отключению Keep Alive. Эта опция относится к Keep Alive между двумя концами KCP. Можно включить в одностороннем порядке, чтобы определить, перестает ли канал отвечать. Если в течение 30 секунд не будет ответа, канал будет закрыт. |
mux_tunnels | 0 - 65535 | нет | Значение по умолчанию — 0, что эквивалентно неиспользованию каналов мультиплексирования. Этот параметр относится к количеству каналов мультиплексирования между двумя концами KCP. Этот параметр включен только на стороне клиента. |
stun_server | Адрес STUN-сервера | нет | Невозможно использовать, когда Listen_port находится в режиме диапазона портов. |
путь_журнала | Каталог для хранения журнала | нет | Невозможно указать на сам файл |
фек | uint8:uint8 | нет | Формат fec=D:R , например, можно заполнить fec=20:3 .Примечание. Максимальное общее значение D + R составляет 255 и не может превышать это число. Значение 0 по обе стороны от двоеточия указывает, что опция не используется. Настройки должны быть одинаковыми на обоих концах. Подробную информацию см. в руководстве по использованию FEC. |
мту | положительное целое число | нет | Текущее значение MTU сети, используемое для автоматического расчета kcp_mtu. |
kcp_mtu | положительное целое число | нет | Значение по умолчанию — 1440. Значение, установленное при вызове ikcp_setmtu(), представляет собой длину содержимого данных в пакете UDP. |
ККП | руководство быстро1-6 обычный1-5 | да | Вручную установите быструю нормальную скорость (Число в конце: чем меньше число, тем выше скорость) |
kcp_sndwnd | положительное целое число | нет | Значения по умолчанию показаны в таблице ниже и могут быть изменены индивидуально. |
kcp_rcvwnd | положительное целое число | нет | Значения по умолчанию показаны в таблице ниже и могут быть изменены индивидуально. |
kcp_nodelay | положительное целое число | Зависит от ситуации | Требуется, если kcp=manual, значение по умолчанию показано в таблице ниже. |
kcp_interval | положительное целое число | Зависит от ситуации | Требуется, если kcp=manual, значение по умолчанию показано в таблице ниже. |
kcp_resend | положительное целое число | Зависит от ситуации | Требуется, если kcp=manual, значение по умолчанию показано в таблице ниже. |
kcp_nc | да истинный 1 нет ЛОЖЬ 0 | Зависит от ситуации | Требуется, если kcp=manual, значение по умолчанию показано в таблице ниже. |
outbound_bandwidth | положительное целое число | нет | Исходящая полоса пропускания, используемая для динамического обновления значения kcp_sndwnd во время процесса связи. |
входящая_полоса пропускания | положительное целое число | нет | Входящая полоса пропускания, используемая для динамического обновления значения kcp_rcvwnd во время процесса связи. |
ipv4_only | да истинный 1 нет ЛОЖЬ 0 | нет | Если IPv6 отключен в системе, этот параметр должен быть включен и установлен на «да», «истина» или «1». |
ipv6_only | да истинный 1 нет ЛОЖЬ 0 | нет | Игнорировать адреса IPv4 |
взрыв | да истинный 1 нет ЛОЖЬ 0 | нет | Постарайтесь игнорировать настройки управления потоком KCP и пересылать пакеты как можно быстрее. Может вызвать чрезмерную нагрузку |
[слушатель] | Н/Д | да (только режим реле) | Метка режима ретрансляции, используемая для указания ККП в режиме прослушивания. Установка этой метки указывает на данные взаимодействия с клиентом. |
[экспедитор] | Н/Д | да (только режим реле) | Метка режима ретрансляции, используемая для указания ККП режима передачи. Установка этой метки указывает на данные взаимодействия с сервером. |
[custom_input] | Н/Д | нет | Ярлык режима пользовательского сопоставления. Информацию об использовании см. в разделе «Как использовать пользовательское сопоставление». |
[custom_input_tcp] | Н/Д | нет | Ярлык режима пользовательского сопоставления. Информацию об использовании см. в разделе «Как использовать пользовательское сопоставление». |
[custom_input_udp] | Н/Д | нет | Ярлык режима пользовательского сопоставления. Информацию об использовании см. в разделе «Как использовать пользовательское сопоставление». |
Среди них encryption_algorithm
и encryption_password
должны быть согласованы на обоих концах связи.
имя | Устанавливаемое значение | Необходимый | Примечание |
---|---|---|---|
фиб_ингресс | 0 - 65535 | нет | FIB, используемый входящим соединением |
fib_egress | 0 - 65535 | нет | FIB используется для исходящих соединений |
Доступные суффиксы: K/M/G.
Суффикс чувствителен к регистру, верхний регистр рассчитывается как двоичный (1024), а нижний регистр рассчитывается как десятичный (1000).
Введите 1000, указав, что пропускная способность составляет 1000 бит/с.
Заполните 100k, указав, что пропускная способность составляет 100 кбит/с (100000 бит/с).
Заполните 100K, указав, что пропускная способность составляет 100 Кбит/с (102400 бит/с).
Заполните 100M, указав, что пропускная способность составляет 100 Мбит/с (102400 Кбит/с).
Заполните 1G, указав, что пропускная способность составляет 1 Гбит/с (1024 Мбит/с).
Обратите внимание, что это бит в секунду (бит в секунду), а не бит в секунду (байт в секунду).
Следует напомнить, что заполненное значение пропускной способности не должно превышать фактическую пропускную способность во избежание перегрузки окна отправки.
ВАЖНОЕ ПРИМЕЧАНИЕ :
KCPTube рассчитает и установит размер окна отправки KCP примерно через 5 секунд после установления канала KCP на основе значения задержки пакета рукопожатия и значений outbound_bandwidth и inbound_bandwidth. В течение определенного периода времени после завершения настройки существует высокая вероятность того, что трафик будет существенно колебаться или даже трафик может внезапно упасть до 0, и на восстановление потребуется несколько секунд.
Быстрый режим | kcp_sndwnd | kcp_rcvwnd | kcp_nodelay | kcp_interval | kcp_resend | kcp_nc |
---|---|---|---|---|---|---|
быстро1 | 2048 | 2048 | 1 | 1 | 2 | 1 |
быстро2 | 2048 | 2048 | 2 | 1 | 2 | 1 |
быстро3 | 2048 | 2048 | 1 | 1 | 3 | 1 |
быстро4 | 2048 | 2048 | 2 | 1 | 3 | 1 |
быстро5 | 2048 | 2048 | 1 | 1 | 4 | 1 |
быстро6 | 2048 | 2048 | 2 | 1 | 4 | 1 |
Режим нормальной скорости | kcp_sndwnd | kcp_rcvwnd | kcp_nodelay | kcp_interval | kcp_resend | kcp_nc |
---|---|---|---|---|---|---|
обычный1 | 1024 | 1024 | 1 | 1 | 5 | 1 |
обычный2 | 1024 | 1024 | 2 | 1 | 5 | 1 |
обычный3 | 1024 | 1024 | 0 | 1 | 2 | 1 |
обычный4 | 1024 | 1024 | 0 | 15 | 2 | 1 |
обычный5 | 1024 | 1024 | 0 | 30 | 2 | 1 |
Среди них, чем выше уровень потери пакетов (более 10%), тем большее преимущество имеет kcp_nodelay=1 над kcp_nodelay=2. Когда скорость потери пакетов не особенно высока, kcp_nodelay=2 может сделать дрожание задержки более плавным.
Для сред с низкими потерями пакетов подходит для использования каждый режим. Единственная разница заключается в том, больше или меньше тратится трафика, а также разный верхний предел максимальной скорости. Среди них Regular3 тратит не так много трафика.
Рекомендуется одновременно включить настройку blast=1
.
В средах с высокими потерями пакетов рассмотрите возможность наложения параметра FEC. Подробную информацию см. в руководстве по использованию FEC.
Более подробную информацию смотрите в списке параметров.
После получения точного IP-адреса и порта в первый раз и после изменения четкого IP-адреса и порта в каталоге журнала будет создан файл ip_address.txt (перезаписан, если он существует), и IP-адрес в него будут записаны адрес и порт.
Полученный адрес сверления отверстия одновременно отобразится в консоли.
log_path=
должен указывать на каталог, а не на сам файл.
Если запись в файл журнала не требуется, удалите строку log_path
.
Распространенные STUN-серверы, найденные в NatTypeTeste:
STUN-сервер найден у Natter:
Другие STUN-серверы: public-stun-list.txt.
Для удобства использования предоставлены бинарные исполняемые файлы для нескольких платформ:
Все предварительно скомпилированные двоичные файлы компилируются статически. Версия для Linux в основном компилируется статически, за исключением libc, поэтому подготовлены две версии: одна для glibc (2.31), а другая для musl.
Для среды Linux также предоставляются образы Docker (в настоящее время только для x64). Загрузите kcptube_docker_image.zip и распакуйте его, а затем используйте docker load -i kcptube_docker.tar
для его импорта.
После импорта метод использования:
docker run -v /path/to/config_file.conf:/config_file.conf kcptube config_file.conf
Например:
docker run -v /home/someone/config1.conf:/config1.conf kcptube config1.conf
Пользователи FreeBSD могут скопировать загруженный двоичный файл в /usr/local/bin/
и затем запустить команду
chmod +x /usr/local/bin/kcptube
Соответствующие служебные файлы подготовлены в service
директории этого проекта.
/usr/local/etc/rc.d/
chmod +x /usr/local/etc/rc.d/kcptube
/usr/local/etc/kcptube/
config.conf
/usr/local/etc/kcptube/config.conf
.kcptube_enable="YES"
в /etc/rc.conf
Наконец, запустите service kcptube start
, чтобы запустить службу.
Компилятор должен поддерживать C++20.
Зависимые библиотеки:
Используйте vcpkg для предварительной установки пакетов зависимостей asio
и botan
. Команда выглядит следующим образом:
vcpkg install asio:x64-windows asio:x64-windows-static
vcpkg install botan:x64-windows botan:x64-windows-static
(Если вам нужна версия ARM или 32-битная версия x86, настройте параметры самостоятельно)
Затем используйте Visual Studio, чтобы открыть slnkcptube.sln
и скомпилировать его самостоятельно.
Аналогично, сначала установите зависимости asio и botan3. Кроме того, требуется cmake. Вы можете установить его с помощью собственного пакета системы:
pkg install asio botan3 cmake
Затем создайте каталог сборки
mkdir build
cd build
cmake ..
make
Действия аналогичны FreeBSD. Для NetBSD используйте pkgin для установки зависимостей и cmake:
pkgin install asio
pkgin install cmake
OpenBSD Используйте pkg_add
для установки двух вышеуказанных зависимостей. DragonflyBSD, пожалуйста, используйте pkg
, его использование такое же, как и у FreeBSD.
Поскольку botan-3 не включен в эти системы BSD, вам придется скомпилировать botan-3 самостоятельно.
Остальные шаги сборки см. в описании FreeBSD выше.
Обратите внимание: поскольку эти BSD поставляются с более низкими версиями компилятора, заранее установите более высокую версию GCC.
Действия аналогичны FreeBSD. Используйте менеджер пакетов, входящий в комплект поставки, для установки asio, botan3 и cmake.
apk add asio botan3-libs cmake
Затем создайте каталог сборки
mkdir build
cd build
cmake ..
make
Есть два способа
Практика 1
Скомпилируйте в соответствии с обычным процессом, удалите только что созданный двоичный файл kcptube и запустите команду
make VERBOSE=1
Затем извлеките последнюю команду ссылки C++ из выходного содержимого и замените -lbotan-3
в середине на полный путь к libbotan-3.a, например /usr/lib/x86_64-linux-gnu/libbotan-3.a
.
Практика 2
Откройте src/CMakeLists.txt и измените target_link_libraries(${PROJECT_NAME} PRIVATE botan-3)
на target_link_libraries(${PROJECT_NAME} PRIVATE botan-3 -static)
Тогда компилируется нормально. Обратите внимание: если система использует glibc, она будет статически скомпилирована вместе с glibc и появится предупреждение о getaddrinfo.
У меня нет компьютера Apple, поэтому, пожалуйста, решите все действия самостоятельно.
Увеличение кэша приема может улучшить производительность передачи UDP.
Вы можете использовать команду sysctl kern.ipc.maxsockbuf
чтобы просмотреть размер кэша. Если необходимы корректировки, выполните команду (измените число на нужное значение):
sysctl -w kern.ipc.maxsockbuf=33554434
Или напишите в /etc/sysctl.conf
kern.ipc.maxsockbuf=33554434
Вы можете использовать команду sysctl net.inet.udp.recvspace
чтобы проверить размер буфера приема. Если необходимы корректировки, выполните команду (измените число на нужное значение):
sysctl -w net.inet.udp.recvspace=33554434
Или напишите в /etc/sysctl.conf
net.inet.udp.recvspace=33554434
При необходимости вы можете одновременно скорректировать значение net.inet.udp.sendspace
. Это настройка кэша отправки.
Для кэша приема вы можете использовать команды sysctl net.core.rmem_max
и sysctl net.core.rmem_default
чтобы просмотреть размер кэша приема.
Если необходимы корректировки, выполните команду (измените число на нужное значение):
sysctl -w net.core.rmem_max=33554434
sysctl -w net.core.rmem_default=33554434
Или напишите в /etc/sysctl.conf
net.core.rmem_max=33554434
net.core.rmem_default=33554434
При необходимости вы можете одновременно настроить значения net.core.wmem_max
и net.core.wmem_default
. Это настройка кэша отправки.
Поскольку kcptube внутри использует единый стек IPv6 + включает сопоставленный адрес IPv4 (IPv6, сопоставленный с IPv4) для использования сетей IPv4 и IPv6, убедитесь, что значение параметра v6only равно 0.
В обычных обстоятельствах никаких дополнительных настроек не требуется. FreeBSD, Linux и Windows по умолчанию позволяют сопоставлять адреса IPv4 с IPv6.
Если система не поддерживает IPv6 или IPv6 отключен, установите ipv4_only=true в файле конфигурации, чтобы kcptube вернулся к использованию одностекового режима IPv4.
Использовать команду
sysctl -w net.inet6.ip6.v6only=0
После настройки режим одиночного стека + сопоставленного адреса может прослушивать двойной стек.
Однако по неизвестным причинам сопоставленный адрес IPv4 не может быть активно подключен.
Поскольку OpenBSD полностью блокирует адреса сопоставления IPv4, если вы используете двойной стек на платформе OpenBSD, вам необходимо сохранить два файла конфигурации, один из которых включает ipv4_only=1, а затем загрузить оба файла конфигурации одновременно при использовании kcptube.
В большинстве случаев это приглашение будет встречаться только на стороне сервера, а не на стороне клиента.
Если это действительно встречается на клиенте, проверьте, не слишком ли велико значение mux_tunnels
(кстати, обратитесь к параграфу «Мультиплексирование (mux_tunnels=N)»).
В обычных обстоятельствах подавляющее большинство систем BSD не столкнется с подобным явлением. Только GhostBSD, которая будет обновлена во второй половине 2023 года, столкнется с этим явлением.
Это связано с тем, что GhostBSD добавила в /etc/sysctl.conf
следующую строку:
kern.maxfiles=100000
Эта строка уменьшает верхний предел до уровня, значительно ниже соответствующего значения в стандартной FreeBSD.
Решение простое: просто удалите эту строку. Вы также можете это прокомментировать.
Вы также можете использовать команду sysctl kern.maxfiles=300000
чтобы временно изменить значение верхнего предела.
Поскольку количество открытых файлов в системах Linux ограничено 1024, с этой проблемой легко столкнуться.
Временное решение:
ulimit -n
чтобы просмотреть выходное значение.ulimit -n 300000
Постоянное решение:
Отредактируйте /etc/security/limits.conf и добавьте в конец
* hard nofile 300000
* soft nofile 300000
root hard nofile 300000
root soft nofile 300000
Поскольку данные TCP необходимо передавать, проверку данных нельзя игнорировать, как и сам TCP.
Независимо от того, зашифрован он или нет, kcptube уменьшит MTU на 2 байта и добавит 2 байта данных.
Если была использована опция шифрования, добавленные 2 байта данных представляют собой временно сгенерированный IV.
Если вы решите не использовать функцию шифрования, добавленные 2-байтовые данные представляют собой проверочный код, который представляет собой операцию XOR старшего и младшего битов CRC32.
Напомним, что использование проверочных кодов все равно не может на 100% предотвратить ошибки контента, и то же самое относится и к самому TCP. Если вам действительно нужна точность, включите опцию шифрования.
Хотя KCP Tube имеет функцию «мультиплексирования», по умолчанию она не открывается активно. Без этой функции для каждого принятого входящего соединения создается соответствующее исходящее соединение.
Причина в том, чтобы избежать QoS оператора. В состоянии мультиплексирования, когда определенный номер порта является QoS, другие сеансы, использующие тот же номер порта, будут одновременно заблокированы до тех пор, пока номер порта не будет изменен.
Соединения независимы друг от друга. Даже если определенный номер порта является QoS, это повлияет только на этот сеанс, а на другие сеансы это не повлияет.
Если только размещенная программа не генерирует большое количество независимых подключений. В этом случае KCP Tube создаст большое количество каналов KCP, которые будут потреблять больше ресурсов ЦП в процессе связи.
Если вы действительно хотите использовать функцию «мультиплексирования», вы можете обратиться к следующим категориям:
Сценарии, подходящие для использования «мультиплексирования»:
Сценарии, в которых «мультиплексирование» не требуется:
Когда «Мультиплексирование» включено, KCPTube предварительно создаст N ссылок, и все входящие новые соединения будут передавать данные из существующих ссылок вместо создания новых ссылок отдельно. В это время время тайм-аута канала KCP составляет 30 секунд.
Вообще говоря, установки `mux_tunnels на 3 ~ 10 достаточно, и нет необходимости устанавливать слишком высокое значение.
Чтобы уменьшить задержку, kcptube включает опцию TCP_NODELAY. Для некоторых сценариев приложений с большим трафиком объем передачи данных TCP может быть уменьшен.
На основе оригинального ККП были внесены следующие модификации:
flush()
сначала передает данные для отправки в очередь отправки, а затем повторяет три действия: «отправка новых пакетов данных», «повторная отправка пакетов данных» и «отправка пакетов ACK» в одном и том же цикле. Модифицированная версия сначала выполняет «повторную передачу пакета данных» и «передачу пакета ACK», а затем «переносит данные для отправки в очередь отправки» и отправляет их в течение периода передачи.check()
будет каждый раз заново проходить очередь отправки, чтобы найти временную метку повторной передачи достигнутой точки. Модифицированная версия выглядит следующим образом: прочитайте первую временную метку из отсортированной таблицы сопоставлений, исключив этап поиска.Кроме того, в оригинальной версии есть «баги», и в kcptube они тоже будут. Например:
Поэтому kcptube разработал более очевидный план приостановки. Для данных TCP, когда достигнут предел приема (очередь заполнена), прием данных TCP будет приостановлен до тех пор, пока не освободится место, а затем возобновится для данных UDP, пакет будет потерян непосредственно при достижении предела приема;
Это ограничение практически не повлияет на сценарии приложений, в которых объем передачи невелик.
Пул потоков, используемый kcptube, взят из BS::thread_pool с некоторыми изменениями для параллельной обработки шифрования и дешифрования во время нескольких соединений.
Код написан очень небрежно, и я пишу его где угодно, поэтому верстка сбивает с толку. Если быть точным, это очень сбивает с толку.
Некоторые строки кода длиннее бамбуковых шестов, главным образом потому, что мне было лень менять строки, чтобы следить за ходом мыслей при написании. В конце концов, я не использую vim/emacs. Когда я использую IDE, размер текста, установленный в области кода IDE, отличается от размера текста в других областях, и даже шрифты отличаются, что помогает мне облегчить проблему путаницы.
Что касается чувств читателей... они точно будут недовольны. Это не мое дело, оставь это в покое.