Claro que você pode ter duas sessões TCP paralelas e independentes entre o mesmo cliente e servidor. Caso contrário, apenas por exemplo, os navegadores da Web não poderiam buscar uma página HTML e uma imagem ou duas imagens de um servidor da Web ao mesmo tempo.
O discriminador para sessões TCP não é um "número de sessão", mas a tupla (endereço local, porta local, endereço remoto, porta remota) . Desde que pelo menos um deles seja diferente, é uma sessão TCP diferente.
Então, em resposta à sua pergunta, sim, você é forçado a usar uma porta ou porta de destino diferente. Sua pilha TCP se recusará a fazer a conexão (dando erro EADDRINUSE) se você tentar usar a mesma origem e porta de destino. Isso tudo está assumindo que o endereço local e o endereço remoto são os mesmos.
Mas isso não é algo que você geralmente precisa se preocupar. Geralmente, os iniciadores TCP (clientes) não precisam se ligar a uma porta específica. Eles permitem que o kernel escolha uma porta de origem automaticamente, não chamando bind()
antes de chamarem connect()
. O kernel irá certificar-se de escolher uma porta de origem diferente para a segunda conexão.