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

30
当TCP服务器在端口上执行套接字接受时,它会获得一个新的套接字来处理该客户端。
接受套接字仍然有效,可以在该端口上接受更多客户端。
为什么最初的FTP规范RFC 959决定创建控制端口和数据端口?
在类似的自定义协议中这样做是否有任何原因?
在我看来,这可以很容易地在单个端口上指定。
考虑到FTP与防火墙和NAT的所有问题,使用单个端口将更好。
对于通用协议实现,我能想到的唯一原因是您希望从不同的主机提供文件而不是命令。

2
你必须记住,FTP 是在 NAT 和防火墙普及之前指定的。 - grieve
问题仍然是一样的,为什么他们选择了2个端口? - Brian R. Bondy
请查看第2.3节,其中有一个漂亮的ASCII图示,显示了一个本地主机和两个远程主机之间的FTP交互过程。 - grieve
13个回答

23
最初的理由是这样,你可以:
  • 在传输数据时,继续通过控制连接发送和接收控制指令。
  • 同时有多个数据连接处于活动状态。
  • 服务器决定何时准备好向您发送数据。

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

以下是一个例子:

Alice想从Bob那里获取两个文件。Alice连接到Bob的21号端口并请求这些文件。当Bob准备好时,会向Alice的20号端口打开连接并将文件发送到那里。与此同时,Charles需要获取Alice服务器上的一个文件。Charles在Alice的21号端口连接并请求该文件。当Alice准备好时,会连接到Charles的20号端口并将文件发送过去。

可以看到,端口21适用于客户端连接服务器,而端口20适用于服务器连接客户端,但这些客户端仍然可以在21号端口上提供文件。

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


1
但是你可以在与控制连接相同的端口上创建另一个套接字。我不反对创建2个连接,只是反对使用2个端口。 - Brian R. Bondy
更新了我的回答以解决你的问题。 - Coincoin
我认为值得一提的是,控制协议是人类可读的,因为在那个时代许多东西都是如此,特别是当数据在另一个端口传输时,人们可以手动使用该协议。请参见下面@IfLoop的答案。 - sstur
1
这里的端口似乎有误导性。20和21都是服务器端口。例如,如果服务器Bob需要将两个文件传输给客户端Alice,Bob会打开自己的端口20并连接到Alice的高端口进行传输。 - wlnirvana
只有在使用被动模式时,20和21端口才是服务器端口。如果使用主动模式,则端口20位于客户端,即服务器会回连到客户端。上述答案描述了最初的主动模式,现在已被认为不安全。 - Hannes de Jager

9

FTP允许控制和数据分离。据我所知,最初设计时,您可以拥有3个主机:主机A可以请求主机B向主机C发送数据。


是的,这是我在现代FTP客户端中非常想念的一个功能(因为协议仍然允许您这样做)——当通过某些不稳定的WiFi连接时,能够直接从一个骨干连接的服务器传输大文件到另一个服务器而不触及环回数据会很好。 - Stephen Deken
哦,是的 - 我忘记了客户端控制两个远程主机之间的传输... - Michael Burr

8

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

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


6

FTP有着悠久的历史,是70年代初ARPANET协议之一(例如,请参见1971年的RFC114)。那时候做出的设计决策现在可能看起来很奇怪,但当时更有意义。连接速度很慢,通过“out of band”进行连接控制可能是一种可行的选择,因为网络技术有限。

当前的RFC959包括一个良好的历史部分,链接到早期的RFC文件,如果您想要进行一些考古学研究...


5
我记得的是,FTP使用两个端口(即多个端口)并不是问题所在。问题在于控制连接由客户端发起,数据通道由服务器发起。FTP和HTTP之间最大的区别在于,在HTTP中,客户端获取数据,而在FTP中,服务器推送数据。NAT问题与服务器通过未知连接推送数据的防火墙有关。
FTP将控制和数据分开使用不同的端口非常优雅。想想HTTP环绕控制和数据复用所带来的所有头痛 - 想想尾随标头,围绕管道请求的规则,连接保持活动等等。通过明确地分离控制和数据可以避免其中很多问题,更不用说能够做一些有趣的事情,比如加密一个而不是另一个,或者使控制通道具有更高的QoS比数据通道。

4

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


4

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

新的IP协议(例如SCTP)旨在解决TCP的一些缺点,这些缺点可能导致使用多个端口。 TCP的“头部阻塞”会阻止您同时处理多个独立的请求/流,这对于某些实时应用程序可能是一个问题。


我觉得你的第一句话非常有趣。你有没有关于这个话题进一步阐述原因的阅读材料? - Stephan Dollberg
@bamboon 我相信原因是端口号的稀缺性。TCP和UDP只有49,152个可分配端口(49,152-65,535用于动态分配池的保留)。在70年代,49,000个端口号似乎很多,但现在并不是那么多了。 - reirab

2
在 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.

2

FTP是一种旧的协议,这就是唯一的原因。设计者们认为数据端口上流动的数据量会使得他们无法及时发送控制命令,所以将它分为两个端口。防火墙,尤其是NAT,出现得要晚得多。


2
你应该看一下RTSP + RTP协议。它的设计类似:每个流可以在不同的端口上发送,并且关于抖动、重新排序等的统计信息会在另一个端口上发送。此外,由于它是UDP,所以没有连接。但是,它是在防火墙已经很普遍的情况下开发的(对不起我的英语),因此开发了一种模式,其中所有这些连接都可以嵌入到具有HTTP语法的一个TCP连接中。你猜怎么着?多端口协议比http多路复用协议更简单(在我看来)实现,并且具有更多的功能。如果你不关心防火墙问题,为什么要选择复杂的多路复用方案,而不是已经存在的(TCP端口)呢?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接