O UDP não sabe nada sobre o MTU. Pacotes UDP podem ter qualquer tamanho de 8 a 65535 bytes. As camadas de protocolo abaixo do UDP podem enviar um pacote de um tamanho específico ou serão rejeitadas para enviar esse pacote com um erro se for muito grande.
A camada abaixo do UDP é geralmente IP, IPv4 ou IPv6. E pacotes IP podem ter qualquer tamanho de 20 (IPv4) / 40 (IPv6) a 65535 bytes, que é o mesmo máximo que o UDP. No entanto, o IP suporta um mecanismo chamado fragmentação . Se um pacote IP tiver um tamanho maior do que o que a camada abaixo pode transportar, o IP poderá dividir um único pacote em vários pacotes chamados fragmentos. Cada fragmento é, de fato, um pacote IP próprio (possui um cabeçalho IP próprio) e também é enviado sozinho para o destino; é tarefa do destino coletar todos os fragmentos e reconstruir o pacote completo deles antes de passar os dados recebidos na próxima camada superior (por exemplo, UDP).
O protocolo Ethernet pode transportar apenas quadros com uma carga útil entre 46 e 1500 bytes (há exceções, mas isso está além do escopo desta resposta). Se os dados da carga útil forem inferiores a 46 bytes, eles serão preenchidos com precisão de 46 bytes. Se os dados da carga útil ultrapassarem 1500 bytes, a interface se recusará a aceitá-los. Se isso acontecer, cabe à camada IP decidir agora fragmentar o pacote, para que nenhum fragmento seja maior que 1500 bytes ou relate um erro para a próxima camada superior se a fragmentação tiver sido desabilitada ou proibida para essa conexão específica.
Geralmente, a fragmentação deve ser evitada, como
- desperdiça recursos no lado do remetente.
- desperdiça recursos no lado do receptor.
- aumenta a sobrecarga do protocolo para a mesma quantidade de dados de carga útil.
- se um único fragmento for perdido, o pacote inteiro será perdido.
- se um único fragmento estiver corrompido, o pacote inteiro estará corrompido.
- em caso de reenvio, todos os fragmentos devem ser reenviados.
É por isso que o TCP adota inteligentemente seu tamanho de quadro para que os pacotes nunca exijam o IP para fragmentá-los. Isso pode ser feito proibindo o IP de fragmentar pacotes e, se o IP relatar que um pacote é muito grande para ser enviado, o TCP reduz o tamanho do quadro e tenta novamente, até que nenhum erro seja mais relatado.
Para o UDP, porém, essa seria a tarefa do próprio aplicativo, pois o UDP é um protocolo "burro", não possui lógica de gerenciamento própria, o que o torna muito flexível, rápido e simples.
O único tamanho UDP em que você pode confiar para ser sempre transportável é o cabeçalho UDP de 576 menos 8 bytes e o cabeçalho IP de 20 (v4) / 40 (v6) bytes, pois o padrão IP exige que todo host IP possa receber pacotes IP com um tamanho total de 576 bytes. Sua implementação de protocolo não estaria em conformidade com o padrão se não puder aceitar pacotes com pelo menos esse tamanho. Observe, no entanto, que o padrão não diz 576 sem fragmentação; portanto, mesmo um pacote IP de 576 bytes pode ser fragmentado entre dois hosts.
O único tamanho de pacote no qual você pode confiar para ser transportável sem fragmentação é de 24 bytes para IPv4 e 56 bytes para IPv6, pois os menores cabeçalhos IP de um fragmento são 20/48 bytes (v4 / v6) e um fragmento deve ter pelo menos 4/8 dados de carga útil de bytes (v4 / v6). Portanto, um sistema de transporte abaixo da camada IP que não pode transportar pelo menos pacotes de tamanhos de teses, não pode ser usado para transportar tráfego IP.
E antes que alguém comente que um cabeçalho IPv6 possui apenas 40 bytes: Isso está correto, mas, diferentemente de um cabeçalho IPv4, um cabeçalho IPv6 padrão não possui campos de cabeçalho para fragmentação. Se um pacote precisar ser fragmentado, um cabeçalho de extensão de fragmentação deverá ser adicionado abaixo do cabeçalho base IPv6 e esse cabeçalho de extensão terá 8 bytes. Além disso, diferentemente do IPv4, as compensações de fragmentação no IPv6 são contadas em unidades de 8 bytes e não de 4 bytes, portanto, um fragmento pode transportar apenas uma carga útil com múltiplos de 8 bytes no caso do IPv6.