Để đón nhậñ các kết nối chuyền đến, socket trình chủ phải tạo ra một hàng đợi:(queue). Mục đích của hành đợi là lưu lại các kết nối chưa được trình chử xử lý kịp. Hàm hệ thống listen(Q) sẽ thực hiện công việc này.
iinclude <sys/socket.h>
int listen(nt socketd, int backlog);
Tham số socketd cho biết số mô tả socket cần tạo hàng đợi. backlog là số kết nối tối đa được phép đưa vào hàng đợi. Nếu một kết nối đến trình chủ trong khi đã có backlog kết nối trước đó chưa xử lý thì kết nối này sẽ bị thất bại. Lý do hàng đợi đã đây, trình chủ server không muốn nhận thêm kết nối nữa. Thông thường backlog mang giá trị 5 là số trung
bình khả thi nhất.
Chương 4: Lập trình socket
Hàm listenQ sẽ trả về 0 nếu tạo hàng đợi thành công, nếu thất bại trị
trả về sẽ là -I và biến errno sẽ chứa trị EBADE, EINVAL, hoặc
ENOTSOCK.
4.3.6. Chờ và chấp nhận kết nối
Một khi đã tạo được socket, đặt tên cho nó và chuẩn bị xong hàng đợi để tiếp nhận kết nối, công việc sau cùng là chờ kết nối của trình khách gửi đến. Bạn gọi hàm acceptQ đề thực hiện công việc này.
#include <sys/socket.h>
int accept(nt socketd, struct sockaddr *addrêss, §ize_t
*address_ len);
Hàm hệ thống acceptQ sẽ trở về khi eó một trình khách muốn kết
nối với ô cắm socket chỉ định số mô tả söeketd: Kết nối của trình khách trước hết được đặt vào hàng đợi. Khi aceeptQ phát hiện ra có socket trong hàng đợi, nó sẽ tự động lấy địa chỉ của máy khách đặt vào cấu trúc address, chiều dài thật sự của cấu trúc địa chỉ trả về trong biến address_ len. Tiếp đến. acceptQ tạo ra một socket vô danh. Kết quả trả về của acceptQ là số mô tả cho socket vô danh, bạn có thể sử dụng số này để liên lạc với trình-Khách. Socket vô danh mới này có cùng kiểu với socket(đặt tên đang lắng nghe trên hàng đợi.
Do:cấu trúc struct sockaddr không có định cho nên bạn cần thiết lập
kích thước vừa đủ để tiếp nhận địa chỉ trình khách. Nếu địa chỉ trình
khách dài hơn không gian bạn dành cho cấu trúc sockaddr, phần dư ra sẽ
bị cắt bỏ .
Chương 4: Lập trình socket
Nếu chưa có kết nối nào trong hàng đợi, acceptQ sẽ dừng lại chờ —
block( trình chủ sẽ không thực thi các lệnh kế tiếp) cho đến khi có kết
nối của client gửi đến. Bàn có thể thay đổi cơ chế chờ này bằng cách gọi hàm fcndQ điều chỉnh và thêm vào cờ O_NONBLOCK cho socket như Sau:
int flags=fcntl(socketd, F_GETTFL, 0);
fcntl(socketd, F_SETEL, O_NONBLOCK | flags);
Sau khi đặt cờ này cho socket, hàm acceptQ sẽ không dừng lại chờ khi bạn gọi nó. acceptQ sẽ trả về ngay số mô tả chó sòcket nếu có kết nối trong hàng đợi, nếu không nó sẽ trả về -I và thực thi dòng lệnh kế tiếp.
4.3.7. Yêu cầu kết nối
Trình chủ của bạn thường thực hiện €lứac năng tạo, đặt tên, chờ kết
nối bằnh các hàm socketQ, biúd(), và aeceptQ. Tuy nhiên phía trình
khách đơn giản hưn, bạn chỉ cần gọi hầm connect() để yêu cầu kết nối với trình chủ. connectQ được khai báo như sau:
#include <sys/socket.h>
int connnect(int socketd, const struct sockaddr *address,
size_t address_lef);
Tham số socketd là số mô tả trả về bởi hàm socketQ. address là cầu trú© địa-chỉ trỏ đến socket của trình chủ. address_len là chiều đài của biến cấu trúc address. Kết quả trả về của hàm là 0 nếu thành công và ngược lại là -1. Trong trường hợp -1, biến errno sẽ chứa một trong những trị sau:
Chương 4: Lập trình socket Mã lỗi Mô tả
EBADE SỐ mô tả socket truyền cho hàm không họp lệ EALREADY Kêt nội đã được thiết lập trước đó
ETIMEOUT Quá thời gian chờ kết nồi ECONNREFUSED | Trình chủ server từ chối kết nói
Bảng 4-4 Mã lỗi của hàm cơnneetQ
Nếu kết nối không thành công hàm corfiectQ sẽ có gắng chờ kết nối lại. Nếu sau một số lần kết nối không thành 'công connectQ sẽ trả về lỗi ETIMEOUT.
Tương tự acceptQ bạn có thể đổi chế độ chờ của hàm connectQ
bằng cách gọi fcntlQ đặt lại c EÑONBLOCK. Bằng cách này, khi kết
nối không thành công ở lần đầu-tiên, hàm connectQ) sẽ không chờ đề lập lại kết nối. Hàm sẽ kết thúc và trả về mã lỗi ngay lập tức.
4.3.8. Đóng kết nói
Tương tự như xử lý trên file. Bạn có trách nhiệm đóng các kết nối
đã tạo ra bằng cách gọ hàm close(Q. Đóng kết nói sẽ giải phóng tài
nguyên và bảo đảm dữ liệu đã chuyên tải hoàn tất ở cả hai đầu gửi và
nhận.
#include <sys/socket.h> int close(nt sockd);
Đối với cả hai phía trình khách và trình chủ, bạn nên gọi closeQ đóng socket khi lệnh read trả về trị 0 (không còn đữ liệu để đọc).
Chương 4: Lập trình socket
Thường thì closeQ trở về ngay tức khắc, tuy nhiên có thê close(Q sẽ rơi vào trạng thái chờ (block) nếu scoket của bạn thiết lập kiểu kết nối hai chiều (SOCK_STREAM) cùng với tùy chọn SOCK_LINGER và dữ liệu
đang ở trạnh thái chưa chuyển hết. Tùy chọn SOCK_LINER sẽ được đề
cập sau.
4.3.9. Giao tiếp bằng socket
Chúng ta vừa xem qua các hàm hệ thống dùng tạo và xử lý socket, giờ đây ta có thể trở lại những ví dụ về sử dụng socket.cụ thê hơn.
Như đã nêu, bạn nên sử dụng socket theo vừng AF_INET thay cho
AF_UNIX. Socket dựa trên hệ thống file thường gặp phải một số vấn đề
như chúng chỉ được truy xuất trên hệ thống file chỉ định của UNIX/Linux. Việc phân quyền cho phép độc:ghi file cũng là một vấn đề. Thường file socket tạo ra trong thư mục hiện hành hoặc thư mục tạm /tmp và bạn phải cho phép hầu nhữ toàn quyền truy cập các thư mục này để socket hoạt động. Với:AF_INET thì vấn đề này không phát sinh, AF_INET dựa vào.công và địa chỉ IP để kết nối. Ứng dụng của bạn trên Linux sử dụng AF INET sẽ dễ chuyên đổi sang Windows hơn là AF_UNEX.
Tfong AF_INET, khi tạo mới một socket trên trình chủ, bạn phải chộn một-số hiệu công đặt cho socket. Việc chọn số hiệu công phải loại trừ những cổng đã được các ứng dụng khác sử dụng. Bạn có thể tham khảo tập tin /etc/services, đây là tập tin văn bản liệt kê danh sách các dịch vụ và công đã được để đành sử dụng, số công của bạn không nên trùng với những số đã có trong danh sách này. Ban cũng không thể sử dụng các cổng nhỏ hơn 1024, chúng đành cho các dịch vụ của hệ thống.
Giao tiếp mạng không đòi hỏi phải kết nối với một hệ thống mạng thật sự. Ngay trên một máy, bạn có thể sử dụng giao tiếp mạng để liên
Chương 4: Lập trình socket
lạc giữa các tiến trình đang chạy. Nếu cần số địa chỉ IP, bạn có thể sử dụng số 127.0.0.1, đây là địa chỉ IP “hồi qui” (loop back) thường dùng cho các ứng dụng cục bộ. Với địa chỉ này, dữ liệu gửi đi sẽ quay về đúng địa chỉ ban đầu, có nghĩa là máy gửi và máy nhận được xem là một. Do
tính chất đặc biệt này, nếu trình khách trên máy cục bộ gửi dữ liệu đến
trình chủ theo IP 127.0.0.1 thì trình chủ cũng trên máy này sẽ nhận được dữ liệu và hồi âm lại. Nếu máy bạn hòa mạng, bạn nên hỏi người quản trị mạng để xin một địa chỉ IP thích hợp.
Địa chỉ mạng IP thường khó nhớ, bạn có tHỂ yêu cầu socket tiếp nhận một tên gợi nhớ khách thay cho số IPí Chẳng hạn localhost hay my.computer.home thay cho 127.0.0.1. Tập tin văn bản /etc/hosts chứa các danh sách chuyền đổi này. Ví dụ; bạn:có thể dùng trình soạn thảo vi hay gnotepad sửa nội dung tập tiñ này như sau:
127.0.0.1 localhost
127.0.0.1 Tmy.computer.home 207.46.131.91 WWW.microsoft.com
Như bạn thấy, một địa chỉ IP có thể ánh xạ bằng nhiều tên khác
nhau (địa chỉ ]P vầ:têñ thường cách nhau bằng khoảng trắng hay tab). Thường địa:chỉ IP 127.0.0.1 được gọi là localhost và không có gì trở ngật nếu bạn tự định đặt cho nó một cái tên khác chẳng hạn như my.computer.home. Các địa chỉ Web mà bạn thường thấy như www.yahoo.com hay www.microsoft.com là các địa chỉ toàn cầu được
quản lý bởi tổ chức quốc tế InterNIC. Để biết một tên gọi ứng với một
địa chỉ IP có tồn tại hay không, bạn có thể gọi lệnh ping như sau:
Chương 4: Lập trình socket
$ ping localhost
PING (127.0.0.1) from 127.0.0.1 : 56 (84) bytes of data. 64 bytes from (127.0.0.1) : iemp_ seq=0 ttl=255 time=67 usec 64 bytes from (127.0.0.1) : iemp_ seq=0 ttl=255 time=48 usec 64 bytes from (127.0.0.1) : iemp_ seq=0 ttl=255 time=5l usec 4.4. Sử dụng socket trong ứng dụng mỉnh họa
Phần lập trình socket này sẽ được sử dụng để thực hiện việc trao đôi thông tin giữa thành phần client và server trong phần ứng dụng minh họa.
Cụ thể thành phần client sẽ dùng socKêt kết nối đến thành phần server. Sau khi kết nối thành công client sẽ gửi các lệnh như Start Capture, Stop Capture, Get FIlter... đến sẻFVer, server nhận các lệnh này,
thực hiện xong nó sẽ trả lời kết quả thực hiện là thành công hay thất bại
cho client.
Phần 3: Xây dựng ứng dụng thử nghiệm PacketCap
PHÀN 3: XÂY DỰNG ỨNG DỤNG THỬ NGHIỆM PACKETCAP + Chương 5. Phân tích và thiết kế PacketCap
+ Chương 6: Cài đặt và thử nghiệm
+ Chương.7. Tống kết
Chương 5: Phân tích và thiết kế PacketCap
Chương 5: Phân tích và thiết kế PacketCap
5.1. Khảo sát hiện trạng
Hiện nay có rất nhiều phầm mềm bắt gói tin như Tcpdump, Microsoft Network Monitor, Ethereal...Trong đó phần mềm nguồn mở Ethereal nổi bật
với nhiều ưu điểm như chạy trên nhiều hệ điều hành, hỗ trợ bắt gói tin theo
nhiều giao thức khác nhau...
Các phần mềm này có hạn chế chung là khi chúng đang bắt các gói tin thì chúng ta không thể đọc, phân tích các thông tin bắtđược, hay nói cách
khác khi kết thúc quá trình bắt các gói tin rồi thì mới phân:tích các thông tin
này được.
Những phần mềm này không hồ trợ việc ghi kết quả vào cơ sở dữ liệu, mà chỉ lưu vào các file có cấu trúc theo định dạng riêng của chúng. Nếu file
này có kích thước lớn thì việc tìm kiếm, xử lý các thông tin để phân tích sẽ rất
chậm.
Những phần mềm này chỉ cñạy trên môi trường desktop là chủ yếu do đó không cho phép cấu hình từ›xa (ví dụ: điều chỉnh bộ lọc , thiết lập đường dẫn lưu trữ trên mạng „...từ xa. Hiện nay các phần mềm này đang được phát triển sang mô hình client/server).
Trong khi đó thì nhu cầu người quản trị mạng rất đa dạng:
s Cần có thông tin về lưu lượng mạng để điều chỉnh băng thông theo yêu cầu của khách hàng cũng như phát hiện trước các sự cô nêu được.
e Theo dõi hành động truy cập và xâm nhập mạng bất hợp pháp.
e© Tất cả hành động trên nên là online (phân tích và điều
khiên) nêu được.
Chương 5: Phân tích và thiết kế PacketCap
5.2. Phân tích và xác định yêu cầu
5.2.1. Phân tích
Việc trao đổi thông tin trên mạng ngày càng nhiều, nhu cầu của các nhà quản trị mạng đòi hỏi ngày càng đa dạng, cần thiết có một chương trình có thể bắt gói tin cho phép phân tích, trích lọc thông tin ngay trong khi bắt (các phần mềm bắt gói tin hiện nay không cho phép các nhà quản trị sử dụng thông tin thu thập được khi quá trình bắt gói tin đang thực hiện). Ứng dụng này sẽ lấy tên là PacketCap.
Trên cơ sở đó, một hệ thống phân tán bắt góĩ tin; trích lọc và luu trữ
vào cơ sở dữ liệu trên mạng được xây dựấg để khắc phục phần nào khuyết điểm trên. Hệ thống cho phép nhà quản trị sử dựng thông tin ngay trong khi bắt, tùy chọn vị trí lưu thôñg:tin-và cho phép cấu hình từ xa việc filter các gói tin.Các nhà quản trị mạng cũng có thể dùng hệ thông này làm cơ sở đề phát triển tiếp các ứng dụng về quản trị mạng.
5.2.2. Xác định yêu cầu
Mục tiêu của.đề tài là một xây dựng ứng dụng phân tán bắt các gói tin, ứng này sẽ cụng cấp cho quản trị mạng những thông tin phục vụ cho việc theo dõi và phân tích thông tin mạng, dựa trên những thông tin được cung cấp này cho phép quản trị mạng có thể xác định được tình trạng của toàn bộ hệ thống mạng.
Chương 5: Phân tích và thiết kế PacketCap
Ứng dụng PacketCap này sẽ bao gồm các chức năng:
STT Chức năng
I Bắt và phân tích được các gói tin của những protocol thông dụng như TCP, UDP, ICMP, ARP...
2 Cho phép lưu trữ thông tin bắt được dưới dạng cơ sở dữ liệu và chọn hệ quản trị cơ sở dữ liệu đê lưu trữ.
3 Cho phép lưu trữ thông tin bắt theo cấu trúc file của Ethereal hoặc các phân mêm bắt gói tin khác.
Điều khiến từ xa việc bắt các gói tin, baø gồm:
® Khởi động bắt gói tin 4 ® Dừng bắt gói tin
®©_ Lấy bộ lọc hiện thời
©_ Kết thúc chương trình bắF§gói tin
Bảng 5-1 Xác định yêu cầu
Chương 5: Phân tích và thiết kế PacketCap
5.3. Các hướng xây dựng ứng dụng PacketCap
Hiện nay có rất nhiều phần mềm bắt gói tin có mã nguồn mở như TCPTrace, TepDump, WinDump, Ethereal,..trong số này thì Ethereal là phần mềm tốt nhất. Nó hỗ trợ rất nhiều protocol, hỗ trợ các định đạng lưư trữ của
các phần mềm bắt gói tin khác, tích hợp thêm phần phân tích thông tin bắt
được.
Các phần mềm nguồn mở này đều sử dụng thư viện lập trình libcap hoặc winpcap(tên của phiên bản libpcap chạy trên hệ điều hành Windows).
Do có rất nhiều phần mềm nguồn mở hỗ trợ bắt gói tin nên sẽ có 2 hướng lựa chọn để phát triển ứng dụng PacketCap:
> Hướng l1: Tìm hiểu cấu trúc của phầñ mềm Ethereal, tích hợp thêm chức năng lưu các gói tin vào cơ §ở'dữ-liệu và cấu hình từ xa vào phần mềm Ethereal.
> Hướng 2: Sử dụng thư viện lập trình mạng libpcap để viết lại toàn bộ
ứng dụng.
5.3.1. Phân tích hướng phất triển dựa trên Ethereal e© Thuận lợi
o_Soùrce eØđe của Ethereal mở có thể dễ dàng download trên nhiều trang web. (www.ethereal.com)
o--Không cần xây dựng lại các module bắt gói tin và filter cho ứng dụng.
® Khó khăn
o_ Mã nguồn Ethereal rất nhiều và khó hiểu rõ được do đó việc tích hợp thêm chức năng vào Ethereal là rất phức tạp.
o Ethereal chỉ cung cấp free user guide không cung cấp developer guide do đó muốn tìm hiểu về ethereal phải đọc tât cả source code.
Chương 5: Phân tích và thiết kế PacketCap
5.3.2. Phân tích hướng phát triển dựa trên libcap ® Thuận lợi : ® Thuận lợi :
o Thư viện mã nguồn mở libpcap download miễn phí, được
nhiều nhà phát triển sử dụng. Phần mềm bắt gói tin Tcpdump là một điển hình.
o_ Có nhiều tài liệu hướng dẫn lập trình
o_ Có thể dễ dàng xây dựng chương trình theo ý muốn
® Khó khăn
o_ Phải viết lại tất cả các module captufe và filtering trước khi thêm vào các yêu cầu của luận văn.
5.3.3. Lựa chọn hướng phát triển PacketCap
Từ những phân tích khó khăn và thuận lợi của 2 hướng phát triển ứng dụng PacketCap, chúng em quyết định lựa phát triển PacketCap theo hướng thứ 2, nghĩa là sẽ xây dựng từ đầu ứng dụng bắt gói tin PacketCap dựa trên thư viện libpcap.