Como o kernel sabe qual descritor de arquivo para gravar dados após fork () em um servidor concorrente?

2

Arquitetura cliente / servidor simultânea básica: Há um loop principal atendendo solicitações em uma porta (por exemplo, 3000), depois de aceitar a conexão, o servidor gera um processo filho que acaba tendo acesso aos descritores de arquivo onde os dados podem ser lidos.

Se tivermos vários clientes conectados ao servidor, o servidor terá um processo filho por solicitação. Então S1 (processo do servidor filho) lê dados de C1 (um cliente), S2 lê de C2 e assim por diante. Minha pergunta é como é possível que todos os clientes (C1, C2 ...) estejam enviando informações para a mesma porta (3000) e ainda assim os processos do servidor (S1, S2 ...) estão lendo apenas as informações enviadas do cliente atribuído a eles? Onde está a multiplexação sendo feita e como?

    
por eugecm 04.03.2014 / 23:27

1 resposta

1

Uma conexão TCP / IP tem uma porta de origem e uma de destino, portanto, se o mesmo servidor se conectar a outro servidor na porta 3000 várias vezes, o kernel do Linux poderá resolver as conexões porque cada uma tem uma origem IP + exclusiva porta + porta de destino.

Isto pode ser visto com a saída do netstat quando há conexões TCP ativas, que mostram a porta de origem local e a porta de destino externa.

Como um aparte, fazer um fork () para cada conexão é uma péssima idéia para um servidor obter uma carga significativa; fork () é uma chamada de sistema lenta e com uso intensivo de recursos. Há uma razão pela qual o nginx está se tornando popular; ele usa um modelo livre de garfo () livre de programas para entregar conteúdo estático.

    
por 05.03.2014 / 00:01