영어 버전을 보려면 여기를 클릭하세요.
3개 주요 통신업체의 홈 광대역을 사용해 본 적이 있고 홈 광대역 상호 연결이 필요한 사람이라면 거의 항상 UDP 속도 제한을 경험하게 될 것입니다. UDP의 세 가지 주요 사업자의 QoS를 피하기 위해 UDP Hop이라는 또 다른 도구를 만들었습니다. 원칙은 정기적으로 새로운 연결을 설정하는 것입니다(포트 번호 변경 및 새 주소에 연결).
그러나 UDP 홉은 UDP 트래픽 전달만 지원합니다. UDP를 사용하여 TCP 트래픽을 전달하려면 KCP Tube가 있습니다. KCP의 안정적인 재전송은 전달된 TCP 패킷이 손실되지 않도록 보장하는 데 사용됩니다.
KCP Tube를 만드는 또 다른 이유는 다른 KCP 전달 도구는 TCP 트래픽만 전달할 수 있지만 UDP 트래픽을 전달하려면 KCP를 사용해야 하기 때문입니다. 주로 게임 플레이의 편의를 위해.
물론 udphop과 kcptube는 실제로 동시에 고안되었습니다. 그래서 편의상 먼저 KCP Tube를 설정하고 프레임워크를 설정한 후, KCP Tube를 기반으로 UDP Hop으로 잘라냅니다. 그런 다음 UDP 홉 패치 코드를 다시 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 주소만 입력할 수 있습니다. 주소가 여러 개인 경우 쉼표로 구분하세요. |
Listen_port | 1-65535 | 예 | 서버로 실행하는 경우 포트 범위를 지정할 수 있습니다. |
목적지_항구 | 1-65535 | 예 | 클라이언트로 실행할 때 포트 범위를 지정할 수 있습니다. 주소가 여러 개인 경우 쉼표로 구분하세요. |
목적지_주소 | IP 주소, 도메인 이름 | 예 | IPv6 주소를 입력할 때 대괄호는 필요하지 않습니다. |
dport_refresh | 0 - 32767 | 아니요 | 단위는 "초"입니다. 공백으로 두면 기본값인 60초가 사용됩니다. 1~20은 20초로 계산되고, 32767보다 크면 32767초로 계산됩니다. 비활성화하려면 0으로 설정합니다. |
암호화_알고리즘 | AES-GCM AES-OCB 차차20 xchacha20 없음 | 아니요 | AES-256-GCM-AEAD AES-256-OCB-AEAD 차차20-폴리1305 XChaCha20-Poly1305 암호화 없음 |
암호화_비밀번호 | 모든 문자 | 상황에 따라 다름 | 암호화 알고리즘이 설정되어 있고 없음이 아닌 경우 필수 |
udp_timeout | 0 - 65535 | 아니요 | 단위는 "초"입니다. 기본값은 180초이며, 0으로 설정하면 기본값이 사용됩니다. 이 옵션은 UDP 애플리케이션 ⇔ kcptube 사이의 시간 초과 설정을 나타냅니다. |
keep_alive | 0 - 65535 | 아니요 | 단위는 "초"입니다. 기본값은 0이며 이는 Keep Alive를 비활성화하는 것과 같습니다. 이 옵션은 두 KCP 끝 사이의 연결 유지를 나타냅니다. 채널이 응답하지 않는지 감지하기 위해 일방적으로 활성화할 수 있습니다. 30초 후에도 응답이 없으면 채널이 닫힙니다. |
mux_tunnels | 0 - 65535 | 아니요 | 기본값은 0이며 이는 멀티플렉싱 채널을 사용하지 않는 것과 동일합니다. 이 옵션은 두 KCP 끝 사이의 멀티플렉싱 채널 수를 나타냅니다. |
stun_server | STUN 서버 주소 | 아니요 | Listen_port가 포트 범위 모드인 경우에는 사용할 수 없습니다. |
로그_경로 | 로그를 저장할 디렉터리 | 아니요 | 파일 자체를 가리킬 수 없습니다 |
독립 단기 치료소 | 단위8:단위8 | 아니요 | 형식은 fec=D:R 입니다. 예를 들어 fec=20:3 입력할 수 있습니다.참고: D + R의 최대 총 값은 255이며 이 숫자를 초과할 수 없습니다. 콜론 양쪽의 값이 0이면 해당 옵션이 사용되지 않음을 나타냅니다. 설정은 양쪽 끝에서 동일해야 합니다. 자세한 내용은 FEC 사용 가이드를 참고하세요. |
MTU | 양의 정수 | 아니요 | kcp_mtu를 자동으로 계산하는 데 사용되는 현재 네트워크 MTU 값 |
kcp_mtu | 양의 정수 | 아니요 | 기본값은 1440입니다. ikcp_setmtu()를 호출하여 설정한 값은 UDP 패킷의 데이터 내용 길이입니다. |
kcp | 수동 빠른1-6 일반1~5 | 예 | 빠른 정상 속도를 수동으로 설정 (끝의 숫자 : 값이 작을수록 속도가 빨라짐) |
kcp_sndwnd | 양의 정수 | 아니요 | 기본값은 아래 표에 나와 있으며 개별적으로 재정의할 수 있습니다. |
kcp_rcvwnd | 양의 정수 | 아니요 | 기본값은 아래 표에 나와 있으며 개별적으로 재정의할 수 있습니다. |
kcp_nodelay | 양의 정수 | 상황에 따라 다름 | kcp=manual인 경우 필수이며 기본값은 아래 표에 나와 있습니다. |
kcp_간격 | 양의 정수 | 상황에 따라 다름 | kcp=manual인 경우 필수이며 기본값은 아래 표에 나와 있습니다. |
kcp_재전송 | 양의 정수 | 상황에 따라 다름 | kcp=manual인 경우 필수이며 기본값은 아래 표에 나와 있습니다. |
kcp_nc | 예 진실 1 아니요 거짓 0 | 상황에 따라 다름 | kcp=manual인 경우 필수이며 기본값은 아래 표에 나와 있습니다. |
아웃바운드_대역폭 | 양의 정수 | 아니요 | 통신 중에 kcp_sndwnd 값을 동적으로 업데이트하는 데 사용되는 아웃바운드 대역폭 |
인바운드_대역폭 | 양의 정수 | 아니요 | 통신 프로세스 중에 kcp_rcvwnd 값을 동적으로 업데이트하는 데 사용되는 인바운드 대역폭 |
ipv4_only | 예 진실 1 아니요 거짓 0 | 아니요 | 시스템에서 IPv6가 비활성화된 경우 이 옵션을 활성화하고 yes, true 또는 1로 설정해야 합니다. |
ipv6_only | 예 진실 1 아니요 거짓 0 | 아니요 | IPv4 주소 무시 |
폭발 | 예 진실 1 아니요 거짓 0 | 아니요 | KCP 흐름 제어 설정을 무시하고 최대한 빨리 패킷을 전달하십시오. 과도한 부하를 유발할 수 있음 |
[경청자] | 해당 없음 | 예 (릴레이 모드만 해당) | 청취 모드에서 KCP를 지정하는 데 사용되는 릴레이 모드의 레이블입니다. 이 레이블을 설정하면 클라이언트와의 상호 작용 데이터가 표시됩니다. |
[포워더] | 해당 없음 | 예 (릴레이 모드만 해당) | 전송 모드의 KCP를 지정하는 데 사용되는 릴레이 모드의 레이블입니다. 이 레이블을 설정하면 서버와의 상호 작용 데이터가 표시됩니다. |
[맞춤_입력] | 해당 없음 | 아니요 | 커스텀 매핑 모드 라벨, 커스텀 매핑 사용 방법을 참고하세요. |
[custom_input_tcp] | 해당 없음 | 아니요 | 커스텀 매핑 모드 라벨, 커스텀 매핑 사용 방법을 참고하세요. |
[custom_input_udp] | 해당 없음 | 아니요 | 커스텀 매핑 모드 라벨, 커스텀 매핑 사용 방법을 참고하세요. |
그 중 encryption_algorithm
과 encryption_password
통신의 양쪽 끝에서 일관되어야 합니다.
이름 | 설정 가능한 값 | 필수의 | 주목 |
---|---|---|---|
fib_ingress | 0 - 65535 | 아니요 | 인바운드 연결에 사용되는 FIB |
fib_egress | 0 - 65535 | 아니요 | 아웃바운드 연결에 사용되는 FIB |
사용 가능한 접미사: K/M/G
접미사는 대소문자를 구분하며, 대문자는 이진수(1024)로, 소문자는 십진수(1000)로 계산됩니다.
1000을 입력하면 대역폭이 1000bps임을 나타냅니다.
100k를 입력하면 대역폭이 100kbps(100000bps)임을 나타냅니다.
100K를 입력하면 대역폭이 100Kbps(102400bps)임을 나타냅니다.
100M을 입력하면 대역폭이 100Mbps(102400Kbps)임을 나타냅니다.
1G를 입력하면 대역폭이 1Gbps(1024Mbps)임을 나타냅니다.
Bps(초당 바이트)가 아니라 bps(초당 비트)라는 점에 유의하세요.
전송 창의 혼잡을 피하기 위해 채워진 대역폭 값은 실제 대역폭을 초과해서는 안 된다는 점을 기억해야 합니다.
중요 참고 사항 :
KCPTube는 KCP 링크가 설정된 후 약 5초 후에 핸드셰이크 패킷의 지연 값과 outbound_bandwidth 및 inbound_bandwidth 값을 기반으로 KCP 전송 창 크기를 계산하고 설정합니다. 설정이 완료된 후 일정 시간 내에 트래픽이 크게 변동할 가능성이 높으며 심지어 트래픽이 갑자기 0으로 떨어질 수도 있으며 복구하는 데 몇 초가 소요됩니다.
빠른 모드 | kcp_sndwnd | kcp_rcvwnd | kcp_nodelay | kcp_간격 | kcp_재전송 | 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 |
fast6 | 2048년 | 2048년 | 2 | 1 | 4 | 1 |
일반 속도 모드 | kcp_sndwnd | kcp_rcvwnd | kcp_nodelay | kcp_간격 | kcp_재전송 | 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 주소와 포트가 변경된 후 Log 디렉터리에 ip_address.txt 파일이 생성되고(존재하는 경우 덮어쓰기) IP 주소와 포트가 기록됩니다.
획득한 홀 드릴링 주소가 동시에 콘솔에 표시됩니다.
log_path=
파일 자체가 아닌 디렉터리를 가리켜야 합니다.
로그 파일에 쓸 필요가 없으면 log_path
행을 삭제하십시오.
NatTypeTeste에서 발견된 일반적인 STUN 서버:
Natter에서 찾은 STUN 서버:
기타 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
/etc/rc.conf
에 kcptube_enable="YES"
줄을 추가하세요. 마지막으로 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를 사용하여 설치할 수 있습니다.
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 매핑 주소(IPv4 매핑 IPv6)를 켜서 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
값이 너무 높은지 확인하십시오("Multiplexing (mux_tunnels=N)" 단락 참조).
정상적인 상황에서는 대부분의 BSD 시스템에서는 이러한 현상이 발생하지 않습니다. 2023년 하반기에 업데이트될 GhostBSD에서만 이러한 현상이 발생합니다.
이는 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바이트 데이터는 CRC32의 상위 비트와 하위 비트를 XOR한 검사 코드입니다.
체크 코드를 사용해도 콘텐츠 오류를 100% 예방할 수는 없으며 TCP 자체도 마찬가지라는 점을 기억해야 합니다. 정말 정확해야 하는 경우 암호화 옵션을 활성화하세요.
KCP Tube에는 "멀티플렉싱" 기능이 있지만 기본적으로는 적극적으로 열리지 않습니다. 이 기능이 없으면 허용되는 모든 인바운드 연결에 대해 해당 아웃바운드 연결이 생성됩니다.
그 이유는 사업자의 QoS를 피하기 위함이다. 다중화 상태에서는 특정 포트 번호가 QoS가 되면 포트 번호가 변경될 때까지 동일한 포트 번호를 공유하는 다른 세션이 동시에 차단됩니다.
연결은 서로 독립적입니다. 특정 포트 번호가 QoS인 경우에도 해당 세션만 영향을 받고 다른 세션은 영향을 받지 않습니다.
호스팅된 프로그램이 다수의 독립적인 연결을 생성하지 않는 한. 이 경우 KCP Tube는 많은 수의 KCP 채널을 생성하므로 통신 프로세스 중에 더 많은 CPU 리소스를 소비하게 됩니다.
"멀티플렉싱" 기능을 실제로 사용하려면 다음 범주를 참조하세요.
"멀티플렉싱" 사용에 적합한 시나리오:
"멀티플렉싱"이 필요하지 않은 시나리오:
"멀티플렉싱"이 활성화되면 KCPTube는 N개의 링크를 미리 생성하고 모든 인바운드 새 연결은 새 링크를 별도로 생성하는 대신 기존 링크에서 데이터를 전송합니다. 이때 KCP 채널의 타임아웃 시간은 30초입니다.
일반적으로 `mux_tunnels를 3~10으로 설정하면 충분하며 너무 높은 값을 설정할 필요는 없습니다.
대기 시간을 줄이기 위해 kcptube는 TCP_NODELAY 옵션을 활성화합니다. 일부 대규모 트래픽 애플리케이션 시나리오의 경우 TCP 데이터 전송량이 줄어들 수 있습니다.
원본 KCP를 기반으로 다음과 같은 수정이 이루어졌습니다.
flush()
먼저 보낼 데이터를 보내는 큐로 전송한 다음 "새 데이터 패킷 보내기", "데이터 패킷 다시 보내기", "ACK 패킷 보내기"의 세 가지 작업을 동일한 주기로 다시 수행합니다. 수정된 버전은 먼저 "데이터 패킷 재전송"과 "ACK 패킷 전송"을 수행한 후 "전송할 데이터를 송신 큐로 전송"하여 전송 기간 동안 전송합니다.check()
도달한 지점의 재전송 타임스탬프를 찾기 위해 매번 전송 대기열을 다시 순회합니다. 수정된 버전은 다음과 같습니다. 정렬된 매핑 테이블에서 첫 번째 타임스탬프를 읽고 검색 단계를 제거합니다.또한 원본 버전에는 "버그"가 있으며 kcptube에도 "버그"가 있습니다. 예를 들어:
그래서 kcptube는 좀 더 확실한 정지 계획을 세웠습니다. TCP 데이터의 경우 수신 제한에 도달하면(큐가 꽉 찼을 때) 공간이 확보될 때까지 TCP 데이터 수신이 일시 중지되고 UDP 데이터의 경우 수신 제한에 도달하면 패킷이 직접 손실됩니다.
이 제한은 기본적으로 전송량이 크지 않은 애플리케이션 시나리오에는 영향을 미치지 않습니다.
kcptube에서 사용하는 스레드 풀은 BS::thread_pool에서 가져오며 여러 연결 중 병렬 암호화 및 암호 해독 처리를 위해 일부 수정되었습니다.
코드가 아주 캐주얼하게 작성되어 있고, 생각나는 대로 작성하다보니 레이아웃이 헷갈리네요. 정확히 말하면 매우 혼란스럽습니다.
일부 코드 줄은 대나무 장대만큼 깁니다. 주로 글을 쓸 때 생각의 흐름을 따르기 위해 줄을 바꾸는 것이 너무 게으른 탓입니다. 결국 나는 vim/emacs를 사용하지 않습니다. IDE를 사용할 때 IDE의 코드 영역에 설정된 텍스트 크기가 다른 영역의 텍스트 크기와 다르고 심지어 글꼴까지 다르기 때문에 혼동 문제를 완화하는 데 도움이 됩니다.
독자들의 감정은... 분명 불행할 겁니다. 그건 내 알 바 아니니, 그냥 놔두세요.