TCP와 UDP의 차이점은 무엇인가요?

김상욱·2024년 12월 4일

TCP와 UDP의 차이점은 무엇인가요?

이 두가지는 전송계층에서 가장 널리 사용되는 두 가지 프로토콜이다.

TCP(Transmission Control Protocol)

연결 지향적 프로토콜로 데이터 전송 전에 송신자와 수신자 간에 연결을 확립. 이를 위해 3-way 핸드셰이크 과정을 거친다.

3-Way HandShake
송신자가 수신자에게 연결 요청(SYN)을 보낸다. -> 수신자는 요청을 받고 승인(SYN-ACK)을 보낸다. -> 송신자는 수신자의 승인에 대해 확인 응답(ACK)을 보낸다.

연결 해제 시 데이터 전송이 완료되면 4-way handshake를 통해 연결을 종료.

수신자로부터 ACK(확인 응답)을 통해 패킷이 제대로 전달되었는지 확인한다. 손실된 패킷은 재전송된다. 체크섬을 사용하여 데이터 오류를 감지하고, 필요에 따라 재전송한다. 전송된 데이터가 원래의 순서대로 수신되도록 순서 번호를 부여
: 체크섬이란 TCP헤더와 데이터에 대해 16비트 체크섬 비트를 계산하여 데이터의 오류 여부를 확인하는 것을 말한다. 수신자쪽에서 받은 체크섬과 송신자가 보낸 체크섬이 다르면 재전송 요청을 한다.

수신자의 데이터 처리 능력을 고려하여 송신 속도를 조절한다. 일반적으로 슬라이딩 윈도우 프로토콜을 사용한다.
네트워크 혼잡을 감지하고 송신 속도를 조절하여 패킷 손실을 최소화한다.

연결 설정 및 유지, 흐름 제어, 오류 제어 등의 기능으로 인해 헤더 크기가 커지고 처리 오버헤드가 증가한다. 신뢰성을 보장하기 위한 추가적인 처리로 인해 지연 시간이 발생 가능.

연결 지향적 특성으로 인해 1:1 통신만 가능

ex)
HTTP/HTTPS(웹 브라우징) : 데이터의 완전성과 순서 보장이 필요
이메일 전송(SMTP, POP3, IMAP) : 메시지의 정확한 전달이 중요
파일 전송(FTP) : 파일 데이터의 손실 없이 전송
원격 접속(SSH, Telnet) : 명령어와 응답의 정확한 전달이 필요

헤더의 구성은 크기는 최소 20바이트로 크며 소스 및 목적지 포트, 순서 번호, 확인 응답 번호, 플래그, 윈도우 크기, 체크섬, 긴급 포인터에다가 별도의 옵션 필드까지 해서 크기가 상당히 크다.

UDP(User Datagram Protocol)

데이터 전송 전에 별도의 연결 설정 과정이 없으며 각 패킷은 독립적으로 처리되며, 송신자는 수신자가 패킷을 받았는지 확인하지 않는다.

체크섬을 통해 데이터 오류를 감지할 수 있지만, 오류 수정이나 재전송 메커니즘이 없음. 각 패킷은 독립적으로 처리되므로, 순서가 바뀌거나 손실될 수 있음.

송신자는 최대 속도로 데이터를 전송하며, 네트워크 상태나 수신자의 처리 능력을 고려하지 않는다.

헤더 크기가 8바이트로 매우 작으며 추가적인 연결 설정 과정이 없음. 최소한의 프로토콜 기능으로 인해 지연 시간이 적다.

멀티캐스트와 브로드캐스트를 지원하여 한 번의 전송으로 여러 수신자에게 데이터를 전달할 수 있다.

ex)
실시간 스트리밍(RTP) : 약간의 데이터 손실보다 지연 시간이 더 중요
온라인 게임 : 빠른 반응이 중요하며, 일부 패킷 손실은 허용
VolP : 음성 통화에서 지연 시간 최소화가 중요
DNS 조회 : 빠른 응답이 필요하며 재전송은 애플리케이션 레벨에서 처리

헤더의 크기는 8바이트이다. 소스 및 목적지 포트 번호, 길이, 체크섬으로 이루어져 있다.


TCP와 UDP의 차이점과 실습 가능성을 신입/취업 준비 중인 Java, Spring 백엔드 개발자 관점에서 살펴보겠습니다.


TCP와 UDP의 차이점

특징TCPUDP
프로토콜 종류연결 지향(Connection-oriented)비연결 지향(Connectionless)
신뢰성신뢰성 있는 데이터 전송 보장 (패킷 확인 및 재전송)신뢰성 보장 없음
데이터 순서데이터 순서 보장데이터 순서 보장 없음
속도비교적 느림 (연결 설정 및 확인 과정 포함)비교적 빠름 (단순한 데이터 전송)
오버헤드높음 (패킷 확인, 재전송, 연결 관리)낮음 (단순한 패킷 전송)
데이터 손실 허용허용하지 않음 (손실 시 재전송)허용 (손실된 데이터 재전송 없음)
주요 사용 사례HTTP, HTTPS, FTP, SMTP (파일 전송, 웹 브라우징 등)DNS, VoIP, 온라인 게임, 스트리밍 (빠른 응답 필요)

실습 아이디어: TCP와 UDP 프로토콜 이해

Java와 Spring을 기반으로 한 실습은 네트워크 프로그래밍과 실제 백엔드 애플리케이션의 기초를 쌓는 데 유용합니다.

1. TCP 실습

TCP는 신뢰성을 보장하기 때문에 상태 유지(Stateful)와 데이터 무결성 요구사항이 있는 서비스에 적합합니다.

실습 아이디어: 간단한 채팅 애플리케이션 만들기

  • 목적: TCP의 연결 지향적 특성과 패킷 확인 기능 이해.

  • 기능:

    • 클라이언트와 서버 간의 연결 설정 (Socket 사용).
    • 클라이언트가 메시지를 보내면 서버가 응답.
    • 메시지 전달이 완료되었는지 확인.
  • 사용 기술:

    • Java의 Socket, ServerSocket 클래스.
    • 스레드를 사용하여 다중 클라이언트 처리.
  • 예제 코드:

    // Server.java
    import java.io.*;
    import java.net.*;
    
    public class Server {
        public static void main(String[] args) throws IOException {
            ServerSocket serverSocket = new ServerSocket(8080);
            System.out.println("Server is running...");
            while (true) {
                Socket clientSocket = serverSocket.accept();
                new Thread(() -> {
                    try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                         PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {
                        String message;
                        while ((message = in.readLine()) != null) {
                            System.out.println("Received: " + message);
                            out.println("Server Echo: " + message);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }).start();
            }
        }
    }
    
    // Client.java
    import java.io.*;
    import java.net.*;
    
    public class Client {
        public static void main(String[] args) throws IOException {
            Socket socket = new Socket("localhost", 8080);
            try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                 PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                 BufferedReader console = new BufferedReader(new InputStreamReader(System.in))) {
                String userInput;
                while ((userInput = console.readLine()) != null) {
                    out.println(userInput);
                    System.out.println(in.readLine());
                }
            }
        }
    }

2. UDP 실습

UDP는 빠르고 단순한 데이터 전송을 처리하기 위해 사용됩니다.

실습 아이디어: UDP 기반 파일 전송 애플리케이션

  • 목적: UDP의 비연결성과 빠른 데이터 전송 이해.

  • 기능:

    • 파일의 작은 블록(데이터그램)을 클라이언트에서 서버로 전송.
    • 데이터 손실에 대해 관찰 및 확인.
  • 사용 기술:

    • Java의 DatagramSocket, DatagramPacket 클래스.
  • 예제 코드:

    // UDPServer.java
    import java.net.*;
    
    public class UDPServer {
        public static void main(String[] args) throws Exception {
            DatagramSocket socket = new DatagramSocket(8080);
            byte[] buffer = new byte[1024];
            System.out.println("UDP Server is running...");
            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);
            }
        }
    }
    
    // UDPClient.java
    import java.net.*;
    
    public class UDPClient {
        public static void main(String[] args) throws Exception {
            DatagramSocket socket = new DatagramSocket();
            InetAddress address = InetAddress.getByName("localhost");
            byte[] buffer = "Hello, Server!".getBytes();
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 8080);
            socket.send(packet);
            System.out.println("Message sent!");
        }
    }

3. Spring에서 TCP/UDP를 활용한 애플리케이션

  • TCP 실습:

    • RESTful API를 만들어 데이터의 신뢰성 및 트랜잭션 관리 실습.
    • Spring WebSocket을 사용하여 실시간 채팅 애플리케이션 구축.
  • UDP 실습:

    • 빠른 알림 전송을 위한 비동기 UDP 기반 서비스 구현.
    • 데이터 손실을 허용하는 실시간 스트리밍 애플리케이션 프로토타입.

추가 학습 아이디어

  1. Wireshark 사용: 실습 중 생성된 TCP/UDP 패킷을 캡처하여 프로토콜의 동작을 시각적으로 분석.
  2. 멀티스레딩 연습: 클라이언트-서버 통신에서 다중 클라이언트 지원.
  3. Spring Integration: TCP/UDP 메시징 채널 활용하여 메시지 기반 애플리케이션 구현.

추천 학습 순서

  1. Java 네트워크 프로그래밍 기본 이해 (Socket, DatagramSocket 사용).
  2. TCP/UDP 통신을 활용한 간단한 애플리케이션 개발.
  3. Spring WebSocket이나 메시징과 같은 고급 기술과 통합.
  4. 네트워크 패킷 분석 및 최적화 학습.

실습을 통해 네트워크 통신에 대한 이해를 높이면, 백엔드 개발자로서의 기초를 탄탄히 다질 수 있습니다. 추가로 필요하거나 도움이 필요한 부분이 있으면 말씀해주세요!

0개의 댓글