경로 MTU 탐색
고친 사람 github-actions[bot]
경로 MTU 탐색은 데이터를 보내기 전에 그 길이 한 번에 받아 주는 최대 크기를 알아냅니다. 알아내는 방법은 큰 덩어리를 일부러 보내 보고 「너무 크다」는 답을 받아 내는 것입니다. 보내는 쪽은 그 답에 맞춰 크기를 줄이고 다시 보냅니다.
쉽고 빠른 이해
경로 MTU 탐색은 보내는 쪽이 「이만큼 큰 덩어리를 보내도 되나」를 길에 직접 물어보는 절차입니다. 가는 길 가운데 가장 좁은 구간이 받아 주는 크기가 그 답입니다.
물어봐야 하는 까닭은 그 값을 미리 알려주는 데가 없기 때문입니다. 구간마다 받아 주는 크기가 다르고, 각 구간 사정은 그 구간을 쥔 장비만 압니다.
어떻게 도는가:
- 보내는 쪽이 「쪼개지 말고 보내라」는 표시를 붙여 큰 덩어리를 내보냅니다
- 못 지나가는 구간의 장비가 그 덩어리를 버리고 「너무 크다」는 알림을 돌려줍니다
- 보내는 쪽은 알림에 실린 크기까지 추정값을 낮추고 다시 보냅니다
대가는 알림이 돌아온다는 전제에 통째로 기대는 것입니다. 중간 장비가 그 알림을 막아 버리면 큰 덩어리만 조용히 사라지는 장애가 납니다.
상세
이 절은 먼저 보내는 쪽이 무엇을 모르는지 못 박고, 그 모르는 값을 어떻게 알아내는지를 봅니다. 이어서 알림이 오갈 때 무엇이 실려 오는지, 그리고 IP(Internet Protocol, 인터넷 프로토콜) 판본에 따라 무엇이 갈리는지를 봅니다. 마지막으로 알림이 막혔을 때 나는 증상과, 알림에 안 기대는 다른 방식을 봅니다.
이삿짐 트럭을 몰고 좁은 골목에 들어가는 상황과 닮았습니다. 골목 폭을 미리 알려주는 표지가 없으면 일단 들어가 보고, 못 지나가는 곳에서 돌아 나와 더 작은 차로 바꿔 타게 됩니다.
한 구간이 한 번에 실어 나를 수 있는 데이터의 최대 크기를 MTU(Maximum Transmission Unit, 최대 전송 단위)라고 합니다. 구간마다 이 값이 다르기 때문에, 가는 길 전체에 실제로 걸리는 상한은 그중 가장 작은 값입니다. 이 가장 작은 값이 경로 MTU 이고, 그 값을 보내는 쪽이 알아내는 절차가 경로 MTU 탐색입니다.
보내는 쪽이 모르는 값
보내는 쪽이 직접 아는 값은 자기가 붙어 있는 첫 구간의 크기뿐입니다. 그다음 구간부터는 자기 것이 아니라서 사정을 볼 방법이 없습니다.
모르는 채로 크게 보내면 두 가지 중 하나가 일어납니다. 하나는 중간 라우터가 패킷을 작은 조각으로 나눠 보내는 것이고, 이 나누는 일을 단편화라고 합니다. 다른 하나는 나누지 않고 버리는 것입니다.
나누는 쪽에도 값이 붙습니다. 조각 가운데 하나만 잃어도 목적지는 원래 덩어리를 되살리지 못해서, 열 조각 중 하나를 잃으면 열 조각을 다시 받아야 합니다. 그래서 중간에서 나뉘기를 기다리기보다 처음부터 맞는 크기로 보내는 편이 낫습니다.
맞는 크기로 보내려면 그 크기를 알아야 하는데, 알려주는 데가 없습니다. 경로 MTU 탐색은 이 빈칸을 물어봐서 채웁니다.
알림을 받아 내는 왕복
먼저 보내는 쪽이 「이 덩어리는 쪼개지 말라」는 표시를 붙입니다. IP 헤더에 있는 DF(Don't Fragment, 쪼개지 마라) 비트가 그 표시입니다. 이 표시가 붙으면 중간 라우터는 나눠 보내는 길을 못 고르고 버리는 길만 남습니다.
버리기만 하면 보내는 쪽은 아무것도 못 배웁니다. 그래서 버린 라우터는 「너무 커서 못 보냈다」는 알림을 되돌려 줍니다. 이 알림을 나르는 것이 ICMP(Internet Control Message Protocol, 인터넷 제어 메시지 프로토콜)입니다.
이 알림에는 값이 하나 더 실립니다. 자기가 내보내려던 다음 구간의 크기입니다. 이 값이 있어서 보내는 쪽은 얼마로 줄여야 하는지를 한 번에 알 수 있습니다.
sequenceDiagram
participant 송신
participant 라우터
participant 목적지
송신->>라우터: 큰 덩어리 · 쪼개지 마라 표시
라우터-->>송신: 너무 크다 · 다음 구간은 1400바이트
Note over 송신: 추정값을 1400바이트로 낮춘다
송신->>라우터: 1400바이트 덩어리
라우터->>목적지: 그대로 전달
한 왕복이 끝나면 보내는 쪽은 그 목적지로 가는 길의 크기를 하나 배운 셈입니다.
추정값이 줄어드는 되풀이
한 번의 왕복으로 끝나지 않을 수 있습니다. 줄인 크기로 다시 보냈는데 더 좁은 구간이 뒤에 또 있으면, 거기서 같은 알림이 한 번 더 옵니다.
그래서 이 절차는 되풀이됩니다. 첫 추정값은 자기가 아는 유일한 값인 첫 구간의 크기이고, 알림이 올 때마다 그만큼 내려갑니다. 더 이상 알림이 안 오면 그 값이 경로 MTU 입니다.
flowchart TD
A["추정값 = 첫 구간의 크기"] --> B["그 크기로 보낸다"]
B --> C{"너무 크다는 알림이 왔나"}
C -->|왔다| D["알림에 실린 크기로 추정값을 낮춘다"]
D --> B
C -->|안 왔다| E["이 크기를 계속 쓴다"]
알아낸 값은 목적지별로 기억해 둡니다. 다음에 같은 곳으로 보낼 때 처음부터 다시 물어보지 않기 위해서입니다.
기억한 값은 영원히 맞지 않습니다. 길은 바뀌고, 좁던 구간을 안 지나게 될 수도 있습니다. 그래서 보내는 쪽은 이따금 추정값을 도로 올려 더 큰 덩어리를 보내 봅니다.
옛 라우터 중에는 알림에 다음 구간의 크기를 안 실어 보내는 것도 있습니다. 그때는 한 번에 못 알아내고, 흔히 쓰이는 크기 값을 위에서부터 차례로 내려가며 될 때까지 시도합니다.
IPv4 와 IPv6 에서 갈리는 대목
IPv4에서는 중간 라우터가 큰 덩어리를 나눠 보낼 수 있습니다. 그래서 쪼개지 말라는 표시를 안 붙이면 알림이 아예 안 오고, 탐색도 시작되지 않습니다. 이 표시를 붙이는 것이 IPv4 탐색의 출발점입니다.
IPv6에서는 중간 라우터가 나누는 길 자체가 없습니다. 나누는 일은 보내는 쪽만 하고, 중간 라우터는 못 보내면 버리고 알림만 돌려줍니다. 그래서 표시를 따로 안 붙여도 알림이 옵니다. 이 알림의 이름이 Packet Too Big입니다.
IPv6 에는 바닥도 있습니다. 모든 구간이 1280바이트 이상을 받아 주기를 요구하므로, 추정값을 그 아래로 내리지 않습니다. 이 바닥값을 최소 링크 MTU라고 부릅니다.
알림이 막히면 나는 증상
이 절차 전체가 알림이 돌아온다는 전제 위에 섭니다. 그 전제는 생각보다 자주 깨집니다. 방화벽이 보안 설정으로 ICMP 를 통째로 막아 두는 경우가 흔하기 때문입니다.
알림이 막히면 보내는 쪽은 덩어리가 버려진 줄도, 줄여야 하는 줄도 모릅니다. 같은 크기로 계속 다시 보내고, 그 덩어리는 계속 같은 곳에서 사라집니다.
증상은 알아보기 어렵게 나옵니다. 연결은 맺어지고 작은 요청은 오가는데 큰 응답만 멈춥니다. 이것을 경로 MTU 블랙홀이라고 부릅니다. 터널을 지나는 구간에서 자주 만납니다.
우회하는 손도 있습니다. 중간 장비가 TCP(Transmission Control Protocol, 전송 제어 프로토콜) 연결이 맺어질 때 서로 알리는 크기 값을 가로채 미리 낮춰 두는 방법입니다. 그 값을 MSS(Maximum Segment Size, 최대 세그먼트 크기)라 하고, 낮춰 두는 일을 MSS 클램핑이라고 합니다.
알림에 기대지 않는 탐침 방식
알림이 막히는 것이 흔하다 보니, 알림 없이 같은 값을 알아내는 방식도 나왔습니다. 크기를 조금씩 키운 덩어리를 보내 보고 목적지까지 닿았는지만 보는 것입니다.
닿았으면 그 크기는 지나갈 수 있는 크기이고, 안 닿았으면 너무 큰 것입니다. 중간 장비가 뭐라고 알려주든 상관이 없어서, ICMP 가 막힌 길에서도 답이 나옵니다. 이 방식을 PLPMTUD(Packetization Layer Path MTU Discovery, 패킷화 계층 경로 MTU 탐색)라고 부릅니다.
관련 항목
경로 MTU 탐색이 재는 크기 단위
MTU · 패킷 · 데이터그램 · 페이로드 · 옥텟 · MSS
경로 MTU 탐색이 주고받는 메시지
ICMP · ICMPv6 · Packet Too Big · Destination Unreachable · DF 비트
경로 MTU 탐색이 피하려는 처리 단계
경로 MTU 탐색이 올라타는 프로토콜
IP · IPv4 · IPv6 · TCP · UDP · QUIC
경로 MTU 탐색이 깨질 때 나는 장애
PMTU 블랙홀 · 블랙홀 라우터 · 방화벽 · 터널링 · 라우터
경로 MTU 탐색을 대신하거나 보완하는 수단
PLPMTUD · MSS 클램핑 · 최소 링크 MTU · 점보 프레임
경로 MTU 탐색을 정의하는 표준 문서
RFC 1191 · RFC 8201 · RFC 8899
다른 이름: Path MTU Discovery · PMTUD