
Tenho uma compreensão razoável do uso prático dos portos e de como eles funcionam. Contudo, tenho algumas dúvidas que gostaria de esclarecer.
- O que acontece se enviarmos uma solicitação sem especificar uma porta para o soquete do servidor?
- Existe uma maneira de configurar uma máquina para que, em vez de ter um processo escutando em uma porta específica, todas as solicitações enviadas ao meu endereço IP sejam tratadas pelo mesmo processo? Nesse caso, o cliente poderia omitir a porta na solicitação.
- Com base na pergunta 2, se eu quiser apenas executar algum tipo de servidor em algo como um Raspberry Pi, posso fazer com que meu endereço IP seja roteado para meu RPi, que lida com toda e qualquer solicitação de rede recebida usando o mesmo servidor ? O que quer dizer que as pessoas simplesmente se conectam ao endereço IP, sem o número da porta, para se conectarem ao meu servidor.
Responder1
Por que devemos fornecer um número de porta além de um IP ao enviar uma solicitação?
Porque o protocolo TCP (e UDP) exige isso. Faz parte da especificação do protocolo.
O que acontece se enviarmos uma solicitação sem especificar uma porta para o soquete do servidor?
Bem, se você não especificar um número de porta, provavelmente haverá zeros nessa parte da chamada da API. A porta 0 é uma porta reservada e algumas implementações a utilizam para significar que uma porta é alocada dinamicamente pelo sistema.
Existe uma maneira de configurar uma máquina para que, em vez de ter um processo escutando em uma porta específica, todas as solicitações enviadas ao meu endereço IP sejam tratadas pelo mesmo processo?
Não se você usar protocolos de camada de transporte TCP ou UDP ou qualquer um dos protocolos de nível de aplicativo criados neles. Como HTTP
Em alguns sistemas operacionais há um único processo como parte do sistema operacional, mas ele transfere conexões para aplicativos específicos.
eu poderia fazer com que meu endereço IP fosse roteado para meu RPi
Você pode configurar o roteador para rotear todas as solicitações de conexão recebidas para o seu rPi
as pessoas apenas se conectam ao endereço IP, sem o número da porta, para se conectar ao meu servidor.
Não usar protocolos padrão como HTTP.
Acho que não é possível usar APIs padrão como Berkely Sockets. Eu imagino que você poderia, com algum esforço, usar um protocolo de camada de transporte diferente ou novo, de sua própria criação. Você precisaria de alguns motivos bastante sólidos para enfrentar todo esse inconveniente.
Responder2
O que acontece se enviarmos uma solicitação sem especificar uma porta para o soquete do servidor?
Você não pode, um soquete é uma porta IP + por definição. A razão pela qual existem portas é porque vários programas em uma máquina podem enviar/receber tráfego e as portas são usadas para diferenciar os processos em cada extremidade.
Existe uma maneira de configurar uma máquina para que, em vez de ter um processo escutando em uma porta específica, todas as solicitações enviadas ao meu endereço IP sejam tratadas pelo mesmo processo?
Você poderia fazer com que seu processo abrisse 65.535 soquetes, um em cada porta. Você não pode fazer um programa existente fazer isso que não foi escrito para fazer isso sem algum tipo de programa intermediário estranho que você provavelmente teria que escrever sozinho.
No Linux, você pode criar uma iptables
configuração que faça isso ou algo equivalente.
se eu quiser apenas executar algum tipo de servidor em algo como um Raspberry Pi, posso fazer com que meu endereço IP seja roteado para meu RPi, que lida com toda e qualquer solicitação de rede recebida usando o mesmo servidor?
A situação padrão na maioria dos roteadores residenciais padrão é que seu roteador ignore qualquer tráfego enviado por alguém de fora.
Em quase todos esses roteadores, você pode fazer o encaminhamento de porta, que informa ao seu roteador para encaminhar o tráfego de entrada em uma porta específica para um sistema específico em sua rede privada atrás do roteador.
Provavelmente, você também pode instruir seu roteador a encaminhar qualquer tráfego de entrada não solicitado para um IP específico em sua rede privada atrás do roteador. Isso é chamado de DMZ.
Responder3
As portas são essenciais para protocolos que permitem a comunicação de vários processos entre servidores. Isto é mais do que uma consideração prática.
Serviços bem conhecidos têm portas atribuídas: DNS=53, HTTP=80, HTTPS=443, SMTP=25, Telnet=23, SSH=22, FTP=20&21, etc. port se estiverem em execução na porta atribuída ao serviço. As portas atribuídas estão listadas em /etc/services nas plataformas Unix/Linux.
- Para TCP e UDP, não é possível fazer conexões sem porta. O cabeçalho inclui campos para portas de origem e de destino. Sempre haverá um valor nesses campos, mesmo que seja zero.
- É possível capturar todos os pacotes que chegam em uma interface. É assim que ferramentas como o tcpdump funcionam.
- Conforme observado em 1, todas as solicitações recebidas terão um número de porta. Os roteadores SOHO geralmente suportam uma DMZ e encaminharão todas as solicitações recebidas não roteadas de outra forma, para o endereço IP atribuído à DMZ. Na maioria dos casos, você só precisa encaminhar as portas necessárias para o serviço ao servidor (seu Raspberry Pi). Isso permitiria que você tivesse vários Raspberry Pis executando serviços diferentes.