[Network] 네트워크 기초 이론 7강 — 스트림·세그먼트·패킷·프레임, 계층별 데이터 단위
네트워크 기초 이론 시리즈 정리 — 7강. 참고: 널널한 개발자 TV, 네트워크 데이터 단위 정리 (매우 중요!) (재생목록)
네트워크 이야기를 하다 보면 패킷이라는 말이 계속 나온다. 그런데 패킷은 여러 데이터 단위 중 하나일 뿐이고, 각 단위는 어느 계층에서 부르는 이름인지가 다르다. 이번에는 그 단위들을 계층에 맞춰 정리한다. 이름을 헷갈리면 그 뒤의 모든 설명이 흐려지므로, 여기는 외워 두는 편이 낫다.
계층별 데이터 단위
먼저 결론이다.
| 자리 | 계층 | 데이터 단위 |
|---|---|---|
| 애플리케이션 프로세스 — 소켓 수준 | 유저 모드 | 스트림(stream) |
| TCP — 전송 계층 | 4계층(커널) | 세그먼트(segment) |
| IP — 네트워크 계층 | 3계층(커널) | 패킷(packet) |
| 디바이스 드라이버·NIC | 2계층 | 프레임(frame) |
위에서 아래로 내려가며 이름이 바뀌는데, 이름만 바뀌는 것이 아니라 모양도 바뀐다. 그 변형이 이 글의 본론이다.
왜 위쪽은 스트림인가
소켓은 파일 형태의 인터페이스다(1강). 그래서 소켓으로 주고받는 데이터의 성질도 파일과 같다.
파일을 떠올려 보자. 문서를 만들어 저장하면 3KB였다가, 계속 써 내려가면 수십 KB가 되고 메가바이트까지도 늘어난다. 어디까지 늘어날지 미리 정해져 있지 않다.
소켓의 데이터도 같다. 이런 데이터를 스트림이라고 부른다.
스트림 = 시작은 있지만 끝을 미리 알 수 없는, 일렬로 늘어선 데이터
동영상 스트리밍이 익숙한 예다. 재생을 시작할 때 그 방송이 언제 끝날지는 정해져 있지 않다. 만드는 쪽이 멈출 때 끝난다.
여기서 문제가 생긴다. 스트림은 길이 제한이 없는데, 3계층에서 한 번에 보낼 수 있는 크기에는 상한이 있다. 그래서 아래로 내려보내려면 잘라야 한다.
TCP — 세그멘테이션
유저 모드의 프로세스가 소켓에 데이터를 쓰면, 그 데이터는 커널로 내려가 TCP를 만난다. 이때 벌어지는 일이 세그멘테이션이다.
유저 모드 : ■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ← 스트림 (끝을 알 수 없다)
│ write()
▼ 커널 진입
TCP (4계층) : ■■■■■│■■■■■│■■■■■│■■■■■ ← 일정 크기로 자른다 = 세그멘테이션
└ 조각 하나 = 세그먼트
- 세그멘테이션 — 스트림을 일정 크기로 자르는 일
- 세그먼트 — 그렇게 잘린 조각 하나
그럼 "일정 크기"는 얼마인가. 그 상한이 MSS(Maximum Segment Size) 다.
IP — 패킷과 MTU
잘린 세그먼트는 3계층으로 내려가 인터넷에서 운반 가능한 형태로 포장된다. 그 결과물이 패킷이다. 택배 상자에 물건을 담는 것에 가깝다 — 내용물은 그대로고, 주소가 적힌 포장이 씌워진다.
패킷의 크기에도 상한이 있다. 그것이 MTU(Maximum Transmission Unit) 다.
MTU = 한 번에 전송할 수 있는 최대 크기. 특별한 이유가 없으면 1500바이트다.
이더넷의 기본값이 1500바이트라 사실상 이 값이 표준처럼 쓰인다. 그리고 MSS는 MTU에서 유도된다 — 패킷 안에 IP 헤더와 TCP 헤더가 먼저 들어가고 남는 자리가 데이터 몫이기 때문이다.
MSS = MTU − IP 헤더 − TCP 헤더
= 1500 − 20 − 20 = 1460바이트 (IPv4, 옵션 없을 때)
그래서 MSS는 언제나 MTU보다 작다. 순서로 보면 MTU가 먼저 정해지고 MSS가 거기에 맞춰진다.
숫자를 넣어 보면 감이 잡힌다. 1.5MB짜리 데이터를 보낸다고 하면,
1,500,000 ÷ 1460 ≈ 1,027개
세그먼트가 천 개 남짓 나온다. 우리가 한 덩어리로 인식하는 데이터도 실제로는 아주 잘게 분해되어 전송된다.
2계층 — 프레임
패킷은 그 자체로 선을 타지 못한다. 실제로 케이블이나 무선 구간을 통과하려면 다시 한 번 포장되어야 하고, 그 형태가 프레임이다. 프레임은 2계층 주소인 MAC 주소를 달고, NIC가 실어 보내는 단위다.
정리하면 데이터는 내려가면서 이렇게 옷을 갈아입는다.
스트림 → 세그먼트 → 패킷 → 프레임
(소켓) (TCP/4계층) (IP/3계층) (2계층·NIC)
자르고 주소 붙여 전송 가능한
포장하고 형태로 싣고
각 단계에서 앞 단계의 결과물이 통째로 내용물이 되고 그 앞에 헤더가 붙는다. 이 방식을 인캡슐레이션(encapsulation, 캡슐화) 이라고 한다. 반대편 호스트에서는 같은 과정이 역순으로 일어나 헤더를 하나씩 벗겨 낸다. 캡슐화의 구체적인 형태는 14강에서 다룬다.
몇 가지 덧붙임
- UDP의 단위는 데이터그램이다. TCP처럼 스트림을 자르는 것이 아니라, 애플리케이션이 보낸 덩어리 하나가 그대로 하나의 데이터그램이 된다. TCP가 스트림 지향, UDP가 메시지 지향이라 불리는 이유가 여기 있다.
- 계층별 데이터 단위를 통칭해 PDU(Protocol Data Unit)라고 부른다. 세그먼트·패킷·프레임은 각 계층의 PDU에 붙은 고유 이름이다.
- MTU가 항상 1500인 것은 아니다. 데이터센터에서는 9000바이트짜리 점보 프레임을 쓰기도 하고, 터널링(VPN 등)을 거치면 헤더가 덧붙는 만큼 실질 MTU가 줄어든다. 경로 중간에 더 작은 MTU를 가진 구간이 있으면 그 값이 전체를 제약한다.
- "패킷"은 일상적으로 넓게 쓰인다. 엄밀히는 3계층 단위지만 데이터 덩어리 전반을 가리키는 말로도 통용된다. 계층을 따지는 맥락에서는 구분해서 읽어야 한다.
정리
- 데이터 단위는 계층마다 이름이 다르다 — 스트림(소켓) → 세그먼트(TCP) → 패킷(IP) → 프레임(2계층).
- 스트림은 끝을 미리 알 수 없는 일렬 데이터다. 소켓이 파일 형태의 인터페이스이기 때문에 갖는 성질이다.
- 스트림을 일정 크기로 자르는 일이 세그멘테이션이고, 그 조각이 세그먼트다. 상한은 MSS.
- 패킷의 최대 크기가 MTU이며 기본값은 1500바이트다. MSS = MTU − IP 헤더 − TCP 헤더라 항상 MTU보다 작다.
- 아래 계층으로 내려갈 때마다 앞 단계 결과물에 헤더가 덧씌워지는데, 이것이 인캡슐레이션이다.
댓글
아직 댓글이 없습니다. 첫 댓글을 남겨보세요.