S é um programa de servidor: digamos que seja um servidor HTTP, portanto ele usará o número da porta conhecido para HTTP , que é 80. Eu o executo em um host com endereço IP 10.0.0.4
, para que ele escute as conexões 10.0.0.4:80
(porque é aí que todos esperam encontrá-lo).
Dentro de S , vou criar um soquete e vinculá- lo a esse endereço: agora, o sistema operacional sabe que as conexões que entrarem 10.0.0.4:80
devem ser roteadas para o meu processo S por esse soquete específico.
saída netstat depois que o soquete é vinculado:
$ 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 alcançam
Depois que S tiver esse soquete vinculado, ele aceitará conexões - toda vez que um novo cliente se conectar, accept
retornará um novo soquete, específico para esse cliente.
saída netstat assim que uma conexão for 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 poraccept
10.0.0.5:55715
é o fim da conexão do cliente e está associado ao soquete que o cliente passou para conectar . A porta do cliente não é usada para nada, exceto pacotes de roteamento nesta conexão TCP para o processo correto: é atribuída aleatoriamente pelo kernel do cliente a partir do intervalo de portas efêmeras.
Agora, S pode continuar aceitando mais conexões de clientes ... cada um terá seu próprio soquete, cada soquete será associado a uma conexão TCP única e cada conexão terá um endereço remoto exclusivo. S rastreará o estado do cliente (se houver) associando-o ao soquete.
Então, aproximadamente:
- o endereço IP é para roteamento entre hosts na rede
- a porta é para rotear para o soquete correto no host
- Eu quase disse o processo correto , mas é realmente possível ter vários processos (geralmente filhos) todos aceitando no mesmo soquete ...
- no entanto, sempre que uma das
accept
chamadas simultâneas retorna, em um único processo, o soquete de cada conexão de entrada é exclusivo para uma instância do servidor
- o soquete é o objeto que um processo usa para conversar com o sistema operacional sobre uma conexão específica, como um descritor de arquivo
- Como mencionado nos comentários, existem muitos outros usos para soquetes que não usam portas: por exemplo, socketpair cria um par de soquetes conectados entre si que não têm nenhum esquema de endereçamento - a única maneira de usar esse canal é sendo o processo que chamou
socketpair
, sendo filho desse processo e herdando um, ou sendo explicitamente passado um dos soquetes desse processo