요약

  • RFC 3388은 SDP 미디어 라인을 실행 가능한 관계의 구성원으로 만들었지만, 모든 미디어 라인에 고유하고 안정적인mid라벨이 있을 때만 그 관계를 적용하도록 규정했다.
  • 이 fail-closed 규칙은 기본 미디어 기술은 보존하면서, 부분적인 추측이 잘못된 스트림을 동기화·선택·복제하지 못하게 했다.

어떤 세션 기술에 네 개의 미디어 라인이 나열되어 있다. 셋에는 이름이 있다. 넷째는 완전히 유효한 목적지, 포트, 포맷을 기술하지만mid라벨이 없다. 구현자는 여전히 그룹에 어떤 세 라벨이 나타나는지 보고 그 관계를 적용할 수 있을 것이다.

RFC 3388은 그렇게 하지 말라고 했다.

세션 기술이 그룹화를 사용하면서 단 하나의m=라인이라도mid가 없으면, 애플리케이션은 어떤 그룹화도 수행해서는 안 된다. 개별 미디어 기술은 사라지지 않는다. 사라지는 것은 선언된 관계다. 이는 불완전한 이름 집합에서 권위를 추론하지 말라는 정확한 거부였다.

2002년 12월 Standards Track으로 발표된 RFC 3388은 원래의 세션 기술 프로토콜(SDP)의 한계를 다루었다. SDP는 여러 미디어 기술을 나열할 수 있었지만, 그 기술들이 서로 어떤 관계인지 말할 표준 방법이 없었다. 애플리케이션은 오디오, 비디오, 또 다른 오디오 라인을 보고도 어느 쌍이 동기 재생을 요구하는지, 어떤 목적지들이 하나의 논리적 미디어 인스턴스를 대표하는지 알 수 없었다.

이 확장은 두 가지를 추가했다. 미디어 수준의a=mid는 세션 기술 안에서 각m=라인에 고유한 토큰을 부여했다. 세션 수준의a=group은 등록된 시맨틱스 아래 이 토큰들을 나열했다. RFC 3388은 처음에 입술 동기화를 위한LS와 흐름 식별을 위한FID를 정의했다.

이들은 장식적 링크가 아니었다. LS는 애플리케이션에 시간 관계를 복원해 재생을 동기화하라고 지시했다. RTP는 RTCP 정보를 통해 서로 다른 타임스탬프를 벽시계에 매핑할 수 있었고, 다른 미디어에는 다른 메커니즘이 필요했다. 그룹은 그 의무를 선언했지만, 클록 측정값을 제공하지 않았고 사용자 측에서 스피커와 화상이 맞춰져 있다는 것을 증명하지도 않았다.

FID는 다른 결과를 낳았다. 여러m=라인과 RTP 세션이 하나의 미디어 흐름을 대표할 수 있게 했다. 이동통신 단말은 코덱마다 다른 무선 베어러를 쓰기 때문에 코덱마다 다른 목적지 포트가 필요할 수 있다. DTMF 처리기는 음성 수신기와 다른 호스트에 있을 수도 있다. 여러 FID 구성원이 현재 코덱을 지원하면, 발신자는 관련 RTP 세션들에 복제본을 전송해야 했다.

이 동작은 멤버십을 실질적으로 만들었다. 잘못된 연결은 복제본을 잘못된 목적지로 보낼 수 있다. 그래서 RFC 3388의 보안 절은 FID 그룹화를 변조하는 공격자가 참여자들이 임의의 목적지로 미디어를 보내게 강제할 수 있다고 경고했다. 시그널링 무결성은 행정적 마무리가 아니라 선언된 그룹화의 권위를 지키는 장치였다.

신원 규칙도 그에 상응하게 엄격했다. 각mid는 고유해야 했다. 알 수 없는 라벨을 참조하는 그룹은 그 그룹 라인이 존재하지 않는 것처럼 무시되었다. 하나의 미디어 라인은 서로 다른 시맨틱스를 가진 여러 그룹에 참여할 수 있었지만, 원래 RFC는 같은 시맨틱스를 가진 여러 그룹에는 참여를 허용하지 않았다. RFC 5888이 구현 경험을 근거로 이 마지막 제한을 나중에 해제했는데, 이는 fail-closed 신원 규칙과 지나치게 좁은 개수 규칙이 같은 것이 아니라는 유용한 reminder다.

완전성 요건은 이름 있는 구성원을 넘어 확장됐다. 기술 어디선가 그룹화가 사용되면, 특정 그룹에 등장하지 않는 미디어 라인조차mid를 가져야 했다. 이 규칙은 애플리케이션이 라벨 없는 라인을 안전하게 무관한 것으로 가정하는 것을 막았다. 라벨의 부재는 잘림, 생성기 오류, 또는 조인 키가 잃어버린 관계를 반영했을 수도 있었다.

SIP offer/answer에는 또 다른 신원 함정이 있었다. RFC 3264는 offer의 첫m=라인을 answer의 첫 라인과, 둘째를 둘째와, 이런 식으로 순서대로 정렬했다. RFC 3388은 이 순서 기반 규칙을 라벨로 대체하지 않았다. answer 라인의mid는 대응하는 offer 라인과 일치해야 했다. 라인 순서를 그대로 둔 채 두 라벨을 바꾸면, 애플리케이션은 모든mid와group라인을 무시한다.

다시 한번, 사양은 겉보기에 명백한 쌍을 구제하려 하지 않았다. 오래된 정렬 규칙을 보존하고 일관되지 않은 오버레이를 거부했다. 라벨은 관계를 표현하는 데 도움을 줄 수 있었지만, 그 아래 미디어 기술의 협상된 신원을 조용히 다시 쓸 수는 없었다.

수용에도 영수증이 필요했다. 시맨틱스를 이해한 answerer는 같은 그룹 멤버십 또는 그 부분집합을 반환했다. 포트를 0으로 설정해 제안된 미디어 라인을 거부하면, 그 라인의 라벨은 반환된 그룹에 남을 수 없었다. 세션에 사용되는 그룹은 answer에 존재하는 그룹이었다.

answerer는 자신의 answer에서 새로운 그룹화 요청을 도입할 수 없었다. SDP를 운반하는 것이 offer와 answer뿐이라면, 원래 offerer가 그 새 관계를 수용했는지 알 수 없었다. 이후의 offer를 보내야 했다. 이 제한은 누가 더 신뢰되는지가 아니라, 어떤 메시지 시퀀스가 긍정적 수용을 만들 수 있는지에 관한 것이었다.

하위 호환성은 불확실성을 드러나게 남겼다. RFC 3388은 SIPRequire헤더를 정의하지 않았다.group이나mid를 이해하지 못하는 피어는 정상적인 SDP 폴백 아래 이들을 무시했다. FID 구성원을 별개 스트림으로 취급하거나, 믹서처럼 동작하거나, 세션을 거부하거나, 더 단순한 재시도를 유도할 수도 있었다. 그래서 구문상 성공한 SIP 교환이 피어가 그룹화 시맨틱스를 실행했다는 증명이 되지 않았다.

Lu Heng의 Running-Code Primacy는 이 RFC의 절제가 왜 중요한지 명확히 한다. 공유 규칙은 결정적이고 국소적으로 검증 가능해야 한다. 모든 구성원이 고유한 이름을 가지고, 이름이 협상된 위치를 넘어 안정적으로 유지되며, answer가 멤버십을 긍정적으로 선택한다. 이 조건들이 실패하면 관계는 권위를 잃는다. 구현은 기본 미디어 기술을 처리할 수 있지만, 직관으로 연결을 만들어내서는 안 된다.

Minimum Initial Specification은 이에 짝이 되는 교훈을 제공한다. 조인 키, 등록된 시맨틱스, 수용 경계를 표준화하라. 실제 시간 복원, 코덱 장치, 내부 아키텍처는 국소적으로 남겨두라. 공통 계층은 라벨이 전송이나 사용자 결과를 증명한다고 가장하지 않으면서도 협력을 가능하게 해야 한다.

RFC 3388은 나중에 RFC 5888로 대체되었고, RFC 5888은 프레임워크를 갱신하며 그룹화 제한 하나를 완화했다. 오래된 역사적 아이디어는 살아남았다. 안정적인 라벨이 뒷받침할 수 있을 때에만 관계가 실행 가능해진다. 유효한 기록의 목록은 부분적으로 추측된 연결 집합을 승인하지 않는다.

라벨 하나의 누락이 모든 그룹을 취소한 이유는, 관계적으로 아무것도 하지 않는 비용이 유효한 지시를 잘못된 미디어에 적용하는 비용보다 작기 때문이다. 스트림은 남을 수 있었다. 가정은 남을 수 없었다.

출처