Eu li vários artigos sobre tamanhos de pacotes UDP, mas não consegui chegar a uma conclusão sobre o que é correto.
Vários serviços restringem o maior pacote UDP a 512 bytes (como dns)
Dado que o MTU mínimo na Internet é 576, o tamanho do cabeçalho IPv4 é 20 bytes e o cabeçalho UDP, 8 bytes. Isso deixa 548 bytes disponíveis para dados do usuário
Eu seria capaz de usar pacotes até o tamanho de 548 sem fragmentação de pacotes? Ou há algo que os criadores do DNS sabiam e por isso o restringiram a 512 bytes.
Eu poderia ir além de 548 bytes com segurança?
Respostas:
É verdade que um cabeçalho IPv4 típico tem 20 bytes e o cabeçalho UDP é 8 bytes. No entanto, é possível incluir opções de IP que podem aumentar o tamanho do cabeçalho IP para até 60 bytes. Além disso, às vezes é necessário que os nós intermediários encapsulem datagramas dentro de outro protocolo, como IPsec (usado para VPNs e similares), a fim de rotear o pacote para seu destino. Portanto, se você não conhece o MTU no seu caminho de rede específico, é melhor deixar uma margem razoável para outras informações de cabeçalho que talvez você não tenha previsto. Uma carga útil UDP de 512 bytes é geralmente considerada como tal, embora mesmo isso não deixe espaço suficiente para um cabeçalho IP de tamanho máximo.
fonte
O limite teórico (no Windows) para o tamanho máximo de um pacote UDP é 65507 bytes. Isso está documentado aqui :
Dito isto, a maioria dos protocolos limita-se a um tamanho muito menor - geralmente 512 ou ocasionalmente 8192. Geralmente, você pode ultrapassar 548 com segurança se estiver em uma rede confiável - mas, se estiver transmitindo pela Internet em geral, maior será o tamanho. você for, maior a probabilidade de encontrar problemas e perda de transmissão de pacotes.
fonte
A carga útil UDP máxima segura é de 508 bytes. Esse é um tamanho de pacote de 576, menos o cabeçalho IP máximo de 60 bytes e o cabeçalho UDP de 8 bytes. Qualquer carga útil UDP desse tamanho ou menor tem garantia de entrega via IP (embora não seja garantida a entrega). Qualquer coisa maior pode ser descartada por qualquer roteador por qualquer motivo. Exceto em uma rota somente IPv6, onde a carga útil máxima é de 1.212 bytes. Como outros já mencionaram, cabeçalhos de protocolo adicionais podem ser adicionados em algumas circunstâncias. Um valor mais conservador de cerca de 300 a 400 bytes pode ser preferido.
Qualquer pacote UDP pode estar fragmentado. Mas isso não é muito importante, porque perder um fragmento tem o mesmo efeito que perder um pacote não fragmentado: todo o pacote é descartado. Com o UDP, isso vai acontecer de qualquer maneira.
Curiosamente, o tamanho máximo do pacote teórico é de cerca de 30 MB (1.500 MTU Ethernet - cabeçalho IP 60 x 65.536 número máximo de fragmentos), embora a probabilidade de superação seja infinitesimal.
Fontes: RFC 791, RFC 2460
fonte
576 é o tamanho máximo mínimo do buffer de remontagem , ou seja, cada implementação deve poder remontar pacotes com pelo menos esse tamanho. Veja IETF RFC 1122 para detalhes.
fonte
Este artigo descreve a unidade máxima de transmissão (MTU) http://en.wikipedia.org/wiki/Maximum_transmission_unit . Ele afirma que os hosts IP devem poder processar 576 bytes para um pacote IP. No entanto, observa que o mínimo é 68. RFC 791: "Todo módulo da Internet deve ser capaz de encaminhar um datagrama de 68 octetos sem fragmentação adicional. Isso ocorre porque um cabeçalho da Internet pode ter até 60 octetos e o fragmento mínimo é de 8 octetos. . "
Portanto, o tamanho do pacote seguro de 508 = 576 - 60 (cabeçalho IP) - 8 (cabeçalho udp) é razoável.
Conforme mencionado pelo usuário607811, a fragmentação por outras camadas da rede deve ser remontada. https://tools.ietf.org/html/rfc1122#page-56 3.3.2 Remontagem A camada IP DEVE implementar a remontagem de datagramas IP. Designamos o maior tamanho de datagrama que pode ser remontado por EMTU_R ("MTU eficaz para receber"); isso às vezes é chamado de "tamanho do buffer de remontagem". EMTU_R DEVE ser maior ou igual a 576
fonte
O tamanho mínimo do buffer de remontagem IPv4 é 576, o IPv6 possui 1500. Subtraia os tamanhos de cabeçalho daqui. Veja Programação de Rede UNIX por W. Richard Stevens :)
fonte
512 é sua melhor aposta. É usado em outro lugar e é um bom número par (metade de 1024).
fonte
Como o IPV6 tem um tamanho de 1500, eu afirmaria que as operadoras não forneceriam caminhos separados para IPV4 e IPV6 (ambos são IP com tipos diferentes), forçando-os a equipamentos para o IPv4 que seriam antigos, redundantes e mais caros de manter e menos confiável. Não faria sentido. Além disso, isso pode ser facilmente considerado como tratamento preferencial para algum tráfego - um não não segundo as regras que eles provavelmente não se importam muito (a menos que sejam pegos).
Portanto, o 1472 deve ser seguro para uso externo (embora isso não signifique que um aplicativo como o DNS que não conhece o EDNS o aceite) e, se você estiver falando de redes internas, é provável que saiba o layout da sua rede. os tamanhos de pacotes jumbo se aplicam a pacotes não fragmentados, para 4096 a 4068 bytes, e para as placas da Intel com buffers de 9014 bytes, um tamanho de pacote ... aguarde ... 8086 bytes, seria o máximo ... coincidência? rir
****ATUALIZAR****
Várias respostas fornecem os valores máximos permitidos por 1 fornecedor de SW ou várias respostas assumindo o encapsulamento. O usuário não solicitou o menor valor possível (como "0" para um tamanho UDP seguro), mas o maior tamanho de pacote seguro.
Os valores de encapsulamento para várias camadas podem ser incluídos várias vezes. Desde que você encapsulou um fluxo - não há nada proibindo, digamos, uma camada VPN abaixo disso e uma duplicação completa das camadas de encapsulamento acima disso.
Como a pergunta era sobre valores máximos de segurança, presumo que eles estejam falando sobre o valor máximo de segurança de um pacote UDP que pode ser recebido. Como nenhum pacote UDP é garantido, se você receber um pacote UDP, o maior tamanho seguro seria 1 pacote sobre IPv4 ou 1472 bytes.
Nota - se você estiver usando IPv6, o tamanho máximo seria 1452 bytes, pois o tamanho do cabeçalho do IPv6 é 40 bytes vs. o tamanho de 20 bytes do IPv4 (e de qualquer forma, ainda é necessário permitir 8 bytes para o cabeçalho UDP).
fonte
Eu li algumas boas respostas aqui; no entanto, existem alguns erros menores. Alguns responderam que o campo Comprimento da mensagem no cabeçalho UDP é no máximo 65535 (0xFFFF); isso é tecnicamente verdade. Alguns responderam que o máximo real é (65535 - IPHL - UDPHL = 65507). O erro é que o campo Comprimento da mensagem no cabeçalho UDP inclui toda a carga útil (camadas 5 a 7), mais o comprimento do cabeçalho UDP (8 bytes). O que isso significa é que, se o campo de tamanho da mensagem for 200 bytes (0x00C8), a carga útil será realmente 192 bytes (0x00C0).
O que é difícil e rápido é que o tamanho máximo de um datagrama IP é 65535 bytes. Esse número chega à soma total dos cabeçalhos L3 e L4, mais a carga útil das camadas 5-7. Cabeçalho IP + Cabeçalho UDP + Camadas 5-7 = 65535 (máx.)
A resposta mais correta para o tamanho máximo de um datagam UDP é 65515 bytes (0xFFEB), pois um datagrama UDP inclui o cabeçalho UDP. A resposta mais correta para o tamanho máximo de uma carga útil UDP é 65507 bytes, pois uma carga útil UDP não inclui o cabeçalho UDP.
fonte
Receio ter reações irritantes, mas, no entanto, para esclarecer para mim se estou errado ou quem está vendo esta pergunta e está interessado em uma resposta:
meu entendimento de https://tools.ietf.org/html/rfc1122 cujo status é "uma especificação oficial" e, como tal, é a referência para a terminologia usada nesta questão e que não é substituída por outra RFC nem tem erratas que contradigam a Segue:
teoricamente, ie. com base nas especificações escritas, o UDP, como fornecido por https://tools.ietf.org/html/rfc1122#section-4 , não possui "tamanho de pacote". Assim, a resposta pode ser "indefinida"
Na prática, que é o que essas perguntas provavelmente buscaram (e que podem ser atualizadas para a tecnologia atual em ação), isso pode ser diferente e eu não sei.
Peço desculpas se eu causei transtorno. https://tools.ietf.org/html/rfc1122#page-8 O "Internet Protocol Suite" e os "pressupostos arquitetônicos" não esclarecem para mim a "suposição" em que eu estava, com base no que ouvi dizer, que as camadas são separadas . Ou seja. a camada em que o UDP está inserido não precisa se preocupar com a camada em que o IP está (e a camada IP possui itens como remontagem, EMTU_R, fragmentação e MMS_R ( https://tools.ietf.org/html/rfc1122#page- 56 ))
fonte