Eu tenho essa lacuna na minha compreensão de rede que sempre tive dificuldade em superar.
Ao longo dos anos, escrevi vários pequenos projetos de remetente/receptor TCP/UDP -- principalmente código simples de nível hello-world, a fim de aprender a mecânica de enviar/receber dados sobre TCP ou UDP.
Mas quase todos os exemplos que mencionei tendem a usar 127.0.0.x como endereço do receptor. Ou seja, um ouvinte TCP faz um bind()
para um endereço 127.0.0.x.
Da mesma forma, em meu curso Udemy Docker & Kubernetes , o instrutor cria um servidor web Node.js que escuta na porta 3000 127.0.0.1.
Eu tenho um entendimento instável de que esses endereços de "loopback" são algum recurso do sistema operacional que torna esses "endereços virtuais" e permite que eles atuem como se fossem endereços de rede reais. (Essa explicação provavelmente foi muito ruim, revelando minha compreensão instável)
Minhas perguntas (sei que várias perguntas por postagem são desaprovadas, mas espero que essas perguntas sejam agrupadas logicamente o suficiente para justificar fazer essas perguntas juntas):
- Qual é a diferença entre esses endereços de loopback (presumo 127.0.0.1 - 127.0.0.255?) e "reais" (talvez sem loopback seja a melhor palavra?) Endereços IP?
- Em um determinado PC, o que determina se um endereço IP está disponível para a função C
bind()
?
Por exemplo, no seguinte trecho de código (adaptado daqui ):
...o que determina se o endereço IP 72.212.216.41 está disponível nesse PC específico para que o código C funcione corretamente?struct sockaddr_in sin; int s = socket(AF_INET, SOCK_STREAM, 0); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(1221908521); // 72.212.216.41 according to http://www.aboutmyip.com/AboutMyXApp/IP2Integer.jsp?ipAddress=72.212.216.41 sin.sin_port = htons(3000); bind(s, (struct sockaddr *) &sin, sizeof sin);
- Quem deu à minha placa de rede o endereço 72.212.216.41 ?
- O 72.212.216.41 é algo bem acoplado à minha placa de rede e imutável? Ou algum processo de software pode alterá-lo?
- Uma placa de rede pode ter apenas um endereço IP?
- Por que tantos tutoriais de rede usam 127.0.0.1 em vez de endereços "sem loopback"? (Não quero generalizar, mas descobri que isso é amplamente verdade)
Acho que a essência das minhas perguntas é que estou tentando entender como a atribuição/disponibilidade do endereço IP funciona no contexto de um único PC.
Como o software/hardware diz: "PC do StoneThrow, você está atribuído 72.212.216.41 , então seus programas C podem chamar bind()
com esse endereço"?
Os endereços IP são atribuídos a interfaces , não a computadores, etc.
As interfaces não precisam ser suportadas por hardware físico, um sistema operacional pode fornecer um driver que se parece com uma interface de rede para um aplicativo, mas na verdade é outra coisa.
Assim, os sistemas operacionais podem apresentar uma interface "loopback" para os aplicativos, que internamente pegam o tráfego de entrada e basicamente o copiam para o buffer de saída da interface sem entregá-lo a um driver de dispositivo que fala com uma NIC física - daí "loopback".
Alguns sistemas operacionais têm a interface de loopback como uma interface que você pode ver e manipular como qualquer outra interface (Linux e a
lo
interface comum versus outras comoeth0
, etc.), e alguns tornam a interface de loopback invisível (Windows).Todos os endereços IP são "reais". As regras gerais na rede são:
Você pode fazer o que quiser desde que ambos os lados concordem, mas normalmente você não controla o outro lado, então padrões e convenções determinam o que você pode fazer, a menos que você crie condições em que elas não se apliquem mais.
127.0.0.0/16 é reservado pela IANA para fins de adaptador de loopback, e é isso. É uma convenção, mas uma convenção que todos os ISPs e sistemas operacionais seguem.
Tecnicamente, você poderia atribuir 127.0.0.1 a uma NIC física, mas acho que apenas o Linux permitiria. No entanto, nenhum roteador ISP fará qualquer coisa com 127.0.0.0/16, exceto descartá-lo, portanto, assim que 127.0.0.1 escapar do seu roteador (supondo que seu roteador esteja configurado corretamente para roteá-lo para seu ISP), ele será descartado. Você sempre pode fazer o que quiser em sua própria LAN.
Acho que tudo com o que o bind() se importa é que nada mais está usando o mesmo soquete. Um soquete é uma porta IP+.
Nada o impede de atribuir esse IP a qualquer coisa que você queira em sua rede. Se ele fará algo produtivo depende de como outros NICs em sua rede estão configurados (estão todos na mesma sub-rede?), se cada sistema pode alcançar um roteador (obter IP do roteador do DHCP ou definir manualmente), se esse roteador funciona, e seu provedor de internet.
Provavelmente DHCP, e provavelmente o servidor DHCP do seu ISP (Cox). Se não for DHCP, então a implementação APIPA da maioria dos sistemas operacionais será ativada. Isso supondo que você não definiu estaticamente um IP + máscara de sub-rede.
Não. Esse é um endereço IP e é a camada 3, enquanto sua NIC está preocupada com a camada 2 (quadros Ethernet) e a camada 1 (modulando fisicamente/escutando o cabo)
Embora muitas placas de rede tenham "mecanismos de descarregamento" que lidam com partes do TCP/IP, todas elas podem ser desabilitadas e o TCP/IP feito inteiramente por software.
Na maioria dos sistemas operacionais:
Na maioria das vezes, 1 porta NIC = 1 interface, mas às vezes você pode fazer uma ligação onde 2 ou 3 portas trabalham juntas e se parecem com 1 interface. Isso é comum em servidores e switches.
Uma interface pode ter 0, 1 ou mais de 1 combinação de endereço IP + máscara de sub-rede. No IPv6 cada interface normalmente terá pelo menos 2 (uma será link-local).
Assim, você não incomoda sistemas públicos na Internet que não esperam que você fale com eles, e também não incomoda outros sistemas em sua própria LAN que não esperam que você fale com eles. O loopback permanece inteiramente em sua máquina.
Muitas vezes, isso é DHCP. Existem servidores DHCP e clientes DHCP. Os clientes DHCP usam broadcasts Ethernet, que enviam tráfego para todos os sistemas em uma rede e não requerem um IP, para encontrar o servidor DHCP e obter um IP dele.
O IP pode ser atribuído manualmente por você ou automaticamente por diferentes mecanismos ou protocolos de configuração. Seu endereço é público e atribuído à interface de rede pelo seu provedor por DHCP ou por PPTP.
Basta ler isso na íntegra: https://en.m.wikipedia.org/wiki/IP_address
Os endereços IP diferem principalmente em sua acessibilidade global:
https://en.m.wikipedia.org/wiki/Private_network
https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
O IP é atribuído a uma interface de rede (cartão} em seu computador e pode ser alterado a qualquer momento.
O computador pode ter várias interfaces de rede e cada interface pode ter vários IPs atribuídos.
127.0.0.1 é usado para conveniência e segurança. Ele está sempre presente por padrão, mesmo que não haja interfaces de rede no computador e o software possa se vincular a ele com segurança apenas para comunicação entre processos locais.
https://en.m.wikipedia.org/wiki/Localhost