(Bài này là đồ án hồi sv năm 2-3 gì đó)
FTP (File Transfer Protocol) là giao thức truyền tập tin giữa các máy tính trên hệ thống mạng, chẳng hạn như mạng Internet. Ta có thể dùng FTP để truy cập tài nguyên từ xa trên một máy tính khác, một tài khoản từ máy chủ nào đó, chẳng hạn như tài khoản website cá nhân hoặc công ty.
FTP được định nghĩa chi tiết trong RFC-959[1].
- Anonymous FTP (truy cập cộng đồng):
Đây thực chất là một tài khoản công cộng cho bất cứ người dùng nào cũng có thể truy cập vào tài nguyên mà server muốn chia sẻ (các dịch vụ chia sẻ file miễn phí). Các nguồn tài nguyên này thường được giới thiệu trên mạng, người dùng chỉ việc click vào và trình duyệt web sẽ tự động mở truy cập. Thông thường các link chia sẻ đều có dạng ftp://domain.com. Ví dụ: ftp://mysql.mirror.kangaroot.net/pub/mysql/
- Tài khoản FTP
Khác với các dịch vụ chia sẻ file công cộng, các dịch vụ truyền file khác đều cung cấp từng tài khoản FTP cụ thể cho từng người dùng để bảo mật thông tin. Hầu hết các máy chủ Web đều được người quản trị liên lạc để quản lý file đều sử dụng giao thức FTP.
Mỗi tài khoản kiểu này đều được khai báo với tên đăng nhập và mật khẩu riêng, chỉ người sở hữu mới nắm được thông tin, và người sở hữu phải xác thực với server trước mỗi phiên kết nối. Thực tế tài khoản Anonymous FTP cũng có tên đăng nhập là anonymous với mật khẩu rỗng. Các ứng dụng duyệt web (và các ứng dụng truy cập khác) đều ngầm hiểu và tự động khai báo giúp người dùng.
Ở mỗi phiên hoạt động, các ứng dụng FTP Client khởi tạo socket kết nối tới dịch vụ FTP của máy chủ ở cổng (Port) quy ước. Hầu hết các cổng kết nối đến server đều là cổng 21, trong một vài trường hợp nhằm che dấu thông tin, các quản trị của server thay đổi thành cổng khác để hạn chế sự nhòm ngó từ các máy quét bên ngoài. Quá trình kết nối này gọi là Control Channel connection.
Giao thức FTP có hai hệ kết nối là hệ thường (Normal FTP) và hệ bị động (Passive FTP). Trong đó hệ bị động được bảo mật hơn hệ thông thường.
Normal FTP (còn gọi là Active Mode):
Ứng dụng client khởi tạo kèm một port mới kết nối tới cổng 21 của sever (bằng lệnh PORT [port]) tạo ra kết nối port-to-port (quá trình này gọi là Data Channel). Ứng dụng FTP server sẽ dùng cổng 20 kết nối tới client qua một cổng mới nào đó (lớn hơn 1023). Vì client không thể điều khiển được quá trình này nên dữ liệu sẽ bị kiểm soát và chặn bởi tường lửa. (Nếu không có tường lửa thì việc vào ra bất hợp pháp một cách thoải mái trên mọi cổng của client sẽ rất dễ bị khai thác)
Passive FTP (Chế độ Bị động)
Client sẽ thông báo cho server khi sử dụng cơ chế này qua lệnh PASV thay cho lệnh PORT ở trên. PASV sẽ “hỏi” server cổng mà server thông tin về Data Channel server muốn tương tác, sau đó bên cạnh port 21, client chủ động kết nối tới cổng “mong muốn” của server. Vì client sẽ chủ động khởi tạo kết nối nên firewall (tường lửa) kiểm soát được và cho phép thực hiện luồng dữ liệu này.
Khi đã kết nối, server và client sẽ trao đổi với nhau qua các lệnh command được định nghĩa chung từ RFC hoặc các command riêng được định nghĩa bởi server.
CÁC COMMAND THƯỜNG GẶP
* ABOR – ngưng lệnh đang thực hiện
* CWD – thay đổi thư mục làm việc
* DELE – xoá file
* LIST – xem danh sách files
* MDTM – trả về thông tin sửa đổi của files
* MKD – tạo thư mục mới
* NLST – danh sách tên các thư mục
* PASS – gửi nội dung password
* PASV – chế độ PASV
* PORT – mở một cổng dữ liệu
* PWD – hỏi thư mục đang thực hiện
* QUIT – tắt phiên kết nối
* RETR – nhận một file về local
* RMD – xoá một thư mục
* RNFR – đổi tên từ
* RNTO – đổi tên tới
* SITE – hỏi các command riêng của site
* SIZE – kích thước một file
* STOR – lưu trữ file lên server
* TYPE – kiểu truyền của dữ liệu (binary/ ascii)
* USER – gửi thông tin username
[1] http://www.faqs.org/rfcs/rfc959.html
[2] http://en.wikipedia.org/wiki/SSH_file_transfer_protocol
Sample FTP Class (C#)
#region FTP Actions
private void readReply()
{
receivedMsg = "";
reply = readLine();
if (reply != "") replyValue = Int32.Parse(reply.Substring(0, 3));
}
private void cleanup()
{
if (clientSocket != null)
{
clientSocket.Close();
clientSocket = null;
}
onLogin = false;
}
private string readLine()
{
while (true)
{
try
{
bytes = clientSocket.Receive(buffer, buffer.Length, 0);
}
catch { setStatus("Reading error"); return ""; }
receivedMsg += ASCII.GetString(buffer, 0, bytes);
if (bytes < buffer.Length) { break; } } char[] seperator = { '\n' }; string[] mess = receivedMsg.Split(seperator); if (receivedMsg.Length > 2)
{
receivedMsg = mess[mess.Length - 2];
}
else
{
receivedMsg = mess[0];
}
if (!receivedMsg.Substring(3, 1).Equals(" "))
{
return readLine();
}
for (int k = 0; k < mess.Length - 1; k++)
{
setStatus(mess[k]);
}
return receivedMsg;
}
private void sendCommand(String command)
{
Byte[] cmdBytes = Encoding.ASCII.GetBytes((command + "\r\n").ToCharArray());
try
{
clientSocket.Send(cmdBytes, cmdBytes.Length, 0);
}
catch
{
setStatus("Error on Connecting to remote!");
return;
}
readReply();
}
private Socket createTranmissonSocket()
{
sendCommand("PASV");
if (replyValue != 227)
{
setStatus(reply.Substring(4));
close();
}
int index1 = reply.IndexOf('(');
int index2 = reply.IndexOf(')');
string ipData = reply.Substring(index1 + 1, index2 - index1 - 1);
int[] parts = new int[6];
int len = ipData.Length;
int partCount = 0;
string buf = "";
for (int i = 0; i < len && partCount <= 6; i++)
{
char ch = Char.Parse(ipData.Substring(i, 1));
if (Char.IsDigit(ch))
buf += ch;
else if (ch != ',')
{
throw new IOException("Malformed PASV reply: " + reply);
}
if (ch == ',' || i + 1 == len)
{
try
{
parts[partCount++] = Int32.Parse(buf);
buf = "";
}
catch (Exception)
{
throw new IOException("Malformed PASV reply: " + reply);
}
}
}
string ipAddress = parts[0] + "." + parts[1] + "." +
parts[2] + "." + parts[3];
int port = (parts[4] <<
+ parts[5];
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ep = new IPEndPoint(Dns.GetHostEntry(ipAddress).AddressList[0], port);
try
{
s.Connect(ep);
}
catch (Exception)
{
setStatus("Can't connect to remote server");
}
return s;
}
#endregion
Download this class: http://vietfov.net/soft/download.php?f=FTP.zip