Eu presumo que você esteja falando de portas TCP e UDP.
Say I have two TCP services A and B. A is an IPv4-only service listening on
127.0.0.1:10000
. B is an IPv6-only service listening on::1:10000
. Can I start these services on the same machine?
Sim.
That is, how are IP ports assigned? Per machine? Per interface? Per protocol? Etc…
Primeiro, não existe uma "porta IP". Portas são um recurso de certos protocolos da camada de transporte. Em particular, o TCP e o UDP usam números de porta. Acredito que alguns outros protocolos também os usam, mas eu trabalhei apenas com TCP e UDP.
As portas TCP e as portas UDP são totalmente separadas. Um servidor TCP e um servidor UDP podem usar a mesma combinação IP / porta.
Os servidores podem ouvir em uma combinação específica de endereço IP / porta ou escutar em uma porta para todos os endereços. O último é especificado especificando um endereço de escuta de 0.0.0.0 para IPv4 ou :: para ipv6. Se um servidor estiver escutando em uma porta para todos os endereços, outros servidores não poderão escutar nessa porta para um endereço específico.
Finalmente, na maioria dos sistemas operacionais, é possível que um servidor que esteja atendendo on :: aceite conexões sobre IPv4 e IPv6. Existe uma opção de socket chamada "IPV6_V6ONLY" para ativar / desativar este comportamento. A configuração padrão para esta opção varia. No linux, a opção está desabilitada por padrão, mas isso pode ser alterado através do sysctl "net.ipv6.bindv6only". No windows vista e posterior IPV6_V6ONLY é ativado por padrão. Em versões mais antigas do Windows, não é possível que um único soquete aceite conexões v4 e v6, um aplicativo que queira atender às duas necessidades para abrir dois soquetes separados.