用telnet实现FTP交互
1. FTP初认识
众所周知,由于对可靠数据传输服务的依赖,FTP同HTTP协议一样在运输层选择的都是TCP服务。但是又有一个最重要的区别:FTP使用的是两个并行的TCP连接,一个是用于在客户机和服务器之间传输控制信息的控制连接(TCP端口号是21),另一个是用于实际传输一个文件的数据连接。正是由于FTP的控制连接和数据连接是分离的,所以我们称FTP的控制信息是带外传送的。
数据连接有两种传输模式:
①主动(PORT)方式的连接过程是:客户机从一个非特权端口N(N>1024)与服务器在端口号21建立了控制连接后,然后客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX号端口,你快点过来连接我(づ ̄3 ̄)づ╭❤~”。于是服务器就通过20号端口与客户机的XXXX号端口建立一条数据链路。
②被动(PASV)方式的连接过程是:在建立了控制连接后,客户端向服务器的21号端口发出了PASV命令(被动连接请求),于是服务器就开启了xxxx号端口,告诉客户端:“我打开了xxxx号端口,快过来连我╭( ・ㅂ・)و ̑̑”。然后由客户端向服务器的xxxx号端口发送连接请求,然后建立一条数据链路。
2. FTP交互过程
①当用户主机与远程主机开启一个FTP会话前,FTP的客户机(用户)首先在21号端口上发起一个用于控制的与服务器(远程主机)的TCP连接。
②FTP的客户机通过该控制连接发送用户的标识和口令,也可以发送改变远程目录等命令。
③当FTP的服务器端从该连接上收到一个文件传输的命令后(无论是到远程主机还是从远程主机到客户机),就发起一个到客户机的数据连接。FTP在该数据连接上准确地传送一个文件并关闭该连接,但此时控制链路还保持连接。如果在同一个会话期间,用户还需要传输另一个文件,FTP则打开另一个数据连接。
因而对FTP传输而言,控制连接贯穿了整个用户会话期间,但是针对会话中的每一次文件传输都需要建立一个新的数据连接(即数据连接是非持久性的)。
3. 实验准备
①FTP服务器实验准备:
在开始实验之前我们得先建立一个或者找一个FTP服务器,这里为了后续实验操作方便,我们自己建立一个FTP服务器。我们可以用Windows自带的IIS来建立(详情请参考http://jingyan.baidu.com/article/455a9950e1e2fba167277862.html)或者第三方软件(如Serv-U、FileZilla Server等),这里我用的FileZilla Server,在百度软件中心就有,注意是FileZilla Server,不是用于上传的客户端FileZilla。
我们现在本地E盘建一个文件夹“ftp”,然后在下面建一个文件夹“123”以及“test.txt”,里面放上你想写的内容,然后再文件夹“123”下面再建一个“test123.txt”。
安装时为了防止默认的原端口号被占用强烈建议将端口号改成38121,如下图:
安装完成后登录时也记得把对应的端口改成38121,如下图:
进入以后为了实验方便,点击菜单栏Edit->settings,根据下图提示修改连接时间、端口号范围以及动态IP设置。
然后设置匿名FTP与本地文件夹关联以及访问权限:
点击菜单栏第四个图标,然后在右边的Users下面ADD一个叫“anonymous”的用户。
然后点击左边Page里的Shared folders,在Directories下点ADD,选中之前创建的E盘的“ftp”文件夹,然后在中间的权限上全部打钩,如下图所示:
这样一个ftp服务器就算建立完成了,更多Filezilla Server详细设置请参考:http://ce.sysu.edu.cn/hope2008/Education/ShowArticle.asp?ArticleID=13136
好了,我们用文件资源管理器验证一下,在我的电脑地址栏输入:ftp://服务器IP,看到了之前创建的“ftp”文件夹。用浏览器、第三方软件、甚至是Windows自带的FTP客户端都可以访问服务器:
注意:在实验之前得先把服务器的防火墙关掉,当时年少无知的我以为只要允许FTP通过防火墙就行了:
结果一直连接不上服务器,后面几天一直调服务器权限、调服务器端口都不行(;´༎ຶД༎ຶ`),最终把Windows防火墙彻底关掉才终于连接上服务器。
②FTP客户机实验准备:
客户机得开启telnet客户端,详情请查看3月26日推送消息“利用Telnet执行HTTP交互”。
③FTP常用命令及代码:
命令 | 描述 |
ABOR | 中断数据连接程序 |
ACCT <account> | 系统特权帐号 |
ALLO <bytes> | 为服务器上的文件存储器分配字节 |
APPE <filename> | 添加文件到服务器同名文件 |
CDUP <dir path> | 改变服务器上的父目录 |
CWD <dir path> | 改变服务器上的工作目录 |
DELE <filename> | 删除服务器上的指定文件 |
HELP <command> | 返回指定命令信息 |
LIST <name> | 如果是文件名列出文件信息,如果是目录则列出文件列表 |
MODE <mode> | 传输模式(S=流模式,B=块模式,C=压缩模式) |
MKD <directory> | 在服务器上建立指定目录 |
NLST <directory> | 列出指定目录内容 |
NOOP | 无动作,除了来自服务器上的承认 |
PASS <password> | 系统登录密码 |
PASV | 请求服务器等待数据连接 |
PORT <address> | IP 地址和两字节的端口 ID |
PWD | 显示当前工作目录 |
QUIT | 从 FTP 服务器上退出登录 |
REIN | 重新初始化登录状态连接 |
REST <offset> | 由特定偏移量重启文件传递 |
RETR <filename> | 从服务器上找回(复制)文件 |
RMD <directory> | 在服务器上删除指定目录 |
RNFR <old path> | 对旧路径重命名 |
RNTO <new path> | 对新路径重命名 |
SITE <params> | 由服务器提供的站点特殊参数 |
SMNT <pathname> | 挂载指定文件结构 |
STAT <directory> | 在当前程序或目录上返回信息 |
STOR <filename> | 储存(复制)文件到服务器上 |
STOU <filename> | 储存文件到服务器名称上 |
STRU <type> | 数据结构(F=文件,R=记录,P=页面) |
SYST | 返回服务器使用的操作系统 |
TYPE <data type> | 数据类型(A=ASCII,E=EBCDIC,I=binary) |
USER <username>> | 系统登录的用户名 |
响应代码 | 解释说明 |
110 | 新文件指示器上的重启标记 |
120 | 服务器准备就绪的时间(分钟数) |
125 | 打开数据连接,开始传输 |
150 | 打开连接 |
200 | 成功 |
202 | 命令没有执行 |
211 | 系统状态回复 |
212 | 目录状态回复 |
213 | 文件状态回复 |
214 | 帮助信息回复 |
215 | 系统类型回复 |
220 | 服务就绪 |
221 | 退出网络 |
225 | 打开数据连接 |
226 | 结束数据连接 |
227 | 进入被动模式(IP 地址、ID 端口) |
230 | 登录因特网 |
250 | 文件行为完成 |
257 | 路径名建立 |
331 | 要求密码 |
332 | 要求帐号 |
350 | 文件行为暂停 |
421 | 服务关闭 |
425 | 无法打开数据连接 |
426 | 结束连接 |
450 | 文件不可用 |
451 | 遇到本地错误 |
452 | 磁盘空间不足 |
500 | 无效命令 |
501 | 错误参数 |
502 | 命令没有执行 |
503 | 错误指令序列 |
504 | 无效命令参数 |
530 | 未登录网络 |
532 | 存储文件需要帐号 |
550 | 文件不可用 |
551 | 不知道的页类型 |
552 | 超过存储分配 |
553 | 文件名不允许 |
4. 正式实验
现在我们用Telnet来实现ftp交互,自建的服务器的动态IP地址为172.16.3.123
①我们先打开一个DOS窗口,输入telnet 172.16.3.123 21,来和服务器建立控制连接。
②建立控制连接后,先用user、pass命令登陆匿名FTP,输入user anonymous回车pass(由于是匿名FTP,所以随便输入什么都可以登陆,一般是输入自己的邮箱以便服务器端管理员了解自己的身份)。
注意:当建立控制连接后,每敲一个字母就会通过控制连接直接传到服务器端,所以如果敲错了按退格键修改只是改变客户机上的显示,命令还是错误的。
③现在就可以尝试一些不需要传输文件的命令,比如SYST获取服务器系统、HELP来获取帮助、CWD <子文件夹名>、CDUP来改变路径,甚至可以用DELE删除了原先的test.txt文件。由于list命令需要传输服务器的文件/文件夹列表,所以和RETR、STOR等命令都不能用。
④由于使用动态IP,我们只能通过被动(PASV)方式建立与服务器的数据连接,输入pasv回车,此时服务器返回了服务器的IP和服务器开启的端口号,比如下图传回的服务器IP是172.16.3.123,端口号是19*256+138=5002(好吧,为啥这样算我也不知道╮(╯▽╰)╭)
⑤然后我们再打开一个DOS,输入telnet 172.16.3.123 5002,然后就会出现一个全黑的Telnet的框,你会发现不管你输入什么都还是一片黑,不要怕,这就说明我们成功开启了数据连接了。
⑥这个时候我们再输入list命令看看,刚刚打开的的数据连接框出现了我们的列表(之前用DELE命令把test.txt删掉了),然后立刻出现了“遗失对主机的连接”,这正是我们之前说的一个数据连接传输完一个文件后会立刻关闭。
⑦我们再回到控制连接框用CWD命令进入子文件夹“123”,然后重复④、⑤
⑧然后试用下RETR test23.txt,发现数据连接框就出现了我们原先存入“test123.txt”的内容。
⑨重复④、⑤,在控制连接框输入stor test456.txt,如果服务器上有这个文件则会覆盖原先的文件,如果没有则新建一个文件。然后在看不见的
数据连接框输入你想要存储的内容,输完后回到控制连接框输入ABOR,断开数据连接,则服务器会把数据连接框输入的内容保存到“test456.txt”并关闭数据连接。