FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”,用于Internet上的控制文件的双向传输。下面主要讲两个东西:一个是ftp的主动和被动传输,另一个是ftp的ASCII码传输与二进制传输。
1.ftp的主动传输与被动传输
TCP/IP协议中,FTP标准命令TCP端口号为21,数据传输端口为20。
一个主动模式的FTP连接建立要遵循以下步骤:
①.客户端打开一个随机的端口(端口号大于1024,在这里,我们称它为x),同时一个FTP进程连接至服务器的21号命令端口。此时,源端口为随机端口x,在客户端,远程端口为21,在服务器。
②.客户端开始监听端口(x+1),同时向服务器发送一个PORT命令(通过服务器的21号命令端口),此命令告诉服务器客户端正在监听的端口号并且已准备好从此端口接收数据。这个端口就是我们所知的数据端口。
③.服务器打开20号源端口并且建立和客户端数据端口的连接。此时,源端口为20,远程数据端口为(x+1)。
④.客户端通过本地的数据端口建立一个和服务器20号端口的连接,然后向服务器发送一个应答,告诉服务器它已经建立好了一个连接。
为了解决服务器发起到客户的连接的问题,人们开发了一种不同的FTP连接方式。这就是所谓的被动方式,或者叫做PASV,当客户端通知服务器它处于被动模式时才启用。在被动方式FTP中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。
FTP连接时,客户端打开两个任意的非特权本地端口(N > 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,上述连接步骤的第三步客户端不会提交PORT命令,而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。
对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:
①.从任何大于1024的端口到服务器的21端口 (客户端的初始化连接)
②.服务器的21端口到任何大于1024的端口 (服务器响应到客户端的控制端口的连接)
③.从任何大于1024端口到服务器的大于1024端口 (客户端初始化数据连接到服务器指定的任意端口)
④.服务器的大于1024端口到远程的大于1024的端口(服务器发送ACK响应和数据到客户端的数据端口)
2.ftp的ASCII码传输和二进制传输
1.ASCII传输方式
假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。
但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件。在拷贝任何非文本文件之前,用binary 命令告诉ftp逐字拷贝。
2.二进制传输模式
在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。
如在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会损坏数据。(ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果传输二进制文件,所有的位都是重要的。)
3.ftp的匿名登录
在ftp服务中有一种特殊的登陆方式—匿名登陆。
平常的用户名密码登陆要求每个用户在每一台主机上都拥有帐号,匿名登陆则不要求这一点,但是在搭建ftp服务器时务必要根据实际情况来决定是否开启匿名(anonymous)登陆以及匿名用户的权限。在《python绝技》一书中开篇一个脚本就是专门扫描允许匿名用户登陆以及弱口令用户名密码的ftp服务器并尝试上传木马文件。
常用的匿名:
1、 用户名:anonymous 密码:Email或者为空
2、 用户名:FTP 密码:FTP或者为空
3、 用户名:USER 密码:pass
4、用户名:guest 密码:guest