사전 ICMP
프로토콜

ICMP

gabury1고친 사람 github-actions[bot]

ICMP 는 인터넷에서 패킷을 나르다가 문제가 생기면 그 소식을 보낸 쪽에 알려 주는 프로토콜입니다. 목적지에 닿지 못했다거나 가는 길에 라우터를 너무 많이 거쳤다는 식의 짧은 알림을 돌려보냅니다. 상대가 살아 있는지 물어보고 답을 받는 데도 씁니다.

쉽고 빠른 이해

ICMP 는 패킷 배달이 틀어졌을 때 보낸 쪽에 돌아오는 알림 쪽지입니다. 「그 주소로 가는 길이 없다」·「수명이 다했다」 같은 내용이 담깁니다. 여기서 수명은 라우터를 지날 때마다 하나씩 줄어드는 횟수입니다. 이 횟수가 바닥나면 패킷은 버려집니다.

이게 없으면 패킷이 중간에 버려져도 보낸 쪽은 아무것도 모릅니다. 답이 올 때까지 하염없이 기다리다 시간 초과로 끝날 뿐입니다.

어떻게 도는가:

  1. 패킷을 넘기던 라우터나 받은 컴퓨터가 문제를 발견합니다
  2. 버린 패킷의 앞부분을 붙여 알림을 만들고 출발지로 보냅니다
  3. 출발지는 붙어 온 앞부분을 보고 어느 연결의 패킷이었는지 찾아 그 프로그램에 알립니다

일부러 쓰기도 합니다. ping 은 에코라는 ICMP 메시지로 상대가 살아 있는지 묻습니다. traceroute 는 수명이 다했다는 알림을 받아 가는 길의 라우터를 알아냅니다.

대가도 있습니다. 알림이 반드시 온다는 보장이 없습니다. 보안 장비가 이 알림을 막아 두면 오히려 통신이 원인 모르게 멈추기도 합니다.

상세

ICMP(Internet Control Message Protocol, 인터넷 제어 메시지 프로토콜)는 IP(Internet Protocol, 인터넷 프로토콜)가 패킷을 나르다 겪은 일을 알리는 프로토콜입니다. 이 절은 ICMP 가 어디에 실려 가는지, 어떤 알림을 주고받는지, 그 알림을 도구들이 어떻게 쓰는지를 차례로 봅니다.

택배로 치면 반송 쪽지입니다. 주소지에 그런 건물이 없거나 배송 기한이 지나면 기사가 상자를 두고 쪽지만 보내는 쪽으로 돌려보냅니다. 쪽지에는 어떤 상자였는지 알아볼 수 있게 송장 윗부분이 붙어 있습니다. 다만 쪽지 자체도 잃어버릴 수 있습니다.

IP 위에 실려 가는 알림

IP 는 패킷을 목적지까지 나르는 일만 합니다. 가다가 버려져도 스스로는 누구에게도 알리지 않습니다. 그래서 문제를 알릴 통로가 따로 필요합니다. ICMP 가 그 통로입니다.

ICMP 메시지는 IP 패킷 안에 담겨 갑니다. IP 헤더에는 안에 무엇이 들었는지 적는 프로토콜 번호 칸이 있습니다. ICMP 는 이 칸에 1 을 적습니다. TCP(Transmission Control Protocol, 전송 제어 프로토콜)가 6, UDP(User Datagram Protocol, 사용자 데이터그램 프로토콜)가 17 을 적는 것과 같은 방식입니다.

flowchart TD
    subgraph P["IP 패킷"]
        H["IP 헤더 · 프로토콜 번호 1"]
        subgraph I["ICMP 메시지"]
            T["타입 · 코드"]
            B["알림마다 다른 내용"]
        end
    end

그렇다고 ICMP 가 TCP·UDP 와 같은 층에 서는 것은 아닙니다. ICMP 에는 포트 번호가 없어서 특정 프로그램에 데이터를 건네지 못합니다. 보통은 IP 와 한 몸으로 도는 보조 프로토콜로 봅니다. IP 를 구현하는 컴퓨터와 라우터는 ICMP 도 함께 구현합니다.

타입과 코드

ICMP 메시지 맨 앞에는 두 칸이 있습니다. 타입은 무슨 종류의 알림인지를 가릅니다. 코드는 그 안에서 이유를 한 번 더 가릅니다. 받는 쪽은 이 두 숫자만 보고 알림을 해석합니다. 두 칸 뒤에는 알림마다 다른 내용이 이어집니다.

자주 마주치는 타입은 아래와 같습니다. 크게 보면 문제를 알리는 오류 메시지와 묻고 답하는 조회 메시지로 나뉩니다.

타입 이름 갈래 언제 오나
0 Echo Reply 조회 에코 요청에 대한 답
3 Destination Unreachable 오류 목적지에 전달할 수 없음
5 Redirect 오류 더 알맞은 라우터로 보내라는 안내
8 Echo 조회 살아 있는지 묻는 요청
11 Time Exceeded 오류 거칠 수 있는 라우터 수를 다 씀

타입 3 은 코드로 이유를 나눕니다. 코드 0 은 네트워크에 닿을 수 없음, 1 은 호스트에 닿을 수 없음, 3 은 포트에 닿을 수 없음입니다. 코드 4 는 뒤의 「ICMP 를 막으면 생기는 일」에서 따로 봅니다.

오류 메시지가 싣고 가는 것

오류 메시지는 문제를 일으킨 원래 패킷의 IP 헤더와 그 뒤 데이터 앞 8바이트를 붙여 보냅니다. 왜 이만큼일까요. TCP 와 UDP 헤더는 맨 앞 4바이트가 출발 포트와 도착 포트입니다. 앞 8바이트만 있으면 그 포트를 읽을 수 있습니다.

출발지 컴퓨터는 이 조각에서 주소와 포트를 꺼냅니다. 그리고 어느 연결, 어느 소켓이 보낸 패킷이었는지 찾아 그 프로그램에 오류를 넘깁니다. 예를 들어 UDP 로 닫힌 포트에 보냈다면 포트 도달 불가 알림이 돌아옵니다. 프로그램은 「연결 거부」 같은 오류를 받습니다.

sequenceDiagram
    participant 출발지
    participant 라우터
    participant 목적지
    출발지->>라우터: IP 패킷
    Note over 라우터: 목적지로 가는 경로가 없다
    라우터-->>출발지: ICMP 타입 3 + 원래 헤더와 앞 8바이트
    Note over 출발지: 포트를 보고 해당 소켓에 오류를 넘긴다

오류 메시지가 지키는 절제

오류 메시지는 아무 때나 보내지 않습니다. ICMP 오류 메시지 자체가 버려졌다고 또 ICMP 오류를 보내지는 않습니다. 이걸 허용하면 알림이 알림을 낳아 망이 알림으로 가득 찰 수 있기 때문입니다.

링크가 한 번에 실을 수 있는 크기보다 큰 패킷은 보내는 컴퓨터나 라우터가 여러 조각으로 나눠 보냅니다. 이것을 단편화라고 합니다. 조각 가운데 맨 앞 조각만 TCP·UDP 헤더, 곧 포트가 든 앞부분을 품습니다.

그래서 단편화된 패킷은 첫 조각에 문제가 있을 때만 알립니다. 둘째 조각부터는 포트가 든 앞부분이 없어 받아도 출발지가 어느 연결인지 찾지 못합니다. 조각마다 알림을 보내면 같은 소식이 여러 번 가기도 합니다.

묻고 답하는 에코

조회 메시지 가운데 제일 많이 쓰이는 것이 ICMP 에코입니다. 한쪽이 타입 8 에코 요청을 보내면 받은 쪽은 같은 내용을 담아 타입 0 에코 응답으로 돌려줍니다. 식별자와 순서 번호가 함께 실려 가서 어느 요청의 답인지 짝을 맞출 수 있습니다.

ping 명령이 이 왕복을 씁니다. 요청을 보낸 시각과 답이 온 시각의 차이로 왕복 지연을 재고, 답이 몇 개 안 돌아왔는지로 패킷 손실을 봅니다.

sequenceDiagram
    participant 보내는쪽
    participant 받는쪽
    보내는쪽->>받는쪽: 에코 요청 · 순서 번호 1
    받는쪽-->>보내는쪽: 에코 응답 · 순서 번호 1
    보내는쪽-x받는쪽: 에코 요청 · 순서 번호 2
    Note over 보내는쪽: 2 번 답이 끝내 안 온다 · 손실 하나
    보내는쪽->>받는쪽: 에코 요청 · 순서 번호 3
    받는쪽-->>보내는쪽: 에코 응답 · 순서 번호 3
    Note over 보내는쪽: 세 개 보내 두 개 돌아옴

traceroute 가 수명 초과를 쓰는 방법

IP 헤더에는 TTL(Time To Live, 생존 시간) 칸이 있습니다. 패킷의 수명이 이 칸입니다. 라우터를 하나 지날 때마다 1 씩 줄어듭니다. 0 이 되면 그 라우터가 패킷을 버립니다.

TTL 은 경로가 꼬여 패킷이 영원히 돌지 않게 막는 장치입니다. 패킷을 버린 라우터는 출발지로 수명 초과(Time Exceeded, 타입 11) 알림을 보냅니다.

traceroute 는 이 알림을 일부러 받아 냅니다. TTL 을 1 로 두고 보내면 첫 라우터가 버리고 알림을 보냅니다. 알림의 출발 주소가 곧 첫 라우터의 주소입니다. TTL 을 2, 3 으로 늘려 가며 되풀이하면 목적지까지 거치는 라우터를 하나씩 알아냅니다.

sequenceDiagram
    participant 출발지
    participant 라우터1
    participant 라우터2
    participant 목적지
    출발지->>라우터1: TTL 1
    라우터1-->>출발지: 타입 11 수명 초과
    출발지->>라우터2: TTL 2 · 라우터1 을 거쳐
    라우터2-->>출발지: 타입 11 수명 초과
    출발지->>목적지: TTL 3 · 두 라우터를 거쳐
    목적지-->>출발지: 도착했다는 답

마지막 답은 구현마다 다릅니다. 에코 요청을 보내는 구현은 에코 응답을 받습니다. 쓰지 않는 UDP 포트로 보내는 구현은 포트 도달 불가를 받습니다. 어느 쪽이든 수명 초과가 아닌 답이 오면 목적지에 닿은 것입니다.

리다이렉트

컴퓨터는 다른 네트워크로 갈 패킷을 같은 네트워크 안의 라우터에 먼저 넘깁니다. 이렇게 컴퓨터가 패킷을 처음 넘기는 라우터를 다음 라우터라고 부릅니다. 같은 네트워크에 라우터가 여럿이면 목적지에 따라 알맞은 다음 라우터가 다릅니다.

ICMP 리다이렉트(타입 5)는 라우터가 컴퓨터에 「이 목적지라면 나 말고 저 라우터로 바로 보내라」고 알려 주는 메시지입니다. 컴퓨터가 덜 알맞은 라우터를 골랐을 때 돌아가는 길을 줄여 줍니다.

대신 가짜 리다이렉트를 받으면 트래픽이 엉뚱한 곳으로 샙니다. 그래서 많은 운영체제와 라우터가 이 메시지를 받아도 따르지 않도록 설정해 둡니다.

ICMP 를 막으면 생기는 일

ICMP 는 정찰과 공격에도 쓰일 수 있어서 방화벽에서 통째로 막는 일이 흔합니다. 그러면 에코가 안 돌아와 ping 이 실패합니다. ping 이 안 된다고 그 컴퓨터가 꺼져 있다는 뜻은 아닙니다.

더 조용한 문제는 패킷 크기 쪽에서 납니다. MTU(Maximum Transmission Unit, 최대 전송 단위)는 한 링크가 한 번에 실어 보낼 수 있는 패킷의 최대 크기입니다. 가는 길에 MTU 가 작은 링크가 있으면 큰 패킷은 거기서 쪼개야 합니다.

목적지 도달 불가(타입 3)의 코드 4 가 이때 쓰입니다. 코드 4 는 패킷이 너무 커서 쪼개야 한다는 뜻입니다. 그런데 패킷에 쪼개지 말라는 표시가 붙어 있어 쪼개지 못한 경우입니다. 라우터는 그 패킷을 버리고 이 알림을 보냅니다.

경로 MTU 탐색은 이 알림을 일부러 받아 냅니다. 경로 MTU 탐색은 쪼개지 말라는 표시를 붙여 패킷을 보내 봅니다. 너무 크다는 ICMP 알림이 오면 크기를 줄입니다. 이 알림이 막히면 보낸 쪽은 크기를 줄여야 한다는 것을 끝내 모릅니다.

그러면 작은 패킷은 오가는데 큰 패킷만 사라집니다. 연결은 맺어지고 첫 요청도 갑니다. 그런데 큰 응답이 오는 순간 멈춥니다. 이런 증상을 경로 MTU 블랙홀이라고 부릅니다. 그래서 ICMP 를 막더라도 수명 초과와 목적지 도달 불가만큼은 통과시키도록 설정하는 경우가 많습니다.

IPv6 의 ICMPv6

IPv6 에서는 ICMPv6 가 같은 일을 맡습니다. 타입 번호는 새로 매겼지만 오류와 조회로 나뉘는 뼈대는 같습니다.

달라진 점은 비중입니다. IPv6 라우터는 너무 큰 패킷을 쪼개지 않고 버립니다. 보낸 쪽은 「패킷이 너무 크다(Packet Too Big)」 알림으로만 크기를 줄여야 한다는 것을 압니다. IPv4 의 타입 3 코드 4 에 해당하는 알림입니다. 이 알림이 막히면 큰 패킷은 끝내 닿지 못합니다.

IP 주소로 같은 네트워크 장비의 하드웨어 주소를 찾는 일을 이웃 탐색이라고 합니다. IPv6 에서는 이 일도 ICMPv6 메시지로 합니다. 그래서 IPv6 에서 ICMPv6 를 통째로 막으면 통신 자체가 제대로 안 됩니다.

관련 항목

ICMP 메시지를 이루는 구성 요소

헤더 · 타입 · 코드 · 체크섬 · 페이로드 · 식별자 · 순서 번호

ICMP 를 실어 나르고 함께 도는 계층의 프로토콜

IP · IPv4 · IPv6 · ICMPv6 · 인터넷 계층 · 패킷 · 프로토콜 번호 · IGMP

ICMP 가 알리는 오류 메시지

Destination Unreachable · 포트 도달 불가 · Time Exceeded · ICMP 리다이렉트 · Parameter Problem · Source Quench · Packet Too Big

ICMP 가 주고받는 조회 메시지

ICMP 에코 · Echo Reply · Timestamp · 이웃 요청 · 이웃 광고 · 라우터 광고

ICMP 알림을 쓰는 진단 도구

ping · traceroute · mtr · tracert · tcpdump · Wireshark

ICMP 알림에 기대는 네트워크 장치

TTL · 경로 MTU 탐색 · MTU · 단편화 · 이웃 탐색 · 라우팅 · 라우팅 루프

ICMP 가 막히거나 악용될 때 나는 장애와 공격

PMTU 블랙홀 · ping of death · 스머프 공격 · ICMP 플러드 · 서비스 거부 · ICMP 터널링 · 포트 스캔

ICMP 트래픽을 걸러 내거나 바꾸는 중간 장비

방화벽 · 라우터 · NAT · 보안 그룹 · 패킷 필터

ICMP 로 재는 지표

지연 · 왕복 시간 · 패킷 손실 · 지터 · 홉

ICMP 오류를 넘겨받는 전송 계층의 프로토콜

TCP · UDP · 포트 번호 · 소켓 · 연결 거부

ICMP 가 속하는 상위 분류

네트워크 · 인터넷 프로토콜 스위트 · OSI 모형 · 프로토콜 · RFC 792

다른 이름: Internet Control Message Protocol · 인터넷 제어 메시지 프로토콜