首先,在主机上启动服务器,该主机是多宿的,其IP地址为12.106.32.254和192.168.42.1。服务器在它的众所周知的端口(本例为21)上执行被动打开,从而等待客户请求。
我们使用记号{*:21, :}指出服务器的套接字对。服务器在任意本地接口的端口21上等待连接请求。外地IP与端口都不指定,称之为监听套接字。通配地址通过在调用bind之前把套接字地址结构中的IP地址字段设置成INADDR_ANY来指定。
稍后在IP地址为206.168.112.219的主机上启动第一个客户,它对服务器的IP地址之一的12.106.32.254执行主动打开。假设客户主机为此选择的临时端口为1500。
当服务器接收并接受时,它fork一个自身的副本,让子进程来处理该客户的请求。
至此我们必须要在服务器主机上区别监听套接字和已连接套接字。注意已连接套接字使用与监听套接字相同的本地端口21。还要注意在多宿服务器主机上,连接一旦建立,已连接套接字的本地地址(12.106.32.254)随即填入。
下一步,我们假设在客户主机上另有一客户请求连接到此服务器。客户主机的TCP为这个新客户的套接字分配一个未使用的临时端口如1501,服务器的这俩连接是有区别的:第一个连接的套接字对和第二个连接的套接字对不一样,因为客户的TCP给第二个连接选择了一个1501。
此处应当注意,TCP无法仅仅通过查看目的端口号来分离外来的分节到不同的端点。它必须查看套接字对的所有4个元素才能确定。上图中对于同一个本地端口21存在3个套接字。如果一个分节来自206.168.112.219端口1500,目的地为12.106.32.254端口21,它就被递送给第一个子进程。如果一个分节来自 206.168.112.219端口1501,目的地为12.106.32.254端口21,它就被递送给第二个子进程。所有目的地端口为21的其他TCP分节都被递送给拥有监听套接字的最初的那个服务器(父进程)。