TCP·UDP 캡슐화 시뮬레이션

OSI 7계층 편에서 데이터가 계층을 내려가며 헤더를 덧붙이는 캡슐화와, 받는 쪽에서 하나씩 벗겨 내는 역캡슐화를 그림으로 보았습니다. 이 장에서는 실제 메시지 하나를 골라 바이트 하나하나까지 따라가 봅니다. 글자가 숫자(바이트)로 바뀌고, TCP는 정해진 크기로 자르고, UDP는 통째로 담고, IP·이더넷 헤더와 체크섬이 붙어 선 위의 비트가 되었다가, 받는 쪽에서 검사를 거치며 다시 원래 글자로 돌아오는 전 과정을 단계별로 살펴봅니다.

① 따라가 볼 상황

같은 통신망(LAN) 안의 관측실 컴퓨터(클라이언트)가 서버의 5000번 포트로 짧은 메시지를 보냅니다. 각 계층이 덧붙이는 헤더와 크기는 다음과 같습니다. TCP의 연결 설정(3-way handshake)은 OSI 7계층 편의 시뮬레이션에서 다루므로, 여기서는 연결이 이미 맺어진 뒤 데이터를 보내는 순간부터 봅니다.

계층붙는 것크기이 시뮬레이션의 값
L7 응용메시지(UTF-8 바이트)메시지 길이한글 1글자 = 3바이트, 영문·숫자 1글자 = 1바이트
L4 TCP / L4 UDP포트·순서 번호·체크섬TCP 20바이트 / UDP 8바이트포트 49152 → 5000
L3 IPIP 주소·길이·TTL·프로토콜 번호20바이트192.168.0.10 → 192.168.0.20
L2 이더넷MAC 주소·타입 + 꼬리의 FCS머리 14 + 꼬리 4바이트02:00:00:00:00:0a → 02:00:00:00:00:14
L1 물리프리앰블·프레임 간격8 + 12바이트 분량0과 1의 전압·빛 신호

② 단계별 시뮬레이션 — 자르고, 싸고, 보내고, 벗기기

👉 메시지와 프로토콜, MTU를 정한 뒤 ▶ 다음 단계를 눌러 보세요. 패킷 막대를 누르면 그 패킷의 바이트를 볼 수 있습니다!

바이트 보기

이더넷 IP TCP UDP 데이터 채움 FCS — 바이트에 마우스를 올리면 어느 필드인지 나옵니다. 주황 테두리는 이 단계에서 다루는 부분입니다.

헤더 필드

메시지만들어진 패킷선에 실린 전체 바이트 (프리앰블·간격 포함)전송 효율 (메시지 ÷ 전체)1 Gbps에서 걸리는 시간

헤더의 체크섬과 이더넷 FCS(CRC-32)는 실제 규격의 계산 방법으로 구한 값입니다. MAC·IP 주소, 포트, 순서 번호의 시작값(1000)은 설명용 예시이며, 실제 TCP의 순서 번호 시작값은 연결마다 무작위로 정합니다. 화면은 IPv4를 기준으로 합니다.

③ 누가, 얼마나 자를까? — TCP의 MSS와 IP 조각화

링크 하나가 한 번에 실을 수 있는 IP 패킷의 최대 크기를 MTU라고 합니다(보통 이더넷은 1,500바이트). TCP는 처음부터 MTU에 맞춰 MSS(= MTU − IP 헤더 20 − TCP 헤더 20) 크기로 데이터를 잘라 세그먼트마다 순서 번호를 붙입니다. 반면 UDP는 응용이 준 메시지를 자르지 않고 한 덩어리(데이터그램)로 내려보냅니다. 그것이 MTU보다 크면 IP가 대신 조각(fragment)으로 나누는데, 조각 하나만 사라져도 받는 쪽은 데이터그램 전체를 버립니다. 그래서 UDP를 쓰는 프로그램은 보통 스스로 MTU보다 작게 나눠 보냅니다.

비교 항목TCPUDP
누가 자르나TCP가 MSS 크기로 직접 자름UDP는 자르지 않음 → 크면 IP가 조각냄
조각의 표시세그먼트마다 바이트 단위 순서 번호(seq)IP 헤더의 식별자·조각 위치(8바이트 단위)·MF 플래그
다시 맞추는 곳받는 쪽 TCP가 순서 번호로 재조립받는 쪽 IP가 조각 위치로 재조립
하나가 사라지면그 세그먼트만 다시 보냄데이터그램 전체를 버림(다시 보내지 않음)
받았다는 표시확인 번호(ACK) = 다음에 받을 바이트 번호없음

🧮 실제 값으로 계산해 보기 — 헤더는 얼마나 '세금'을 걷을까?

TCP 세그먼트 하나가 선에 실리는 크기 = 데이터(MSS) + TCP 20 + IP 20 + 이더넷 18 + 프리앰블·간격 20
MTU 1,500: 1,460 ÷ 1,538 ≈ 94.9 %  |  MTU 9,000(점보): 8,960 ÷ 9,038 ≈ 99.1 %  |  MTU 68: 28 ÷ 106 ≈ 26.4 %
  • MTU가 작으면 데이터보다 헤더가 더 많아집니다. 위 시뮬레이션에서 MTU를 68과 1,500으로 바꿔 '전송 효율'이 어떻게 달라지는지 확인해 보세요.
  • 그래서 대용량 관측 데이터는 MTU를 9,000바이트로 키운 점보 프레임으로 보냅니다(네트워크 카드, 대용량 데이터 전송 및 수신 편 참고).

④ 받는 쪽은 벗기면서 무엇을 검사할까?

역캡슐화는 단순히 헤더를 떼는 일이 아니라, 계층마다 "이 데이터가 망가지지 않았는지, 나에게 온 것이 맞는지, 위로 누구에게 넘길지"를 확인하는 과정입니다.

계층검사하는 것틀리면다음 계층을 고르는 단서
L2 이더넷FCS(CRC-32)를 다시 계산해 비교, 목적지 MAC이 내 것인지프레임을 조용히 버림타입 0x0800 → IPv4
L3 IP헤더 체크섬, 목적지 IP가 내 것인지, TTL패킷을 버림프로토콜 번호 6 → TCP, 17 → UDP
L4 TCP체크섬(가상 헤더 포함), 순서 번호, 중복 여부버리고 상대가 다시 보내게 함목적지 포트 → 응용 프로그램
L4 UDP체크섬(가상 헤더 포함), 길이버림(다시 오지 않음)목적지 포트 → 응용 프로그램

TCP·UDP 체크섬은 자기 헤더와 데이터뿐 아니라 IP 주소와 프로토콜 번호로 만든 가상 헤더까지 함께 계산합니다. 엉뚱한 주소로 잘못 배달된 데이터를 전송 계층에서도 한 번 더 걸러내기 위해서입니다.

⑤ 전파망원경 데이터는 어떻게 싸서 보낼까?

실시간 e-VLBI에서 망원경 데이터는 VDIF 프레임(머리 32바이트 + 데이터 수천 바이트)으로 잘리고, 앞에 8바이트 순번을 붙여(VTP) UDP에 담겨 보내집니다. UDP는 스스로 자르지 않으므로, 프레임 하나가 점보 프레임(MTU 9,000) 하나에 꼭 맞도록 VDIF 프레임 크기를 정합니다. 그래야 IP 조각화가 일어나지 않고, 패킷 하나를 잃어도 그 프레임만 비게 됩니다.

🧮 실제 값으로 계산해 보기 — VDIF 8,000바이트 데이터의 포장

데이터 8,000 + VDIF 머리 32 + VTP 순번 8 + UDP 8 + IP 20 = IP 패킷 8,068바이트 (MTU 9,000 안에 들어감)
+ 이더넷 18 + 프리앰블·간격 20 = 선 위 8,106바이트  →  효율 8,000 ÷ 8,106 ≈ 98.7 %
  • 같은 데이터를 보통 프레임(MTU 1,500)으로 보내려면 VDIF 프레임을 1,400바이트 정도로 작게 만들어야 하고, 처리할 패킷 수는 약 6배로 늘어납니다.
  • 실시간 e-VLBI가 잃은 패킷을 다시 받지 않아도 되는 이유와 전송 방법은 대용량 데이터 전송 및 수신 편 ⑥에서 다룹니다.

핵심 정리

  • 보내는 쪽: 응용의 글자 → UTF-8 바이트 → (TCP 세그먼트 / UDP 데이터그램) → IP 패킷 → 이더넷 프레임(+FCS) → 비트. 계층마다 머리(헤더)를 덧붙입니다(캡슐화).
  • 받는 쪽: 비트 → 프레임 → 패킷 → 세그먼트 → 바이트 → 글자. 계층마다 체크섬·주소를 검사하고 헤더를 벗깁니다(역캡슐화).
  • TCP는 MSS(= MTU − 40) 크기로 직접 자르고 바이트 단위 순서 번호로 다시 맞추며, 받으면 '다음에 받을 번호'를 ACK로 알립니다.
  • UDP는 자르지 않습니다. MTU보다 크면 IP가 조각내고, 조각 하나만 잃어도 전체가 버려지므로 응용이 MTU에 맞춰 보내는 것이 좋습니다.
  • 헤더의 몫 때문에 MTU가 클수록 효율이 높습니다(1,500 → 94.9 %, 9,000 → 99.1 %). 전파망원경 데이터는 VDIF 프레임을 점보 프레임 하나에 맞춰 UDP로 보냅니다.

🧑‍🏫 선생님·학부모님을 위한 설명 도움말

원리 자세히 보기

  • 왜 한글은 3바이트일까? — 컴퓨터는 글자를 숫자로 저장합니다. 전 세계 글자를 담는 유니코드를 UTF-8 방식으로 저장하면 영문·숫자는 1바이트, 한글 대부분은 3바이트가 됩니다. TCP는 글자가 아니라 바이트를 자르므로, 한글 한 글자가 두 세그먼트에 나뉘어 실리기도 합니다(시뮬레이션의 주황 칩). 받는 쪽에서 바이트를 순서대로 이어 붙이면 다시 온전한 글자가 됩니다.
  • 체크섬과 CRC — IP·TCP·UDP 체크섬은 16비트씩 더해 뒤집는 간단한 방식이라 빠르지만 일부 오류를 놓칠 수 있습니다. 이더넷의 CRC-32는 나눗셈 원리를 쓴 더 강한 검사로, 선 위에서 생긴 비트 오류를 거의 다 잡아냅니다. 두 가지를 겹쳐 쓰는 것은 서로 다른 구간의 오류를 잡기 위해서입니다.
  • 이더넷의 최소 크기와 채움 — 이더넷 프레임은 최소 64바이트여야 해서, 데이터가 너무 짧으면 0으로 채운 채움(padding)을 붙입니다. 받는 쪽 IP는 자기 헤더의 '전체 길이'를 보고 채움을 떼어 냅니다.
  • 순서 번호는 바이트 번호 — TCP의 순서 번호는 '몇 번째 세그먼트'가 아니라 '몇 번째 바이트부터'를 뜻합니다. 그래서 28바이트씩 자르면 1000, 1028, 1056처럼 늘어나고, 모두 받은 뒤의 ACK는 '다음에 받을 바이트 번호'가 됩니다.

비유로 설명하기

  • 캡슐화는 편지를 봉투에 넣고, 그 봉투를 소포 상자에 넣고, 상자에 송장을 붙이는 것과 같습니다. 받는 쪽은 송장 확인 → 상자 열기 → 봉투 열기 순서로 꺼냅니다.
  • TCP는 긴 편지를 쪽수를 적은 여러 장으로 나눠 보내는 것, UDP는 편지를 한 장으로 접어 보내고 답장을 기다리지 않는 것입니다. 너무 크면 우체국(IP)이 잘라 보내는데, 한 조각이라도 잃어버리면 편지 전체를 못 읽습니다.

자주 하는 오해

  • "UDP도 TCP처럼 데이터를 잘라 보낸다" — UDP는 자르지 않습니다. 크면 IP가 조각낼 뿐이고, 순서 번호나 재전송도 없습니다.
  • "패킷은 처음부터 끝까지 같은 모양으로 간다" — 라우터를 지날 때마다 이더넷 머리(MAC 주소)는 새로 바뀌고, IP 헤더의 TTL과 체크섬도 바뀝니다. 끝까지 그대로인 것은 주로 IP 주소와 그 안의 내용입니다.
  • "헤더는 작아서 신경 쓸 필요가 없다" — 작은 패킷이 많을수록 헤더 몫이 커집니다. MTU 68에서는 선에 실린 바이트의 4분의 3 가까이가 헤더와 간격입니다.

함께 해 볼 질문·활동

  • 메시지를 영어로만, 한글로만 바꿔 보며 바이트 수와 세그먼트 수가 어떻게 달라지는지 표로 정리하기
  • MTU 68에서 TCP와 UDP를 번갈아 골라, 누가 자르는지(TCP 세그먼트 / IP 조각)와 순서를 맞추는 방법이 어떻게 다른지 비교하기
  • '도착 순서 뒤섞기'를 켜고 받는 쪽 단계에서 TCP가 순서 번호로, IP가 조각 위치로 다시 맞추는 모습을 확인하기
  • 메시지를 아주 짧게(예: "Hi") 바꾸고 이더넷 단계에서 채움(padding) 바이트가 생기는지 찾아보기

본 교육자료는 Anthropic(Claude) 및 OpenAI(ChatGPT)를 활용하여 제작하였으며, 제작자가 내용을 검토·편집하였습니다. 주요 참고자료와 출처는 각 페이지의 「참고 자료 및 출처」에 명시하였습니다. 출처가 별도로 표기되지 않은 페이지와 참고자료에 포함되지 않은 내용은 제작자가 직접 작성하거나 정리한 것입니다. 내용에 오류가 있거나 수정이 필요한 사항을 발견하시면 kvnsite@kasi.re.kr로 알려 주시기 바랍니다.

현재 페이지

네트워크/보안

TCP·UDP 캡슐화 시뮬레이션