You are on page 1of 12

BÀI TẬP THỰC HÀNH SỐ 4

MÔN HỌC: NHẬP MÔN MẠNG MÁY TÍNH

GIAO THỨC ICMP VÀ IP
1 Giao thức ICMP
Trong bài thực hành này, chúng ta sẽ khám phá một số phương diện của giao
thức ICMP:

Các thông điệp ICMP tạo bởi chương trình Ping.

Các thông điệp ICMP tạo bởi chương trình Traceroute.

Định dạng và nội dung của một thông điệp ICMP.

Trước khi đi vào chi tiết bài thực hành, sinh viên nên xem lại các kiến thức về
ICMP trong phần 4.4.3 của giáo trình. Bài thực hành này thực hiện trên hệ điều
hành Windows, tuy nhiên SV cũng có thể thực hiện trên hệ điều hành Unix/Linux
với các công cụ được cài đặt tương đương.

1.1 ICMP và Ping
Trong phần này hướng dẫn SV hiểu về giao thức ICMP bằng cách bắt các gói
tin tạo bởi chương trình Ping. Ping là công cụ đơn giản cho phép xác định một
Host còn sống hay không. Ping ở Host nguồn gửi một gói tin tới địa chỉ IP đích.
Nếu Host đích còn sống, chương trình Ping ở Host đích sẽ trả lời bằng cách gửi
một gói tin trở lại Host nguồn. Cả 2 loại gói tin được dùng trong quá trình Ping
này đều là các gói tin ICMP.
Ghi chú rằng nếu bạn không thể chạy Wireshark trên Internet thật sự thì có thể
mở file icmp-ethereal-trace-1 có sẵn trong thư mục wireshark-traces.
Thực hiện các bước sau khi có kết nối Internet:

Mở ứng dụng Command Prompt trong Windows.

Chạy chương trình Wireshark và tiến hành bắt gói tin Wireshark.

 Trong chương trình MS-DOS gõ dòng lệnh: “ping-n 10 hostname”, hoặc
“c:\windows\system32\ping –n 10 hostname”, sau đó gõ Enter.
Trong đó, hostname là một Host ở châu lục khác (chẳng hạn chúng ta đang ở
châu Á thì có thể chọn một Host ở châu Âu như bbc.co.uk). “-n 10” tức là 10 gói
tin ping sẽ được gửi đi.

Khi chương trình Ping kết thúc, dừng quá trình bắt gói tin trong Wireshark.

Sau khi thực hiện các bước trên, cửa sổ Command Prompt sẽ như hình 1. Trong
ví dụ này, chương trình Ping nguồn ở Massachusetts và chương trình Ping đích là
ở Hồng Kông. Từ cửa sổ này chúng ta thấy rằng chương trình Ping ở địa chỉ
nguồn gửi 10 gói tin truy vấn và nhận được 10 gói tin trả lời. Chú ý rằng với mỗi
thông điệp trả lời, chương trình Ping nguồn sẽ tính thời gian của chu trình
(Roundt-Tirp Time – RTT), với 10 gói tin thì thời gian chu trình trung bình vào
khoảng 375 mili-giây.

Hình 1. Cửa sổ Command Prompt sau khi chạy lệnh Ping.
Ở hình 2 là cửa sổ của chương trình Wireshark sau khi lệnh ‘icmp’ được enter
vào cửa sổ hiển thị Filter (cửa sổ cung cấp chức năng lọc gói tin theo từ khóa được
nhập). Chú ý rằng cửa sổ liệt kê 20 gói tin gồm: 10 gói tin truy vấn được gửi bởi
host nguồn và 10 gói tin phản hồi mà host nguồn nhận được. Cũng chú ý thêm
rằng địa chỉ IP nguồn là một địa chỉ tĩnh (đằng sau một NAT) ở định dạng

192.168/12, và địa chỉ IP đích là của Web server ở HKUST. Ở gói tin đầu tiên
trong ví dụ bên dưới thì vùng cửa sổ về nội dung gói tin cung cấp thông tin về gói
tin này. Chúng ta thấy rằng phần địa chỉ IP của gói tin này có giao thức số 01, là số
giao thức của giao thức ICMP. Điều này có nghĩa là Payload của phần địa chỉ IP là
một gói tin ICMP.

Hình 2. Cửa sổ output của Wireshark cho chương trình Ping với thông tin
về giao thức IP được hiển thị.
Ở hình 3 tập trung vào cùng gói tin ICMP nhưng mở hiển thị chi tiết phần thông
tin trong cửa sổ nội dung gói tin. Ta quan sát thấy rằng gói tin ICMP này thuộc

tuýp 8 (Type 8) và Code 0, một dạng gói tin gọi là ICMP ‘Echo Request’ (xem
thêm ở hình 4.23 của giáo trình). Cũng chú ý rằng gói tin ICMP này chứa một
Checksum, một định danh, và một số thứ tự (Sequence Number).

Hình 3. Kết quả việc bắt gói tin Ping với phần thông tin về gói tin ICMP
được hiển thị chi tiết.
Sinh viên cần nộp lại báo cáo với các nội dung sau:
- Hình chụp màn hình cửa sổ Command Prompt tương tự như hình 1 ở trên.
- Trả lời các câu hỏi bên dưới, trong đó với mỗi câu trả lời cần kèm theo một
bản in/hình kết quả hiển thị của (các) gói tin trong truy vết (trace) mà SV sử dụng
để trả lời câu hỏi. Chú thích vào bản in để giải thích về câu trả lời. Để in một gói
tin, vào File -> Print, chọn ‘Selected packet only’, chọn ‘Packet summary line’, và

chọn lượng nhỏ nhất của thông tin chi tiết của gói tin cần dùng để trả lời câu hỏi.
Các câu hỏi SV cần trả lời gồm:
1. Cho biết địa chỉ IP của máy Host mà SV đang dùng? Địa chỉ IP của Host
đích?
2. Tại sao một gói tin ICMP không có số cổng (port number) của Host nguồn và
đích?
3. Xem xét chi tiết một trong số các gói tin Ping Request được gửi bởi Host mà
SV đang dùng: Cho biết thông tin về ICMP Type và các Code Number của nó?
Gói tin ICMP có các trường thông tin nào khác? Các trường thông tin Checksum,
Sequence Number và định danh có bao nhiêu byte?

1.2 ICMP và Traceroute.
Ở phần này sẽ tiến hành bắt các gói tin ICMP tạo bởi chương trình Traceroute.
Traceroute là chương trình được dùng để truy vết/hiển thị đường đi của một gói tin
từ nguồn đến đích (xem thêm ở phần 1.4 và 4.4 trong giáo trình).
Traceroute được hiện thực theo nhiều cách khác nhau trong Unix/Linux/MacOS
và trong Windows. Trong Unix/Linux, Host nguồn gửi một chuỗi các gói tin UDP
tới địa chỉ đích sử dụng số cổng đích (destination port number). Trong Windows,
nguồn gửi một chuỗi các gói tin ICMP tới địa chỉ đích. Trong cả 2 hệ điều hành
này thì chương trình gửi gói tin đầu tiên với TTL=1, gói tin thứ hai với TTL=2,…
Lưu ý rằng Router sẽ giảm giá trị TTL của gói tin một đơn vị khi gói tin đi qua
Router. Khi một gói tin đến một Router với TTL=1, Router sẽ gửi một gói tin
ICMP Error trở lại địa chỉ nguồn. Trong phần tiếp theo, chúng ta sẽ sử dụng
chương trình Tracert của Windows (trong phần thực hành về Wireshark IP sẽ sử
dụng chương trình Pingplotter với các chức năng bổ sung so với Tracert mà chúng
ta sẽ cần dùng đến khi thực hành).
Ghi chú rằng nếu bạn không thể chạy Wireshark trên Internet thật sự thì có thể
mở file icmp-ethereal-trace-2 có sẵn trong thư mục wireshark-traces.
Tiến hành các bước khi có kết nối Internet:

Mở chương trình Command Prompt.

Mở chương trình Wireshark, tiến hành bắt gói tin.

 Gõ lệnh “tracert hostname”, hoặc “c:\windows\system32\tracert hostname”
trong cửa sổ dòng lệnh MS-DOS, trong đó hostname là một host nằm ở châu lục

khác. Chẳng hạn, SV có thể gõ www.inria.fr cho một Web server ở INRIA (một
viện nghiên cứu ở Pháp). Sau đó chạy Traceroute bằng cách gõ enter.

Khi Traceroute kết thúc, ngưng việc bắt gói tin trong Wireshark.

Sau khi chạy Traceroute thì cửa sổ Command Prompt tương tự như hình 4.
Trong hình này, chương trình Traceroute khách là ở Massachusetts và đích đến là
ở Pháp. Từ hình này chúng ta thấy rằng với mỗi giá trị TTL, chương trình nguồn
gửi 3 gói tin tham dò. Traceroute hiển thị RTT cho mỗi gói tin thăm dò, cũng như
địa chỉ IP (có thể có thêm tên) của Router trả về thông điệp ICMP TTL vượt quá
giới hạn (ICMP TTL-exceeded message).

Hình 4. Cửa sổ Command Prompt hiển thị các kết quả của Traceroute.
Ví dụ 5 hiển thị cửa sổ Wireshark cho một gói tin ICMP trả về bởi một Router.
Chú ý rằng gói tin lỗi ICMP (ICMP Error packet) này chứa nhiều trường thông tin
hơn các gói tin Ping ICMP.

Hình 5. Cửa sổ Wireshark với các trường ICMP được mở hiển thị ra cho
một gói tin lỗi ICMP.
SV cần nộp lại các nội dung sau trong bài báo cáo:
- Ở phần thực hành này, SV cần nộp lại hình chụp màn hình của cửa sổ
Command Prompt. Trả lời các câu hỏi sau đây, ở mỗi câu trả lời kèm theo bản in
của (các) gói tin với truy vết (trace) đã sử dụng, và chú thích vào bản in để giải
thích câu trả lời. Để in một gói tin, vào File -> Print,… như hướng dẫn ở phần
trên. Các câu hỏi SV cần trả lời gồm:
5. Cho biết địa chỉ IP của máy tính đang sử dụng? Địa chỉ IP của Host đích?
6. Nếu ICMP gửi các gói tin UDP (như trong Unix/Linux), số của giao thức IP
(IP protocol number) vẫn là 01 có đúng không? Nếu không thì nó sẽ là gì?

7. Xem chi tiết gói tin ICMP Echo trong hình chụp màng hình đã thực hiện, nó
có khác với các gói tin truy vấn ICMP Ping trong phần đầu của bài thực hành này
hay không? Nếu có, hãy giải thích?
8. Xem chi tiết gói tin ICMP Error trong hình chụp màng hình đã thực hiện, nó
có nhiều trường thông tin hơn gói tin ICMP Echo. Những trường thông tin này bao
gồm những gì?
9. Xem chi tiết 3 gói tin ICMP cuối cùng nhận được ở Host nguồn. Những gói
tin này khác với các gói tin ICMP Error như thế nào? Tại sao chúng khác nhau?
10. Trong quá trình đo Tracert, có đường liên kết (link) nào mà có thời gian trễ
dài hơn đáng kể so với các link khác hay không? Xem lại hình 4, có đường liên kết
link nào mà có thời gian trễ dài hơn đáng kể so với các link khác hay không? Căn
cứ vào các tên Router có thể đoán biết được vị trí của 2 Router ở điểm kết thúc ở
link này hay không?

2 Giao thức IP
Trong phần thực hành này sẽ tìm hiểu về giao thức IP, tập trung vào phân tích
gói tin IP. Chúng ta sẽ thực hiện phân tích đường đi của một gói tin IP gửi và nhận
bởi sự thực thi chương trình Traceroute, cũng như tìm hiểu các trường thông tin
khác nhau trong gói tin IP và tìm hiểu về việc phân mảnh IP một cách chi tiết.

2.1 Bắt các gói tin từ việc thực thi Traceroute.
Để tạo một truy vết (trace) của các gói tin IP (IP datagram) trong phần này,
chúng ta sẽ dùng Traceroute để gửi các gói tin có độ dài khác nhau đến một địa chỉ
đích X nào đó. Lưu ý rằng Traceroute thực thi bằng cách trước tiên gửi một hoặc
nhiều gói tin với TTL trong IP header được thiết lập giá trị là 1; tiếp đến gửi một
chuỗi một hoặc nhiều gói tin đến cùng một địa chỉ đích với một TTL có giá trị là
2; sau đó gửi một chuỗi gói tin tương tự với TTL=3,… Cũng lưu ý rằng Router
phải giảm giá trị TTL một đơn vị ở mỗi gói tin nhận được. Nếu TTL bằng 0,
Router trả về một thông điệp ICMP (Type 11 – TTL-exceeded) tới Host gửi. Kết
quả là một gói tin với TTL bằng 1 (gửi bởi Host chạy Traceroute) sẽ khiến Router
kế cận (cách Router hiện tại một Hop tính từ Host gửi) gửi một thông điệp ICMP
TTL-exceeded trở lại nơi gửi; gói tin được gửi với TTL bằng 2 sẽ khiến Router
nằm cách 2 Hop gửi một thông điệp ICMP trở lại nơi gửi; gói tin được gửi với
TTL bằng 3 sẽ khiến Router nằm cách 3 Hop gửi một thông điệp ICMP trở lại nơi
gửi, và cứ như vậy. Trong trường hợp này, Host chạy Traceroute có thể biết được

định danh của các Router giữa nó và địa chỉ đích X bằng cách xem ở các địa chỉ IP
nguồn trong các gói tin chứa các thông điệp ICMP TTL-exceeded.
Thực hiện việc chạy Traceroute để gửi các gói tin có độ dài khác nhau:
 Windows: ở đây chúng ta dùng chương trình (ưu điểm hơn chương trình
Traceroute) là Pingplotter (http://www.pingplotter.com). Tải và cài đặt Pingplotter,
test chương trình bằng cách thực hiện một vài thao tác traceroute tới một vài
Website ưa thích. Kích thước của gói tin ICMP Echo Request có thể được thiết lập
một cách rõ ràng trong Pingplotter bằng cách chọn menu Edit -> Options ->
Packet Options, và sau đó điền vào trường Packet Size. Kích thước mặc định của
tói tin là 56 bytes. Khi Pingplotter gửi một chuỗi các gói tin với giá TTL ngày
càng tăng, nó khởi động lại quá trình gửi với TTL bằng 1, sau khi chờ một khoảng
thời gian Trace Interval. Giá trị của Trace Interval và số lượng các khoảng thời
gian có thể được thiết lập một cách rõ ràng trong Pingplotter.
 Linux/Unix/MacOS: với lệnh traceroute trong Unix/MacOS, kích thước của
gói tin UDP được gửi đến đích và có thể được thiết lập một cách rõ ràng bằng cách
chỉ rõ số byte trong gói tin. Thông tin này được nhập trong dòng lệnh traceroute
ngay sau tên hoặc địa chỉ của Host đích. Ví dụ, gửi các gói tin traceroute 2000
byte đến địa chỉ gaia.cs.umass.edu thì câu lệnh sẽ là:
%traceroute gaia.cs.umass.edu 2000
Ghi chú rằng nếu bạn không thể chạy Wireshark trên Internet thật sự thì có thể
mở file ip-ethereal-trace-1 có sẵn trong thư mục wireshark-traces.
Thực hành các bước sau khi có kết nối Internet:
 Khởi động Wireshark và bắt đầu bắt gói tin (Capture -> Start), nhấn OK
trên màn hình Wireshark Packet Capture Options.
 Nếu bạn đang dùng Windows, khởi động Pingplotter và enter tên của một
đích trong mục “Address to Trace Window”. Gõ vào giá trị 3 trong mục “# of
times to Trace” (để không phải bắt quá nhiều dữ liệu). Chọn menu Edit ->
Advanced Options -> Packet Options và enter một giá trị 56 trong mục “Packet
Size” và nhấn OK. Sau đó nhấn nút Trace. Cửa sổ Pingplotter sẽ tương tự như
hình bên dưới.

Tiếp theo, gửi một tập các gói tin có độ dài lớn hơn bằng cách chọn Edit ->
Advanced Options -> Packet Options và enter một giá trị 2000 trong mục Packet
Size và nhấn OK. Sau đó nhấn nút Resume.
Cuối cùng, gửi một tập các gói tin có độ dài lớn hơn (thực hiện tương tự như
trên) với giá trị 3500 trong Packet Size và nhấn OK. Sau đó nhấn nút Resume.
Dừng quá trình truy vết trên Wireshark.
 Nếu bạn đang dùng Unix hoặc Mac, enter 3 lệnh traceroute, một lệnh với
chiều dài 56 byte, một lệnh với chiều dài 2000 byte, và một lệnh chiều dài 3500
byte.
Dừng truy vết trên Wireshark.

2.2 Xem xét thông tin truy vết thu được.
Trong truy vết thu được, bạn có thể thấy được chuỗi ICMP Echo Request (trong
trường hợp dùng Windows) hay phân mảnh UDP (trong trường hợp dùng Unix)
gửi bởi máy tính của bạn và các thông điệp ICMP TTL-exceeded trở về máy tính
của bạn bởi các Router trung gian. Trong câu hỏi dưới đây, chúng ta giả sử bạn
đang sử dụng Windows, các câu hỏi tương ứng cho trường hợp dùng Unix sẽ được
nêu rõ. Khi trả lời một câu hỏi bên dưới, SV cần nộp một bản in (printout) của các
gói tin đối với truy vết (trace) mà bạn sử dụng để trả lời các câu hỏi. Khi nộp bài
báo cáo, SV cần chú thích vào kết quả output để làm rõ bạn lấy thông tin ở đâu

trong output để dùng cho câu trả lời của bạn. Việc in một gói tin có thể thực hiện
tương tự như đã hướng dẫn ở các phần trên.
1. Chọn gói tin ICMP Echo Request đầu tiên gửi bởi máy tính của bạn, và mở
phần nội dung của phần Internet Protocol của gói tin trong cửa sổ hiển thị chi tiết
về gói tin. Địa chỉ IP của máy đang dùng là gì?
2. Trong Header của gói tin IP, giá trị trong trường thông tin về giao thức lớp
cao hơn là gì?
3. IP Header có bao nhiêu byte? Trong Payload của gói tin IP có bao nhiêu
byte? Giải thích.
4. Gói tin IP có bị phân mảnh không? Giải thích.
Tiếp theo, sắp xếp các gói tin đã theo vết tùy theo địa chỉ IP nguồn bằng cách
click vào header của cột ‘Source’, một mũi tên đổ xuống sẽ xuất hiện kế bên từ
“Source”. Chọn thông điệp ICMP Echo Request gửi bởi máy tính của bạn, và mở
hiển thị mục Internet Protocol trong “details of selected packet header”. Trong cửa
sổ “listing of captured packets”, bạn có thể thấy tất cả các thông điệp ICMP đến
sau nằm bên dưới ICMP đầu tiên này. Dùng mũi tên hướng xuống để di chuyển
các gói tin ICMP gửi bởi máy tính của bạn.
5. Các trường thông tin (field) nào trong gói tin IP luôn thay đổi từ một gói tin
này sang gói tin kế tiếp trong chuỗi các gói ICMP gửi bởi máy tính của bạn?
6. Các trường thông tin nào là không đổi (hằng sô)? Các trường thông tin nào
phải cố định không thay đổi? Các trường thông tin nào phải thay đổi? Tại sao?
7. Mô tả mẫu mà bạn thấy trong các giá trị trong trường thông tin về định danh
của gói tin IP.
8. Giá trị trong trường thông tin định danh và trường về TTL là gì?
9. Có phải các giá trị này vẫn không thay đổi đối với tất cả các gói tin trả lời
ICMP TTL-exceeded gửi đến máy tính của bạn bởi Router gần nhất? Tại sao?
Phân mảnh (Fragmentation)
10. Tìm gói tin ICMP EchoRequest được gửi bới máy tính của bạn sau khi thay
đổi Packet Size trong Pingplotter thành 2000. Có phải gói tin đó được phân mảnh
qua nhiều hơn một gói tin IP?

11. In ra phân mảnh đầu tiên của gói IP đã bị phân mảnh. Thông tin nào trong
IP Header chỉ ra rằng gói tin đã bị phân mảnh? Thông tin nào trong IP Header chỉ
ra rằng liệu đây có phải là phân mảnh đầu tiên hay là các phân mảnh sau? Gói tin
IP này dài bao nhiêu?
12. In ra phân mảnh thứ hai của gói tin IP đã bị phân mảnh. Thông tin nào trong
IP Header chỉ ra rằng nó không phải là phân mảnh đầu tiên? Có các phân mảnh
nào khác nữa không?
13. Những trường thông tin nào thay đổi trong IP Header giữa phân mảnh đầu
tiên và thứ hai?
Bây giờ hãy tìm gói tin ICMP Echo Request đầu tiên được gửi bởi máy tính của
bạn sau khi bạn thay đổi kích thước gói tin trong Pingplotter thành 3500.
14. Có bao nhiêu phân mảnh được tạo ra từ gói tin gốc?
15. Những trường thông tin nào thay đổi trong IP Header giữa các phân mảnh?