seungjun.dev

TCP로 구현한 동일한 구조를 UDP로 구현할 수 있을까?

TCP로 구현한 동일한 구조를 UDP로 구현할 때 생기는 일

TCP

  • TCP는 스트림 기반 프로토콜
  • 데이터를 잘게 쪼개서 보낼 수 있는 '흐름'으로 봄
  1. 분할: 10KB의 데이터 스트림을 받으면, 네트워크 상황에 맞는 최적의 크기(MSS, Maximum Segment Size, 보통 약 1460바이트)로 알아서 잘게 나눈다. 10KB(10240바이트)는 대략 7~8개의 조각(세그먼트)로 나뉘게 된다.
  2. 포장 및 전송: 각 조각마다 순서 번호와 주소 등이 적힌 헤더를 붙여서 차례대로 전송한다.
  3. 신뢰성 확보: 받는 쪽에서는 각 조각을 받을 때마다 잘 받았다는 확인 응답(ACK)를 보낸다. 만약 보내는 쪽에서 일정 시간 동안 특정 조각에 대한 ACK를 받지 못하면, 해당 조각이 유실됐구나 판단하고 그 조각만 다시 보내준다.
  4. 재조립: 받는 쪽에서는 모든 조각이 도착하면, 송장에 적인 순서 번호를 보고 다시 완벽한 10KB 데이터로 조립해 애플리케이션에 전달한다.
  • 결과: 약간의 지연이 발생할 수 있지만, 데이터는 손실 없이 100% 완전하게 전달된다.

UDP

  • UDP는 데이터그램 기반 프로토콜
  • 데이터를 한 번에 보내려고 시도
  1. 문제 발생 (MTU 초과): 네트워크 장비가 한 번에 처리할 수 있는 데이터의 크기에는 한계가 있다. 이를 MTU(Maximum Transmission Unit, 보통 1500바이트) 라고 한다. 10KB짜리 데이터는 이 MTU 크기를 훨씬 초과한다.
  2. 강제 분할 (IP Fragmentation): UDP 자체는 데이터를 나누는 기능이 없다. 따라서 이 거대한 데이터를 그 아랫 단계인 IP 계층에 그냥 넘겨버린다. 그럼 IP 계층에서 이 데이터를 여러 개의 **IP 조각(Fragment)**으로 강제로 분할해서 전송한다.
  3. 치명적인 약점: UDP는 신뢰성을 보장하지 않는다. 만약 IP 계층에서 나눈 여러 조각 중 단 하나의 조각이라도 네트워크 중간에 유실되면, 받는 쪽에서는 이 데이터 전체를 불량품으로 간주하고 10KB 데이터 전체를 그냥 버린다. TCP처럼 사라진 조각만 다시 보내달라고 하는 기능도 없다.
  4. 재조립 실패: 모든 조각이 기적적으로 도착하더라도, 조립 순서가 뒤바뀔 수 있다.
  • 결과: 전송은 빠를 수 있으나 데이터가 중간에 유실될 확률이 매우 높다.

결론

따라서 10KB 짜리 약간 큰 데이터를 보낼 때는 TCP로 보내는 게 안전하다.