ICMP
Internet Control Message Protocol
ICMP는 IP 네트워크에서 오류 보고와 진단을 담당하는 프로토콜이다. TCP/UDP가 데이터 전달용이라면, ICMP는 통신이 잘 되고 있는지, 어디서 문제가 생겼는지를 알리는 메시지를 주고받는 용도다.
ping과 traceroute가 대표적인 ICMP 활용 사례이며, 네트워크 운영, 트러블슈팅의 가장 기본적인 도구이다.
위치와 역할
ICMP는 OSI 모델의 3계층(네트워크 계층)에 속하며, IP 패킷의 페이로드로 캡슐화되어 전달된다.
[Ethernet Header] [IP Header] [ICMP Header + Data]
IP 자체는 비신뢰성(best-effort) 프로토콜이라 패킷이 손실되어도 송신자에게 알리지 않는다. ICMP가 이를 보완해 다음과 같은 정보를 전달한다.
- 목적지에 도달할 수 없음
- TTL이 0이 되어 패킷 폐기됨
- 단편화가 필요한데 DF 비트가 막혀 있음
- 더 좋은 라우팅 경로가 있음 (Redirect)
메시지 포맷
ICMP 메시지 헤더는 매우 단순하다.
0 8 16 31
+-------+-------+----------------+
| Type | Code | Checksum |
+-------+-------+----------------+
| Rest of Header | (Type/Code별로 의미 다름)
+--------------------------------+
| Data |
+--------------------------------+
- Type (8bit): 메시지의 종류 (예: 8 = Echo Request, 0 = Echo Reply)
- Code (8bit): Type 안에서의 세부 분류
- Checksum (16bit): 헤더 + 데이터 무결성 검사
- Rest of Header: Type별로 의미가 다름 (Echo는 Identifier + Sequence Number)
주요 ICMP 메시지
| Type | Code | 이름 | 용도 |
|---|---|---|---|
| 0 | 0 | Echo Reply | ping 응답 |
| 3 | 0~15 | Destination Unreachable | 목적지 도달 불가 |
| 5 | 0~3 | Redirect | 더 좋은 경로 안내 |
| 8 | 0 | Echo Request | ping 요청 |
| 11 | 0 | Time Exceeded (TTL) | TTL 0이 되어 폐기 (traceroute에서 사용) |
| 11 | 1 | Time Exceeded (재조립) | 단편 재조립 시간 초과 |
| 12 | 0 | Parameter Problem | IP 헤더 오류 |
Echo Request / Reply (Type 8 / 0)
가장 유명한 ICMP 메시지로, ping 명령이 사용한다.
- 송신자가 Echo Request를 보내면 목적지가 데이터를 그대로 복사해 Echo Reply로 응답
- 응답 시간(Round Trip Time, RTT)을 측정해 네트워크 지연과 도달성을 확인
Destination Unreachable (Type 3)
목적지에 패킷이 도달할 수 없을 때 라우터/호스트가 송신자에게 알린다. Code로 세부 이유를 구분한다.
| Code | 의미 |
|---|---|
| 0 | 네트워크 도달 불가 |
| 1 | 호스트 도달 불가 |
| 2 | 프로토콜 도달 불가 |
| 3 | 포트 도달 불가 (UDP에서 자주 발생) |
| 4 | 단편화 필요한데 DF 비트가 설정됨 (PMTU에서 사용) |
| 7 | Destination host unknown |
Time Exceeded (Type 11)
- Code 0: TTL이 0이 되어 라우터가 패킷을 폐기. traceroute가 이를 활용해 경로상 라우터를 식별
- Code 1: 단편 재조립 시간 초과
활용 사례
ping
가장 기본적인 도달성과 지연 측정 도구이다.
$ ping 8.8.8.8
PING 8.8.8.8: 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=117 time=10.5 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=11.2 ms
Echo Request → Echo Reply의 RTT를 측정한다.
traceroute
목적지까지 경유하는 라우터를 단계별로 보여주는 명령이다.
동작 원리:
- TTL = 1로 패킷 전송 → 첫 라우터에서 TTL 0으로 폐기 → Time Exceeded 응답
- TTL = 2로 전송 → 두 번째 라우터에서 폐기 → 응답
- TTL을 1씩 늘려가며 반복하면 경로상 모든 라우터를 알 수 있다
$ traceroute google.com
1 192.168.0.1 0.5 ms
2 10.0.0.1 2.1 ms (ISP)
3 172.20.0.1 8.4 ms
...
7 google.com 30.5 ms
Path MTU Discovery (PMTU)
송신자가 큰 패킷을 DF(Don't Fragment) 비트와 함께 보낼 때, 중간 라우터의 MTU가 더 작아 단편화가 필요하면 라우터가 Type 3 Code 4 (Fragmentation Needed) 메시지로 알려준다. 송신자는 이를 받아 패킷 크기를 줄인다.
ICMP가 차단된 경로에서는 이 메커니즘이 망가져서 PMTU 블랙홀 문제가 발생한다(큰 패킷이 사라지고 작은 패킷은 통과하는 비대칭 장애).
DHCP IP 중복 검사
DHCP 서버는 IP를 할당하기 전에 후보 IP로 ICMP Echo Request를 보내 응답이 오는지 확인하여 IP 중복을 방지한다 (RFC 2131 §4.4.1).
ICMPv4 vs ICMPv6
IPv6에서는 ICMPv6의 역할이 훨씬 커졌다.
| 기능 | ICMPv4 | ICMPv6 |
|---|---|---|
| 오류 보고 | O | O |
| ping (Echo) | O | O |
| Neighbor Discovery (ARP 대체) | X (ARP가 별도) | O (NDP) |
| Stateless Address Autoconfiguration (SLAAC) | X | O |
| Multicast Listener Discovery (MLD) | X | O |
ICMPv6는 IPv4 시절의 ICMP + ARP + IGMP 기능을 하나로 통합한 모양새다. 그래서 IPv6 환경에서는 ICMPv6를 차단하면 네트워크 자체가 동작하지 않는다.
보안 이슈
ICMP는 단순한 프로토콜이지만 다음과 같은 공격에 악용될 수 있다.
- Ping Flood: 대량의 Echo Request로 대상의 자원 고갈
- Smurf Attack: 출발지를 피해자 IP로 위조한 ICMP를 브로드캐스트로 보내 다수의 호스트가 피해자에게 응답을 폭주시키는 공격 (현재는 대부분 라우터에서 막힘)
- Ping of Death: 비정상적으로 큰 ICMP 패킷으로 시스템을 크래시시키는 공격 (구형 OS의 취약점)
- ICMP Tunneling: ICMP 페이로드에 데이터를 숨겨 방화벽 우회
이런 이유로 일부 환경에서는 외부에서 들어오는 ICMP를 차단하기도 한다. 다만 ICMP를 너무 많이 차단하면 PMTU Discovery 같은 정상 동작이 깨진다. 보통은 Type 3, Type 11 같은 운영상 필수 메시지는 허용하는 것이 권장된다.
정리
- ICMP는 IP의 오류 보고와 진단을 담당하는 프로토콜이다
- ping, traceroute, PMTU Discovery, DHCP 중복 검사 등 운영의 기본 도구가 모두 ICMP 기반
- IP 헤더 안에 캡슐화되어 전달되며 헤더 구조(Type / Code / Checksum)는 매우 단순하다
- IPv6에서는 ICMPv6가 NDP, SLAAC까지 흡수해 역할이 더 커졌다
- 보안상 차단되기도 하지만, 완전히 막으면 정상 통신에도 지장이 생길 수 있다