개요
전달 확인 응답이 무작위로 손실될 경우 스트리밍 클라이언트 연결이 정체될 수 있습니다. 전송자는 확인 응답을 받거나 연결이 종료될 때까지 재전송을 반복하지만, 상대방에게 확인 응답이 도달했는지 신뢰성 있게 확인할 방법이 없습니다. 이 제안은 클라이언트가 라우터에게 동일한 목적지로 후속 메시지를 전송할 때 다른 아웃바운드 튜널을 선택하도록 지시할 수 있도록 SendMessageExpiresMessage 플래그 필드에 새로운 플래그 비트 하나를 추가합니다. 스트리밍 프로토콜은 정체된 연결을 감지했을 때 튜널 전환을 시작하기 위해 이 비트를 사용합니다.
트리거
다음 아웃바운드 메시지에서 플래그를 설정하도록 클라이언트를 유도해야 하는 두 가지 조건이 있습니다. 이러한 조건들은 스트리밍 계층에서 측정됩니다.
발신 측
클라이언트의 현재 재전송 시간 초과 기간 내에 확인 응답이 수신되지 않았습니다.
수신 측
수신 측이 동일한 데이터가 원격지에서 두 번 이상 재전송되는 것을 감지한 경우, 이는 자신의 확인 응답(acknowledgment)이 원격지에 도달하지 못하고 있음을 나타냅니다. 수신 측은 확인 응답이 다른 경로를 통해 원격지에 도달할 수 있도록 다음 아웃바운드 I2CP 메시지에서 이 플래그를 설정해야 합니다( SHOULD ). 하지만 플래그를 설정하기 전에 수신 측은 반드시 다음 조건을 모두 충족해야 합니다: (1) 중복된 데이터를 수신하였고, (2) 최소한 하나 이상의 확인 응답을 보냈으며, (3) 원격지가 다시 한 번 재전송을 수행한 이후여야 합니다.
타이밍 상관 공격을 제한하기 위해 클라이언트는 연결당 10초 윈도우 내에 플래그를 한 번 이상 설정해서는 안 됩니다. 또한 클라이언트는 정체 상태를 감지한 후, 타이밍 상관 정밀도를 줄이기 위해 플래그 설정을 지터(jitter)만큼 지연해야 하며, 이 지터는 [0, min(T/4, 2000ms)] 범위에서 균일하게 추출되어야 합니다. 여기서 T는 클라이언트의 현재 재전송 타임아웃을 밀리초 단위로 나타낸 값입니다.
사양
SendMessageExpiresMessage 의 플래그 필드는 Date 필드 이후 상위 2바이트를 차지하며 (0.8.4 릴리스부터 재정의됨), 빅엔디안 방식으로 전송된다. 비트 15는 현재 사용되지 않으며, 이 제안서에서 그 정의를 명시한다.
비트 순서: 15…0
| 비트 | 이름 | 설명 |
|---|---|---|
| 15 | SWITCH_OUTBOUND_TUNNEL | 1인 경우, 라우터는 이 대상으로 후속 메시지를 전송할 때 풀에서 다른 아웃바운드 터널을 선택해야 합니다. 대체 가능한 터널이 없을 경우 이 플래그는 조용히 무시됩니다. 라우터는 이 플래그가 설정되었다는 이유만으로 이전에 사용한 터널을 닫거나 폐기해서는 안 됩니다. |
| 이 플래그의 기본값은 0이다. 이를 구현하지 않은 라우터는 오류 없이 이를 무시해야 한다. |
구현 노트
SWITCH_OUTBOUND_TUNNEL이 설정된 경우, 라우터는 아웃바운드 풀에서 균일하게 무작위로 터널을 선택해야 하며, 다음은 제외해야 합니다:
- 현재 이 세션에서 사용 중인 터널, 그리고
- 풀(pool) 내에서 가장 최근에 실패한 단일 터널(존재할 경우).
기타 모든 터널 상태 메트릭, 빌드 시간, 또는 선택 기록은 선택에 영향을 주어서는 안 되며, 가중 선택은 시빌 공격자를 우대할 수 있기 때문이다. 이러한 제외 조건을 적용한 후 풀에 적격 터널이 없는 경우 플래그는 조용히 무시된다.
이 플래그는 추가적인 터널 메시지를 발생시키지 않으며, 터널 전환 시 표면상의 지연 시간이 달라질 수 있습니다. 연결당 10초의 속도 제한(트리거 참조)이 과도한 전환을 방지합니다.
익명성 고려 사항
SendMessageExpiresMessage 의 플래그는 클라이언트와 해당 클라이언트의 라우터 간의 로컬 인터페이스인 I2CP를 통해 전달됩니다. 따라서 네트워크 관찰자에게는 이 플래그들이 보이지 않습니다.
익명성 위험은 트래픽 패턴에 기반한다. 즉, 여러 터널 끝점 전반에 걸쳐 가시성을 확보한 공격자는 터널 사용량의 변화 시점을 관찰할 수 있다.
클라이언트 측 지연에 직접적으로 대응하여 아웃바운드 터널을 전환하면 탐지 가능한 행동 패턴이 생성된다. 이에 대한 두 가지 구체적인 관찰 벡터가 있다:
아웃바운드 터널의 첫 번째 홉에 대한 시빌 공격
각 아웃바운드 터널의 첫 번째 홉은 송신자의 라우터에서 해당 터널로 들어오는 모든 트래픽을 볼 수 있다. 송신자의 풀(pool)에 있는 여러 터널의 첫 번째 홉을 장악한 공격자는 하나의 첫 번째 홉에서 트래픽이 멈추고 다른 홉에서 가까운 시점에 트래픽이 시작되는 현상을 관찰함으로써, 두 터널이 동일한 송신자와 연결되어 있음을 유추할 수 있다. N개의 터널로 구성된 풀에서, K개의 첫 번째 홉을 장악한 공격자는 임의의 스위치 이벤트를 관찰할 확률이 K/N이 된다.
트래픽 갭 타이밍
스톨 동안 클라이언트는 새로운 데이터를 전송하지 않으므로, 기존의 아웃바운드 터널이 침묵 상태가 된다. 전환이 발생하면 트래픽이 다른 경로에서 다시 시작된다. 발신자의 라우터에 대한 관측 지점(예: 발신자의 네트워크 제공업체 또는 첫 번째 홉 노드 자체)을 확보한 공격자는 침묵 후 재개되는 패턴을 관찰할 수 있다. 간격의 지속 시간은 또한 클라이언트의 현재 재전송 타임아웃 값에 대한 근사치를 유출한다.
클라이언트는 트리거에 명시된 속도 제한 및 지터 요구사항을 반드시 준수해야 합니다.