Por que devemos fornecer um número de porta além de um IP ao enviar uma solicitação?

0

Eu tenho uma compreensão decente do uso prático de portas e como elas funcionam. No entanto, tenho algumas perguntas que gostaria de esclarecer.

  1. O que acontece se enviarmos uma solicitação sem especificar uma porta para o soquete do servidor?
  2. Existe uma maneira de configurar uma máquina para que, em vez de ouvir um processo em uma porta específica, todas as solicitações enviadas para o meu endereço IP sejam manipuladas pelo mesmo processo? Nesse caso, o cliente pode omitir a porta na solicitação.
  3. Construindo fora da questão 2, se eu quiser apenas executar um servidor de algum tipo em algo como um Raspberry Pi, eu poderia tê-lo para que meu endereço IP seja roteado para o meu RPi, que lida com todas as solicitações de entrada usando o mesmo servidor? Ou seja, as pessoas simplesmente se conectam ao endereço IP, sem o número da porta, para se conectarem ao meu servidor.
por fvgs 18.08.2014 / 00:41

3 respostas

3

Why must we supply a port number in addition to an IP when sending a request?

Porque o protocolo TCP (e UDP) exige isso. Faz parte da especificação do protocolo.

What happens if we send a request without specifying a port for the server socket?

Bem, se você não especificar um número de porta, haverá, presumivelmente, 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.

Is there a way to setup a machine so that instead of having a process listen on a particular port, I have all requests sent to my IP address be handled by the same process?

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.

could I have it so that my IP address routes to my RPi

Você poderia configurar o roteador para rotear todos os pedidos de conexão de entrada para o seu rpi

people just connect to the IP address, sans port number, to connect to my server.

Não usando protocolos padrão, como HTTP.

Acho que não é possível usar APIs padrão, como o Berkely Sockets. Eu imagino que você poderia, com algum esforço, usar um diferente, ou novo, protocolo de camada de transporte do seu próprio desenvolvimento. Você precisaria de algumas razões bem sólidas para ir a todo esse inconveniente.

    
por 18.08.2014 / 01:18
2

What happens if we send a request without specifying a port for the server socket?

Você não pode, um soquete é uma porta IP + por definição. A razão pela qual as portas existem é que vários programas em uma máquina podem estar enviando / recebendo tráfego e as portas são usadas para diferenciar entre os processos em ambas as extremidades.

Is there a way to setup a machine so that instead of having a process listen on a particular port, I have all requests sent to my IP address be handled by the same process?

Você poderia ter seu processo aberto 65535 soquetes, um em cada porta. Você não pode fazer um programa existente fazer isso que não está 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 configuração iptables que faz isso, ou algo equivalente.

if I just want to run a server of some sort on something like a Raspberry Pi, could I have it so that my IP address routes to my RPi, which handles any and all incoming network requests using the same server?

A situação padrão na maioria dos roteadores residenciais padrão é que o seu roteador ignore qualquer tráfego enviado por alguém externo.

Em quase todos esses roteadores, você pode fazer o encaminhamento de porta, o 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.

    
por 18.08.2014 / 01:22
1

As portas são essenciais para protocolos que permitem que vários processos se comuniquem entre os servidores. Isso é mais 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 e 21, etc. Para serviços tão conhecidos, é não é necessário especificar a porta se estiverem em execução na porta atribuída ao serviço. As portas designadas são listadas em / etc / services em plataformas Unix / Linux.

  1. Para TCP e UDP, você não pode fazer conexões sem uma porta. O cabeçalho inclui campos para as portas de origem e de destino. Sempre haverá um valor nesses campos, mesmo que seja zero.
  2. É possível capturar todos os pacotes que chegam em uma interface. É assim que funcionam ferramentas como o tcpdump.
  3. Como observado em 1, todas as solicitações recebidas terão um número de porta. Os roteadores SOHO geralmente suportam uma DMZ e encaminham todas as solicitações de entrada não roteadas para o endereço IP atribuído à DMZ. Na maioria dos casos, você só precisa encaminhar as portas necessárias para o serviço no servidor (seu Raspberry Pi). Isso permitiria que você tivesse vários Raspberry Pis executando serviços diferentes.
por 18.08.2014 / 01:26