FTP实验报告
FTP服务器配置实验报告

FTP服务器配置实验报告FTP服务器配置实验报告一、实验目的本实验旨在配置FTP服务器,使其能够实现文件的和功能,以便进行文件传输和共享。
二、实验环境1.操作系统:Windows 102.软件:三、实验步骤1.和安装a.在官方网站的安装包b.打开安装包并按照提示逐步完成安装程序2.配置FTP服务器a.打开软件b.在“编辑”菜单中选择“用户”选项c.“添加”按钮,输入用户名和密码,选择用户权限d.“共享文件夹”选项卡,选择需要共享的文件夹路径e.“限制”选项卡,配置用户的访问限制和配额(可选)f.重复步骤c-e,为其他用户添加配置g.“确定”按钮保存配置3.配置FTP服务器监听端口a.在“编辑”菜单中选择“设置”选项b.在“通用”选项卡中选择需要监听的端口号c.根据需要选择其他设置,如最大连接数和超时时间d.“确定”按钮保存配置4.启动FTP服务器a.在软件中,“服务器”菜单中的“启动”选项b.如果启动成功,将在软件状态栏显示“服务器已启动”信息c.如果启动失败,检查配置是否有误,并重新启动服务器5.连接到FTP服务器a.在本地计算机上打开FTP客户端软件(如)b.输入FTP服务器的IP地质、端口号、用户名和密码c.“连接”按钮,如果连接成功,即可进行文件的和操作四、实验结果与分析根据实验步骤配置FTP服务器后,成功连接到FTP服务器,并能够正常进行文件的和操作。
实验结果表明,FTP服务器配置正确,并具有文件传输和共享功能。
五、实验总结通过本次实验,我掌握了FTP服务器的配置方法,能够实现文件的和功能。
FTP服务器的使用在文件传输和共享方面具有重要意义,能够提高工作效率和数据的安全性。
附件:本文档无附件。
法律名词及注释:1.Transfer Protocol):文件传输协议,用于在计算机之间进行文件的传输和共享。
2.IP地质(Internet Protocol Address):互联网协议地质,用于标识和定位计算机网络中的设备。
计算机网络体系结构实验报告-FTP 服务安装与配置

计算机网络体系结构实验报告FTP 服务安装与配置一、实验内容使用IIS功能新建FTP站点,并对站点进行账户管理以及安全管理,同时使用另外一台机器对其进行访问二、实验目的掌握Windows Server中的IIS配置FTP服务器,同时掌握WireShake抓包工具三、实验环境3.1 实验环境服务端IP:172.23.202.3服务端系统:Windows Server 2003服务端工具:IIS管理工具客户端:172.30.154.88客户端系统:MacOS Mojave 10.14.6客户端工具:terminal终端、WireShake抓包工具、Finder3.2 网络拓扑图3.2 IIS配置FTP服务器流程四、实验原理文件传输协议(File Transfer Protocol,FTP),是用在网络上进行文件传输的一套标准协议。
它工作在应用层,使用TCP运输层传输协议,即客户和服务器建立连接需要进行三次握手的过程,同时释放连接的时候也需要进行四次挥手的过程。
FTP服务系统是典型的C/S工作模式,在网络上的两个站点进行文件传输时,要求服务器主机运行FTP服务程序,同时客户主机也应在其计算机上运行相应的FTP客户程序或者通过命令行来直接调用FTP来来进行服务。
FTP在服务器主机和客户主机之间需要建立两次连接,一个是控制连接,端口号为21,用于传出控制信息;另外一个是数据连接,端口号为20(或其他),用于数据的传送。
采用分开传送的方法大大提高了FTP的效率。
所以在建立连接时需要建立两次TCP连接。
并且每当一个文件传输结束时,数据连接将关闭,传输下一个文件时再打开,而控制连接则持续保持连接状态。
FTP协议的连接模式分为被动模式(PASV)以及主动模式(PORT)。
被动模式为服务器处于运行的状态,同时开启FTP服务系统,处于监听状态。
客户端通过FTP客户程序对其进行发起连接以及文件传输等功能。
而主动模式则与其相反,客户端处于监听状态,由服务器发起连接。
文件传送协议实验报告

一、实验目的1. 理解文件传送协议的基本原理和流程。
2. 掌握常用的文件传送协议,如FTP、TFTP等。
3. 学习使用文件传送协议进行文件的上传和下载。
4. 了解文件传送协议在实际应用中的优势和局限性。
二、实验环境1. 操作系统:Windows 102. 软件环境:Cygwin、FTP Server、FTP Client3. 网络环境:局域网三、实验内容1. FTP协议实验2. TFTP协议实验四、实验步骤1. FTP协议实验(1)搭建FTP服务器1)在Cygwin中安装FTP服务器。
2)配置FTP服务器,设置用户名和密码。
3)启动FTP服务器。
(2)使用FTP客户端连接FTP服务器1)在Cygwin中安装FTP客户端。
2)使用FTP客户端连接到FTP服务器。
3)登录FTP服务器。
(3)上传和下载文件1)在FTP客户端选择要上传的文件。
2)使用FTP客户端将文件上传到FTP服务器。
3)在FTP客户端选择要下载的文件。
4)使用FTP客户端将文件从FTP服务器下载到本地。
2. TFTP协议实验(1)搭建TFTP服务器1)在Cygwin中安装TFTP服务器。
2)配置TFTP服务器,设置共享目录。
3)启动TFTP服务器。
(2)使用TFTP客户端连接TFTP服务器1)在Cygwin中安装TFTP客户端。
2)使用TFTP客户端连接到TFTP服务器。
(3)上传和下载文件1)在TFTP客户端选择要上传的文件。
2)使用TFTP客户端将文件上传到TFTP服务器。
3)在TFTP客户端选择要下载的文件。
4)使用TFTP客户端将文件从TFTP服务器下载到本地。
五、实验结果与分析1. FTP协议实验实验结果表明,使用FTP协议可以方便地进行文件的上传和下载。
FTP服务器和客户端的配置较为简单,易于操作。
但在实际应用中,FTP协议存在以下局限性:(1)FTP协议不是加密传输,存在安全隐患。
(2)FTP协议传输速度较慢。
(3)FTP协议不支持断点续传。
ftp实验报告

ftp实验报告FTP实验报告一、引言FTP(File Transfer Protocol,文件传输协议)是一种用于在网络上进行文件传输的标准协议。
它基于客户端-服务器模型,通过在客户端和服务器之间建立连接,实现文件的上传和下载。
本实验旨在通过搭建FTP服务器和客户端,探索FTP协议的工作原理,并测试其性能和稳定性。
二、实验环境和工具本次实验使用的环境是一台Windows操作系统的计算机,实验工具包括FileZilla Server和FileZilla Client。
三、实验步骤1. 搭建FTP服务器首先,在计算机上安装FileZilla Server软件。
安装完成后,打开软件并进行配置。
配置包括设置服务器的监听IP地址和端口号,设置用户账号和密码,以及设置共享文件夹的路径。
配置完成后,启动FTP服务器。
2. 配置FTP客户端在另一台计算机上安装FileZilla Client软件。
安装完成后,打开软件并进行配置。
配置包括设置FTP服务器的地址、端口号、用户名和密码。
配置完成后,连接到FTP服务器。
3. 文件上传和下载在FTP客户端上,选择需要上传的文件,并将其拖拽到服务器的文件列表中。
文件上传完成后,可以在服务器端的共享文件夹中看到该文件。
同样地,在FTP客户端上选择需要下载的文件,并将其拖拽到本地文件列表中。
文件下载完成后,可以在本地计算机的指定位置找到该文件。
四、实验结果和分析1. 性能测试在实验过程中,我们测试了FTP协议的性能。
通过上传和下载不同大小的文件,我们记录了文件传输所需的时间,并计算了传输速度。
实验结果显示,随着文件大小的增加,传输速度逐渐下降。
这是因为较大的文件需要更多的时间来传输,而网络带宽是有限的。
2. 稳定性测试我们还测试了FTP协议的稳定性。
在大量并发上传和下载文件的情况下,观察FTP服务器和客户端的响应情况。
实验结果显示,当并发操作过多时,FTP 服务器的响应时间会增加,甚至出现连接超时的情况。
FTP服务器配置实验报告

实验一FTP服务器配置
一、实验目的:
1.创建一个ftp服务器, 提供文件下载和上传功能。
2.提供匿名登录功能, 用于下载公共文件, 但不能匿名上传
3.同时也提供用户登录, 用户只能限制在自己的目录下, 这是可以上载也可以下载
1.二、服务器配置的基本步骤:
2.单击“开始”, 指向“控制面板”, 然后单击“添加或删除程序”。
3.单击“添加/删除Windows 组件”。
在“组件”列表中, 单击“应用程序服务器”, 单击“Internet 信息服务(IIS)”(但是不要选中或清除复选框), 然后单击“详细信息”。
单击以选中下列复选框:
“公用文件, 文件传输协议(FTP) 服务, Internet 信息服务管理器单击“完成。
IIS 和FTP 服务现已安装。
5, 配置FTP 服务
○1启动“Internet 信息服务管理器”或打开IIS 管理单元。
展开“FTP 站点”——右击“默认FTP 站点”, 然后单击“属性”。
单击“FTP站点”——分别再写入ftp站点名称newest 和配置IP地址, 在FTP站点连接项目处点击“不受限制”, 其余设置保存默认, 然后点击确定
单击“安全帐户”选项卡——单击以选中“允许匿名连接”复选框, 单击“确定”。
点击主目录——选择浏览本地目录, 并且将读取写入和记录访问项目勾选上, 这样客户端就有权限进行上传下载功能。
○6目录安全性
如图可以通过IP地址拒绝用户访问
三: 验证
可以再IE窗口地址栏输入ftp://192.168.1.3 然后回车进行验证, 打开主目录后可以验证上传下载功能。
ftp实验报告

ftp实验报告一、实验目的1.在linux系统上完成一个FTP协议的简单实现。
2.深入了解FTP的原理和协议细节。
3.学会利用socket接口设计简单的应用层协议,掌握TCP/IP网络应用程序的基本设计方法和实现技巧。
二、实验内容实现以下FTP命令1.get:取远方的一个文件。
2.put:传给远方一个文件。
3.pwd:显示远方的当前目录。
4.dir:列出远方的当前目录。
5.cd:改变远方的当前目录。
6.?:显示提供的命令。
7.quit:退出。
三、思考题1.为什么需要建立两个TCP连接来分别传输命令和数据?为了在传输数据的同时还能进行控制。
2.主动方式和被动方式的区别是什么,为什么要设计这两种不同的方式?主动方式:客户端开好数据端口,服务器通过20端口向客户端数据端口发送连接请求被动方式:服务器开好数据端口并通过命令端口来告知客户端,等待客户端连接PASV模式出现的目的之一是防止客户端防火墙的影响。
3.当使用FTP下载大量小文件的时候,速度会很慢,为什么,怎么改进?因为每一个文件的传输都要在控制连接中发送几次控制命令并且每次都要重新关闭和打开数据连接,因此速度很慢。
可以通过保留每一次的数据连接以减少时间消耗。
四、源代码及注释见附件。
五、源代码(linux下)server.cpp#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <fstream>#include <dirent.h>#include <sys/socket.h>#include <sys/types.h>#include <signal.h>#include <arpa/inet.h>#include <pthread.h>#include <assert.h>#include <string>#include <netinet/in.h>#include <iostream>#define BUF_SIZE 256#define ROOT_DIR "."using namespace std;enum DataType {TYPE_ASCII, TYPE_IMAGE};//打印线程信息void log(const string & s){pthread_t th = pthread_self();printf("[PID %d] %s \n", th, s.c_str());}//根据文件名,将文件读到content中去int readFile(const string & filename, string & content){ log("Reading file: " + filename);ifstream in(ROOT_DIR + filename, ios::in | ios::binary);if(in){content = "";in.seekg(0, ios::end);//获得文件大小content.resize(in.tellg());in.seekg(0, ios::beg);//复制文件in.read(&content[0], content.size());in.close();log("Read file ok. Size: " + to_string(content.size()));return 0;}log("Read file error.");return -1;}//将content中的内容存到文件名为filename的文件中int storeFile(const string & filename, string & content){ log("Writing to file: " + filename);ofstream out(ROOT_DIR + filename, ios::out | ios::binary);if(out){out << content;out.close();log("Write ok. Size: " + to_string(content.size()));return 0;}log("Write file error.");return -1;}//列出cwd下的文件列表int listDir(string cwd, string & ret){ret = "";DIR * dp;struct dirent *ep;dp = opendir((ROOT_DIR + cwd).c_str());if(dp == NULL) return -1;while(ep = readdir(dp)){ret += ep->d_name;ret += "\r\n";}closedir(dp);return 0;}//读控制连接string readCmd(int sockfd, bool logging = true){string buf;char _tmp[BUF_SIZE];while(true){int _len = read(sockfd, _tmp, BUF_SIZE - 1);for(int i = 0 ; i < _len ; i += 1) buf += _tmp[i];if(_len == 0 || _tmp[_len-1] == '\n') break;}while(buf.length() != 0 && (buf.back() == '\n' || buf.back() == '\r')) buf.pop_back();if(logging){string to_print = "Recv: " + buf +"[len:" + to_string(buf.length()) + "]";log(to_print);}return buf;}//写控制连接int writeCmd(int sockfd, int code, const string & msg){string buf = to_string(code);buf += ' ';buf += msg;log("Send: " + buf);buf += "\r\n";return write(sockfd, buf.c_str(), buf.length());}//启动被动模式,开启数据连接int openPasvSocket(int sockfd){struct sockaddr_in localaddr, dataserv_addr, datacli_addr;socklen_t localaddrlen = sizeof(localaddr),datacli_addr_len = sizeof(datacli_addr),dataserv_addr_len = sizeof(datacli_addr);//得到客户端的地址getsockname(sockfd, (struct sockaddr*)&localaddr, &localaddrlen);//换成点分十进制的地址string ret_str = inet_ntoa(localaddr.sin_addr);for(int i = 0 ; i < ret_str.length() ; i += 1)if(ret_str[i] == '.') ret_str[i] = ',';//配置数据连接的地址dataserv_addr.sin_family = AF_INET;dataserv_addr.sin_addr.s_addr = INADDR_ANY;dataserv_addr.sin_port = 0;int dataserve_sock = socket(AF_INET, SOCK_STREAM, 0);//绑定if(bind(dataserve_sock, (struct sockaddr *)&dataserv_addr,sizeof(dataserv_addr)) < 0){log("Bind PASV socket error.");writeCmd(sockfd, 421, "Service not available");return -1;}//监听listen(dataserve_sock, 1);//获取本地的数据端口getsockname(dataserve_sock, (struct sockaddr *)&dataserv_addr, &datacli_addr_len);unsigned int dataserv_port = ntohs(dataserv_addr.sin_port);log((string("PASV socket port: ") +to_string(dataserv_port)).c_str());ret_str += ",";ret_str += to_string(dataserv_port >> 8) + ",";ret_str += to_string(dataserv_port & 0xff) + ").";ret_str = "Entering Passive Mode (" + ret_str;//通过控制连接将数据端口发送给客户端writeCmd(sockfd, 227, ret_str);log("Listening PASV socket.");//等待客户端连接数据端口int newfd = accept(dataserve_sock,(struct sockaddr *)&datacli_addr,(socklen_t *)&datacli_addr_len);log("PASV socket accepted.");close(dataserve_sock);return newfd;}//写数据连接void writeData(int sockfd, int &datasock,const void * buf, int buf_len){if(datasock < 0){writeCmd(sockfd, 150, "File status okay. About to open data connection.");return ;}writeCmd(sockfd, 125, "Data connection already open. Transfer starting.");write(datasock, buf, buf_len);close(datasock);datasock = -1;writeCmd(sockfd, 226, "Transfer complete.");}//读数据连接void readData(int sockfd, int &datasock, string & content){content = "";if(datasock < 0){writeCmd(sockfd, 150, "File status okay. About to open data connection.");return ;}writeCmd(sockfd, 125, "Data connection already open. Transfer starting.");char _tmp[BUF_SIZE];while(1){int _len = read(datasock, _tmp, BUF_SIZE-1);for(int i = 0 ; i < _len ; i += 1) content += _tmp[i];if(_len <= 0) break;}close(datasock);datasock = -1;writeCmd(sockfd, 226, "Transfer complete.");}void * workThread(void * clientcmdID){//工作线程signal(SIGPIPE, SIG_IGN);int clientcmdsock = *(int *)clientcmdID;//clientcmdsockstring buf;//当前相对路径string cwd = "/";int datasock = -1;//220 对新用户准备完毕writeCmd(clientcmdsock, 220, "preperation done, ftp is available");while(true){//取命令buf = readCmd(clientcmdsock);if(buf.length() == 0){log("Read error. exit.");break;}char * buf_str = new char[buf.length() + 1];strcpy(buf_str, buf.c_str());// 取命令的前部,转成C风格字符串char * CMDCode = strtok(buf_str, " \r\n");if(strcmp(CMDCode, "QUIT") == 0) break;if(strcmp(CMDCode, "PASV") == 0){//启动被动模式,准备数据连接datasock = openPasvSocket(clientcmdsock);continue;}if(strcmp(CMDCode, "PWD") == 0){string _tmp = '"' + cwd + '"';//使用命令连接传送当前路径writeCmd(clientcmdsock, 257, _tmp + " is the current path.");continue;}if(strcmp(CMDCode, "DIR") == 0){string _tmp;//列出当前路径下的文件名listDir(cwd, _tmp);//使用数据连接发送当前文件夹下的文件列表writeData(clientcmdsock, datasock, _tmp.c_str(), _tmp.length());continue;}if(strcmp(CMDCode, "CD") == 0){//改变路径//取第二个参数路径转移目标CMDCode = strtok(NULL, " \r\n");string _tmp;if(listDir(cwd+CMDCode, _tmp) == 0){cwd += CMDCode;cwd += '/';writeCmd(clientcmdsock, 200, "Changed dir to " + cwd + ".");}else writeCmd(clientcmdsock, 550, "Dir not exist.");continue;}if(strcmp(CMDCode, "GET") == 0){//下载文件CMDCode = strtok(NULL, " \r\n");string _tmp;if(readFile(cwd+CMDCode, _tmp) == 0)//使用数据连接发送文件流writeData(clientcmdsock, datasock, _tmp.c_str(), _tmp.length());else writeCmd(clientcmdsock, 550, "Open file error.");continue;}if(strcmp(CMDCode, "PUT") == 0){CMDCode = strtok(NULL, " \r\n");string _tmp;//使用数据连接接收文件流readData(clientcmdsock, datasock, _tmp);storeFile(cwd+CMDCode, _tmp);continue;}// other commandwriteCmd(clientcmdsock, 500, "Unknown command.");}close(clientcmdsock);close(datasock);log("Quiting...");return NULL;}int main(int argc, char ** argv){//第一个参数是端口//检查参数个数if(argc < 2){cout << "usage:sudo ./server port" << endl;return -1;}int cmdsock = socket(AF_INET, SOCK_STREAM, 0);//检查是否socket是否创建成功if(cmdsock < 0){cout << "create socket failed" << endl;return -1;}struct sockaddr_in serv_addr, cli_addr;//配置本地地址信息serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = INADDR_ANY;serv_addr.sin_port = htons(atoi(argv[1]));//绑定地址int ret = bind(cmdsock, (struct sockaddr *)&serv_addr, sizeof(serv_addr));if(ret < 0){cout << "bind failed" << endl;return -1;}//开始监听ret = listen(cmdsock, 5);if(ret < 0){cout << "listen failed" << endl;return -1;}pthread_t thread;puts("Listening...");while(true){int cli_addr_len = sizeof(cli_addr);//接收客户端的连接请求int clientcmdsock = accept(cmdsock, (struct sockaddr *)&cli_addr, (socklen_t *)&cli_addr_len);//创建线程处理与客户端的通信pthread_create(&thread, NULL, workThread, (void *)&clientcmdsock);cout << "accept a new connection from" << inet_ntoa(cli_addr.sin_addr)<< ":" << ntohs(cli_addr.sin_port) << ", thread:" << thread << endl;}return 0;}client.cpp#include <stdio.h>#include <stdlib.h>#include <iostream>#include <string.h>#include <unistd.h>#include <fstream>#include <dirent.h>#include <sys/socket.h>#include <sys/types.h>#include <signal.h>#include <arpa/inet.h>#include <assert.h>#include <string>#include <netinet/in.h>#include <netdb.h>#define BUF_SIZE 256#define ROOT_DIR "."using namespace std;//根据文件名,将文件读到content中去int readFile(const string & filename, string & content){ printf("Reading file: %s\n", filename.c_str());ifstream in(filename, ios::in | ios::binary);if(in){content = "";in.seekg(0, ios::end);//获得文件大小content.resize(in.tellg());in.seekg(0, ios::beg);//复制文件in.read(&content[0], content.size());in.close();printf("Read ok\n");return 0;}printf("Read error.\n");return -1;}//将content中的内容存到文件名为filename的文件中int storeFile(const string & filename, string & content){ printf("Writing file: %s\n", filename.c_str());ofstream out(filename, ios::out | ios::binary);if(out){out << content;out.close();printf("Write ok. ");return 0;}printf("Write file error.");return -1;}//读控制连接string readCmd(int sockfd){string buf;char _tmp[BUF_SIZE];while(1){int _len = read(sockfd, _tmp, BUF_SIZE - 1);for(int i = 0 ; i < _len ; i += 1) buf += _tmp[i];if(_len == 0 || _tmp[_len-1] == '\n') break;}while(buf.length() != 0 && (buf.back() == '\n' || buf.back() == '\r')) buf.pop_back();return buf;}//写控制连接string sendCmd(int cmdsock, string msg){//sockfd 服务器msg += "\r\n";write(cmdsock, msg.c_str(), msg.length());string ret = readCmd(cmdsock);cout << ret << endl;return ret;}int connectSocket(const char * host, int port){//连接到服务器printf("Connecting to %s:%d\n", host, port);int sockfd = -1;struct sockaddr_in serv_addr;struct hostent *server;//创建一个socketsockfd = socket(AF_INET, SOCK_STREAM, 0);//含有服务器的相关信息server = gethostbyname(host);if(server == NULL){printf("No such host.\n");return -1;}serv_addr.sin_family = AF_INET;//拷贝地址信息memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length);//设置连接的端口serv_addr.sin_port = htons(port);//建立连接if(connect(sockfd, (struct sockaddr *) & serv_addr, sizeof(serv_addr)) < 0){ printf("Connect error.\n");return -1;}printf("Connect OK.\n");//返回连接的socketreturn sockfd;}int connectPASV(int cmdsock){//sockfd 服务器printf("Connecting PASV...\n");string tmp("PASV");//发送请求被动连接命令tmp = sendCmd(cmdsock, tmp);//检查返回值,返回值包含了数据连接的地址和端口assert(strncmp(tmp.c_str(), "227", 3) == 0);tmp = tmp.substr(tmp.find('(') + 1);string _addr;//获取数据连接的地址for(int i = 0, dot_count=0; i < tmp.length() ; i += 1){ if(tmp[i] == ','){if(dot_count == 3) break;tmp[i] = '.';dot_count += 1;}_addr += tmp[i];}//获取数据连接的端口unsigned int port = 0;tmp = tmp.substr(tmp.find(',') + 1);char * s = new char[tmp.length() + 1];strcpy(s, tmp.c_str());port = atoi(strtok(s, ",) "));port <<= 8;port += atoi(strtok(NULL, ",) "));delete []s;//创建并返回数据连接return connectSocket(_addr.c_str(), port);}//写数据连接void readData(int &datasock, string & content){content = "";char _tmp[BUF_SIZE];while(1){int _len = read(datasock, _tmp, BUF_SIZE-1);for(int i = 0 ; i < _len ; i += 1) content += _tmp[i];if(_len <= 0) break;}//close(datasock);//datasock = -1;}void printHelp(){cout << "GET:取回服务器一个文件" << endl<< "PUT:传给服务器一个文件" << endl<< "PWD:显示服务器当前目录" << endl<< "DIR:显示服务器当前目录下的文件" << endl<< "CD:改变服务器目录" << endl<< "?:帮助" << endl;}int main ( int argc, char *argv[] ){assert(argc > 1);signal(SIGPIPE, SIG_IGN);//控制连接,连接服务器int cmdsock = connectSocket(argv[1], 21);assert(cmdsock >= 0);string tmp = readCmd(cmdsock);cout << tmp << endl;int datasock = -1;while(true){//数据连接if(datasock < 0) datasock = connectPASV(cmdsock);string cmd;printf("> ");//获取命令getline(cin, cmd);while(cmd.back() == '\n' || cmd.back() == '\r' || cmd.back() == ' ') cmd.pop_back();if(strncmp("?", cmd.c_str(), 1) == 0){printHelp();continue;}//通过控制连接发送命令string reply = sendCmd(cmdsock, cmd);if(strncmp("125", reply.c_str(), 3) == 0){//如果发送控制指令成功string filecontent;//只有存、取和列在本地才会有后续操作//存文件if(strncmp("PUT", cmd.c_str(), 3) == 0){//取文件名tmp = cmd.substr(cmd.find(' ') + 1);//读本地文件assert(readFile(tmp, filecontent) >= 0);//写数据连接write(datasock, filecontent.c_str(), filecontent.size());//关闭数据连接close(datasock);}//下载文件if(strncmp("GET", cmd.c_str(), 3) == 0){//取文件名tmp = cmd.substr(cmd.find(' ') + 1);//读数据连接readData(datasock, filecontent);//写本地文件assert(storeFile(tmp, filecontent) >= 0);//关闭数据连接close(datasock);}if(strncmp("DIR", cmd.c_str(), 3) == 0){readData(datasock, filecontent);cout << filecontent << endl;//关闭数据连接close(datasock);}if(strncmp("PWD", cmd.c_str(), 3) == 0)cout << reply << endl;elsedatasock = -1;//再读一行命令连接??readCmd(cmdsock);}}return EXIT_SUCCESS;}。
ftp服务器实验报告

ftp服务器实验报告FTP服务器实验报告一、引言FTP(File Transfer Protocol)是一种用于在计算机之间传输文件的标准网络协议。
它允许用户通过客户端与服务器进行连接,并进行文件的上传和下载。
本实验旨在通过搭建一个FTP服务器,探索其工作原理和应用场景,并评估其性能。
二、实验环境和方法本实验使用了一台运行Windows操作系统的计算机作为FTP服务器,另一台计算机作为客户端。
实验中使用的FTP服务器软件为FileZilla Server,它是一款功能强大且易于使用的开源软件。
1. 安装和配置FTP服务器在服务器上下载并安装FileZilla Server软件,然后进行基本的配置。
配置包括设置监听端口、创建用户账户、设定访问权限等。
为了保证安全性,我们还启用了SSL/TLS加密功能。
2. 客户端连接和文件传输在客户端上,我们使用FileZilla Client软件连接到服务器。
通过输入服务器的IP 地址、用户名和密码,我们成功建立了与服务器的连接。
然后,我们进行了一系列的文件上传和下载操作,测试FTP服务器的性能和稳定性。
三、实验结果与分析通过实验,我们得到了以下结果和分析:1. 连接速度和稳定性在实验过程中,我们发现FTP服务器的连接速度非常快,并且连接稳定。
无论是上传还是下载文件,都能迅速完成,没有出现中断或卡顿的情况。
这表明FTP服务器具有较高的性能和可靠性。
2. 文件传输效率我们通过传输不同大小的文件来测试FTP服务器的传输效率。
结果显示,对于小文件(几十KB至几百KB),传输速度非常快,几乎可以忽略不计。
但是对于大文件(几十MB至几百MB),传输速度会稍微下降,但仍然在可接受范围内。
这是因为FTP协议本身的设计,对于大文件的传输会有一定的开销。
3. 安全性通过启用SSL/TLS加密功能,我们增强了FTP服务器的安全性。
这意味着所有的数据传输都经过加密,防止了敏感信息被窃取的风险。
计算机网络体系结构实验报告-FTP服务器

计算机网络体系结构实验报告选课序号44 专业网络工程班级2班学号学生姓名课程名称计算机网络体系结构实验实验时间7/14实验名称FTP服务器实验成绩FTP服务器的架设实验内容1.安装、配置FTP服务器;2.利用FTP服务器提供的服务对用户进行账户管理、权限管理;3.通过FTP服务器对用户的运行情况进行监控。
实验目的了解FTP服务器的基本概念与实现原理;掌握FTP服务器软件的安装与配置方法;了解FTP服务器所具备的基本功能。
实验环境实验设备:Windows Server 2003 Marjaro Linux实验工具:WireShark实验拓扑:实验原理本实验使用两台计算机,一台作为服务器,另一台作为客户机,服务器具有静态固定的 IP 地址。
在客户端上使用 IE 浏览器对客户机的局域网进行设置,设置好代理服务器的地址和端口号,从而该客户机只能通过代理服务器访问因特网。
在代理服务器端做相应设置,客户端申请接入因特网时,服务器对客户端的 IP 地址、密码进行验证,从而保证只有此局域网中的客户机才能通过代理服务器访问互联网。
通过在客户端设置网站过滤,不同的客户端拥有不同的访问权限,有选择性地允许客户机按协议建立链接,拥有不同的访问网站权限和访问时间权限等。
从而实现主机的分级管理。
代理服务器与主机共用一个缓存器,通过设置服务器的缓存容量配置,增加了缓存容量,从而可以提高访问速度实验过程按照实验步骤在FTP服务器上架设好FTP 服务,使用在同意网段的客户机访问在网上邻居访问:使用Filezila 进行ftp 访问尝试进行文件的上传,发现提示没有权限,无法上传,进行权限的设置:「使客户机也可以读出和写入,可以上传和修改文件在客户机和FTP服务器建立链接时开始抓包并使用ftp 来筛选ftp 报文:可以看出ftp 运输层是通过TCP 协议来完成的,前三个报文TCP客户机和FTP服务器三次握手建立链接:客户机使用的是随机分配的端口36338 ,FTP 服务器使用的是FTP协议通用端口21, 客户机先发送一个SYN 同步报文序号为0不携带数据,服务器回复一个SYN ACK 同步确认报文序号为0,确认号为1不携带数据,客户机再发送一个ACK 确认报文序号为1,确认号为1. 此时链接建立从627 以后是FTP 的内容:下面是FTP 流:首先从627 到644 是用户登陆报文627 服务器在建立链接之后,发送一个220准备完毕的报文628 是627 的确认报文629 告知服务器名称,630 对其确认631 客户机开始使用AUTH TLS命令登陆,但是服务器没有配置TLS ,登陆失败:633 使用AUTH SSL 登陆,同样SSL没有配置,登陆失败:635 使用USER anonymous 登陆,成功:登陆成功使用e-mail name 作为密码从登陆过程可以看到:FTP 使用TCP 协议进行可靠传输所以每一条请求都要有相应的确认回复下面执行一个删除操作进行验证:报文从2007到2012:先移动到/chikai 目录:删除2021-07-10_08-57.png 文件可见FTP 进行目录切换,文件删除等操作时,都是通过命令进行如DELE 2021.png客户机发送命令,服务器收到后,回复一个命令执行状态客户机再对服务器报文进行确认,一个命令执行完毕实验总结1.错误:开始的时候无法在FTP 服务器进行上传和删除等操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FTP实验报告
实验环境:一台Linux作为服务器(A)
一台xp作为客户机(B)
FTP的基本搭建:
服务器A的操作:
1 内外挂光盘
mount /dev/cdrom /mnt
2 配ip(192.168.100.5/24)
3 装包
rpm –ivh /mnt/Server/vsftpd-2.0.5-10.e15.i386.rpm
4 重启FTP服务
service vsftpd restart
注:此时默认的为匿名用户,但只能下载而不能上传、修改允许匿名用户上传和修改:
A: 1 ftp的基本搭建
2 配置文件
vi /etc/vsftpd/vsftpd.conf
3 修改/var/ftp/pub的权限为777
注:此时xp客户机可以上传和修改
注:FTP的主目录在/var/ftp/pub
本地用户登录:
A: 1 ftp的基本搭建
2 配置文件
3 创建用户qq
B: xp客户机访问
可以用qq用户登录,默认可以下载、上传、修改
注:此时只有本地用户可以访问,匿名用户不可以访问
设置欢迎语(huan ying ni de fang wen):
A: 1 ftp的基本搭建
2 配置文件
vi /etc/vsftpd/vsftpd.conf
3 重启ftp服务
service vsftpd restart
B: xp客户机访问
锁定用户(所有用户都不能随便访问其他目录,只能在自己的目录中):未锁定用户前如下:
A: 1 ftp的基本搭建
2 配置文件
vi /etc/vsftpd/vsftpd.conf
在文件最后写上chroot_local_user=YES
3 重启ftp服务
service vsftpd restart
B: xp客户机访问(锁定后)
如何锁定部分用户:
A: 1 ftp的基本搭建
2 创建用户w
3 配置文件
vi /etc/vsftpd/vsftpd.conf
4 创建文件
vi /etc/vsftpd/chroot_list
5 重启ftp服务
B: xp客户机访问
注意:当修改配置文件时,在最后一行写入chroot_local_user时,写入/etc/vsftpd/vsftpd.conf中的用户是被解锁的;在最后一行不写
chroot_local_user时,写入/etc/vsftpd/vsftpd.conf中的用户是被锁定的用户。
至此完成实验
苛嗳雨儿。