When i connect from a "client" program to it, typically i would specify the Ip address + port of the target or server system;
Sim, correto.
But what port would the client be using ?
O cliente geralmente usa uma porta aleatória. Mais precisamente: Para que o TCP funcione, o único requisito é que a combinação de endereço de destino, porta de destino, endereço de origem, porta de origem seja exclusiva - porque isso é usado para rastrear as conexões TCP. Assim, em princípio, o sistema operacional poderia apenas incrementar o número da porta de origem para cada nova conexão. Na verdade, muitos sistemas operacionais costumavam fazer isso, mas tornavam certos tipos de ataques mais fáceis, porque um invasor poderia prever o próximo número de porta. Portanto, a maioria dos sistemas operacionais modernos agora usa portas de origem aleatórias.
And how does the server know which port to connect back to the client on?
Um pacote TCP contém o destino e a porta de origem, portanto, cada lado conhece os dois números de porta. Veja por exemplo o diagrama para os dados dentro de um pacote TCP no link .
Then extending this to a specific protocol, say Ftp (typical port 21), can i change it such that the server uses port 69, but the client uses port 100?
Geralmente, você pode configurar um servidor para usar qualquer porta escolhida (embora isso dependa do aplicativo de servidor individual). Então você pode configurar o servidor FTP para usar a porta 69. A porta do cliente não pode ser configurada até onde eu sei. O mesmo vale para qualquer outro protocolo, como o RDP.
De qualquer forma, por que você deseja alterar a porta do cliente?