Klicken Sie hier für die englische Version
Jeder, der Heim-Breitband von den drei großen Betreibern genutzt hat und eine Heim-Breitband-Verbindung benötigt, wird fast immer feststellen, dass die Geschwindigkeit von UDP begrenzt ist. Um die QoS der drei großen Betreiber für UDP zu vermeiden, habe ich ein weiteres Tool namens UDP Hop entwickelt. Das Prinzip besteht darin, regelmäßig neue Verbindungen aufzubauen (Portnummern ändern und mit neuen Adressen verbinden).
UDP Hop unterstützt jedoch nur die Weiterleitung von UDP-Verkehr. Um UDP zur Weiterleitung des TCP-Verkehrs nutzen zu können, gibt es KCP Tube. Die zuverlässige Neuübertragung von KCP wird verwendet, um sicherzustellen, dass weitergeleitete TCP-Pakete nicht verloren gehen.
Ein weiterer Grund für die Erstellung von KCP Tube besteht darin, dass andere KCP-Weiterleitungstools nur TCP-Verkehr weiterleiten können, ich jedoch KCP zum Weiterleiten von UDP-Verkehr verwenden muss. Hauptsächlich aus Bequemlichkeit beim Spielen.
Natürlich wurden udphop und kcptube tatsächlich gleichzeitig konzipiert. Der Einfachheit halber haben wir also zuerst die KCP-Röhre und das Framework eingerichtet und es dann basierend auf der KCP-Röhre in UDP Hop geschnitten. Führen Sie dann den UDP-Hop-Patchcode zurück in KCP Tube zusammen.
Um Heim-Breitband-Full-Cone-NAT-Benutzern die Arbeit zu erleichtern, kann KCP Tube im Basisservermodus mit STUN Löcher bohren und unterstützt sowohl IPv4 als auch IPv6.
Genau wie der Zweck von KCP selbst besteht das Hauptziel von KCP Tube darin, die Latenz zu reduzieren, anstatt die Übertragung von extrem großem Datenverkehr zu begünstigen. Kann es also extrem großen Datenverkehr übertragen? Ja, aber der Effekt ist möglicherweise nicht so gut wie beim vorhandenen TCP-KCP-Weiterleitungstool.
Derzeit werden 3 Modi unterstützt:
Beachten Sie , dass die Zeit des Clients und die Zeit des Servers synchronisiert sein müssen und der Zeitunterschied nicht größer als 255 Sekunden sein darf.
Bitte gehen Sie zur Wiki-Seite oder zur Dokumentationsseite.
Wenn Sie einen Profilgenerator benötigen, gehen Sie hier: KCPTube Generator
kcptube config.conf
Beispiel für den Client-Modus:
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
Beispiel für den Servermodus:
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=./
Hinweis: Beim ersten Herstellen einer Verbindung teilt der Server dem Client seinen Portbereich mit, sodass listen_port
im Client-Modus nicht mit destination_port
im Server-Modus übereinstimmen muss. Die Ports auf beiden Seiten können jedoch inkonsistent sein Der vom Client geschriebene Portnummernbereich darf nicht über den Bereich des Servers hinausgehen, um zu verhindern, dass der Client den falschen Port auswählt und keine Verbindung herstellen kann.
Wenn Sie die hörende Netzwerkkarte angeben möchten, geben Sie die IP-Adresse der Netzwerkkarte an und fügen Sie eine Zeile hinzu.
listen_on=192.168.1.1
Wenn Sie mehrere Ports und mehrere Netzwerkkarten abhören möchten, trennen Sie mehrere Konfigurationsdateien.
kcptube config1.conf config2.conf
Wenn Sie vor dem Herstellen einer Verbindung testen möchten, ob die Verbindung reibungslos funktioniert, können Sie die Option --try
hinzufügen
kcptube --try config1.conf
oder
kcptube config1.conf --try
Verwenden Sie die Option --check-config
, um zu überprüfen, ob die Konfigurationsdatei korrekt ist:
kcptube --check-config config1.conf
oder
kcptube config1.conf --check-config
Beispiel für den Client-Modus:
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
Beispiel für den Servermodus:
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
Beispiel für den Client-Modus:
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
Beispiel für den Servermodus:
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
Name | Einstellbarer Wert | Erforderlich | Bemerkung |
---|---|---|---|
Modus | Kunde Server Relais | Ja | Client-Server-Relay-Knoten |
listen_on | Domainname oder IP-Adresse | NEIN | Es können nur der Domänenname oder die IP-Adresse eingegeben werden. Bitte trennen Sie mehrere Adressen durch Kommas |
listen_port | 1-65535 | Ja | Bei der Ausführung als Server können Sie einen Portbereich angeben |
Zielport | 1-65535 | Ja | Bei der Ausführung als Client können Portbereiche angegeben werden. Bitte trennen Sie mehrere Adressen durch Kommas |
Zieladresse | IP-Adresse, Domänenname | Ja | Beim Ausfüllen der IPv6-Adresse sind keine eckigen Klammern erforderlich |
dport_refresh | 0 - 32767 | NEIN | Die Einheit ist „Sekunde“. Bleibt das Feld leer, wird der Standardwert von 60 Sekunden verwendet. 1 bis 20 werden als 20 Sekunden berechnet, und größer als 32767 werden als 32767 Sekunden berechnet. Zum Deaktivieren auf 0 setzen. |
Verschlüsselungsalgorithmus | AES-GCM AES-OCB chacha20 xchacha20 keiner | NEIN | AES-256-GCM-AEAD AES-256-OCB-AEAD ChaCha20-Poly1305 XChaCha20-Poly1305 Keine Verschlüsselung |
Verschlüsselungskennwort | irgendein Charakter | Hängt von der Situation ab | Erforderlich, wenn „encryption_algorithm“ festgelegt ist und nicht „none“ ist |
udp_timeout | 0 - 65535 | NEIN | Die Einheit ist „Sekunde“. Der Standardwert beträgt 180 Sekunden. Wenn er auf 0 gesetzt ist, wird der Standardwert verwendet. Diese Option stellt die Zeitüberschreitungseinstellung zwischen UDP-Anwendung und kcptube dar |
keep_alive | 0 - 65535 | NEIN | Die Einheit ist „Sekunde“. Der Standardwert ist 0, was der Deaktivierung von Keep Alive entspricht. Diese Option bezieht sich auf Keep Alive zwischen zwei KCP-Enden Kann einseitig aktiviert werden, um zu erkennen, ob der Kanal nicht mehr reagiert. Erfolgt nach 30 Sekunden keine Antwort, wird der Kanal geschlossen. |
mux_tunnels | 0 - 65535 | NEIN | Der Standardwert ist 0, was bedeutet, dass keine Multiplexkanäle verwendet werden. Diese Option bezieht sich auf die Anzahl der Multiplexkanäle zwischen den beiden KCP-Enden. |
stun_server | STUN-Serveradresse | NEIN | Kann nicht verwendet werden, wenn sich listen_port im Portbereichsmodus befindet |
log_path | Verzeichnis zum Speichern des Protokolls | NEIN | Es kann nicht auf die Datei selbst verwiesen werden |
fec | uint8:uint8 | NEIN | Das Format ist fec=D:R , es kann beispielsweise fec=20:3 ausgefüllt werden.Hinweis: Der maximale Gesamtwert von D + R beträgt 255 und kann diese Zahl nicht überschreiten. Ein Wert von 0 auf beiden Seiten des Doppelpunkts zeigt an, dass die Option nicht verwendet wird. Die Einstellungen müssen an beiden Enden gleich sein. Einzelheiten finden Sie im FEC-Nutzungshandbuch. |
mtu | positive ganze Zahl | NEIN | Aktueller Netzwerk-MTU-Wert, der zur automatischen Berechnung von kcp_mtu verwendet wird |
kcp_mtu | positive ganze Zahl | NEIN | Der Standardwert ist 1440. Der durch den Aufruf von ikcp_setmtu() festgelegte Wert ist die Länge des Dateninhalts im UDP-Paket. |
kcp | Handbuch schnell1-6 regulär1-5 | Ja | Stellen Sie die schnelle Normalgeschwindigkeit manuell ein (Zahl am Ende: je kleiner der Wert, desto schneller die Geschwindigkeit) |
kcp_sndwnd | positive ganze Zahl | NEIN | Die Standardwerte sind in der folgenden Tabelle aufgeführt und können individuell überschrieben werden. |
kcp_rcvwnd | positive ganze Zahl | NEIN | Die Standardwerte sind in der folgenden Tabelle aufgeführt und können individuell überschrieben werden. |
kcp_nodelay | positive ganze Zahl | Hängt von der Situation ab | Erforderlich, wenn kcp=manual, der Standardwert ist in der folgenden Tabelle aufgeführt |
kcp_interval | positive ganze Zahl | Hängt von der Situation ab | Erforderlich, wenn kcp=manual, der Standardwert ist in der folgenden Tabelle aufgeführt |
kcp_resend | positive ganze Zahl | Hängt von der Situation ab | Erforderlich, wenn kcp=manual, der Standardwert ist in der folgenden Tabelle aufgeführt |
kcp_nc | Ja WAHR 1 NEIN FALSCH 0 | Hängt von der Situation ab | Erforderlich, wenn kcp=manual, der Standardwert ist in der folgenden Tabelle aufgeführt |
outbound_bandwidth | positive ganze Zahl | NEIN | Ausgehende Bandbreite, die zur dynamischen Aktualisierung des Werts von kcp_sndwnd während der Kommunikation verwendet wird |
eingehende_Bandbreite | positive ganze Zahl | NEIN | Eingehende Bandbreite, die zur dynamischen Aktualisierung des Werts von kcp_rcvwnd während des Kommunikationsprozesses verwendet wird |
ipv4_only | Ja WAHR 1 NEIN FALSCH 0 | NEIN | Wenn IPv6 auf dem System deaktiviert ist, muss diese Option aktiviert und auf „Ja“ oder „Wahr“ oder 1 gesetzt werden |
ipv6_only | Ja WAHR 1 NEIN FALSCH 0 | NEIN | Ignorieren Sie IPv4-Adressen |
Explosion | Ja WAHR 1 NEIN FALSCH 0 | NEIN | Versuchen Sie, die KCP-Flusskontrolleinstellungen zu ignorieren und Pakete so schnell wie möglich weiterzuleiten. Kann zu übermäßiger Belastung führen |
[Hörer] | N / A | Ja (nur Relaismodus) | Die Bezeichnung des Relay-Modus, die zur Angabe des KCP im Abhörmodus verwendet wird. Die Festlegung dieser Bezeichnung gibt die Interaktionsdaten mit dem Client an. |
[Spediteur] | N / A | Ja (nur Relaismodus) | Die Bezeichnung des Relay-Modus, die zur Angabe des KCP des Übertragungsmodus verwendet wird. Die Festlegung dieser Bezeichnung gibt die Interaktionsdaten mit dem Server an. |
[custom_input] | N / A | NEIN | Bezeichnung des benutzerdefinierten Zuordnungsmodus. Bitte beachten Sie die Verwendungsmethode der benutzerdefinierten Zuordnung |
[custom_input_tcp] | N / A | NEIN | Bezeichnung des benutzerdefinierten Zuordnungsmodus. Bitte beachten Sie die Verwendungsmethode der benutzerdefinierten Zuordnung |
[custom_input_udp] | N / A | NEIN | Bezeichnung des benutzerdefinierten Zuordnungsmodus. Bitte beachten Sie die Verwendungsmethode der benutzerdefinierten Zuordnung |
Unter anderem müssen encryption_algorithm
und encryption_password
an beiden Enden der Kommunikation konsistent sein.
Name | Einstellbarer Wert | Erforderlich | Bemerkung |
---|---|---|---|
fib_ingress | 0 - 65535 | NEIN | FIB wird von eingehenden Verbindungen verwendet |
fib_egress | 0 - 65535 | NEIN | FIB wird für ausgehende Verbindungen verwendet |
Verfügbare Suffixe: K/M/G
Beim Suffix wird die Groß-/Kleinschreibung beachtet. Großbuchstaben werden als Binärzeichen (1024) und Kleinbuchstaben als Dezimalzahlen (1000) berechnet.
Geben Sie 1000 ein, um anzugeben, dass die Bandbreite 1000 Bit/s beträgt
Geben Sie 100k ein, was bedeutet, dass die Bandbreite 100 kbps (100000 bps) beträgt.
Geben Sie 100 K ein, was bedeutet, dass die Bandbreite 100 Kbit/s (102 400 bit/s) beträgt.
Geben Sie 100M ein, was bedeutet, dass die Bandbreite 100 Mbit/s (102400 Kbit/s) beträgt.
Geben Sie 1G ein, was bedeutet, dass die Bandbreite 1 Gbit/s (1024 Mbit/s) beträgt.
Beachten Sie, dass es sich um Bps (Bits pro Sekunde) und nicht um Bps (Bytes pro Sekunde) handelt.
Es ist zu beachten, dass der eingegebene Bandbreitenwert die tatsächliche Bandbreite nicht überschreiten sollte, um eine Überlastung des Sendefensters zu vermeiden.
WICHTIGER HINWEIS :
KCPTube berechnet und legt die Größe des KCP-Sendefensters basierend auf dem Verzögerungswert des Handshake-Pakets und den Werten von outbound_bandwidth und inbound_bandwidth etwa 5 Sekunden nach dem Herstellen der KCP-Verbindung fest. Innerhalb eines Zeitraums nach Abschluss der Einrichtung besteht eine hohe Wahrscheinlichkeit, dass der Datenverkehr erheblich schwankt oder sogar plötzlich auf 0 sinkt und die Wiederherstellung mehrere Sekunden dauert.
Schnellmodus | kcp_sndwnd | kcp_rcvwnd | kcp_nodelay | kcp_interval | kcp_resend | kcp_nc |
---|---|---|---|---|---|---|
schnell1 | 2048 | 2048 | 1 | 1 | 2 | 1 |
schnell2 | 2048 | 2048 | 2 | 1 | 2 | 1 |
schnell3 | 2048 | 2048 | 1 | 1 | 3 | 1 |
schnell4 | 2048 | 2048 | 2 | 1 | 3 | 1 |
schnell5 | 2048 | 2048 | 1 | 1 | 4 | 1 |
schnell6 | 2048 | 2048 | 2 | 1 | 4 | 1 |
normaler Geschwindigkeitsmodus | kcp_sndwnd | kcp_rcvwnd | kcp_nodelay | kcp_interval | kcp_resend | kcp_nc |
---|---|---|---|---|---|---|
regelmäßig1 | 1024 | 1024 | 1 | 1 | 5 | 1 |
regelmäßig2 | 1024 | 1024 | 2 | 1 | 5 | 1 |
regelmäßig3 | 1024 | 1024 | 0 | 1 | 2 | 1 |
regelmäßig4 | 1024 | 1024 | 0 | 15 | 2 | 1 |
regelmäßig5 | 1024 | 1024 | 0 | 30 | 2 | 1 |
Je höher die Paketverlustrate (mehr als 10 %), desto größer ist der Vorteil von kcp_nodelay = 1 gegenüber kcp_nodelay = 2. Wenn die Paketverlustrate nicht besonders hoch ist, kann kcp_nodelay=2 den Verzögerungsjitter glätten.
Für Umgebungen mit geringem Paketverlust ist jeder Modus geeignet. Der einzige Unterschied besteht darin, ob mehr oder weniger verschwendeter Datenverkehr verwendet wird und die Obergrenze der maximalen Geschwindigkeit unterschiedlich ist. Unter anderem verschwendet Regular3 nicht so viel Verkehr.
Es wird empfohlen, gleichzeitig blast=1
zu aktivieren.
Erwägen Sie in Umgebungen mit hohem Paketverlust die Überlagerung der FEC-Einstellung. Einzelheiten finden Sie im FEC-Nutzungshandbuch.
Weitere Einzelheiten finden Sie in der Parameterliste.
Nachdem die gelochte IP-Adresse und der Port zum ersten Mal abgerufen wurden und nachdem die gelochte IP-Adresse und der Port geändert wurden, wird die Datei ip_address.txt im Protokollverzeichnis erstellt (überschrieben, falls vorhanden) und die IP Adresse und Port werden darin eingetragen.
Die erhaltene Bohradresse wird gleichzeitig in der Konsole angezeigt.
log_path=
muss auf ein Verzeichnis verweisen, nicht auf die Datei selbst.
Wenn Sie nicht in die Protokolldatei schreiben müssen, löschen Sie die Zeile log_path
.
Häufige STUN-Server von NatTypeTeste gefunden:
STUN-Server von Natter gefunden:
Andere STUN-Server: public-stun-list.txt
Zur Vereinfachung der Verwendung wurden binäre ausführbare Dateien für mehrere Plattformen bereitgestellt:
Vorkompilierte Binärdateien werden alle statisch kompiliert. Die Linux-Version ist grundsätzlich statisch kompiliert, mit Ausnahme von libc, daher werden zwei Versionen vorbereitet, eine für glibc (2.31) und die andere für musl.
Für die Linux-Umgebung werden auch Docker-Images bereitgestellt (derzeit nur x64). Laden Sie kcptube_docker_image.zip herunter, dekomprimieren Sie es und importieren Sie es dann mit docker load -i kcptube_docker.tar
.
Nach dem Import lautet die Verwendungsmethode:
docker run -v /path/to/config_file.conf:/config_file.conf kcptube config_file.conf
Zum Beispiel:
docker run -v /home/someone/config1.conf:/config1.conf kcptube config1.conf
FreeBSD-Benutzer können die heruntergeladene Binärdatei nach /usr/local/bin/
kopieren und dann den Befehl ausführen
chmod +x /usr/local/bin/kcptube
Die entsprechenden Servicedateien wurden im service
dieses Projekts vorbereitet.
/usr/local/etc/rc.d/
chmod +x /usr/local/etc/rc.d/kcptube
aus/usr/local/etc/kcptube/
config.conf
zu nennen/usr/local/etc/kcptube/config.conf
kcptube_enable="YES"
zu /etc/rc.conf
hinzu Führen Sie abschließend service kcptube start
aus, um den Dienst zu starten
Der Compiler muss C++20 unterstützen
Abhängige Bibliotheken:
Bitte installieren Sie die Abhängigkeitspakete asio
und botan
vorab mit vcpkg. Der Befehl lautet wie folgt:
vcpkg install asio:x64-windows asio:x64-windows-static
vcpkg install botan:x64-windows botan:x64-windows-static
(Wenn Sie eine ARM- oder 32-Bit-x86-Version benötigen, passen Sie die Optionen bitte selbst an.)
Öffnen Sie dann mit Visual Studio slnkcptube.sln
und kompilieren Sie es selbst
Ebenso installieren Sie bitte zuerst die Abhängigkeiten asio und botan3. Darüber hinaus ist cmake erforderlich. Sie können es mit dem systemeigenen Paket installieren.
pkg install asio botan3 cmake
Dann bauen Sie im Build-Verzeichnis
mkdir build
cd build
cmake ..
make
Die Schritte ähneln denen von FreeBSD. Verwenden Sie für NetBSD bitte pkgin, um Abhängigkeiten und cmake zu installieren:
pkgin install asio
pkgin install cmake
OpenBSD Bitte verwenden Sie pkg_add
um die beiden oben genannten Abhängigkeiten zu installieren. Für DragonflyBSD verwenden Sie bitte pkg
. Die Verwendung ist die gleiche wie bei FreeBSD.
Da Botan-3 nicht in diesen BSD-Systemen enthalten ist, müssen Sie Botan-3 selbst kompilieren.
Die restlichen Build-Schritte finden Sie oben unter FreeBSD.
Beachten Sie, dass diese BSDs mit niedrigeren Compilerversionen geliefert werden. Bitte installieren Sie im Voraus eine höhere Version von GCC.
Die Schritte ähneln denen von FreeBSD. Bitte verwenden Sie den mit der Distribution gelieferten Paketmanager, um asio, botan3 und cmake zu installieren.
apk add asio botan3-libs cmake
Dann bauen Sie im Build-Verzeichnis
mkdir build
cd build
cmake ..
make
Es gibt zwei Möglichkeiten
Übung 1
Kompilieren Sie gemäß dem normalen Prozess, löschen Sie die gerade generierte kcptube-Binärdatei und führen Sie den Befehl aus
make VERBOSE=1
Extrahieren Sie dann den letzten C++-Linkbefehl aus dem Ausgabeinhalt und ändern Sie -lbotan-3
in der Mitte in den vollständigen Pfad von libbotan-3.a, z. B. /usr/lib/x86_64-linux-gnu/libbotan-3.a
.
Übung 2
Öffnen Sie src/CMakeLists.txt und ändern Sie target_link_libraries(${PROJECT_NAME} PRIVATE botan-3)
in target_link_libraries(${PROJECT_NAME} PRIVATE botan-3 -static)
Dann wird es normal kompiliert. Beachten Sie, dass, wenn das System Glibc verwendet, es zusammen mit Glibc statisch kompiliert wird und eine Warnung zu getaddrinfo angezeigt wird.
Ich habe keinen Apple-Computer, also lösen Sie bitte alle Schritte selbst.
Durch Erhöhen des Empfangscaches kann die UDP-Übertragungsleistung verbessert werden
Sie können den Befehl sysctl kern.ipc.maxsockbuf
verwenden, um die Cachegröße anzuzeigen. Wenn Anpassungen erforderlich sind, führen Sie den Befehl aus (ändern Sie die Zahl auf den gewünschten Wert):
sysctl -w kern.ipc.maxsockbuf=33554434
Oder schreiben Sie in /etc/sysctl.conf
kern.ipc.maxsockbuf=33554434
Sie können den Befehl sysctl net.inet.udp.recvspace
verwenden, um die Empfangspuffergröße zu überprüfen. Wenn Anpassungen erforderlich sind, führen Sie den Befehl aus (ändern Sie die Zahl auf den gewünschten Wert):
sysctl -w net.inet.udp.recvspace=33554434
Oder schreiben Sie in /etc/sysctl.conf
net.inet.udp.recvspace=33554434
Bei Bedarf können Sie gleichzeitig den Wert von net.inet.udp.sendspace
anpassen. Dies ist die Einstellung für den Sendecache.
Für den Empfangscache können Sie die Befehle sysctl net.core.rmem_max
und sysctl net.core.rmem_default
verwenden, um die Größe des Empfangscaches anzuzeigen.
Wenn Anpassungen erforderlich sind, führen Sie den Befehl aus (ändern Sie die Zahl auf den gewünschten Wert):
sysctl -w net.core.rmem_max=33554434
sysctl -w net.core.rmem_default=33554434
Oder schreiben Sie in /etc/sysctl.conf
net.core.rmem_max=33554434
net.core.rmem_default=33554434
Bei Bedarf können Sie die Werte von net.core.wmem_max
und net.core.wmem_default
gleichzeitig anpassen. Dies ist die Einstellung für den Sendecache.
Da kcptube intern einen IPv6-Single-Stack verwendet und die IPv4-zugeordnete Adresse (IPv4-zugeordnetes IPv6) aktiviert, um sowohl IPv4- als auch IPv6-Netzwerke zu verwenden, stellen Sie bitte sicher, dass der Wert der Option v6only 0 ist.
Unter normalen Umständen sind keine zusätzlichen Einstellungen erforderlich. FreeBSD, Linux und Windows ermöglichen standardmäßig die Zuordnung von IPv4-Adressen zu IPv6.
Wenn das System IPv6 nicht unterstützt oder IPv6 deaktiviert ist, setzen Sie bitte ipv4_only=true in der Konfigurationsdatei, damit kcptube auf den IPv4-Single-Stack-Modus zurückgreift.
Befehl verwenden
sysctl -w net.inet6.ip6.v6only=0
Nach der Einstellung kann der Single-Stack- und Mapped-Adress-Modus den Dual-Stack abhören.
Aus unbekannten Gründen ist die zugeordnete IPv4-Adresse jedoch möglicherweise nicht aktiv verbunden.
Da OpenBSD IPv4-Zuordnungsadressen vollständig blockiert, müssen Sie bei Verwendung von Dual Stack auf der OpenBSD-Plattform zwei Konfigurationsdateien speichern, von denen eine ipv4_only=1 aktiviert, und dann beide Konfigurationsdateien gleichzeitig laden, wenn Sie kcptube verwenden.
In den meisten Fällen wird diese Eingabeaufforderung nur auf der Serverseite und nicht auf der Clientseite angezeigt.
Wenn es tatsächlich auf dem Client auftritt, prüfen Sie bitte, ob der Wert von mux_tunnels
zu hoch ist (siehe übrigens den Abschnitt „Multiplexing (mux_tunnels=N)“).
Unter normalen Umständen wird die überwiegende Mehrheit der BSD-Systeme nicht auf dieses Phänomen stoßen. Nur GhostBSD, das in der zweiten Hälfte des Jahres 2023 aktualisiert wird, wird dieses Phänomen erleben.
Das liegt daran, dass GhostBSD diese Zeile zu /etc/sysctl.conf
hinzugefügt hat:
kern.maxfiles=100000
Diese Zeile reduziert die Obergrenze auf einen viel niedrigeren Wert als den entsprechenden Wert in Vanilla FreeBSD.
Die Lösung ist einfach: Löschen Sie einfach diese Zeile. Sie können es auch auskommentieren.
Sie können den oberen Grenzwert auch mit dem Befehl sysctl kern.maxfiles=300000
vorübergehend ändern.
Da die Anzahl der geöffneten Dateien in Linux-Systemen auf 1024 begrenzt ist, kann dieses Problem leicht auftreten.
Übergangslösung:
ulimit -n
aus, um den Ausgabewert anzuzeigenulimit -n 300000
aus Dauerhafte Lösung:
Bearbeiten Sie /etc/security/limits.conf und fügen Sie am Ende hinzu
* hard nofile 300000
* soft nofile 300000
root hard nofile 300000
root soft nofile 300000
Da TCP-Daten übertragen werden müssen, kann die Datenvalidierung ebenso wie TCP selbst nicht ignoriert werden.
Unabhängig davon, ob es verschlüsselt ist oder nicht, reduziert kcptube die MTU um 2 Byte und hängt 2 Byte Daten an.
Wenn die Verschlüsselungsoption verwendet wurde, handelt es sich bei den angehängten 2 Datenbytes um die vorübergehend generierte IV.
Wenn Sie die Verschlüsselungsfunktion nicht verwenden möchten, handelt es sich bei den angehängten 2-Byte-Daten um den Prüfcode, bei dem es sich um die XOR-Verknüpfung der High- und Low-Bits von CRC32 handelt.
Es sei daran erinnert, dass die Verwendung von Prüfcodes Inhaltsfehler immer noch nicht zu 100 % verhindern kann, und das Gleiche gilt auch für TCP selbst. Wenn Sie wirklich präzise sein müssen, aktivieren Sie die Verschlüsselungsoption.
Obwohl KCP Tube über eine „Multiplexing“-Funktion verfügt, ist diese standardmäßig nicht aktiv geöffnet. Ohne diese Funktion wird für jede akzeptierte eingehende Verbindung eine entsprechende ausgehende Verbindung erstellt.
Der Grund besteht darin, die QoS des Betreibers zu vermeiden. Sobald im Multiplexing-Zustand eine bestimmte Portnummer QoS ist, werden andere Sitzungen mit derselben Portnummer gleichzeitig blockiert, bis die Portnummer geändert wird.
Die Verbindungen sind unabhängig voneinander. Auch wenn eine bestimmte Portnummer QoS ist, ist nur diese Sitzung betroffen und andere Sitzungen sind nicht betroffen.
Es sei denn, das gehostete Programm generiert eine große Anzahl unabhängiger Verbindungen. In diesem Fall erstellt KCP Tube eine große Anzahl von KCP-Kanälen, die während des Kommunikationsprozesses mehr CPU-Ressourcen verbrauchen.
Wenn Sie die Funktion „Multiplexing“ wirklich nutzen möchten, können Sie auf folgende Kategorien zurückgreifen:
Geeignete Szenarien für den Einsatz von „Multiplexing“:
Szenarien, in denen „Multiplexing“ nicht erforderlich ist:
Wenn „Multiplexing“ aktiviert ist, erstellt KCPTube vorab N Links und alle eingehenden neuen Verbindungen übertragen Daten von den vorhandenen Links, anstatt neue Links separat zu erstellen. Zu diesem Zeitpunkt beträgt die Timeout-Zeit des KCP-Kanals 30 Sekunden.
Im Allgemeinen reicht es aus, „mux_tunnels“ auf 3 bis 10 zu setzen, und es besteht keine Notwendigkeit, einen zu hohen Wert festzulegen.
Um die Latenz zu reduzieren, aktiviert kcptube die Option TCP_NODELAY. Bei einigen Anwendungsszenarien mit großem Datenverkehr kann die Menge der TCP-Datenübertragung reduziert werden.
Basierend auf dem ursprünglichen KCP wurden folgende Änderungen vorgenommen:
flush()
überträgt zunächst die zu sendenden Daten an die Sendewarteschlange und wiederholt dann die drei Dinge „Senden neuer Datenpakete“, „Erneutes Senden von Datenpaketen“ und „Senden von ACK-Paketen“ im selben Zyklus. Die modifizierte Version führt zunächst „Datenpaket-Neuübertragung“ und „ACK-Paketübertragung“ durch und überträgt dann „die zu sendenden Daten an die Sendewarteschlange“ und sendet sie während des Übertragungszeitraums.check()
durchläuft die Sendewarteschlange jedes Mal erneut, um den Zeitstempel für die erneute Übertragung des erreichten Punkts zu finden. Die geänderte Version lautet: Lesen Sie den ersten Zeitstempel aus der sortierten Zuordnungstabelle, wodurch der Suchschritt entfällt.Darüber hinaus weist die Originalversion „Bugs“ auf, und auch kcptube wird diese haben. Zum Beispiel:
Also erstellte kcptube einen offensichtlicheren Sperrplan. Bei TCP-Daten wird der Empfang von TCP-Daten ausgesetzt, bis das Empfangslimit erreicht ist (die Warteschlange ist voll), und bei UDP-Daten wird das Paket sofort wieder aufgenommen, wenn das Empfangslimit erreicht ist.
Auf Anwendungsszenarien, bei denen das Übertragungsvolumen nicht groß ist, wird diese Einschränkung grundsätzlich keine Auswirkungen haben.
Der von kcptube verwendete Thread-Pool stammt von BS::thread_pool, mit einigen Modifikationen für die parallele Verschlüsselungs- und Entschlüsselungsverarbeitung bei mehreren Verbindungen.
Der Code ist sehr beiläufig geschrieben und ich schreibe ihn, wo immer ich denke, daher ist das Layout verwirrend. Um genau zu sein, ist es sehr verwirrend.
Einige Codezeilen sind so lang wie Bambusstangen, hauptsächlich weil ich zu faul war, Zeilen zu ändern, um beim Schreiben dem Gedankengang folgen zu können. Schließlich verwende ich vim/emacs nicht. Wenn ich eine IDE verwende, unterscheidet sich die im Codebereich der IDE festgelegte Textgröße von der Textgröße in anderen Bereichen, und sogar die Schriftarten sind unterschiedlich, was mir hilft, das Verwirrungsproblem zu lindern.
Was die Gefühle der Leser betrifft ... sie werden definitiv unglücklich sein. Es geht mich nichts an, lass es in Ruhe.