Nền tảng Mạng máy tính/ICMP & chẩn đoán — ping và traceroute thực sự làm gì
11/17
Bài 11 / 17~18 phútĐịa chỉ & Định tuyếnMiễn phí lượt xem

ICMP & chẩn đoán — ping và traceroute thực sự làm gì

ICMP là giao thức điều khiển/báo lỗi ở tầng Internet, đứng sau ping và traceroute. Bài này giải thích echo request/reply, mẹo TTL của traceroute, các message lỗi (destination unreachable, time exceeded), và vì sao 'ping được' không có nghĩa app chạy được.

TL;DR: ICMP không phải TCP/UDP — nó 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 pingtraceroute — và cách dùng chúng để chẩn đoán đúng thay vì kết luận vội.

1. 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 — đó là lý do 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ì.

2. 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) — chính là con số time=24ms bạn thấy.

sequenceDiagram
    participant A as May ban
    participant B as May dich
    A->>B: ICMP echo request ("con song khong?")
    B->>A: ICMP echo reply ("con day", RTT = 24ms)
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.

3. traceroute — mẹo TTL thiên tài

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:

flowchart TD
    A["Gui goi TTL=1"] --> R1["Router 1: TTL->0<br/>tra ICMP time exceeded"]
    R1 --> L1["=> lo hop 1"]
    B["Gui goi TTL=2"] --> R2["Router 2: TTL->0<br/>tra ICMP time exceeded"]
    R2 --> L2["=> lo hop 2"]
    C["TTL=n tới dich"] --> D["Dich tra loi<br/>=> ket thuc"]
  • 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).

4. Đọ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 messageNghĩaGợi ý
Echo replyMáy còn sốngTầng Internet OK
Time exceededTTL về 0 dọc đườngDùng cho traceroute; hoặc loop định tuyến
Destination host unreachableTới được mạng nhưng không thấy hostHost tắt / sai IP / ARP fail
Destination net unreachableKhông có route tới mạng đíchThiếu route / gateway sai
Destination port unreachableTới host nhưng không ai nghe cổng đó (thường UDP)Service chưa chạy / sai cổng
Fragmentation neededGó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ảnhVấ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.

5. 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 — nhiều server/firewall chặn ICMP vì lý do an ninh, nên ping timeout dù dịch vụ HTTP/HTTPS chạy tốt. Đừng kết luận "server chết" chỉ vì ping fail.
📌 Nối lại Module 1

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).

6. 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, TLS có hợp lệ — 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 — traceroute chỉ phản ánh chiều đi tại thời điểm đo, không phải bản đồ tuyệt đối.

7. 📚 Deep Dive — tài liệu gốc

📚 Spec & reference chính thức

Đọc khi muốn tới gốc ICMP:

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.

8. 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.
  • traceroute dù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ụ.
  • Quy trình chẩn đoán: ping (tới được chưa) → traceroute (tắc ở đâu) → test cổng/dịch vụ bằng nc/curl.

9. Tự kiểm tra

Tự kiểm tra
Q1
ICMP khác TCP/UDP ở chỗ nào về vai trò và vị trí trong mô hình tầng?
ICMP ở 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 và không có port — nhiệm vụ là báo trạng thái và lỗi (đích không tới được, TTL hết, "máy còn sống không?"). Vì không gắn port/ứng dụng, ICMP kiểm tra được "máy có sống" mà không cần biết máy chạy dịch vụ gì.
Q2
Giải thích mẹo TTL mà traceroute dùng để lộ ra từng router.
Mỗi gói IP có TTL, giảm 1 qua mỗi router; khi TTL = 0, router huỷ gói và gửi lại ICMP time exceeded. traceroute lợi dụng: gửi gói TTL=1 → router đầu tiên làm TTL về 0 → trả time exceeded → lộ hop 1. Gửi TTL=2 → lộ hop 2. Tăng dần tới khi chạm đích. Ghép các "time exceeded" lại = danh sách hop.
Q3
Bạ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.
Rất nhiều server/firewall chặn ICMP chủ động vì lý do an ninh, nên ping (dùng ICMP echo) timeout — trong khi HTTP/HTTPS (tầng Application trên TCP) vẫn chạy bình thường. Ping và web đi qua các giao thức/tầng khác nhau. Bài học: ping fail không có nghĩa server chết; phải kiểm tra bằng đúng giao thức dịch vụ (curl), đừng kết luận chỉ từ ping.
Q4
Phân biệt 'destination net unreachable' và 'destination port unreachable' — mỗi cái chỉ về vấn đề ở đâu?
Net unreachable: không có route tới mạng đích → vấn đề ở routing/gateway (thiếu route, gateway sai). Port unreachable: gói tới được host nhưng không ai lắng nghe cổng đó → vấn đề ở dịch vụ/cổng (service chưa chạy, sai cổng). Đọc đúng message giúp khoanh vùng: một cái về đường đi, một cái về ứng dụng đích.
Q5
Mộ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?

Thứ tự hợp lý: ping (mạng tới được đích chưa, tầng Internet) → traceroute (nếu không tới, tắc ở hop nào) → test đúng cổng/dịch vụ bằng nc/curl (tầng Transport/Application).

Không dừng ở ping vì ping chỉ chạm tầng Internet — "ping được" không chứng minh cổng mở, app chạy hay TLS hợp lệ. Phải lên tới đúng tầng mà dịch vụ sống mới kết luận được.

Q6
Vì sao traceroute đôi khi hiện `* * *` ở một số hop, và điều đó có nghĩa mạng hỏng không?
Không nhất thiết hỏng. Một số router được cấu hình không trả ICMP time exceeded (hoặc hạ ưu tiên ICMP) vì an ninh/hiệu năng, nên traceroute không nhận phản hồi ở hop đó và hiện * * * — nhưng gói vẫn có thể đi qua bình thường tới các hop sau. Ngoài ra routing bất đối xứng khiến traceroute chỉ phản ánh chiều đi tại thời điểm đo. Vậy * * * thường là "router đó im lặng", không phải "đứt mạ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?

Hỏi đáp về bài này

Chưa có câu hỏi

Đặt câu hỏi

Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).

Đặt câu hỏi đầu tiên