- Bài 1 : Mạng và Mô hình tham chiếu
- Bài 2 : Chi tiết các lớp trong Mô hình tham chiếu – Application và Transport
- Bài 3 : Chi tiết các lớp trong Mô hình tham chiếu – Network
- Bài 4 : Chi tiết các lớp trong Mô hình tham chiếu – Data Link và Physical
- Bài 5 : Giới thiệu về Router
- Bài 6 : Nguyên lý hoạt động của Switch
- Bài 7 : Định tuyến tĩnh
- Bài 8 : Một số giao thức mạng – ARP
- Bài 9 : Một số giao thức mạng – DHCP
- Bài 10 : Một số giao thức mạng – ICMP
ICMP – Internet Control Message Protocol, được mô tả trong RFC – 972, là một giao thức định nghĩa ra nhiều loại thông điệp điều khiển (control message), cho phép thiết bị mạng sử dụng các thông điệp này để kiểm tra tình trạng kết nối mạng và phát đi báo hiệu cho các lỗi đang xảy ra trên hệ thống mạng.
Cấu trúc của một thông điệp ICMP được trình bày trên hình 1:

Hình 1 – Cấu trúc thông điệp ICMP.
Trong cấu trúc này:
- Hai trường “TYPE” và “CODE” dùng để định danh cho loại thông điệp ICMP. Như đã nêu ở trên, ICMP định nghĩa ra rất nhiều loại thông điệp sử dụng cho nhiều mục đích khác nhau. Mỗi loại thông điệp sẽ được định danh duy nhất bởi cặp tham số này. Trong các mục kế tiếp, chúng ta sẽ cùng điểm qua một số loại thông điệp ICMP thường dùng cùng với cặp tham số “TYPE/CODE” của chúng.
- Trường “CHECKSUM” được sử dụng để kiểm tra lỗi cho toàn bộ gói ICMP.
- Trường “DATA” sẽ chứa dữ liệu đặc thù của từng loại thông điệp ICMP. Các loại thông điệp khác nhau sẽ có dữ liệu khác nhau.
Đến lượt chúng, các thông điệp ICMP này lại được đóng gói trực tiếp vào phần Payload của các gói tin IP và được truyền đi trên mạng. Các gói IP chuyên chở thông điệp ICMP sẽ có trường Protocol – ID trong IP header có giá trị là 1.
Tiếp theo, chúng ta cùng điểm qua một số loại thông điệp ICMP thường được sử dụng cùng với các ứng dụng của chúng.
1. Các thông điệp “Echo”
ICMP định nghĩa hai loại thông điệp Echo: ICMP Echo (Type 8, Code 0) và ICMP Echo Reply (Type 0, Code 0). Hai loại thông điệp này được sử dụng trong một ứng dụng rất phổ biến là ứng dụng “Ping”. “Ping” cho phép người quản trị có thể kiểm tra được hai địa chỉ IP trên mạng có thể đi đến nhau được hay không. Nguyên lý của “Ping” được mô tả trong hình 2:

Hình 2 – Hoạt động Ping.
Trong hình 2, Host 1 có địa chỉ 10.1.1.2/24 cần kiểm tra rằng từ nó có thể truy nhập đến được Host 2 tại địa chỉ 10.1.3.2/24 hay không. Để thực hiện điều này, trên Host 1, người ta thực hiện “ping” đến Host 2:
C:\>ping 10.1.3.2 <- Địa chỉ IP của Host 2 |
Ứng dụng Ping trên Host 1 lúc này sẽ thực hiện xây dựng các gói ICMP Echo và gửi các gói này đến địa chỉ IP của Host 2. Nếu Host 2 nhận được các gói ICMP Echo do Host 1 gửi, nó sẽ thực hiện phản hồi về cho Host 1 các gói ICMP Echo Reply (cứ mỗi gói Echo được phản hồi bằng một gói Echo Reply). Khi Host 1 nhận được các gói Echo Reply trả về từ Host 2, nó kết luận được rằng nó và Host 2 có thể đi đến nhau được. Ngược lại, nếu sau một khoảng thời gian timeout (thường là 2000 ms) mà Host 1 không nhận được phản hồi nào từ Host 2, nó sẽ kết luận rằng nó và Host 2 không đi đến nhau được và thông báo kết quả này đến người quản trị. Người quản trị biết được rằng Host 1 và Host 2 bị gián đoạn kết nối IP sẽ tiến hành các thao tác tìm lỗi để khắc phục vấn đề này.
Tùy thuộc vào hệ điều hành mà số lượng các gói Echo và Echo Reply trao đổi giữa hai host có thể khác nhau. Ví dụ, nếu chạy hệ điều hành Windows, Host 1 sẽ gửi đi 4 gói Echo và được phản hồi về 4 gói Echo – reply khi ping thành công:
C:\>ping 10.1.3.2
Pinging 10.1.3.2 with 32 bytes of data:
Reply from 10.1.3.2: bytes=32 time=82ms TTL=61
Reply from 10.1.3.2: bytes=32 time=91ms TTL=61
Reply from 10.1.3.2: bytes=32 time=92ms TTL=61
Reply from 10.1.3.2: bytes=32 time=77ms TTL=61
Ping statistics for 10.1.3.2:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 77ms, Maximum = 92ms, Average = 85ms
|
Với Cisco IOS, thiết bị thực hiện ping sẽ gửi đi 5 gói và nhận về 5 gói reply nếu ping thành công. Trên CLI của Cisco IOS, kết quả ping thành công được thể hiện bằng các kí tự "!":
R1#ping 10.1.3.2 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 10.1.3.2, timeout is 2 seconds: !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 100/128/160 ms |
Nếu host thực hiện ping không nhận được phản hồi nào cho các gói Echo mà nó đã gửi đi, kết quả ping sẽ được thể hiện như sau với hệ điều hành Windows:
C:\>ping 10.1.3.2
Pinging 10.1.3.2 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.
Ping statistics for 10.1.3.2:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
|
Trên Cisco IOS, ping không thành công do không nhận được phản hồi sẽ được thể hiện bằng các dấu ".":
R1#ping 10.1.3.2 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 10.1.3.2, timeout is 2 seconds: ..... Success rate is 0 percent (0/5) |
2. Thông điệp "Destination Host Unreachable"
Tiếp tục với ví dụ trên, ta có thể gặp tình huống như sau: các gói do Host 1 gửi cho Host 2, trên đường đi sẽ bị một router nào đó nằm dọc theo lộ tuyến loại bỏ (drop) vì router này không có thông tin định tuyến cho Destination IP của các gói tin. Khi điều này xảy ra, router drop gói sẽ báo về cho Host 1 một thông điệp ICMP Destination Host Unreachable (Type 3, Code 0) để người quản trị trên Host 1 biết được rằng các gói do Host 1 phát đi đã bị router này loại bỏ do nó không có thông tin định tuyến. Quá trình này được thể hiện trong hình 3:

Hình 3 – Router loại bỏ (drop) gói vì không có thông tin định tuyến.
Trong ví dụ của hình 3:
- Host 1 thực hiện ping Host 2. Khi lệnh "ping" được thi hành, Host 1 gửi đi các thông điệp ICMP Echo trong các gói tin IP với source IP là địa chỉ của Host 1 – 10.1.1.2 và destination IP là địa chỉ của Host 2 – 10.1.3.2.
- Trong ví dụ này, router R2 nằm trên đường di chuyển của các gói ICMP Echo vừa nêu; khi R2 nhận được các gói tin này, nó thực hiện tra cứu thông tin định tuyến cho đích đến 10.1.3.2 nhưng không có được thông tin định tuyến cho địa chỉ này; R2 thực hiện drop bỏ các gói ICMP Echo mà nó nhận được.
- Sau khi drop bỏ các gói tin của Host 1, R2 gửi về cho Host 1 các thông điệp ICMP Destination Host Unreachable để thông báo cho Host 1 biết về hành động drop gói của nó. Các thông điệp ICMP này sẽ được đóng vào các gói IP với source IP là địa chỉ của router (trong ví dụ này là 10.1.12.2) và destination IP là địa chỉ của Host 1 (10.1.1.2).
Kết quả ping của Host 1 trong trường hợp này hiển thị như sau:
C:\>ping 10.1.3.2
Pinging 10.1.3.2 with 32 bytes of data:
Reply from 10.1.12.2: Destination host unreachable.
Reply from 10.1.12.2: Destination host unreachable.
Reply from 10.1.12.2: Destination host unreachable.
Reply from 10.1.12.2: Destination host unreachable.
Ping statistics for 10.1.3.2:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
|
Ta thấy, kết quả ping chỉ rõ, thông điệp ICMP phản hồi mà Host 1 nhận được là dạng "Destination host unreachable", do router tại địa chỉ 10.1.12.2 trả về. Dựa vào kết quả này, ta có thể biết được router nào trên lộ trình của gói tin bị thiếu thông tin định tuyến cho đích đến 10.1.3.2 để từ đó tiến hành khắc phục sự cố.
Với Cisco IOS, kết quả phản hồi "Destination host unreachable" sẽ được biểu thị bởi kí tự "U" trong kết quả ping:
R1#ping 10.1.3.2 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 10.1.3.2, timeout is 2 seconds: UUUUU Success rate is 0 percent (0/5) |
3. Thông điệp "Time – exceeded"
Routing loop
Chúng ta cùng quan sát một ví dụ (hình 4).
Trong ví dụ này, người quản trị muốn cấu hình trên hai router R1 và R2 một static route để đi đến mạng 192.168.10.0/24. Tuy nhiên, như trên hình vẽ thể hiện, static route trên router R2 đã bị cấu hình sai next – hop IP: thay vì chỉ ra next – hop IP là địa chỉ IP của router R3 (192.168.23.3) thì người quản trị lại cấu hình giá trị này thành địa chỉ IP của R1 (192.168.12.1).

Hình 4 – Cấu hình sai Next – hop IP trên router R2.
Với cấu hình static route như vừa nêu, bảng định tuyến của hai router sẽ cập nhật đường đi (route) đến mạng 192.168.10.0/24 như trên hình 5:

Hình 5 – Route 192.168.10.0/24 trong bảng định tuyến của R1 và R2.
Trong đó:
- Bảng định tuyến của R1 chỉ ra rằng: để đi đến mạng 192.168.10.0/24, từ R1 cần đi đến router kế tiếp có địa chỉ là 192.168.12.2 (R2) để R2 dẫn đường đi tiếp.
- Bảng định tuyến của R2 chỉ ra rằng: để đi đến mạng 192.168.10.0/24, từ R2 cần đi đến router kế tiếp có địa chỉ là 192.168.12.1 (R1) để R1 dẫn đường đi tiếp.
Với bảng định tuyến được cập nhật như vậy, hiện tượng dữ liệu bị chạy vòng trên mạng (loop) sẽ xảy ra. Để làm rõ điều này, chúng ta cùng xem xét quá trình Host 1 gửi dữ liệu đến một địa chỉ nào đó thuộc mạng 192.168.10.0/24, ví dụ: gửi đến 192.168.10.1 (hình 6). Quá trình này diễn ra như sau:
- Host 1 sẽ chuyển dữ liệu này (với destination IP là 192.168.10.1) lên default – gateway của nó là R1 để xử lý, vì với Host 1, dữ liệu này được gửi đến một IP khác mạng và nó không thể tự xử lý được. Căn cứ vào bảng định tuyến đã được cập nhật như trên hình 5, R1 sau khi tra cứu đường đi cho destination IP 192.168.10.1 sẽ chuyển toàn bộ lưu lượng này đến router kế tiếp là R2 (có địa chỉ 192.168.12.2) để R2 thực hiện dẫn đường đi tiếp.
- R2 khi nhận được lưu lượng này, nó thực hiện tra cứu bảng định tuyến cho destination IP 192.168.10.1, và với bảng định tuyến đã được cập nhật như ở trên, R2 sẽ dẫn toàn bộ lưu lượng này quay ngược về R1 (có địa chỉ IP là 192.168.12.1).
- R1 đến lượt nó, khi nhận được lưu lượng đi 192.168.10.1 quay về từ R2, thực hiện tra cứu định tuyến, lại dẫn lưu lượng này đi đến R2, rồi sau đó, R2 lại thực hiện tra cứu định tuyến và dẫn lưu lượng này về lại R1,...
Cứ như thế, lưu lượng này sẽ chạy vòng liên tục giữa R1 và R2 không bao giờ ngừng lại, ta nói hiện tượng loop trong định tuyến (routing loop) đã xảy ra.

Hình 6 – Loop xảy ra trên hệ thống.
Routing loop là một lỗi nguy hiểm trên hệ thống mạng, dẫn đến mất kết nối và khiến cho các thiết bị mạng có thể bị treo vì quá tải. Vì vậy, khi lỗi này xảy ra, người quản trị cần phải gấp rút tìm cho được nguyên nhân gây ra lỗi (như trong ví dụ này là cấu hình sai giá trị "next – hop IP" trên R2) và nhanh chóng khắc phục. Tuy nhiên, trong nhiều trường hợp, nguyên nhân gây ra routing loop không dễ xác định, đặc biệt là khi hệ thống đang chạy các giải pháp định tuyến phức tạp; và như thế, hệ thống mạng sẽ phải tiếp tục chịu tổn hại do loop gây ra trong quá trình chờ đợi tìm kiếm khắc phục nguyên nhân. Để giảm bớt ảnh hưởng của loop, giao thức IP có một cơ chế ngăn chặn các gói tin IP chạy vòng vĩnh viễn trên mạng: nếu loop xảy ra, các gói IP sẽ chỉ chạy vòng một số lần nhất định sau đó sẽ tự động bị drop bỏ; cơ chế này dựa vào một trường đặc biệt trong IP header của gói tin IP: trường TTL (Time To Live) (hình 7).

Hình 7 – Trường Time To Live (TTL) trong IP header.
Trường Time To Live (TTL)
Trường TTL của IP header có độ dài 8 bit (1 byte), do đó có thể nhận giá trị từ 0 đến 255. Trường TTL được sử dụng theo nguyên tắc như sau: cứ mỗi khi gói tin IP được chuyển từ một cổng sang một cổng khác của router, giá trị TTL của gói tin sẽ được giảm đi 1 đơn vị; và khi giá trị này tiến đến 0, gói IP sẽ bị router drop bỏ. Điều này được thể hiện trên hình 8:

Hình 8 – Router drop gói khi TTL = 0.
Trên ví dụ hình 8:
- Giả sử, khi gói IP đi đến cổng F0/0 của router R1, giá trị TTL của nó bằng 3. Khi R1 chuyển gói này từ cổng F0/0 qua F0/1 để đi tiếp, giá trị TTL của gói bị hạ xuống một đơn vị, chỉ còn là 2.
- R2 thực hiện chuyển gói từ cổng F0/0 của nó sang cổng F0/1 để đi tiếp, lúc này, giá trị TTL của gói sẽ được hạ xuống còn là 1.
- Khi R3 tiếp tục chuyển gói từ cổng F0/0 qua cổng F0/1 của nó, R3 hạ giá trị TTL của gói xuống 1 đơn vị. Lúc này vì TTL bằng 0, gói tin bị router R3 drop bỏ.
Tùy thuộc vào hệ điều hành được sử dụng, gói IP do một host phát ra nó có thể được gán các giá trị TTL ban đầu khác nhau. Ví dụ: các Windows host phát đi gói IP có TTL ban đầu là 255; router Cisco sử dụng Cisco IOS cũng phát đi các gói IP với TTL là 255; một số phiên bản Linux phát đi gói IP với TTL ban đầu là 63 hoặc 127,.v.v...
Ta áp dụng nguyên tắc TTL vừa nêu vào ví dụ về routing loop đã nêu ra ở trên: vì cứ "bước qua" một router là TTL của gói lại bị giảm đi 1 đơn vị, nên luồng dữ liệu với destination IP 192.168.10.1 trong ví dụ trên sẽ không bị loop vĩnh viễn mà sẽ chỉ chạy vòng quanh hai router R1 và R2 cho đến khi TTL của các gói này giảm đến 0 và bị drop bỏ, loop được cắt. Như vậy, nhờ có trường TTL trong IP header mà loop không thể xảy ra vĩnh viễn trên mạng.
Thông điệp ICMP Time – exceeded (Type 11, Code 0)
Khi một router drop gói vì TTL = 0, nó sẽ phát đi một thông điệp ICMP Time – exceeded (Type 11, Code 0) về cho thiết bị đã tạo ra gói IP này để báo hiệu cho thiết bị này được biết gói IP do nó phát ra đã bị drop do hết TTL. Trong ví dụ trên hình 8, khi R3 drop gói vì TTL = 0, R3 thực hiện phát ra thông điệp Time – exceeded về cho host đã phát ra gói này (hình 9):

Hình 9 – Router drop gói phát ra thông điệp ICMP Time – exceeded.
Công cụ Trace
Công cụ Trace cho phép người quản trị có thể xác định được địa chỉ IP của các router mà một gói tin IP phải đi ngang qua để có thể đi đến được một đích đến nào đó.
Ví dụ:
C:\>tracert 8.8.8.8 Tracing route to dns.google [8.8.8.8] over a maximum of 30 hops: 1 <1 ms <1 ms <1 ms 192.168.1.1 2 3 ms 1 ms 1 ms 27.71.251.147 3 2 ms 2 ms 8 ms 10.255.39.201 4 10 ms 6 ms 7 ms 27.68.209.197 5 2 ms 1 ms 1 ms 27.68.237.186 6 29 ms 29 ms 29 ms 27.68.250.230 7 29 ms 29 ms 29 ms 172.253.77.227 8 29 ms 29 ms 29 ms 72.14.234.177 9 33 ms 32 ms 32 ms dns.google [8.8.8.8] Trace complete. |
Trong ví dụ ở trên, người quản trị thực hiện chạy công cụ Trace trên hệ điều hành Windows bằng cách sử dụng lệnh "tracert 8.8.8.8" trong cửa sổ CMD. Kết quả thi hành công cụ Trace cho biết từ host đang xét, các gói tin IP sẽ phải đi qua những router nào để có thể đến được địa chỉ 8.8.8.8 trên Internet (là DNS server của Google). Ta thấy, để đi đến được địa chỉ 8.8.8.8 từ host này, gói tin cần phải đi qua 8 router với các địa chỉ IP lần lượt là 192.168.1.1, 27.71.251.147, 10.255.39.201,..., 72.14.234.177.
Như vậy, với công cụ Trace, người quản trị có thể nắm được lộ trình di chuyển của các gói tin trên mạng để đi đến một đích đến nào đó. Đây là một công cụ rất quan trọng trong hoạt động vận hành và xử lý sự cố trên các hệ thống mạng.
Nguyên lý của Trace
Công cụ Trace hoạt động bằng cách sử dụng trường TTL (Time – to – live) trong IP header của gói tin IP và thông điệp ICMP Time Exceeded của giao thức ICMP. Để mô tả nguyên lý của Trace, chúng ta cùng xem xét một ví dụ (hình 10):

Hình 10 – Ví dụ về Trace.
Trong ví dụ này, Host 1 thực hiện trace đến địa chỉ của Host 2 để xác định xem từ nó đi đến Host 2 cần phải đi qua các thiết bị trung gian (router) nào. Trên cửa sổ CMD của Host 1 (giả thiết Host 1 chạy hệ điều hành Windows), người quản trị gõ lệnh "tracert 192.168.3.2", với "192.168.3.2" là địa chỉ của Host 2. Sau khi lệnh được thực thi, Trace sẽ hoạt động như mô tả dưới đây.
Đầu tiên, Trace thực hiện phát đi một gói tin đến địa chỉ đích 192.168.3.2 nhưng trường TTL của gói tin này chỉ được thiết lập giá trị là 1 (hình 11):

Hình 11 – Trace phát đi gói tin với TTL = 1.
Như được mô tả trên hình 11, gói tin này sẽ được router R1 chuyển tiếp từ cổng F0/0 qua cổng F0/1 để đi tiếp đến 192.168.3.2; tuy nhiên, vì lúc này TTL bị hạ xuống 1 đơn vị khi gói đi từ cổng này sang cổng kia của router, nên TTL chỉ còn bằng 0. Router R1 thực hiện drop bỏ gói tin và gửi về cho Host 1 một thông điệp ICMP Time Exceeded. Khi Host 1 nhận được thông điệp ICMP do R1 trả về, nó biết được địa chỉ của router đầu tiên trên lộ trình và hiển thị địa chỉ IP của R1 lên kết quả trace: 192.168.1.1.
Tiếp theo, sau khi đã xác định được địa chỉ của router đầu tiên trên lộ trình, Host 1 tiếp tục phát đi một gói tin đi đến 192.168.3.2 nhưng TTL lần này được thiết lập là 2 (hình 12):

Hình 12 – Trace phát đi gói tin với TTL = 2.
Như được mô tả trên hình 12, gói tin này sau khi đi qua R1 thì TTL giảm xuống còn 1, sau đó đi qua tiếp R2 thì TTL còn bằng 0. R2 thực hiện drop gói vì hết TTL và phản hồi về cho Host 1 một thông điệp ICMP Time Exceeded. Khi Host 1 nhận được thông điệp ICMP trả về từ R2, Host 1 ghi nhận được địa chỉ IP của router thứ 2 trên đường đi đến đích: 192.168.12.2.
Quá trình lại tiếp tục như trên, Host 1 sau khi xác định được router thứ 2 thì tiếp tục phát đi gói tin đến địa chỉ đích 192.168.3.2 với TTL lần này được nâng lên thành 3 (hình 13):

Hình 13 – Trace phát đi gói với TTL = 3.
Tương tự như trên, lần này router R3 sẽ thực hiện drop gói và trả về thông điệp ICMP Time Exceeded. Căn cứ vào đó, Host 1 xác định được thiết bị thứ 3 trên đường đi đến đích (địa chỉ là 192.168.23.3).
Cuối cùng, Host 1 sẽ phát đi gói với TTL = 4, gói này sẽ không bị hết TTL mà đi đến được đích đến của nó là Host 2. Khi Host 2 nhận được gói tin gửi đến từ Host 1, nó sẽ phản hồi thông tin về cho Host 1. Lúc này, khi Host 1 nhận được trả lời từ Host 2, công cụ Trace trên Host 1 biết được rằng quá trình Trace đã kết thúc, toàn bộ lộ trình đã được xác định và được hiển thị cho người quản trị:
C:\>tracert 192.168.3.2 Tracing route to 192.168.3.2 over a maximum of 30 hops: 1 13 ms 11 ms 13 ms 192.168.1.1 2 44 ms 43 ms 39 ms 192.168.12.2 3 73 ms 74 ms 72 ms 192.168.23.3 4 88 ms 88 ms 88 ms 192.168.3.2 Trace complete. |
Trong các ví dụ đã nêu ở trên, chúng ta sử dụng công cụ Trace của hệ điều hành Windows. Như đã thấy, trên Windows, Trace được bật lên bằng lệnh "tracert". Với các hệ điều hành khác, lệnh để chạy Trace sẽ là một lệnh khác; ví dụ, với Cisco IOS, lệnh bật Trace là "Router#traceroute địa_chỉ_IP":
R1#traceroute 192.168.3.2 Type escape sequence to abort. Tracing the route to 192.168.3.2 1 192.168.12.2 32 msec 32 msec 32 msec 2 192.168.23.3 64 msec 60 msec 60 msec 3 192.168.3.2 76 msec 56 msec 68 msec |
Dù sử dụng lệnh nào thì nguyên lý của công cụ Trace tích hợp trên các hệ điều hành đều giống như đã mô tả ở trên: sử dụng trường TTL trong IP header và thông điệp ICMP Time Exceeded.