FTP RFC 959指定数据连接由服务器从端口20
(默认)打开到客户端中的随机端口,并由服务器通过PORT h1,h2,h3,h4,p1,p2
命令获知。这称为主动模式传输。
以便主机为h1.h2.h3.h4
,而端口为p1 * 256 + p2
。
我的问题是:服务器如何通过默认情况下20
的同一端口初始化多个客户端的多个连接?
假设客户端c1
与服务器数据端口20
建立了连接并正在传输数据,如果数据端口已被TCP使用,客户端c2
如何与服务器建立连接连接?
答案 0 :(得分:0)
实现Berkeley套接字的服务器在接受连接时经历了几个阶段。很多管道通常由框架或操作系统处理,我会尝试指出它们。我将尝试用一些伪代码解释下面的内容。
服务器首先要求内核绑定到特定端口以开始监听:
void* socket = bind(20);
这可能是导致一些误解的重点。服务器通过绑定套接字获得连接,但不是使用侦听端口(20)来处理与新客户端的通信,而是从内核请求新的(随机)端口用于新的套接字连接。这通常由操作系统处理。
void* clientSocket;
// Block until a client connects. When it does,
// use 'clientSocket' (a new socket) to handle the new client.
socket->accept(clientSocket);
// We'll use 'clientSocket' to communicate with the client.
clientSocket.send(someBuffer, ...);
// 'socket' is free again to accept more connections,
// so we can do it again:
void* clientSocket2;
socket->accept(clientSocket2);
// Of course, this is typically done in a loop that processes new connections all the time.
总结一下,发生的事情是侦听器套接字(20)仅用于接受新连接。客户端建立连接后,会创建一个新的套接字来处理该特定连接。
您可以通过检查建立连接后作为客户端获得的套接字连接来测试这一点。您将看到远程端口不再是20(它将是远程服务器选择的随机端口)。
所有这些都由tcp,ftp和任何使用套接字协议的协议共享。