ICMP (INTERNET CONTROL MESSAGE PROTOCOL)
ICMP (Internet Control Message Protocol) là giao thức thuộc tầng mạng (network layer) được sử dụng để diagnostics (chuẩn đoán) và quản trị hệ thống mạng (network management). Một ví dụ cụ thể là câu lệnh ping sử dụng thông điệp ICMP request và ICMP reply. Khi một máy nào đó không thể truy cập, ICMP có thể gửi một thông báo lỗi (error message) tới máy nguồn. Một câu lệnh khác cũng sử dụng tới giao thức ICMP là traceroute (hay tracer).
Các thông điệp ICMP (ICMP messages) được đóng gói (encapsulated) trong gói tin IP (IP packets), vì vậy, hầu hết mọi người đều cho rằng ICMP là một giao thức thuộc tầng 4 giống như UDP hay TCP. Tuy nhiên, ICMP được sử dụng kết hợp và là một phần quan trọng với giao thức IP, vì thế nó được xem như là một giao thức thuộc tầng 3.
Phần header của ICMP khá đơn giản, có cấu trúc như sau:

Byte đầu tiên xác định type của ICMP message. Ví dụ: type 8 được sử dụng cho gói ICMP request và type 0 sử dụng cho gói ICMP reply, type 3 cho trường hợp thông báo lỗi “destination unreachable” – không thể truy cập được tới đích.
Byte thứ 2 được dùng để xác định loại ICMP message nào đang sử dụng. Ví dụ: “destination unreachable” có 16 code khác nhau. Khi bạn thấy code = 0 thì có nghĩa là mạng đích (destination network) không thể truy cập (unreachable), còn code = 1 thì có nghĩa là máy đích không thể truy cập (unreachable).
Trường thứ 3 gồm 2 byte dùng để checksum lại gói tin ICMP có bị lỗi hay không. Phần còn lại của Header phụ thuộc vào type của IMCP message mà chúng ta sử dụng.
Nếu như bạn muốn tìm hiểu về tất cả các ICMP type hay ICMP code, bạn truy cập vào đường link sau
Để hiểu thêm về quá trình hoạt động của ICMP, hãy cùng làm một số ví dụ sử dụng Wireshark để bắt gói:
Wireshark Captures
ICMP Echo request and reply
Cùng nhau xem qua một ví dụ đơn giản, sử dụng lệnh ping. Sử dụng mô hình với 2 router:

Sử dụng lệnh ping trên R1:

Bắt gói tin bằng wireshark ta có thông tin như sau:

Message ở hình trên là gói ICMP request , bạn có thể nhìn thấy type = 8 và code = 0. Khi nhận được gói tin này thì R2 sẽ hồi đáp lại:

Bạn có thể thấy ICMP reply sẽ có type = 0 và code = 0.
Destination Unreachable
Chúng ta có một cách để khảo sát một gói ICMP chứa thông điệp là destination unreachable message là chúng ta sẽ đặt một access-list trên R2 để từ chối các ICMP message:

Bạn nào đã học CCNA thì đã biết chức năng của access-list là gì, vậy mình sẽ không giải thích thêm. Thử ping lại trên R1:

Kết quả của câu lệnh ping ở đây là thất bại. Bạn có thể thấy U (unreachable) được hiển thị trên R1. Đây là thông tin chứa trong ICMP message mà R2 đã hồi đáp:

ICMP destination unreachable message có type = 3 và sử dụng code = 13. Có nghĩa là gói tin bị chặn bởi chính sách quản trị “administratively filtered” mà ở đây là access-list.
Traceroute
Traceroute cũng sử dụng ICMP message, tuy nhiên nó không giống ICMP.
Sử dụng mô hình gồm 3 router như sau:

Đầu tiên, hãy xem câu lệnh traceroute từ R1 tới R3 sẽ cho kết quả như thế nào:

Dưới đây là thông tin trong gói tin đầu tiên mà R1 đã gửi đi:

Trong gói tin này, R1 đã gửi ra một gói tin chứa thông tin của trường TTL = 1. Giá trị của trường TTL bài sẽ được tăng lên cho mỗi chặng. Khi R2 nhận được gói tin này thì sẽ hồi đáp lại:

Phía trên là thông tin của gói ICMP được hồi đáp từ R2. R2 sẽ gửi một ICMP type 11 (time to live exceeded) tới R1. Khi R1 nhận được, sẽ gửi một gói tin khác có thông tin như sau:

Bạn có thể thấy là giá trị của TTL đã tăng thành 2. Như vậy, R3 sẽ nhận được gói tin này và sẽ hồi đáp trở lại R1:

“Routing Fundamentals – Network Lesson”
NGUYỄN VĂN HUY DŨNG
Don’t compare yourself with anyone in this world…if you do so, you are insulting yourself.
Bill Gates
When something is important enough, you do it even if the odds are not in your favor.