
USTP의 보안(AEAD 적용) 버전으로, USTP-Secure(ustps://)라고 합니다.
USTP는 UDP Speedy Transmission Protocol을 의미합니다.
USTP는 동일한 인증 전송 모델을 유지하지만, 프로젝트 이름은 이제 다시 단순히 USTP입니다.
기본적으로 USTP는 DATA에 AEAD를 사용합니다.
또한 DATA에 대해 선택적으로 협상되는 cleartext + HMAC 모드도 지원하며, 이 모드에서는 페이로드 바이트가 전송 중에 노출되지만 변조는 감지되어 거부됩니다.
USTP는 이제 USTP Congestion이라는 선택적 혼잡 제어기를 지원합니다. 여전히 UDP 우선이지만, 경로에서 혼잡 신호가 나타나기 시작하면 선택적으로 속도를 늦추고 다시 끌어올릴 수 있습니다.
상태: Beta
USTP는 더 이상 단순한 개념 증명이 아닙니다. 현재 Beta 단계에 있습니다.
USTP는 다양한 종류의 애플리케이션과 전송에 사용될 수 있습니다.
그러나 이 저장소는 특히 USTP를 통한 스트리밍에 초점을 맞추고 있습니다.
02/08/2026: USTP-Secure가 이제 다시 USTP로 돌아왔습니다.
USTP-Secure는 오래된 프로젝트 이름이었으며 더 이상 프로젝트에 적합하지 않습니다.USTP 이름이 이제 다시 선호됩니다.UDP Speedy Transmission Protocol이며, 제목에 Secure가 없습니다.2026-07-18: USTP/2 Beta가 현재 트리에서 제거되었습니다.
GPT-5.4 (Low)를 사용하여 Codex로 빌드되었습니다.--loss 33에서 멈춤 없이 검증되었습니다.Brazil -> Canada, 약 140ms RTT.chacha20 = CHACHA20_POLY1305aes-256-gcm = AES_256_GCMaes-128-gcm = AES_128_GCMchacha20DATA 보호 모드는 AEAD입니다.DATA 보호 모드는 cleartext + 패킷별 HMAC입니다.HELLO, ACK, RETRANSMIT_REQUEST, CLOSE)은 의도적으로 평문으로 유지됩니다.ACK 및 NACK/RETRANSMIT_REQUEST는 평문으로 유지되지만, 세션별 HMAC 태그로 인증됩니다.DATA 패킷은 UPACK(UPAK on the wire)이라는 바이너리 프레임 형식을 사용합니다.IP:port에서 챌린지 왕복을 통해 클라이언트를 검증합니다.--cipher가 설정된 경우, 서버는 해당 정확한 암호를 사용합니다.--cipher가 생략되거나 auto로 설정된 경우, 서버는 클라이언트가 요청한 암호를 사용합니다.DATA 보호 모드는 암호 선택과 별도로 협상됩니다:
--cleartext auto|on|off--cleartext on|offautooffauto인 경우, 서버는 클라이언트 요청을 따릅니다.on인 경우, 서버는 cleartext + HMAC을 강제합니다.off인 경우, 서버는 AEAD를 강제합니다.~/.ustps_host_key에 영구 X25519 호스트 키를 유지하여 TOFU가 재연결 및 재시작 전반에 걸쳐 안정적으로 유지되도록 합니다.--regen-key를 사용하십시오.ACK:, NACK:, HELLO:, CLOSE:는 평문 제어 레코드 접두사입니다.USS1은 UDP Speedy Secure, 버전 1을 의미합니다.USC1은 UDP Speedy Clear, 버전 1을 의미합니다.UPAK은 바이너리 UPACK DATA 프레임 마커입니다.ACK: 10, NACK: 42, HELLO: ..., CLOSE:와 같이 사람이 읽을 수 있는 ASCII입니다.UPAK은 복호화 후 바이너리 DATA 패킷을 식별합니다.USS1은 외부 보안 AEAD 봉투 형식입니다.USC1은 외부 평문+HMAC DATA 봉투 형식입니다.DATA의 경우 USS1...DATA의 경우 USC1...USTP Congestion과 함께 실행될 수 있습니다.seq와 애플리케이션 측 stream_pos를 모두 포함합니다.seq는 ACK, 손실 감지, 재전송, RTT 샘플링에 사용됩니다.stream_pos는 애플리케이션에 페이로드가 논리적 바이트 스트림의 어디에 속하는지 알려줍니다.seq는 각 새 세션마다 1에서 시작하는 32비트 카운터입니다.stream_pos는 각 새 논리적 스트림마다 0에서 시작하는 64비트 바이트 카운터입니다.on 또는 off), 요청 DATA 보호 모드(cleartext on|off)를 담은 평문 전송 HELLO로 시작합니다.session_idDATA 보호 모드DATA 전송을 시작합니다.IP:port에 바인딩됩니다.session_id는 여전히 세션 레이블로 사용되지만, 다른 IP:port에서는 수락되지 않습니다.HELLO 전송token, session_id, 선택된 암호, 협상된 혼잡 제어 모드, 협상된 DATA 보호 모드, 서버 공개 키를 담은 USTPS-CHALLENGE1로 응답USTPS-CHALLENGE-REPLY1에서 해당 토큰을 그대로 반환USTPS-SESSION1 전송IP:port의 발신자가 실제로 그곳에서 패킷을 수신할 수 있음을 증명USTP이지만, 여러 온와이어 ASCII 식별자는 여전히 역사적 USTPS-* 접두사를 사용합니다.USTPS-KEX1USTPS-CHALLENGE1USTPS-CHALLENGE-REPLY1USTPS-SESSION1USTPS-RESUME1USTPS-RTT1USTP로 다시 변경되었지만, 해당 역사적 온와이어 식별자는 프로토콜 바이트에서 이름이 변경되지 않았습니다.UPACK DATA 페이로드 제한: 900 바이트.UPACK 고정 헤더: 20 바이트.USS1 보안 봉투 오버헤드:
4 바이트 매직1 바이트 암호 id12 바이트 AEAD 논스16 바이트 AEAD 태그953 바이트입니다.USC1 클리어텍스트 봉투 오버헤드:
4 바이트 매직16 바이트 HMAC 태그940 바이트입니다.981 바이트, 클리어텍스트 모드에서 약 968 바이트가 됩니다.1001 바이트, 클리어텍스트 모드에서 약 988 바이트가 됩니다.seq가 이미 수락된 후에는 무시됩니다.DATA 암호화는 암호화된 각 패킷마다 새롭게 무작위로 생성된 12 바이트 AEAD 논스를 사용합니다.seq에서 파생되지 않습니다.seq는 전송 신뢰성을 위한 것입니다.stream_pos는 논리적 애플리케이션 순서를 위한 것입니다.nonce는 오직 AEAD 패킷 보호만을 위한 것입니다.DATA에 AEAD 암호화를 사용하지 않으므로 AEAD 논스를 사용하지 않습니다.USTP Congestion은 선택 사항입니다.--congestion-control auto|on|off--congestion-control on|offautooffauto이면 서버는 클라이언트가 요청한 것을 따릅니다on이면 클라이언트가 off를 요청했더라도 혼잡 제어가 강제로 켜집니다off이면 클라이언트가 on을 요청했더라도 혼잡 제어가 강제로 꺼집니다RTT, 재전송 타임아웃 이벤트(RTO), 명시적 재전송 요청(NACK)을 관찰합니다RTT가 증가하거나, RTO가 발생하기 시작하거나, 손실/재전송 압력이 높아지면 후퇴합니다USTP Congestion은 속도 압력을 제어하며, 신뢰성 의미론을 제어하지 않습니다.IP:port가 바뀌면, 현재 세션은 종료되는 것으로 간주되며 클라이언트는 깔끔하게 재연결해야 합니다.session_id를 주장하는 스푸핑된 패킷 간의 모호성IP:port에서 챌린지로 도달 가능성을 증명하고, 세션을 해당 엔드포인트에 바인딩하며, 엔드포인트가 변경되면 재연결합니다.ACK는 ACK: 10 MAC:<tag> 또는 배치 형태인 ACK: 10 11 12 ... MAC:<tag>로 직렬화됩니다.RETRANSMIT_REQUEST는 NACK: 42 MAC:<tag> 또는 배치 형태인 NACK: 42 43 44 ... MAC:<tag>로 직렬화됩니다.HELLO는 HELLO: <base64-payload>로 직렬화됩니다.CLOSE는 CLOSE:로 직렬화됩니다.DATA는 미디어 페이로드 패킷의 비대화를 피하기 위해 ASCII 대신 바이너리 UPACK 프레임 형식을 사용합니다.UPAK... DATA 프레임이 되는 암호화된 USS1... 데이터그램으로 구성됩니다.UPACK 바이트 및 HMAC 태그를 담은 인증된 USC1... 데이터그램으로 구성됩니다.MAC:<tag> 값은 세션 키로부터 계산되며, 패킷이 전송 상태 머신에 도달하기 전에 검증 후 제거됩니다.