FTP 的工作方式有两种,标准 (PORT)方式式和 passive 方式。
以下假设 ftp server 的命令通道端口是 21。
标准方式:
1. FTP client 使用一个大于 1024 的 port 呼叫 FTP server 的端口 21 建立命令通道的连接。
2. client 挑选另一个大于 1024 的端口,用 port 命令通知 server 客户端可以用这个端口做数据通道。
3. server 用端口20 和 client 的上述端口建立连接进行数据传送。
PASV 模式:
1. 同标准方式。
2. client 发送 PASV 命令给 server 要求建立 PASV 模式。
3. server 挑选一个大于 1024 的端口回应通知 client 做数据通道。
4. client 用另一个大于 1024 的端口发起到刚才 server 告知的端口的连接,进行数据传送。
两种方式的关键差别在:
1. 数据通道建立的发起方是不同的;
2. 标准方式下 server 端的数据通道端口总是 20 ,而 pasv 方式下是随机挑选的。
具体点就是说,PASV模式的ftp:
client连接到server的21端口;
client告诉server一个端口号A;
server用20端口连接到client的端口A(数据通道)。
PASV模式的ftp:
client连接到server的21端口;
client告诉server用PASV模式;
server告诉client一个端口号B;
client发起连接到server的端口B(数据通道)。
可以看到,PORT模式中,数据通道是由server发起连接到client的,client如果是在NAT后面,如果NAT上没有高层ftp代理,这个连接就无法成功。而PASV模式中,连接都由client发起,就没有这个问题。但因为server要告诉client一个端口号B(一般都在高端的端口号),而且要接受client到这个端口的连接,所以防火墙设置比较麻烦了