Network_02) 연결해서 통하면 천천히, 연결 없으면 빠르게
2026. 1. 23. 11:35

Topic (오늘의 주제)

TCP(Transmission Control Protocol)UDP(User Datagram Protocol)는 전송 계층에서 사용되는 두 가지 주요 프로토콜입니다. TCP는 신뢰성 있는 연결 지향형 통신을 제공하고, UDP는 빠르고 단순한 비연결형 통신을 제공합니다.

개발자 면접 단골 질문이자, 네트워크의 핵심인 TCP와 UDP의 차이점과 사용 사례를 이해하는 것이 중요합니다.


Why (왜 사용하는가? 왜 중요한가?)

  • TCP와 UDP는 각각 다른 특성을 가지고 있어 애플리케이션의 요구사항에 따라 선택해야 합니다. TCP는 데이터의 신뢰성이 중요한 경우(파일 전송, 이메일, 웹 브라우징)에 사용되고, UDP는 속도와 실시간성이 중요한 경우(동영상 스트리밍, 게임, DNS 조회)에 사용됩니다.

  • 네트워크는 데이터가 전송되는 도중 일부가 사라지거나 순서가 뒤집힐 수 있는 환경입니다. 이때 전송 계층(4계층)은 엔드포인트(송신자-수신자) 간에 데이터가 제대로 도착했는지, 순서는 맞는지 관리해 주는 역할을 합니다.

  • TCP의 3-way handshake, 흐름 제어, 혼잡 제어, 오류 복구 메커니즘과 UDP의 단순성과 빠른 전송 속도를 이해해야 합니다. 또한 각 프로토콜의 헤더 구조와 포트 번호의 역할도 중요합니다.


1. 전송 계층(Transport Layer)이 왜 필요한가?

전송 계층의 필요성

네트워크는 데이터가 전송되는 도중 일부가 사라지거나 순서가 뒤집힐 수 있는 환경입니다. 예를 들어, "내일 db 수정을 위해 배포를 한달 후로 미뤄야한다."라는 메시지를 보냈는데 도착한 데이터가 "내일 ... 배포를 ... 한다."처럼 일부 단어가 손실되어 의미가 완전히 바뀔 수 있습니다.

이때 전송 계층(4계층)은 엔드포인트(송신자-수신자) 간에 데이터가 제대로 도착했는지, 순서는 맞는지 관리해 주는 역할을 합니다.

전송 계층에는 성격이 정반대인 두 가지 프로토콜이 있습니다. 바로 TCPUDP입니다.


2. TCP (Transmission Control Protocol)

TCP의 정의

TCP(Transmission Control Protocol)는 전송 계층에서 사용되는 연결 지향형(Connection-oriented), 신뢰성 있는(Reliable) 프로토콜입니다. 속도가 상대적으로 느리더라도, 데이터 하나라도 빠뜨리지 않고 완벽하게 배달하는 것이 목표입니다.

TCP의 핵심 특징

1. 연결 지향형 (Connection-oriented)

통신 전에 연결을 설정하고, 통신 후 연결을 해제합니다.

3-Way Handshake (연결 설정):

클라이언트                    서버
    |                         |
    |---- SYN (seq=x) ------->|  [1단계: 연결 요청]
    |                         |
    |<-- SYN-ACK (seq=y, ack=x+1) --|  [2단계: 연결 수락 + 확인]
    |                         |
    |---- ACK (ack=y+1) ------>|  [3단계: 확인 응답]
    |                         |
  [연결 설정 완료]

각 단계의 의미:

  • 1단계 (SYN): 클라이언트가 서버에 연결 요청
  • 2단계 (SYN-ACK): 서버가 연결 수락하고 클라이언트의 요청 확인
  • 3단계 (ACK): 클라이언트가 서버의 응답 확인

자세한 내용은 [[3 Way Handshake]]를 참고하세요.

2. 신뢰성 보장 (Reliability)

TCP는 여러 메커니즘을 통해 데이터의 신뢰성을 보장합니다.

순서 보장 (Sequence Number):

TCP는 각 바이트에 순서 번호를 부여하여 데이터의 순서를 보장합니다.

송신: [1][2][3][4][5]
수신: [1][2][3][4][5]  ✅ 순서 보장

확인 응답 (ACK - Acknowledgment):

수신자는 데이터를 받으면 ACK를 보내어 정상 수신을 확인합니다.

송신자                    수신자
    |                         |
    |---- 데이터 (seq=1) ----->|
    |                         |
    |<---- ACK (ack=2) --------|
    |                         |
    |---- 데이터 (seq=2) ----->|
    |                         |
    |<---- ACK (ack=3) --------|

재전송 (Retransmission):

ACK를 받지 못하면 데이터를 재전송합니다.

송신자                    수신자
    |                         |
    |---- 데이터 (seq=1) ----->|
    |                         |
    |     [ACK 손실]           |
    |                         |
    |---- 데이터 (seq=1) ----->|  [재전송]
    |                         |
    |<---- ACK (ack=2) --------|

3. 흐름 제어 (Flow Control)

수신자의 버퍼 크기에 맞춰 전송 속도를 조절합니다. 수신자가 바쁘면 전송 속도를 낮춥니다.

슬라이딩 윈도우 기법:

  • 수신자는 Window 크기를 TCP 헤더에 포함하여 전송
  • 송신자는 Window 크기만큼만 데이터 전송
  • 수신자가 데이터를 처리하면 Window 크기 업데이트
수신자 버퍼: [    ] (4바이트)
Window = 4

송신자는 4바이트까지만 전송 가능
수신자가 2바이트 처리 → Window = 2로 업데이트

4. 혼잡 제어 (Congestion Control)

네트워크 혼잡 상황을 감지하고 전송 속도를 조절합니다.

주요 알고리즘:

  • Slow Start: 연결 초기에 점진적으로 전송 속도 증가
  • Congestion Avoidance: 혼잡 임계값 도달 후 선형적으로 증가
  • Fast Retransmit: 중복 ACK 3개 받으면 즉시 재전송
  • Fast Recovery: 혼잡 상황에서 빠른 복구
네트워크 혼잡 감지
    ↓
전송 속도 감소
    ↓
점진적으로 속도 증가

TCP 헤더 구조

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Data |           |U|A|P|R|S|F|                               |
| Offset| Reserved  |R|C|S|S|Y|I|            Window             |
|       |           |G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |         Urgent Pointer        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

주요 필드:

  • Source Port / Destination Port: 송신자/수신자 포트 번호
  • Sequence Number: 데이터의 순서 번호
  • Acknowledgment Number: 다음에 받을 데이터의 시퀀스 번호
  • Flags: SYN, ACK, FIN, RST 등 연결 제어 플래그
  • Window: 수신 가능한 데이터 크기 (흐름 제어)

TCP의 사용 사례

  1. 웹 브라우징 (HTTP/HTTPS)

    • 웹 페이지, 이미지 등 정확한 전송 필요
    • Spring Boot & React 앱의 모든 통신
  2. 이메일 (SMTP, POP3, IMAP)

    • 이메일 내용 손실 방지
  3. 파일 전송 (FTP)

    • 파일 무결성 보장
  4. 원격 접속 (SSH, Telnet)

    • 명령어와 응답의 정확한 전달
  5. 데이터베이스 연결

    • 쿼리와 결과의 신뢰성 보장

Spring Boot & React와의 관계

대부분의 웹 서비스(로그인, 게시판, 결제)는 TCP 위에서 동작합니다.

이유: 데이터의 정확성이 중요합니다. 예를 들어, 사용자가 "1,000,000원 송금" 버튼을 눌렀는데 "0" 하나가 빠져서 "1,000원"만 송금되면 안 됩니다.

동작: Spring Boot(Tomcat)가 8080포트를 열어두고(Listen), React(브라우저)가 3-Way Handshake로 연결을 맺은 뒤 안전하게 JSON 데이터를 주고받습니다.


3. UDP (User Datagram Protocol)

UDP의 정의

UDP(User Datagram Protocol)는 전송 계층에서 사용되는 비연결형(Connectionless), 비신뢰성(Unreliable) 프로토콜입니다. 속도가 최우선이며, 복잡한 절차 없이 데이터를 전송합니다.

UDP의 핵심 특징

1. 비연결형 (Connectionless)

연결 설정 없이 데이터를 전송합니다. 3-Way Handshake 같은 과정이 없습니다.

클라이언트                    서버
    |                         |
    |---- 데이터 전송 ------->|  [즉시 전송]
    |                         |

2. 단순한 헤더

TCP 헤더는 20바이트 이상인데, UDP 헤더는 8바이트로 매우 가볍습니다. 덕분에 전송 속도가 빠릅니다.

3. 신뢰성 없음

데이터가 전송 중 손실되어도 재전송하지 않습니다. 확인 응답(ACK)이나 재전송 메커니즘이 없습니다.

4. 흐름 제어 및 혼잡 제어 없음

UDP는 흐름 제어나 혼잡 제어 기능이 없습니다. 데이터를 보내는 속도나 네트워크 상태를 고려하지 않습니다.

UDP 헤더 구조

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|            Length             |           Checksum            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

주요 필드:

  • Source Port / Destination Port: 송신자/수신자 포트 번호
  • Length: UDP 헤더 + 데이터의 전체 길이
  • Checksum: 오류 검사를 위한 체크섬 (선택적)

TCP 헤더(20바이트) vs UDP 헤더(8바이트): UDP가 훨씬 가볍습니다.

UDP의 사용 사례

실시간성이 중요한 곳에서는 UDP가 적합합니다.

  1. 동영상 스트리밍 / 화상 회의

    • 일부 패킷 손실 허용 가능
    • 낮은 지연 시간 중요
    • 영상에서 1프레임이 깨져도 영상이 멈추고 다시 받아오는 것보다, 살짝 뭉개지고 계속 재생되는 것이 더 나은 사용자 경험을 제공합니다.
  2. 온라인 게임

    • 실시간 반응성 중요
    • 일부 데이터 손실 허용 가능
    • 데이터 확인 절차로 인한 지연은 게임 플레이에 치명적입니다.
  3. DNS 조회

    • 빠른 응답 필요
    • 단순한 요청/응답
  4. VoIP (Voice over IP)

    • 실시간 음성 통신
    • 낮은 지연 시간 중요
  5. DHCP (Dynamic Host Configuration Protocol)

    • 빠른 IP 주소 할당

4. TCP vs UDP 비교

핵심 차이점

구분 TCP UDP
연결 방식 연결 지향형 (Connection-oriented) 비연결형 (Connectionless)
신뢰성 신뢰성 보장 (데이터 손실 없음) 비신뢰성 (데이터 손실 가능)
순서 보장 순서 보장 순서 보장 안 함
속도 상대적으로 느림 빠름
오류 복구 자동 재전송 없음
흐름 제어 있음 (슬라이딩 윈도우) 없음
혼잡 제어 있음 없음
헤더 크기 20바이트 (가변) 8바이트 (고정)
오버헤드 작음
통신 방식 일대일 (Unicast) 일대일, 일대다, 다대다
대표 서비스 웹(HTTP), 이메일, 파일 전송 스트리밍, 게임, DNS
비유 등기 우편 (서명 필수) 방송국 송출 (안 보면 끝)

연결 설정 과정 비교

TCP (3-way handshake 필요):

클라이언트                    서버
    |                         |
    |---- SYN (seq=x) ------->|
    |                         |
    |<-- SYN-ACK (seq=y, ack=x+1) --|
    |                         |
    |---- ACK (ack=y+1) ------>|
    |                         |
  [연결 설정 완료]

UDP (연결 설정 없음):

클라이언트                    서버
    |                         |
    |---- 데이터 전송 -------->|
    |                         |
  [즉시 전송]

5. TCP와 UDP의 선택 기준

선택 기준

면접에서 "TCP와 UDP 중 무엇을 쓸 건가요?"라고 묻는다면, 정답은 "서비스의 목적에 따라 다릅니다"입니다.

TCP를 선택해야 하는 경우:

  • 데이터의 정확성이 중요한 경우
  • 데이터의 순서가 중요한 경우
  • 대용량 데이터 전송
  • 연결 지향적 통신이 필요한 경우
  • 신뢰성이 속도보다 중요한 경우

예시: 회원가입, 결제, 데이터 저장, 파일 다운로드, 이메일, 웹 페이지 로딩, Spring Boot & React 앱의 모든 통신

UDP를 선택해야 하는 경우:

  • 속도와 실시간성이 중요한 경우
  • 일부 데이터 손실이 허용되는 경우
  • 빠른 응답이 필요한 경우
  • 멀티캐스트/브로드캐스트가 필요한 경우
  • 오버헤드를 최소화해야 하는 경우

예시: 라이브 방송, 게임, 동영상 스트리밍, DNS 조회

실무에서의 활용

우리가 주로 다루는 HTTP(Spring, Node, React)는 기본적으로 신뢰성을 위해 TCP를 사용합니다.

최근에는 구글이 만든 HTTP/3처럼, UDP를 기반으로 하되 TCP의 신뢰성 기능을 포함한 새로운 기술들도 등장하고 있습니다.


요약

  • TCP는 연결 지향형, 신뢰성 있는 프로토콜로 데이터의 정확성과 순서를 보장합니다. 3-way handshake로 연결을 설정하고, ACK, 재전송, 흐름 제어, 혼잡 제어를 통해 신뢰성을 보장합니다.

  • UDP는 비연결형, 비신뢰성 프로토콜로 빠른 전송 속도와 낮은 오버헤드를 제공합니다. 연결 설정 없이 즉시 데이터를 전송하며, 오류 복구나 흐름 제어 기능이 없습니다.

  • TCP는 데이터의 정확성이 중요한 웹 브라우징, 이메일, 파일 전송에 사용되고, UDP는 실시간성이 중요한 동영상 스트리밍, 온라인 게임, DNS 조회에 사용됩니다.

  • 선택 기준: 데이터 정확성이 중요하면 TCP, 속도와 실시간성이 중요하면 UDP를 선택합니다. Spring Boot & React 앱은 대부분 TCP를 사용합니다.


참고 자료


예상 꼬리질문 정리

4. UDP는 신뢰성이 없는데 왜 사용하나?

UDP는 신뢰성이 없지만 다음과 같은 장점이 있습니다:

  1. 빠른 전송 속도: 연결 설정/해제 과정 없음
  2. 낮은 오버헤드: 헤더가 8바이트로 작음 (TCP는 20바이트 이상)
  3. 실시간성: 지연 시간이 짧음
  4. 멀티캐스트 지원: 일대다 통신 가능

사용 사례:

  • 동영상 스트리밍: 일부 프레임 손실은 허용 가능
  • 온라인 게임: 실시간 반응성이 중요
  • DNS 조회: 빠른 응답 필요

애플리케이션 레벨에서 신뢰성 보장:

  • 일부 애플리케이션은 UDP 위에 자체 신뢰성 메커니즘을 구현
  • 예: QUIC 프로토콜 (UDP 기반, TCP의 신뢰성 기능 포함) - HTTP/3에서 사용!

5. TCP와 UDP의 포트 번호는 어떻게 사용되나?

포트 번호는 전송 계층에서 애플리케이션을 구분하는 식별자입니다.

포트 번호 범위:

  • Well-known Ports (0-1023): 시스템 예약 포트
    • HTTP: 80 (TCP)
    • HTTPS: 443 (TCP)
    • DNS: 53 (UDP)
    • SSH: 22 (TCP)
  • Registered Ports (1024-49151): 등록된 애플리케이션
  • Dynamic/Private Ports (49152-65535): 동적 할당

TCP와 UDP는 포트 번호를 독립적으로 사용:

  • 같은 포트 번호라도 TCP와 UDP는 별개
  • 예: TCP 53과 UDP 53은 다른 서비스

관련 노트

  • [[3 Way Handshake]] - TCP 연결 설정 과정
  • [[OSI 7계층 모델]] - 전송 계층의 위치와 역할
  • [[포트 (Port)]] - 포트 번호의 개념과 사용법

태그: #network #tcp #udp #전송계층 #프로토콜 #면접 #개념정리