인터넷 제어 메시지 프로토콜(ICMP)

인터넷 제어 메시지 프로토콜(Internet Control Message Protocol, ICMP)은 호스트와 라우터가 서로 간에 네트워크 계층 정보를 주고받기 위해 사용된다.


ICMP는 종종 IP의 한 부분으로 간주되지만, ICMP 메시지가 IP 데이터그램에 담겨 전송되므로 구조적으로는 IP 바로 위에 있다.

즉, ICMP 메시지도 IP 페이로드로 전송되며,
호스트가 상위 계층 프로토콜이 ICMP라고 표시된(상위 계층 프로토콜 번호가 1번인) IP 데이터그램을 받으면 ICMP로 내용을 역다중화한다.


ICMP 메시지는 타입(type)과 코드(code) 필드가 있고,
ICMP 메시지의 발생 원인이 된 IP 데이터그램의 헤더와 첫 8바이트를 갖는다.

이는 송신자가 오류를 발생시킨 패킷을 알 수 있도록 하기 위해서이다.



중요한 ICMP 메시지 타입들은 다음과 같다

💡 ICMP 메시지는 오류 상태를 알리기 위해서만 사용되는 것이 아니다.


a1.png



ping 프로그램

  1. 타입 8, 코드 0인 ICMP 메시지를 특정 호스트에 보낸다.
  2. 목적지 호스트는 에코 요청을 보고 나서 타입 0, 코드 0인 ICMP 에코 응답을 보낸다.

대부분의 TCP/IP 구현은 ping 서버를 운영체제에서 직접 지원한다.
(즉, ping 서버는 별도의 프로세스가 아님)


출발지 억제 메시지

이 메시지의 원래 목적은 혼잡 제어를 수행하기 위한 것이다.

즉, 혼잡이 발생한 라우터가 호스트의 전송 속도를 늦추도록 ICMP 출발지 억제 메시지를 해당 호스트에 보낸다.


하지만 우리는 앞서 TCP가 ICMP 출발지 억제 메시지와 같은 네트워크 계층의 피드백 없이도
전달 계층에서 동작하는 자신만의 혼잡 제어 메커니즘을 갖고 있음을 보았고, 이에 이 메시지는 실제로는 잘 사용되지 않는다.


Traceroute 프로그램

아래의 방식으로 출발지 호스트는 자신과 목적지 호스트 사이에 있는 라우터들의 수와 정체, 그리고 두 호스트 간의 왕복 시간을 알게 된다.


  1. 출발지와 목적지 사이의 라우터 이름과 주소를 알아내기 위해
    출발지의 Traceroute는 일련의 IP 데이터그램을 목적지에 보낸다.

    • 각각의 데이터그램은 UDP 포트 번호를 가진 UDP 세그먼트를 운반한다.
    • TTL 값은 첫 번째 데이터그램이 1, 두 번째는 2, 세 번째는 3, 이런 식이다.
  2. 출발지는 각 데이터그램에 대해 타이머를 작동시킨다.

    • n번째 데이터그램이 n번째 라우터에 도착하면 해당 라우터는 데이터그램의 TTL이 방금 만료되었음을 알게 된다.
  3. IP 프로토콜 규칙에 따라 라우터는 데이터그램을 폐기하고 ICMP 경고 메시지(타입 11, 코드 0)를 출발지에 보낸다.

    • 이 경고 메시지는 라우터의 이름과 IP 주소를 포함한다.
  4. 이 ICMP 메시지가 출발지에 도착하면, 출발지는
    (1) 타이머로부터 왕복 시간(round-trip time, RTT),
    (2) ICMP 메시지로부터 n번째 라우터의 주소와 이름을 획득한다.



Traceroute 출발지는 UDP 세그먼트 전송을 언제 멈춰야 하는지 어떻게 알까?

  1. 출발지가 자신이 보내는 각 데이터그램마다 차례로 TTL을 1씩 증가시키기 때문에
    이들 데이터그램 중 하나는 결국 목적지 호스트에 도착하게 될 것이다.