ICMP는 간단하게 패킷에 문제가 생겼을 때 이를 보고하는 프로토콜이다.
ICMP는 좀 더 상위에 존재하는 프로토콜이다.
만약 경로에 놓인 라우터의 링크가 하드웨어적으로 고장났을 때, 이를 감지한 라우터는 source에게 패킷을 보낼 수 없다고 알리고 패킷을 버려야한다.
IP header는 source에게 패킷을 보내기 위함이다. 그리고 IP data 영역에 ICMP message가 포함되어 source에게 패킷을 송신한다.
ICMP message는 두 가지로 구분된다. 에러 메세지와 쿼리 메세지이다.
에러 메세지부터 알아보자.
Type은 위에서 본 message의 종류이다. 이 종류를 고르고 더 세분화한 정보를 Code에 저장한다.
ICMP는 에러가 발생하면 항상 source에게 에러 메세지를 전달한다.
에러는 다음과 같이 세분화된다.
라우터가 error를 감지했을 때, 이에 대한 packet의 일부분을 추출한다. IP 헤더 다음엔 바로 TCP 헤더가 있을 것이다. 이의 8 bytes는 source, destination의 포트번호와sequency 번호이다.
이 8 bytes 까지의 부분과 ICMP 헤더를 생성한다. 이 헤더엔 에러에 대한 정보, 위에서 본 타입, 종류, 체크섬이 포함될 것이다.
그리고 라우터는 source를 자신, destination을 이 패킷을 송신한 source로 설정하여 IP 헤더를 생성한다.
그럼 최초의 datagram을 송신한 source는 어디로 보내는 중에 어디에서 어떤 에러가 발새했는지 알 수 있을 것이다.
목적지로 갈 수 없는 에러이다. 이는 16가지 이유가 존재한다.
- 네트워크 도달불가(Network Unreachable) : code 0 - 목적지 네트워크로 가는 경로 없음
목적지 주소가 라우팅 테이블에 없을 경우 및 디폴트 라우트가 없을 경우- 호스트 도달불가(Host Unreachable) : code 1 - 최종 목적지 호스트에 도달할 수 없을 때,
- 호스트 또는 라우터에서 생성됨- 프로토콜 도달불가(Protocol Unreachable) : code 2 - 목적지 시스템에서
특정 프로토콜을 사용할 수 없다는 사실을 통보- 포트 도달불가(Port Ureachable) : code 3 - 목적지 호스트에서 특정 포트번호가
사용될 수 없음을 알림- 단편화 필요하지만 DF 설정됨(Fragmentation Required but DF bit is set) : code 4 –
IP 데이터그램이 MTU가 작은 네트워크를 통과하려면 단편화되야 하는데,
라우터는 DF 비트가 셋팅된 것을 확인하고 그냥 폐기하고 송신측에 이를 통보- 목적지와의 통신이 관리적으로 금지됨 : code 13 - 어떤 이유든지 목적지가 통신을
원하지 않을 경우 - 예를들면, 방화벽은 운용 정책에 위배되는 데이터그램을
의도적으로 폐기함 . 이때, 이 오류메세지를 원천지에 보낼수도 아닐수도 있음
라우터 또는 목적지 호스트가 ICMP 메세지를 송신한다.
그런데 라우터가 모든 에러를 감지할 수는 없다.
ICMP 메세지가 무조건 전달되지 않는다. ICMP 패킷이 소멸될 수도 있고. 다양한 이유가 있을 수 있다.
ICMP는 TCP처럼 신뢰성 보장이 존재하지 않는다. network layer에서 처리하기 때문이다.
네트워크 혼잡으로 인해 라우터의 버퍼가 꽉 찼을 때, 이를 버리고 ICMP 메세지를 전송한다.
network layer에서 이를 처리하나? 하지 않는다. TCP가 알아서(혼잡제어) 패킷 사이즈를 줄여 다시 송신한다.
라우터가 Time-to-live bit을 하나씩 줄여 0이 되거나, destination이 분할된 fragment를 모두 받지 못했을 때, Time-exceeded ICMP 패킷을 전송한다. Code로 구별한다. 전자는 0, 후자는 1이다.
라우터, destination 모두 보낼 수 있는 메세지이다. 송신되는 패킷의 IP 헤더 부분이 이상할 경우 패킷을 삭제하고 이 메세지를 송신한다.
예를들어 version이 0111이면 버린다.(IPv7) 그리고 이전에 사용되지 않았던 Pointer를 사용한다. 수신한 패킷의 IP 헤더의 이상한 부분을 저장한다.
host A가 host B에게 패킷을 보내기 위해 R1으로 패킷을 보냈을 때, R1은 R2로 보낸다.
비효율적이다. 그냥 직접 R2로 보내면 된다. R1은 이에 대한 Redirection 메세지를 보낸다.
그럼 host A는 routing table의 default router를 변경하면 된다.
보통 host A는 작은 크기의 라우팅 테이블을 가진다. 여기에 default router 하나만 존재할 수 있다.
Redirection message로 이 table을 점진적으로 수정한다.
IP 부분에 R2 IP 주소가 저장될 것이다. 호스트는 이 주소로 default router를 변경하면 된다.
이를 알리는 라우터, 호스트, 수정할 라우터 모두 같은 네트워크에 존재할 경우에 Redirection message를 사용할 수 있다.
echo-request와 echo-reply message는 host또는 router가 보낼 수 있다.
이는 ping program을 구현할 때 사용된다.
이는 대개 두 가지 목적을 가지고 사용된다. 내 device가 네트워크에서 잘 동작하는지 또는 host가 잘 동작는지를 체크하기 위해 사용된다.
또는 IP protocol이 잘 동작하는지 체크할 수 있다.
Timestam request message와 Time reply message가 존재한다.
이 둘은 대개 RTT를 구하기 위해 사용된다. 또한 동기화가 되지 않은 source와 destination의 시계를 맞춰주기 위해 사용된다.
동기화를 하기 위해 one-way time를 알아야 한다. one-way time이란 편도 시간을 말한다.
RTT를 구하기 위해 A가 B에게 패킷을 보냈을 때 B가 패킷을 받고 응답 패킷을 만들어 보내는데 까지 시간을 총 RTT에서 빼주고, 이 값을 2로 나누어주면 one-way time 값이 나온다.
그러나 네트워크 상황에 따라서 RTT가 계속 달라진다
그러므로 혼잡이 없다고 가정하고 one-way time을 알고 있다면 두 device의 시간을 대충 맞출 수 있다.
그래서 위의 format을 보면 source가 보낸시간, destination이 받은시간, 보낸시간이 기록되어 있다.
위의 사진을 보면 다음과 같이 사용한다. 이제 tll을 1으로 설정해두고 하나의 router에 대해 세번 패킷을 보내면 한 번가고 라우터가 버린다. 그리고 time exceeded ICMP 패킷을 보낸다.
이렇게 모든 ttl을 조절해서 계속 보낸다.(라우터 마다 세 번씩)
그런데 사설 IP를 사용하는 곳은 외부 ICMP를 막는 경우가 있다.
해커들이 악용할 수 있기 때문이다.
5초 기다려도 응답이 오지 않으면 ***로 표시된다.