상태 없는 전달
고친 사람 github-actions[bot]
상태 없는 전달은 네트워크 가운데의 장비가 패킷을 하나씩 따로 보고 넘기게 합니다. 패킷은 보낼 데이터를 잘게 자른 조각입니다. 장비는 앞서 지나간 패킷을 기억하지 않습니다. 패킷에 적힌 목적지 주소만 보고 다음 장비를 고릅니다. 인터넷에서 패킷을 넘기는 장비인 라우터가 이렇게 일합니다.
쉽고 빠른 이해
라우터가 패킷마다 목적지 주소만 보고 넘깁니다. 넘긴 뒤에는 그 패킷을 잊습니다. 웹 페이지 한 장을 받는 동안 오가는 패킷 여럿을 라우터는 서로 모르는 패킷처럼 다룹니다.
브라우저와 웹 서버가 주고받는 대화 한 벌을 연결이라고 부릅니다. 라우터가 연결마다 기억을 들고 있으면 그 라우터가 죽을 때 지나던 연결이 함께 끊깁니다. 연결이 늘수록 적어 둘 것도 늘어납니다. 기억이 없으면 라우터 하나가 죽어도 패킷은 다른 길로 돌아갑니다.
- 패킷 머리에 적힌 목적지 주소를 읽습니다
- 목적지별로 다음 장비를 적어 둔 표에서 갈 곳을 찾습니다
- 내보내고 나면 그 패킷을 잊습니다
대가로 패킷마다 목적지 주소를 빠짐없이 실어야 합니다. 같은 연결의 패킷이 서로 다른 길로 가서 순서가 뒤바뀌어 닿기도 합니다. 얼마나 빨리 닿을지도 약속하지 못합니다.
그래서 빠르기를 꼭 약속해야 하는 전화망 같은 망은 연결을 기억하는 쪽을 고릅니다.
상세
우체국 분류원은 봉투에 적힌 주소만 보고 편지를 다음 우체국으로 가는 자루에 넣습니다. 같은 사람이 어제 보낸 편지가 어느 자루에 들어갔는지는 기억하지 않습니다. 편지마다 처음 보는 편지처럼 다룹니다.
네트워크에서 상태란 장비가 지나간 일을 기억해 둔 것을 말합니다. 상태 없는 전달은 가운데 장비가 그런 기억 없이 패킷 하나만 보고 다음 장비로 넘기는 방식입니다. 분류원이 어제 편지를 기억하지 않는 것과 같습니다.
장비가 기억하지 않는 대상은 연결입니다. 연결은 양 끝의 두 프로그램이 주고받는 대화 한 벌입니다. 웹 페이지 한 장을 받는 동안 한 연결로 패킷이 여럿 오갑니다. 인터넷의 라우터는 이 패킷들이 한 연결에 속한다는 것을 모른 채 하나씩 넘깁니다.
라우터가 패킷 하나를 넘기는 순서
이 소절은 라우터 안에서 패킷 하나가 지나가는 길을 라우팅 테이블 하나로 봅니다. 라우팅 테이블은 목적지 주소의 묶음마다 다음에 보낼 장비를 적어 둔 표입니다. 이 표가 있어서 라우터는 처음 보는 패킷도 바로 넘길 수 있습니다.
| 목적지 주소 | 다음 장비 |
|---|---|
| 10.1 로 시작하는 주소 | 라우터 B |
| 10.2 로 시작하는 주소 | 라우터 C |
| 그 밖의 주소 | 라우터 D |
위 표는 목적지마다 한 줄입니다. 연결마다 한 줄이 아닙니다. 10.1 로 시작하는 주소로 가는 연결이 하나든 백만 개든 표는 한 줄로 끝납니다.
패킷 맨 앞에는 목적지 주소 같은 안내를 적은 헤더가 붙어 있습니다. 패킷 하나가 들어오면 라우터는 세 가지만 합니다.
- 헤더에서 목적지 주소를 읽습니다
- 라우팅 테이블에서 그 주소에 맞는 줄을 찾아 다음 장비를 고릅니다
- 그쪽으로 내보내고 그 패킷을 잊습니다
다음 패킷이 같은 연결에서 왔어도 라우터는 1번부터 다시 합니다. 앞 패킷을 어디로 보냈는지 참고하지 않습니다.
상태가 없다고 라우터가 아무것도 모르는 것은 아닙니다. 라우팅 테이블 자체가 라우터가 들고 있는 정보입니다. 이 표는 라우터들이 라우팅 프로토콜로 서로 경로를 알려 주며 채웁니다. 상태가 없다는 말은 연결마다 따로 적어 두는 것이 없다는 뜻입니다.
연결을 기억하는 가상 회선
반대편에는 연결을 기억하는 방식이 있습니다. 이 소절은 그 방식을 하나 소개합니다. 이어서 두 방식을 표 하나로 견줍니다.
가상 회선은 데이터를 보내기 전에 경로부터 정합니다. 경로 위의 장비마다 「이 연결 번호가 붙은 패킷은 이쪽 출구로」라는 줄을 적어 둡니다. 그 뒤로 패킷은 긴 목적지 주소 대신 짧은 연결 번호만 싣고 정해진 길을 따라갑니다.
| 상태 없는 전달 | 가상 회선 | |
|---|---|---|
| 보내기 전에 | 바로 보낸다 | 경로를 세우는 단계를 먼저 거친다 |
| 장비가 적어 두는 것 | 목적지 묶음별 다음 장비 | 연결마다 들어온 번호와 나갈 출구 |
| 적어 둘 줄의 수 | 목적지 묶음 수만큼 | 지나는 연결 수만큼 |
| 패킷이 싣는 것 | 목적지 주소 전체 | 짧은 연결 번호 |
| 같은 연결의 패킷 | 저마다 다른 길로 갈 수 있다 | 모두 같은 길로 간다 |
| 가운데 장비가 죽으면 | 다른 길로 돌아간다 | 그 장비를 지나던 연결이 끊긴다 |
가상 회선은 연결을 맺을 때마다 경로 위 장비를 모두 고쳐야 합니다. 연결이 늘면 장비마다 적어 둘 줄도 그만큼 늘어납니다. 표의 마지막 줄은 인터넷이 상태 없는 전달을 고른 큰 까닭입니다. 다음 소절에서 그 줄을 그림으로 봅니다.
라우터가 죽어도 연결이 사는 까닭
호스트는 네트워크에 붙어 통신하는 양 끝의 컴퓨터입니다. 호스트 A 가 호스트 B 와 연결을 맺고 패킷을 보내는 중에 가운데 라우터 하나가 꺼지는 장면을 봅니다.
flowchart TD
A["호스트 A"] --> R1["라우터 1"]
R1 -->|"꺼지기 전"| R2["라우터 2 (나중에 꺼짐)"]
R2 --> B["호스트 B"]
R1 -.->|"꺼진 뒤"| R3["라우터 3"]
R3 -.-> B
실선은 라우터 2 가 꺼지기 전의 길입니다. 라우터 2 가 꺼지면 라우터들이 라우팅 테이블을 고쳐 라우터 3 을 지나는 점선 길로 돌립니다. 라우터 2 는 연결에 대해 적어 둔 것이 없었으므로 잃은 것도 없습니다. 라우터 3 은 처음 보는 패킷이라도 주소만 보고 넘깁니다.
길이 바뀌는 동안 몇몇 패킷은 사라집니다. 사라진 패킷은 양 끝 호스트의 TCP(Transmission Control Protocol, 전송 제어 프로토콜)가 알아채고 다시 보냅니다. TCP 는 연결을 맺고 데이터를 빠짐없이 순서대로 건네는 규칙입니다. 연결이 어디까지 왔는지는 양 끝 호스트만 알고 있으므로 연결은 끊기지 않습니다.
연결의 상태를 그 연결을 쓰는 양 끝에만 두는 원칙을 운명 공유(fate-sharing)라고 부릅니다. 연결은 양 끝 호스트와 운명을 같이합니다. 가운데 장비가 죽는 일로는 끊기지 않습니다. 다른 길이 하나라도 남아 있는 동안 그렇습니다.
종단 간 원칙은 데이터가 온전한지 확인하는 일을 가운데가 아니라 양 끝에 맡기라는 원칙입니다. 운명 공유와 같은 점은 둘 다 일을 양 끝에 두고 가운데 장비를 단순하게 남긴다는 것입니다.
이 방식이 치르는 대가
기억을 버린 대신 잃는 것이 셋 있습니다. 셋 다 패킷을 하나씩 따로 다룬다는 데서 나옵니다.
| 대가 | 무슨 일이 일어나나 | 누가 메우나 |
|---|---|---|
| 패킷마다 주소를 싣는다 | 헤더가 길어진다. 라우터는 패킷마다 표를 다시 찾는다 | 표 찾기를 빠르게 하는 라우터 하드웨어 |
| 순서가 뒤바뀐다 | 같은 연결의 패킷이 다른 길로 가서 늦게 보낸 것이 먼저 닿는다 | 양 끝의 TCP 가 순서를 다시 맞춘다 |
| 빠르기를 약속 못 한다 | 라우터는 어느 연결이 급한지 모른다. 몰리면 들어오는 패킷을 버린다 | 망이 붐비면 보내는 쪽이 속도를 줄이는 혼잡 제어 · 우선순위를 다는 QoS(Quality of Service, 서비스 품질) |
라우터는 몰리면 패킷을 버립니다. 라우터가 이렇게 도착을 약속하지 않고 힘닿는 데까지만 나르는 전달을 최선형 전달이라고 부릅니다. 표의 둘째와 셋째 줄은 가운데가 못 하는 일을 양 끝이 떠맡는 모습입니다.
얼마나 빨리 닿을지 꼭 약속해야 하는 망은 연결을 기억하는 쪽을 고릅니다. 전화망은 통화마다 선을 하나 잡아 두는 회선 교환을 씁니다.
연결을 기억하는 가운데 장비
인터넷 안의 장비가 모두 이 방식을 지키지는 않습니다. 이 소절은 연결을 기억하는 가운데 장비와 그 때문에 백엔드에서 보게 되는 일을 봅니다.
NAT(Network Address Translation, 네트워크 주소 변환)는 사설 주소를 공인 주소로 바꿔 내보내는 장비입니다. 돌아오는 패킷을 누구에게 줄지 알려면 어느 연결이 어느 사설 주소의 것인지 들고 있어야 합니다.
NAT 는 이것을 연결마다 한 줄씩 표에 적습니다. 이 표를 연결 추적 표라고 부릅니다. 목적지마다 한 줄인 라우팅 테이블과 달리 연결이 늘면 줄도 늘어납니다.
연결 단위로 막고 여는 방화벽과 연결을 서버 여러 대에 나눠 주는 로드 밸런서도 같은 표를 둡니다. 이런 장비가 다시 켜지면 표가 비면서 지나던 연결이 끊깁니다. 오래 말이 없던 연결이 표에서 지워져 끊기기도 합니다.
그래서 오래 쉬는 연결은 가끔 빈 패킷을 보내 표에서 지워지지 않게 합니다. 이 빈 패킷을 킵얼라이브라고 부릅니다. 상태 없는 라우터만 지나는 길이라면 필요 없었을 장치입니다.
서버로 옮긴 같은 원칙
무상태 서버는 같은 원칙을 애플리케이션에 옮긴 것입니다. 클라이언트는 요청마다 처리에 필요한 것을 담아 보냅니다. 서버는 앞 요청을 기억하지 않습니다.
라우터 2 대신 라우터 3 이 패킷을 받아도 되었듯이, 아무 서버가 다음 요청을 받아도 됩니다. 서버 한 대가 죽어도 그 서버가 들고 있던 대화가 없으니 다른 서버가 이어받습니다.
관련 항목
이 방식으로 넘겨지는 단위와 넘기는 장비
라우터 · 패킷 · 데이터그램 · 헤더 · IP · 홉 · 비연결형 · 패킷 교환
라우터가 길을 고를 때 쓰는 정보
라우팅 테이블 · 포워딩 테이블 · 라우팅 프로토콜 · 최장 접두사 일치 · 라우팅 · BGP
이것과 맞세워지는 연결 기억 방식
가상 회선 · 회선 교환 · 연결 지향 · MPLS
이 방식과 짝을 이루는 설계 원칙
종단 간 원칙 · 운명 공유 · 최선형 전달 · 견고성 원칙 · 무상태
이 방식이 낳는 문제와 그것을 메우는 장치
패킷 재정렬 · 패킷 손실 · 재전송 · 혼잡 제어 · QoS · TCP
연결을 기억하는 가운데 장비와 그 표를 지키는 장치
다른 이름: stateless forwarding · 무상태 전달 · 스테이트리스 포워딩 · 상태 없는 포워딩