
Recentemente comecei a aprender sobre o modelo OSI, redes e outras coisas.
Como gosto de codificar em C, queria enviar meus próprios frames Ethernet.
Agora consegui funcionar; no entanto, ainda não tenho certeza sobre uma coisa:
ao enviar um quadro Ethernet da máquinaAmaquinarB(assumindo que ambas as máquinas estão na mesma rede), qual endereço MAC devo especificar comoDestinoEndereço MAC do quadro?
Tentei o endereço MAC do meu roteador e o endereço MAC da máquinaB, ambas as formas funcionam. Para obter o endereço MAC da máquinaB, simplesmente fiz uma solicitação ARP.
Porém, qual é o caminho certo?
Monitorei o tráfego com Wireshark na máquinaAe comtcpdumpna máquinaB. Essa é a saída na máquinaB( e0:d5:5e:c6:52:9a
é o endereço MAC da máquinaB):
Ao especificar a máquinaBendereço MAC do como endereço de destino ( a0:ce:c8:10:75:8c
é o NIC MAC da máquinaA):
18:42:46.152800 a0:ce:c8:10:75:8c > e0:d5:5e:c6:52:9a, ethertype IPv4 (0x0800), length 64: 192.168.178.21.23455 > 192.168.178.27.23456: UDP, length 5
Ao especificar o endereço MAC do roteador como endereço de destino ( c8:0e:14:fd:f3:23
é o NIC MAC do roteador):
18:45:04.735375 c8:0e:14:fd:f3:23 > e0:d5:5e:c6:52:9a, ethertype IPv4 (0x0800), length 60: 192.168.178.21.23455 > 192.168.178.27.23456: UDP, length 5
Este resultado mostra que o roteador reescreve oFonteEndereço MAC e provavelmente usa seu cache para determinar o endereço MAC de destino correto para o IP de destino.
Como o roteador lida com o quadro onde está o endereço MAC da máquinaBé especificado?
Existe diferença entre as duas formas?
Existe uma maneira preferida/correta?
Responder1
O método geralmente correto, se você sabe que a máquina de destino está na sub-rede local, é usar diretamente o endereço MAC da máquina de destino (fazendo uma pesquisa ARP, se necessário). Isso vai funcionarsem considerardo tipo ethertype ou conteúdo do quadro e geralmente ignorará o roteador (ele entrará em curto-circuito através do switch Ethernet).
Seo quadro contém IPv4 ou IPv6, você pode enviá-lo para o roteador da sub-rede, que fará uma pesquisa ARP e encaminhará a carga útil do quadro para qualquer host ao qual o endereço IP de destino pertence. (Afinal, é isso que os roteadoresfazer:eles encaminham pacotes IP – mesmo que isso signifique apenas refleti-los de volta para a mesma interface.)
No entanto, o envio de pacotes locais através de um roteador é ineficiente e completamente desnecessário na maioria dos casos. Para roteadores mais baratos, isso pode significar ter o pacote processado por uma CPU muito lenta (em comparação com a velocidade total da linha do switch Ethernet).
Dito isto, o segundo métodoéusado ocasionalmente na prática, juntamente com recursos de "isolamento de cliente" (também conhecido como "VLAN privada") em switches e pontos de acesso.
Responder2
Lembre-se de que a Ethernet não possui roteadores. Os roteadores são um conceito de camada 3 (camada de rede, onde, por exemplo, reside o IP), que é uma camada acima da Ethernet, da qual a própria Ethernet não deveria ter conhecimento.
O endereço correto a ser colocado no campo de destino do cabeçalho Ethernet é o endereço MAC Ethernet do host de destino.
Na sua pergunta, você também menciona o envio de um quadro Ethernet para um host e, como acontece, esse quadro Ethernet continha um datagrama IP para um host IP diferente do destino Ethernet para o qual você o enviou. Então, aquele host IP estava agindo como um roteador e roteou seu datagrama IP para você, enviando-o de volta para a mesma LAN Ethernet, mas desta vez com o endereço de destino Ethernet correto correspondente ao endereço do host IP, o datagrama IP era o endereço para.