Bài giảng Lập trình mạng nâng cao ICMP protocol - Nguyễn Vũ
lượt xem 26
download
Bài giảng Lập trình mạng nâng cao ICMP protocol - Nguyễn Vũ nhằm giới thiệu đến bạn đọc 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. Mời các bạn tham khảo nội dung chi tiết.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Lập trình mạng nâng cao ICMP protocol - Nguyễn Vũ
- 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 16bit 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
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Lập trình C nâng cao: Chương 5 - Trần Minh Thái
22 p | 144 | 18
-
Bài giảng Lập trình mạng nâng cao: Giới thiệu - Nguyễn Xuân Vinh
8 p | 131 | 16
-
Bài giảng Lập trình C nâng cao: Chương 1 - Trần Minh Thái
25 p | 122 | 15
-
Bài giảng Lập trình mạng nâng cao - Nguyễn Vũ
18 p | 106 | 10
-
Bài giảng Lập trình mạng nâng cao - Xử lý sự kiện (Event)
47 p | 120 | 10
-
Bài giảng Lập trình mạng: Chương 3 - ThS. Trần Bá Nhiệm
96 p | 96 | 9
-
Bài giảng Lập trình mạng: Bài 4 - Bùi Trọng Tùng
20 p | 78 | 7
-
Bài giảng Lập trình nâng cao: Danh sách liên kết - Trần Quốc Long
66 p | 63 | 5
-
Bài giảng Lập trình web nâng cao: Chương 3 - Trường ĐH Văn Hiến
26 p | 22 | 5
-
Bài giảng Lập trình nâng cao - Chương 3: Mảng
48 p | 67 | 5
-
Bài giảng Lập trình mạng nâng cao: J2EE architecture - Nguyễn Xuân Vinh
90 p | 64 | 5
-
Bài giảng Lập trình mạng nâng cao: Java Remote Method Invocation - Nguyễn Xuân Vinh
26 p | 66 | 4
-
Bài giảng Lập trình nâng cao: Bài 4+5+6 - Trương Xuân Nam
25 p | 35 | 4
-
Bài giảng Lập trình mạng nâng cao: Web applications - Nguyễn Xuân Vinh
11 p | 55 | 3
-
Bài giảng Lập trình nâng cao: Bài 1 - Trương Xuân Nam
18 p | 28 | 3
-
Bài giảng Lập trình mạng Java: Chương 0 - ThS. Nguyễn Minh Thành
8 p | 74 | 3
-
Bài giảng Lập trình nâng cao (Advanced Programming) - Chương 5. Kiểu mảng và xâu ký tự
16 p | 3 | 2
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn