Đó là giao thức FTP File Transfer Protocol – Giao thức truyền tập tin – thường được dùng để trao đổi tập tin qua mạng lưới truyền thông dùng giao thức TCP/IP Trong phạm vi đề tài tốt ngh
Trang 1Lời mở đầu
Internet ngày nay đã trở thành một phương tiện truyền thông hiệu quả
nhất để gắn kết mọi người từ khắp nơi trên Thế Giới lại với nhau Không
những phục vụ cho nhu cầu giải trí, giao lưu văn hóa nghệ thuật, Internet đang
là công cụ chính trong tất cả các lĩnh vực của đời sống Xã Hội, từ kinh doanh cho đến quản lý, từ dịch vụ cho đến hệ thống …
Từ những gói tin dữ liệu (vài chục KB) được gửi đi và về, ngày nay hệ
thống Internet đã phát triển với mức độ chóng mặt, về dung lượng và tốc độ Bên cạnh đó các giao thức, các mô hình, các kiểu cấu trúc mạng, các hình thái
hệ điều hành, máy chủ, máy con, phần mềm, phần cứng … cũng được phát triển cho phù hợp
Tuy nhiên có một giao thức đã ra đời từ rất sớm vẫn không thay đổi là bao nhiêu Nói như vậy không có nghĩa là phủ nhận tầm quan trọng của nó, mà trái lại, nó đang làm nền tảng cho sự ổn định, phát triển của Internet ngày nay
và cho cả tương lai
Đó là giao thức FTP (File Transfer Protocol) – Giao thức truyền tập tin – thường được dùng để trao đổi tập tin qua mạng lưới truyền thông dùng giao
thức TCP/IP
Trong phạm vi đề tài tốt nghiệp này, em đã nghiên cứu và tìm hiểu hoạt động, cấu trúc của FTP trên phương diện Server (máy chủ), từ đó xây dựng
một ứng dụng FTP Server giúp hình dung rõ ràng nhất về giao thức trên
Xin được gửi lời cảm ơn chân thành của em đến Khoa CNTT – Trường ĐHNT nói chung và thầy giáo hướng dẫn Th.s Phạm Văn Nam nói riêng đã truyền đạt và tận tình giúp đỡ em trong suốt những năm học qua, đặc biệt là quãng thời gian em làm đồ án tốt nghiệp
Em xin chân thành cảm ơn !
SVTT
Nguy ễn Quốc Khánh
Trang 2M ục Lục
d Hoạt động của Client/Server trong TCP 11
e Hoạt động của Client/Server trong UDP 12
f Một số hàm liên quan đến gửi/nhân dữ liệu 12
3 Những ưu điểm của chương trình FTP Server 39
Trang 3A Đặt Vấn Đề:
1 – Khái quát:
FTP (File Transfer Protocol) thường được dùng để trao đổi tập tin qua
mạng lưới truyền thông dùng giao thức TCP/IP (Internet – mạng ngoại bộ, hoặc Intranet – mạng nội bộ) Hoạt động của FTP cần có 2 máy tính, một máy chủ
và một máy khách Máy chủ FTP, chạy phần mềm cung cấp dịch vụ FTP, gọi
là trình chủ, lắng nghe yêu cầu về dịch vụ của các máy tính khác trên mạng
lưới Máy khách chạy phần mềm FTP dành cho người sử dụng dịch vụ, gọi là trình khách, thì khởi đầu một liên kết đến máy chủ Một khi hai máy đã liên kết
với nhau, máy khách có thể xử lý một số thao tác về tập tin, như tải tập tin lên máy chủ, tải tập tin từ máy chủ xuống máy mình, đổi tên của tập tin, hoặc xóa
tập tin ở máy chủ… Vì giao thức FTP là một giao thức chuẩn công khai, cho nên bất cứ một công ty phần mềm nào, hay một lập trình viên nào cũng có thể
viết trình chủ FTP hoặc trình khách FTP Hầu như bất cứ một nền tảng hệ điều hành máy tính nào cũng hộ trợ giao thức FTP Điều này cho phép tất cả các máy tính kết nối với một mạng lưới có nền TCP/IP, xử lý tập tin trên một máy tính khác trên cùng một mạng lưới với mình, bất kể máy tính ấy dùng hệ điều hành nào (nếu các máy tính ấy đều cho phép sự truy cập của các máy tính khác, dùng giao thức FTP) Hiện nay trên thị trường có rất nhiều trình khách và trình
chủ FTP, và phần đông các trình ứng dụng này cho phép người dùng được lấy
tự do, không mất tiền
Chính vì khả năng tương thích cao và phổ biến của giao thức FTP, việc
viết các trình chủ và trình khách FTP cũng được thực hiện ở nhiều nơi, nhiều phiên bản, ứng dụng và tính năng khác nhau tùy thuộc vào nhu cầu và mục đích của công ty, tổ chức hoặc cá nhân tham gia
Trang 5B FTP (File Transfer Protocol)
I Khái ni ệm, khuôn mẫu tổng quát:
1 Định nghĩa về giao thức FTP:
FTP (file transfer protocol - giao thức truyền file) đã có từ rất lâu và đã rất quen thuộc với nhiều người sử dụng hoặc làm việc với Internet Tuy nhiên, có
những điều liên quan tới lịch sử hình thành cũng như mức độ an toàn hiện tại
mà có thể còn ít người biết tới
FTP được phát triển từ rất sớm, chỉ sau khi mạng Internet ra đời khoảng 19 tháng Vậy mà nó vẫn được sử dụng rộng rãi cho tới tận bây giờ, phục vụ
những mục đích như cập nhật nội dung các website hay truyền những file lớn qua mạng Về mặt kỹ thuật, từ đầu FTP đã được thiết kế tốt đến nỗi ít ai thấy
có nhu cầu thay thế nó Tuy nhiên, chính sự đơn giản của FTP đã bắt đầu dẫn
tới những ẩn hoạ về an ninh mà từ thời kỳ đầu của Internet chưa hề tồn tại Được phát triển từ đầu những năm 1970 và trở nên phổ biến từ khoảng năm
1985 trở đi, FTP qua nhiều năm được dùng như cách thức tiêu chuẩn và phổ
biến để truyền file Qua đó, hai máy tính được nối mạng có thể truyền file xuôi
ngược cho nhau, bất kể là file loại gì hoặc mỗi máy tính sử dụng hệ thống file hay lưu trữ kiểu gì
Kể từ đầu thập kỷ 1990, giao thức truyền siêu ký tự (HTTP) trở thành tiêu chuẩn để truyền những đoạn ký tự hoặc hình ảnh nhỏ qua trình duyệt Nhưng FTP vẫn được ưa chuộng cho việc truyền những file lớn hơn Các phần mềm (ví dụ như CuteFTP) giúp những người phát triển và quản trị website tải các trang web lên máy chủ để hiển thị cho người xem
FTP có các tuỳ chọn bảo vệ bằng mật khẩu, nhưng chính các tên truy nhập
và mật khẩu lại được gửi qua Internet mà không được mã hoá, nên kẻ xấu hoàn toàn có thể đánh cắp chìa khoá và sau đó là thông tin Vấn đề lớn hơn nữa là
khả năng của FTP cho phép mọi người truy nhập tự do Mục đích ban đầu là để khuyến khích chia sẻ, nhưng mặt khác điều này cũng dễ gây ra việc vô tình mất
những thông tin, dữ liệu riêng tư hoặc nhạy cảm
Tên truy nhập thông thường là "anonymous" và mật khẩu có thể là bất kỳ
cái gì Mặc dù tính năng truy cập tự do này có thể được tắt đi, nhưng nhiều hệ
thống cũ vẫn đặt nó là mặc định, do đó người quản trị thiếu kinh nghiệm hoặc
lơ đễnh có thể quên không thiết lập lại và mở ra lỗ hổng an ninh cho hệ thống
Trang 62 Giao ti ếp Socket và mô hình Client – Server:
a Socket là gì ?
Socket là một cổng logic mà một chương trình sử dụng để kết nối với một
chương trình khác chạy trên một máy tính khác trên Internet Chương trình
mạng có thể sử dụng nhiều Socket cùng một lúc, nhờ đó nhiều chương trình có
thể sử dụng Internet cùng một lúc
Socket trong Winsock như là một “phương tiện” để ứng dụng mạng có thể trao đổi dữ liệu Nghĩa là 1 Server thì sẽ cần một Socket để lắng nghe, chờ đợi các kết nối từ client và Client thì phải cần có một Socket để kết nối tới Sever
b Kh ởi tạo Socket:
Ta sử dụng cấu trúc SOCKET để lưu giữ 1 Socket Và có thể sử dụng
hàm sau đây để tạo Socket
Trang 7* type: Quy định giao thức vận chuyển dữ liệu
Ví d ụ: với giao thức TCP/IP thì có 2 giao thức cốt lõi là UDP và TCP:
- SOCK_DGRAM: Hay là giao thức UDP Khi chương trình chúng ta dùng UDP để truyền dữ liệu thì chuyện gì sẽ xảy ra giữa bên gởi và bên nhận ? Bên
gửi cứ gửi và gửi và nó không hề quan tâm tới vấn đề bên nhận có nhận được
nó hay không?
=> Ưu điểm: Tốc độ truyền dữ liệu nhanh
=> Nhược điểm: Khả năng sai, mất dữ liệu sẽ rất lớn
Vậy dùng UDP khi nào? Những ứng dụng cần dữ liệu tức thời như:
- Chương trình nghe nhạc trực tuyến Vấn đề sai bit (vấp khi nghe nhạc) không quan trọng mấy vì yêu cầu của nó là đảm bảo tốc độ nhanh
- Chương trình Chat
- Hoặc GameOnline (thỉnh thoảng bạn bị trường hợp LAG chính là do bị mất
dữ liệu trên đường truyền đó)
- SOCK_STREAM: Đây là giao thức TCP Nó ngược với UDP vì nó đảm bảo
giữa bên gửi và bên nhận dữ liệu phải chính xác Vì vậy 2 bên sẽ phải bắt tay
rất nhiều lần khi truyền được dữ liệu (ví dụ như bên gửi sẽ gửi n gói tin (packet), bên nhận sẽ kiểm tra có bị mất hay sai gói tin nào hay không, nếu đủ thì nó sẽ yêu cầu bên gửi gửi tiếp n gói tin tiếp theo, ngược lại thì nó sẽ yêu cầu
gửi lại)
=> Ưu điểm: Chất lượng gởi tin cậy
=> Nhược điểm: Chậm hơn UDP
Những ứng dụng như WEB, MAIL, FTP,…
- SOCK_RAW: Là giao thức để kiểm soát mạng, kiểm tra kết nối…
Ví d ụ:
Start -> Run -> CMD: “ping diendantinhoc.com”
Nếu bạn nhận được Reply có nghĩa là giữa máy tính của bạn với máy chủ
“diendantinhoc.com” có “thông mạng” với nhau Và gói tin mà bạn PING chính là SOCK_RAW (ICMP Packet)
* protocol: Chỉ định rõ lại giao thức Vì SOCK_RAW có 2 protocol là ICMP
và RAW nên nó cần điều này
- SOCK_DGREAM -> protocol là: IPPROTO_UDP
- SOCK_STREAM -> protocol là: IPPROTO_IP
- SOCK_RAW -> protocol có thể là: IPPROTO_RAW hay IPPROTO_ICMP
Trang 8Có thể tham khảo thêm bảng thể hiện các thuộc tính của hàm Socket
Một số hàm lấy thông tin về mạng:
• L ấy thông tin Socket
lpProtocolBuffer: Kiểu dữ liệu trả về
lpdwBufferLength: Kích thước của kiểu dữ liệu
Trang 9• L ấy tên máy tính của mình
int gethostname(char* name, int namelen);
Ví dụ:
char lpMyPCName[10];
gethostbyname(lpMyPCName,10) cout<< lpMyPCName;
• Làm việc với IP
Địa chỉ IP là 1 con số 4 byte để xác định 1 host trên mạng
Ví d ụ:
“192.168.11.1” [Byte1: 192] [Byte2: 168][ [Byte3: 11][ [Byte4: 1]
Có thể biểu diễn địa chỉ IP: unsigned long (4 bytes)
Hoặc một char* lpIP;
Sử dụng inet_addr và inet_ntoa để chuyển đổi qua lại giữa u_long và char*
Ví dụ:
u_long YahooAddr = inet_addr("216.109.112.135");
cout << "IP: " << inet_ntoa(*(in_addr*) &YahooAddr) << "\n";
• L ấy IP theo tên máy
struct hostent* FAR gethostbyname(const char* name);
với:
typedef struct hostent {
char FAR* h_name; // Tên máy tính
char FAR FAR** h_aliases; // Bí danh máy tính
short h_addrtype; // Kiểu IP (AF_INET)
short h_length; // Kích thước IP
char FAR FAR** h_addr_list; // Danh sách các địa chỉ IP
// 1 host có thể có 1 hoặc nhiều IP
Trang 10hostent* FAR gethostbyaddr(const char* addr, int len, int type);
Ví dụ: lấy thông tin Yahoo.com (có địa chỉ IP là 216.109.112.135)
hostent *Yahoo;
u_long YahooAddr = inet_addr("216.109.112.135");
Yahoo = gethostbyaddr((char*)&YahooAddr,4,AF_INET);
c Ứng dụng Client – Server là gì ?
Mục tiêu lập trình mạng sẽ đưa ra những ứng dụng dạng Client – Server Tức là
sẽ có 2 loại ứng dụng chính đó là Client và Server
Quy trình hoạt động của ứng dụng Server – Client như sau:
Trang 11- Server có nhiệm vụ của là lắng nghe, chờ đợi kết nối từ Client trên địa chỉ IP
của mình với PORT được quy định sẵn Khi client gởi dữ liệu tới Server thì nó
phải giải quyết một công việc là nhận dữ liệu đó -> xử lý -> trả kết quả lại cho Client
- Client là ứng dụng được phục vụ, nó chỉ gởi truy vấn và chờ đợi kết quả từ Server
Trong mô hình TCP/IP có 2 giao thức là TCP và UDP và 2 giao thức này sẽ quyết định cách thức hoạt động của Client - Server như thế nào?
d Ho ạt động của Client – Server trong giao thức TCP (SOCK STREAM)
e Ho ạt động của Client – Server trong giao thức UDP
(SOCK_DGRAM)
Trang 12f M ột số hàm liên quan đến gửi và nhận dữ liệu:
- SOCKET s: Socket được thiết lập
- sockaddr name: Cấu trúc ADDR bao gồm địa chỉ IP và PORT
Trang 13- int namelen: Kích thước của cấu trúc sockaddr
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)); // Đưa IP
và PORT vào SOCKET
Tác dụng dụng của BIND là sẽ giúp cho SOCKET của SERVER biết rằng nó
sẽ chờ đợi kết nối và nhận dữ liệu trên IP nào và PORT bao nhiêu?
Khoảng PORT nên chọn:
- 0 -1023: Là những PORT đã được sử dụng bởi các dịch vụ như WEB, FTP
- 1024-49151: Là PORT dành cho SERVER lắng nghe SERVER nên chọn trong khoảng này
- 49152-65535: Là PORT khởi tạo ngẫu nhiên dành cho CLIENT kết nối tới Server
- SOCKET s: Socket đã được thiết lập IP và PORT
- int backlog: Số kết nối cho phép chờ trong hàng đợi khi Server chưa chấp
nhận kết nối (vì đôi lúc có thể có tới 2 hay 3 client kết nối tới cùng 1 lúc) Giá
Trang 14Hàm được gọi từ CLIENT nếu nó muốn kết nối tới SERVER
- SOCKET s: Socket đã được khởi tạo
- sockaddr *serv_addr: IP và PORT của Server
- int addrlen: Sizeof của cấu trúc sockaddr
• Accept
SOCKET accept(
SOCKET s,
struct sockaddr FAR* addr,
int FAR* addrlen
);
Khi Client kết nối tới Server Nó phải chờ Server chấp nhận kết nối (nếu ở giao
thức TCP) bằng hàm accept trên
Hàm ACCEPT gồm có 2 thông số:
- SOCKET s: Socket lắng nghe của SERVER
- sockaddr addr: Là cấu trúc sockaddr lưu địa chỉ IP và PORT của CLIENT
kết nối tới SERVER
- int addrlen: Kích thước cấu trúc địa chỉ IP này
Hàm ACCPET trả về 1 SOCKET mới
Socket mới được tạo này đại diện cho 1 Connection (kết nối) mới giữa Server
và Client Sau khi đã truyền dữ liệu thì ta phải đóng SOCKET này lại bằng hàm close như closesocket(connect);
Trang 15int flags
);
- SOCKET s: Là SOCKET được tạo ra khi Server chấp nhận kết nối từ
CLIENT
- char FAR* buf: Là dữ liệu (dạng BYTE – char) nhận hay gửi
- int len: Kích thước của dữ liệu
- int flags: Một số cờ hiệu đi kèm (thông thường là 0)
- SOCKET s: Là SOCKET được tạo ra ban đầu
- char FAR* buf: Là dữ liệu (dạng BYTE – char) nhận
- int len: Kích thước của dữ liệu nhận
- int flags: Một số cờ hiệu đi kèm (thông thường là 0)
- sockaddr *from: IP và PORT từ bên gửi
- int *fromlen: Sizeof cấu trúc addr
- SOCKET s: Là SOCKET được tạo ra ban đầu
- char FAR* buf: Là dữ liệu (dạng BYTE – char) gửi
- int len: Kích thước của dữ liệu gửi
- int flags: Một số cờ hiệu đi kèm (thông thường là 0)
- sockaddr *to: IP và PORT tới bên nhận
- int tolen: Sizeof cấu trúc addr
• Close/Shutdown
Trang 16int shutdown(
SOCKET s,
int how
);
int closesocket (SOCKET s);
Hủy SOCKET sau một kết nối hoặc kết thúc chương trình
Tham số how của shutdown:
- SD_RECEIVE: Đóng SOCKET, không cho phép NHẬN nhưng cho phép
GỬI
- SD_SEND: Đóng SOCKET, không cho phép GỬI nhưng cho phép NHẬN
- SD_BOTH: Không cho GỬI và NHẬN (giống gọi hàm closesocket)
3 Công c ụ lập trình:
a Gi ới thiệu về MFC
Trang 17- MFC viết tắt là Microsoft Foundation Class
- MFC là một thư viện các lớp (class, OOP) trong ngôn ngữ Visual C++, được sử dụng để xây dựng các ứng dụng trên Windows
- MFC được xây dựng trên cơ sở các hàm thư viện API của Windows
- Trong một ứng dụng MFC, ta sẽ không gọi trực tiếp các hàm Windows API mà sẽ tạo các object từ những lớp của MFC, sau đó gọi hàm của Object này
- Đa số các hàm của lớp MFC có cùng tên với những hàm Windows API
- MFC tạo ra một Application Framework giúp cho lập trình viên thiết kế
kiến trúc của ứng dụng nhất quán và khoa học
- Thông qua các Class trong MFC, người lập trình có thể xây dựng ứng dụng nhanh và ít tốn sức hơn so với việc sử dụng đơn thuần các hàm thư
viện API của Windows
- Trong MFC có thể gọi các hàm Windows API
- MCF có nhiều version 1,2,3, 6 Version 6.0 có khoảng 200 Class
M ột số tính năng của MFC qua các Version:
- Version 1: (Visual C++ 1.0)
• Các lớp List, Array, String, Time, Date, File access
• Các lớp giao diện cơ bản
• MDI, OLE 1.0
- Version 2: (Visual C++ 1.0)
• File open, save
• Print preview, printing
• Scrolling window, spliter window
• Tool bar, status bar
• Access to Visual Basic controls
Trang 18Bổ sung thêm Treeview và RichEdit Các lớp đồng bộ hóa tiểu trình OLE control container
- Version 4.2: (Visual C++ 4.2)
Các lớp WinInet Các lớp ActiveX document server Các tính năng mở rộng của ActiveX control Cải tiến một số tính năng của ODBC
Hỗ trợ các lớp cho những Control chuẩn trong ID 4.0
Hỗ trợ Dynamic HTML, cho phép tạo lập động các trang HTML Active Document Containment, cho phép ứng dụng MFC có thể
chứa các Active document OLE DB và ADO
b Gi ới thiệu về Visual C++:
- Là lập trình sự kiện dựa vào thông điệp (message), Multitasking, CPU, Tích hợp sẵn Multimedia, Hỗ trợ 32 bit hoặc cao hơn nữa, Hỗ trợ nhiều công nghệ DLL, COM, DDE, OLE
Multi Lập trình sự kiện và xử lý sự kiện
- Các thành phần giao diện đồ họa: Dialog, SDI (Single Document
Interface), MDI (Multiple Document Interface)
Trang 19- Tài nguyên của ứng dụng:
• Resource là 1 đối tượng (Object) được sử dụng trong ứng dụng, ví dụ: Menu bar, Tool bar, dialog, icon, cursor, bitmap
• Resource được định nghĩa bên ngoài (tách biệt với Source Code) và được thêm vào trong tập tin thi hành (EXE) của ứng dụng khi biên dịch (Linking)
Trang 20II Các v ấn đề về FTP Server:
1 Ki ểu Server:
Khác với nhiều loại Server (Web, Mail…) FTP Server luôn có 2 kiểu phục
vụ là: Active Mode & Passive Mode Mỗi kiểu Server có một đặc trưng và cách
hoạt động khác nhau, nhưng vẫn đáp ứng được nhu cầu phục vụ cho mỗi Client
ở mức độ tốt nhất
Active Mode:
Trong chế độ Active, từ 1 dãy Port ngẫu nhiên (N>1023), Client mở kết
nối đến Port lệnh của Server, đó là Port 21 Sau đó, Client bắt đầu lắng nghe trên Port N+1 và gửi lệnh N+1 đến Server Sau đó, từ Port dữ liệu trên Server,
đó là Port 20, Server sẽ kết nối ngược trở lại đến Port dữ liệu đã được chỉ định trên Client (PORT N+1)
Ho ạt động:
B1: Từ Port 1026, Client kết nối đến Server và gửi lệnh PORT 1027
B2: Server gửi ACK (Acknowledgement) cho Client
B3: Server tạo 1 kết nối từ Port 21 data trên nó (20) đến Port đã chỉ định trước trên Client (1027)
B4: Cuối cùng Client gửi ACK cho Server