[KakaoTalk+] 보이스톡 (voice talk)에 관한 이야기

오랜만입니다!

너무 간간히 나타나서 제 사는 이야기만 한 느낌인지라.. 오늘은 약간 테크니컬한 주제를 다루도록 하겠습니다.
ㅎㅎ 알맞은 주제로 뭐가 있을까 고민하다가 얼마전에 (다시) 분석을 시작한 카카오톡에 대해서 시작하기로 결정했습니다.
약 1년전쯤에 아는 형의 부탁으로 시작한 카카오톡 분석을 해서 proof-of-concept을 만들어보기도 했는데요..
그 사이에 카카오톡이 ‘겁나빠른황소프로젝트’ 를 통한 패킷경량화 및 ‘VoiceTalk (보이스톡)’ 이라는  m-voip 기능추가를 하면서
꽤 많은 부분이 바뀌었습니다. 아예 인프라스트럭쳐가 바뀌었다고 해도 과언이 아니겠네요.

일단 오늘은 우선 카카오톡의 최신 기능인 m-voip 서비스 — 보이스톡 — 에 대해서 간단히 얘기해보도록 하죠.

 

보이스톡은 2012년 6월 즈음에 베타테스팅을 시작한 mobile voice over ip (음성대화) 서비스로서 iOS는 카카오톡 버전 2.9.0부터,
Android는 3.2.1 부터 신청/사용 가능했습니다 [보이스톡 관련 카카오톡 블로그 글]. 출범하기 전부터 말이 많았던 서비스죠.
방통위, 이통사, 카카오.. 각자의 싸움 및 언론플레이가 시작됬죠.. 새로운 요금제를 도입해야한다는 둥, 고의적인 패킷드랍을 하고있다는 둥.

사람들이 스카이프나 보이스톡과 같은 m-voip을 이용하기 시작하면 사실상 ‘무료’ 전화가 되는것이기에 이동 통신사 입장에서는 반가울리 없겠죠. 하지만, 그것 뿐만 아니라 3G나 4G망에서 서비스를 이용하는 사용자가 급증할 수록 네트워크에 오는 기술적/경제적 부담도 가중화 되기때문에, 반발하고 있는 것입니다. 뭐, 사실 저같은 엔드유져 입장에서야 한국에 있는 지인들 및 가족과 공짜 전화하게 해준다는데 나쁠거 없죠 ㅎㅎ

보이스톡 서비스가 시작된 후 머지않아 많은 사람들이 서비스의 불안정성에 대해서 꼬집었고 (음질 저하 및 콜 드랍) 이에 카카오톡 측은 “통신사가 고의적으로 패킷 손실을 유발하고 있다 [기사]”라고 주장하며 패킷 손실률을 [공개]하기 시작했습니다. 이에 궁금증이 생겨 살짝 분석을 해보았습니다.
<이하부터는 편한(?) 설명을 위해 반말을 사용하겠습니다..ㅋㅋ>

 

질문 1. 왜 아이폰과 안드로이드폰에서만 지원되는가?

카카오톡 앱은 iOS, Android, BlackBerry, Bada, 그리고 Windows Phone까지 총 5가지 OS에 대해서 지원하고 있다.
하지만 이 중에서 보이스톡 기능을 탑재한 앱은 iOS용과 Android용 뿐이다.
개발 인력 부족 등 여러 이유가 있을 수 있지만.. 그 중 가장 가능성 높은 이유는 portability.. 즉, 얼마나 각기 다른 앱으로 이전하고 구현하기가 쉽냐 이다.
본론으로 들어가서 설명하겠지만, 카카오톡이 최근 윈폰앱을 내놓았음에도 불구하고  보이스톡을 바로 지원하지 ‘못’하는 이유는 (안하는게 아니다) 이 portability에 있다. iOS에서는 Objective-C 언어로 프로그램 개발을 하게 되지만, 속도 증진을 위해서 그리고 원하는 특정 C 라이브러리를 사용하고 싶어하는 프로젝트를 위해서 native C 코드 라이브러리를 링크할 수 있다. 안드로이드에서도 마찬가지로, JNI를 통해서 Java가 아닌 C와 같은 native code를 실행시킬 수 있다. 보안적인 이유에서 사용을 비추천하고 있지만, 워낙 다양한 라이브러리 (확장성)를 제공하고 퍼포먼스 향상에 도움이 되기 때문에 실제로 사용되는 경우가 꽤 많다.

보이스톡도 예외가 아니다. 보이스톡의 가장 핵심적인 부분은 C 코드로 작성된 라이브러리다.
이걸 iOS 앱에서 돌리려면 보통은 Objective-C 코드로 포팅을 해야하고,  Android 앱에서 돌리려면 Java 코드로 포팅을 해야한다.
근데 솔직히 누가 C로도 짜기 귀찮은 voip 코드를 각 언어에 맞춰서 포팅을 어느세월에 한단 말인가. 게다가 얼른 투자 받아야하는 입장인데 말이다 :p
무엇보다 native code library가 이런 상황에서 메리트 있는 이유는 코어는 그대로 두고 각 앱에서 이 라이브러리를 사용하는 wrapper 함수들만 만들어주면 된다는 점이다. 즉, 노가다를 심각하게 줄여준다.

하지만, 난 개인적으로 카카오톡 개발자들이 어떤식으로 윈폰7 앱에 보이스톡 기능을 추가할지 궁금하다.
왜냐하면 현재 윈폰7 세계에서는 iOS나 Android처럼 편하게 native code를 실행할 수 없기 때문이다. 불행 중 다행으로 얼마전에 나온 Windows Phone 8 발표에서 native code 실행을 지원하겠다고 했으니, 그땐 iOS나 Android에서 하는 방법대로 할 수 있으리라 (어쩌면 개발자들은 벌써 작업하고 있을지도 모른다..). 이같은 이유로 BlackBerry와 Bada는 얘기할 필요도 없다.

사실, 이제 회사가 돈도 좀 있고 개발인력도 늘어났으니 자체적으로  각 OS에 특화된 m-voip 라이브러리를 작성하고 있을지도 모르겠다. 어찌됐든 글을 쓰는 이 시점에는 앞서말한 두 OS에서만 보이스톡이 지원된다.

 

질문 2. 어떻게 패킷 손실률을 정확히 알 수 있을까?

카카오톡 측에서 ‘자료’를 제시했다고 했다. 이 자료의 출처는 어디고 어떻게 수집한 것일까?
이 질문에 대한 답은 꽤 쉽게 찾을 수 있었다.
다음은 Android용 카카오톡 앱 패키지의 lib/armeabi 에 첨부된 libVoxCore.so라는 shared library 코드의 일부분이다. 아래에서 get_qosInfo 라고 명시된 함수가 QoS (Quality of Service) 데이터를 프로파일링해서 보기 좋은 포맷으로 바꿔주는 역할을 한다.

통화 종료 후 로그되는 데이터 중 하나인 qosInfo

get_qosInfo 함수

뭐.. 사실.. 위의 스샷은 뭔가 있어보이라고 넣은거고..
중요한 부분은 get_qosInfo 함수에 있는 포맷 스트링이다:
“Tx=%d,TxLoss=%d,Rx=%d,RxLoss=%d,RTT=%d,Start=%s,End=%s,Duration=%llu,vc=%d”

각각이 정확히 무슨 인자인지는 알 수 없으나, 쉽사리 이해할 수 있는 파라미터들이 있다.

    • Tx: Transmit Packet (전송된 패킷)
    • TxLoss:  Transmit Packet Loss (전송 실패한 패킷 [전송 손실])
    • Rx: Receive Packet (수신된 패킷)
    • RxLoss: Receive Packet Loss (수신 실패한 패킷 [수신 손실])
    • RTT: Round Trip Time (패킷 전송 + ACK 받을 때까지의 시간) — 하지만 시간이라고 하기엔 %d 때문에 잘 모르겠다.
    • Start: 시작 시간?
    • End: 종료 시간?
    • Duration: 통화 시간
    • vc: …wtf?

뭐 어찌되었든.. 중요한건 TxLoss와 RxLoss 아니겠는가. 이 정도 정보면 패킷 손실률 및 네트워크 속도 저하등을 계산하는건 초등학교 수학 수준이다.

근데 분석을 하면서 조금 걸렸던 부분은.. 첫번째 스샷에서 발견한 사람도 있겠지만.. 로깅되는 정보가 QoS 정보만이 아니라는 점이다.
물론 처음부터 끝까지 분석을 한게 아니므로 (총 20여분정도 본거 같다..-_-)  이 중에서 서버에 전송되지 않는 정보가 있을지도 모르겠지만.. 느낌상 그래보이진 않는다. 혹시 궁금한 사람들이 있을지 모르니.. QoS정보와 함께 모아지는 데이터 리스트를 적어둔다:

    • userId: 사용자 고유 아이디 (닉네임이 아니고 가입할때 할당되는 64비트 int)
    • csId: …흠..채팅방 아이디? (카톡의 모든 ‘채팅창’은 ‘방’ 개념이다 — 1:1 대화라고 할 지라도)
    • callId: 현재 보이스톡 통화의 고유 아이디
    • reason: 통화 종료 이유 (아마도.. 연결이 끊겨버린건지 사용자가 직접 통화종료를 누른건지.. 정도?)
    • mediaError: 뭔지 모름 (코덱 에러 같은거?)
    • userInfo: 정확히 어떤 유져 정보인지 확인 안함
    • chatId: ..으잉 ㅋㅋ 채팅방 아이디가 요기잉네.. 그럼 csId는 뭐지..ㅡㅡㅋ
    • qosInfo: 위에서 설명함
    • jitStat: …wtf? 뭐.. statistics 같은건가..-_-

 

질문 3. m-voip 핵심기술 자체 개발… 그 뒤에 숨겨진 불편한 진실

사실은 ‘질문2’를 답하기 위해서 분석을 시작했다. 하지만, 분석을 시작한지 몇 분이 채 지나지 않아서 살짝 충격적인(?) 사실을 알아낼 수 있었다.
보이스톡이 나오면서 언론에서 많은 평가들.. 사회적인 이슈들.. 그리고 대표와의 인터뷰 등을 다뤘다.
그 중에서 항상 눈에 띄는 부분은 “자체적으로 개발한 m-voip 핵심기술” 이라는 내용이었다.
위에 링크한 카카오톡 블로그 글에도..

“카카오톡의 보이스톡은 전세계 사용자들을 대상으로 서비스하기 위해 서버 부담과 네트워크를 최소화하는 방향으로 직접 개발하였습니다.”

라는 문구가 있다. 전세계 사용자들을 대상으로 서비스하는 것도 좋고, 서버 부담 및 네트워크 트래픽을 최소화하는 것도 좋은데.. ‘직접 개발’했다는 말이 조금 걸린다. 솔직히 정확하게 어떤 부분을 ‘직접 개발’했는지는 나오지 않았기 때문에 아예 부정할 수는 없지만.. 내가 발견한건 난무하는 이런 언론플레이와는 조금 다른 결과였다.

“mVoIP는 음성망과 통할 수 없는 한계 때문에 완성도를 높이는 노력이 필요했고 자체 기술로 개발하려다 보니 시간이 더 걸렸다”

결론부터 말하자면, m-voip 코어 기술은 카카오톡의 ‘자체 기술’이 아니다. 앞서 잠깐 언급했듯이, 어디서부터 어디까지가 ‘자체 기술’이냐는 토론을 할 수는 있겠지만 적어도 voip에 사용된 프로토콜의 기반은 카카오톡이 자체적으로 개발한 기술이 아닌것이 확실하다. 어떤 근거에서 그렇게 말하냐고? 그럼 어떤 기술을 사용했고 원래 누가 만든거냐고?

이 역시 코드 분석에서 나온다. m-voip을 자체 개발했다는 말에 호기심이 생겨 프로토콜이나 알아볼까 하는 마음에 이것저것 파보기 시작했다. 솔직히 잘 알려지고 많은 곳에서 쓰이는 프로토콜이 존재하는데 굳이 새롭게 개발했다면 그럴만한 이유와 성능차이가 있었을 것이 아닌가. 궁금하지 않을 수 없었다. 물론, 실상을 알고 난 후에는 어느정도 실망감이 들었지만 한편으로는 카카오톡 개발팀이 꽤 reasonable한 개발자들의 집합이라는 생각도 할 수 있었다.

보이스톡에 사용된 voip용 코어 라이브러리는 libSRTP라고 불리는 IETF에 등록되어있는 RFC 3711에 설명된 Secure Real-time Transport Protocol (SRTP)라는 기술을 구현하여 오픈소스로 배포된 라이브러리이다. SRTP는 기존 voip 등에 사용되었던 RTP 프로토콜에 패킷 암호화등의 보안을 강화하고 또한 헤더 압축, low-bitrate 음성 코덱등에 최적화 시켜놓은 프로토콜이다. 이 프로젝트의 원 저자는 다들 잘 아실 Cisco Systems, Inc. 다 — 어찌보면 당연할지도.. 시스코 프로덕트 시장 중에 voip 솔루션이 라우터/스위치 다음으로 제일 클 테니..
여하튼, 친절하게 오픈소스로 공개를  해놓았으니 누구나 사용이 가능하다. 물론, 오프소스 세계에서는 라이센스가 무척 중요하다. 갖가지 라이센스 종류가 있지만, 특히 영리를 위한 회사에서 쓸 때는 더욱 조심해야한다 (비영리 목적으로만 허용하는 라이센스도 있기 때문에). 다행히도, 이 libSRTP는 BSD-style 라이센스라고 불리는 범주에 속한다. 여기에도 명시되어있지만 정말 자유로운 사용이 가능하다.. 비영리든 영리든 상관없이 말이다. 단, 딱 한가지 제약이 있다:

“Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. “

말그대로 (다른 프로젝트에 삽입하여) 재배포를 하기 위해서는 저 페이지에 적혀있는 그대로를 복사/붙여넣기 하기만 하면 된다는 거다. 소스 배포의 경우엔 소스에 삽입하거나 보통 COPYRIGHT 파일에 적게 되고, 카카오톡 처럼 소스코드 배포가 아닌 바이너리 형태로 배포가 된다면 이 라이센스를 사용자가 확인할 수 있는 곳에 (예: 웹사이트) 명시하면 된다 — 아니면, 적어도 패키징에 첨부를 하던가. 한 30여분간 카카오톡 앱의 패키지도 살펴보고 웹사이트도 둘러봤지만 어디에도 이 라이브러리에 대한 copyright 표기를 찾을 수 없었다.

또 한가지 예로, 윈폰용 카카오톡 앱에서는 DH.Scrypt라고 불리는 Asymmetric cryptography 라이브러리를 사용한다. 꽤 잘 짜여진 Silverlight/WP7 용 RSA 라이브러리이고, 여기에 오픈소스로 공개되어있다. 마찬가지로 라이센스에 대한 설명 중 하나를 보면 다음과 같다:

(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.

결론적으로 이 프로젝트의 코드를 사용하게 되면 copyright 문구를 명시하여야 된다. 역시 이에 대한 표기도 찾을 수 없었다.

그래서, 일단 카카오팀에 문의 메일을 보냈다. 전문은 다음과 같다:

안녕하세요

먼저, 편리하고 유용한 카카오톡 앱을 개발 및 유지해주셔서 감사드립니다 :)

다름이 아니라, 카카오톡에서 사용된 오픈소스 라이브러리/코드 등에 대한 라이센스와 그에 따른 copyright 표기 여부에 대해서 문의드리고 싶어서 메세지를 작성합니다.
특히, 보이스톡에 관련된 기술에 대해서 관심이 있습니다. 정확히 어느 부분이 카카오 자체개발인가요? 또한, 보이스톡에 외부 기술이 사용되었다면 그에 따른 라이센스/copyright 은 어디서 확인 할 수 있나요? 보통 Terms of Service/Use 에 적혀있는걸로 아는데 찾을 수 없었습니다.

답장 기다리겠습니다!
감사합니다

 

8일 이상 기다려서 받은 답변은 다음과 같았다… 매우 실망스러웠다..
또, 해외에 있기때문에 전화는 어렵고 이메일로 했으면 좋겠다는 내용과 왜 현재 답변이 불가능한지에 대해서 추후 질문을 하는 답장을 보냈지만 몇 일이 지나도록 답변이 없다.

카카오톡_답변

 

 

시간적 여유가 없어서 보이스톡 분석을 갓 시작한데다가 꾸준히 분석할 수 없을것 같아서 얼마나 더 걸릴지는 모르겠지만.. (게다가 ARM 어셈 분석은 토나온다.. 웩)
작은 궁금증에서 시작된 분석을.. 하드코어로 옮겨가야할 듯한 기분이 든다.
아마 분석을 계속 하면서 알아내면 재밌을만한 점은..

  • 어떤 오디오 코덱을 사용하는가? — 언론 인터뷰에서는 이 역시 자체개발된 코덱이라고 하는데.. 사실 믿기 어렵다
  • SRTP 파라미터는 무엇인가? (cipher, key derivation 등) — 이건 사실 조금 분석해놓긴 했지만.. 나중에 기회가 되면 공개하도록 함
  • SRTP 기반으로 해서 무언가 수정했다면, 어떤 부분을 어떻게 수정했나? — 그대로 갖다 썼을거 같지만.. 아니라면 꽤 흥미로울듯.. 실수로 취약점이 추가되었을수도있고..
  • SRTP에 대한 공격 리서치 — MITM (man-in-the-middle) 공격 같은 active공격기법이나 off-line으로 crypto 공격을 하는 방법이 있을듯

srtp_create 함수

 

마치며…

음.. 사실 좀더 기술적인 부분을 적고 싶었는데.. 실상 글을 쓰기 시작하고 보니까 별로 많이 알아낸게 없네요 -_-..
ㅋㅋ.. 이 부분 투자한 시간이 거의  제로에 가깝다는건 핑계입니다만.. 앞으로 두고 차근히 길을 밝혀나가는 기분으로 하면 될듯 싶습니다. 뭐 그래도 몇 달째 하고 싶었던 말은 했으니까요! 자꾸 기사에서 ‘자체 개발’ ‘자체 기술’ 해대는데 얼마나 거슬리던지.. 아무쪼록 이번 글을 통해서 제가 틀렸다고 나오든 인정을 하든.. 진실이 좀 밝혀졌으면 좋겠네요.

마케팅도 좋지만.. 사실이 아닌걸로 광고하는건 좀 아니잖아요?

하지만, 카카오 개발팀 분들에게는 존경심을 표합니다. 카카오톡 분석을 띄엄띄엄 해온지라 분석할 때마다 제가 느끼는 내부적 변화가 꽤 큰데, 소프트웨어 엔지니어 입장에서 배우는 점도 많고 느끼는 점도 많습니다. 뜯어볼때마다 ‘이 사람들은 자기들이 뭘 하는지 잘 아는구나’ 라는 느낌이 강해지네요. 특히 보안적인 부분에서 많이 보는데.. 보통 많이들 실수를 할 법한 곳에서도 꽤 견고한 코드를 볼 수 있었습니다. (흐흐.. 물론 결국 암호화 관련 실수(?)를 찾긴 했지만요.. 요건 다음 포스팅때 다뤄보도록 하죠..)

그럼 더욱 좋고 빠른 시스템을 만들어 주시길 기원하며~
화이팅입니다 :p

 

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

이번 글은 사실 그냥 제 사는 얘기가 궁금해서 오신 분들에겐 뭔 뚱딴지 같은 소리를 지껄여놓은 듯한 기분이 드실지도 모릅니다..ㅋㅋ
그래도 불행 중 다행(?)으로 기술적인 얘기보다는 사회적 이슈나 정책에 대한 제 견해를 더 많이 이야기 한것 같네요.

이 주제에 대해서 더 자세히 알고싶으신 분이나 같이 연구/분석을 하실 생각이 있으신 분들은 따로 연락 주시면 감사하겠습니다.
아무래도 혼자하려니 책임감도 안들고.. 바쁘다는 핑계로 무기한 미뤄놓고.. ㅋㅋ 진행이 안되네요

제 블로그 방문 및 긴 글을 읽어주셔서 감사합니다

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

 

 

You may also like...

11 Responses

  1. 치성사이다 says:

    너무 애매모하게 설명해놓으셔서 별 도움은…^^;
    명성만으로는 정말 인기 많으신 분이시라 기대하고 포스팅 봤는데 별로네요
    라는건 농담이고요 너무너무 유익한 글이네요. 감사합니다^^

    • Cai says:

      ㅎㅎ감사합니다~ 사실 뭐 어디에 도움되려고 쓴 글은 아니라서요 ㅋㅋㅋ.. 그냥 제 불평 정도로 봐주시면 되겠습니다 ㅎㅎ

  2. Dㅏㅎa says:

    올ㅋ 다음이 더 기대되는데 ㅋㅋ 잘읽고갑니다우

  3. lock K says:

    잘 읽었어용 ㅎ

  4. Cai says:

    다음은 11월 28일에 받은 메일입니다:
    ==========================================

    안녕하세요. (주)카카오의 ______ 입니다.

    다시 한 번 저희의 잘못을 지적해주셔서 감사합니다.
    지적해주신 내용은 다음과 같이 반영되었습니다.

    1. 안드로이드 최신버전(3.5.5)의 더보기 > 설정 > 버전정보 하단에 오픈소스 라이센스에 대한 부분을 추가하였습니다.
    2. 현재 승인 진행중인 아이폰 최신버전(3.3.0)의 더보기 > 설정 > 버전정보에도 추가되었습니다.(아직 애플 승인 전이라 릴리즈되지 않았습니다.)

    혹시 저희가 오픈소스 라이센스를 고지함에 있어서 부족한 부분이 있으면 추가적인 말씀부탁드리겠습니다.

    감사합니다.

    ==========================================

  5. 이현진 says:

    안녕하세요. 포스팅해놓으신 것 잘 읽었습니다. 저는 통신분야를 공부하고 있는 대학원생입니다. 음성 서비스의 성능에 대한 연구를 하고 있는데 VoIP에 관심이 있습니다. 검색하다가 좋은 자료가 있어서 많은 도움이 되었습니다. 위에 중에 jitStat는 제 생각에 지터 분석한 로그로 예상됩니다. 지연의 변화량이 얼마인가를 본것이죠. 그리고 카카오톡의 답변을 보고 찾아보니 세가지 음성 코덱이 사용되는 것 같습니다. iLBC라는 코덱과 GSM-FR 그리고 OPUS 코덱입니다. 셋다 음성패킷의 속도와 품질을 변경할 수 있는데 가장 낮은 성능이 GSM-FR이고 iLBC 그리고 OPUS 코덱 순입니다. 변화율도 OPUS가 가장 넓은 범위에서 사용되고요. 저는 안드로이드 카카오톡 3.7.3을 사용하고 있는데 보이스톡 최적화에 화성 금성, 목성 모드가 있더군요. 아마도 지연 또는 패킷 손실에 따라서 전송 코덱을 변경하는 것으로 예상됩니다.

  6. 이현진 says:

    카카오톡에서는 음성 코덱을 새로 개발했다기보다는 어떤 품질에서 어떤 코덱으로 음성을 전송하는 것이 좋을 것이다라는 정도를 기준으로 잡은 것 같은데… 저도 그냥 짐작만 되네요.

  7. Jules says:

    Hi Cai,
    Do you know what is the codec use by this app over rtp ?
    thanks

  8. Tommy Lee says:

    카톡 코댁이 궁금해서 검색하다 보게 되었는데..
    외국에 계시나봐요.. 저도 남미에 이민 나와 있는데…
    반갑고 내용 재미있게 잘 봤습니다.

Leave a Reply to 이현진 Cancel reply

Your email address will not be published. Required fields are marked *