FTP数据连接重用

FTP数据连接重用,ftp,passive-mode,Ftp,Passive Mode,我正在为kicks开发一个FTP客户端,我试图了解数据连接的工作流程 据我所知,在您退出之前,初始(命令)连接是永久的。但是,我不确定数据连接-是否根据命令重新启动?因此,您调用端口…或PASV,获得第二个连接,执行列表,获得结果,连接关闭,重新开始 此外,每次连接关闭后,是否需要再次调用PASV(或端口…)?似乎当我尝试使用被动连接测试某些东西时,在第一个命令返回结果并关闭数据连接后,我无法重新连接到同一端口。我可以继续调用PASV->Data Connect->Run Command->Ge

我正在为kicks开发一个FTP客户端,我试图了解数据连接的工作流程

据我所知,在您退出之前,初始(
命令
)连接是永久的。但是,我不确定数据连接-是否根据命令重新启动?因此,您调用
端口…
PASV
,获得第二个连接,执行
列表
,获得结果,连接关闭,重新开始

此外,每次连接关闭后,是否需要再次调用
PASV
(或
端口…
)?似乎当我尝试使用被动连接测试某些东西时,在第一个命令返回结果并关闭数据连接后,我无法重新连接到同一端口。我可以继续调用
PASV
->Data Connect->Run Command->Get Results->Data Connection closed->
PASV
,但它似乎不是这样运行的


另外,如果有人在FTP上有比RFC更简洁的好资料,我真的很感激。

你每次都必须打开一个新的连接。这只是关闭连接,您(或服务器)如何判断传输已完成(至少在公共“流模式”下)

您甚至不能重用本地/远程端口号组合,因为当TCP连接关闭时,它将进入TIME\u WAIT模式,并且端口号组合在一段时间内无法使用。因此,对于两个直接连续的传输,您必须使用不同的端口号组合

请参阅,第3.3节。数据管理:

数据连接的重用:使用数据流模式时 传输文件的结尾必须通过关闭 连接。如果要创建多个文件,这会导致问题 在会话中传输,因为TCP需要保留 一段超时时间的连接记录,以确保可靠的连接 沟通。因此,无法立即重新打开连接

这个问题有两种解决方案。首先是 协商非默认端口。第二种方法是使用另一种方法 传输模式

对传输模式的评论。流传输模式为 本质上不可靠,因为无法确定 连接是否过早关闭。其他传输模式 (阻塞,压缩)不要关闭连接以指示 文件结束。他们有足够的FTP编码,数据 可以分析连接以确定文件的结尾。 因此,使用这些模式可以使数据连接保持打开状态 用于多个文件传输


另见:


好吧,这很有道理(而且符合我所看到的行为)。这是否意味着您可以在传输之间混合匹配PASV和端口?不是你想要的。是的,你可以。但这毫无意义。你选一个。也就是说,现在您通常使用
PASV
,因为客户端通常位于防火墙或NAT或两者的后面。