6월 11일 - UDP

Yullgiii·2024년 6월 11일
0
post-thumbnail

UDP (User Datagram Protocol)

UDP는 User Datagram Protocol의 약자로, 데이터를 데이터그램 단위로 처리하는 프로토콜이다. 데이터그램이란 독립적인 관계를 지니는 패킷을 의미하며, UDP는 비연결형 프로토콜로 사전에 연결 설정 없이 데이터를 전달한다.

특징

  • 비연결형 프로토콜: UDP는 사전에 연결 설정 없이 데이터를 전달한다.
  • 데이터그램 방식: 하나의 메시지에서 분할된 각각의 패킷은 서로 다른 경로로 전송될 수 있다.
  • 순서 보장 없음: 송신측에서 전송한 패킷의 순서와 수신측에 도착한 패킷의 순서가 다를 수 있다. 그러나 UDP는 순서를 부여하거나 재조립하지 않는다.
  • 제어 기능 없음: 흐름 제어, 혼잡 제어, 오류 제어를 하지 않으므로 손상된 세그먼트에 대한 재전송을 하지 않는다.
  • 속도와 부하: 제어 기능이 없기 때문에 속도가 빠르며 네트워크 부하가 적다.
  • 신뢰성 부족: 신뢰성 있는 데이터 전송을 보장하지 못한다.

사용 예

UDP는 RTP(Real Time Protocol), Multicast, DNS 등에서 사용된다.

  • DNS: 누군가 DNS 서비스를 요청할 때마다 TCP처럼 Session을 맺고 통신한다면 속도가 느리고, 서버 리소스도 많이 소모될 것이다. UDP를 사용하면 이러한 문제를 해결할 수 있다.
  • NMS(Network Management Server): 수백, 수천 대의 장비와 Session을 맺어야 하는 상황에서 UDP를 사용하면 네트워크 부하를 줄일 수 있다.
  • RTP: 재전송을 하면 안 되는 서비스. 예를 들어 전화를 하고 있을 때, "여", "보", "세", "요"라는 4개의 데이터를 전송했는데, "세"를 못 받았다고 다시 보내달라고 하면 "여보요세"가 될 것이다. 이럴 때는 그냥 "여보X요"로 전달하는 게 나은 상황이다.
  • Multicast: 1:N으로 통신하는 방식에서 한 사람이 데이터를 받지 못했다고 재전송을 요청하면, 제대로 받은 사람들도 해당 데이터를 다시 받아서 처리해야 하는 문제점이 발생할 수 있다.

예제 코드

UDP 서버 예제

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPServer {
    public static void main(String[] args) {
        try {
            DatagramSocket socket = new DatagramSocket(9876);
            byte[] buffer = new byte[1024];

            while (true) {
                DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
                socket.receive(packet);
                String received = new String(packet.getData(), 0, packet.getLength());
                System.out.println("Received: " + received);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

UDP 클라이언트 예제

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPClient {
    public static void main(String[] args) {
        try {
            DatagramSocket socket = new DatagramSocket();
            InetAddress address = InetAddress.getByName("localhost");
            byte[] buffer = "Hello, UDP Server".getBytes();

            DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 9876);
            socket.send(packet);
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

So...

UDP는 비연결형 프로토콜로, 빠른 속도와 낮은 네트워크 부하를 자랑하지만, 신뢰성 있는 데이터 전송을 보장하지 않는다. 따라서 DNS, RTP, Multicast 등 신속한 전송이 필요하고 재전송이 불필요한 서비스에 적합하다. 상황에 맞게 적절히 사용하면 효율적인 네트워크 통신을 구현할 수 있다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글