Eu acho que é uma pergunta muito clássica, mas, embora eu tenha alguma experiência, não tenho mais vocabulário suficiente para pesquisar e entender corretamente na Web.
Digamos que eu tenho uma rede doméstica com 192.168.0.1 (IP.1) e 192.168.0.2 (IP.2) e estamos jogando com o Counter Strike, atingindo exatamente o mesmo servidor externo.
Como meu roteador doméstico sabe qual pacote vai para IP.1? Costumo ler coisas com endereços NAT e xxx.xxx/y. ** Onde está escrita a parte / y na pilha TCP / IP?
Precisamos absolutamente de NAT para isso? O que entendi no artigo da Wikipedia é que o NAT é feito para otimizar endereços IP, quando alguns computadores são desligados. Também permite conectar 5 dispositivos com apenas 1 IP público?
Respostas:
(Para o seguinte, ignorarei as pesquisas de DNS ou a ação da camada dois, pois essa não é a parte relevante para a história do NAT.)
Qualquer conexão TCP é composta por quatro partes:
Em resumo: o IP de destino é usado para obter o pacote na máquina correta, a porta de destino é usada para obter o pacote nessa máquina no programa / sessão correto O IP de origem é usado para saber para onde enviar respostas. O mesmo vale para a porta de origem. Quando uma resposta é enviada, a origem e o destino são simplesmente trocados.
Vamos começar com dois computadores sem NAT:
1.1.1.1
3.3.3.3
80
Quando um computador solicita uma página da Web, ele primeiro seleciona um número de porta aleatório não utilizado do intervalo aleatório (1024-65535). Vamos escolher
2345
. Em seguida, ocorrerá a seguinte sequência: O computador envia seu pacote com: IP de1.1.1.1
origem2345
, porta de origem , IP de3.3.3.3
destino, porta de destino80
. Os pacotes chegam ao servidor da web, ele vê seu próprio IP e porta80
, então sabe que isso é uma solicitação para uma página da web. O servidor da Web envia a página da Web de volta em pacotes com IP de3.3.3.3
origem, porta de origem 80, IP de1.1.1.1
destino, porta de destino2345
. O computador recebe esses pacotes e sabe qual foi a página solicitada por causa do número da porta2345
.Essas combinações de portas geralmente são escritas da seguinte maneira:
1.1.1.1:2345
e3.3.3.3:80
.Agora, o número de computadores na Internet supera em muito o número de endereços IPv4 disponíveis. Para preservar o espaço de endereço, foi introduzido um conjunto de intervalos de endereços privados, que podem ser usados livremente para o compartilhamento de endereços. Estes rangese são referidos como RFC1918 e são os seguintes:
Esses endereços não estão nas tabelas de roteamento da Internet, portanto, se você enviar um pacote com um destino nesses intervalos na espinha dorsal da Internet, eles simplesmente serão descartados. Isso ocorre porque milhões de pessoas usam os mesmos endereços. Esses endereços precisam ser traduzidos para algo útil para a internet. É aqui que entra a Tradução de endereços de rede:
Nós temos dois computadores:
192.168.0.1
e B:192.168.0.2
1.1.1.1
.Primeiro, os dois computadores selecionam uma porta aleatória: digamos:
192.168.0.1:2345
e192.168.0.2:5432
.Computador A envia seu pacote com origem
192.168.0.1:2345
e destino3.3.3.3:80
. O gateway converte esse pacote no1.1.1.1:2345
destino de origem3.3.3.3:80
e lembra que todas as respostas a essa combinação vão para192.168.0.1
. Portanto, quando receber uma resposta com origem3.3.3.3:80
e destino1.1.1.1:2345
, ela será traduzida para origem3.3.3.3:80
e destino192.168.0.1:2345
e enviará o pacote.O computador B envia seu pacote com origem
192.168.0.2:5432
e destino3.3.3.3:80
. O gateway converte esse pacote no1.1.1.1:5432
destino de origem3.3.3.3:80
e lembra que todas as respostas a essa combinação vão para192.168.0.2
. Portanto, quando receber uma resposta com origem3.3.3.3:80
e destino1.1.1.1:5432
, ela será traduzida para origem3.3.3.3:80
e destino192.168.0.2:5432
e enviará o pacote.Se os dois computadores selecionarem o mesmo número da porta de origem, o gateway simplesmente escolherá outro número de porta de origem aleatória gratuita e lembre-se de traduzir também o número da porta. Às vezes, isso é chamado de PAT (Port Address Translation). Este é basicamente um subconjunto do NAT.
Existem várias implementações para isso tudo. O gateway pode simplesmente lembrar "Computador X usou a porta de origem Y" e encaminhar qualquer coisa com a porta Y para o computador X. Ele pode se lembrar que o Computador X usou a porta de origem Y e o destino Z "e encaminhar apenas qualquer coisa da porta Z para a porta Y de volta para computador X. Ou existe a opção de lembrar toda a tupla e enviar apenas tráfego para o computador X que corresponda a todo o IP e porta de origem / destino.
fonte