ICMP
contents
IP(Internet Protocol)가 편지를 배달하는 "우체부" 라면, ICMP는 배달 사고나 오류를 처리하고 알려주는 "고객센터" 라고 보시면 됩니다.
1. 핵심 개념: ICMP란 무엇인가?
ICMP는 인터넷 제어 메시지 프로토콜(Internet Control Message Protocol) 의 약자입니다.
IP와 마찬가지로 네트워크 계층(Layer 3) 프로토콜입니다. 하지만 HTML, JSON, 이미지 같은 '데이터'를 실어 나르는 것이 아니라, 네트워크 자체에 대한 상태 메시지를 실어 나릅니다.
- 주목적: 오류 보고 및 네트워크 진단.
- 불변의 법칙: ICMP는 오류를 수정(Correct) 하지 않습니다. 오직 보고(Report) 할 뿐입니다.
비유: 트럭(IP 패킷)이 다리를 건너다 강으로 추락했습니다. 트럭은 스스로 날아오르지 못합니다. 대신 이를 목격한 경찰관(ICMP)이 트럭 회사(출발지 IP)에 "당신의 트럭이 이 위치에서 파괴되었습니다"라는 사고 경위서를 써서 보냅니다. 이것이 ICMP입니다.
2. 구조: 어디에 위치하는가?
개발자들이 자주 헷갈리는 부분입니다. ICMP는 TCP나 UDP처럼 IP 패킷 안(Inside) 에 들어 있습니다. 하지만 계층상으로는 IP의 하위가 아니라 IP의 형제(Sibling)로 취급됩니다.
패킷 계층 구조:
[ 이더넷 헤더 | IP 헤더 | ICMP 헤더 | ICMP 데이터 ]
이것이 왜 중요한가요?
- 포트(Port)가 없습니다: TCP나 UDP는 80, 443, 8080 같은 포트 번호를 쓰지만, ICMP에는 포트 번호라는 개념이 없습니다.
- 그래서 ICMP는 "포트 포워딩"을 할 수 없습니다. 오직 "프로토콜 포워딩(Protocol 1번)"만 가능합니다.
- 핑(Ping)을 보낼 때
IP주소:포트가 아니라 그냥IP주소로만 보내는 이유가 이것입니다.
3. 주요 메시지 타입 (Type과 Code)
ICMP 헤더는 매우 단순합니다. 주로 Type(대분류) 과 Code(상세 이유) 두 가지 필드에 의존합니다.
가장 자주 마주칠 타입들은 다음과 같습니다.
A. Type 0 & 8: Echo Request / Reply ("핑")
가장 유명한 ICMP의 용도입니다.
- Type 8 (Echo Request): "여보세요? 거기 있나요?" (
ping명령어가 보내는 것). - Type 0 (Echo Reply): "네, 여기 있습니다." (응답).
- 작동 원리: 컴퓨터가 Type 8을 보내면, 받는 쪽은 Type을 0으로만 바꾸고 받은 데이터 그대로 반송합니다.
B. Type 3: Destination Unreachable ("반송됨")
연결에 실패했을 때 돌아오는 메시지입니다. Code를 보면 왜 실패했는지 알 수 있습니다.
- Code 0 (Net Unreachable): "그 도시로 가는 길을 못 찾겠어요." (라우터 경로 문제).
- Code 1 (Host Unreachable): "동네는 찾았는데, 그 집이 없어요." (ARP 실패 - 기기가 꺼져 있음).
- Code 3 (Port Unreachable): "집은 찾았는데, 8080호 방문을 아무도 안 열어줘요."
- 참고: 닫힌 포트에 UDP 패킷을 보내면 서버는 이 ICMP 에러를 보냅니다. (TCP는
RST플래그를 보냅니다).
- 참고: 닫힌 포트에 UDP 패킷을 보내면 서버는 이 ICMP 에러를 보냅니다. (TCP는
- Code 4 (Fragmentation Needed): "짐이 너무 커서 터널(MTU)을 통과 못 하는데, 쪼개지 말라고 하셨잖아요." (PMTU 발견에 사용).
C. Type 11: Time Exceeded ("TTL 만료")
이것이 바로 Traceroute(경로 추적) 가 작동하는 비밀입니다.
- 모든 IP 패킷에는 TTL (Time To Live, 수명) 카운터가 있습니다 (예: 64).
- 라우터를 하나 지날 때마다 이 숫자가 1씩 줄어듭니다.
- TTL이 0이 되면 라우터는 패킷을 죽이고, 보낸 사람에게 ICMP Type 11을 보냅니다. "당신의 패킷이 여기서 수명을 다해 사망했습니다."
4. Traceroute의 작동 원리 (개발자의 마법)
"도대체 traceroute는 거쳐 가는 모든 라우터의 IP를 어떻게 알아내는 걸까?" 궁금하셨죠? 바로 ICMP Type 11을 악용(?)하는 것입니다.
- 1단계: 내 컴퓨터가 TTL = 1인 패킷을 보냅니다.
- 첫 번째 라우터가 받자마자 TTL을 0으로 만들고 패킷을 죽인 뒤, ICMP Type 11을 나에게 보냅니다.
- 내 컴퓨터는 그 에러를 보고 기록합니다: "1번 경유지는 라우터 A구나."
- 2단계: 내 컴퓨터가 TTL = 2인 패킷을 보냅니다.
- 라우터 A는 통과시킵니다(TTL=1).
- 두 번째 라우터가 받아서 TTL을 0으로 만들고 죽인 뒤, 에러를 보냅니다.
- 내 컴퓨터 기록: "2번 경유지는 라우터 B구나."
- 반복: 목적지에 도착할 때까지 숫자를 늘려가며 반복합니다.
자바 개발자를 위한 요약
- ICMP는 디버깅 계층입니다. 전송 계층(TCP/UDP)과는 별개입니다.
- 예외 처리: 자바 앱에서
java.net.NoRouteToHostException이 발생했다면, OS가 ICMP Type 3 메시지를 수신했다는 뜻입니다. - 보안: AWS Security Group이나 클라우드 방화벽은 기본적으로 ICMP를 차단합니다. 앱은 잘 도는데 핑만 안 된다면 당황하지 마세요. TCP 포트는 열려있지만, ICMP 프로토콜만 막혀있는 흔한 상황입니다.
references