목차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μ) | μ-law | 14비트 선형 → 8비트 | 0 |
| PCMA (G.711A) | A-law | 13비트 선형 → 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, 무선 네트워크, 네트워크 기초