이론/백엔드 개념정리

TCP 및 UDP 개요

블스뜸 2025. 5. 2. 18:31

TCP는 서버와 클라이언트 간 신뢰적인 데이터 전송을 위해 설계된 연결형 프로토콜이다.

IP 방식 통신의 한계

  • 애플리케이션 미구분: 대상 호스트 내 특정 애플리케이션으로의 데이터 식별 불가.
  • 비연결성: 수신 측 상태와 무관하게 데이터 전송.
  • 비신뢰성:
    1. 패킷 소실 발생 가능성 존재.
    2. 송/수신 측 모두 패킷 손상 여부 확인 불가.
    3. 패킷 순서 변경 및 대용량 데이터 분할 전송으로 인한 순서 섞임 발생 가능성 존재.

TCP 프로토콜의 해결 방안: 3 Way Handshake

TCP는 상기 IP 방식 통신의 문제점을 해결하기 위해 3 Way Handshake 기반의 연결 설정 과정을 도입한다. 이는 물리적 연결이 아닌 논리적 연결을 통해 연결 성립을 가정하는 방식이다.

  1. SYN (Synchronize): 클라이언트가 서버에 연결 요청을 전송하는 단계. 연결 시작 의사를 표명하며, 초기 시퀀스 번호를 포함하여 데이터 전송 순서 관리를 준비한다.
  2. ACK (Acknowledge): 서버가 클라이언트의 SYN 패킷 수신 및 확인 응답을 전송하는 단계. 클라이언트의 SYN 요청을 수락하고, 자체 연결 시작 의사를 담아 SYN 및 ACK 플래그 설정 패킷을 클라이언트에게 전송한다. 응답 ACK 값은 클라이언트 시퀀스 번호에 1을 더한 값이다.
    • SYN 접속 요청
    • ACK 요청 수락 → ACK 부재 시 연결 실패
    • ACK → ACK와 함께 데이터 전송 가능
  3. 데이터 전송 및 응답: TCP 통신 시 데이터 수신 측은 정상 수신 여부에 대한 응답을 반환하여 신뢰성을 보장한다.
  4. 패킷 순서 보장: 분할 전송된 패킷이라도 수신 측에서 순서를 재조립하여 데이터의 순서를 보장한다.

TCP는 신뢰성을 제공하나, 연결 설정 과정 및 데이터 전송에 시간적 오버헤드가 발생한다. 최소한의 논리적 연결 유지를 요구하므로 현재 단계 이상의 최적화에 제약이 따른다. 즉, 3 Way Handshake 과정으로 인해 전송 속도가 상대적으로 느리다.

UDP (User Datagram Protocol): 비연결형 비신뢰적 프로토콜

UDP는 비연결형이며 신뢰성을 보장하지 않는 전송 프로토콜이다. 실시간 통신 또는 스트리밍 애플리케이션과 같이 빠른 전송 속도가 중요한 환경의 요구를 충족하기 위해 개발되었다.

UDP의 특징

  • IP 방식과 유사하며, 3 Way Handshake를 수행하지 않는다.
  • 데이터 전송, 응답, 순서 보장을 제공하지 않는 비신뢰적 프로토콜이다.
  • TCP에 비해 추가적인 기능이 거의 없어 연결 설정 오버헤드가 없고 속도가 빠르다.
  • IP와 달리 PORT 개념을 포함한다. (TCP 또한 PORT 개념을 포함한다.)
  • 데이터 무결성 검사를 위한 **체크섬(Checksum)**을 포함하여 전송 중 데이터 오류 발생 여부를 검증한다.

PORT: 동일 IP 내 프로세스 식별자

PORT는 동일 IP 주소 내에서 특정 프로세스를 식별하기 위해 사용된다. 전송 패킷이 어떤 애플리케이션으로 향해야 하는지 구분하는 역할을 수행한다.

TCP/IP 패킷 구조

TCP/IP 패킷 헤더는 소스 PORT와 대상 PORT 정보를 포함한다.

자주 사용되는 PORT 번호

  • 0 ~ 65535 범위 할당 가능
  • 0 ~ 1023: Well-known Port로, 국제 도메인 관리기구(IANA)에 의해 관리되며 사용을 지양하는 것이 좋다.
    • FTP: 20, 21 (TCP)
    • SSH: 22 (TCP)
    • 텔넷: 23 (TCP)
    • SMTP: 25 (TCP)
    • DNS: 53 (TCP/UDP)
    • DHCP: 67 (UDP)
    • HTTP: 80 (TCP)
    • HTTPS: 443 (TCP)
    • RDP: 3389 (TCP/UDP)
  • 실제 개발 시에는 예약된 포트 범위를 제외한 나머지 포트 번호를 활용하는 것이 일반적이다.

 

실제 개발을 진행할 때 TCP/UDP를 어떻게 선택해야할까?

  • 신뢰성 있는 데이터 전송이 중요한 경우 (예: 웹 서버, 파일 전송, 이메일): TCP를 선택(무결성과 신뢰성이 필요한 상황에는 왠만하면 TCP를 추천한다)
  • 실시간성 및 낮은 지연 시간이 중요한 경우 (예: 스트리밍, 온라인 게임, VoIP): UDP를 고려할 수 있다. (다만, UDP 자체는 신뢰성을 보장하지 않으므로 애플리케이션 레벨에서 오류 제어 및 재전송 등의 메커니즘을 추가적으로 구현해야 할 수 있다.)

TCP+UDP 같이사용하는 경우는 어떤식으로 적용되는거지?
TCP와 UDP를 동시에 사용하는 것은 각 프로토콜의 단점을 보완하고, 특정 애플리케이션의 요구 사항을 충족시키기 위한 설계 전략. 단순히 장점만을 합치는 것이 아니라, 각 프로토콜의 특징을 이해하고 목적에 맞게 조합하여 사용하는 것

예시 1 : 제어 채널 (TCP) + 데이터 채널 (UDP)
    - 실시간 스트리밍 서비스에서 스트리밍 시작/종료 제어는 TCP로, 실제 비디오/오디오 데이터 전송은 UDP로 처리하는 방식
    1. TCP는 연결 설정, 신뢰성 있는 제어 명령 전송, 세션 관리 등에 사용
    2. UDP는 실제 데이터 전송에 사용
예시 2 : 신뢰성 확보 (TCP) + 빠른 초기 연결 또는 상태 정보 (UDP)
    - 네트워크 검색 프로토콜에서 UDP 브로드캐스트를 통해 서버를 찾고, 이후 데이터 통신은 TCP로 진행하는 방식
    1. UDP를 사용하여 서버의 존재 여부나 간단한 상태 정보를 빠르게 확인
    2. 이후 실제 데이터 통신은 신뢰성이 중요한 TCP를 사용
예시 3 : 중복 전송을 통한 신뢰성/속도 향상 (특수한 경우)
    - 중요한 데이터를 TCP로 전송하는 동시에 UDP로도 전송하여, 한쪽에서 손실이 발생해도 데이터를 받을 수 있도록 하는 방식
    - 신뢰성은 높아지지만 네트워크 자원 소모가 커진다