Klik Disini untuk Versi Bahasa Inggris
Siapapun yang telah menggunakan broadband rumah dari tiga operator besar dan membutuhkan interkoneksi broadband rumah hampir selalu mengalami UDP yang kecepatannya terbatas. Untuk menghindari QoS dari tiga operator besar untuk UDP, saya membuat alat lain yang disebut UDP Hop. Prinsipnya adalah membuat koneksi baru secara berkala (mengubah nomor port dan menyambung ke alamat baru).
Namun, UDP Hop hanya mendukung penerusan lalu lintas UDP. Agar bisa menggunakan UDP untuk meneruskan trafik TCP, ada KCP Tube. Transmisi ulang KCP yang andal digunakan untuk memastikan bahwa paket TCP yang diteruskan tidak akan hilang.
Alasan lain membuat KCP Tube adalah karena alat penerusan KCP lainnya hanya dapat meneruskan lalu lintas TCP, tetapi saya perlu menggunakan KCP untuk meneruskan lalu lintas UDP. Terutama untuk kenyamanan bermain game.
Tentu saja, udphop dan kcptube sebenarnya dibuat pada waktu yang bersamaan. Jadi demi kenyamanan, pertama-tama kita siapkan KCP Tube dan atur frameworknya, lalu potong menjadi UDP Hop berdasarkan KCP Tube. Kemudian gabungkan kembali kode patch UDP Hop ke KCP Tube.
Untuk memfasilitasi pengguna Full Cone NAT broadband rumah, KCP Tube dapat menggunakan STUN untuk mengebor lubang saat berjalan dalam mode server dasar, dan mendukung IPv4 dan IPv6.
Sama seperti tujuan KCP itu sendiri, tujuan utama KCP Tube adalah untuk mengurangi latensi, dibandingkan mendukung transmisi trafik yang sangat besar. Jadi bisakah ia mengirimkan lalu lintas yang sangat besar? Ya, tapi efeknya mungkin tidak sebaik alat penerusan TCP-KCP yang ada.
Saat ini 3 mode didukung:
Perhatikan bahwa waktu klien dan waktu server harus disinkronkan, dan perbedaan waktu tidak boleh lebih dari 255 detik.
Silakan buka halaman wiki, atau buka halaman dokumentasi.
Jika Anda memerlukan generator profil, buka di sini: KCPTube Generator
kcptube config.conf
Contoh mode klien:
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
Contoh mode server:
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=./
Catatan: Saat menghubungkan untuk pertama kalinya, server akan memberi tahu klien tentang jangkauan portnya, sehingga listen_port
dalam mode klien tidak harus sama dengan destination_port
dalam mode server rentang nomor port yang ditulis oleh klien tidak boleh Di luar cakupan server untuk mencegah klien memilih port yang salah dan gagal terhubung.
Jika Anda ingin menentukan kartu jaringan yang mendengarkan, tentukan alamat IP kartu jaringan dan tambahkan satu baris.
listen_on=192.168.1.1
Jika Anda ingin mendengarkan beberapa port dan beberapa kartu jaringan, pisahkan beberapa file konfigurasi.
kcptube config1.conf config2.conf
Jika Anda ingin menguji apakah koneksi lancar sebelum menghubungkan, Anda dapat menambahkan opsi --try
kcptube --try config1.conf
atau
kcptube config1.conf --try
Gunakan opsi --check-config
untuk memverifikasi bahwa file konfigurasi sudah benar:
kcptube --check-config config1.conf
atau
kcptube config1.conf --check-config
Contoh mode klien:
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
Contoh mode server:
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
Contoh mode klien:
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
Contoh mode server:
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
nama | Nilai yang dapat diatur | Diperlukan | Komentar |
---|---|---|---|
mode | klien server menyampaikan | Ya | Node relai server klien |
dengarkan_on | Nama domain atau alamat IP | TIDAK | Hanya nama domain atau alamat IP yang dapat diisi. Harap pisahkan beberapa alamat dengan koma |
mendengarkan_port | 1-65535 | Ya | Saat dijalankan sebagai server, Anda dapat menentukan rentang port |
pelabuhan_tujuan | 1-65535 | Ya | Rentang port dapat ditentukan saat dijalankan sebagai klien. Harap pisahkan beberapa alamat dengan koma |
alamat_tujuan | Alamat IP, nama domain | Ya | Tidak diperlukan tanda kurung siku saat mengisi alamat IPv6 |
dport_refresh | 0 - 32767 | TIDAK | Satuannya adalah "kedua". Jika dibiarkan kosong, nilai default 60 detik akan digunakan. 1 hingga 20 dihitung sebagai 20 detik, dan lebih besar dari 32767 dihitung sebagai 32767 detik. Setel ke 0 untuk menonaktifkan. |
enkripsi_algoritma | AES-GCM AES-OCB chacha20 xchacha20 tidak ada | TIDAK | AES-256-GCM-AEAD AES-256-OCB-AEAD ChaCha20-Poli1305 XChaCha20-Poli1305 Tidak ada enkripsi |
enkripsi_kata sandi | karakter apa pun | Tergantung situasinya | Diperlukan ketika algoritma_enkripsi disetel dan bukan tidak ada |
udp_timeout | 0 - 65535 | TIDAK | Satuannya adalah "kedua". Nilai default adalah 180 detik. Jika diatur ke 0, nilai default digunakan. Opsi ini mewakili pengaturan batas waktu antara aplikasi UDP ↔ kcptube |
tetap_hidup | 0 - 65535 | TIDAK | Satuannya adalah "kedua". Nilai defaultnya adalah 0, yang setara dengan menonaktifkan Keep Alive. Opsi ini mengacu pada Keep Alive di antara dua ujung KCP Dapat diaktifkan secara sepihak untuk mendeteksi jika saluran berhenti merespons. Jika tidak ada respon setelah 30 detik, saluran akan ditutup. |
mux_tunnels | 0 - 65535 | TIDAK | Nilai defaultnya adalah 0, yang setara dengan tidak menggunakan saluran multiplexing. Opsi ini mengacu pada jumlah saluran multiplexing antara dua ujung KCP. |
setrum_server | Alamat server STUN | TIDAK | Tidak dapat digunakan ketika mendengarkan_port dalam mode jangkauan port |
log_path | Direktori untuk menyimpan Log | TIDAK | Tidak dapat menunjuk ke file itu sendiri |
kotoran | uint8:uint8 | TIDAK | Formatnya fec=D:R , misalnya fec=20:3 bisa diisi.Catatan: Nilai total maksimum D + R adalah 255 dan tidak boleh melebihi angka ini. Nilai 0 di kedua sisi titik dua menunjukkan bahwa opsi tersebut tidak digunakan. Pengaturannya harus sama di kedua ujungnya. Untuk detailnya, silakan merujuk ke panduan penggunaan FEC. |
mtu | bilangan bulat positif | TIDAK | Nilai MTU jaringan saat ini, digunakan untuk menghitung kcp_mtu secara otomatis |
kcp_mtu | bilangan bulat positif | TIDAK | Nilai defaultnya adalah 1440. Nilai yang ditetapkan dengan memanggil ikcp_setmtu() adalah panjang isi data dalam paket UDP. |
kcp | panduan cepat1-6 reguler1-5 | Ya | Atur kecepatan normal cepat secara manual (Nomor di akhir: semakin kecil nilainya, semakin cepat kecepatannya) |
kcp_sndwnd | bilangan bulat positif | TIDAK | Nilai default ditunjukkan pada tabel di bawah dan dapat diganti satu per satu. |
kcp_rcvwnd | bilangan bulat positif | TIDAK | Nilai default ditunjukkan pada tabel di bawah dan dapat diganti satu per satu. |
kcp_nodelay | bilangan bulat positif | Tergantung situasinya | Diperlukan ketika kcp=manual, nilai defaultnya ditunjukkan pada tabel di bawah |
kcp_interval | bilangan bulat positif | Tergantung situasinya | Diperlukan ketika kcp=manual, nilai defaultnya ditunjukkan pada tabel di bawah |
kcp_kirim ulang | bilangan bulat positif | Tergantung situasinya | Diperlukan ketika kcp=manual, nilai default ditunjukkan pada tabel di bawah |
kcp_nc | Ya BENAR 1 TIDAK PALSU 0 | Tergantung situasinya | Diperlukan ketika kcp=manual, nilai defaultnya ditunjukkan pada tabel di bawah |
bandwidth_keluar | bilangan bulat positif | TIDAK | Bandwidth keluar, digunakan untuk memperbarui nilai kcp_sndwnd secara dinamis selama komunikasi |
bandwidth_masuk | bilangan bulat positif | TIDAK | Bandwidth masuk, digunakan untuk memperbarui nilai kcp_rcvwnd secara dinamis selama proses komunikasi |
ipv4_hanya | Ya BENAR 1 TIDAK PALSU 0 | TIDAK | Jika IPv6 dinonaktifkan pada sistem, opsi ini harus diaktifkan dan diatur ke ya atau benar atau 1 |
ipv6_hanya | Ya BENAR 1 TIDAK PALSU 0 | TIDAK | Abaikan alamat IPv4 |
ledakan | Ya BENAR 1 TIDAK PALSU 0 | TIDAK | Cobalah untuk mengabaikan pengaturan kontrol aliran KCP dan meneruskan paket secepat mungkin. Dapat menyebabkan beban berlebihan |
[pendengar] | T/A | Ya (hanya mode relai) | Label mode relai, digunakan untuk menentukan KCP dalam mode mendengarkan. Menyetel label ini menunjukkan data interaksi dengan klien. |
[ekspeditur] | T/A | Ya (hanya mode relai) | Label mode relai, digunakan untuk menentukan KCP mode transfer. Menyetel label ini menunjukkan data interaksi dengan server. |
[masukan_kustom] | T/A | TIDAK | Label mode pemetaan khusus, silakan lihat metode penggunaan pemetaan khusus |
[input_tcp_kustom] | T/A | TIDAK | Label mode pemetaan khusus, silakan lihat metode penggunaan pemetaan khusus |
[kustom_input_udp] | T/A | TIDAK | Label mode pemetaan khusus, silakan lihat metode penggunaan pemetaan khusus |
Diantaranya, encryption_algorithm
dan encryption_password
harus konsisten di kedua ujung komunikasi.
nama | Nilai yang dapat diatur | Diperlukan | Komentar |
---|---|---|---|
fib_ingress | 0 - 65535 | TIDAK | FIB digunakan oleh koneksi masuk |
fib_keluar | 0 - 65535 | TIDAK | FIB digunakan untuk koneksi keluar |
Akhiran yang tersedia: K/M/G
Akhiran peka huruf besar-kecil, huruf besar dihitung sebagai biner (1024), dan huruf kecil dihitung sebagai desimal (1000).
Isikan 1000, menandakan bandwidthnya 1000 bps
Isikan 100k, menandakan bandwidth 100 kbps (100000 bps)
Isikan 100K, menandakan bandwidth 100 Kbps (102400 bps)
Isikan 100M, menandakan bandwidth 100 Mbps (102400 Kbps)
Isikan 1G yang menandakan bandwidth 1 Gbps (1024 Mbps)
Perhatikan bahwa ini bps (Bits Per Second), bukan Bps (Bytes Per Second).
Perlu diingat bahwa nilai bandwidth yang diisi tidak boleh melebihi bandwidth sebenarnya untuk menghindari kemacetan pada jendela pengiriman.
CATATAN PENTING :
KCPTube akan menghitung dan mengatur ukuran jendela pengiriman KCP berdasarkan nilai penundaan paket handshake dan nilai outbound_bandwidth dan inbound_bandwidth sekitar 5 detik setelah link KCP dibuat. Dalam jangka waktu setelah penyiapan selesai, kemungkinan besar lalu lintas akan berfluktuasi secara signifikan, atau bahkan lalu lintas tiba-tiba turun ke 0, dan perlu beberapa detik untuk pulih.
Modus cepat | kcp_sndwnd | kcp_rcvwnd | kcp_nodelay | kcp_interval | kcp_kirim ulang | kcp_nc |
---|---|---|---|---|---|---|
cepat1 | 2048 | 2048 | 1 | 1 | 2 | 1 |
cepat2 | 2048 | 2048 | 2 | 1 | 2 | 1 |
cepat3 | 2048 | 2048 | 1 | 1 | 3 | 1 |
cepat4 | 2048 | 2048 | 2 | 1 | 3 | 1 |
cepat5 | 2048 | 2048 | 1 | 1 | 4 | 1 |
cepat6 | 2048 | 2048 | 2 | 1 | 4 | 1 |
mode kecepatan normal | kcp_sndwnd | kcp_rcvwnd | kcp_nodelay | kcp_interval | kcp_kirim ulang | kcp_nc |
---|---|---|---|---|---|---|
reguler1 | 1024 | 1024 | 1 | 1 | 5 | 1 |
reguler2 | 1024 | 1024 | 2 | 1 | 5 | 1 |
reguler3 | 1024 | 1024 | 0 | 1 | 2 | 1 |
reguler4 | 1024 | 1024 | 0 | 15 | 2 | 1 |
reguler5 | 1024 | 1024 | 0 | 30 | 2 | 1 |
Diantaranya, semakin tinggi tingkat kehilangan paket (lebih tinggi dari 10%), semakin banyak keuntungan yang dimiliki kcp_nodelay=1 dibandingkan kcp_nodelay=2. Ketika tingkat kehilangan paket tidak terlalu tinggi, kcp_nodelay=2 dapat membuat jitter penundaan menjadi lebih lancar.
Untuk lingkungan dengan kehilangan paket yang rendah, setiap mode cocok untuk digunakan. Satu-satunya perbedaan terletak pada apakah lebih banyak atau lebih sedikit lalu lintas yang terbuang yang digunakan, dan batas atas kecepatan maksimumnya berbeda. Diantaranya, regular3 tidak membuang banyak lalu lintas.
Disarankan untuk mengaktifkan pengaturan blast=1
secara bersamaan.
Untuk lingkungan dengan kehilangan paket yang tinggi, pertimbangkan untuk melapisi pengaturan FEC. Untuk detailnya, silakan merujuk ke panduan penggunaan FEC.
Untuk lebih jelasnya, lihat daftar parameter.
Setelah alamat IP dan port yang dilubangi diperoleh untuk pertama kalinya, dan setelah alamat IP dan port yang dilubangi berubah, file ip_address.txt akan dibuat di direktori Log (ditimpa jika ada), dan IP alamat dan port akan ditulis ke dalamnya.
Alamat pengeboran lubang yang diperoleh akan ditampilkan di konsol secara bersamaan.
log_path=
harus menunjuk ke direktori, bukan file itu sendiri.
Jika Anda tidak perlu menulis ke file Log, hapus baris log_path
.
Server STUN umum ditemukan dari NatTypeTeste:
Server STUN ditemukan dari Natter:
Server STUN lainnya: public-stun-list.txt
Untuk kemudahan penggunaan, file biner yang dapat dieksekusi untuk berbagai platform telah disediakan:
Biner yang telah dikompilasi semuanya dikompilasi secara statis. Versi Linux pada dasarnya dikompilasi secara statis, kecuali untuk libc, jadi dua versi disiapkan, satu untuk glibc (2.31) dan yang lainnya untuk musl.
Untuk lingkungan Linux, image Docker juga disediakan (saat ini hanya x64). Unduh kcptube_docker_image.zip dan dekompresi, lalu gunakan docker load -i kcptube_docker.tar
untuk mengimpornya.
Setelah diimpor, cara penggunaannya adalah:
docker run -v /path/to/config_file.conf:/config_file.conf kcptube config_file.conf
Misalnya:
docker run -v /home/someone/config1.conf:/config1.conf kcptube config1.conf
Pengguna FreeBSD dapat menyalin file biner yang diunduh ke /usr/local/bin/
dan kemudian menjalankan perintah
chmod +x /usr/local/bin/kcptube
File layanan terkait telah disiapkan di direktori service
proyek ini.
/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"
ke /etc/rc.conf
Terakhir, jalankan service kcptube start
untuk memulai layanan
Kompiler harus mendukung C++20
Perpustakaan yang bergantung:
Silakan gunakan vcpkg untuk menginstal paket ketergantungan asio
dan botan
terlebih dahulu.
vcpkg install asio:x64-windows asio:x64-windows-static
vcpkg install botan:x64-windows botan:x64-windows-static
(Jika Anda memerlukan versi ARM atau 32-bit x86, silakan sesuaikan sendiri opsinya)
Kemudian gunakan Visual Studio untuk membuka slnkcptube.sln
dan kompilasi sendiri
Demikian pula, harap instal dependensi asio dan botan3 terlebih dahulu. Selain itu, cmake diperlukan.
pkg install asio botan3 cmake
Kemudian bangun di direktori build
mkdir build
cd build
cmake ..
make
Langkah-langkahnya mirip dengan FreeBSD. Untuk NetBSD, silakan gunakan pkgin untuk menginstal dependensi dan cmake:
pkgin install asio
pkgin install cmake
OpenBSD Silakan gunakan pkg_add
untuk menginstal dua dependensi di atas. DragonflyBSD silahkan pakai pkg
, pemakaiannya sama dengan FreeBSD.
Karena botan-3 belum disertakan dalam sistem BSD ini, Anda harus mengkompilasi sendiri botan-3.
Untuk langkah-langkah build selanjutnya, silakan merujuk ke FreeBSD di atas.
Perhatikan bahwa karena BSD ini hadir dengan versi kompiler yang lebih rendah, harap instal versi GCC yang lebih tinggi terlebih dahulu.
Langkah-langkahnya mirip dengan FreeBSD. Silakan gunakan manajer paket yang disertakan dengan distribusi untuk menginstal asio, botan3 dan cmake.
apk add asio botan3-libs cmake
Kemudian bangun di direktori build
mkdir build
cd build
cmake ..
make
Ada dua cara
Latihan 1
Kompilasi sesuai dengan proses normal, hapus file biner kcptube yang baru saja dibuat, dan jalankan perintah
make VERBOSE=1
Kemudian ekstrak perintah tautan C++ terakhir dari konten keluaran, dan ubah -lbotan-3
di tengah menjadi jalur lengkap libbotan-3.a, seperti /usr/lib/x86_64-linux-gnu/libbotan-3.a
.
Latihan 2
Buka src/CMakeLists.txt dan ubah target_link_libraries(${PROJECT_NAME} PRIVATE botan-3)
menjadi target_link_libraries(${PROJECT_NAME} PRIVATE botan-3 -static)
Kemudian dikompilasi secara normal. Perhatikan bahwa jika sistem menggunakan glibc, sistem akan dikompilasi secara statis bersama dengan glibc, dan peringatan tentang getaddrinfo akan muncul.
Saya tidak memiliki komputer Apple, jadi harap selesaikan sendiri semua langkahnya.
Meningkatkan cache penerimaan dapat meningkatkan kinerja transmisi UDP
Anda dapat menggunakan perintah sysctl kern.ipc.maxsockbuf
untuk melihat ukuran cache. Jika penyesuaian diperlukan, jalankan perintah (ubah angka ke nilai yang diinginkan):
sysctl -w kern.ipc.maxsockbuf=33554434
Atau tulis di /etc/sysctl.conf
kern.ipc.maxsockbuf=33554434
Anda dapat menggunakan perintah sysctl net.inet.udp.recvspace
untuk memeriksa ukuran buffer penerimaan. Jika penyesuaian diperlukan, jalankan perintah (ubah angka ke nilai yang diinginkan):
sysctl -w net.inet.udp.recvspace=33554434
Atau tulis di /etc/sysctl.conf
net.inet.udp.recvspace=33554434
Jika perlu, Anda dapat menyesuaikan nilai net.inet.udp.sendspace
secara bersamaan. Ini adalah pengaturan kirim cache.
Untuk cache penerimaan, Anda dapat menggunakan perintah sysctl net.core.rmem_max
dan sysctl net.core.rmem_default
untuk melihat ukuran cache penerimaan.
Jika penyesuaian diperlukan, jalankan perintah (ubah angka ke nilai yang diinginkan):
sysctl -w net.core.rmem_max=33554434
sysctl -w net.core.rmem_default=33554434
Atau tulis di /etc/sysctl.conf
net.core.rmem_max=33554434
net.core.rmem_default=33554434
Jika perlu, Anda dapat menyesuaikan nilai net.core.wmem_max
dan net.core.wmem_default
secara bersamaan. Ini adalah pengaturan kirim cache.
Karena kcptube secara internal menggunakan tumpukan tunggal IPv6 + mengaktifkan alamat yang dipetakan IPv4 (IPv6 yang dipetakan IPv4) untuk menggunakan jaringan IPv4 dan IPv6, harap pastikan bahwa nilai opsi v6only adalah 0.
Dalam keadaan normal, tidak diperlukan pengaturan tambahan. FreeBSD, Linux dan Windows semuanya mengizinkan alamat IPv4 dipetakan ke IPv6 secara default.
Jika sistem tidak mendukung IPv6, atau IPv6 dinonaktifkan, harap setel ipv4_only=true di file konfigurasi, sehingga kcptube akan kembali menggunakan mode tumpukan tunggal IPv4.
Gunakan perintah
sysctl -w net.inet6.ip6.v6only=0
Setelah pengaturan, mode tumpukan tunggal + alamat yang dipetakan dapat mendengarkan tumpukan ganda.
Namun, karena alasan yang tidak diketahui, alamat IPv4 yang dipetakan mungkin tidak tersambung secara aktif.
Karena OpenBSD sepenuhnya memblokir alamat pemetaan IPv4, jika Anda menggunakan dual stack pada platform OpenBSD, Anda perlu menyimpan dua file konfigurasi, salah satunya mengaktifkan ipv4_only=1, dan kemudian memuat kedua file konfigurasi secara bersamaan saat menggunakan kcptube.
Dalam kebanyakan kasus, prompt ini hanya akan ditemui di sisi server, bukan di sisi klien.
Jika memang ditemui di klien, harap periksa apakah nilai mux_tunnels
terlalu tinggi (silakan lihat paragraf "Multiplexing (mux_tunnels=N)").
Dalam keadaan normal, sebagian besar sistem BSD tidak akan mengalami hal seperti ini. Hanya GhostBSD yang akan diperbarui pada paruh kedua tahun 2023 yang akan mengalami fenomena ini.
Ini karena GhostBSD menambahkan baris ini ke /etc/sysctl.conf
:
kern.maxfiles=100000
Baris ini mengurangi batas atas menjadi jauh lebih rendah daripada nilai terkait di vanilla FreeBSD.
Solusinya sederhana, hapus saja baris ini. Anda juga dapat mengomentarinya.
Anda juga dapat menggunakan perintah sysctl kern.maxfiles=300000
untuk mengubah sementara nilai batas atas.
Karena jumlah File Terbuka di sistem Linux dibatasi hingga 1024, masalah ini mudah terjadi.
Solusi sementara:
ulimit -n
untuk melihat nilai keluaranulimit -n 300000
Solusi permanen:
Edit /etc/security/limits.conf dan tambahkan di akhir
* hard nofile 300000
* soft nofile 300000
root hard nofile 300000
root soft nofile 300000
Karena data TCP perlu dikirim, validasi data tidak dapat diabaikan, sama seperti TCP itu sendiri.
Terlepas dari apakah itu dienkripsi atau tidak, kcptube akan mengurangi MTU sebesar 2 byte dan menambahkan 2 byte data.
Jika opsi enkripsi telah digunakan, 2 byte data yang ditambahkan adalah IV yang dibuat sementara.
Jika Anda memilih untuk tidak menggunakan fungsi enkripsi, data 2-byte yang ditambahkan adalah kode pemeriksaan, yang merupakan XOR bit tinggi dan rendah CRC32.
Perlu diingat bahwa penggunaan kode cek masih tidak dapat 100% mencegah kesalahan konten, dan hal yang sama juga berlaku untuk TCP itu sendiri. Jika Anda benar-benar ingin lebih akurat, aktifkan opsi enkripsi.
Meskipun KCP Tube memiliki fungsi "multiplexing", namun secara default tidak dibuka secara aktif. Tanpa fitur ini, untuk setiap koneksi masuk yang diterima, koneksi keluar yang sesuai akan dibuat.
Alasannya untuk menghindari QoS operator. Dalam keadaan multiplexing, setelah nomor port tertentu mencapai QoS, sesi lain yang berbagi nomor port yang sama akan diblokir pada saat yang sama hingga nomor port diubah.
Koneksi tidak bergantung satu sama lain. Meskipun nomor port tertentu adalah QoS, hanya sesi ini yang akan terpengaruh dan sesi lainnya tidak akan terpengaruh.
Kecuali jika program yang dihosting menghasilkan koneksi independen dalam jumlah besar. Dalam hal ini, KCP Tube akan membuat saluran KCP dalam jumlah besar, yang akan menghabiskan lebih banyak sumber daya CPU selama proses komunikasi.
Jika Anda benar-benar ingin menggunakan fungsi "multiplexing", Anda dapat merujuk ke kategori berikut:
Skenario yang cocok untuk menggunakan "multiplexing":
Skenario di mana "multiplexing" tidak diperlukan:
Ketika "Multiplexing" diaktifkan, KCPTube akan membuat N tautan terlebih dahulu, dan semua koneksi baru yang masuk akan mengirimkan data dari tautan yang ada alih-alih membuat tautan baru secara terpisah. Saat ini, waktu tunggu saluran KCP adalah 30 detik.
Secara umum, menyetel `mux_tunnels ke 3 ~ 10 sudah cukup, dan tidak perlu menyetel nilai terlalu tinggi.
Untuk mengurangi latensi, kcptube mengaktifkan opsi TCP_NODELAY. Untuk beberapa skenario aplikasi lalu lintas besar, jumlah transmisi data TCP mungkin dikurangi.
Berdasarkan KCP asli, dilakukan modifikasi sebagai berikut:
flush()
asli pertama-tama mentransfer data yang akan dikirim ke antrian pengiriman, dan kemudian mengulangi tiga hal yaitu "mengirim paket data baru", "mengirim ulang paket data", dan "mengirim paket ACK" dalam siklus yang sama. Versi modifikasi pertama-tama melakukan "transmisi ulang paket data" dan "transmisi paket ACK", lalu "mentransfer data yang akan dikirim ke antrian pengiriman", dan mengirimkannya selama periode transfer.check()
asli akan melintasi antrian pengiriman lagi setiap kali untuk menemukan stempel waktu transmisi ulang dari titik yang dicapai. Versi modifikasi menjadi: membaca stempel waktu pertama dari tabel pemetaan yang diurutkan, menghilangkan langkah pencarian.Selain itu, versi aslinya memiliki "bug", dan kcptube juga memilikinya. Misalnya:
Jadi kcptube menyiapkan rencana penangguhan yang lebih jelas. Untuk data TCP, ketika batas penerimaan tercapai (antrian penuh), penerimaan data TCP akan dihentikan sampai ada ruang dan kemudian dilanjutkan kembali untuk data UDP, paket akan langsung hilang ketika batas penerimaan tercapai.
Batasan ini pada dasarnya tidak akan berdampak pada skenario aplikasi yang volume transmisinya tidak besar.
Kumpulan thread yang digunakan oleh kcptube berasal dari BS::thread_pool, dengan beberapa modifikasi untuk enkripsi paralel dan pemrosesan dekripsi selama beberapa koneksi.
Kodenya ditulis dengan sangat santai, dan saya menulisnya di mana pun saya berpikir, sehingga tata letaknya membingungkan. Tepatnya, ini sangat membingungkan.
Beberapa baris kodenya sepanjang batang bambu, terutama karena saya terlalu malas mengubah baris demi mengikuti alur pemikiran saat menulis. Lagi pula, saya tidak menggunakan vim/emacs. Saat saya menggunakan IDE, ukuran teks yang disetel di area kode IDE berbeda dengan ukuran teks di area lain, dan bahkan fontnya pun berbeda, yang membantu saya mengatasi masalah kebingungan.
Adapun perasaan pembaca... pasti tidak akan senang. Itu bukan urusanku, biarkan saja.