본문으로 건너뛰기

버그 제보

이상한 점을 알려 주시면 고칠게요. 지금 보고 있는 페이지와 브라우저 정보가 함께 담겨요.

페이지:

Computer Science

VoIP 전화망: SIP, SDP, RTP

작성 2026. 10. 21.추가
목차8개 항목
출처와 참고

「Go와 함께하는 전화망 서비스 구축 1편」, 「2편」을 바탕으로, 프로토콜 사항은 RFC로 확인해 재구성한 노트다.

전화망의 두 갈래

구분PSTN(공중 교환 전화망)VoIP(인터넷 전화)
전송전화 교환국의 회선 교환망. 지금은 대부분 디지털화됐다IP 패킷
대역협대역(8kHz 표본화)으로 고정코덱에 따라 광대역까지 가능
연결교환기가 회선을 잇는다SIP로 세션을 열고 RTP로 음성을 보낸다
  • PBX(사설 교환기) 는 회사 내부 전화를 외부 망과 잇는 교환 장비다. IP 기반 IP-PBX는 모든 통화를 IP 네트워크에서 처리해 응용 서비스(상담 봇, 녹취 분석)를 붙이기 쉽다.
  • PSTN과 VoIP 사이에는 게이트웨이가 있어 신호 형식과 아날로그·디지털을 변환한다.

목소리를 디지털로

아날로그 음성은 표본화(sampling) → 양자화(quantization) → 부호화(encoding) 를 거쳐 디지털이 되고, 필요하면 압축한 뒤 패킷으로 캡슐화해 보낸다. 압축하지 않은 디지털 음성을 PCM(펄스 부호 변조) 이라 한다.

  • 나이퀴스트 표본화 정리: 원 신호의 최고 주파수의 두 배 이상으로 표본화하면 원 신호를 복원할 수 있다. 전화 음성은 약 4kHz까지 쓰므로 초당 8,000번(8kHz) 표본화한다.
  • 표본 하나를 8비트로 나타내면 8,000 × 8 = 64kbps가 된다. 표준 전화 대역이다.
  • 원래보다 높은 표본화율이 필요하면(음성 인식 엔진 입력 등) 리샘플링한다. 업샘플링 뒤에는 표본 사이를 보간(interpolation)해 소리를 매끄럽게 한다.

G.711

G.711은 64kbps PCM을 위한 ITU-T 표준 코덱이다. 작은 소리를 더 촘촘히 표현하도록 압신(companding, 압축·신장) 을 쓴다.

이름압신 법칙변환RTP 페이로드 타입
PCMU (G.711μ)μ-law14비트 선형 → 8비트0
PCMA (G.711A)A-law13비트 선형 → 8비트8

G.711은 압축이 없어 품질이 안정적이고 거의 모든 장비가 지원한다. 대역폭이 아쉬우면 G.729 같은 저비트레이트 코덱을, 품질이 중요하면 광대역 코덱인 Opus를 쓴다. WebRTC는 Opus와 G.711 지원을 필수로 정한다.

통화 흐름: SIP와 SDP

SIP(Session Initiation Protocol, RFC 3261) 는 통화(멀티미디어 세션)를 열고, 바꾸고, 닫는 신호 프로토콜이다. HTTP처럼 텍스트 기반이고 응답 코드도 HTTP를 본떴다(100, 180, 200, 4xx). 예전 IP-PBX의 H.323보다 단순해 지금 VoIP의 사실상 표준이다.

SDP(Session Description Protocol, RFC 8866) 는 SIP 본문에 실려 미디어 조건을 협상한다. 어느 IP·포트로 받을지, 어떤 코덱(페이로드 타입)을 쓸 수 있는지를 적고, 한쪽이 제안(offer)하면 다른 쪽이 고른 것으로 답(answer)한다(RFC 3264). 예를 들어 m=audio 3456 RTP/AVP 0 8은 「3456번 포트에서 RTP로 오디오를 받고, PCMU나 PCMA를 쓸 수 있다」는 뜻이다.

sequenceDiagram
    participant A as 발신자
    participant B as 수신자(또는 SIP 서버)
    A->>B: INVITE (+SDP offer)
    B->>A: 100 Trying
    B->>A: 180 Ringing
    Note over A: 발신자에 링백 톤
    B->>A: 200 OK (+SDP answer)
    Note over B: 수신자가 받음
    A->>B: ACK
    A-)B: RTP 음성 (양방향)
    B-)A: RTP 음성 (양방향)
    Note over A,B: SDP로 합의한 주소·코덱
    A->>B: BYE
    B->>A: 200 OK
SIP 요소뜻
INVITE / ACK / BYE / CANCEL세션 시작 / 시작 확인 / 종료 / 응답 전 취소
REGISTER단말이 자기 현재 주소를 등록
Via요청이 거쳐 간 경로. 응답이 같은 길로 돌아온다
From / To발신자 / 수신자
Call-ID통화 하나를 식별
CSeq같은 통화 안의 요청 순서
Contact이후 요청을 직접 보낼 주소

SIP·SDP에는 음성 데이터가 들어 있지 않다. 둘은 통화를 준비하고 정리하는 신호이고, 실제 음성은 RTP로 따로 흐른다. 이 「신호와 미디어의 분리」는 WebRTC에도 그대로 이어진다(WebRTC).

음성 전송: RTP

RTP(Real-time Transport Protocol, RFC 3550) 는 실시간 음성·영상을 보내는 프로토콜이다. 늦게 온 음성은 쓸모가 없으므로 재전송이 없는 UDP 위에서 동작한다(전송 계층: 포트, TCP, UDP). 짝이 되는 RTCP는 수신 품질(손실률, 지터)을 보고한다. 암호화가 필요하면 SRTP를 쓴다.

음성은 코덱이 정한 단위(프레임)로 잘라 보낸다. G.711을 20ms 단위로 보내면 초당 50개 패킷, 패킷당 160바이트(8,000바이트 ÷ 50)다. 이 20ms를 ptime이라 한다.

RTP 헤더 필드역할
Version(2비트)버전. 지금은 2
Padding / Extension패딩, 확장 헤더 유무
CSRC Count뒤에 오는 CSRC 개수
Marker프레임 경계 같은 중요한 사건 표시
Payload Type(7비트)코덱. SDP에서 합의한 범위 안에서 고른다
Sequence Number(16비트)패킷 순서와 손실 감지. 보안상 임의 값에서 시작해 1씩 증가
Timestamp(32비트)첫 표본의 표본화 시각. 임의 값에서 시작해 표본 수만큼 증가
SSRC송신 스트림 식별자
CSRC믹서가 여러 소리를 섞었을 때 원래 음원 목록

지터와 지터 버퍼

지터(jitter) 는 패킷 도착 간격의 흔들림이다. 20ms마다 보낸 패킷이 네트워크 지연, 표본화·인코딩 연산 지연 때문에 불규칙하게 도착하면 소리가 끊기거나 늘어진다.

  • 수신 측은 지터 버퍼에 패킷을 잠깐 모았다가 시퀀스 번호·타임스탬프 순서로 일정하게 재생한다. 버퍼가 크면 끊김은 줄지만 지연이 늘어난다.
  • 송신 측은 연산 비용을 줄이고 정확한 주기로 보내는 것이 품질의 핵심이다.

전화망 서버를 구현할 때

전화망 서버는 통화마다 SIP 신호, 수신 RTP, 송신 RTP, 음성 인식·합성 같은 처리가 동시에 돌아간다. 각 처리를 입력 채널과 출력 채널을 가진 독립 작업으로 만들고 채널로 이어 붙이면 흐름이 명확해진다.

flowchart LR
    rx["RTP 수신"] --> asr["음성 인식"] -->|"텍스트"| dlg["대화 처리"] -->|"텍스트"| tts["음성 합성"] --> tx["RTP 송신(20ms마다)"]
  • 송신은 타이머로 ptime마다 프레임을 내보내야 하므로 다른 처리에 막히지 않는 별도 실행 단위로 둔다.
  • Go의 고루틴과 채널이 이 구조에 잘 맞는다. 고루틴은 런타임이 적은 수의 OS 스레드에 나눠 실행하는 M:N 스케줄링이라 통화마다 여러 개를 띄워도 가볍고, 채널은 공유 메모리 대신 메시지로 데이터를 넘기는 CSP 모델이다(동시성·병렬·비동기·논블로킹과 동시성 모델).
  • 패킷 확인에는 Wireshark가 유용하다. SIP 흐름도를 그려 주고 RTP 스트림을 재생할 수 있다.

정리

  • 전화 음성은 8kHz 표본화 × 8비트 = 64kbps PCM이 기준이고, G.711이 이를 μ-law·A-law로 압신한다.
  • SIP는 통화를 여닫는 신호, SDP는 주소·코덱 협상, RTP는 UDP 위의 실제 음성이다.
  • 품질의 적은 지터다. 송신은 정확한 주기로, 수신은 지터 버퍼로 다룬다.
  • 통화별 처리 단계를 채널로 잇는 동시성 구조가 전화망 서버에 잘 맞는다.

관련 노트: WebRTC, 전송 계층: 포트, TCP, UDP, 동시성·병렬·비동기·논블로킹과 동시성 모델, HTTP 프로토콜, IP QoS, 무선 네트워크, 네트워크 기초

원본 기록6

댓글

GitHub 계정으로 댓글을 남길 수 있어요.