Qual é o maior tamanho do pacote UDP seguro na Internet

Eu li uma série de artigos sobre tamanhos de pacotes UDP, mas não consegui chegar a uma conclusão sobre o que está correto.

Um número de serviços restringe o maior pacote UDP a 512 bytes (como o dns)

Dado o MTU mínimo na Internet é 576, e o tamanho do header IPv4 é de 20 bytes, e o header UDP de 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 existe algo que os criadores do DNS conheciam e por isso restringiram-no a 512 bytes?

Eu poderia ir mais alto do que 548 bytes com segurança?

É verdade que um header IPv4 típico é de 20 bytes e o header UDP é de 8 bytes. No entanto, é possível include opções de IP que podem aumentar o tamanho do header 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 o IPsec (usado para VPNs e similares) para rotear o pacote para seu destino. Portanto, se você não souber a MTU em seu caminho de rede específico, é melhor deixar uma margem razoável para outras informações de header que talvez você não tenha antecipado. Geralmente, considera-se que uma carga útil UDP de 512 bytes faz isso, embora mesmo isso não deixe espaço suficiente para um header IP de tamanho máximo.

O limite teórico (no Windows) para o tamanho máximo de um pacote UDP é 65507 bytes. Isso está documentado aqui :

O tamanho máximo de mensagem UDP correto é 65507, conforme determinado pela fórmula a seguir: 0xffff – (sizeof (IP Header) + sizeof (header UDP)) = 65535- (20 + 8) = 65507

Dito isto, a maioria dos protocolos se limita a um tamanho muito menor – geralmente 512 ou ocasionalmente 8192. Você pode ir mais alto do que 548 com segurança se estiver em uma rede confiável – mas se você estiver transmitindo pela Internet como um todo, o maior quanto mais você for, mais problemas ocorrerá na transmissão de pacotes e perda.

576 é o tamanho máximo do buffer de reassembly , ou seja, cada implementação deve ser capaz de remontar pacotes de pelo menos esse tamanho. Veja IETF RFC 1122 para detalhes.

A carga útil máxima do UDP seguro é de 508 bytes. Este é um tamanho de pacote de 576, menos o header IP máximo de 60 bytes e o header UDP de 8 bytes. Qualquer carga UDP desse tamanho ou menor é garantida como entregável por 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, em que a carga útil máxima é de 1.212 bytes. Como outros já mencionaram, headers adicionais de protocolo 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 fragment tem o mesmo efeito que perder um pacote não fragmentado: o pacote inteiro é 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 de ethernet – 60 header de IP x 65.536 número máximo de fragments), embora a probabilidade de ele passar seja infinitesimal.

Fontes: RFC 791, RFC 2460

O tamanho do buffer de reassembly mínimo do IPv4 é 576, o IPv6 tem 1.500. Subtraia os tamanhos de header daqui. Veja Programação de Rede UNIX por W. Richard Stevens 🙂

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 ser capazes de processar 576 bytes para um pacote IP. No entanto, observa o mínimo é 68. RFC 791: “Cada módulo de internet deve ser capaz de encaminhar um datagrama de 68 octetos sem mais fragmentação. Isso ocorre porque um header de internet pode ser de até 60 octetos, e o fragment mínimo é de 8 octetos ”

Assim, o tamanho seguro do pacote de 508 = 576 – 60 (header IP) – 8 (header do udp) é razoável.

Conforme mencionado por user607811, a fragmentação por outras camadas da rede deve ser remontada. https://tools.ietf.org/html/rfc1122#page-56 3.3.2 Reassembly A camada IP DEVE implementar a reassembly de datagramas IP. Nós designamos o maior tamanho de datagrama que pode ser remontado pelo EMTU_R (“MTU efetivo para receber”); isso às vezes é chamado de “tamanho do buffer de reassembly”. EMTU_R DEVE ser maior ou igual a 576

512 é sua melhor aposta. É usado em outro lugar e é um bom número par (metade de 1024).

Dado que IPV6 tem um tamanho de 1500, eu afirmaria que as operadoras não forneceriam caminhos separados para IPV4 e IPV6 (eles são ambos IP com tipos diferentes), forçando-os a equipamentos para ipv4 que seriam antigos, redundantes, mais caros de manter e menos confiável. Não faria qualquer sentido. Além disso, isso pode facilmente ser considerado fornecendo tratamento preferencial para algum tráfego – um não-sob regras que eles provavelmente não se importam muito (a menos que sejam apanhados).

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, é mais provável que você saiba o layout da sua rede. tamanhos de pacote jumbo são válidos para pacotes não fragmentados, portanto, para 4096 – 4068 bytes, e para cartões intel com buffers de 9014 bytes, um tamanho de pacote de … wait … 8086 bytes, seria o máximo … coincidência? risadinha

****ATUALIZAR****

Várias respostas fornecem valores máximos permitidos por um 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.

Valores de encapsulamento para várias camadas podem ser incluídos várias vezes. Desde que você encapsulou um stream – não há nada que proíba, digamos, uma camada de VPN abaixo disso e uma duplicação completa de camadas de encapsulamento acima disso.

Como a questão era sobre valores seguros máximos, estou assumindo que eles estão falando sobre o valor máximo de segurança para 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 em IPv4 ou 1472 bytes.

Nota – se você estiver usando IPv6, o tamanho máximo seria 1452 bytes, pois o tamanho do header do IPv6 é 40 bytes versus o tamanho de 20 bytes do IPv4 (e, de qualquer forma, é necessário permitir 8 bytes para o header UDP).

Eu li algumas boas respostas aqui; no entanto, existem alguns pequenos erros. Alguns responderam que o campo Message Length no header UDP é um máximo de 65535 (0xFFFF); isso é tecnicamente verdadeiro. 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-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á, na verdade, 192 Bytes (0x00C0).

O que é difícil e rápido é que o tamanho máximo de um datagrama IP é 65535 Bytes. Esse número é obtido da sum total dos headers L3 e L4, além da carga útil das camadas 5-7. Cabeçalho IP + Cabeçalho UDP + Camadas 5-7 = 65535 (Máx).

A resposta mais correta para qual é o tamanho máximo de um datagam UDP é 65515 bytes (0xFFEB), como um datagrama UDP inclui o header UDP. A resposta mais correta para qual é o tamanho máximo de uma carga útil UDP é 65507 Bytes, pois uma carga útil UDP não inclui o header UDP.