ICMP & chẩn đoán — ping và traceroute thực sự làm gì
ICMP đứng sau ping và traceroute: echo request/reply, mẹo TTL, các message lỗi, và vì sao ping được không có nghĩa app chạy được.
TL;DR: ICMP không phải TCP/UDP, mà là giao thức điều khiển và báo lỗi ở tầng Internet. ping dùng ICMP echo request/reply để đo "máy còn sống + RTT". traceroute dùng mẹo TTL: gửi gói TTL=1, 2, 3… mỗi router giảm TTL, khi về 0 router gửi lại ICMP time exceeded → lộ ra từng hop. Các message như destination unreachable (host/port unreachable) cho biết vì sao gói không tới. Quan trọng: ping được ≠ app chạy được — ping chỉ kiểm tra tầng Internet, không đụng TCP/TLS/HTTP, và firewall thường chặn ICMP nên ping fail chưa chắc do dịch vụ chết.
ping google.com trả về vài chục ms, ngon lành. Nhưng ping server-cua-ban.com lại Request timeout, dù web của server đó vẫn mở bình thường trên trình duyệt. Vậy ping thực sự đo cái gì, và một kết quả ping nói (và không nói) lên điều gì?
Bài này giải thích ICMP, giao thức đứng sau ping và traceroute, và cách dùng chúng để chẩn đoán đúng thay vì kết luận vội.
Ôn lại kiến thức nền tảng từ bài mo hinh tcp ip 4 tang trước khi đi sâu vào nội dung bài học này.
1. Analogy — phiếu báo lỗi của bưu điện
Bạn gửi một lá thư. Nếu giao được, bưu điện im lặng; bên nhận muốn trả lời thì tự viết thư khác. Nhưng nếu không giao được, bưu điện không gửi thư trả lời hộ ai cả. Nó gửi về cho bạn một phiếu báo riêng, ghi rõ lý do: "địa chỉ không tồn tại", "quá số lần chuyển tiếp, thư bị huỷ". Phiếu báo không phải thư; nó là kênh riêng để hệ thống nói với bạn chuyện gì đã xảy ra với thư.
Còn muốn biết địa chỉ kia có người ở không mà chưa có gì để gửi, bạn gửi một bưu thiếp trống, chỉ xin một chữ ký nhận. Ký nhận về là biết có người, và biết mất mấy ngày.
| Bưu điện | ICMP |
|---|---|
| Lá thư | Gói IP |
| Phiếu báo lỗi (kênh riêng, không phải thư) | ICMP error message |
| "Quá số lần chuyển tiếp, thư bị huỷ" | Time exceeded (TTL về 0) |
| Bưu thiếp xin chữ ký nhận | Echo request / reply (ping) |
2. ICMP là gì — không phải TCP/UDP
ICMP (Internet Control Message Protocol) sống ở tầng Internet, cạnh IP, không phải tầng Transport như TCP/UDP. Nó không chở dữ liệu ứng dụng; nhiệm vụ của nó là báo trạng thái và lỗi về cho bên gửi: "đích không tới được", "gói sống quá lâu, đã huỷ", "máy còn đó không?".
Vì ICMP không có port (không thuộc Transport), nó không gắn với một ứng dụng cụ thể nào. Vì thế ping kiểm tra được "máy có sống" mà không cần biết máy đó chạy dịch vụ gì.
3. ping — echo request / reply
ping gửi một ICMP echo request; máy đích (nếu trả lời) gửi lại echo reply. Thời gian khứ hồi (gửi đi rồi nhận lại) gọi là RTT (Round-Trip Time), tức con số time=24ms bạn thấy.

ping google.com
# 64 bytes from ... time=24.3 ms
# 64 bytes from ... time=23.8 ms
Ping thành công cho biết: gói tới được đích ở tầng Internet và quay về, tức định tuyến + máy đích cơ bản OK. Nó không cho biết web server, database hay TLS có hoạt động không.
4. traceroute lộ ra từng router bằng cách nào?
Mỗi gói IP có trường TTL (Time To Live): qua mỗi router, TTL giảm 1; khi TTL = 0, router huỷ gói và gửi lại ICMP time exceeded cho người gửi (cơ chế chống gói chạy vòng vô tận).
traceroute lợi dụng điều đó để ép từng router tự lộ diện:

- Gói TTL=1 → router đầu tiên giảm còn 0 → gửi lại "time exceeded" → ta biết hop 1.
- Gói TTL=2 → đi qua hop 1 (còn 1), tới hop 2 thành 0 → "time exceeded" → biết hop 2.
- Tăng dần TTL tới khi gói chạm đích. Ghép lại = toàn bộ danh sách hop (như bài routing đã thấy).
5. Đọc các ICMP error message
Khi gói không tới đích, ICMP báo về lý do. Các loại hay gặp:
| ICMP message | Nghĩa | Gợi ý |
|---|---|---|
| Echo reply | Máy còn sống | Tầng Internet OK |
| Time exceeded | TTL về 0 dọc đường | Dùng cho traceroute; hoặc loop định tuyến |
| Destination host unreachable | Tới được mạng nhưng không thấy host | Host tắt / sai IP / ARP fail |
| Destination net unreachable | Không có route tới mạng đích | Thiếu route / gateway sai |
| Destination port unreachable | Tới host nhưng không ai nghe cổng đó (thường UDP) | Service chưa chạy / sai cổng |
| Fragmentation needed | Gói lớn hơn MTU (Maximum Transmission Unit, kích thước gói tối đa một chặng cho qua), cấm phân mảnh | Vấn đề MTU (module TCP sau) |
Đọc đúng message tiết kiệm hàng giờ debug: net unreachable chỉ về routing/gateway, còn port unreachable chỉ về dịch vụ/cổng.
Thử ngẫmbạn ping một máy cùng LAN và nhận Destination host unreachable gần như ngay lập tức, khác hẳn kiểu timeout chờ lâu. Phản hồi tức thì đó gợi ý điều gì đang xảy ra ở tầng bên dưới?
6. Chẩn đoán đúng — ping được ≠ app chạy
Đây là điểm dễ sai nhất. ping chỉ chạm tầng Internet (ICMP); nó không mở TCP, không chạy TLS, không gửi HTTP. Vậy nên:
- Ping được nhưng app timeout: bình thường. Có thể service chưa chạy, sai cổng, firewall chặn cổng TCP (nhưng cho ICMP qua), hay TLS hỏng.
- Ping fail nhưng web vẫn mở: rất hay gặp, vì nhiều server/firewall chặn ICMP vì lý do an ninh, nên
pingtimeout dù dịch vụ HTTP/HTTPS chạy tốt. Đừng kết luận "server chết" chỉ vì ping fail.
Thử ngẫmping tới server thấy reply đều 20 ms, traceroute cũng chạm đích, nhưng curl https://server treo rồi timeout. Theo mô hình tầng, lỗi còn có thể nằm ở những chỗ nào mà cả hai công cụ ICMP đều không nhìn thấy?
Nhớ pitfall ở Module 1: "ping được nên lỗi do code". Giờ bạn hiểu cơ chế: ping kiểm tra tầng Internet bằng ICMP, hoàn toàn tách biệt với tầng Transport/Application nơi app thật sự chạy. Quy trình đúng: ping (mạng tới được chưa?) → traceroute (tắc ở hop nào?) → rồi mới test đúng cổng/dịch vụ bằng nc/curl (module sau).
7. Pitfall — hiểu nhầm thường gặp
❌ Nhầm 1: "Ping fail = server chết."
✅ Rất nhiều server/firewall chặn ICMP chủ động. Ping fail có thể chỉ là ICMP bị chặn trong khi HTTP/HTTPS vẫn chạy. Kiểm tra bằng đúng giao thức của dịch vụ (curl), đừng dựa mỗi ping.
❌ Nhầm 2: "Ping được nghĩa là dịch vụ sẵn sàng." ✅ Ping chỉ chứng minh máy sống ở tầng Internet. Cổng dịch vụ có mở, app có chạy hay TLS có hợp lệ thì phải test riêng ở tầng Transport/Application.
❌ Nhầm 3: "traceroute thấy đủ mọi hop và luôn chính xác."
✅ Một số router không trả ICMP time exceeded (hiện * * *), và routing có thể bất đối xứng, nên traceroute chỉ phản ánh chiều đi tại thời điểm đo, không phải bản đồ tuyệt đối.
8. 📚 Deep Dive — tài liệu gốc
Đọc khi muốn tới gốc ICMP:
- RFC 792 — Internet Control Message Protocol: định nghĩa ICMP: echo, time exceeded, destination unreachable.
- RFC 1122 — Requirements for Internet Hosts: host phải xử lý ICMP thế nào.
Ghi chú: ICMP nhỏ nhưng là "hệ thần kinh báo lỗi" của IP. ping/traceroute là hai công cụ debug đầu tiên ai cũng chạm; hiểu chúng làm gì giúp bạn đọc kết quả đúng thay vì đoán.
9. Tóm tắt
- ICMP ở tầng Internet (không phải TCP/UDP, không có port), dùng để báo trạng thái/lỗi của IP.
ping= ICMP echo request/reply → "máy còn sống + RTT", chỉ kiểm tra tầng Internet.traceroutedùng mẹo TTL: tăng dần TTL, mỗi router hết TTL gửi lại time exceeded → lộ từng hop.- Đọc message:
net unreachable→ routing/gateway;host unreachable→ host/ARP;port unreachable→ dịch vụ/cổng;fragmentation needed→ MTU. - Ping được ≠ app chạy, và ping fail ≠ server chết (firewall hay chặn ICMP). Phải test đúng giao thức dịch vụ.
10. Tự kiểm tra
- Q1ICMP khác TCP/UDP ở chỗ nào về vai trò và vị trí trong mô hình tầng?
- Q2Giải thích mẹo TTL mà traceroute dùng để lộ ra từng router.
- Q3Bạn ping một server thì timeout, nhưng mở web của nó trên trình duyệt vẫn vào được. Giải thích vì sao, và bài học rút ra.
- Q4Phân biệt 'destination net unreachable' và 'destination port unreachable': mỗi cái chỉ về vấn đề ở đâu?
- Q5Một quy trình chẩn đoán mạng hợp lý đi theo thứ tự nào, và vì sao không dừng ở ping?
- Q6Vì sao traceroute đôi khi hiện
* * *ở một số hop, và điều đó có nghĩa mạng hỏng không?
Bài tiếp theo: Module 2 — Tổng kết & cheat sheet
Bài này có giúp bạn hiểu bản chất không?
Bài này đáng gửi cho bạn học cùng?
Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.
NAT & Port Forwarding — một IP công cộng cho nhiều máy
Bài tiếpModule 2 — Tổng kết & cheat sheet
Thảo luận & góp ý
Hỏi đáp về bài này