Diferença entre um soquete e uma porta

118

Alguém poderia, por favor, explicar claramente a diferença entre uma porta e uma tomada? Eu sei que um porto serve como uma porta para a rede para uma aplicação processo e que o processo de aplicação usa uma conexão de soquete com o número de porta fornecido para lidar com comunicação de rede, mas quando você tem vários processos escutando em um único número de porta, estou achando difícil entender a diferença entre o soquete ea porta e como eles todos se encaixam.

    
por cobie 29.10.2012 / 13:14
fonte

6 respostas

113

S é um programa servidor: digamos que é um servidor HTTP, então ele usará o número de porta bem conhecido para HTTP , que é 80. Eu o executo em um host com o endereço IP 10.0.0.4 , para que ele ouça as conexões em 10.0.0.4:80 (porque é lá que todo mundo espera encontrá-lo).

Dentro de S , criamos um soquete e vincule a esse endereço: agora, o SO sabe que as conexões estão chegando em 10.0.0.4:80 deve ser encaminhado para o meu processo S através desse socket específico.

  • saída netstat quando o socket está ligado:

    $ netstat --tcp -lan
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address               Foreign Address            State
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                  LISTEN
    

    NB. o endereço local é todos os zeros porque S não se importa como seus clientes o acessam

Uma vez que S tenha esse limite de soquete, ele aceita conexões - cada vez que um novo cliente se conecta, accept retorna um novo socket, que é específico para esse cliente

  • saída netstat quando uma conexão é aceita:

    $ netstat --tcp -lan
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address               Foreign Address            State
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                  LISTEN
    tcp        0      0 10.0.0.4:80                 10.0.0.5:55715             ESTABLISHED
    
    • 10.0.0.4:80 representa o final da conexão de S e está associado ao soquete retornado por accept
    • 10.0.0.5:55715 é o final da conexão do cliente e está associado ao soquete que o cliente transmitiu para conectar a>. A porta do cliente não é usada para nada, exceto pacotes de roteamento nesta conexão TCP para o processo certo: é atribuído aleatoriamente pelo kernel do cliente a partir do intervalo de portas efêmeras.

Agora, o S pode continuar aceitando mais conexões de clientes ... cada um receberá seu próprio soquete, cada soquete será associado a uma única conexão TCP e cada conexão terá um único endereço remoto. S rastreará o estado do cliente (se houver algum) associando-o ao soquete.

Então, aproximadamente:

  • o endereço IP é para roteamento entre hosts na rede
  • a porta é para roteamento para o soquete correto no host
    • Eu quase disse processo correto , mas na verdade é possível ter vários processos (geralmente filhos) todos aceitando no mesmo soquete ...
    • no entanto, cada vez que uma das chamadas accept simultâneas é retornada, ela o faz somente em um processo, cada soquete da conexão de entrada é exclusivo para uma instância do servidor
  • o soquete é o objeto que um processo usa para conversar com o SO sobre uma determinada conexão, muito parecido com um descritor de arquivo
    • como mencionado nos comentários, há muitos outros usos para sockets que não usam portas: por exemplo socketpair cria um par de soquetes conectados juntos que não têm nenhum esquema de endereçamento - a única maneira de usar esse pipe é sendo o processo que chama socketpair , sendo um filho desse processo e herdando um, ou sendo explicitamente passado um dos soquetes desse processo
por 29.10.2012 / 18:24
fonte
48

Pense na sua máquina como um prédio de apartamentos:

  • Uma porta é um número de apartamento.

  • Uma tomada é a porta de um apartamento.

  • Um endereço IP é o endereço da rua do prédio.

por 29.10.2012 / 13:55
fonte
44

Uma porta faz parte do endereço nos protocolos TCP e UDP. Ele é usado para ajudar o sistema operacional a identificar qual aplicativo deve receber os dados recebidos. Um SO deve suportar portas para suportar TCP e UDP, porque as portas são parte intrínseca do TCP e do UDP.

Um soquete faz parte da interface que o sistema operacional apresenta aos aplicativos para permitir que eles enviem e recebam dados da rede. A maioria das implementações de soquete suportam muitos protocolos além do TCP e do UDP, alguns dos quais não têm nenhum conceito de portas. Um SO não precisa suportar sockets para suportar TCP ou UDP; poderia fornecer uma interface diferente para os aplicativos usarem. Um soquete é simplesmente uma maneira de enviar e receber dados em uma porta específica.

    
por 29.10.2012 / 13:23
fonte
8

Um computador possui um endereço IP que o identifica como uma entidade separada na rede. Adicionamos um número adicional a isso para nos permitir diferenciar as conexões com esse computador. Este é o número da porta. No lado do SO da conexão, você precisa de buffers, estado de conexão, etc. Esse objeto lógico é o soquete.

    
por 29.10.2012 / 15:47
fonte
0

Um soquete é um caminho de comunicação para uma porta. Quando você quer que seu programa se comunique pela rede, você deu a ele uma maneira de endereçar a porta e isso é feito criando um soquete e anexando-o à porta. Basicamente, as portas socket = IP + Sockets fornecem acesso à porta + ip

    
por 30.10.2012 / 12:48
fonte
-1

Um endereço IP identifica o dispositivo, ou seja, o endereço para o dispositivo em particular, quando você chegou à máquina usando a porta IP agora define para qual processo nessa máquina se comunicar.

Assim, para que ocorra uma comunicação real, você precisa de ambas as portas + IP, que são chamadas de soquete.

    
por 30.10.2012 / 12:59
fonte