요약

  • QUIC 커넥션 ID는 엔드포인트가 선택하는 라우팅 및 디멀티플렉싱 핸들입니다. 커넥션은 여러 ID를 풀로 가질 수 있어, IP 주소나 UDP 포트가 바뀐 뒤에도 패킷이 올바른 커넥션에 도달할 수 있습니다.
  • 유효한 ID를 담고 있다고 해서 새 경로가 승인되는 것은 아닙니다. QUIC는 예측 불가능한 PATH_CHALLENGE/PATH_RESPONSE 데이터로 새 주소를 별도로 검증하고, 검증 전에는 전송량을 제한합니다.
  • 커넥션 연속성이 경로 근거를 이식 가능하게 만들지는 않습니다. 혼잡 제어와 RTT 상태는 보통 다시 시작되고, 새 ID는 네트워크 간 연결 지표를 줄이며, 스테이트리스 리셋은 커넥션 상태를 잃은 엔드포인트를 위해 예약되어 있습니다.

작업이 끝나기 전에 주소가 바뀌었다

노트북이 Wi-Fi를 벗어나 이동통신을 사용합니다. NAT가 매핑을 만료시키고 다른 UDP 포트를 할당합니다. 두 경우 모두 네트워크 주소 튜플은 바뀌지만, 양쪽 엔드포인트가 이해하는 스트림, 승인, 보호된 상태는 그대로 남아 있습니다.

모든 변화를 새 커넥션으로 취급하는 방식은 단순하지만, 주소 튜플에게 그 위에 존재하는 작업에 대한 권한을 부여합니다. QUIC는 더 좁은 계약을 선택했습니다.RFC 8999는 커넥션 ID를 버전 독립적인 불투명 필드로 정의합니다. 그 1차 기능은 UDP, IP 또는 그 아래 계층의 변화가 패킷을 잘못된 QUIC 엔드포인트로 보내지 않도록 하는 것이며, 엔드포인트에서는 의도된 커넥션을 선택합니다.

이 필드는 하나의 영구 이름이 아닙니다.RFC 9000에 따르면 커넥션은 엔드포인트들이 독립적으로 선택한 식별자 집합을 소유합니다. 각 엔드포인트는 자신에게 향하는 패킷에 피어가 넣을 값을 선택합니다. 이 방향성은 놓치기 쉽습니다: 수신자가 자신에게 들어오는 트래픽이 자신을 찾을 수 있게 하는 라우팅 핸들을 발행합니다.

풀이 연속성을 대체 가능하게 만든다

수립 과정에서는 롱 헤더가 소스와 목적지 식별자를 담습니다. 이후 숏 헤더는 길이가 이미 알려진 목적지 커넥션 ID를 보통 담습니다. 엔드포인트는NEW_CONNECTION_ID로 추가 값을 제공할 수 있고, 피어는RETIRE_CONNECTION_ID로 값을 제거합니다. 시퀀스 번호가 발행과 은퇴의 순서를 유지하며,active_connection_id_limit이 유지해야 하는 활성 값의 수를 제한합니다.

풀은 단순한 고갈 이상의 문제를 해결합니다. 경로가 바뀔 때 피어가 보이는 핸들을 바꿀 수 있게 합니다. RFC 9000은 발행된 ID가 외부의 협력하지 않는 관찰자가 한 커넥션의 서로 다른 값을 연관시킬 수 있는 정보를 담지 말 것을 요구합니다. 같은 커넥션에서 같은 값을 재발행하는 것은 금지됩니다.

길이 0 ID는 주소 정보만으로 로컬 트래픽을 라우팅할 수 있는 곳에서 허용됩니다. 겉보기 절약에는 한계가 있습니다. 하나의 로컬 주소와 포트를 여러 길이 0 커넥션이 공유하면, 피어 마이그레이션, NAT 리바인딩, 클라이언트 포트 재사용 상황에서 취약해집니다. 핸드셰이크에서 길이 0을 선택한 엔드포인트는 이후 일반 대체 ID를 발행할 수 없습니다. 필드를 제거해도 커넥션을 구분해야 할 필요가 사라지지 않으며, 그 필요를 주소나 배포별 상태로 되돌려 놓을 뿐입니다.

핸드셰이크에 쓰인 식별자는 패킷에 나타났다는 이유만으로 신뢰받지 않습니다. RFC 9000은 관련 값을 트랜스포트 파라미터에 반복하고 암호화 핸드셰이크를 통해 검증합니다.RFC 9001은 TLS 1.3과 패킷 보호 맥락을 제공합니다. 이는 주입자가 성공한 핸드셰이크의 ID를 선택하는 것을 막습니다. 그러나 이 때문에 베어 커넥션 ID가 자격 증명, 서버 인증서 또는 인간 신원이 되는 것은 아닙니다.

마이그레이션은 새 경로를 증명해야 한다

커넥션 ID는 연속성을 허용하지만, 새로 관측된 소스 주소가 피어에 속한다는 것을 증명하지 않습니다. 그래서 RFC 9000은 마이그레이션을 경로 검증과 분리합니다.

활성 마이그레이션은 핸드셰이크가 확인된 후에만 시작됩니다. 변화는 비자발적일 수도 있습니다: NAT 리바인딩이 애플리케이션의 요청 없이 공개 포트나 주소를 바꿀 수 있습니다. 이미 검증되지 않은 새 피어 주소를 보면 엔드포인트는 예측 불가능한 데이터를 담은PATH_CHALLENGE를 보냅니다. 피어는 챌린지가 도착한 경로에서 그 데이터를PATH_RESPONSE로 되돌려 보냅니다.

결과는 의도적으로 좁습니다. 한 IP·포트 쌍으로 보낸 챌린지가 바인딩된 응답을 만들 수 있는 존재에 도달했다는 것만 보여줍니다. 합법적 소유, 선의의 의도, 경로 최적성, 영구적 도달 가능성의 증거가 아닙니다. 각 방향의 검증은 해당 엔드포인트 자신의 시험에 속하며, 일반 승인은 그것을 대체할 만큼 충분한 예측 불가능한 증거를 담지 않습니다.

새 주소가 검증되기 전에는 안티앰플리피케이션 규칙이 그곳으로 유도될 수 있는 트래픽 양을 제한합니다. 그렇지 않으면 스푸핑된 마이그레이션이 서버를 비협조적 피해자에 대한 트래픽 증폭기로 만들 수 있습니다. 오래된 경로가 여전히 유효한 동안 검증이 실패하면, 커넥션 전체가 아니라 새 경로가 버려집니다. QUIC는 마지막으로 검증된 주소로 돌아갈 수 있습니다.

커넥션은 이동하지만 측정값은 남는다

암호화 키와 스트림은 마이그레이션을 살아남을 수 있지만, 새 경로는 다른 대역폭, 지연, 손실, ECN 동작을 가질 수 있습니다. 그래서 RFC 9000은 새 주소가 확인되면 혼잡 제어기와 RTT 추정기를 보통 리셋합니다. 오래된 경로의 패킷은 새 경로에 대한 근거가 되지 않습니다.

포트만 바뀐 경우(보통 NAT 리바인딩 때문)는 그 추정값을 신중하게 유지할 수 있습니다. 그 경우에도 사양은 경로 특성이 실제로 바뀌었다면 재사용된 상태가 너무 공격적으로 전송할 수 있다고 경고합니다. 연속성은 모든 가정을 경계를 넘어 운반할 허가가 아닙니다.

움직이는 커넥션은 추적 비컨이 될 수 있다

같은 커넥션 ID가 카페 Wi-Fi에 나타난 뒤 이동통신 네트워크에 나타난다면, 수동 관찰자는 두 기록을 연결할 수 있습니다. QUIC는 엔드포인트가 둘 이상의 로컬 주소에서 보내거나 둘 이상의 목적지 주소로 보낼 때 하나의 ID를 재사용하지 말 것을 요구합니다.

새 ID는 직접적인 연결 지표를 줄이고, 보호된 패킷 번호는 또 하나의 명백한 상관 요소를 제거합니다. 그러나 이는 익명성을 만들지 않습니다. 타이밍, 패킷 크기, 협력하는 라우팅 인프라는 여전히 활동을 연결할 수 있습니다. ID에서 백엔드를 복구하는 방법을 아는 서버 측 라우팅 체계는 외부 관찰자가 추론하려고 해서는 안 되는 정보를 본질적으로 보유합니다.

프라이버시는 공급에도 달려 있습니다. 피어가 미사용 식별자를 소진하면 새 경로에서 안전하게 프로브하거나 응답할 수 없습니다. 이동 전에 충분한 연결 불가능한 ID를 발행하는 것은 마이그레이션 준비의 일부이며, 주소가 바뀐 뒤의 선택적 장식이 아닙니다.

잊어버린 서버의 마지막 메시지

장애가 엔드포인트의 커넥션 상태를 지울 수 있으며, 피어는 계속 보내고 있을 수 있습니다. 일반CONNECTION_CLOSE는 사라진 상태를 필요로 합니다. 그래서 RFC 9000은 스테이트리스 리셋을 최후 수단으로 정의합니다.

각 적격 커넥션 ID에는 추측하기 어려운 16바이트 리셋 토큰이 있으며, 보호된 커넥션 맥락을 통해 전달됩니다. 일치하는 토큰으로 끝나는 데이터그램은 피어에게 즉시 중지하라고 알립니다. ID의 은퇴는 그 토큰을 무효화합니다.

리셋 패킷 자체는 암호화 보호가 없으며 숏 헤더 패킷과 비슷하게 만들어졌습니다. 토큰이 새어 나가면 제3자가 커넥션을 종료할 수 있습니다. 따라서 ID와 토큰은 무심코 재사용할 수 없습니다. 스테이트리스 리셋은 일반적인 오류 보고도 아니고 원격 엔드포인트가 여전히 건강하다는 증거도 아닙니다. 기억이 없는 수신자가 송신자가 여전히 기억하는 작업을 끝내는 유한한 방법입니다.

출처와 한계

닫힌 출처 집합은RFC 8999,RFC 9000,RFC 9001입니다. 이는 프로토콜 계약을 정의할 뿐, 현재 배포 점유율, 벤더 동작, 마이그레이션 성공률 또는 성능 우위를 정의하지 않습니다. 커넥션 ID는 전역 고유 신원이 아니며, 경로 검증은 주소 소유가 아닙니다.