요약
- RFC 3158은 번역된 RTP 미디어와 그 미디어에 대한 RTCP 증거를 하나의 일관성 문제로 다루었다. 인코딩, 패킷화, 시퀀스 번호 또는 타임스탬프 속도를 바꾸려면 개수, 타임스탬프, 수신 보고서에도 상응하는 변경이 필요했다.
- 수신 보고서는 미디어와 반대 방향으로 이동하며 특정 시퀀스 공간을 가리켰다. 번역기가 손실과 확장 시퀀스 정보를 의미 있게 되돌려 매핑할 수 없다면, 잘못된 스트림에 대해 그럴듯해 보이는 수치를 전달하는 것보다 명시적 생략이나 로컬 합성 보고서가 더 정직했다.
- 이 테스트 문서는 자신의 권한도 한정했다. 그 시나리오는 흔한 오류를 드러내고 유한한 상호운용성을 입증할 수 있었지만, 통과했다고 해서 완전한 RTP 적합성, 보안, 배포 품질, 사용자 경험을 보증하는 것은 아니었다.
화면은 도착하는데 증거는 거짓말할 수 있었다
빠른 네트워크와 좁은 링크 사이에 트랜슬레이터가 있다고 상상해 보자. 이 트랜슬레이터는 두 개의 RTP 패킷을 받아 인코딩을 변환하고 하나의 송신 패킷으로 합친다. 수신자는 그 결과를 재생한다. 미디어만 보는 관찰자에게는 번역이 성공한 것이다.
이제 수신자가 RTCP 수신 보고서를 보낸다고 하자. 그 최고 시퀀스 번호와 손실 개수는 송신 시퀀스 공간, 즉 원본이 두 개를 보냈는데 하나의 패킷이 된 이력을 기술한다. 번역기가 그 보고서를 단순히 상류로 전달하면, 원본 송신자는 자신이 한 번도 만들어 낸 적 없는 패킷 이력에 대해 통사적으로 올바른 보고를 받게 된다. 병합 후에 계산된 손실 비율은 병합 전 세계에 그대로 복사될 수 없다.
이 실패는 미묘하다. 구성 요소 어느 것도 손상된 것처럼 보일 필요가 없기 때문이다. 번역된 페이로드는 디코딩될 수 있다. 소스 식별자는 그대로일 수 있다. RTCP 패킷은 정상적으로 파싱될 수 있다. 적용되는 보안 메커니즘 아래에서 송신자가 이를 인증할 수도 있다. 그러나 보고서는 읽히는 지점에 대해서는 여전히 의미상 거짓일 수 있다.
RFC 3158은 이것을 테스트의 문제로 만들었다. 그 트랜슬레이터 절은 원격 단말이 변환된 미디어를 재생할 수 있는지를 묻는 데 그치지 않았다. 페이로드 타입, 타임스탬프, 시퀀스 번호, 패딩, 마커 동작의 변경이 제어 보고서의 상응하는 변경을 수반했는지를 물었다. 보고서는 장식적인 계측 데이터가 아니라 변환을 따라가야 하는 프로토콜 상태의 일부였다.
테스트 장치는 두 구현 모두의 바깥에 서 있었다
2001년 이 문서는 두 RTP 구현 사이에 애플리케이션 계층의 패킷 포워더를 두자고 제안했다. 양 단말은 테스트 장치로 전송하고, 장치는 패킷을 반대쪽으로 전달했다. 평상시 실행에서는 손실도 추가 지연도 만들지 않았다. 선별된 실행에서는 트래픽을 지연시키거나 폐기하고 패킷 내용을 기록했다.
이 배치는 테스트에 유용한 제3의 시점을 주었다. 한 단말은 패킷을 보냈다고 말할 수 있고, 다른 단말은 받았다고 말할 수 있으며, 장치는 통제된 경계를 통과한 내용을 보존할 수 있었다. 데이터 패킷의 약 1퍼센트를 의도적으로 드롭함으로써 테스터는 알려진 손상과 수신 보고서의 손실 비율 및 누적 손실을 비교할 수 있었다. 손실을 제거하고 가변 지연을 추가함으로써 보고되는 패킷 도착 간 지터의 예상 상승을 확인할 수 있었다.
장치가 전지적 증인이 된 것은 아니다. 자신의 위치에서, 자신의 스크립트된 조건 아래 트래픽을 본 것뿐이다. 모든 테스트되지 않은 상태에서 구현이 무엇을 하는지, 실제 운영 네트워크가 무엇을 할지, 사람이 오디오나 비디오를 유용하다고 느꼈는지는 증명할 수 없었다. RFC 3158은 서두에서 이렇게 말했다. 이 전략은 전 체적이 아니며, 통과했다고 해서 RTP 전체 명세에 대한 적합성을 함축하지는 않는다.
이 면책은 의례적인 주의사항이 아니다. 그것은 이 영수증의 범위를 정의한다. 성공한 실행은 식별된 두 빌드가 기록된 설정 아래에서 선별된 미디어를 주고받았고 선택된 경계 사례에 예상대로 반응했다는 것을 확립할 뿐이다. 모든 페이로드 형식, 토폴로지, 타이머, 잘못된 입력, 보안 모드, 배포 조건에 대한 인증서로 조용히 확대될 수 없다.
RTP와 RTCP는 하나의 이력을 다른 각도에서 기술했다
RTP는 미디어 패킷을 실었다. RTCP는 소스들과 그 패킷 수신 상태에 대한 제어 정보를 실었다. 두 채널은 와이어상 분리되어 있었지만 그 의미는 결합되어 있었다.
송신자 보고서는 SSRC를 명시하고 NTP 시각, 대응하는 RTP 타임스탬프, 패킷 개수, 옥텟 개수를 제공했다. 수신 보고서는 기술 대상 소스를 명시하고 손실, 확장된 최고 시퀀스 번호, 지터, 마지막 송신자 보고서 타임스탬프, 그 보고서 이후의 지연을 실었다. 이 필드들은 그것을 생성한 데이터 스트림과 관찰 지점에 상대적으로만 의미를 가졌다.
그래서 RFC 3158은 존재 여부만이 아니라 일관성을 테스트했다. SR의 SSRC가 RTP 데이터와 일치하는지, SR의 RTP 시각이 미디어 타임라인과 일치하는지, 개수가 송신된 패킷과 바이트와 일치하는지, RR의 시퀀스와 손실 정보가 통제된 손상과 대응하는지 확인했다. 보고서가 예정대로 도착하는 것만으로는 충분하지 않았다. 올바른 이력을 기술해야 했다.
이 구분이 중요한 이유는 모니터링 시스템이 제어 기록을 우대하는 경우가 많기 때문이다. 제어 기록은 더 작고, 구조화되어 있고, 집계하기 쉽다. 그러나 압축된 보고서는 미디어 사건의 사영(projection)이지 그 대체물이 아니다. 중개자가 그 사건들을 사영을 갱신하지 않고 바꾸면, 가장 깔끔한 대시보드가 가장 충실하지 못한 기록이 될 수 있다.
트랜슬레이터는 소스 레이블을 유지하면서 그 주위의 거의 모든 것을 바꿀 수 있었다
RTP는 트랜슬레이터와 믹서를 구분했다. 트랜슬레이터는 소스들을 개별적으로 전달하며 그 SSRC 값을 보존했다. 전달된 모든 패킷이 트랜슬레이터의 네트워크 주소를 얻을 수 있었음에도 그러했다. 믹서는 스트림을 결합하고 자신의 타이밍을 생성하며 자신의 SSRC로 결합 출력을 송신하고, 기여 소스들을 CSRC로 나열할 수 있었다.
SSRC를 보존하는 것이 패킷 이력을 보존하는 것은 아니었다. 트랜슬레이터는 데이터 인코딩을 바꾸고 그래서 페이로드 타입을 바꿀 수 있었다. 패킷화 간격이나 프레임 속도를 바꾸고 그래서 타임스탬프를 바꿀 수 있었다. 여러 패킷을 하나로 합치거나 하나를 여러 개로 나누어 새로운 송신 시퀀스 진행을 부여할 수 있었다. 패딩을 추가·제거하거나, 마커 동작을 바꾸거나, 암호화를 추가·제거할 수 있었다.
안정적인 소스 레이블은 수신자가 중개자를 넘어 스트림을 그룹화하는 데 도움이 되었다. 그러나 바이트 개수, 패킷 개수, 타임스탬프 척도, 시퀀스 위치가 불변으로 남는다는 보증은 아니었다. 신원 연속성과 측정 연속성은 서로 다른 주장이었다.
이 지점에서 이 글의 제목이 두 번째 문장을 얻는다. 트랜슬레이터가 패킷을 바꾼 순간, 보고서도 따라야 했다. 그러지 않으면 원래 SSRC가 서로 호환되지 않는 두 통계 세계를 하나의 익숙한 번호 아래 묶어 버린다.
모든 변환은 짝을 이루는 회계 의무를 만들었다
RFC 3158은 구체적인 짝을 나열했다. 트랜슬레이터가 데이터 인코딩을 바꾸면 송신자 보고서의 옥텟 개수를 갱신해야 했다. 여러 데이터 패킷을 하나로 합치면 패킷 개수를 갱신해야 했다. 샘플링 주파수를 바꾸면 송신자 보고서의 RTP 타임스탬프를 바꿔야 했다.
이것들은 장부 관리의 세부 사항이 아니다. 저비트 출력 인코딩이 입력보다 적은 바이트를 사용한다고 하자. 원래 옥텟 개수를 전달하면 하류 보고서가 좁은 링크가 결코 실어 나르지 않은 비트레이트를 기술하게 된다. 세 개의 작은 입력 패킷이 하나의 큰 출력 패킷이 된다고 하자. 원래 패킷 개수를 유지하면 패킷률 계산이 왜곡되고 이후의 손실 해석이 모호해진다.
역방향은 더 어려웠다. 수신자는 번역 이후 자신이 본 것을 보고했다. 병합이나 분할이 시퀀스 번호를 바꾸었다면, 번역기는 보고서를 원본 쪽으로 전달하기 전에 패킷 손실 필드와 확장된 최고 시퀀스 번호를 조정해야 했다. 이는 단순한 산술 오프셋이 아니라 두 패킷 이력 사이의 매핑을 필요로 했다.
송신 측에서 잃어버린 하나의 패킷이 여러 입력 패킷에 해당할 수 있다. 분할 후 잃어버린 하나의 조각이 입력 패킷의 일부만을 나타낼 수도 있다. 번역기는 입력 손실로 생긴 간격을 출력 번호 매기기에 보존할 수 있지만, 그 설계 선택 자체가 수신 보고서가 상류에서 해석되기 전에 알려져야 했다. “잃어버린 한 패킷”의 의미는 번역 경계의 어느 쪽이 질문하느냐에 달려 있었다.
보고서는 순방향 변환을 거꾸로 거슬러 올라갔다
미디어는 소스에서 트랜슬레이터를 거쳐 수신자로 흘렀다. 수신 보고서는 반대 방향으로 흘렀다. 따라서 트랜슬레이터는 역문제에 직면했다. 출력 공간에서 이루어진 관측을, 가능하다면 입력 공간으로 표현해야 했다.
이 역변환이 항상 완전하지는 않았다. 다수를 하나로 병합하면 구분이 사라진다. 수신자가 병합된 패킷을 잃으면, 입력들이 개별로 남아 있었다면 무엇이 잃어버렸을지 알 수 없다. 재인코딩도 프레임 경계와 바이트 개수를 단순한 공식으로 되돌릴 수 없는 방식으로 바꿀 수 있다.
RFC 3158 이후 원래 RTP 명세를 대체한 RFC 3550은 이 규칙을 강화했다. 페이로드를 변환하는 트랜슬레이터는 상응하는 SR과 RR 변경을 해야 했고, 패킷을 단순히 그대로 전달해서는 안 되었다. 역방향 보고서에 대해서는 가능한 곳에서 역조작을 요구하면서, 그 작업이 복잡할 수 있음도 인정했다.
증거의 방향이 역사적 통찰이다. 순방향 변환 권한이 역방향 설명력을 보장하지는 않았다. 유효한 출력 스트림을 만들 수 있는 구성 요소라도 진실한 종단 간 손실 서술을 재구성하지 못할 수 있었다. 시스템에는 만들어 낸 정밀성이 아니라 선언된 경계가 필요했다.
거짓 보고서보다 더 정확할 수 있는 보고서는 없었다
RFC 3158은 변환 때문에 수신 보고서를 합리적으로 번역할 수 없을 때, 번역기가 보고서 블록을 제거하고 빈 송신자 또는 수신자 보고서를 보내는 것을 허용했다. RFC 3550은 두 가지 유한한 대안을 기술했다. 수신 보고서를 전혀 전달하지 않거나, 번역기 자신의 수신에 기반한 합성 보고서를 보내는 것이다.
이 두 대안은 같은 것을 의미하지 않았다. 보고서 없음은 그 구간에 대해 중개자가 의미 있는 종단 간 사영을 갖지 못했다는 뜻이었다. 합성 보고서는 번역기 자신이 자신의 관찰 지점에서 수신한 것을 기술했다. 어느 쪽도 손실 0을 의미하지 않았고, 어느 쪽도 원래 패킷 시퀀스에 대한 최종 수신자의 보고가 아니었다.
명시적인 부재는 남은 증거의 의미를 보호했다. 모든 필드를 채워 넣으면 진실을 대가로 수치적 완전성을 얻었을 것이다. 로컬 생성 보고서는 그 기원과 범위가 계속 드러난다면 상류 구간을 진단하는 데 여전히 유용할 수 있었다.
이 설계는 보편적인 알고리즘을 제공하지 않았다. 변환이 서로 달랐기 때문이다. 그 지역적 재량은 편리한 무엇이든 전달할 권한이 아니었다. 실제 매핑에 대해 말이 되는 보고서를 선택하고, 매핑이 그 주장을 지지할 수 없다면 삼가야 한다는 요구였다.
복제, 번역, 믹싱은 하나의 중개자 부류가 아니었다
멀티캐스트와 유니캐스트 사이에서 변하지 않은 패킷을 단순히 복제하는 트랜슬레이터는 RTCP도 그대로 전달할 수 있었다. 증거 의무는 변경을 따라갔다. 중간 시스템이 존재한다는 사실만으로 새로운 통계 이력을 만들어 낼 필요는 없었다.
페이로드 트랜슬레이터는 다음 범주에 속했다. 소스 분리를 보존하면서 데이터 표현을 바꾸므로 그 보고서에도 상응하는 변환이 필요했다. 자신의 수신에 대한 보고서를 위해 SSRC를 할당할 수도 있었지만, 그 로컬 보고서는 트랜슬레이터에서 본 데이터를 가리켰다.
믹서는 다른 경계를 넘었다. 소스들을 결합하고 새 타이밍을 생성하며 자신의 SSRC를 사용했다. 한 클라우드의 소스에 대한 수신 보고서를, 그 소스들이 더 이상 동기화 소스가 아닌 다른 클라우드로 단순히 전달하는 것은 아니었다. 믹서는 관련 클라우드 안에서 자신의 보고서를 만들었다.
이 세 장치를 모두 “미디어 릴레이”라고 부르면 증거 구조가 지워진다. 변경 없는 복제자와, 소스를 보존하는 트랜슬레이터와, 새 소스를 만드는 믹서는 서로 다른 신원, 시퀀스 공간, 보고 권한을 가졌다. 테스트는 자신이 어떤 것을 마주하는지 알아야 했다.
보고서 집계조차 수치의 의미를 바꿀 수 있었다
RFC 3550은 일반적으로 트랜슬레이터가 서로 다른 소스의 송신자·수신자 보고서를 하나의 보고서 패킷으로 집계하지 말 것을 권했다. 이유는 측정 정확성이었다. 전파 지연 계산은 마지막 송신자 보고서와 마지막 송신자 보고서 이후 지연 필드를 사용했다. 보고서를 다시 포장하면 그 시간 관계가 바뀔 수 있었다.
이것은 같은 규칙의 2차 버전이다. 중개자는 필드 값을 그대로 두면서도 그것들이 언제 어떻게 이동하는지를 바꿈으로써 증거를 바꿀 수 있다. 구문 보존이 항상 의미 보존은 아니다.
그래서 안전한 기록에는 최종 수치 이상의 것이 들어간다. 보고하는 소스, 데이터 소스, 관찰 측, 보고서 작성 시각, 중개자의 보유나 집계 여부, 적용된 매핑이 식별되어야 한다. 이 좌표들 없이는 지연 값이 재배치된 한 구간만 측정하면서도 보편적인 것처럼 보일 수 있다.
보호된 보고서라도 잘못된 스트림을 기술할 수 있었다
SRTP와 SRTCP는 이후 정의된 컨텍스트 아래에서 미디어 및 제어 트래픽에 기밀성, 무결성 보호, 재방어를 제공했다. 이 보호들은 패킷이 수용된 보안 관계 밖에서 변경되거나 재생되었는지를 답한다. 그것은 트랜슬레이터가 올바른 역 매핑을 선택했는지를 증명하지 않는다.
보고서는 중개자에게 진정한 것이면서 동시에 합성일 수 있다. 손상되지 않으면서도 최종 수신자가 아니라 트랜슬레이터의 수신을 가리킬 수 있다. 암호학적 검증을 통과하면서도 번역 전 개수를 번역 후 경로에 실을 수 있다.
그래서 보안은 체인을 붕괴시키는 대신 또 하나의 영수증을 추가한다. 보호된 바이트와 검증 결과를 보존한 뒤, 인증된 송신자가 어떤 관측을 서술할 자격과 능력이 있었는지 물어야 한다. 무결성은 그 서술을 보호하지만, 서술의 범위를 확장하지는 않는다.
RFC 3158은 자신의 테스트 주장도 한정했다
이 문서는 폭넓게 다루었다. 미디어 전송, 헤더 확장, 송신자·수신자 보고서, 소스 기술, BYE 동작, RTCP 타이밍, 재고려(reconsideration), 트랜슬레이터, 믹서, 충돌 처리, SSRC 랜덤화까지. 폭은 문서를 유용하게 만들었고, 그래서 서두의 한계가 필수적이었다.
랜덤화 절은 왜 테스트 계획에도 검토가 필요한지 보여준다. 이 문서는 자신의 절차를 대략적인 검증에 불과하다고 밝힌 뒤, 기대값은 빈당당 40개라고 말하면서 25개 빈당에 분포된 2,500개 샘플을 인쇄했다. 직접 나누면 100이다. 뒤에 인쇄된 변동계수 공식은 샘플과 빈 변수와는 일관되지만, 기대 개수와 수용 밴드는 다른 샘플 크기에 속하는 것으로 보인다. 이 연구를 위해 동결된 RFC Editor 검색에서 일치하는 정오표는 발견되지 않았다.
이 관찰은 공식적인 정정이 아니며, RTP에 대한 판정으로 확대되어서도 안 된다. 이것은 증거에 대한 증거다. 공개된 테스트 전략은 유한한 수치적 불일치를 담을 수 있다. 운영자는 실제 사용한 절차를 그대로 보존하고, 기대값을 독립적으로 계산하고, 문서 번호에서 권위를 빌려오지 말고 편차를 보고해야 한다.
결함이 있거나 불완전한 테스트를 통과하는 것이, 그 통과가 나중에 보편적인 배지로 사용된다면 잘 범위가 정해진 테스트를 실패하는 것보다 나쁠 수 있다. RFC 3158의 저자들은 그 과잉 확장을 미리 차단했다. 그들의 테스트는 전체 명세가 아니라 가능한 오류와 선별된 상호운용성을 보여주는 것이었다.
이후의 지표는 어휘를 넓혔지 관찰 지점을 넓히지 않았다
RTCP Extended Reports는 더 풍부한 측정을 추가했다. 이후 토폴로지 문서들은 더 다양한 릴레이, 믹서, 선택적 포워더, 기타 RTP 배치를 기술했다. 더 많은 필드와 더 많은 이름 붙은 토폴로지는 진단을 개선하였지만 출처(provenance)를 폐지하지는 않았다.
지표에는 여전히 원천, 구간, 패킷 모집단, 시퀀스 공간, 관찰 지점이 필요했다. 번역 후 손실 값이 더 새로운 보고서 형식에 실렸다고 해서 번역 전 값이 될 수는 없었다. 토폴로지 레이블은 어떤 중개자가 예상되는지 설명할 수 있었지만, 어떤 코드가 실행되었고 특정 패킷이 어떤 경로를 지나갔는지 증명하지는 못했다.
프로파일과 페이로드 형식도 여전히 중요했다. 페이로드 타입, 타임스탬프 속도, 마커의 의미는 적용되는 프로파일에 의존했다. 트랜슬레이터는 그 비트를 보편적인 것으로 취급해서 검증하거나 다시 쓸 수 없었다. 공통 헤더는 구문을 실었고, 프로파일이 의미의 일부를 공급했다.
지속 가능한 산출물은 결합된 변환 영수증이었다
책임 있는 번역 기록은 입력 캡처에서 시작된다. SSRC, 시퀀스 번호, 타임스탬프, 페이로드 타입, 크기, 도착 시각. 변환 규칙, 소프트웨어와 구성의 신원, 입력 패킷 또는 프레임에서 출력 패킷으로의 매핑을 기록하고, 송신 시퀀스와 타임스탬프 공간을 보존한다.
각 송신자 보고서에 대해 바이트 개수, 패킷 개수, RTP 타임스탬프가 어떻게 다시 쓰였는지 기록한다. 각 역방향 수신 보고서에 대해 출력 공간의 관측, 시도된 역 매핑, 결과로 나온 상류 필드를 기록한다. 의미 있는 매핑이 존재하지 않으면 생략을 기록한다. 번역기가 로컬 합성 보고서를 발행했다면 관찰 지점을 레이블링하고 그것을 최종 수신자의 보고로 제시하지 않는다.
다음 영수증들은 다른 계층에 속한다. 수신자가 페이로드를 디코딩했는지, 재생이 기한 안에 이루어졌는지, 애플리케이션이 그것을 사용했는지, 사람이 이해 가능한 미디어를 경험했는지. 완벽한 RTCP 재작성은 이런 결과를 증명할 수 없다. 좋은 사용자 경험이 거짓 보고서를 소급적으로 정확하게 만들 수도 없다.
RFC 3158의 지속되는 교훈은 모든 중개자가 모든 수치를 보존해야 한다는 것이 아니다. 시스템이 그 의미를 파괴한 뒤에도 증거의 겉모습을 보존해서는 안 된다는 것이다. 패킷이 바뀌면 보고서도 함께 바뀌어야 하고, 따라가지 못하는 지점을 정확히 인정해야 한다.
출처
회원 브리핑
프로필 심층 컨텍스트
올바른 멤버십 등급으로 로그인하면 전체 브리핑과 출처 노트를 볼 수 있습니다.
Strategic Circle 전용
Strategic Circle
모든 독자에게 공개됩니다. 가입 후 로그인하면 프로필 브리핑를 열람할 수 있습니다.
Strategic Circle 가입하기Leadership Alliance 전용
Leadership Alliance
자격을 갖춘 IP 자산 소유자 및 운영진을 위한 콘텐츠입니다. 로그인하면 Leadership Alliance 브리핑을 열람할 수 있습니다.
Leadership Alliance 가입하기





