Tổng quan về lí thuyết giao thức
Dẫn chương
Trong chương đầu tiên, chúng ta sẽ khám phá lý thuyết về các header của gói tin trong các giao thức UDP, TCP, IP và Ethernet Những kiến thức này được trình bày một cách súc tích và gọn gàng, tạo nền tảng vững chắc cho chương hai, nơi chúng ta sẽ phân tích cách lập trình để bắt nội dung gói tin.
UDP Header
Giao thức User Datagram Protocol (UDP) cung cấp gói tin datagram cho việc giao tiếp giữa các máy tính trong môi trường mạng kết nối UDP hoạt động dựa trên giao thức Internet Protocol (IP) như là giao thức cơ bản, giúp đảm bảo việc truyền tải dữ liệu hiệu quả.
Giao thức này cho phép các chương trình ứng dụng gửi tin nhắn đến nhau với cơ chế giao thức tối thiểu, nhưng không đảm bảo tính bảo vệ bản sao Nó có hướng giao dịch và không đảm bảo truyền tin Đối với những ứng dụng cần phân phối luồng dữ liệu đáng tin cậy, TCP Control Protocol là lựa chọn phù hợp.
Hình 1.1: Các thành phần của header trong gói tin giao thức UDP
Dựa trên hình minh họa 1.1, header của gói tin trong giao thức UDP được phân tích như sau:
STT thành Đặc điểm, chức năng phần phần
Là một trường tùy chọn, khi có ý nghĩa, nó cho biết cổng của quá trình gửi, và có thể
Cổng nguồn 16 bit được giả định là cổng mà một phản hồi sẽ được gửi đến nếu không có thông tin nào khác Nếu không sử dụng, giá trị bằng không sẽ được chèn vào.
16 bits Có ý nghĩa trong ngữ cảnh của một địa chỉ
Port đích đến của Internet cụ thể.
Chiều dài là độ dài theo octet của gói tin
3 Length 16 bits người dùng này bao gồm tiêu đề và dữ liệu này (Điều này có nghĩa là giá trị tối thiểu của chiều dài là tám).
Checksum là phần bổ sung của một phần của tiêu đề giả của thông tin từ tiêu đề IP, phần
4 Checksum 16 bits đầu UDP và dữ liệu, đệm với octet không ở cuối (nếu cần) để tạo ra một bội số của hai octet
Bảng 1.1: Phân tích các thành phần của header trong giao thức UDP
TCP Header
TCP là giao thức tin cậy, định hướng kết nối, được thiết kế nhằm tương thích với hệ thống phân cấp các giao thức, hỗ trợ cho các ứng dụng đa mạng.
TCP đảm bảo giao tiếp đáng tin cậy giữa các quy trình trên các máy chủ khác nhau trong mạng máy tính riêng biệt nhưng liên kết với nhau Giao thức TCP hoạt động với rất ít giả định về độ tin cậy của các giao thức truyền thông ở lớp dưới.
TCP giả định rằng nó có thể nhận được dịch vụ datagram đơn giản và không đáng tin cậy từ các giao thức cấp thấp hơn Nguyên tắc cơ bản của TCP là phải có khả năng đảm bảo truyền tải dữ liệu một cách chính xác và đáng tin cậy.
7 năng hoạt động trên nhiều hệ thống truyền thông khác nhau, từ các kết nối cứng đến các mạng chuyển mạch gói hoặc mạng chuyển mạch.
Các phân đoạn TCP được truyền tải dưới dạng gói tin internet, trong đó tiêu đề Giao thức Internet chứa các trường thông tin quan trọng như địa chỉ nguồn và đích Tiêu đề TCP, nằm ngay sau tiêu đề internet, cung cấp thông tin chi tiết cho giao thức TCP, đồng thời cho phép tồn tại các giao thức lưu trữ khác biệt với TCP.
Hình 1.2: Các thành phần header trong gói tin giao thức TCP
Dựa trên hình minh họa, header của gói tin trong giao thức TCP được phân tích như sau:
Bảng 1.2: Phân tích các thành phần của header trong giao thức TCP Độ
STT Tên thành phần dài Đặc điểm chức năng thành phần
1 Source Port 16 Số cổng nguồn bits
2 Destination Port 16 Số cổng đích bits
Số thứ tự của octet dữ liệu đầu tiên trong phân đoạn này (trừ khi có
3 Sequence number 32 SYN) Nếu SYN có mặt, số thứ tự là số thứ tự ban đầu (ISN) và octet bits dữ liệu đầu tiên là ISN + 1.
Nếu bit điều khiển ACK được thiết
Acknowledgment lập, trường này chứa giá trị của số
32 thứ tự tiếp theo mà người gửi của
4 Number bits phân đoạn này mong đợi nhận.
Một khi kết nối được thiết lập, điều này luôn được gửi.
Số lượng các từ 32 bit trong Tiêu đề TCP, cho biết nơi dữ liệu bắt
5 Data offset 4 bits đầu Tiêu đề TCP (ngay cả một bao gồm các tùy chọn) là một số không tách rời dài 32 bit.
6 Reserved 6 bits Mục đích của nó là để sử dụng cho tương lai, giá trị phải là 0.
URG: Trường con trỏ khẩn cấp
ACK: Xác nhận các trường đáng kể
7 Control bit 6 bits PSH: Chức năng đẩy
RST: Đặt lại kết nối SYN: Đồng bộ hóa số thứ tự
FIN: Không có thêm dữ liệu từ người gửi.
Số lượng octet dữ liệu bắt đầu với
8 Window 16 số được chỉ ra trong trường xác bits nhận mà người gửi của phân đoạn này sẵn sàng chấp nhận.
Trường tổng kiểm tra là một phần bổ sung 16 bit cho tổng số tất cả các từ 16 bit trong tiêu đề và nội dung văn bản Nếu một phân đoạn có số lượng từ lẻ, trường tổng kiểm tra sẽ được áp dụng cho cả phần đầu và phần tử văn bản đang được kiểm tra.
9 Checksum 16 cuối cùng được thêm vào bên phải bits bằng số không để tạo thành một từ
Trong quy trình kiểm tra 16 bit, phần đệm không được truyền đi cùng với đoạn dữ liệu Khi thực hiện tính tổng kiểm tra, trường kiểm tra sẽ được thay thế bằng các số không để đảm bảo tính chính xác của quá trình.
Chiều dài TCP được xác định bằng tổng chiều dài của tiêu đề TCP và độ dài dữ liệu tính bằng octet, không bao gồm 12 octet của tiêu đề giả.
Trường này truyền tải giá trị hiện tại của con trỏ khẩn cấp như là một số dương bù đắp từ số thứ tự
10 điểm khẩn cấp trong đoạn này chỉ ra thứ tự của octet sau dữ liệu khẩn cấp Trường con trỏ khẩn cấp chỉ có ý nghĩa trong các phân đoạn có thiết lập bit điều khiển URG Phần đệm tiêu đề TCP được sử dụng để xác định và xử lý dữ liệu khẩn cấp trong giao thức TCP.
Tùy dụng để đảm bảo rằng tiêu đề TCP
11 Padding kết thúc và dữ liệu bắt đầu trên biến ranh giới 32 bit Phần đệm bao gồm các giá trị 0.
IP Header
Hình 1.3: Minh họa các thành phần của header giao thức IP.
Dựa trên hình minh họa, header của gói tin trong giao thức IP được phân tích như sau:
Bảng 1.3: Phân tích các thành phần của header trong giao thức IP
STT thành Đặc điểm phần phần
Trường Phiên bản chỉ định định dạng
1 Version 4 bits của tiêu đề internet Ví dụ như hiển thị 6 thì giao thức của nó là TCP, hiển thị 17 thì là UDP.
IHL Chiều dài tiêu đề Internet là chiều dài
4 bits của tiêu đề internet bằng các từ 32 bit,
2 và do đó chỉ ra sự bắt đầu của dữ liệu.
Lưu ý rằng giá trị tối thiểu cho một
Length) tiêu đề chính xác là 5
Dịch vụ này cung cấp hướng dẫn về các tham số trừu tượng liên quan đến chất lượng dịch vụ mong muốn Những tham số này sẽ được áp dụng để lựa chọn các tham số dịch vụ thực tế khi truyền tải gói tin qua một mạng lưới cụ thể Một số mạng cung cấp khả năng này nhằm đảm bảo hiệu suất và độ tin cậy trong quá trình truyền tải dữ liệu.
Type of cấp dịch vụ ưu tiên, bằng cách nào đó
3 8 bits xử lý lưu lượng truy cập cao quan
Services trọng hơn các lưu lượng truy cập khác
Trong điều kiện tải cao, thường chỉ chấp nhận lưu lượng truy cập ở một mức độ ưu tiên nhất định Việc lựa chọn tối ưu là một sự cân bằng ba chiều giữa độ trễ thấp, độ tin cậy cao và thông lượng lớn.
Tổng chiều dài là độ dài của datagram, được đo bằng octet, bao gồm tiêu đề internet và dữ liệu.
Trường độ dài tổng cộng 16 bit cho phép gói tin có kích thước tối đa lên tới 65.535 octet Tuy nhiên, việc sử dụng các datagram dài như vậy thường không thực tế cho hầu hết các máy chủ và mạng.
Một giá trị nhận dạng được chỉ định
5 Identification 16 bits bởi người gửi để giúp lắp ráp các mảnh của một gói tin.
Các cờ điều khiển khác nhau.
Bit 0: dự trữ, phải bằng không
6 Flags 3 bits Bit 1: (DF) 0 = Có thể phân mảnh, 1 = Không phân mảnh. Bit 2: (MF) 0 = Đoạn cuối, 1 Các phân đoạn khác.
Trường này cho biết trong datagram
Fragment đoạn này thuộc về datagram Phần bù
7 13 bits đắp được đo bằng đơn vị 8 octet (64
Offset bit) Đoạn đầu tiên đã được bù đắp bằng không.
Trường này xác định thời gian tối đa mà một datagram có thể được chấp nhận trong hệ thống internet Nếu giá trị của trường này là 0, gói tin sẽ bị hủy Trong quá trình xử lý phần đầu internet, trường này có thể được điều chỉnh Thời gian được tính bằng giây, nhưng mỗi mô-đun xử lý có thể ảnh hưởng đến cách thức đo lường này.
TTL (Time to Live) của một gói tin 8 bits phải giảm xuống ít nhất một, ngay cả khi gói tin được xử lý trong vòng chưa đầy một giây TTL được coi như một giới hạn thời gian tối đa mà một datagram có thể tồn tại Mục tiêu của việc này là loại bỏ các gói tin không còn khả năng gửi đi và ràng buộc thời gian sống tối đa của datagram.
Trường này cho biết giao thức mức
9 Protocol 8 bits tiếp theo được sử dụng trong phần dữ liệu của gói tin internet.
Checksum chỉ trên tiêu đề Do một số
Header trường tiêu đề thay đổi (ví dụ: Time to
10 16 bits live), tính năng này được tính lại và
Checksum xác minh tại mỗi điểm mà tiêu đề internet được xử lý.
Phần đệm Internet header được sử
14 Padding Tùy biến dụng để đảm bảo đầu cuối của internet header kết thúc trên ranh giới
32 bit Phần đệm có giá trị 0.
Ethernet Header
Khung Ethernet bắt đầu bằng một dấu phân cách đầu và khung bắt đầu frame (SFD), thuộc lớp vật lý của gói Ethernet Tiêu đề Ethernet chứa địa chỉ MAC đích và nguồn, là hai trường đầu tiên Phần giữa khung là dữ liệu tải trọng, bao gồm các tiêu đề cho các giao thức khác như Giao thức Internet Cuối cùng, khung kết thúc bằng chuỗi kiểm tra khung (FCS), một kiểm tra dự phòng 32 bit dùng để phát hiện lỗi trong quá trình truyền dữ liệu.
Hình 1.4: Minh họa thành phần header giao thức IP.
Tổng quan về kĩ thuật
Dẫn chương
Trong chương hai của bài tiểu luận, chúng ta sẽ khám phá cách áp dụng ngôn ngữ lập trình Python để bắt và phân tích gói tin, nhằm nâng cao khả năng xử lý và hiểu biết về dữ liệu mạng.
Giới thiệu về Python
Phiên bản Python: Python 2.7.12+ [GCC 6.2.0 20160822] on linux2
Bảng 2.1: Các thư viện sử dụng trong chương trình Python.
Mô-đun này cho phép chuyển đổi giữa các giá trị Python và các cấu trúc C dưới dạng chuỗi Python, mang lại khả năng tích hợp linh hoạt giữa hai ngôn ngữ lập trình.
Struct là một công cụ quan trọng trong việc xử lý dữ liệu nhị phân, cho phép làm việc với dữ liệu từ tệp tin hoặc kết nối mạng Nó sử dụng định dạng chuỗi để mô tả cách bố trí của cấu trúc C, đồng thời chuyển đổi giữa các giá trị của C và Python một cách hiệu quả.
Mô đun này cung cấp truy cập vào giao diện ổ cắm
2 Socket BSD Nó có sẵn trên tất cả các hệ thống Unix hiện đại, Windows, Mac OS X, BeOS, OS / 2, và có lẽ các nền tảng bổ sung.
Mô-đun binascii chứa một số phương pháp để
3 Binascii chuyển đổi giữa các tập tin nhị phân và mã hóa
4 OS, SYS Mô-đun này cung cấp cách sử dụng chức năng hệ điều hành phụ thuộc
Mô-đun này dùng để dừng màn hình chương trình
5 Time trong một thời gian nhất định (Để tiện việc theo dõi các gói tin)
Lập trình bắt và phân tích các gói tin
Hình 2.1: Số thứ tự chỉ định hai thức UDP và TCP.
Bảng 2.2: Quy đổi các giá trị trong thư viện Struct của ngôn ngữ Python
Format C Type Python type Standard size x pad byte no value c char string of length 1 1 b signed char integer 1
H unsigned short integer 2 i int integer 4
I unsigned int integer 4 l long integer 4
L unsigned long integer 4 q long long integer 8
Q unsigned long long integer 8 f float float 4 d double float 8 s char[] string p char[] string
Lưu ý: Header field luôn sử dụng hàm giá trị unsign có giá trị dương. 2.3.1 Hàm phân tích gói tin giao thức UDP:
Hình 2.2: Hàm phân tích gói tin UDP 2.3.2 Hàm phân tích gói tin giao thức TCP:
Hình 2.3: Hàm phân tích giao thức TCP
2.3.3 Hàm phân tích gói tin giao thức IP:
Hình 2.4: Hàm phân tích giao thức IP
2.3.4 Hàm phân tích gói tin giao thức Ethernet:
Hình 2.5: Hàm phân tích giao thức Ethernet
Lập trình việc phân tích và bắt gói tin bằng Python
Dẫn chương
Trong chương số ba của bài tiểu luận, chúng ta ứng dụng thực tế script Python PacketSniffer.py vào thực tế.
Chương trình đầy đủ
The provided Python code demonstrates how to analyze a UDP header using the `struct` and `socket` libraries It imports necessary modules and defines the `analyze_udp_header` function, which unpacks the first eight bytes of incoming data to extract the source port, destination port, length, and checksum of the UDP packet The function then prints these details in a structured format before returning the remaining data This code is essential for understanding UDP packet structure and can be useful for network analysis and debugging.
The `analyze_tcp_header` function processes a TCP header from raw data, extracting key fields such as source and destination ports, sequence and acknowledgment numbers, and various flags It unpacks the first 20 bytes of the data using the `struct` module, allowing for the interpretation of the TCP header's structure The function then calculates the data offset, reserved bits, and specific flags like URG, ACK, PSH, RST, SYN, and FIN Finally, it prints a formatted representation of the TCP header, displaying the extracted values for source and destination ports, sequence and acknowledgment numbers, and flags, providing a clear overview of the TCP segment details.
The provided code snippet processes TCP header information by printing various flags such as URG, ACK, PSH, RST, SYN, and FIN, alongside the window size and checksum It also includes a function that analyzes an IP header, extracting key components such as the version, header length, type of service, total length, identification, flags, time-to-live, protocol, checksum, source address, and destination address This function utilizes the struct module for unpacking binary data and the socket module for converting IP addresses from binary format to a human-readable string.
The IP header is analyzed by printing various fields such as Version, IHL, TOS, Length, ID, Flags, Offset, TTL, Next Protocol, Checksum, Source IP, and Destination IP Depending on the value of the Next Protocol, it can be identified as TCP, UDP, or Other After processing the IP header, the data is adjusted to exclude the header portion Additionally, the Ethernet header is examined by unpacking the first 14 bytes, revealing the destination MAC address This structured approach ensures a comprehensive understanding of the packet's composition and facilitates further network analysis.
The Ethernet header is analyzed by extracting the source MAC address using the `binascii.hexlify` function, which converts the second element of the header The next protocol is determined by right-shifting the third element of the header by eight bits The destination MAC address is formatted and printed in a readable manner, displaying each segment of the address Similarly, the source MAC address is printed in a structured format, ensuring clarity in the representation of both addresses.
The code snippet demonstrates how to analyze Ethernet and IP headers in network packets using a raw socket in Python It begins by extracting the source MAC address and checks the protocol type; if it matches IP (0x08), it sets a boolean flag The main function establishes a raw socket to receive data, processes the Ethernet header, and, if the packet contains an IP protocol, it further analyzes the IP header If the next protocol is TCP, it proceeds to analyze the TCP header This structured approach enables efficient packet inspection for network monitoring or analysis.
24 elif next_proto == "UDP": data = analyze_udp_header(data) else: return while True: main()
Ứng dụng thực tế
Thử chạy script PacketSniffer.py trên máy ảo Linux, ta được kết quả như sau:
Hình 3.1: Chương trình PacketSniffer.py bắt gói tin UDP.
Hình 3.2: Chương trình PacketSniffer.py bắt gói tin TCP.
Hình 3.3: Chương trình PacketSniffer.py bắt gói tin UDP.
Hình 3.4: Chương trình PacketSniffer.py bắt gói tin TCP.
Hình 3.5: Chương trình PacketSniffer.py bắt gói tin TCP.
Hình 3.6: Chương trình PacketSniffer.py bắt gói tin TCP.