한줄로 요약하면
UDP는 연결을 하지 않고 데이터 손실에 대해 상관하지 않고 그냥 해당 IP에 전송하는 프로토콜이다.
그러면 데이터 손실의 위험이 있는데도 UDP를 사용하는 이유는 무엇일까?
UDP 서버는 TCP 서버와 달리 하나의 소켓으로 다수의 클라이언트에 대한 서비스를 할 수 있다고 한다.
데이터 손실의 위험은 있지만 다수의 클라이언트에게 데이터 전송이 가능하고, TCP 보다는 속도가 빠르다고 한다.
UDP의 사용 예로는 실시간 영상 스트리밍 서비스와 같이 중간에 데이터가 손실 되어도 실시간으로 전송하는 곳에서 사용 된다고 한다.
프로토콜 종류 | TCP | UDP |
---|---|---|
연결 방식 | 연결형 | 비연결형 |
패킷 교환 방식 | 가상 회선 방식 | 데이터그램 방식 |
전송 순서 | 전송 순서 보장 | 전송 순서가 바뀔 수 있음 |
수신 여부 확인 | 수신 여부 확인 | 수신 여부를 확인❌ |
통신 방식 | 1:1 통신(unicast) | 1:1 통신(unicast), 1:N 통신(broadcast), N:M 통신(multicast) |
신뢰성 | 신뢰성 있는 데이터 전송(데이터 재전송) | 신뢰가 없는 데이터 전송(데이터 재전송❌) |
이론도 중요하지만 직접 코드를 작성하면서 어떻게 작동되는지 알아보자.
아래 코드는 예제코드로 클라이언트가 UDP 서버에 문자열 메시지를 전송하는 간단한 콘솔 프로그램이다.
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace BasicUdpClient
{
class Program
{
static void Main(string[] args)
{
// (1) UdpClient 객체 성성
UdpClient udpClient = new UdpClient();
string msg = "안녕하세요.";
byte[] datagram = Encoding.UTF8.GetBytes(msg);
// (2) 데이터 송신
udpClient.Send(datagram, datagram.Length, "127.0.0.1", 9999);
Console.WriteLine("[Send] 127.0.0.1:9999 로 {0} 바이트 전송", datagram.Length);
// (3) 데이타 수신
IPEndPoint epRemote = new IPEndPoint(IPAddress.Any, 0);
byte[] bytes = udpClient.Receive(ref epRemote);
Console.WriteLine("[Receive] {0} 로부터 {1} 바이트 수신", epRemote.ToString(), bytes.Length);
// (4) UdpClient 객체 닫기
udpClient.Close();
}
}
}
깃허브 레포지토리 => 링크
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace BasicUdpClient
{
class Program
{
static void Main(string[] args)
{
// (1) UdpClient 객체 성성
UdpClient udpClient = new UdpClient();
string msg = "안녕하세요.";
byte[] datagram = Encoding.UTF8.GetBytes(msg);
// (2) 데이터 송신
udpClient.Send(datagram, datagram.Length, "127.0.0.1", 9999);
Console.WriteLine("[Send] 127.0.0.1:9999 로 {0} 바이트 전송", datagram.Length);
// (3) 데이타 수신
IPEndPoint epRemote = new IPEndPoint(IPAddress.Any, 0);
byte[] bytes = udpClient.Receive(ref epRemote);
Console.WriteLine("[Receive] {0} 로부터 {1} 바이트 수신", epRemote.ToString(), bytes.Length);
// (4) UdpClient 객체 닫기
udpClient.Close();
}
}
}
깃허브 레포지토리 => 링크
UDP 서버 콘솔
클라이언트 콘솔