ICMP 에러 메세지
1.
IP Datagram이 죽게 될 경우 Source에게 보내는 메세지.
죽은 IP Datagram 중에 일부를 에러 메세지에 포함시켜서 보낸다. 그 이유는 Source에게 전달 중에 실패한 부분(특정 데이터그램 죽음)을 알려서 Source가 그 문제를 해결할 수 있게 해주기 때문이다. (Post-Mortem이라 한다.) 해당 메세지에는 Transport Port Numbers들이 포함되어 있다. (위에서 말했지만 Source가 문제 해결이 가능할 경우에만 보낸다)
Post-Mortem 코드가 궁금하시다면 펼쳐주세요.
2. IP Datagram의 죽음에 대해 보내지 않는다.
•
ICMP Error가 죽은 것에 대한 ICMP Error Message를 생성하지 않는다.
위 그림에서 보면, 라우터 R2에서 생성한 ICMP Error 메세지가 만약에 R1에서 죽었다고 한다면, 죽은 것에 대한 ICMP Message를 생성하지 않는다. (이유는, 에러의 에러의 에러 메세지를 만드는 것을 생각해 보면 된다. 복잡하지 않은가?)
•
Checksum Error에 대한 메세지를 만들지 않는다.
→ Source가 해결할 수 있는 문제가 아니기 때문이다.
•
Destination Address가 Multicast/Broadcast 인 경우에 대한 메세지를 만들지 않는다
→ Source가 Broadcast로 패킷을 보냈을 경우 Source가 받게되는 패킷의 양과 그만큼 다른 라우터들의 손해를 생각해보면 된다.
•
0.0.0.0 (From "I")에 대한 메세지를 만들지 않는다.
•
IP Fragements 중에서 첫 번째 것에 대한 메세지만 만든다.
→ 첫 번째 것에만 TCP Header가 있기 때문이다. (위에서 언급했지만 Post-Mortem을 위해서 Transport Port Numbers를 메세지에 포함시켜야 하는데, 그것은 오직 IP Datagram 의 Fragments 중에서 첫 번째에만 있기 때문.)
3. Time Exceed
•
TTL이 0일 때 보낸다. (IP 네트웍 장비가 매우 바쁠 경우에는 생성하지 않을 수는 있음.)
•
Destination에 다른 Fragments들이 와 있는데, 나머지 Fragments들이 도착하지 않은 경우 (예를 들면, 15초 정도 기다렸는데도 안왔을 경우)
→ 하지만 이때 쯤에는 상위 계층(예를 들면, Transport Layer)에 의해 재전송 작업이 진행중일 것이다.
4. 패킷의 경로 MTU 구하기
•
→ IP Datagram 플레그 중에 DF(Don't Fragment)라는 것이 있는데, 해당 값이 1이면 패킷을 자르지 못한다는 의미이다. DF값을 1로 놓은 상태로 Router B에게 보내면, Router B는 DF 플레그가 1이기 때문에 Datagram을 자르지 않게 된다. 여기서 자르는 경우는 어떤 경우냐면, 다음 링크의 MTU가 Datagram의 크기보다 작을 경우에 자르게 됩니다. 다시 돌아와서, DF플레그가 1로 설정이 되었는데, Router B에서 Datagram이 이동할 링크의 MTU보다 크므로 ICMP Message를 생성해서 Host A로 다시 보냅니다. 그렇게 Host A는 Datagram의 사이즈를 조정하여 다시 보내게 되고, 이런식으로 반복하여 Destination까지의 MTU를 구할 수 있게 됩니다.
라우터가 보내는 ICMP Message (Path MTU Discovery)