PORT模式:服务器
1
2
3
4
|
当FTP的Client以PORT模式链接FTP Server时,它动态的选择一个Port X(注意这个Port必定是
1024
以上的,由于
1024
之前的Port都已经预先被定义好,被一些典型的服务使用,固然有的还没使用,也是保留给之后会用到这些端口的资源服务)来链接FTP Server的
21
端口,当通过TCP的三次握手后,链接(控制信道)被创建。
如今用户要列出FTP Server上的目录结构(使用ls或dir命令),那么首先就要创建一个数据通道,由于只有数据通道才能传输目录和文件列表,此时用户会发出PORT指令告诉FTP Server链接本身的Port Y来创建一条数据通道(这个命令由控制信道发送给服务器)。当FTP Server接到这一指令时,FTP Server会使用
20
端口链接用户在PORT指令中指定的Port Y,用以发送目录的列表.
当完成这一操做时,FTP Client也许要下载一个文件,那么就会发出
get
命令,请注意,这时Client再次发送PORT指令,告诉服务器链接他的哪一个“新”端口。(你能够先用netstat -na这个命令验证,上一次使用的Y已经处于TIME_WAIT状态。)
当这个新的数据传输通道创建后(在微软的系统中,客户端一般会使用连续的端口,也就是说这一次客户端会用Y+
1
这个端口),就开始了文件传输的工做。
|
PASV模式:网络
1
2
3
4
5
6
|
在初始化链接这个过程,即链接FTP Server这个过程和PORT模式是同样的。
然而,当FTP Client以PASV模式链接FTP Server,FTP Client发送ls、dir、
get
等这些要求数据返回的命令时,当状况就有些不一样了。
FTP Client不向服务器发送PORT指令而是发送PASV指令,在这个指令中,Client告诉FTP Server本身要链接服务器的某一个端口:
1
> 若是这个服务器上的这个端口是空闲的可用的,那么服务器会返回ACK的确认信息,以后数据传输通道被创建并返回用户所要的信息(根据用户发送的指令,如ls、dir、
get
等);
2
> 若是服务器的这个端口被另外一个资源所使用,那么服务器返回UNACK的信息,那么这时,FTP客户会再次发送PASV命令,这也就是所谓的链接创建的协商过程。
为了验证这个过程咱们不得不借助CUTEFTP Pro这个FTP客户端软件,由于微软自带的FTP命令客户端,不支持PASV模式。虽然你可使用QUOTE PASV这个命令强制使用PASV模式,可是当你用ls命令列出服务器目录列表,你会发现它仍是使用PORT方式来链接服务器的。
|
PS:更详细的说明,请查阅http://www.microsoft.com/china/community/Column/70.mspxspa
EPRT/EPSV模式出现的缘由:翻译
FTP仅仅提供了创建在IPv4上进行数据通讯的能力,它基于网络地址是32位这一假设。可是,当IPv6出现之后,地址就比32位长许多了。原来对FTP进行的扩展在多协议环境中有时会失败。咱们必须针对IPv6对FTP再次进行扩展。代理
EPRT、EPSV是Extended Port/Pasv的简写。code
EPRT模式:ci
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
EPRT考虑到数据链接的扩展地址问题,扩展地址必须包括网络协议以及网络和传输地址。格式以下:
EPRT<空格><d><网络协议><d><网络地址><d><TCP端口><d>
EPRT后要跟空格,空格后面必须是分隔符<d>,分隔符必须在ASCII的
33
到
126
范围以内。推荐使用|,除非它已有它用。网络协议是一个数字,它指出使用的是什么协议。具体数据以下:
1
=IPv4;
2
=IPv6;
网络地址是在指定网络协议下的相应地址,在IPv4和IPv6下地址分别以下格式:
IPv4=
132.235
.
1.2
;IPv6=
1080
::
8
:
800
:200C:417A
TCP端口指的是协议在哪个TCP端口上侦听数据链接。下面是两个EPRT命令的例子:
EPRT |
1
|
132.235
.
1.2
|
6275
|
EPRT |
2
|
1080
::
8
:
800
:200C:417A|
5282
|
第一个命令在TCP端口
6275
上用IPv4打开主机
"132.235.1.2"
;
第二个命令在TCP端口
5282
上用IPv6打开主机
"1080::8:800:200C:417A"
。
在接收到合法的EPRT命令后,服务器必须返回
200
(命令合法)。标准的错误代码
500
和
501
已经足够处理大部分错误了,可是还须要一个错误代码,代码
522
指定服务器不支持请求的网络协议,新错误代码的解释以下:
5yz 交换信息结束
x2z 链接
xy2 扩展端口错误:未知的网络协议
响应的文本部分必须说明服务器运行的协议是什么,响应串的格式以下:
<说明不支持的网络的字符串> /(协议
1
,协议
2
,...,协议n)
上述的数字代码和在括号内的协议信息由软件自动控制接收响应;而在数字代码和
'('
之间的内容供人类用户处理。其后的协议表中的协议应该以逗号分隔。下面是两个响应串的例子:
Network protocol not supported,
use
(
1
)
Network protocol not supported,
use
(
1
,
2
)
|
EPSV模式:资源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
EPSV格式以下:
EPSV<空格><网络协议>
若是请求的网络协议是服务器支持的,那就必须使用此协议;若是不支持,则返回
522
。最后,EPSV命令可使用参数
"ALL"
经过网络地址翻译器,EPRT命令再也不使用。下面是例子:
EPSV<空格>ALL
接收到此命令后,服务器要拒绝除了EPSV之外全部创建链接的命令。
对于全部在两台相同机器间创建控制和数据链接的FTP传输来讲,必须使用EPSV。使用它能够减小经过防火墙和网络地址翻译器(NAT)对效率的影响。有些文章推荐在防火墙后使用被动命令,所以防火墙一般不容许主动链接。在本文中定义的EPSV命令不须要NAT在传输时对网络地址进行改变。若是使用EPRT,NAT必须改变网络地址。若是客户发送了
"EPSV ALL"
命令,NAT可以将链接变为快速方式,只要再不使用EPRT,就不须要对数据段的数据部分进行改变。若是客户但愿进行两路FTP传输,应该使用这条命令,若是后来客户须要创建三种FTP传输,必须新打开了个FTP会话。
EPSV请求服务器在一个数据端口上侦听等待链接,它能够带参数。对它的响应是TCP端口号。响应的格式与EPRT参数的很象。这对实现上有很大的方便。并且响应还留下了网络协议和/或网络地址的空位,能够供之后使用。使用扩展地址进行被动模式的响应码必须是
229
,对它的解释以下:
2yz 主动完成
x2z 链接
xy9 进行扩展的被动模式
响应的格式以下:
<指示服务器已经进入初扩展的被动模式> /(<d><d><d><TCP端口><d>)
包括在括号内的字符串必须是EPRT打开数据链接的端口。具体如上所未,这里就很少说了。数据链接使用的协议必须和控制链接使用的协议和地址一致,下面是响应的一个例子:
Entering Extended Passive Mode (|||
6446
|)
标准错误代码
500
和
501
对EPSV已经足够了(不支持EPSV)。在EPSV命令没有使用参数时,服务器会基于控制链接所使用的协议选择数据链接使用的网络协议。可是在有代理的状况下,这种机制可能不合适。所以客户也须要可以要求一个指定协议。若是服务器返回说明它在指定端口不支持此协议,客户必须发送ABOR(放弃)命令使服务器关闭链接,而后客户再使用EPSV命令要求使用特定的网络协议
|