有人能简单解释一下被动模式 FTP(PASV)和扩展被动模式 FTP(EPSV)之间的区别吗?
答案1
唯一的区别是PORT/PASV
仅限于 IPv4, 尽管EPRT/EPSV
适用于任何网络协议(尽管实际上只使用 IPv6)。
标准PORT
(主动)和PASV
(被动)FTP 控制协议中的命令交换地址和端口信息六个 1 字节小数,另一端必须从中重建一个四字节的 IP 地址和两字节的 TCP 端口号。
PORT <address[4]>,<port[2]>
PORT 132,235,1,2,24,131
但后来其他协议开始出现。IPv4 即将被“IPng”取代,而“IPng”曾有过不少相互竞争的替代提案(OSI CLNP、TUBA、SIP、SIPP、CATNIP – 历史上的不同时期),有些提案更短、更长,甚至多变的主机地址大小,直到最终定义了具有 16 字节地址的 IPv6。
仅仅发送更多字节是行不通的——服务器和客户端不可能仅根据地址长度就知道正确的协议。(例如,如果你有一个协议有 16 字节地址 + 4 字节端口,另一个协议有 12 字节地址 + 12 字节端口,会怎么样?)
此外——尽管这在 20 年前并不那么重要——但现在有数以百万计的NAT 设备在互联网上,它检查并破坏 FTP 控制连接,这样即使“内部”主机发送了 RFC1918 本地地址,“外部”主机也只能看到全局 IPv4 地址。即使没有 NAT,状态防火墙也经常会监视控制命令,以自动允许数据连接,而无需手动规则。
这基本上意味着,对于许多人来说,简单地发送更多带有PORT
或的数字PASV
肯定会中断。也许一些防火墙会悄悄地将一些地址字节误认为端口,并悄悄地丢弃其余字节;其他防火墙可能会断开连接,或者直接崩溃。
为了避免上述各种问题,必须引入新命令来实现 FTP 中的多协议支持。
1993年,RFC 1639(起初RFC 1545) 引入了“长地址”LPRT
和LPSV
命令,类似于PORT
&,PASV
但是带有可变地址长度;它们还包括协议类型标识符。(但它没有改变语法——IPv6 地址:端口将简单地以 21 个数字而不是 6 个数字发送。)
LPRT <protocol>,<addr-length>,<address...>,<port-length>,<port...>
LPRT 4,4,132,235,1,2,2,24,131
LPRT 6,16,16,128,0,0,0,0,0,0,0,8,8,0,32,12,65,122,2,20,162
然而,这仍然没有解决一些问题,例如要求服务器使用与控制连接不同的协议。RFC 也很快过时了;一年后 IPv6 问世时,它不能与 LPRT 一起使用,因为没有为其分配 LPRT 协议标识符(仅适用于各种早期提案)。
为了解决这个问题,RFC 24281998年新增EPRT
又称EPSV
“扩展端口”和“扩展被动”,其中还提供了一种协商两端均支持的协议的方法。“扩展”命令还以人性化的形式发送地址 - 对于 IPv6,这意味着使用十六进制和冒号表示法,而不是一系列单独的十进制数字。
EPRT x<protocol>x<address>x<port>x
EPRT |1|132.235.1.2|6275|
EPRT |2|1080::8:800:200C:417A|5282|
总之,IPv6 支持是唯一的区别。
答案2
主动和被动之间的区别已经得到解答。扩展被动 (EPSV) 只是 IPv4 和 IPv6 的被动,因为对 PASV 的响应语法特定于 IPv4,因此 IPv6 需要一个新命令。主动模式下的 EPTR 与 PORT 相同。EPRT 和 EPSV 的行为略有不同,因为它们只能包含端口,而不能像 PORT 和 PASV 那样包含 IP 和端口。因此,数据传输只能在具有控制连接的系统之间进行。使用 PORT 和 PASV 可以在其他系统之间创建数据连接(尽管这在今天被认为是糟糕的设计和安全风险)。