Qual é o maior tamanho de pacote UDP seguro da Internet

201

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?

KM
fonte
2
Duplicado, consulte stackoverflow.com/questions/900697/...
ChrisW
10
É uma questão ligeiramente diferente. Estou perguntando qual é o maior pacote que posso enviar pela Internet (sem nenhum conhecimento de outras redes ou sondagens) que não terá fragmentação. Essencialmente, o tamanho máximo seguro, que funcionará em tudo sem precisar se preocupar em investigar a conexão.
KM
2
Você não pode eliminar a possibilidade de fragmentação, mas isso não torna as coisas menos seguras. Se um fragmento é descartado, é o mesmo que se todo o pacote fosse descartado, o que acontece com o UDP de qualquer maneira. Seria inseguro se um pacote excedesse o tamanho mínimo exigido pelos roteadores para oferecer suporte e, portanto, não fosse garantido a entrega (contra garantia de entrega). É aqui que entra a figura de 512 bytes.
Beejor 29/02

Respostas:

129

É 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.

mark4o
fonte
36
Só para esclarecer: ter um tamanho pequeno para evitar a fragmentação não torna a entrega do pacote "Segura", ainda há uma infinidade de possibilidades que tornam a entrega não confiável, como o cão comeu meu cabo de rede. Dito isto; ter menos fragmentos torna a entrega "mais segura", porque se houvesse mais de um e qualquer um deles nunca o fizesse - todo o pacote (datagrama) é descartado pelo UDP.
markmnl
3
Para os propósitos de uma pergunta, presumiríamos usar a definição de pôsteres "seguro", e não alguma definição em algum livro de normas que eles nunca viram.
Astara
Sabe-se que os roteadores do mundo real descartam pacotes UDP em vez de fragmentá-los?
user253751
60

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 correto da mensagem UDP é 65507, conforme determinado pela seguinte fórmula: 0xffff - (sizeof (cabeçalho IP) + sizeof (cabeçalho UDP)) = 65535- (20 + 8) = 65507

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.

Reed Copsey
fonte
39
Um link da Microsoft não é uma referência normativa. Os RFCs são a referência normativa; e o que você citou se aplica apenas ao IPv4.
Marquês de Lorne
2
Só porque o MS permite isso não significa que é sempre uma boa idéia, pois roteadores intermediários etc. podem ser forçados a fragmentar tamanhos de pacotes maiores (como você mencionou).
Rogerdpack #
1
@EJP Eles não explicam isso claramente no link da Microsoft, mas parece ser uma conseqüência necessária do IPv4: o campo de comprimento total do IPv4 é de 16 bits, e esse valor deve incluir o comprimento do cabeçalho IP e o comprimento do Cabeçalho UDP.
Jtpereyda # 13/16
@ jtpereyda Estou plenamente consciente de tudo isso. Meu argumento é exatamente o que eu já afirmei: você deve citar referências normativas onde elas existem.
Marquês de Lorne
Eu não acho que o tamanho máximo do pacote UDP seja de 65.507 bytes, já que minha placa wifi (IEEE 802.3) pode fazer apenas 1500 MTU, e os quadros jumbo têm apenas 9k bytes.
Christian Stewart
52

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

Beejor
fonte
2
Qualquer pacote UDP, por padrão, é considerado "_U_nreliable". O único tamanho de pacote UDP seguro que você poderia esperar receber seria 1 pacote não fragmentado. Se você deseja pacotes "seguros", use um protocolo de pacotes em cima do TCP.
Astara
26
@ Astara True, por natureza, o UDP não é confiável. Mas a questão é se um pacote de um determinado tamanho tem ou não garantia de entrega, não garantia de entrega. Pacotes acima de um determinado tamanho podem ser (e são) descartados por qualquer roteador por qualquer motivo, enquanto os menores devem ser tratados com mais esforço por todos os roteadores, de acordo com os padrões do setor. Portanto, "seguro" neste caso significa "meu carro caberá embaixo da ponte" e não "meu carro ficará preso no trânsito".
Beejor 5/08/16
1
Eu recomendo parar de repetir o que um cara aleatório disse e verificar os fatos, porque o UDP é realmente bastante confiável. BTW Eu tenho pacotes seguros em cima do UDP sem a sobrecarga desnecessária do TCP. openmymind.net/How-Unreliable-Is-UDP #
Pablo Ariel #
5
O UDP não é "não confiável" devido à quantidade de pacotes descartados, mas porque os pacotes podem ser (e são) descartados. Você não pode "confiar" em nenhuma chegada, pedido ou confirmação de pacote específico. Os dados são frágeis e é como dizer que a direção do carro que funciona 99% do tempo e 89% na direção certa é confiável. Não que o UDP não seja ótimo para muitas coisas, apenas que ele exige que você escreva basicamente sua própria versão do "TCP". Aqui está um fascinante caso do mundo real no mundo dos desenvolvedores de jogos (embora um pouco desatualizado): gamasutra.com/view/feature/131781
Beejor
@Beejor Você estava no caminho certo, mas "requer basicamente que você escreva sua própria versão do" TCP "no topo" está flagrantemente errado. O UDP é ótimo para transmissão e ótimo para o envio rápido de dados 'não críticos'. (No que diz respeito aos jogos), você pode descobrir servidores / serviços (LAN) usando UDP e usar UDP para enviar rapidamente localizações de jogadores. Se um pacote estiver sendo descartado; você não se importa, porque o próximo pacote terá um local mais atualizado dos outros jogadores. O TCP pode ter pacotes "fora de ordem", possui sobrecarga e não faz conexões um-para-muitos. Em alguns casos, o UDP pode ser mais aplicável.
Paul
46

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.

user607811
fonte
2
Se, e somente se você tiver uma rede que não carrega IPv6. Se ele carrega IPv6, use o tamanho máximo de pacote de cabeçalhos IPv6 e subtraia os cabeçalhos de encapsulamento para fazer IPv4 sobre IPv6. ;-)
Astara
@ Astst No IPv6, a fragmentação é feita pelo remetente, portanto não há problema com roteadores intermediários desonestos e não compatíveis. E se o destinatário não tiver um tamanho incorporado com restrição de memória, provavelmente poderá remontar pacotes de até 64kB, pelo menos.
user253751
@ user253751 Não são apenas os roteadores não compatíveis que podem fragmentar. Há Path MTU Discovery, mas mesmo isso não é suficiente para eliminar completamente a fragmentação.
dstromberg
@dstromberg Em quais situações os roteadores IPv6 podem fragmentar datagramas?
user253751 7/06
@ user253751 Ainda não tenho muito IPv6, mas aqui está um exemplo: imagine uma rede IPv6 enviando jumbogramas (> 65536 bytes) para outra rede IPv6 que também suporte jumbogramas. Suponha ainda que o Path MTU Discovery diga que esses jumbogramas devem ser suportados sem fragmentação. Mas um roteador é ligado e parte do caminho da rede é substituída por equipamentos que não estão configurados para jumbogramas.
dstromberg
14

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

edW
fonte
11

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 :)

Nikolai Fetissov
fonte
1
Mínimo, é claro. Obrigado por detectá-lo. Não tenho idéia de como ninguém notou o erro ao longo dos anos.
Nikolai Fetissov 30/05
1
Embora o IPv6 possa ter um buffer de remontagem mínimo de 1500, os pacotes IPv6 não podem ser fragmentados e a MTU IPv6 mínima é 1280. Um dispositivo final nunca deve precisar remontar um pacote IPv6 fragmentado.
Ron Maupin
1
Os pacotes IPv6 do @RonMaupin podem ser fragmentados pelos pontos de extremidade. Apenas não pelos roteadores intermediários.
Navin
3
@ Navin, não, os pacotes IPv6 não serão fragmentados, os dados devem ser fragmentados antes de serem empacotados em pacotes IPv6, mas os pacotes em si não são fragmentados. Há uma diferença. Ao contrário dos cabeçalhos de pacotes IPv4 que possuem campos para lidar com a fragmentação, os cabeçalhos de pacotes IPv6 não têm nada para lidar com a fragmentação. O cabeçalho do pacote IPv6 é muito mais simples que o cabeçalho do pacote IPv4.
22416 Ron Maupin
6

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

Justin Niessner
fonte
6

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).

Astara
fonte
1
Como você está calculando 1472? ethernet tem um MTU de 1500, é a isso que você está se referindo?
Rogerdpack
4
@rogerdpack Acho que ele quer dizer que, como o IPv4 e o IPv6 provavelmente compartilham muita infraestrutura e o IPv6 está ficando relativamente popular, deve ser seguro assumir limites de IPv6 (portanto, o 1500). Quão válido é esse raciocínio, no entanto, não sei dizer.
18413 Thomas
2
1500 deve ser suportado por componentes compatíveis com IPv6 na "cadeia" da rede - se alguém usa IPv4, que pode trafegar por uma cadeia compatível com IPv6 (embora o inverso não seja verdadeiro), como o tamanho do cabeçalho do IPv4 é 20 bytes, e O tamanho do cabeçalho do UDP é de 8 bytes, o que deixaria 1500-20-8 = 1472 como o tamanho máximo seguro (já que o IPv6 não permite fragmentação). Nota - se as pessoas adicionam camadas suficientes de encapsulamento, é possível que não haja espaço para DATA. Como você solicitou o MAX, presume-se que várias camadas de sobrecarga do encapsulamento NÃO estão sendo usadas.
Astara
" 1500 deve ser suportado por componentes compatíveis com IPv6 na cadeia de rede. " Não, o IPv6 mínimo MTU é 1280. A MTU Ethernet é 1500.
Ron Maupin
@ RonMaupin - o Q original era o maior tamanho de pacote UDP seguro, não o MTU. Veja RFC2460. Além de mencionar uma MTU de 1280 octetos, afirma: Os nós devem poder aceitar um pacote fragmentado, que quando remontado é de até 1500 octetos. O manuseio de pacotes maiores que 1500 é opcional.
Astara
6

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.

Porco
fonte
1
Você não respondeu à pergunta. O questionador queria saber qual era o maior tamanho que eles poderiam usar para evitar a fragmentação de pacotes.
Astara
0

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 ))

user5588495
fonte
1
O cabeçalho UDP possui um campo de comprimento de datagrama de 16 bits, o que significa que o maior datagrama teórico de UDP é 65.535, mas que nunca pode ser alcançado porque o UDP está encapsulado dentro de um pacote IP, que tem um comprimento máximo global teórico de 65.535 (o mesmo), mas você deve subtrair os cabeçalhos IP e UDP desse tamanho para descobrir o tamanho máximo teórico dos dados.
Ron Maupin
Eu perguntei isso há muito tempo, mas ele estava procurando por uma resposta pragmática (o que funciona na vida real), e não o que diz nas especificações / ou na teoria. Eu queria que os pacotes formas aeb sem fragmentação, era um problema de rede de jogos em tempo real - acho que existem muitas soluções desenvolvidas por pessoas mais inteligentes agora :)
KM