데이터그램
고친 사람 github-actions[bot]
데이터그램은 미리 연결을 맺지 않고 혼자서 목적지까지 가는 데이터 한 덩이입니다. 덩이마다 받는 곳의 주소를 스스로 들고 다닙니다. 네트워크는 덩이 하나하나를 따로 보고 보낼 길을 고릅니다. 대신 도착과 순서는 약속하지 않습니다.
쉽고 빠른 이해
데이터그램은 주소를 적은 데이터 한 덩이를 네트워크에 던져 목적지까지 보내는 방식입니다. 엽서 한 장마다 주소를 적어 우체통에 넣는 것과 닮았습니다.
이렇게 하면 중간 장비가 누가 누구와 통신 중인지 기억할 필요가 없습니다. 장비는 덩이에 적힌 주소만 보고 다음 장비로 넘깁니다. 한 장비가 멈춰도 다른 길로 돌아가면 됩니다.
어떻게 도나:
- 보내는 쪽이 데이터 앞에 받는 곳 주소를 붙여 내보냅니다
- 중간 장비가 주소를 보고 다음 장비를 골라 넘깁니다
- 덩이마다 따로 길을 고르므로 늦게 보낸 것이 먼저 도착하기도 합니다
대가는 잃어버림입니다. 덩이가 사라지거나 순서가 뒤바뀌어도 네트워크는 알려 주지 않습니다. 그게 곤란하면 양 끝의 프로그램이 직접 챙깁니다.
그래서 늦게 오느니 빠지는 편이 나은 일에 씁니다. 도메인 이름으로 주소를 묻는 짧은 질의나 음성 통화가 그렇습니다. 파일 전송처럼 한 바이트도 빠지면 안 되는 일에는 쓰지 않습니다.
상세
엽서 한 장을 떠올려 봅시다. 엽서 한 장 한 장에 받는 사람 주소가 적혀 있습니다. 우체국은 어제 온 엽서와 오늘 온 엽서가 같은 사람이 보낸 이어지는 글인지 신경 쓰지 않습니다. 두 장을 같은 날 부쳐도 다른 날 도착할 수 있습니다.
데이터그램은 패킷 교환 네트워크에서 쓰는 전달 단위입니다. 패킷 교환은 데이터를 덩이로 잘라 여럿이 함께 쓰는 선로에 흘려보내는 네트워크입니다.
데이터그램은 연결을 맺는 절차 없이 보냅니다. 목적지까지 가는 데 필요한 정보는 덩이 안에 다 담습니다. 네트워크는 덩이마다 따로 전달합니다.
인터넷에서 IP(Internet Protocol, 인터넷 프로토콜)가 나르는 단위가 대표 예입니다. IP 는 인터넷에서 주소를 보고 덩이를 목적지까지 보내는 규칙입니다. 그래서 흔히 IP 데이터그램이라고 부릅니다.
스스로 완결된 한 덩이
데이터그램 하나는 헤더와 데이터로 이루어집니다. 헤더는 덩이 앞에 붙는 안내문입니다. 여기에 출발지와 목적지 IP 주소가 들어갑니다. 뒤따르는 데이터는 실어 나르려던 내용입니다.
「스스로 완결되었다」는 말은 앞뒤 덩이에 기대지 않는다는 뜻입니다. 중간 장비는 이 덩이 하나의 헤더만 읽고도 어디로 넘길지 정할 수 있습니다. 이 덩이가 몇 번째인지, 앞 덩이가 무사히 갔는지는 알 필요가 없습니다.
연결을 맺지 않는 전달
전달 방식은 크게 둘로 나뉩니다. 전화처럼 먼저 길을 잡아 두고 그 길로만 주고받는 방식을 연결형이라고 부릅니다. 엽서처럼 길을 잡지 않고 덩이마다 따로 보내는 방식은 비연결형입니다. 데이터그램은 비연결형 전달의 단위입니다.
앞에서 말한 중간 장비가 라우터입니다. 라우터는 네트워크와 네트워크 사이에서 덩이를 받아 다음 장비로 넘겨주는 장비입니다. 여러 갈래 길 가운데 어디로 넘길지 정해야 목적지에 닿기 때문에 필요합니다.
덩이를 넘길 길을 고르는 일을 라우팅이라고 합니다. 비연결형에서는 라우터가 덩이를 받을 때마다 길을 새로 고릅니다. 그 사이 네트워크 사정이 바뀌면 같은 목적지로 가는 덩이라도 다른 길을 탑니다.
아래 그림은 보내는 쪽이 덩이 셋을 차례로 보냈을 때 벌어질 수 있는 일을 그렸습니다. 1번과 2번은 다른 길을 타서 순서가 뒤집혔습니다. 3번은 라우터 A 의 대기열이 넘쳐 버려졌습니다. 대기열은 라우터가 미처 넘기지 못한 덩이를 잠시 쌓아 두는 곳입니다.
sequenceDiagram
participant 보내는 쪽
participant 라우터 A
participant 라우터 B
participant 받는 쪽
보내는 쪽->>라우터 A: 데이터그램 1
보내는 쪽->>라우터 B: 데이터그램 2
라우터 B->>받는 쪽: 데이터그램 2
라우터 A->>받는 쪽: 데이터그램 1
보내는 쪽->>라우터 A: 데이터그램 3
Note over 라우터 A: 대기열이 넘쳐 3번을 버린다
받는 쪽은 2번을 먼저 받고 1번을 나중에 받습니다. 3번은 영영 안 옵니다. 네트워크는 이 사실을 보내는 쪽에도 받는 쪽에도 알려 주지 않습니다.
약속하지 않는 것
데이터그램 방식은 최선형 전달을 합니다. 영어로는 best effort 라고 부릅니다. 네트워크가 보내려고 애는 쓰지만 결과를 보장하지는 않는다는 뜻입니다. 구체적으로 무엇이 보장되지 않는지는 아래 표와 같습니다.
| 약속하지 않는 것 | 그래서 생기는 일 |
|---|---|
| 도착 | 라우터의 대기열이 넘치면 덩이가 버려집니다 |
| 순서 | 다른 길을 탄 덩이가 먼저 도착합니다 |
| 속도 조절 | 받는 쪽이 감당 못 할 만큼 몰려와도 네트워크는 줄이지 않습니다 |
이 빈틈은 양 끝의 프로그램이 채웁니다. 예를 들어 TCP(Transmission Control Protocol, 전송 제어 프로토콜)는 데이터그램에 실어 보내는 데이터에 번호를 매깁니다. 못 받은 것은 다시 보내고 순서도 맞춥니다.
네트워크 한가운데는 단순하게 두고 신뢰성은 양 끝에서 챙기는 설계입니다. 이 생각을 종단 간 원칙이라고 부릅니다. 가운데 장비가 할 일이 줄어서 네트워크를 크게 넓히기 쉬워집니다.
왜 이렇게 만들었나
연결형 전달에서는 중간 장비가 연결마다 상태를 기억해야 합니다. 장비 하나가 멈추면 그 장비를 지나던 연결이 전부 끊깁니다. 연결이 많아질수록 장비가 기억할 것도 늘어납니다.
데이터그램 방식에서는 중간 장비가 연결을 기억하지 않습니다. 덩이 하나를 받으면 헤더를 보고 넘기고 잊습니다. 장비 하나가 멈춰도 다음 덩이부터 다른 길로 돌아가면 됩니다. 많은 네트워크를 이어 붙인 인터넷이 이 방식을 바탕으로 삼은 까닭입니다.
계층마다 붙는 이름
네트워크가 하는 일은 여러 계층으로 나눠 설명합니다. 계층은 일을 층층이 나눈 것입니다. 각 층은 자기 일만 하고 나머지는 아래층에 맡기므로 한 층을 바꿔도 다른 층이 흔들리지 않습니다. 인터넷에서는 흔히 아래 네 층으로 나눕니다.
| 계층 | 맡는 일 |
|---|---|
| 응용 계층 | 프로그램이 주고받을 내용을 만듭니다 |
| 전송 계층 | 양 끝 프로그램 사이의 전달을 맡습니다. TCP 가 여기 있습니다 |
| 네트워크 계층 | 주소를 보고 목적지까지 보냅니다. IP 가 여기 있습니다 |
| 링크 계층 | 장비와 장비를 잇는 한 구간을 건넙니다 |
데이터가 위층에서 아래층으로 내려갈 때마다 그 층은 자기 일에 필요한 정보를 헤더로 앞에 붙입니다. 이렇게 헤더를 겹겹이 씌우는 일을 캡슐화라고 합니다. 헤더가 하나 늘 때마다 덩이를 부르는 이름도 바뀝니다.
flowchart TD
M["메시지 · 응용 계층의 데이터"] --> S["세그먼트 · TCP 헤더를 붙임"]
S --> D["데이터그램 · IP 헤더를 붙임"]
D --> F["프레임 · 링크 계층 헤더를 붙임"]
그림은 전송 계층에서 TCP 를 쓸 때입니다. 위에서 아래로 내려갈수록 헤더가 하나씩 늘어납니다. 네트워크 계층에서 IP 헤더가 붙은 덩이가 데이터그램입니다.
전송 계층에는 TCP 말고 UDP(User Datagram Protocol, 사용자 데이터그램 프로토콜)도 있습니다. UDP 는 IP 데이터그램의 성질을 거의 그대로 프로그램에 넘겨줍니다. 연결을 맺지 않습니다. 도착과 순서도 약속하지 않습니다.
그래서 UDP 가 다루는 덩이도 데이터그램이라고 부릅니다. 「데이터그램」이라는 말이 나오면 IP 의 덩이인지 UDP 의 덩이인지를 문맥으로 가려 읽어야 합니다.
데이터그램과 패킷
실무에서는 데이터그램과 패킷을 자주 섞어 부릅니다. 패킷은 패킷 교환 네트워크에서 오가는 덩이를 두루 가리키는 넓은 말입니다. 데이터그램은 그중 연결 없이 덩이마다 따로 전달되는 덩이를 콕 집는 말입니다.
그래서 「IP 패킷」과 「IP 데이터그램」은 대개 같은 것을 가리킵니다. 반대로 연결형 네트워크에서 오가는 덩이를 데이터그램이라고 부르지는 않습니다.
크기 한계와 조각
데이터그램이 지나는 링크, 곧 장비와 장비를 잇는 구간마다 한 번에 실을 수 있는 크기에 상한이 있습니다. 이 상한을 MTU(Maximum Transmission Unit, 최대 전송 단위)라고 부릅니다. 데이터그램이 MTU 보다 크면 그대로는 못 지나갑니다.
이럴 때 데이터그램은 여러 조각으로 나뉘어 갑니다. 조각은 받는 쪽에서 다시 붙습니다. 이 일이 단편화입니다.
조각도 각자 따로 전달되므로 하나만 잃어도 원래 데이터그램 전체를 못 맞춥니다. 그래서 데이터그램을 쓰는 프로그램은 대개 MTU 안에 들어가는 크기로 보냅니다.
경계가 남는다는 성질
데이터그램 방식에는 백엔드 개발자가 코드에서 바로 부딪히는 성질이 하나 있습니다. 보낸 덩이의 경계가 받는 쪽까지 그대로 남는다는 것입니다. 이 소절은 UDP 소켓으로 이 성질을 봅니다. 소켓은 프로그램이 네트워크로 데이터를 보내고 받는 출입구입니다.
TCP 는 바이트 스트림을 줍니다. 두 번 나눠 보낸 데이터가 받는 쪽에서는 한 번에 붙어서 읽히기도 합니다. UDP 로 보낸 데이터그램은 한 번 보낸 것이 한 번에 읽힙니다.
아래는 자바로 데이터그램 둘을 보낸 뒤 받는 쪽에서 두 번 읽는 코드입니다. s 는 보내는 소켓, r 은 받는 소켓, p 는 받은 덩이를 담는 그릇입니다. pkt 는 문자열을 데이터그램 하나로 싸는 짧은 도우미입니다. 주석의 숫자는 그때 받은 바이트 수입니다.
// 보내는 쪽: 두 번 보낸다
s.send(pkt("hi"));
s.send(pkt("there"));
// 받는 쪽: 두 번 읽는다
r.receive(p); p.getLength(); // 2
r.receive(p); p.getLength(); // 5
받는 쪽은 「hithere」 7바이트를 한 번에 받지 않습니다. 2바이트짜리 하나와 5바이트짜리 하나를 따로 받습니다. 대신 둘 중 하나가 사라지거나 순서가 바뀌어 올 수는 있습니다.
언제 쓰고 언제 안 쓰나
데이터그램 방식은 늦게 온 데이터보다 빠진 데이터가 차라리 나을 때 고릅니다. 연결을 맺는 왕복이 없으니 첫 덩이가 빨리 나갑니다. 한 번 묻고 한 번 답하면 끝나는 짧은 교환에도 잘 맞습니다.
| 고르는 경우 | 까닭 |
|---|---|
| DNS(Domain Name System, 도메인 이름 시스템) 질의 | 질문 하나 답 하나로 끝납니다. 답이 안 오면 다시 물으면 됩니다 |
| 음성 통화 · 화상 회의 | 한참 늦게 온 소리는 쓸모가 없습니다. 빠진 조각은 건너뜁니다 |
| 온라인 게임의 위치 갱신 | 곧 새 위치가 옵니다. 지난 위치를 다시 받을 필요가 없습니다 |
반대로 파일 전송이나 데이터베이스 요청처럼 한 바이트도 빠지면 안 되고 순서가 중요한 일에는 쓰지 않습니다. 그런 일을 데이터그램 위에서 하려면 재전송과 순서 맞추기를 직접 만들어야 합니다. 그 일을 이미 해 둔 것이 TCP 입니다.
관련 항목
데이터그램을 나르고 정의하는 프로토콜
IP · IPv4 · IPv6 · UDP · ICMP · QUIC
데이터그램 헤더를 이루는 구성 요소
헤더 · IP 주소 · 포트 번호 · TTL · 체크섬 · 페이로드
계층마다 데이터그램과 나란히 서는 전달 단위
데이터그램과 맞세워지는 전달 방식
연결형 · 비연결형 · 가상 회선 · 회선 교환 · 패킷 교환 · 바이트 스트림 · TCP
데이터그램이 네트워크를 지나며 거치는 처리 단계
캡슐화 · 라우팅 · 라우터 · 포워딩 · 단편화 · 재조립 · MTU · 경로 MTU 탐색
데이터그램 전달에서 자주 나는 오류
패킷 손실 · 순서 뒤바뀜 · 중복 수신 · 혼잡 · 지터
데이터그램 방식에 적용되는 설계 원칙
최선형 전달 · 종단 간 원칙 · 계층 · OSI 모델 · TCP/IP 모델
데이터그램을 코드에서 다루는 수단
소켓 · UDP 소켓 · 유닉스 도메인 소켓 · 브로드캐스트 · 멀티캐스트
데이터그램 방식을 채택한 응용
다른 이름: datagram · 데이터그램 방식