Por que o campo de protocolo faz parte de um cabeçalho IP?

8

Observe que isso não é uma duplicata de Por que a camada IP está ciente das camadas mais altas da pilha de rede?

A necessidade de um identificador de protocolo (por exemplo, o campo Protocolo do cabeçalho IP) na comunicação baseada em pacotes é clara: é este ou algum tipo de algoritmo de inferência com uso intensivo de computação. A questão é: por que ela deve existir como parte do cabeçalho IP e não nos cabeçalhos dos protocolos encapsulados?

Parece-me que esse daqueles casos em que a clareza teórica atende a considerações práticas (também conhecido como "Haskell atende Go" ...): por um lado, a colocação de um campo "protocolo" no cabeçalho IP quebra a separação conceitual de interesses que, por exemplo, . o modelo OSI visado; por outro lado, forçar protocolos mais altos na pilha para declarar seu tipo de maneira consistente é muito mais difícil e, eventualmente, levaria a uma situação semelhante (por exemplo, se todo protocolo acima da pilha usasse seu primeiro byte de cabeçalho para indicar seu tipo , parece que o IP usou seu último byte de cabeçalho para fazer o mesmo).

Então, minha pergunta é: qual foi o motivo por trás da colocação do campo "protocolo" dentro do cabeçalho do pacote do IP, e não em qualquer outro lugar?

Editar : Ao escrever esta pergunta, pensei em adicionar a palavra " original " antes de "raciocínio", ou seja, o raciocínio da equipe que inventou o IP , mas calculou que era redundante, pois a pergunta foi formulada no pretérito ("qual era o raciocínio..."). No entanto, isso parece necessário, pois nenhuma das respostas realmente responde a essa pergunta. Algumas dicas de observação:

  • @immibis sugere que qualquer outra forma violaria os modelos de outros protocolos (por exemplo, os protocolos de comunicação criptografados teriam que ter um campo de identificação em texto sem formatação)
  • O @Eddie afirma essencialmente que o motivo é a convenção (aceitação do design da cadeia de protocolos , embora o motivo seja essa a convenção permanece um mistério)
  • @Ricky enfatiza a praticidade como uma consideração abrangente
  • A @Claudio sugere que, se o campo de protocolo fizesse parte do cabeçalho encapsulado, seria necessária uma etapa adicional de identificação do cabeçalho , no modelo atual que ocorre durante a análise do cabeçalho IP

Então, vou reformular: O que há de errado com um modelo em que, em vez de cada cabeçalho identificar o próximo tipo de cabeçalho, cada cabeçalho identifica seu próprio tipo em um local predeterminado (por exemplo, no primeiro byte do cabeçalho)? Por que esse modelo é menos desejável que o atual?

Edit # 2 : Parece que a resposta é uma combinação de várias das respostas dadas (principalmente as mencionadas acima, juntamente com o segundo adendo de @ Eddie):

  1. Simplicidade: Quebrar a principal agnosticism camada em neste caso particular, os meios da pilha (ou o modelo) como um todo, pode ser mais simples:

    • Não há fase de "identificação de protocolo", nem implícita nem explícita
    • A independência da camada foi aprimorada (por exemplo, um manipulador de comunicações criptografadas não precisa compartilhar uma camada com nenhum protocolo auxiliar)

    A regulamentação também é bastante simplificada, não sendo necessário impor nenhum requisito nos protocolos do cliente.

  2. Desempenho: declarar o protocolo de um pacote encapsulado antes do próprio pacote permite que vários tipos de protocolos de roteamento rápido (filtragem de pacotes, QOS, comutação de corte) sejam integrados à própria camada de rede (Internet); eles podem tomar decisões o mais rápido que uma tabela de hash pode ser acessada, o que é ainda mais importante, considerando o hardware limitado em que este protocolo foi projetado para executar.

Esse modelo tem suas desvantagens, mas parece que para os casos de uso comuns é mais adequado do que as alternativas.

Docom
fonte
10
Se o número do protocolo fizer parte dos dados encapsulados e você não souber o formato dos dados encapsulados (porque você não conhece o protocolo), como saber onde encontrar o número do protocolo?
precisa saber é o seguinte
Boa reformulação da sua pergunta. Faz mais sentido agora o que você está perguntando. Eu acho que eu tenho uma resposta, mas eu vou dar-lhe um ou dois dias para meditar na minha cabeça para ter certeza que faz sentido.
Eddie
6
"What's wrong with a model where instead of every header identifying the next header's type, every header identifies its own type in a predetermined location?"Porque, então, é efetivamente apenas o último byte do cabeçalho IPv4 (ou qualquer protocolo de nível inferior), exceto o nome. É um problema de "galinha ou ovo". Você não pode analisar um cabeçalho se não souber qual é o protocolo.
reirab
Adicionei meus pensamentos à minha resposta abaixo. Além disso, acho que o @reirab trouxe um ponto fantástico.
Eddie
11
O que faz você dizer que "colocar um campo de protocolo no cabeçalho IP quebra a separação conceitual de interesses que, por exemplo, o modelo OSI visava"? Um protocolo inferior sempre tem informações sobre o protocolo superior: você pode considerá-lo como metadados. É precisamente esse recurso que permite as camadas, e não algo que é apenas uma solução prática: é um requisito. Sugerir que uma camada inferior possa se identificar como escolhe realmente quebraria a separação de interesses. Para um problema semelhante, você pode olhar para extensões de arquivo ou códigos de tipo (Macintosh) ou padrões "mágicos" do Unix.
Jonathanjo #

Respostas:

13

Lembre-se, os bits chegam em uma NIC como uma série de 1 e 0. Algo precisa existir para ditar como as próximas séries de 1 e 0 devem ser interpretadas.

Ethernet2 é o padrão padrão para L2, portanto, supõe-se que ele interprete os primeiros 56 bits como um preâmbulo e os próximos 8 bits como o preâmbulo e os próximos 48 bits como o MAC de destino e os próximos 48 bits como a fonte. MAC, e assim por diante .

A única variação pode ser o cabeçalho 802.3 L2 , um tanto antiquado , que antecede o atual padrão Ethernet2, mas também inclui um cabeçalho SNAP que serve ao mesmo objetivo. Mas eu discordo.

O cabeçalho Ethernet2 L2 padrão possui um campo Tipo, que informa ao nó receptor como interpretar os 1 e 0 a seguir: Cabeçalho Ethernet com o campo Tipo destacado

Sem isso, como a entidade receptora saberia se o cabeçalho L3 é IP ou IPv6? (ou AppleTalk, IPX ou IPv8, etc ...)

O cabeçalho L3 (no mesmo quadro acima) possui o campo Protocolo, que informa ao nó receptor como interpretar o próximo conjunto de 1 e 0 que seguem o cabeçalho IP: Cabeçalho IP com o campo Protocolo realçado

Novamente, sem isso, como a entidade receptora saberia interpretar esses bits como um pacote ICMP? Também pode ser TCP, UDP ou GRE, ou outro cabeçalho IP, ou uma infinidade de outros.

Isso cria uma espécie de cadeia de protocolo para indicar à entidade receptora como interpretar o próximo conjunto de bits. Sem isso, o terminal receptor teria que usar heurísticas (ou outra estratégia semelhante) para primeiro identificar o tipo de cabeçalho e, em seguida, interpretar e processar os bits. O que acrescentaria uma sobrecarga significativa em cada camada e um atraso notável no processamento de pacotes.

Nesse ponto, é tentador olhar para o cabeçalho TCP ou UDP e apontar que esses cabeçalhos não têm um campo Tipo ou Protocolo ... mas lembre-se, uma vez que o TCP / UDP tenha interpretado os bits, ele passa sua carga útil para a aplicação. O que, sem dúvida, provavelmente possui algum tipo de marcador para pelo menos identificar a versão do protocolo L5 +. Por exemplo, o HTTP tem um número de versão incorporado nas solicitações HTTP: (1.0 vs 1.1).


Editar para falar com a edição do pôster original:

O que há de errado com um modelo em que, em vez de cada cabeçalho identificar o próximo tipo de cabeçalho, cada cabeçalho identifica seu próprio tipo em um local predeterminado (por exemplo, no primeiro byte do cabeçalho)? Por que esse modelo é menos desejável que o atual?

Antes de começar minha tentativa de resposta, acho que vale a pena notar que provavelmente não há uma resposta definitiva de um milhão de dólares a respeito de por que um caminho é melhor ou o outro. Nos dois casos, o protocolo se identificando versus o protocolo que encapsula, a entidade receptora seria capaz de interpretar os bits corretamente.

Dito isto, acho que existem algumas razões pelas quais o protocolo que identifica o próximo cabeçalho faz mais sentido:

# 1

Se o padrão fosse o primeiro byte de cada cabeçalho para se identificar, isso definiria um padrão em todos os protocolos em todas as camadas. O que significa que se apenas um byte for dedicado, poderíamos ter apenas 256 protocolos. Mesmo se você dedicou dois bytes, esse limite é de 65536. De qualquer maneira, ele coloca um limite arbitrário no número de protocolos que podem ser desenvolvidos.

Enquanto se um protocolo era responsável apenas pela interpretação do próximo, e mesmo se apenas um byte fosse dedicado a cada campo de identificação de protocolo, pelo menos você 'dimensiona' esse máximo de 256 para cada camada.

# 2

Os protocolos que ordenam seus campos de forma a permitir às entidades receptoras a opção de inspecionar apenas o mínimo necessário para tomar uma decisão só existem se o próximo campo de protocolo existir no cabeçalho anterior.

A comutação Ethernet2 e " Cut-Through " vem à mente. Isso seria impossível se os primeiros (poucos) bytes fossem forçados a ser um bloco de identificação de protocolo.

# 3

Por fim, não quero receber crédito, mas acho que a resposta do @reirab no comentário nos comentários da pergunta original é extremamente viável:

Porque, então, é efetivamente apenas o último byte do cabeçalho IPv4 (ou qualquer protocolo de nível inferior), exceto o nome. É um problema de "galinha ou ovo". Você não pode analisar um cabeçalho se não souber qual é o protocolo.

Citado com a permissão da Reirab

Eddie
fonte
3
Sim, e também existem protocolos da camada 4 existentes que não sejam TCP ou UDP. O IP realmente não se importa com o que tem em sua carga útil, incluindo protocolos ainda não inventados.
Ron Maupin
@ Eddie Que programa de captura de pacotes é esse?
Levi
2
@ Levi: que se parece com WireShark.
Tapete de
11
@ Levi, é difícil subestimar o valor de conhecer o Wireshark para qualquer pessoa envolvida em redes. Eles publicaram um grande conjunto de vídeos de sua conferência anual, SharkFest, que ilustra seu valor e ensina muitos conceitos avançados.
101316 Jeff Meden
2
Além disso, você está exatamente correto sobre por que o TCP e o UDP não têm um campo do tipo protocolo / carga útil. Ethernet e IP são projetados para passar suas cargas úteis para o próximo nível superior na pilha de rede do sistema operacional, enquanto TCP e UDP são projetados para transmitir suas cargas úteis diretamente para um aplicativo em um soquete específico. O aplicativo já sabe qual protocolo esperar nesse soquete. O sistema operacional precisa saber o suficiente para saber como rotear o pacote para o soquete de destino correto, mas o proprietário desse soquete já deve saber qual deve ser o próximo protocolo de camada superior.
reirab
8

Você também pode perguntar por que um cabeçalho ethernet possui um campo Ether Type. A pilha de rede precisa saber qual protocolo na próxima camada superior obtém a carga útil da camada atual.

Editar 1:

A razão pela qual cada datagrama possui o protocolo da próxima camada superior é criar a independência da camada. Cada camada não se importa com o que está na carga útil e não deve precisar procurar na carga útil para determinar onde entregar a carga útil. Pense no número do protocolo no cabeçalho como um endereço onde a carga útil deve ser entregue. Assim como os números de porta TCP são endereços TCP, eles informam ao TCP onde entregar sua carga útil.

O endereço MAC de destino informa ao switch de rede qual interface de switch deve entregar o quadro. O campo Ether Type informa a camada 2 onde entregar sua carga útil, o campo Protocol no cabeçalho IP informa a camada 3 onde entregar sua carga útil e os números de porta no TCP e UDP informam a camada 4 onde entregar sua carga útil.

Pense em um motorista de caminhão de 18 rodas que se conecta a um trailer para entregá-lo em algum lugar. Ele não precisa se preocupar com o que está no trailer ou com o que será usado; ele apenas olha para a papelada e a entrega no local da papelada.

Você precisa se lembrar que cada um dos protocolos foi desenvolvido independentemente, sem saber quais protocolos emergentes da camada superior seriam usados. Por um longo tempo, o protocolo primário da camada 3 usado na Ethernet foi o IPX. Se a Ethernet tivesse sido criada especificamente para o IPX, seria tão onipresente hoje? A Ethernet foi criada para transportar qualquer protocolo da camada 3, tendo o campo Ether Type que a pilha de rede pode usar para decidir para onde a carga útil da Ethernet vai. O IP faz a mesma coisa, assim como o TCP e o UDP. É um método fácil e lógico, e é por isso que cada camada desenvolvida independentemente na pilha de rede tem um equivalente. Você e qualquer outra pessoa interessada podem desenvolver seus próprios protocolos para qualquer uma das camadas que podem ser facilmente conectadas à pilha de rede por causa disso.

Edição 2:

Ele permite que diferentes protocolos da camada 3 se registrem na camada 2. Você pode executar simultaneamente os protocolos IPX (0x8137), IPv4, (0x0800), ARP (0x0806), IPv6 (0x86DD) etc. 3 protocolo sem saber nada sobre a carga (ou descartar pacotes que não possuam um protocolo registrado). Você não precisa instalar um protocolo de camada 2 diferente para cada combinação de protocolos de camada 3 que você possui, e isso seria necessário se o protocolo de camada 2 precisasse saber mais sobre o (s) protocolo (s) de camada 3 ) para poder ler os cabeçalhos dos pacotes. Até os cabeçalhos de pacotes IPv4 e IPv6 são bem diferentes.

Aqui está uma lista incompleta de valores para diferentes protocolos da camada 3 que podem ser registrados na camada 2.

Os protocolos da camada 4 também são registrados com vários protocolos da camada 3 e os aplicativos são registrados com os protocolos da camada 4.

Sua pergunta original postulava que as camadas deveriam ser independentes uma da outra, e esse tipo de coisa realmente promove a independência da camada, em vez de quebrá-la, como você sugere. A camada 2 não sabe que a carga útil é IPv4, apenas sabe que o ethertype é 0x0800 e deve passar a carga útil para o protocolo da layer 3 que registrou esse ethertype.

Ron Maupin
fonte
11
Este. É uma otimização de programação. Como você sabe qual estrutura de dados se aplica sem algo enumerar o que é. O lugar lógico para isso está no cabeçalho IP ("declaração de encaminhamento".) Lembre-se de que o IP foi projetado em uma época em que os computadores eram muito menos capazes.
Ricky Beam
4
@RickyBeam Não, não é uma otimização. É um tipo de identificação. Você não pode torná-lo parte de dados maior do protocolo, porque então você precisa saber o protocolo para decodificar os dados - obviamente, este é um pouco circular :)
Luaan
2

Não é uma resposta direta à sua pergunta, mas:

Por um lado, a colocação de um campo "protocolo" no cabeçalho IP interrompe a separação conceitual de interesses que o OSI buscava.

O TCP / IP foi desenvolvido sem referência ao modelo OSI. Embora eles compartilhem alguns pontos em comum, foi um esforço de desenvolvimento separado.

Ron Trunk
fonte
Obrigado. Eu originalmente usei " o objetivo do modelo OSI ", o que é mais preciso neste contexto. Vou reformular.
Docom 02/02
1

O motivo mais simples é ajudar a analisar quando um pacote é recebido.

Se você souber qual protocolo segue, poderá desenvolver restrições mais rígidas. O único aspecto dinâmico no pacote IP é o tamanho (a presença de opções de IP aumenta esse tamanho em múltiplos de quatro bytes).

Na fase de análise, você pode verificar o comprimento do cabeçalho IP, protocolo. Em seguida, na validação de pacotes de baixo nível, os dados do pacote são lidos através de uma estrutura de dados (normalmente, cabeçalhos icmp, tcp, udp) e com o pacote fácil é validado.

Claudio
fonte
0

Basta ler o título:

Quando o pacote IP contém dados TCP, o campo número do protocolo terá o valor 6; portanto, a carga útil será enviada para a pilha TCP, o TCP usaria os números de porta para enviar os dados para o aplicativo correto. O mesmo é para UDP com número de protocolo 17.

Outra maneira de examinar o campo do número do protocolo IP é que, se não tivéssemos esse campo no cabeçalho do pacote IP, o IP seria capaz de transportar apenas um tipo de dados, enquanto a adição desse campo permitiria ao IP transportar vários tipos de dados diferenciados pelo número do protocolo, o mesmo vale para TCP / UDP usando portas TCP / UDP para atender a vários aplicativos e Ethernet usando o Ethertype, e assim por diante.

KPMG
fonte