Como é que um servidor WEB (HTTP) recebe e trata pedido simultâneos?
Em termo de brincadeira às vezes costumo fazer a seguinte pergunta: “Como é que um servidor WEB/HTTP recebe um pedido?” Ao que me respondem: então usa-se o endereço e ele vai fazer um pedido ao porto 80 do servidor. Ok até aqui tudo bem, então faço uma segunda pergunta: “Então se o porto 80 já está ocupado com o primeiro pedido, como é possível receber outros pedidos?” E eis que a resposta é normalmente a mesma…usa-se o porto 8080. O porto 8080, pergunto eu???
Vamos lá então explicar isto melhor !!!
Os servidores WEB/HTTP funcionam por omissão no porto 80 (HTTP) ou no porto 443 (HTTPS). No entanto, o administrador do sistema pode configurar o serviço para este funcionar em qualquer porto, sendo que nesse momento o serviço/página WEB é acessível usando o endereço da seguinte forma: <endereço_maquina>:<porto_maquina> (exemplo: https://pplware.sapo.pt:85).
Mas considerando que o nosso servidor apenas está configurado para receber pedidos no porto 80, como trata ele pedidos em simultâneo, deixando que o porto 80 esteja sempre livre para receber novos pedidos?
A resposta é relativamente simples…quando um servidor recebe um pedido no porto 80 procede a um mecanismo de threading (prefork,worker), deixando assim sempre o porto 80 à escuta.
Para exemplificar vou usar o XAMPP e o Currports . Fazemos start ao Apache e abrimos o currports para ver o que se está a passar.
Como podemos verificar pela imagem, depois de fazer start ao Apache ele criou 2 instâncias do serviço. Neste momento temos o serviço à espera de pedidos no porto 80 (HTTP) e 443 (HTTPS)
Vamos agora abrir o browser e escrever o endereço http://localhost ou http://127.0.0.1 (já agora deixo aqui uma dica, o endereço do localhost é qualquer um endereço da gama 127.0.0.0/8)
Como podem verificar foram criadas várias instâncias do apache, que possuem a informação do remote port ou seja o porto pelo qual o cliente iniciou a comunicação. Como referido no artigo anterior “Como é que o meu MSN comunica com o teu?” existem portos que são atribuídos dinamicamente pelo sistema operativo (Portos 49152 a 65535), isto é, quando um cliente inicia uma ligação ao servidor é-lhe atribuído um porto de forma dinâmica e do outro lado o servidor recebe o pedido num porto conhecido (ex.80) e passa-o para uma thread (worker) que se encarregará de “servir” o pedido”. O número de pedidos simultâneos pode ser definido nas configurações do servidor Web.
Para finalizar, já que falamos aqui em processos e thread, aqui fica a diferença entre o que é um processo e o que é uma thread: processos são independentes e têm seus próprios endereços de memória enquanto threads pertencem a um processo e partilham o mesmo endereço de memória e outros recursos.
Quanto ao porto 8080, esse só existe mesmo quando configuramos o nosso servidor para operar nesse porto.