프로토콜 스택
고친 사람 github-actions[bot]
프로토콜 스택은 네트워크 통신에 드는 일을 여러 프로토콜에 나눠 맡깁니다. 프로토콜들은 위아래로 쌓여 저마다 한 가지 일만 합니다. 데이터는 이 더미를 따라 내려갔다가 상대편에서 다시 올라옵니다. 운영체제 안에서 이 일을 해 주는 소프트웨어도 같은 이름으로 부릅니다.
쉽고 빠른 이해
프로토콜은 두 컴퓨터가 통신할 때 지키는 규칙입니다. 프로토콜 스택은 통신 한 번에 드는 일을 이런 규칙 여럿에 나눠 맡깁니다. 웹 페이지 하나를 받아 올 때도 요청을 적는 규칙, 빠짐없이 나르는 규칙, 길을 찾는 규칙, 옆 장비로 신호를 보내는 규칙이 위아래로 겹쳐 움직입니다.
규칙마다 맡는 층이 하나씩 있습니다. 이 층을 계층이라고 부릅니다. 규칙 하나가 모든 일을 떠맡으면 선을 무선으로 바꿀 때 프로그램까지 다시 만들어야 합니다. 계층으로 나눠 두면 바뀐 계층의 규칙만 갈아 끼웁니다.
- 보내는 쪽은 위에서 아래로 내려가며 계층마다 안내 정보를 하나씩 붙입니다
- 신호가 선이나 전파를 타고 상대에게 건너갑니다
- 받는 쪽은 아래에서 위로 올라가며 안내 정보를 하나씩 떼어 냅니다
대가는 덧붙는 안내 정보와 처리 시간입니다. 계층끼리 서로의 사정을 모르므로 아래에서 생긴 문제를 위에서 알아채기도 어렵습니다.
상세
이사할 때 물건은 상자에 담긴 뒤 트럭에 실립니다. 짐을 싼 사람은 트럭이 어느 길로 갈지 모릅니다. 트럭 기사는 상자 안에 무엇이 들었는지 모릅니다.
프로토콜은 두 컴퓨터가 데이터를 주고받을 때 지키기로 한 순서와 형식입니다. 무엇을 어떤 모양으로 보내고 어떻게 답할지를 정해 두어야 서로의 말을 알아듣습니다.
통신 한 번에 드는 일을 프로토콜 하나가 다 맡지 않습니다. 일을 위아래 몇 층으로 갈라 층마다 프로토콜을 하나씩 둡니다. 이렇게 갈라 놓은 한 층을 계층이라고 부릅니다.
위 계층은 아래 계층이 해 주는 일에 기대어 자기 몫만 합니다. 앞의 이사에서 짐을 싼 사람이 위 계층이라면 트럭 기사는 아래 계층입니다. 둘은 서로의 속을 모른 채 제 일만 합니다.
계층마다 둔 프로토콜을 위아래로 쌓아 한 벌로 쓰는 것이 프로토콜 스택입니다. 웹 브라우저가 웹 페이지를 받아 올 때는 네 계층이 한 벌로 움직입니다.
| 계층 | 맡는 일 | 이 요청에서 쓰는 프로토콜 |
|---|---|---|
| 응용 계층 | 무엇을 달라고 할지 적는다 | HTTP(HyperText Transfer Protocol, 하이퍼텍스트 전송 프로토콜) |
| 전송 계층 | 조각이 빠지지 않게 순서대로 건넨다 | TCP(Transmission Control Protocol, 전송 제어 프로토콜) |
| 네트워크 계층 | 여러 네트워크를 건너 목적지를 찾아간다 | IP(Internet Protocol, 인터넷 프로토콜) |
| 링크 계층 | 바로 옆 장비까지 신호로 실어 나른다 | 이더넷 |
표의 오른쪽 열을 위에서 아래로 읽은 것이 이 요청의 프로토콜 스택입니다. HTTP 는 TCP 에 기댑니다. TCP 는 IP 에 기댑니다. IP 는 이더넷에 기댑니다.
스택이라는 이름은 프로토콜을 위아래로 쌓아 올린 모양에서 왔습니다. 자료구조 스택처럼 넣고 빼는 규칙을 가리키는 말이 아닙니다.
나눠 쌓는 까닭
프로토콜 하나가 모든 일을 맡는다고 해 봅시다. 유선 랜에서 와이파이로 옮기면 웹 브라우저까지 다시 만들어야 합니다. 빠진 조각을 다시 보내는 코드도 프로그램마다 따로 짜야 합니다.
나눠 쌓으면 한 계층을 갈아 끼워도 위아래가 멀쩡합니다. 와이파이로 옮겨도 바뀌는 것은 링크 계층뿐입니다. 웹 브라우저 코드는 한 줄도 안 고칩니다.
아래 계층을 여럿이 나눠 쓸 수도 있습니다. 웹 브라우저도 메일 프로그램도 같은 TCP 에 기댑니다. 그래서 빠진 조각을 다시 보내는 재전송 코드를 프로그램마다 짤 필요가 없습니다.
프로토콜과 인터페이스
스택 안의 약속은 두 방향으로 오갑니다. 하나는 두 컴퓨터의 같은 계층끼리 맺는 약속입니다. 보내는 쪽 TCP 와 받는 쪽 TCP 는 같은 규칙으로 말합니다. 그래야 서로의 말을 알아듣습니다. 이 약속이 프로토콜입니다.
다른 하나는 한 컴퓨터 안에서 바로 위아래 계층이 맺는 약속입니다. 위 계층은 아래 계층의 속을 들여다보지 않습니다. 정해진 몇 가지 방법으로만 일을 맡깁니다. 이 약속을 인터페이스라고 부릅니다.
인터페이스를 지키는 한 계층 하나의 속을 전부 바꿔도 이웃 계층은 눈치채지 못합니다. 앞에서 본 「갈아 끼워도 멀쩡하다」는 이 약속 덕분입니다.
보낼 때 내려가는 길
보내는 쪽에서 데이터는 스택을 위에서 아래로 지납니다. 계층마다 자기 몫의 안내 정보를 데이터 앞에 붙입니다. 이 안내 정보가 헤더입니다. 받는 쪽의 같은 계층이 읽을 내용이 적힙니다. 어디로 가는지, 몇 번째 조각인지 같은 것입니다.
아래 계층은 위에서 넘겨받은 것을 열어 보지 않습니다. 트럭 기사가 상자를 열지 않는 것과 같습니다. 받은 것을 전부 알맹이로 다룹니다. 그 앞에 자기 헤더를 붙입니다.
위 계층에서 내려온 데이터를 아래 계층의 헤더와 함께 한 덩어리로 싸는 일을 캡슐화라고 합니다. 계층을 하나 내려갈 때마다 이 일이 한 번씩 일어납니다.
flowchart TD
A["응용 계층 · 데이터"]
B["전송 계층 · 전송 헤더 + 데이터"]
C["네트워크 계층 · 네트워크 헤더 + 전송 헤더 + 데이터"]
D["링크 계층 · 링크 헤더 + 네트워크 헤더 + 전송 헤더 + 데이터"]
E["케이블 · 전파"]
A --> B --> C --> D --> E
그림처럼 한 계층을 내려갈 때마다 헤더가 하나씩 늘어납니다. 맨 아래에 닿은 데이터는 신호로 바뀌어 케이블이나 전파를 탑니다. 링크 계층이 헤더를 붙여 나르는 이 단위를 프레임이라고 부릅니다.
한 컴퓨터에서는 여러 프로그램이 동시에 데이터를 보냅니다. 웹 브라우저가 보낸 요청도 메일 프로그램이 보낸 편지도 같은 IP 를 지나 같은 선으로 나갑니다. 이렇게 여러 위쪽 흐름을 아래 계층 하나에 섞어 내보내는 일을 다중화라고 합니다.
받을 때 올라가는 길
받는 쪽은 싼 순서를 거꾸로 밟습니다. 맨 아래 링크 계층부터 자기 헤더를 읽고 떼어 냅니다. 남은 알맹이는 위 계층으로 올립니다. 이 일을 역캡슐화라고 부릅니다.
올릴 곳이 하나가 아닙니다. 네트워크 계층 위에는 TCP 도 있고 UDP(User Datagram Protocol, 사용자 데이터그램 프로토콜)도 있습니다. UDP 는 재전송 없이 조각을 바로 건네는 프로토콜입니다.
DNS(Domain Name System, 도메인 이름 시스템)는 도메인 이름으로 IP 주소를 찾아 주는 통신입니다. 짧은 질문 하나에 짧은 답 하나를 주고받으므로 주로 UDP 를 씁니다.
올릴 곳이 여럿이므로 헤더마다 「안에 든 것을 위의 누구에게 넘길지」 적는 칸이 있습니다. 링크 헤더에는 네트워크 계층의 어느 프로토콜에 넘길지가 적힙니다. IP 헤더에는 TCP 와 UDP 중 어디로 넘길지가 적힙니다.
전송 계층에서는 이 칸이 포트 번호입니다. 포트 번호로 어느 프로그램에게 줄지를 가립니다.
받는 쪽은 그 칸을 읽어 알맹이를 맞는 프로토콜에게 건넵니다. 이렇게 섞여 온 흐름을 다시 갈라 주는 일을 역다중화라고 합니다. 보낼 때 다중화로 섞은 것을 받을 때 가르는 셈입니다.
flowchart TD
F["도착한 프레임"] -->|"링크 헤더를 읽음"| I["IP"]
I -->|"IP 헤더를 읽음"| T["TCP"]
I -->|"IP 헤더를 읽음"| U["UDP"]
T -->|"포트 번호를 읽음"| W["웹 서버 프로그램"]
U -->|"포트 번호를 읽음"| D["DNS 서버 프로그램"]
그림처럼 웹 요청과 DNS 질문이 한 선을 같이 타고 와도 각자 제 프로그램에 닿습니다. 갈림길마다 읽는 것은 바로 아래 계층의 헤더 칸 하나입니다.
길 중간의 라우터
두 컴퓨터 사이에는 대개 라우터가 여럿 끼어 있습니다. 라우터는 여러 네트워크를 이어 주는 장비입니다. 데이터가 목적지로 가려면 다음에 어느 네트워크로 건너야 할지를 라우터가 고릅니다.
라우터는 스택을 끝까지 올라가지 않습니다. 링크 계층에서 프레임을 받아 네트워크 계층의 헤더만 읽습니다. 목적지를 보고 다음 길을 고른 뒤 다시 링크 계층으로 내려보냅니다.
그래서 라우터는 TCP 헤더도 HTTP 요청도 열어 보지 않습니다. 그 헤더들은 양 끝 컴퓨터의 같은 계층끼리만 읽습니다.
계층 모델 · 스위트 · 스택
계층을 몇 개로 어떻게 가를지 정한 틀을 계층 모델이라고 합니다. 모델은 계층마다 맡을 일만 정해 둔 설계도입니다. 두 모델이 널리 쓰입니다.
OSI 모델은 계층을 일곱으로 가릅니다. OSI 는 Open Systems Interconnection, 곧 개방형 시스템 상호 연결을 줄인 말입니다.
TCP-IP 모델은 계층을 넷으로 가릅니다. 인터넷에서 쓰는 프로토콜에 맞춰 가른 모델입니다.
스위트는 함께 쓰도록 맞춘 프로토콜의 묶음입니다. 인터넷에서 쓰는 묶음이 인터넷 프로토콜 스위트입니다. 이 묶음 안에는 TCP 도 UDP 도 들어 있습니다.
스택은 그 묶음에서 계층마다 하나씩 골라 쌓은 한 벌입니다. 같은 스위트에서 골라도 무엇을 골랐느냐에 따라 스택이 달라집니다. 웹 페이지를 받을 때는 HTTP · TCP · IP 를 쌓습니다. DNS 질문을 보낼 때는 DNS · UDP · IP 를 쌓습니다.
세 이름을 나란히 놓으면 이렇습니다.
| 이름 | 무엇인가 | 예 |
|---|---|---|
| 계층 모델 | 계층을 어떻게 가를지 정한 틀 | OSI 모델 · TCP-IP 모델 |
| 프로토콜 스위트 | 함께 쓰도록 맞춘 프로토콜의 묶음 | 인터넷 프로토콜 스위트 |
| 프로토콜 스택 | 계층마다 프로토콜을 골라 쌓은 한 벌 | HTTP · TCP · IP · 이더넷 |
실무에서는 스위트와 스택을 섞어 부르는 일이 많습니다. 「TCP/IP 스택」이라는 말도 묶음을 가리킬 때와 운영체제 안의 소프트웨어를 가리킬 때가 있습니다.
인터넷 말고도 스택은 여럿입니다. 블루투스나 휴대폰 망도 계층을 나눠 자기 프로토콜을 쌓은 스택을 둡니다.
운영체제 안의 프로토콜 스택
프로토콜 스택은 이 설계를 돌리는 소프트웨어를 가리키기도 합니다. 네트워크 스택이라고도 부릅니다. 한 컴퓨터 안에서도 계층마다 맡는 코드가 다릅니다.
응용 계층은 프로그램 자신이 맡습니다. 프로그램이 도는 영역을 사용자 공간이라고 부릅니다.
전송 계층과 네트워크 계층은 운영체제의 커널이 맡습니다. 커널은 운영체제의 한가운데서 하드웨어와 메모리를 다루는 코드입니다.
링크 계층은 둘이 나눠 맡습니다. 하나는 네트워크 인터페이스 카드입니다. 컴퓨터를 케이블이나 전파에 잇는 장치입니다.
다른 하나는 커널 안의 디바이스 드라이버입니다. 커널이 장치를 부릴 때 거치는 코드입니다. 카드마다 다루는 법이 달라서 카드에 맞는 드라이버가 따로 있습니다.
flowchart TD
subgraph US["사용자 공간"]
APP["응용 계층 · 프로그램"]
end
subgraph K["커널"]
TR["전송 계층 · TCP · UDP"]
NW["네트워크 계층 · IP"]
DRV["링크 계층 · 디바이스 드라이버"]
end
subgraph HW["장치"]
NIC["링크 계층 · 네트워크 인터페이스 카드"]
end
APP -->|"소켓"| TR
TR --> NW --> DRV --> NIC
프로그램과 커널 사이의 창구가 소켓입니다. 프로그램은 소켓을 열고 데이터를 써 넣기만 합니다. 헤더를 붙이고 빠진 조각을 다시 보내는 일은 커널 안의 스택이 합니다.
백엔드 개발자가 짜는 코드는 대개 맨 위 응용 계층에 있습니다. 웹 프레임워크가 HTTP 를 읽고 씁니다. 그 아래는 커널이 맡습니다. 그래서 연결이 느리거나 끊길 때 원인이 코드 밖, 커널의 스택 안에 있기도 합니다.
스택을 덜 지나는 통신
같은 컴퓨터 안의 두 프로그램도 TCP 로 이야기할 수 있습니다. 이때 데이터는 네트워크 인터페이스 카드까지 내려가지 않습니다. 커널 안에서 스택을 내려갔다가 곧바로 다시 올라옵니다. 이 통로를 루프백이라고 부릅니다.
헤더를 붙였다 떼는 일조차 아깝다면 스택을 덜 지나는 통로를 씁니다. 유닉스 도메인 소켓은 같은 컴퓨터 안의 프로그램끼리만 쓰는 소켓입니다. 전송 계층과 네트워크 계층을 거치지 않습니다. 같은 서버에 뜬 데이터베이스에 붙을 때 이 통로를 고르기도 합니다.
쌓아서 치르는 값
계층마다 헤더가 붙으므로 선에 실리는 바이트가 보내려던 데이터보다 많습니다. 작은 데이터를 자주 보낼수록 헤더가 차지하는 몫이 커집니다. 이렇게 본래 일 밖에서 드는 몫을 오버헤드라고 합니다.
계층을 지날 때마다 처리 시간도 듭니다. 헤더를 붙였다 떼는 데 시간이 듭니다. 계층 사이에 데이터를 옮겨 담는 데도 시간이 듭니다.
계층이 서로의 사정을 모르는 것도 값입니다. TCP 는 조각이 빠지면 길이 막혔다고 보고 보내는 속도를 줄입니다. 그런데 조각이 빠진 까닭이 길이 막혀서인지 무선 잡음 때문인지는 모릅니다. 그래서 막힌 것이 아닌데도 속도를 줄이기도 합니다.
관련 항목
프로토콜 스택을 이루는 계층
계층 · 물리 계층 · 링크 계층 · 네트워크 계층 · 인터넷 계층 · 전송 계층 · 세션 계층 · 표현 계층 · 응용 계층
계층을 가르는 틀과 프로토콜 묶음
OSI 모델 · TCP-IP 모델 · 인터넷 프로토콜 스위트 · 모래시계 모델 · 종단 간 원칙 · 프로토콜
스택에 쌓이는 대표 프로토콜
HTTP · TLS · DNS · TCP · UDP · QUIC · IP · IPv4 · IPv6 · ICMP · ARP · 이더넷 · 와이파이 · 블루투스
계층 사이를 오갈 때 일어나는 처리
캡슐화 · 역캡슐화 · 다중화 · 역다중화 · 단편화 · 재조립 · 재전송
계층마다 오가는 데이터 단위와 칸
헤더 · 페이로드 · 세그먼트 · 데이터그램 · 패킷 · 프레임 · 포트 · IP 주소 · MAC 주소 · 프로토콜 번호 · MTU
프로토콜 스택을 구현하는 운영체제 부품
운영체제 · 커널 · 사용자 공간 · 소켓 · 시스템 콜 · 디바이스 드라이버 · 네트워크 인터페이스 카드 · 루프백 · 유닉스 도메인 소켓
스택을 어디까지 올라가 읽느냐로 갈리는 장비
라우터 · 스위치 · 방화벽 · 로드 밸런서 · 프록시
계층으로 나눠 치르는 대가
오버헤드 · 지연 · 혼잡 제어 · 계층 위반 · 누수 추상화 · 커널 우회
이름이 겹치는 다른 스택
다른 이름: protocol stack · network stack · 네트워크 스택