Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 29 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
29
Dung lượng
762,5 KB
Nội dung
LẬP TRÌNH MẠNG NÂNG CAO
ICMP PROTOCOL
Nguyễn Vũ – IT Faculty, Viet Han Friendship
1
ICMP protocol
Giới thiệu về giao thức ICMP (Internetwork Control Message
Protocol)
Hoạt động ở layer 2 – Internetwork trong mô hình TCP/IP
hoặc layer 3 – Network trong mô hình OSI
Cho phép kiểm tra và xác định lỗi của layer 2 trong mô hình
TCP/IP bằng cách định nghĩa ra các loại thông điệp có thể
sử dụng để xác định xem mạng hiện tại có thể truyền được
gói tin hay không?
ICMP cần các thành phần của mọi gói tin IP để có thể hoạt
động được
Mục đích của ICMP: Thỉnh thoảng một gateway hoặc một
máy đích sẽ liên lạc với máy nguồn để đưa ra những thông
điệp lỗi về tiến trình xử lý các gói tin.
ICMP sử dụng với một mục đích đơn giản là hỗ trợ cho sự
hoạt động của giao thức IP
Nguyễn Vũ – IT Faculty, Viet Han Friendship
2
ICMP protocol
Giới thiệu về giao thức ICMP (Internetwork Control
Message Protocol)
Nguyễn Vũ – IT Faculty, Viet Han Friendship
3
ICMP protocol
Giới thiệu về giao thức ICMP (Internetwork Control
Message Protocol)
Cấu trúc của gói tin IP và ICMP
Nguyễn Vũ – IT Faculty, Viet Han Friendship
4
ICMP protocol
Giới thiệu về giao thức ICMP (Internetwork Control Message
Protocol)
Cấu trúc của gói tin IP và ICMP
Type: dài 1 byte định nghĩa kiểu thông điệp ICMP trong gói tin
Code: dài 1 byte định nghĩa thêm về kiểu, xác định đây là một
query hay một lỗi
Checksum: dài 2 byte cho biết gói ICMP không bị sai lạc
thông tin. Checksum được tính toán trên phần ICMP của gói
dùng thuật toán được định nghĩa trong RFC 792
Messeage: gồm nhiều byte có nội dung phù hợp với kiểu
thông điệp ICMP. Thường có chứa 2 trường là số Identifier và
Sequence dùng để xác định duy nhất gói ICMP packet đến
host.
Nguyễn Vũ – IT Faculty, Viet Han Friendship
5
ICMP protocol
The ICMP Packet Types:
Type Code
Description
0
Echo reply
3
Destination unreachable
4
Source quench
5
Redirect
8
Echo request
11
Time exceeded
12
Parameter problem
13
Timestamp request
14
Timestamp reply
15
Information request
16
Information reply
Nguyễn Vũ – IT Faculty, Viet Han Friendship
6
ICMP protocol
Sử dụng Raw socket:
Gói tin ICMP không sử dụng TCP hoặc UDP nên
chúng ta không thể sử dụng lớp hỗ trợ TcpClient
hay UdpClient mà sử dụng một Raw Socket.
Muốn sử dụng Raw Socket khi tạo ra Socket ta sử
dụng SocketType.Raw và giao thức là ICMP
Trong C# để tạo Raw socket ta dùng cú pháp sau:
Socket newSocket= new
Socket(AddressFamily.InterNetwork,
SocketType.Raw, ProtocolType.Icmp);
Nguyễn Vũ – IT Faculty, Viet Han Friendship
7
ICMP protocol
Gửi gói tin Raw socket:
Là giao thức không hướng kết nối, không cần bind socket
đến cổng cục bộ để gởi gói tin hoặc dùng phương thức
Connect() để nối nó với host cụ thể ở xa
Sử dụng phương thức SendTo() của lớp Socket để gửi.
Cổng trong giao thức ICMP không quan trọng
Socket newsock= new Socket(AddressFamily.InterNetwork,
SocketType.Raw, ProtocolType.Icmp);
IPEndPoint iep = new
IPEndPoint(IPAddress.Parse("192.168.1.2"), 0);
newsock.SendTo(packet,iep);
Nguyễn Vũ – IT Faculty, Viet Han Friendship
8
ICMP protocol
Gửi gói tin Raw socket:
Chú ý: Vì raw socket không format dữ liệu nên
mảng byte sẽ truyền “đúng y” đến host ở xa. Do
đó bạn phải tạo thủ công gói ICMP thành mảng
byte rồi mới gởi. Nếu có lỗi bạn sẽ không có gói
ICMP trả về.
Nguyễn Vũ – IT Faculty, Viet Han Friendship
9
ICMP protocol
Nhận gói tin Raw socket:
Dữ liệu nhận được từ raw socket phức tạp hơn, ta
phải dùng phương thức ReceiveFrom().
Raw socket không xác định giao thức tầng trên,
dữ liệu trả về của phương thức ReceiveFrom()
chứa toàn bộ nội dung gói IP.
Chú ý: Vì phương thức ReceiveFrom() cho toàn
bộ gói IP, ta phải khai báo kích thước buffer nhận
nhiều hơn dữ liệu chứa bên trong ít nhất là 20
bytes.
Nguyễn Vũ – IT Faculty, Viet Han Friendship
10
ICMP protocol
Tạo lớp ICMP Class
Tạo lớp ICMP Class để dễ dùng trong các ứng dụng mạng
có các gói ICMP.
Cấu tử lớp ICMP Class
Lớp ICMP thường cần có các biến dữ liệu trong bảng sau:
Variable
Size
Type
Type
1 byte
Byte
Code
1 byte
Byte
Checksum
2 bytes
Unsigned 16-bit integer
Message
multibyte Byte array
Nguyễn Vũ – IT Faculty, Viet Han Friendship
11
ICMP protocol
Tạo lớp ICMP Class
Không gán giá trị cho các biến dữ liệu. Bạn sẽ gán giá trị cho
chúng khi thực sự tạo gói ICMP
class ICMP
{
public byte Type;
public byte Code;
public UInt16 Checksum;
public int MessageSize;
public byte[] Message = new byte[1024];
public ICMP()
{
}
}
Nguyễn Vũ – IT Faculty, Viet Han Friendship
12
ICMP protocol
Tạo lớp ICMP Class
Để tạo nên gói ICMP mới, ta khai báo và gán giá trị như sau:
ICMP packet = new ICMP();
packet.Type = 0x08;
packet.Code = 0x00;
packet.Checksum = 0;
Đoạn code trên tạo phần đầu của gói ICMP Echo Request.
Gói Echo Request định nghĩa các trường trong thành phần
thông điệp ICMP (Identifier và Sequence), bạn phải quyết
định xây dựng thành phần này như thế nào. Có 2 cách:
Tạo lớp khác cho trường Echo Request và lấy mảng byte của
lớp.
Chuyển các trường thông điệp riêng thành mảng byte và đặt
chúng vào thành phần dữ liệu.
Nguyễn Vũ – IT Faculty, Viet Han Friendship
13
ICMP protocol
Tạo lớp ICMP Class
Nếu bạn định tạo nhiều gói Echo Request, bạn nên tạo lớp
Ping định nghĩa các trường Echo Request riêng biệt.
Ngược lại bạn làm như sau:
Buffer.BlockCopy(BitConverter.GetBytes((short)1),0,
packet.Message, 0, 2);
Buffer.BlockCopy(BitConverter.GetBytes((short)1), 0,
packet.Message, 2, 2);
byte[] data = Encoding.ASCII.GetBytes("test packet");
Buffer.BlockCopy(data, 0, packet.Message, 4, data.Length);
packet.MessageSize = data.Length + 4;
Các trường Identifier và Sequence cho gói Echo Reply lần
lượt chuyển thành mảng byte và đặt đúng vị trí trong thành
phần thông điệp
Nguyễn Vũ – IT Faculty, Viet Han Friendship
14
ICMP protocol
Xây dựng lại đối tượng ICMP Object
Sau khi gởi gói ICMP, bạn thường sẽ nhận lại gói ICMP của
thiết bị ở xa trả về. Để dễ lấy nội dung của gói đó, bạn nên
tạo lớp ICMP khởi dựng khác để lấy mảng byte ICMP và
đặt giá trị vào thành phần dữ liệu phù hợp trong lớp :
public ICMP(byte[] data, int size)
{
Type = data[20];
Code = data[21];
Checksum = BitConverter.ToUInt16(data, 22);
MessageSize = size - 24;
Buffer.BlockCopy(data, 24, Message, 0, MessageSize);
}
Nguyễn Vũ – IT Faculty, Viet Han Friendship
15
ICMP protocol
Xây dựng lại đối tượng ICMP Object
Nhớ là raw socket trả về toàn bộ gói IP. Như vậy bạn phải
bỏ qua thông tin IP header trước khi trích thông tin gói
ICMP.
Thành phần Type ở vị trí 20 trong mảng byte. Các thành
phần dữ liệu riêng biệt trong gói ICMP được trích theo từng
byte vào thành phần ICMP phù hợp.
Nguyễn Vũ – IT Faculty, Viet Han Friendship
16
ICMP protocol
Xây dựng lại đối tượng ICMP Object
Sau khi tạo đối tượng ICMP mới với dữ liệu gói nhận được, bạn
có thể xem các thành phần dữ liệu riêng biệt:
int recv = ReceiveFrom(data, ref ep);
ICMP response = new ICMP(data, recv);
Console.WriteLine("Received ICMP packet:");
Console.WriteLine(" Type {0}", response.Type);
Console.WriteLine(" Code: {0}", response.Code);
Int16 Identifier = BitConverter.ToInt16(response.Message, 0);
Int16 Sequence = BitConverter.ToInt16(response.Message, 2);
Console.WriteLine(" Identifier: {0}", Identifier);
Console.WriteLine(" Sequence: {0}", Sequence);
stringData = Encoding.ASCII.GetString(response.Message, 4,
response.MessageSize - 4);
Console.WriteLine(" data: {0}", stringData);
Nguyễn Vũ – IT Faculty, Viet Han Friendship
17
ICMP protocol
Xây dựng lại đối tượng ICMP Object
Nhận được 2 thành phần dữ liệu đầu trong gói ICMP nhận là dễ.
Trích các trường dữ liệu trong thành phần thông điệp hơi khó
hơn.
Vì 2 bytes đầu tạo trường số nguyên không dấu Identifier và 2
bytes thứ hai là trường số nguyên không dấu Sequence, bạn có
thể dùng lớp BitConverter để gán các giá trị đó.
Phần còn lại của thành phần thông điệp được gán cho trường
Message của gói Echo Reply packet.
Từ đoạn code này, bạn dễ thấy vì sao thành MessageSize được
thêm vào lớp ICMP. Nếu không có nó, sẽ khó xây dựng lại thành
phần Message từ gói nhận được.
Nguyễn Vũ – IT Faculty, Viet Han Friendship
18
ICMP protocol
The ICMP Packet Creator
Sau khi đối tượng ICMP mới được tạo ra và các thành phần dữ
liệu gói được xác định, bạn muốn gởi gói đến thiết bị ở xa. Bạn
không thể gởi đối tượng ICMP bằng phương thức SendTo(); cần
chuyển nó thành mảng byte.
Cách dễ nhất để gởi đối tượng phức tạp qua mạng là tạo phương
thức chuyển mỗi thành phần dữ liệu thành mảng byte và nối các
mảng lại thành mảng byte lớn hơn dùng phương thức
Buffer.BlockCopy():
Nguyễn Vũ – IT Faculty, Viet Han Friendship
19
ICMP protocol
The ICMP Packet Creator
public byte[] getBytes()
{
byte[] data = new byte[MessageSize + 9];
Buffer.BlockCopy(BitConverter.GetBytes(Type), 0, data, 0, 1);
Buffer.BlockCopy(BitConverter.GetBytes(Code), 0, data, 1, 1);
Buffer.BlockCopy(BitConverter.GetBytes(Checksum), 0, data, 2, 2);
Buffer.BlockCopy(Message, 0, data, 4, MessageSize);
return data;
}
Nguyễn Vũ – IT Faculty, Viet Han Friendship
20
ICMP protocol
The ICMP Packet Creator
Khi tất cả các thành phần dữ liệu được chuyển thành mảng
byte có đúng dạng gói ICMP có thể nó đến thiết bị mạng ở
xa:
IPEndPoint iep = new
IPEndPoint(IPAddress.Parse("192.168.1.2"), 0);
sock.SendTo(packet.getBytes(), iep);
Chú ý: Giá trị Identifier và Sequence không được chuyển
thành byte trước khi đưa vào mảng vì thiết bị mạng ở xa sẽ
trả về cho bạn gói y hệt.
Nguyễn Vũ – IT Faculty, Viet Han Friendship
21
ICMP protocol
Phương pháp tính ICMP Checksum
Đây là phần khó nhất khi tạo ra gói ICMP packet. Cách làm
là tạo phương thức tự chứa tính checksum và đưa vào lớp
ICMP phục vụ cho ứng dụng ICMP.
Có vài ví dụ tính checksum, sau đây là ví dụ:
Nguyễn Vũ – IT Faculty, Viet Han Friendship
22
ICMP protocol
Phương pháp tính ICMP Checksum
public UInt16 getChecksum()
{
UInt32 chcksm = 0;
byte[] data = getBytes();
int packetsize = MessageSize + 8;
int index = 0;
while ( index < packetsize)
{
chcksm += Convert.ToUInt32(BitConverter.ToUInt16(data, index));
index += 2;
}
chcksm = (chcksm >> 16) + (chcksm & 0xffff);
chcksm += (chcksm >> 16);
return (UInt16)(~chcksm);
}
Nguyễn Vũ – IT Faculty, Viet Han Friendship
23
ICMP protocol
Phương pháp tính ICMP Checksum
Đầu tiên gán đầy giá trị tất cả thành phần dữ liệu, đặt thành
phần Checksum thành zero. Sau đó, gọi phương thức
getChecksum() để tính checksum của gói ICMP, đặt kết quả
vào thành phần Checksum của gói:
packet.Checksum = 0;
packet.Checksum = packet.getChecksum();
Sau khi tính xong Checksum gởi gói đi sử dụng phương
thức SendTo().
Chú ý: Khi nhận gói ICMP bạn phải lấy giá trị Checksum và
so sánh với giá trị đã tính cho gói. Nếu 2 giá trị không so
khớp, đã có lỗi và cần truyền lại gói.
Nguyễn Vũ – IT Faculty, Viet Han Friendship
24
ICMP protocol
Sau đây là chương trình ICMP.cs đầy đủ:
Nguyễn Vũ – IT Faculty, Viet Han Friendship
25
ICMP protocol
A Simple Ping Program :
Ping là công cụ căn bản, quan trọng cho biết thiết bị có kết
nối mạng không. Nó dùng gói ICMP Echo Request (Type 8)
để gởi đến host ở xa. Host ở xa nhận thông điệp, trả lời
bằng gói ICMP Echo Reply (Type 0), có chứa thông điệp
ban đầu:
Nguyễn Vũ – IT Faculty, Viet Han Friendship
26
ICMP protocol
Chương trình ICMPPing:
Chương trình SimplePing có một số hạn chế:
Địa chỉ đích phải gõ dạng IP
Chỉ có gởi và nhận được 1 thông điệp ping.
Không quy định kích thước dữ liệu ping
Thời gian thực hiện lệnh ping không được ghi lại.
Để khắc phục, ta viết chương trình AdvPing.cs cho phép
người dùng gõ vào địa chỉ IP hoặc hostnames trong hộp
text, dùng phương thức Dns.Resolve()
Nguyễn Vũ – IT Faculty, Viet Han Friendship
27
ICMP protocol
An Advanced Ping Program
Phương thức Dns.Resolve() sẽ trả về mảng IPHostEntry.
Mảng IPHostEntry chứa tất cả các địa chỉ IP liên kết với
hostname hoặc IP:
IPHostEntry iphe = Dns.Resolve(hostbox.Text);
IPEndPoint iep = new IPEndPoint(iphe.AddressList[0], 0);
Để cho phép nhiều gói ping, AdvPing dùng luồng (Thread)
riêng để quản lý chức năng ping thực sự. Khi người dùng kích
nút Start sẽ sinh ra 1 luồng mới. Luồng mới chứa vòng lặp
ping liên tục đến host ở xa cho đến khi luồng hủy bỏ. Do đó,
giao diện người dùng gồm có 1 nút lệnh để người dùng kích
vào kết thúc ping.
Mỗi gói ping ICMP gởi đi được gán 1 số Sequence liên tiếp
nhau nhằm chỉ các gói ping riêng biệt. Vì số Sequence cho
mỗi gói thay đổi giá trị ICMP checksum cần tính lại cho mỗi
gói.
Nguyễn Vũ – IT Faculty, Viet Han Friendship
28
ICMP protocol
Chương trình Advanced Ping:
Nguyễn Vũ – IT Faculty, Viet Han Friendship
29
[...]... text, dùng phương thức Dns.Resolve() Nguyễn Vũ – IT Faculty, Viet Han Friendship 27 ICMP protocol An Advanced Ping Program Phương thức Dns.Resolve() sẽ trả về mảng IPHostEntry Mảng IPHostEntry chứa tất cả các địa chỉ IP liên kết với hostname hoặc IP: IPHostEntry iphe = Dns.Resolve(hostbox.Text); IPEndPoint iep = new IPEndPoint(iphe.AddressList[0], 0); Để cho phép nhiều gói ping, AdvPing dùng luồng... – IT Faculty, Viet Han Friendship 26 ICMP protocol Chương trình ICMPPing: Chương trình SimplePing có một số hạn chế: Địa chỉ đích phải gõ dạng IP Chỉ có gởi và nhận được 1 thông điệp ping Không quy định kích thước dữ liệu ping Thời gian thực hiện lệnh ping không được ghi lại Để khắc phục, ta viết chương trình AdvPing.cs cho phép người dùng gõ vào địa chỉ IP hoặc hostnames trong hộp text,... Viet Han Friendship 20 ICMP protocol The ICMP Packet Creator Khi tất cả các thành phần dữ liệu được chuyển thành mảng byte có đúng dạng gói ICMP có thể nó đến thiết bị mạng ở xa: IPEndPoint iep = new IPEndPoint(IPAddress.Parse("192.168.1.2"), 0); sock.SendTo(packet.getBytes(), iep); Chú ý: Giá trị Identifier và Sequence không được chuyển thành byte trước khi đưa vào mảng vì thiết bị mạng ở xa sẽ... data[20]; Code = data[21]; Checksum = BitConverter.ToUInt16(data, 22); MessageSize = size - 24; Buffer.BlockCopy(data, 24, Message, 0, MessageSize); } Nguyễn Vũ – IT Faculty, Viet Han Friendship 15 ICMP protocol Xây dựng lại đối tượng ICMP Object Nhớ là raw socket trả về toàn bộ gói IP Như vậy bạn phải bỏ qua thông tin IP header trước khi trích thông tin gói ICMP Thành phần Type ở vị trí 20 trong mảng... trị không so khớp, đã có lỗi và cần truyền lại gói Nguyễn Vũ – IT Faculty, Viet Han Friendship 24 ICMP protocol Sau đây là chương trình ICMP.cs đầy đủ: Nguyễn Vũ – IT Faculty, Viet Han Friendship 25 ICMP protocol A Simple Ping Program : Ping là công cụ căn bản, quan trọng cho biết thiết bị có kết nối mạng không Nó dùng gói ICMP Echo Request (Type 8) để gởi đến host ở xa Host ở xa nhận thông điệp,... Tạo lớp ICMP Class Tạo lớp ICMP Class để dễ dùng trong các ứng dụng mạng có các gói ICMP Cấu tử lớp ICMP Class Lớp ICMP thường cần có các biến dữ liệu trong bảng sau: Variable Size Type Type 1 byte Byte Code 1 byte Byte Checksum 2 bytes Unsigned 16-bit integer Message multibyte Byte array Nguyễn Vũ – IT Faculty, Viet Han Friendship 11 ICMP protocol Tạo lớp ICMP Class Không gán giá trị cho các... nhằm chỉ các gói ping riêng biệt Vì số Sequence cho mỗi gói thay đổi giá trị ICMP checksum cần tính lại cho mỗi gói Nguyễn Vũ – IT Faculty, Viet Han Friendship 28 ICMP protocol Chương trình Advanced Ping: Nguyễn Vũ – IT Faculty, Viet Han Friendship 29 ... Identifier: {0}", Identifier); Console.WriteLine(" Sequence: {0}", Sequence); stringData = Encoding.ASCII.GetString(response.Message, 4, response.MessageSize - 4); Console.WriteLine(" data: {0}", stringData); Nguyễn Vũ – IT Faculty, Viet Han Friendship 17 ICMP protocol Xây dựng lại đối tượng ICMP Object Nhận được 2 thành phần dữ liệu đầu trong gói ICMP nhận là dễ Trích các trường dữ liệu trong thành... cho bạn gói y hệt Nguyễn Vũ – IT Faculty, Viet Han Friendship 21 ICMP protocol Phương pháp tính ICMP Checksum Đây là phần khó nhất khi tạo ra gói ICMP packet Cách làm là tạo phương thức tự chứa tính checksum và đưa vào lớp ICMP phục vụ cho ứng dụng ICMP Có vài ví dụ tính checksum, sau đây là ví dụ: Nguyễn Vũ – IT Faculty, Viet Han Friendship 22 ICMP protocol Phương pháp tính ICMP Checksum public... nhận được Nguyễn Vũ – IT Faculty, Viet Han Friendship 18 ICMP protocol The ICMP Packet Creator Sau khi đối tượng ICMP mới được tạo ra và các thành phần dữ liệu gói được xác định, bạn muốn gởi gói đến thiết bị ở xa Bạn không thể gởi đối tượng ICMP bằng phương thức SendTo(); cần chuyển nó thành mảng byte Cách dễ nhất để gởi đối tượng phức tạp qua mạng là tạo phương thức chuyển mỗi thành phần dữ liệu ... bytes Nguyễn Vũ – IT Faculty, Viet Han Friendship 10 ICMP protocol Tạo lớp ICMP Class Tạo lớp ICMP Class để dễ dùng ứng dụng mạng có gói ICMP Cấu tử lớp ICMP Class Lớp ICMP thường cần có biến... với kiểu thông điệp ICMP Thường có chứa trường số Identifier Sequence dùng để xác định gói ICMP packet đến host Nguyễn Vũ – IT Faculty, Viet Han Friendship ICMP protocol The ICMP Packet Types:... Faculty, Viet Han Friendship ICMP protocol Giới thiệu giao thức ICMP (Internetwork Control Message Protocol) Nguyễn Vũ – IT Faculty, Viet Han Friendship ICMP protocol Giới thiệu giao thức ICMP