1. SIP 트렁킹이란?

**SIP 트렁킹(SIP Trunking)**은 PSTN(공중 교환 전화망)과 VoIP 네트워크를 연결하는 기술입니다. SIP(Session Initiation Protocol)를 사용하여 음성, 영상 및 메시징 데이터를 IP 네트워크(VoIP)에서 PSTN으로, 또는 PSTN에서 IP 네트워크로 전송할 수 있도록 합니다.

과거에는 기업이 전화 통신을 위해 PRI(Primary Rate Interface) 또는 아날로그 전화 회선을 사용했지만, SIP 트렁킹을 활용하면 인터넷을 통해 음성 통화를 가능하게 하며, 기존 PSTN을 대체하는 역할을 합니다.


2. SIP 트렁킹의 동작 방식

SIP 트렁킹은 IP-PBX(인터넷 프로토콜 기반 교환기) 또는 VoIP 시스템과 통신사의 SIP 서버 간의 연결을 제공하여 음성, 영상, 메시징을 인터넷을 통해 송수신합니다.

📌 SIP 트렁킹의 기본 흐름

  1. 사용자가 VoIP 전화기(IP Phone) 또는 소프트폰에서 전화를 겁니다.
  2. IP-PBX 또는 VoIP 서버가 SIP 트렁크를 통해 SIP 제공업체(VoIP 통신사)로 통화를 전달합니다.
  3. SIP 제공업체는 필요한 경우 PSTN으로 변환하여 일반 전화(유선 또는 휴대폰)로 연결합니다.
  4. 반대로, 일반 전화(PSTN)에서 VoIP 사용자에게 전화가 올 경우, SIP 트렁킹을 통해 VoIP 네트워크로 전달됩니다.

3. SIP 트렁킹 구성 요소

1) IP-PBX (Internet Protocol - Private Branch Exchange)

  • 기업 내에서 사용되는 VoIP 전화 시스템
  • SIP 트렁킹을 사용하여 외부 통화(PSTN)와 연결됨
  • 예: Asterisk, FreePBX, 3CX, Cisco Unified Communications Manager

2) SIP 트렁크(SIP Trunk)

  • IP-PBX와 SIP 제공업체 간의 연결을 담당하는 가상 트렁크
  • VoIP 및 PSTN 네트워크 간 음성 및 데이터 송수신 역할

3) SIP 제공업체 (VoIP 사업자)

  • SIP 트렁킹을 제공하는 서비스 사업자
  • 일반 PSTN과 연결하여 VoIP 사용자가 일반 전화번호와 통화 가능하게 함
  • 예: Twilio, Bandwidth, Plivo, Telnyx, Vonage, AT&T, Verizon

4) PSTN (Public Switched Telephone Network)

  • 전통적인 유선 및 이동통신 네트워크
  • SIP 제공업체를 통해 VoIP에서 PSTN으로 변환됨

4. SIP 트렁킹의 장점

1) 비용 절감

  • 기존의 ISDN PRI(Primary Rate Interface) 회선이나 아날로그 회선보다 저렴함.
  • 인터넷을 통해 통화하므로 국제전화 및 장거리 통화 비용을 절감.

2) 유연성과 확장성

  • 물리적인 회선이 필요 없고, 필요한 만큼 SIP 채널을 유동적으로 추가 및 삭제 가능.
  • 기업이 성장함에 따라 쉽게 확장 가능.

3) 다중 위치 연결

  • 여러 지사 및 원격 근무자들을 단일 SIP 트렁킹을 통해 연결 가능.
  • 기존 PSTN보다 효율적인 통신 네트워크 구축 가능.

4) 음성, 영상, 메시징 지원

  • 음성 통화뿐만 아니라 영상 통화(Video Calling), SMS, 팩스(FoIP: Fax over IP)까지 지원.

5) 향상된 복원력 및 장애 대응

  • 클라우드 기반 SIP 트렁킹 서비스는 백업 및 장애 조치를 쉽게 설정할 수 있음.
  • 한 지역의 전화 시스템이 다운되더라도 다른 지점 또는 클라우드 서비스로 라우팅 가능.

5. SIP 트렁킹 vs 기존 전화 시스템(ISDN PRI)

비교 항목SIP 트렁킹ISDN PRI (전통 전화 회선)

네트워크 유형 인터넷(IP 기반) PSTN (TDM 기반)
회선 방식 가상 회선 (소프트웨어적 확장 가능) 물리적 전화 회선 필요
확장성 필요에 따라 유동적으로 증가 가능 23개 또는 30개 채널 단위로 추가 필요
비용 낮음 (인터넷 기반) 높음 (전화 회선 추가 비용)
국제전화 비용 저렴함 (VoIP 기반) 비쌈
장애 복구 클라우드 기반 장애 대응 가능 장애 발생 시 복구 어려움
설치 및 유지보수 간단함 (인터넷 연결만 필요) 복잡함 (전용 회선 설치 필요)

📌 결론: SIP 트렁킹은 기존 전화 시스템(ISDN PRI)보다 유연하고 저렴하며, 확장성이 뛰어남.


6. SIP 트렁킹을 활용한 실제 사례

① 기업 내 VoIP 전화 시스템 구축

  • 대기업 및 중소기업이 사내 전화망(IP-PBX)을 구축하여 모든 통화를 SIP 트렁킹을 통해 처리.
  • 예) 기업용 VoIP 서비스(Zoom Phone, Microsoft Teams Direct Routing, Cisco Webex Calling)

② 콜센터(컨택센터)

  • SIP 트렁킹을 활용하여 고객지원센터에서 수천 개의 동시 통화를 처리할 수 있음.
  • 콜센터는 SIP 트렁킹을 통해 글로벌 고객과 저렴한 비용으로 연결 가능.

③ 국제전화 및 원격 근무 지원

  • 다국적 기업이 SIP 트렁킹을 통해 여러 국가에서 로컬 전화번호를 제공하고, 본사로 라우팅.
  • 원격 근무자가 인터넷을 통해 회사의 SIP 트렁킹을 활용하여 외부와 통화 가능.

④ PSTN과 VoIP 연동

  • 기존 PSTN(일반 전화망)과 VoIP(인터넷 기반 통신) 간의 연결을 위해 SIP 트렁킹이 필수적으로 사용됨.
  • 예) Google Voice, Twilio Voice API, WhatsApp Business Call 지원

'통신' 카테고리의 다른 글

SIP 호 처리란?  (0) 2025.02.27

SIP 호 처리란?

**SIP(Session Initiation Protocol) 호 처리(Call Processing)**는 인터넷 전화(VoIP) 및 멀티미디어 세션을 설정, 유지 및 종료하는 과정에서 SIP 프로토콜이 수행하는 일련의 작업을 의미합니다. SIP는 음성, 영상, 메시징 등 다양한 실시간 커뮤니케이션을 지원하는 표준 프로토콜로, 주로 IP 네트워크 기반의 통신 시스템에서 사용됩니다.


1. SIP 프로토콜 개요

SIP는 인터넷 엔지니어링 태스크 포스(IETF)에서 정의한 응용 계층 프로토콜이며, RFC 3261을 기반으로 합니다. 주요 역할은 세션을 설정(Invite), 수정(Reinvite), 종료(Bye) 하는 것입니다.

SIP는 아래와 같은 네 가지 주요 기능을 수행합니다.

  1. 사용자 위치(User Location): 네트워크 내에서 상대방의 현재 위치를 파악
  2. 사용자 가용성(User Availability): 상대방이 통화 가능한 상태인지 확인
  3. 호 설정(Call Setup): 세션을 설정하고 미디어(음성, 영상 등) 교환을 준비
  4. 호 해제(Call Termination): 세션 종료 및 자원 해제

2. SIP 호 처리(Call Processing) 과정

SIP 기반의 호 처리 과정은 일반적으로 다음과 같은 단계로 이루어집니다.

① 세션 설정(Session Establishment)

  1. Invite (초대)
    • 발신자(UAC, User Agent Client)가 수신자(UAS, User Agent Server)에게 SIP INVITE 메시지를 보냅니다.
    • 메시지에는 발신자의 정보, 수신자의 정보, 세션 매체 정보(SDP 포함) 등이 포함됩니다.
  2. 100 Trying
    • 중간 프록시 서버 또는 수신자가 요청을 수락하기 전에 "100 Trying" 메시지를 반환하여 요청을 처리 중임을 알립니다.
  3. 180 Ringing
    • 수신 단말이 호출을 수락할 준비가 되면 "180 Ringing" 메시지를 보내어 호출이 울리고 있음을 알립니다.
  4. 200 OK (호 수락)
    • 수신자가 통화를 수락하면 "200 OK" 메시지를 보냅니다.
    • 이 메시지에는 수신자가 사용할 미디어 정보(SDP)가 포함됩니다.
  5. ACK (확인)
    • 발신자가 "ACK" 메시지를 보내 응답을 확인하고 통화가 시작됩니다.

② 세션 진행(Session Handling)

  • 호가 설정된 후, RTP(Real-time Transport Protocol) 또는 SRTP(Secure RTP)를 통해 실시간 음성 및 영상 데이터가 전송됩니다.
  • 세션 중에는 SIP 프로토콜을 통해 세션을 변경할 수도 있습니다. (예: 보류(Hold), 트랜스퍼(Transfer), 컨퍼런스(Conference) 등)

③ 세션 종료(Session Termination)

  1. BYE (호 종료 요청)
    • 세션을 종료하려는 사용자가 "BYE" 메시지를 보냅니다.
    • 발신자 또는 수신자 중 어느 쪽이든 보낼 수 있습니다.
  2. 200 OK (확인)
    • 상대방이 "200 OK" 메시지를 보내어 세션 종료를 확인합니다.
    • 미디어 세션이 해제되고, 통화 종료.

3. SIP 호 처리 관련 추가 기능

SIP 호 처리 과정에서 다양한 기능이 추가될 수 있습니다.

1) Call Forwarding (착신 전환)

  • 특정 조건에서 다른 번호로 통화를 자동 전환하는 기능
  • SIP 프록시 서버가 INVITE 메시지를 리디렉션할 수 있음

2) Call Hold (통화 보류)

  • SIP의 "Re-INVITE" 메시지를 통해 RTP 스트림을 일시 중지할 수 있음
  • 통화 중 다른 작업 수행 가능

3) Call Transfer (호 전환)

  • Blind Transfer: 현재 통화를 다른 사용자에게 즉시 넘김
  • Attended Transfer: 통화 전 상대방과 연결된 후 넘김

4) Call Waiting (통화 대기)

  • 다른 통화를 진행 중일 때 새로운 통화를 받을 수 있도록 SIP가 여러 세션을 관리

5) SIP Forking (다중 종단 장치 벨 울림)

  • 하나의 SIP 계정으로 여러 장치(예: 스마트폰, 데스크폰, 소프트폰 등)가 동시에 호출을 받을 수 있음

4. SIP 호 처리를 위한 주요 구성 요소

SIP 호 처리는 다양한 네트워크 요소가 협력하여 수행됩니다.

구성 요소설명

User Agent (UA) SIP 클라이언트 역할을 수행하는 단말기 (예: 소프트폰, IP 전화기)
SIP Proxy Server SIP 메시지를 라우팅하여 최적의 경로로 전달
SIP Registrar Server 사용자 위치를 등록하고 위치 정보를 관리
SIP Redirect Server 통화 요청을 다른 위치로 리디렉션
SIP Gateway PSTN(일반전화망)과 IP 네트워크 간의 SIP 변환 수행

5. SIP 호 처리의 실제 적용 사례

  • VoIP 전화 서비스 (예: Zoom, Skype, Cisco Webex)
  • IP-PBX 시스템 (사내 전화망 관리)
  • 통신 사업자(통신사) IMS 네트워크 (예: KT, SKT, LG U+의 VoLTE 서비스)
  • 인터넷 기반 고객 지원 센터(Contact Center)
  • 기업용 UC(Unified Communications) 솔루션

6. 결론

SIP 호 처리는 VoIP 및 멀티미디어 통신의 핵심 기능으로, 세션 설정, 유지, 종료를 포함하여 다양한 부가 기능을 제공합니다. 네트워크 인프라에서 SIP 프록시, 게이트웨이, PBX 등이 협력하여 안정적인 통화를 가능하게 합니다.

즉, SIP 호 처리는 인터넷 전화 및 IP 기반 통신 시스템의 "전화 걸고 받는 과정"을 수행하는 핵심 기술이라고 할 수 있습니다.

'통신' 카테고리의 다른 글

SIP 트렁킹이란?  (0) 2025.02.27

CentOS에서 PostgreSQL을 yum을 사용하여 설치하는 방법은 다음과 같습니다:

먼저, root 사용자로 로그인합니다.

PostgreSQL 패키지를 설치하기 위해 EPEL 저장소를 활성화합니다. 다음 명령을 실행합니다:

sudo yum install epel-release

PostgreSQL 패키지를 설치합니다. 다음 명령을 실행합니다:

sudo yum install postgresql-server

PostgreSQL 데이터베이스 클러스터를 초기화합니다. 다음 명령을 실행합니다:

sudo postgresql-setup initdb

 

PostgreSQL 서비스를 시작하고 부팅 시 자동으로 시작되도록 설정합니다. 다음 명령을 실행합니다:

sudo systemctl start postgresql
sudo systemctl enable postgresql

PostgreSQL 서버에 액세스하기 위해 PostgreSQL 사용자 계정의 암호를 설정합니다. 다음 명령을 실행합니다:

sudo passwd postgres

PostgreSQL 사용자로 전환합니다. 다음 명령을 실행합니다:

su - postgres

PostgreSQL 콘솔에 접속합니다. 다음 명령을 실행합니다:

psql

 

 

1. Program.cs에서 프로세스의 진입점을 분기한다.

internal static class Program
    {
        /// <summary>
        /// 해당 애플리케이션의 주 진입점입니다.
        /// </summary>
        static void Main(string[] args)
        {
            if (Environment.UserInteractive)
            {
                Console.WriteLine("콘솔");

                Service1 service1 = new Service1();
                service1.TestStartupAndStop(args);
            }
            else
            {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[]
                {
                    new Service1()
                };
                ServiceBase.Run(ServicesToRun);
            }
        }
    }

2. Service1.cs (이름 다를 수 있음)에 디버깅용 함수를 추가한다.

internal void TestStartupAndStop(string[] args)
{
    Console.WriteLine($"Service starting...");
    this.OnStart(args);
    Console.WriteLine($"Service started. Press any key to stop.");
    Console.ReadKey();
    Console.WriteLine($"Service stopping...");
    this.OnStop();
    Console.WriteLine($"Service stopped. Closing in 5 seconds.");
    System.Threading.Thread.Sleep(5000);
}

3. 빌드 & 명령어로 서비스 생성

서비스 생성

1) cmd를 관리자 권한으로 실행

2) InstallUtil.exe가 위치한 경로로 이동 : cd C:\Windows\Microsoft.NET\Framework\v4.0.30319 

3) cmd에서 서비스 Install : InstallUtil.exe C:\\VisualStudio프로젝트경로\Service(서비스명).exe

 

4. 삭제

sc delete 서비스 명

 

추가로 서비스 명 설정 등 기본 프리셋은 ProjectInstaller.Designer.cs에서 아래와 같이 할 수있다.

private void InitializeComponent()
{
    this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
    this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();
    // 
    // serviceProcessInstaller1
    // 
    this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
    this.serviceProcessInstaller1.Password = null;
    this.serviceProcessInstaller1.Username = null;
    this.serviceProcessInstaller1.AfterInstall += new System.Configuration.Install.InstallEventHandler(this.serviceProcessInstaller1_AfterInstall);
    // 
    // serviceInstaller1
    // 
    this.serviceInstaller1.Description = "CNC Collector Installer";
    this.serviceInstaller1.DisplayName = "WinSvr.CNC.Collector";
    this.serviceInstaller1.ServiceName = "CNCCollector";
    // 
    // ProjectInstaller
    // 
    this.Installers.AddRange(new System.Configuration.Install.Installer[] {
    this.serviceProcessInstaller1,
    this.serviceInstaller1});

}

Flask로 웹서버를 임시로 기동하면

WARNING : This is a development server. Do not use it in a production deployment.

Use a production WSGI server instead.

라는 문구를 볼 수 있다.

 

개발환경과 같이 단 건의 요청을 처리하는데는 flask를 써도 상관없지만

상용과 같이 high load 환경에서 flask는 분산처리가 제대로 되지 않아 요청을 처리하는데 실패하거나, 처리가 지연돼서 read timeout이 발생하기 쉽다.

 

이러한 문제를 해결하기 위해 nginx와 WSGI 서버를 사용하는 것이 정석이다.

나의 경우 API 서버라서 nginx를 사용하지 않고 WSGI 서버만 사용하고싶었다.

 

다른 출처에서는 gunicorn으로 flask의 app.py를 한번 더 감싸는 방법을 소개하는데,

flask의 app.py를 gunicorn 모듈로 실행하는 방법도 있다.

명령어는 

gunicorn --workers=1 --threads=4 --bind 0:5000 --timeout=0 file_name:app

이고, 

nohup 명령어를 이용해서 백그라운드로 실행할 수도 있다.

 

Flask나 Locust와 같이 웹서버를 기동하는 경우 flask run 이나 locust 명령어 실행시 특정환경에서

Fatal error in launcher: Unable to create process using "실행경로"와 같이 나오는 경우가 있다.

 

이 경우 python -m 이라는 명령어 (모듈로 인식)를 쓰면 정상적으로 동작한다.

pip install pywin32를 설치하는 방법으로 해결이 안될때,

conda를 사용하는 경우 conda로 설치하면 해결이 될 수 있다.

 

conda install -c anaconda pywin32

로 설치하면 끝!

pip로 설치할때 네트워크에 따라 SSL: CERTIFICATE_VERIFY_FAILED가 발생하는 경우가 있다.

 

이런 경우 trusted host임을 명시해야되는데

 

pip --trusted-host pypi.org --trusted-host files.pythonhosted.org install 패키지명

과 같이 입력하면 설치가 가능하다.

conda의 경우

conda config --set ssl_verify False

와 같이 SSL 인증을 안하도록 바꾸고

conda install -c anaconda 패키지명

으로 설치하면 된다.

 

 

 

 

 

약 2기가정도가 운영체제이고 남은 공간은 할당되지 않은 상태인데 그대로 라즈베리파이에 넣으면된다.

할당되지 않은 공간은 처음 부팅이 되면서 할당된다

첫 login은 ubuntu/ubuntu로 하면된다.

바로 비밀번호를 변경해준다.

 

 

우선 인터넷 연결을 위해 ip를 잡아준다.

1) 최상위 경로로 이동(cd .. 두번)

2) sudo nano etc/netplan/50-cloud-init.yaml

network:
  ethernets:
    enp0s3:
      addresses: [192.168.0.136/24]
      gateway4: 192.168.0.1
      nameservers:
        addresses: [8.8.8.8,8.8.4.4] #네임서버 설정이 안되면 apt upgrade가 안됨
  version: 2

3) sudo netplan apply : 설정 적용

[sklearn] cython 코드 수정하기

 

sklearn 패키지의 일부 알고리즘은 속도를 위해 c언어 기반의 python으로 작성되어있다.

일반적으로 이 수준의 알고리즘을 변경할 일이 거의 없어서 그런지 site-package에 있는 코드는 이미 컴파일이 된 상태라서 수정이 불가능했다. 환경은 ubuntu이고 python은 3.8에서 테스트하였다.

 

수정을 하기 위해서는

1. sklearn 의 깃 저장소에서 컴파일되지 않은 코드 _cd_fast.pyx 파일을 다운받는다.

2. 컴파일된 파일과 같은 경로에 추가한다.

3. _cd_fast.pyx 를 입맛대로 바꿔서 다시 컴파일한다.

 

3. 의 과정을 자세히 설명하자면,

우선, pyx 파일을 컴파일하기 위해 cython이 설치되어 있어야한다.

그리고 setup.py 파일을 만들어 pyx 파일을 컴파일하는 코드를 추가해야한다.

import numpy
from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("_cd_fast.pyx"),
    include_dirs=[numpy.get_include()]
)

이 코드를 실행시키는 코드는 아래와 같으며, cython 문서를 참조하면 된다.

python setup.py build_ext --inplace

 

코드 수정 과정에서 발생한 에러와 해결방법은 아래와 같다.

 

not allowed without gil error

cython에서는 gil (global interpreter lock) 이라는 cpu processing 방식이 존재하는데 코드 중 with nogil 이 있는곳에 코드를 임의로 수정하는 경우 아래와 같은 에러가 발생할 수 있다. 이 경우 with nogil의 코드블럭을 주석처리하면 에러가 사라진다. 

 

gcc failed with exit status 1

컴파일 과정에서 꽤 자주 발생할 것 같은 에러이다. gcc가 설치 되어있다는 가정하에 아래와 같은 에러가 뜬다면 코드를 추가하여 해결할 수 있다.

from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("_cd_fast.pyx")
)

import numpy
from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("_cd_fast.pyx"),
    include_dirs=[numpy.get_include()]
)

include_dirs=[numpy.get_include()]를 추가하면 에러를 해결할 수 있다.

 

+ Recent posts