FTP RFC 959指定服务器通过PORT h1,h2,h3,h4,p1,p2命令打开从端口20 (默认)到客户端中随机端口的数据连接。这称为主动模式传输。
因此主机是h1.h2.h3.h4,而端口是p1 * 256 + p2。
我的问题是:服务器如何通过相同的端口初始化到多个客户端的多个连接,默认端口是20?
假设客户端c1已与服务器数据端口20建立连接,并且正在传输数据,如果数据端口已被c2连接使用,客户端TCP如何与服务器建立连接?
发布于 2016-02-21 20:13:27
实现Berkeley套接字的服务器在接受连接时会经历几个阶段。许多管道通常是由框架或操作系统处理的,我将尝试指出它们。下面我将尝试用一些伪代码来解释这一点。
1:绑定监听端口
服务器首先要求内核绑定到要开始侦听的特定端口:
void* socket = bind(20);2:接受连接
这可能就是引起一些误解的地方。服务器通过绑定的套接字获得连接,但它不使用侦听端口(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和任何使用套接字协议的协议所共享。
https://stackoverflow.com/questions/35416175
复制相似问题