이하, 첨부한 도면을 참조하여 바람직한 실시 예에 대하여 상세히 설명하기 로 한다.
도 1은 본 발명에 따른 사용자 에이전트(UA : User Agent)를 이용한 VoIP 서비스 시스템의 구조를 도시한 블록도이다.
도 1에 도시된 바와 같이, VoIP 서비스 시스템은 사용자 에이전트(200)를 활용하여 서비스 개발 시 인터넷 폰이나 게이트웨이 같은 서비스를 제공하는 상위 계층의 VoIP 응용 서비스(100)와, SIP 프로토콜에서 정의한 메시지, 즉 SIP 메시지를 처리하는 하위 계층의 사용자 에이전트(200)와, 외부에서 전송받은 SIP 메시지를 사용자 에이전트(200)에 제공하고 사용자 에이전트(200)에서 생성된 SIP 메시지를 외부로 송출하는 수송 프로토콜(300)로 구성된다.
사용자 에이전트(200)는 VoIP 응용 서비스(100)에게 SIP 프로토콜과 독립적의 API(Application Programming Interface)를 제공하며, 사용자 에이전트(200)를 구성하는 세부 모듈들은 세부 함수 및 라이브러리 형태로 제공될 수 있다. 이러한 사용자 에이전트(200) 내 세부 모듈에서 제공하는 세부 함수 및 라이브러리는 세부 모듈 내에서 또는 VoIP 응용 서비스(100) 내에서 서로 사용할 수 있도록 되어 있다.
사용자 에이전트(200)는 VoIP 응용 서비스(100)의 API 호출에 따른 내부 동작을 수행하고 해당 SIP 메시지를 처리하며 수송 프로토콜(300)을 통해 수신된 SIP 메시지에 대한 내부 동작을 수행하고, VoIP 응용 서비스(100)에 적절한 콜백 함수(callback function)를 호출한다.
VoIP 응용 서비스(100)는 사용자에게 다양한 사용자 인터페이스, 즉 GUI를 제공하고 사용자의 VoIP 서비스를 위한 조작에 따라 사용자 에이전트(200)에서 제공되는 API를 호출하며, 사용자 에이전트(200)에서 제공되는 API와 사용자 에이전트(200)에서 호출되는 콜백 함수를 이용하여 적절한 VoIP 서비스, 그 예로써 호 제어(호 시작, 호 종료, 호 취소) 기능과 음성 전송 기능을 사용자에게 제공한다.
여기서, 사용자 에이전트(200)에서 제공하는 API로는, CallSetupReq(), CallSetupRsp(), CallReleaseReq(), CallCancelReq(), CallModifyReq(), CallModifyRsp(), CallModifyCancelReq(), RegisterReq() 및 CapabilitiesReq()이며, VoIP 응용 서비스(100)에 정의된 콜백 함수는 CallSetupInd(), CallSetupCnf(), InformationInd(), CallReleaseInd(), CallCancelInd(), CallModifyInd(), CallModifyCnf(), CallModifyCancelInd(), RegisterCnf() 및 CapabilitiesCnf()이다.
상기와 같은 사용자 에이전트(200)의 구조는 도 2를 참조하여 설명한다. 도 2는 본 발명에 따른 사용자 에이전트의 내부 구조를 도시한 블록도이다.
도 2를 참조하면, 사용자 에이전트(200)는 VoIP 응용 서비스(100)의 API 호출에 따른 내부 동작을 하고 수신된 SIP 메시지에 대한 내부 동작을 하고 VoIP 응용 서비스(100)에 적절한 콜백 함수를 호출하는 SIP 메시지 처리 모듈(202), SIP 메시지를 생성하여 파싱하는 SIP 모듈(204), SIP 메시지 내의 바디 부분인 SDP 메시지를 생성하여 파싱하는 SDP 모듈(206), SIP 메시지 내의 사용자 정보를 이용하여 인증 기능을 담당하는 인증 모듈(208), 하위의 수송 프로토콜(300)인 UDP/TCP와 연결 및 데이터를 송수신하는 송수신 모듈(210)로 구성되며, 상위 계층인 VoIP 응 용 서비스(100)에 API를 제공하고 상위계층에서 정의한 콜백 함수를 호출함으로써 통신을 수행한다. 또한 사용자 에이전트(200)의 송수신 모듈(210)은 하위 계층의 수송 프로토콜(300)에서 제공되는 소켓 API를 통해 수송 프로토콜(300)과 통신을 수행한다.
여기서, 사용자 에이전트(200)는 SIP 시그널링에 대한 동작 부분을 담당하며, 사용자 에이전트(200)의 SIP 모듈(204) 및 SDP 모듈(206)은 SIP 메시지 및 SIP 메시지 내 바디 부분의 정보를 인코딩 및 디코딩시킨다.
사용자 에이전트(200)를 구성하는 각각의 모듈에서는 세부 함수 및 라이브러리 형태를 제공하며, 이러한 함수 및 라이브러리는 모듈 내에서 또는 VoIP 응용 서비스(100)내에서 서로 사용할 수 있도록 되어 있다.
이상과 같은 구조를 갖는 사용자 에이전트의 호 처리 과정은 도 3 내지 4를 참조하여 설명한다. 도 3 내지 도 4는 본 발명에 따른 사용자 에이전트의 호 처리 과정을 도시한 흐름도이다.
도 3을 참조하면, SIP 기반의 VoIP 응용 서비스(100)가 사용자 에이전트(200)에서 제공하는 API를 호출하면(S300), 사용자 에이전트(200)에서는 해당 파라메터 구조체에 대한 신택스 및 시멘틱을 체크하고(S302), 현재 호출된 API가 호출될 수 있는지를 판단하는 상태 정보 및 내부 호 관리 구조체를 체크한다(S304). 이어서 사용자 에이전트(200)는 해당 API가 호출될 때 그 역할을 수행하기 위해 생성할 SIP 메시지를 위한 내부 구조체를 할당하고(S306), 해당 SIP 메시지가 전송되는 상황을 저장하기 위한 상태 정보와 내부 호 관리 구조체 정보를 변경 및 저장하고(S308), SIP 메시지를 위한 내부 구조체 정보에서 SIP 메시지 스트림을 생성하고(S310), 생성된 SIP 메시지 스트림을 하위 수송 프로토콜(300)을 통해 전달한다(S312).
반대로, 도 4에 도시된 바와 같이, 하위 수송 프로토콜(300)을 통해 SIP 메시지 스트림을 수신한 사용자 에이전트(200)는 수신된 SIP 메시지 스트림을 파싱하여 내부 구조체 정보에 할당하고(S400, S402), 수신된 SIP 메시지에 맨데토리(mandatory) 헤더 등이 포함하고 있는지를 판단하기 위해 신택스를 체크하여 SIP 메시지의 타입이 어떤 타입인지를 판단한다(S404, S406).
단계 S406의 판단 결과, SIP 메시지 타입이 응답인 경우에 사용자 에이전트(200)는 응답 SIP 메시지를 처리하기 위해 VoIP 응용 서비스(100)의 콜백 함수를 호출하고, SIP 메시지 타입이 요청인 경우에 요청 SIP 메시지를 처리하기 위한 VoIP 응용 서비스(100)의 콜백 함수를 호출한다(S408, S410).
이러한 SIP 메시지는, 도 5에 도시된 바와 같이, 구조체로 정의되어 있으며, 그 구조는 스타트라인부(Startline), 헤더부(Header), 바디부(Body)로 구성된다. 스타트라인부의 구조체에는 MessageType. Method, MethodStr, RequestURI, SipVersion, StatusCode 및 ReasonPhrase가 정의되어 있으며, 헤더부의 구조체에는 향후에 추가 정의될 메소드 및 다양한 헤더를 수용할 수 있도록 HeaderType, HeaderValue, HeaderStr, next가 정의되어 있으며, 바디부의 구조체에는 BodyType, BodyValue, next가 정의되어 있다.
이러한 VoIP 서비스 시스템을 이용하여 하나의 송수신자간의 VoIP 서비스를 제공하기 위한 송수신자의 VoIP 응용 서비스와 사용자 에이전트간의 내부 처리 과정은 도 6을 참조하여 설명한다. 도 6은 VoIP 응용에서 사용자 에이전트에게 특정 기능을 요구하기 위해 호출하는 사용자 에이전트의 API 및 사용자 에이전트에서 관련된 메시지를 수신 시 VoIP 응용 서비스에게 이를 알려주는 콜백 함수를 위한 사용자 에이전트 내부에서 처리하는 SIP 메소드 처리 흐름도이다.
예를 들면, 도 6에 도시된 바와 같이, 송수신자의 VoIP 응용 서비스를 실행시킬 때 송수신자의 VoIP 응용 서비스는 송수신자의 사용자 에이전트에 정의된 InitailzeUA()를 호출한다. 또한, 송신자가 임의의 사용자, 즉 수신자와 호를 연결하기 위해 “Call Setup Exchange”에 관련된 버튼을 조작한 경우 송신자의 VoIP 응용 서비스는 호 설정을 위해 송신자의 사용자 에이전트에 정의된 CallSetupReq()을 호출한다.
이러한 VoIP 서비스 시스템의 사용자 에이전트(200)는 동일한 곳으로 또는 다른 곳으로의 호 설정에 대한 VoIP 응용 서비스(100)의 요구가 동시에 올 때, 서로 다른 사용자 또는 사용자가 동시에 호 설정을 요구할 때, 포킹으로 인해 사용자의 인스턴스(Instance), 사용자가 SIP를 설정한 기기, 예를 들면 이동 단말기, 터미널, 컴퓨터, PDA 등에 해당하는 다른 곳에서 동시에 응답이 올 때를 판단하고 이를 아래와 같이 처리한다.
첫 번째로, CallSetupReq()가 요구할 때 전송되어오는 SIP 주소가 내부에서 관리하는 To 주소에 존재하면, 즉 동일한 곳으로 두 번 이상 호 설정 요구를 하는 경우 VoIP 응용 서비스(100)는 에러 상황으로 한번만 지원 가능하도록 처리한다.
두 번째로, CallSetupReq()를 통하여 호가 설정되어 있거나 설정 중에 다른 SIP 주소로 CallSetupReq()를 통해 호 설정을 요구하는 경우, 즉 다른 곳을 두 번 이상 호 설정을 요구하는 경우에는 사용자 에이전트(200)의 내부에서는 에러 상황이 아니나 VoIP 응용 서비스(100)에서 제공하는 서비스에 따라 동시에 일어나지 않도록 처리 가능하다.
세 번째로, 하나의 사용자로부터 INVITE SIP 메시지를 수신하여 처리 중 다른 사용자로부터 INVITE SIP 메시지를 수신하는 경우, 즉 서로 다른 사용자로부터 동시에 호 설정 요구를 수신하는 경우에 사용자 에이전트(200)에서는 많은 경우에 발생될 수 있는 상황으로 에러 처리하지 않으나, VoIP 응용 서비스(100)에서는 두개의 호 설정 요구를 수용하지 않기 위해서 어느 하나를 비지(busy) 처리한다.
네 번째로, 한 사용자로부터 INVITE SIP 메시지를 수신하여 처리 중 동일한 SIP 주소의 사용자로부터 INVITE SIP 메시지를 수신하는 경우, 즉 동일한 사용자로부터 동시에 호 설정 요구를 수신하는 경우에 사용자 에이전트(200)는 에러 상황으로 에러 처리한다.
다섯 번째로, A 라는 사용자로부터 B라는 사용자로 INVITE SIP 메시지를 전송하였는데 A라는 사용자가 보낸 INVITE에 대한 최종 응답이 오기 전에 B라는 사용자로부터 A라는 사용자로 INVITE SIP 메시지를 수신한 경우, 즉 두 사용자가 동시에 호 설정 요구를 전송 및 수신하는 경우에 사용자 에이전트(200)는 에러 상황으로 VoIP 응용 서비스(100)에게 에러 상황을 알리고 추후 다시 시도 하도록 처리한다.
여섯 번째로, 임의의 사용자가 INVITE SIP 메시지를 전송 후 수용하겠다는 응답 메시지를 사용자의 한 인스턴스로부터 수신 후 상기 사용자의 다른 인스턴스로부터 다시 응답 메시지를 수신한 경우, 즉 호 설정에 대한 수용 응답을 동시에 수신한 경우에 사용자 에이전트(200)는 두 번째 이후에 전송되는 응답 메시지에 대한 호를 종료하도록 처리한다.
이러한 VoIP 서비스 시스템의 사용자 에이전트(200)에서는 수송 프로토콜(300) 중에서 UDP를 통해 전송되어온 SIP 메시지 또는 TCP를 통해 전송되어온 SIP 메시지를 독립적으로 처리하며, 이러한 처리 과정은 INVITE와 같은 메소드 전송 시, INVITE에 대한 응답 전송 시, 최종 응답에 대한 ACK 전송 시 등의 경우 수송 프로토콜(300)(UDP 또는 TCP)을 다르게 제공할 수 있도록 하기 위함이다. 여기서, 각 메소드별 Exponential BackOff 방식으로 전송하는데 필요한 최대 전송 횟수, 재전송 시작 시간, 재전송 종료 시간 등을 설정한 정보로 아래의 표 1이 사용된다.
메소드 |
최대 전송 횟수 |
초기값(T1) |
최종값(T2) |
SIP_METHOD_TYPE_INVITE |
7 |
500 |
4000 |
SIP_METHOD_TYPE_ACK |
1 |
500 |
4000 |
SIP_METHOD_TYPE_OPTIONS |
11 |
500 |
4000 |
SIP_METHOD_TYPE_BYE |
11 |
500 |
4000 |
SIP_METHOD_TYPE_CANCEL |
11 |
500 |
4000 |
SIP_METHOD_TYPE_REGISTE |
11 |
500 |
4000 |
표 1과 같이 재전송이 필요한 상황은 수송 프로토콜(300)이 UDP인 경우는 REGISTER, INVITE, CANCEL, BYE, OPTIONS 메소드 전송 시와 INVITE에 대한 최종 응 답 전송 시, TCP의 경우에는 INVITE에 대한 최종 응답 전송 시에 해당된다. 이때 타임아웃 함수(time_fuc)에서는 해당 재전송이 완료된 후, 타임 아웃 시에 수행되어야할 기능을 기술하고 있다.