본문 바로가기

컴퓨터 과학(CS)

[네트워크] 음성채팅이 진행되는 과정 [UDP][엄탱]

728x90

음성 채팅은 어떻게 진행되는 것일까요?

음성통신에 대해서 알아보겠지만, 원리는 문자 채팅이든 화상 채팅이든 다 같습니다. 단지, 어떻게 입력을 받고 어떻게 출력하는지에 대한 차이일 뿐이라고 생각합니다. 채팅은 데이터의 통신이고 이것은 네트워크 통신이기 때문에 네트워크 지식도 알아두면 좋습니다.

 

결론만 먼저 말하자면, 문자 채팅이든 음성 채팅이든 화상 채팅이든 A라는 유저가 채팅을 하면, 데이터가 전기신호로 변경되고 전기 신호는 데이터로 변경되어 서버로 전송되고 서버는 유저 A와 같은 채팅방에 있는 유저 B, 유저 C… 에게 데이터를 보내주게 됩니다.

 

 

순서대로 한눈에 보기 쉽게 정리를 해보겠습니다.

  1. 유저 A가 채팅을 입력한다.
  2. 입력한 데이터는 전기신호로 변경되어 서버로 보내지고 서버에서 다시 데이터로 변경된다.
  3. 서버는 데이터를 채팅방에 있는 유저들에게 보낸다.
  4. 서버에서 보낸 데이터는 전기신호로 클라이언트에게 도착하고 다시 데이터로 변환된다.
  5. 유저들끼리 통신 완료

지금부터 이 부분을 하나하나 뜯어가면서 어떻게 음성통신이 진행되는지 한번 살펴보겠습니다.

음성 데이터는 어떻게 입력이 되는 걸까요?

통신이 되려면, 우선 핸드폰 혹은 컴퓨터에 음성이 입력이 되어야 하는데 어떻게 하는 걸까요?

당연한 말이겠지만 문자 같은 경우는 키보드를 이용해서 컴퓨터에게 입력을 한다면, 음성 같은 경우는 기기마다 장착되어 있는 마이크를 통해 음성 데이터가 입력이 됩니다.

여기서 잠깐, 마이크는 어떻게 음성을 데이터로 변환시킬까요? 자세히는 알 필요 없지만, 알아두면 음성 통신을 구현하는데 어려움이 없을 거라 생각합니다. 마이크는 내부에 진동판으로 소리의 진동을 감지하고 이것을 전기 신호로 변환시켜 줍니다.

 

즉, 마이크의 원리를 바탕으로 소리를 내면 마이크가 소리의 미세한 진동을 감지하고 전기신호로 변환해 준 후에 컴퓨터에 입력이 되는 것이라고 생각이 됩니다.

 

이렇게 까지만 이해하고 넘어가도 괜찮을 것 같습니다 ㅎㅎ 마이크를 만들려는 것이 아니니까요 :)

Android 같은 경우에는 AudioRecord 라이브러리를 사용해서 음성 데이터를 입력받았던 걸로 기억이 납니다.

음성 데이터는 어떻게 실시간으로 주고받는 걸까요?

이제 음성데이터가 어떻게 입력을 받았는지 알았으니, 어떻게 실시간으로 주고받는지 알아봐야 할 것 같습니다.

문자 채팅은 타자를 입력하고 전송 버튼을 누르면 서버로 데이터를 전송하는데, 음성 채팅은 어떻게 데이터를 서버로 전송할까요?

 

다양한 방법이 있겠지만, 제가 개인 프로젝트를 진행했을 당시에는 Android에서 AudioRecord를 통해 녹음을 하고, 실시간으로 데이터를 계속 피어들에게 보냈습니다. 이때, 실시간으로 데이터는 어떤 전송 프로토콜을 사용하는 것일까요? 음성채팅에는 프로토콜을 잘 선택하는 게 중요하다 생각합니다. 

실시간 음성 통신 프로토콜!? (feat.UDP)

실시간 통신을 할 수 있는 프로토콜은 대표적으로 TCP와 UDP가 있는데, 어떤 프로토콜을 어떻게 선택하는 게 좋을까요?

 

TCP 같은 경우에는 데이터의 신뢰성을 보장하는 연결지향 프로토콜입니다. 

UDP 같은 경우에는 데이터의 신뢰성을 보장하지 않는 비연결지향 프로토콜입니다.

 

TCP는 데이터가 제대로 도착하지 않으면 TCP는 데이터를 재전송하는 방식으로 신뢰성을 보장합니다. 이렇게 재전송을 하며 데이터의 신뢰성을 보장하는 과정 중에 데이터 전송 속도가 떨어지게 되는 반면에,

UDP는 데이터의 신뢰성을 보내지 않고 나는 보낼게 너는 받던지 말든지 알아서 해라는 방식으로 데이터의 신뢰성은 줄이되 속도를 보장하게 됩니다.

 

 

정리하자면, TCP는 데이터의 신뢰성은 상향 전송 속도는 하향 이라면, UDP는 신뢰성은 하향 전송 속도는 상향했다고 보면 좋습니다.

 

그렇다면, 음성 채팅 같은 경우에는 어떤 프로토콜을 사용하면 좋을까요?

 

문자 채팅 같은 경우에는 속도보다는 데이터의 신뢰성이 더 중요한 기능입니다. 채팅 중에 자음이나 모음 혹은 단어가 제대로 보내지지 않는다면, 어떨까요?? 엄청난 오해를 불러올 수 있다고 생각됩니다. 반면에, 음성 채팅 같은 경우에는 데이터가 제대로 보내지지 않는다 하더라도 채팅 같은 데이터보다 수많은 데이터가 보내지기 때문에 상대방의 말을 제대로 들을 수 있습니다. 하지만 음성채팅에서 속도가 보장되지 않는다면 어떨까요? 서로가 서로에게 왜 대답이 없냐고 답답해하지 않을까요?

 

그렇기 때문에 음성채팅은 데이터의 신뢰성보다 속도가 우선시 되기 때문에 실시간 통신에서 UDP를 사용하는 게 적합하다고 생각되어 저는 UDP를 선택했습니다.

데이터가 통신되는 과정

이제 ‘음성’ 데이터가 어떻게 입력되고 어떻게 실시간으로 보내는지 알아봤으니, 데이터 자체가 어떻게 저 멀리 있고 선 같은 걸로 물리적으로 연결도 되어있지 않는 다른 컴퓨터(서버)에 전송이 되는 걸까요?

 

이 과정은 배워두면 참 재밌습니다. 제가 위에 설명을 했지만 데이터는 전기신호로 변경되어 무선이면 무선 케이블 혹은 유선 케이블을 통해 전기가 이동하게 되고 올바른 주소(IP)에 도착하면 다시 전기신호는 데이터로 변환됩니다. 이 과정을 대표적으로 나타낸 게 ‘OSI 7 계층’과 ‘TCP/IP 4 계층’입니다.

 

OSI 7 계층과 TCP/IP 4 계층은 데이터 통신 과정을 7개, 4개 계층으로 분류한 모델입니다.

저는 여기서 OSI 7 계층을 통해서 데이터가 어떻게 이동되는지 알아보겠습니다!

 

아래 대표적인 그림이 있습니다. 먼저 그림부터 보겠습니다.

 

 

OSI 7 계층을 보면 1층 물리계층, 2층 데이터링크 계층, 3층 네트워크 계층 … 7층 응용프로그램 계층이 있습니다. 자세히는 몰라도 각각의 계층이 어떤 역할을 하는지 알려드리겠습니다.

1층 물리 계층(Physical Layer)

간단 정리 : 데이터(프레임 단위) ↔ 전기적인 신호 변환 하여 주고받는 계층

1층에서는 제가 말씀드렸던, 데이터가 전기적인 신호로 혹은 전기적인 신호가 데이터로 변환되는 계층입니다. 또한, 1층에서 사용되는 변환되는 데이터 단위는 프레임 단위로 2층에서 만들어진 단위입니다. 해당 계층에서는 데이터가 무엇이고, 에러를 검출하지 않으며 대표적인 장비로는 통신 케이블이 있습니다.

2층 데이터링크 계층(DataLink Layer)

간단 정리: 오류를 검출하고 재전송하는 계층

2층 계층은 사실 간단 정리를 하기에는 제공하는 기능이 많습니다. 데이터그램을 프레임 단위로 변경하는 Framing, 신호 간의 충돌이 발생하지 않도록 제어하는 회선 제어, 송수신자 간 데이터를 처리하는 속도 차이를 해결하기 위한 흐름제어, 대표적으로 오류 및 에러를 탐지하는 오류 제어가 있습니다. 추후에 더 자세히 알아보는 포스팅을 해보겠습니다.

3층 네트워크 계층(Network Layer)

간단 정리: 주소(IP)를 부여하여 경로를 설정하는 계층입니다.

해당 계층에서는 라우터를 통해 경로를 선택하고 주소를 정한 후에 경로에 패킷을 전달하는 역할을 합니다.

4층 전송 계층(Transport Layer)

간단 정리: 패킷 생성 및 전송하는 계층입니다.

해당 계층은 선택한 전송 프로토콜 TCP 혹은 UDP를 사용하여 포트를 열어서 데이터를 전송할 수 있게 해 줍니다.

 

TCP는 신뢰성 있게 데이터를 전송하는 연결 지향 프로토콜입니다.TCP는 보통 속도보다는 데이터의 보장이 더 중요할 때 사용되는데, 대표적인 예로, 문자 채팅이 있습니다. 문자 채팅은 문자 하나만 데이터가 손실돼도 오해가 생길 수 있기 때문입니다.


UDP는 신뢰성 없는 비연결성 프로토콜입니다.

UDP는 데이터의 보장보다는 속도가 우선시 되는 기능에 사용되는데, 대표적인 예로 음성 채팅이 있습니다. 음성 채팅은 약간의 데이터가 손실되더라도 어떤 말인지 알아들을 수 있습니다. 하지만, 속도가 늦어지게 되면 서로 오해가 생길 수 있습니다.

 

전송 계층과 2층 데이터 링크 계층이 많이 비슷합니다.

데이터 링크 계층은 물리적인 선로를 이용한 물리적 호스트인 컴퓨터, 라우터 사이에서 데이터 전송을 담당합니다.
전송 계층은 논리적인 선로인 라우터로 연결된 컴퓨터 네트워크를 통해 데이터를 주고받습니다.

5층 세션 계층(Session Layer)

간단 정리: TCP/IP 세션 체결과 포트번호를 기반으로 통신 세션을 구성합니다.

6층 표현 계층(Presentation Layer)

간단 정리: 인코딩이나 암호화, 데이터의 타입이 텍스트 인지, 이미지 인지, 이미지 타입은 어떤 것인지 결정하는 계층입니다.

7층 응용프로그램 계층(Application Layer)

간단 정리: 사용자가 마주하는 프로그램 (예시: 브라우저, 키보드, 서버 프로그램 등등)

가장 끝단에서 사용자가 마주할 수 있는 프로그램이라고 볼 수 있습니다.

 

OSI 7 계층 혹은 TCP/IP 4 계층은 클라이언트와 서버 따로따로 존재하며, 클라이언트가 서버에 데이터를 전송하면 클라이언트에서 OSI 7 계층을 거쳐 전송을 하고 서버는 서버의 OSI 7 계층을 통해 응용프로그램에 데이터가 도착하게 됩니다.

 

이런 일련의 과정을 거쳐서 음성통신이 되는 것입니다. 저 같은 경우에는 P2P 통신을 했으니 클라이언트와 클라이언트끼리 OSI 7 계층을 거치는 것입니다 :)

728x90