Endereços De Ligação aos Sockets

A vinculação de endereços para soquetes no domínio da Internet demanda uma série de considerações. Os números de porta são alocados fora de espaços separados, um para cada sistema e um para cada domínio sobre esse sistema.

Nota: Porque a associação é criada em duas etapas, o requisito de exclusividade de associação indicado anteriormente poderia ser violado a menos que o cuidado seja tomado. Mais adiante, os programas do usuário nem sempre conhecem valores adequados para usar para o endereço local e a porta local porque um host pode residir em várias redes, e o conjunto de números de portas alocados não é diretamente acessível a um usuário.

O endereçamento de curinga é fornecido para auxiliar a ligação de endereço local no domínio da Internet. Quando um endereço for especificado como INADDR_ANY (uma constante definida no arquivo netinet/in.h ), o sistema interpretará o endereço como qualquer endereço válido.

Soquetes com endereços locais curinga podem receber mensagens direcionadas para o número da porta especificada e enviadas para qualquer um dos endereços possíveis atribuídos a um host. Se um processo de servidor quisesse conectar apenas hosts em uma determinada rede, ele ligaria o endereço dos hosts na rede apropriada.

Uma porta local pode ser especificada ou esquerda não especificada (denotada por 0), caso em que o sistema seleciona um número de porta apropriado para ele.

A restrição na alocação de portas foi feita para permitir que os processos em execução em um ambiente seguro executem a autenticação com base no endereço de origem e no número da porta. Por exemplo, o comando rlogin (1) permite que os usuários efetuem o login em toda uma rede sem serem solicitados por uma senha, se duas condições seguram:
  • O nome do sistema que o usuário está registrando a partir de está localizado no arquivo /etc/hosts.equiv no sistema que o usuário está tentando fazer login (ou o nome do sistema e o nome do usuário estão no arquivo .rhosts do usuário no diretório home do usuário).
  • O processo de login do usuário está vindo de uma porta privilegiada na máquina a partir da qual o usuário está efetuando o login.

O número da porta e endereço de rede da máquina a partir da qual o usuário está fazendo login pode ser determinado seja pelo parâmetro From do resultado do parâmetro aceitar subroutine, ou do subroutine getpeername .

Em certos casos, o algoritmo utilizado pelo sistema na seleção de números de porta é inadequado para um programa de aplicativos. Isso ocorre porque as associações são criadas em um processo de duas etapas. Por exemplo, o Internet File Transfer Protocol (FTP) especifica que as conexões de dados devem sempre ser originadas a partir da mesma porta local. No entanto, associações duplicadas são evitadas conectando-se a diferentes portas estrangeiras. Nessa situação, o sistema desautoriza a ligação do mesmo endereço local e número de porta a um soquete caso um soquete de conexão de dados anterior ainda exista. Para substituir o algoritmo de seleção de porta padrão, uma subroutine setsockopt deve ser realizada antes da ligação de endereço.

A subroutine socket cria um soquete sem nenhuma associação a endereços locais ou de destino. Para os protocolos da Internet, isso significa que nenhum número de porta de protocolo local foi atribuído. Em muitos casos, os programas de aplicativos não se importam com o endereço local que utilizam e estão dispostos a permitir que o software de protocolo escolha um para eles. No entanto, os processos do servidor que operam em uma porta bem conhecida devem ser capazes de especificar essa porta para o sistema. Uma vez que um socket foi criado, um servidor usa a subroutine bind para estabelecer um endereço local para ele.

Nem todas as ligações possíveis são válidas. Por exemplo, o responsável pela chamada pode solicitar uma porta de protocolo local que já esteja em uso por outro programa, ou pode solicitar um endereço de Internet local inválido. Em tais casos, a subroutine bind não é bem-sucedida e retorna uma mensagem de erro.