5

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

据我了解,在command您退出之前,初始 ( ) 连接是永久的。但是,我不确定数据连接 - 它是否按命令重新启动?所以你打电话PORT ...or PASV,得到第二个连接,做 a LIST,得到结果,连接关闭,重新开始?

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

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

4

1 回答 1

8

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

您甚至不能重复使用本地/远程端口号组合,因为当 TCP 连接关闭时,它会进入 TIME_WAIT 模式,并且端口号组合在一段时间内无法使用。因此,对于两个立即连续的传输,无论如何您都必须使用不同的端口号组合。

请参阅RFC 959的第 3.3 节。数据管理:

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

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

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


也可以看看:

于 2015-07-22T11:19:54.583 回答