在协议设计中,为什么要使用2个端口?

时间:2009-03-09 15:56:02

标签: ftp protocols network-protocols

当TCP服务器在端口上执行套接字接受时,它会获得一个与该客户端一起使用的新套接字 接受套接字对该端口仍然有效,并且可以接受该端口上的其他客户端。

为什么原始FTP规范RFC 959决定同时创建控制端口和数据端口?

是否有任何理由在类似的自定义协议中执行此操作?

在我看来,这可以在单个端口上轻松指定。

考虑到防火墙和使用FTP的NATS的所有问题,似乎单个端口会好得多。

对于一般协议实现,我认为你想要这样做的唯一原因是你可以从不同于命令的主机提供文件。

13 个答案:

答案 0 :(得分:17)

这背后的最初理由是,你可以:

  • 在传输数据时继续在控制连接上发送和接收控制指令。
  • 同时激活多个数据连接。
  • 服务器决定何时准备好向您发送数据。

确实,他们可以通过指定集成到FTP协议的复杂多路复用协议来实现相同的结果,但由于当时NAT不是问题,他们选择使用已存在的TCP端口。

以下是一个例子:

Alice想要Bob的两个文件。 Alice连接到Bob端口21并要求提供文件。当Bob准备就绪时,Bob打开与Alice端口20的连接并将文件发送到那里。同时,Charles需要Alice的服务器上的文件。 Charles连接到Alice的21并要求提供该文件。当准备好时,Alice连接到Charles上的端口20,并发送文件。

如您所见,端口21用于连接到服务器的客户端,端口20用于连接到客户端的服务器,但这些客户端仍然可以在21上提供文件。

两个端口的用途完全不同,为了简单起见,他们选择使用两个不同的端口,而不是实现协商协议。

答案 1 :(得分:9)

因为FTP允许单独的控制和数据。 IIRC,按照最初的设计,你可以拥有3台主机:主机A可以要求主机B向主机C发送数据。

答案 2 :(得分:8)

FTP是在现代防火墙的愚蠢无法想象的时候设计的。 TCP端口用于此功能;在单个IP上复用多个连接。它们 NOT 是访问控制列表的替代品。它们 NOT 旨在将IPv4扩展到48位地址。

任何新的非IPv6协议都必须处理当前的混乱,因此它应该坚持一小部分连续的端口。

答案 3 :(得分:5)

FTP有着悠久的历史,是70年代早期的第一个ARPANET协议之一(例如,参见RFC114 from 1971)。现在看起来很奇怪的设计决策更有意义。连接速度要慢得多,并且使用可用的网络技术进行“带外”连接控制似乎是一个很好的举措。

目前RFC959包含一个关于历史的好部分,如果您喜欢做一些考古学,可以链接到早期的RFC ...

答案 4 :(得分:4)

与许多较旧的线路协议一样,FTP适合人类使用。也就是说,从终端会话中使用FTP非常容易。 FTP的设计者预计用户可能希望在数据传输时继续使用远程主机。如果命令和数据通过同一个频道,这将是困难的。

答案 5 :(得分:3)

IETF已禁止为新协议分配多个端口的做法,因此我们将来可能不会看到这一点。

较新的IP协议(如SCTP)旨在解决TCP的一些缺点,这可能导致一个人使用多个端口。 TCP的“行头”阻止阻止您在飞行中拥有多个单独的请求/流,这对于某些实时应用程序来说可能是一个问题。

答案 6 :(得分:3)

IIRC,问题不在于FTP使用两个(即多个)端口。问题是控制连接由客户端启动,数据通道由服务器启动。 FTP和HTTP之间的最大区别在于,HTTP在客户端中提取数据,在FTP中,服务器将其推送。 NAT问题与服务器通过不知道预期连接的防火墙推送数据有关。

FTP使用单独的端口进行控制和数据相当优雅恕我直言。考虑围绕控制和数据多路复用的HTTP中的所有令人头疼的问题 - 想想尾随标题,围绕流水线请求的规则,连接保持不变以及什么不是。通过明确地分离控制和数据可以避免大部分问题,更不用说可以做一些有趣的事情,比如加密一个而不是另一个,或者使控制信道的QoS高于数据。

答案 7 :(得分:2)

你应该看一下RTSP + RTP协议。它是一个类似的设计:每个流可以在不同的端口上发送,有关抖动,重新排序等的统计信息在另一个端口上发送。

另外没有连接,因为它是UDP。然而,它是在防火墙已经开始平庸的时候开发的(对不起我的英文),所以开发了一种模式,其中所有这些连接都可以嵌入到一个使用HTTP语法的TCP连接中。

猜猜是什么?多端口协议实现比http多路复用更简单(IMO),并且它具有更多功能。如果您不关心防火墙问题,为什么在已经存在一个(TCP端口)时选择复杂的复用方案呢?

答案 8 :(得分:1)

FTP是一种旧协议。这是唯一的原因。设计人员认为,通过数据端口流动的数据量会使它们无法及时发送控制命令,因此他们将其作为两个端口。防火墙,特别是NAT,来得晚得多。

答案 9 :(得分:1)

我认为他们这样做是为了在转移发生时你可以继续使用服务器并轻松启动新的转移(如果你的客户可以支持)。

请注意,被动模式几乎可以解决所有防火墙/ NAT问题。

答案 10 :(得分:0)

在我看来,这首先是一个糟糕的设计选择。在它发明的旧时代,防火墙和NAT并不存在......现在,真正的问题是“为什么人们仍然想使用FTP”? FTP所做的一切都可以通过更好的方式使用HTTP来完成。

答案 11 :(得分:0)

see this image

当用户启动与远程主机的FTP会话时,FTP首先在服务器端口号21上建立控制TCP连接。FTP的客户端通过该控制连接发送用户标识和密码。 FTP的客户端还通过控制连接发送命令以更改远程目录。

当用户请求文件传输(到远程主机或从远程主机传输文件)时,FTP在服务器端口号20上打开TCP数据连接。FTP通过数据连接发送一个文件,然后关闭数据连接。如果在同一会话中用户想要传输另一个文件,则FTP打开另一个数据TCP连接。因此,使用FTP,控制连接在用户会话的整个过程中保持打开状态,但是会为会话中传输的每个文件创建一个新的数据连接(即数据连接是非持久的)。

答案 12 :(得分:0)

在 FTP 的情况下,它不仅是一个不同的端口,还可能是一个不同的主机,这可能是 RFC 959 中的原因:

In another situation a user might wish to transfer files between

two hosts, neither of which is a local host. The user sets up

control connections to the two servers and then arranges for a

data connection between them. In this manner, control information

is passed to the user-PI but data is transferred between the

server data transfer processes. Following is a model of this

server-server interaction.

                    Control     ------------   Control 
                    ---------->| User-FTP |<----------- 
                    |          | User-PI  |           | 
                    |          |   "C"    |           | 
                    V          ------------           V 
            --------------                        -------------- 
            | Server-FTP |   Data Connection      | Server-FTP | 
            |    "A"     |<---------------------->|    "B"     | 
            -------------- Port (A)      Port (B) -------------- 
 
 
                                 Figure 2 
The protocol requires that the control connections be open while

data transfer is in progress. It is the responsibility of the

user to request the closing of the control connections when

finished using the FTP service, while it is the server who takes

the action. The server may abort data transfer if the control

connections are closed without command.