[C#]UDP란? 코드 작성하면서 이해하기

Arthur·2023년 6월 8일
0
post-thumbnail

1. UDP란

  • UDP는 User Datagram Protocol 약자이다.
  • TCP와 같이 IP에 기반한 Transport Layer 프로토콜이다.
  • UDP는 데이터 재전송과 데이터 순서 유지를 위한 작업을 하지 않는다.
    - 데이터 Corruption을 감지해 불량 데이터 폐기
    • 흐름제어(flow control)가 없어서 패킷이 제대로 전송되거나 오류가 없는지 확인할 수 있다.
  • 연결을 하지 않으므로 connect() 함수를 사용하지 않는다.
  • UDP는 메일과 같이 주소만 알면 그냥 보낼 수 있다.
  • 서버와 클라이언트는 1대1, 1대N, N대M 등으로 연결될 수 있다.

한줄로 요약하면
UDP는 연결을 하지 않고 데이터 손실에 대해 상관하지 않고 그냥 해당 IP에 전송하는 프로토콜이다.

그러면 데이터 손실의 위험이 있는데도 UDP를 사용하는 이유는 무엇일까?


2. UDP를 사용하는 이유

UDP 서버는 TCP 서버와 달리 하나의 소켓으로 다수의 클라이언트에 대한 서비스를 할 수 있다고 한다.

데이터 손실의 위험은 있지만 다수의 클라이언트에게 데이터 전송이 가능하고, TCP 보다는 속도가 빠르다고 한다.
UDP의 사용 예로는 실시간 영상 스트리밍 서비스와 같이 중간에 데이터가 손실 되어도 실시간으로 전송하는 곳에서 사용 된다고 한다.


3. TCP와의 차이점

프로토콜 종류TCPUDP
연결 방식연결형비연결형
패킷 교환 방식가상 회선 방식데이터그램 방식
전송 순서전송 순서 보장전송 순서가 바뀔 수 있음
수신 여부 확인수신 여부 확인수신 여부를 확인❌
통신 방식1:1 통신(unicast)1:1 통신(unicast), 1:N 통신(broadcast), N:M 통신(multicast)
신뢰성신뢰성 있는 데이터 전송(데이터 재전송)신뢰가 없는 데이터 전송(데이터 재전송❌)

4. C# 코드로 직접 작성해보기

이론도 중요하지만 직접 코드를 작성하면서 어떻게 작동되는지 알아보자.
아래 코드는 예제코드로 클라이언트가 UDP 서버에 문자열 메시지를 전송하는 간단한 콘솔 프로그램이다.


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();
        }
    }
}

깃허브 레포지토리 => 링크


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();
        }
    }
}

깃허브 레포지토리 => 링크

UDP 서버 콘솔

클라이언트 콘솔


참고 자료


  • edu_com2us_CSharpNetworkProgramming 깃 레포 - BasicUDP => 링크
  • Cloud Flare - UDP란? => 링크
  • [10분 테코톡] 👨‍🏫르윈의 TCP UDP => 링크
  • 예제로 배우는 C# 프로그래밍 - UDP 클라이언트 => 링크
  • 예제로 배우는 C# 프로그래밍 - UDP 서버 => 링크
  • 망나니 개발자 - [TCP/UDP] TCP와 UDP의 특징과 차이 => 링크
    -GONI - UDP 서버/클라이언트 => 링크
profile
기술에 대한 고민과 배운 것을 회고하는 게임 서버 개발자의 블로그입니다.

0개의 댓글