ICMP (Internet Control Message Protocol, giao thức thông báo điều khiển Internet) là giao thức đi kèm IP, dùng để router và máy tính báo cho nhau khi gói tin không tới được đích, và để trả lời các gói kiểm tra như lệnh ping. Hiểu ICMP là gì giúp bạn đọc đúng kết quả ping. Mỗi lần gõ ping hay tracert trong CMD, các dòng "Reply from", "Request timed out" hiện ra chính là kết quả của gói tin ICMP gửi về, hoặc của việc không có gói nào về. ICMP không chở dữ liệu web, game hay video. Nó chỉ chở thông báo.

ICMP là gì? ICMP là giao thức gì?

ICMP là giao thức gì? Đó là giao thức tầng mạng chạy ngay trên IP, không thuộc TCP cũng không thuộc UDP. Trong header IPv4, ô Protocol ghi số 1 cho ICMP. RFC 792 (tháng 9/1981) gọi ICMP là "một phần không tách rời của IP", nên máy nào chạy IP cũng phải có ICMP.

ICMP chỉ báo lỗi, không sửa lỗi. RFC 792 ghi rõ mục đích của các thông báo này là phản hồi về sự cố, không phải làm cho IP tin cậy hơn. Gói bị mất thì ICMP không gửi lại, việc đó do TCP lo. ICMP nằm ở tầng 3 (tầng mạng), cùng tầng với IP.

Vì không thuộc TCP hay UDP nên ICMP không có số port. Bài về port và câu hỏi ping có dùng port không đã giải thích kỹ điểm này. IPv6 có bản riêng tên ICMPv6 (RFC 4443), gánh thêm việc tìm thiết bị trong mạng LAN thay cho ARP của IPv4.

ICMP dùng để làm gì?

ICMP dùng để báo lỗi khi gói tin không đi tiếp được, kiểm tra một máy có phản hồi không (lệnh ping) và dò đường đi của gói tin qua từng router (lệnh tracert). Người dùng nhà gặp ICMP chủ yếu qua hai lệnh này.

  • Báo lỗi: router không chuyển được gói thì báo "không tới được đích". Gói đi quá số chặng cho phép (TTL về 0) thì router báo "hết thời gian".
  • Kiểm tra phản hồi: máy gửi gói hỏi, máy đích gửi gói trả lời.
  • Dò đường: tracert dựa vào thông báo "hết thời gian" để lộ địa chỉ từng router.

Trên mạng IPv6, chặn nhầm ICMPv6 làm thiết bị không thấy nhau, hoặc web tải một nửa rồi đứng.

Gói tin ICMP là gì, gồm những phần nào?

Gói tin ICMP là một thông báo nhỏ nằm trong phần dữ liệu của gói IP. Theo RFC 792, gói nào cũng mở đầu bằng 4 byte giống nhau: Type, Code và Checksum. Phần phía sau thay đổi theo loại thông báo.

  • Type (8 bit): loại thông báo, ví dụ 8 là gói ping gửi đi.
  • Code (8 bit): lý do chi tiết trong cùng một loại.
  • Checksum (16 bit): phát hiện gói bị hỏng trên đường truyền. Đây là phép kiểm tra lỗi, không phải mã hóa hay bảo mật.
  • Phần còn lại: với ping là mã nhận dạng (Identifier) và số thứ tự (Sequence Number), để máy ghép gói hỏi với gói trả lời.

Gói báo lỗi mang theo header IP của gói gốc và 64 bit (8 byte) đầu phần dữ liệu, chỗ chứa port nguồn và port đích. Nhờ đó máy biết lỗi thuộc ứng dụng nào. Đây là 5 loại gói tin ICMP hay gặp nhất:

Type Tên Bạn gặp khi nào
8 Echo Request (yêu cầu phản hồi) Gói ping gửi đi
0 Echo Reply (trả lời phản hồi) Gói ping trả lời
3 Destination Unreachable (không tới được đích) Dòng "Destination host unreachable"; code 3 nghĩa là cổng UDP đóng
11 Time Exceeded (hết thời gian, TTL về 0) Lệnh tracert, dòng "TTL expired in transit"
5 Redirect (chuyển hướng) Router báo máy nên đi qua router khác, hiếm gặp ở mạng nhà

Danh sách đầy đủ, kể cả các loại cũ đã bị bỏ như Source Quench (type 4), có ở bảng ICMP Parameters của IANA.

ICMP ping là gì, hoạt động thế nào?

ICMP ping là cách lệnh ping dùng hai loại gói tin ICMP: Echo Request (type 8) và Echo Reply (type 0). Máy bạn gửi gói hỏi, máy đích gửi lại gói trả lời mang cùng mã nhận dạng và số thứ tự. Khoảng thời gian giữa hai gói là con số ms mà lệnh ping in ra.

Gõ ping 8.8.8.8 trong CMD, Windows gửi 4 gói rồi dừng. Mỗi dòng "Reply from" là một gói Echo Reply về tới máy.

Ping không bắt buộc phải dùng ICMP. Trình duyệt không gửi được gói ICMP, nên các trang đo tốc độ tính ping bằng yêu cầu HTTP. Một số công cụ khác ping bằng cách mở kết nối TCP tới một port. Muốn đo từ một máy chủ bên ngoài tới IP hoặc tên miền, bạn dùng check ping của CheckIP. Công cụ này đo từ máy chủ CheckIP tới đích, không đo từ máy bạn.

Đọc các dòng lỗi khi ping: ICMP đang báo gì?

Mỗi dòng lỗi khi ping ứng với một gói ICMP cụ thể, hoặc cho biết không có gói nào về. Hai lỗi hay gặp khác là lỗi DNS và lỗi card mạng, không dính tới ICMP. Bảng ghi chữ tiếng Anh trên Windows, Windows tiếng Việt có thể ghi khác.

Dòng hiện ra Gói ICMP phía sau Nghĩa và việc nên làm
Reply from 8.8.8.8: bytes=32 time=35ms TTL=118 Echo Reply (type 0) Đích trả lời bình thường.
Reply from 192.168.1.23: Destination host unreachable. Destination Unreachable (type 3) IP sau "Reply from" là máy báo lỗi (router hoặc chính máy bạn), không phải đích. Hay do sai IP hoặc máy đích tắt. Kiểm tra IP đích và default gateway.
Request timed out. Không có gói nào về ICMP không cho biết lý do: đích chặn ping hoặc gói mất trên đường. Thử mở trang web của đích.
Reply from ...: TTL expired in transit. Time Exceeded (type 11) Gói đi quá số chặng, thường do định tuyến vòng lặp. Chạy tracert xem chặng nào lặp.
Ping request could not find host ... Không phải ICMP Lỗi DNS: máy không đổi được tên miền ra IP, gói ping chưa được gửi.
General failure. Không phải ICMP Thường gặp khi gói chưa ra khỏi máy, ví dụ card mạng tắt hoặc chưa kết nối mạng.

Lệnh tracert dùng ICMP để dò đường thế nào?

Lệnh tracert trên Windows gửi gói Echo Request với TTL tăng dần từ 1. Mỗi router trên đường giảm TTL đi 1, router nào đưa TTL về 0 thì bỏ gói và gửi lại Time Exceeded (type 11). Gói báo lỗi đó lộ địa chỉ của router, và tracert in ra từng chặng như vậy.

  1. Gói đầu có TTL = 1. Router đầu tiên, thường là modem nhà bạn (hay có địa chỉ 192.168.1.1), bỏ gói và báo lại.
  2. Gói tiếp theo có TTL = 2, hết hạn ở router đầu tiên của nhà mạng, router này báo lại địa chỉ của nó.
  3. Cứ tăng TTL thêm 1 cho tới khi gói tới đích và đích trả Echo Reply.

Theo Microsoft Learn, tracert dò tối đa 30 chặng và chờ 4.000 ms cho mỗi lần trả lời. Thêm -d (tracert -d 8.8.8.8) để bỏ bước tra tên router, lệnh chạy nhanh hơn.

Dòng * * * nghĩa là router ở chặng đó không gửi Time Exceeded kịp hoặc giới hạn gói báo lỗi. Các chặng sau vẫn trả lời thì đường truyền không đứt ở đó. Lệnh traceroute trên Linux mặc định gửi gói UDP, thêm -I để dùng ICMP (theo trang man traceroute(8)).

Vì sao máy không trả lời ping? Có nên chặn ICMP?

Máy không trả lời ping thường do tường lửa hoặc modem bỏ qua gói Echo Request, không phải do máy tắt. Chặn ping từ Internet vào là lựa chọn bình thường. Chặn toàn bộ ICMP thì không nên, vì nhiều kết nối cần gói báo lỗi để chạy đúng.

  • Tường lửa Windows: ping đi qua quy tắc riêng "File and Printer Sharing (Echo Request - ICMPv4-In)". Quy tắc này tắt thì máy không trả lời ping.
  • Modem nhà mạng: nhiều modem có tùy chọn cho phép hoặc chặn ping từ Internet (WAN), nên ping IP public nhà mình từ ngoài hay không có trả lời.
  • Website, máy chủ lớn: chặn ping để giảm bị dò quét địa chỉ và giảm lưu lượng ping flood. Lỗi "ping of death" thời cũ đã được vá từ lâu.

Lý do không chặn hết: gói quá lớn thì router gửi lại thông báo "cần chia nhỏ gói" (Fragmentation Needed với IPv4, Packet Too Big với IPv6) để máy gửi giảm kích thước. RFC 4890 xếp Packet Too Big vào nhóm gói tường lửa không được bỏ. Thiếu nó, web có thể tải dở rồi treo, VPN chập chờn.

Chặn ping cũng không làm máy "tàng hình", port đang mở vẫn bị thấy. Bạn tự kiểm tra bằng công cụ quét port online.

"Mở port ping" trên Windows: thật ra là cho phép ICMP

Ping không dùng port nên không có port nào để mở. Muốn máy tính trả lời ping trong mạng LAN, ví dụ để đầu ghi camera, NAS hay máy khác trong nhà kiểm tra thấy máy, bạn bật quy tắc ICMP Echo trong tường lửa Windows.

  1. Nhấn Win + R, gõ wf.msc rồi Enter để mở Windows Defender Firewall with Advanced Security.
  2. Chọn Inbound Rules, tìm quy tắc "File and Printer Sharing (Echo Request - ICMPv4-In)". Với IPv6 là quy tắc cùng tên đuôi ICMPv6-In.
  3. Bấm chuột phải vào dòng có profile Private, chọn Enable Rule. Để nguyên dòng profile Public khi bạn hay dùng wifi quán cà phê.

Việc này khác với mở port TCP cho camera hay game, vốn là quy tắc theo số port. Không cần tắt hẳn tường lửa để ping được.

Câu hỏi thường gặp

ICMP và ping có phải là một không?

Không. ICMP là giao thức có nhiều loại thông báo, còn ping là một lệnh chỉ dùng hai loại trong đó là Echo Request và Echo Reply. Tracert, cơ chế dò kích thước gói và việc tìm thiết bị trong mạng IPv6 dùng các loại ICMP khác. Có công cụ ping không dùng ICMP mà đo bằng kết nối TCP hoặc yêu cầu HTTP.

ICMP thuộc tầng nào trong mô hình OSI?

ICMP thuộc tầng 3, tầng mạng, cùng tầng với IP. Gói ICMP nằm gọn trong gói IP và không qua tầng giao vận nơi TCP, UDP làm việc. Tường lửa lọc ICMP theo loại (type) và mã (code), không theo port.

Chặn ICMP có giúp chống hack không?

Chỉ giúp một phần nhỏ. Chặn ping làm các lần quét địa chỉ đơn giản khó thấy máy hơn, còn kẻ dò quét vẫn thử thẳng vào port. Cách hợp lý là chặn ping từ Internet và giữ các gói báo lỗi.

ICMPv6 khác ICMP thế nào?

ICMPv6 là bản dành cho IPv6, cùng vai trò báo lỗi và ping, nhưng số type khác: ping IPv6 dùng type 128 (Echo Request) và 129 (Echo Reply). ICMPv6 còn thay ARP để tìm thiết bị trong mạng LAN. Trên Windows, gõ ping -6 kèm tên miền để ép ping qua IPv6. Xem thêm khác biệt giữa IPv4 và IPv6.