He leído varios artículos sobre el tamaño de los paquetes UDP, pero no he podido llegar a una conclusión sobre cuál es la correcta.
Varios servicios restringen el paquete UDP más grande a 512 bytes (como dns)
Dado que el MTU mínimo en Internet es 576, y el tamaño del encabezado IPv4 es de 20 bytes, y el encabezado UDP de 8 bytes. Esto deja 548 bytes disponibles para los datos del usuario.
¿Podría usar paquetes de hasta el tamaño de 548 sin fragmentación de paquetes? ¿O hay algo que los creadores de DNS sabían y por eso lo restringieron a 512 bytes?
¿Podría incluso ir más allá de 548 bytes de forma segura?
Respuestas:
Es cierto que un encabezado IPv4 típico tiene 20 bytes y el encabezado UDP tiene 8 bytes. Sin embargo, es posible incluir opciones de IP que pueden aumentar el tamaño del encabezado de IP hasta 60 bytes. Además, a veces es necesario que los nodos intermedios encapsulen datagramas dentro de otro protocolo como IPsec (utilizado para VPN y similares) para enrutar el paquete a su destino. Entonces, si no conoce la MTU en su ruta de red en particular, es mejor dejar un margen razonable para otra información de encabezado que no haya previsto. Por lo general, se considera que una carga útil UDP de 512 bytes hace eso, aunque incluso eso no deja suficiente espacio para un encabezado IP de tamaño máximo.
fuente
El límite teórico (en Windows) para el tamaño máximo de un paquete UDP es 65507 bytes. Esto se documenta aquí :
Dicho esto, la mayoría de los protocolos se limitan a un tamaño mucho más pequeño, generalmente 512 u ocasionalmente 8192. A menudo puede ir más alto que 548 de manera segura si está en una red confiable, pero si está transmitiendo a través de Internet en general, cuanto más grande vaya, lo más probable es que se encuentre con problemas de transmisión de paquetes y pérdida.
fuente
La carga útil máxima segura de UDP es de 508 bytes. Este es un tamaño de paquete de 576, menos el encabezado IP máximo de 60 bytes y el encabezado UDP de 8 bytes. Se garantiza que cualquier carga útil UDP de este tamaño o menor se entregará a través de IP (aunque no se garantiza que se entregue). Cualquier enrutador puede dejarse caer por cualquier enrutador por cualquier motivo. Excepto en una ruta de solo IPv6, donde la carga útil máxima es de 1.212 bytes. Como otros han mencionado, se podrían agregar encabezados de protocolo adicionales en algunas circunstancias. En su lugar, se puede preferir un valor más conservador de alrededor de 300-400 bytes.
Cualquier paquete UDP puede estar fragmentado. Pero esto no es demasiado importante, porque perder un fragmento tiene el mismo efecto que perder un paquete no fragmentado: se descarta todo el paquete. Con UDP, esto va a suceder de cualquier manera.
Curiosamente, el tamaño teórico máximo del paquete es de alrededor de 30 MB (1,500 MTU de Ethernet - 60 encabezado IP x 65,536 número máximo de fragmentos), aunque la probabilidad de que llegue sería infinitesimal.
Fuentes: RFC 791, RFC 2460
fuente
576 es el tamaño mínimo de búfer de reensamblado máximo , es decir, cada implementación debe poder reensamblar paquetes de al menos ese tamaño. Vea IETF RFC 1122 para más detalles.
fuente
Este artículo describe la unidad de transmisión máxima (MTU) http://en.wikipedia.org/wiki/Maximum_transmission_unit . Establece que los hosts IP deben poder procesar 576 bytes para un paquete IP. Sin embargo, señala que el mínimo es 68. RFC 791: "Todos los módulos de Internet deben poder reenviar un datagrama de 68 octetos sin mayor fragmentación. Esto se debe a que un encabezado de Internet puede tener hasta 60 octetos, y el fragmento mínimo es de 8 octetos. ".
Por lo tanto, el tamaño de paquete seguro de 508 = 576 - 60 (encabezado IP) - 8 (encabezado udp) es razonable.
Según lo mencionado por user607811, la fragmentación por otras capas de red debe ser reensamblada. https://tools.ietf.org/html/rfc1122#page-56 3.3.2 Reensamblaje La capa IP DEBE implementar el reensamblaje de datagramas IP. Designamos el tamaño de datagrama más grande que EMTU_R puede volver a ensamblar ("MTU efectiva para recibir"); esto a veces se llama el "tamaño del búfer de reensamblado". EMTU_R DEBE ser mayor o igual que 576
fuente
El tamaño mínimo del búfer de reensamblado de IPv4 es 576, IPv6 lo tiene en 1500. Resta los tamaños de encabezado desde aquí. Consulte Programación de redes UNIX por W. Richard Stevens :)
fuente
512 es tu mejor apuesta. Se usa en otros lugares y es un buen número par (la mitad de 1024).
fuente
Dado que IPV6 tiene un tamaño de 1500, afirmaría que los operadores no proporcionarían rutas separadas para IPV4 e IPV6 (ambos son IP con diferentes tipos), forzándolos a equipos para ipv4 que serían viejos, redundantes y más costosos de mantener y menos confiable No tendría ningún sentido. Además, hacerlo podría considerarse fácilmente como un tratamiento preferencial para un poco de tráfico, un no no según las reglas que probablemente no les importan mucho (a menos que los atrapen).
Por lo tanto, 1472 debe ser seguro para uso externo (aunque eso no significa que una aplicación como DNS que no conoce sobre EDNS lo acepte), y si está hablando de redes internas, es más probable que conozca el diseño de su red, en cuyo caso los tamaños de paquetes jumbo se aplican para paquetes no fragmentados, por lo tanto, para 4096 - 4068 bytes, y para tarjetas de inteligencia con buffers de 9014 bytes, un tamaño de paquete de ... espera ... 8086 bytes, ¿sería la máxima ... coincidencia? risa disimulada
****ACTUALIZAR****
Varias respuestas dan los valores máximos permitidos por 1 proveedor de SW o varias respuestas suponiendo la encapsulación. El usuario no solicitó el valor más bajo posible (como "0" para un tamaño UDP seguro), sino el tamaño de paquete seguro más grande.
Los valores de encapsulación para varias capas se pueden incluir varias veces. Dado que una vez que ha encapsulado una transmisión, no hay nada que prohíba, por ejemplo, una capa VPN debajo de eso y una duplicación completa de las capas de encapsulación por encima de eso.
Como la pregunta era sobre los valores máximos seguros, supongo que están hablando sobre el valor máximo seguro para un paquete UDP que se puede recibir. Como no se garantiza ningún paquete UDP, si recibe un paquete UDP, el tamaño seguro más grande sería 1 paquete sobre IPv4 o 1472 bytes.
Nota: si está utilizando IPv6, el tamaño máximo sería de 1452 bytes, ya que el tamaño del encabezado de IPv6 es de 40 bytes frente al tamaño de 20 bytes de IPv4 (y de cualquier manera, uno debe permitir 8 bytes para el encabezado UDP).
fuente
He leído algunas buenas respuestas aquí; Sin embargo, hay algunos errores menores. Algunos han respondido que el campo Longitud del mensaje en el encabezado UDP es un máximo de 65535 (0xFFFF); Esto es técnicamente cierto. Algunos han respondido que el máximo real es (65535 - IPHL - UDPHL = 65507). El error es que el campo Longitud del mensaje en el encabezado UDP incluye toda la carga útil (capas 5-7), más la longitud del encabezado UDP (8 bytes). Lo que esto significa es que si el campo de longitud del mensaje es 200 Bytes (0x00C8), la carga útil es en realidad 192 Bytes (0x00C0).
Lo que es difícil y rápido es que el tamaño máximo de un datagrama IP es 65535 Bytes. Este número llega a la suma total de los encabezados L3 y L4, más la carga útil de las capas 5-7. Encabezado IP + Encabezado UDP + Capas 5-7 = 65535 (Máx.).
La respuesta más correcta para cuál es el tamaño máximo de un datagam UDP es 65515 Bytes (0xFFEB), ya que un datagrama UDP incluye el encabezado UDP. La respuesta más correcta para cuál es el tamaño máximo de una carga útil UDP es 65507 Bytes, ya que una carga útil UDP no incluye el encabezado UDP.
fuente
Me temo que incurriré en reacciones molestas pero, sin embargo, para aclararme si estoy equivocado o si los que ven esta pregunta y están interesados en una respuesta:
Mi comprensión de https://tools.ietf.org/html/rfc1122 cuyo estado es "una especificación oficial" y, como tal, es la referencia para la terminología utilizada en esta pregunta y que no es reemplazada por otro RFC ni tiene erratas que contradicen el siguiendo:
teóricamente, es decir. basado en la especificación escrita., UDP como lo da https://tools.ietf.org/html/rfc1122#section-4 no tiene "tamaño de paquete". Por lo tanto, la respuesta podría ser "indefinida"
En la práctica, que es lo que probablemente buscaron estas preguntas (y que podría actualizarse para la tecnología actual en acción), esto podría ser diferente y no lo sé.
Pido disculpas si causé disgusto. https://tools.ietf.org/html/rfc1122#page-8 El "conjunto de protocolos de Internet" y los "supuestos arquitectónicos" no me dejan claro el "supuesto" en el que estaba, según lo que escuché, que Las capas están separadas . Es decir. la capa en la que se encuentra UDP no tiene que preocuparse por la capa en la que se encuentra la IP (y la capa de IP sí tiene elementos como el reensamblaje, EMTU_R, fragmentación y MMS_R ( https://tools.ietf.org/html/rfc1122#page- 56 ))
fuente
UDP no es "seguro", por lo que la pregunta no es buena, sin embargo,
Si envía 9217 o más (mac) o 65508+ (linux / windows), la función de envío de socket regresa con un error.
Las respuestas anteriores sobre la fragmentación y la MTU, etc., están fuera de tema: todo se lleva a cabo en un nivel inferior, es "invisible" para usted y no afecta la "seguridad" en las conexiones típicas en un grado significativo.
Sin embargo, para responder al significado real de la pregunta , no use UDP, use sockets sin procesar para obtener un mejor control de todo; Dado que está escribiendo un juego, debe profundizar en las banderas para tener prioridad en su tráfico de todos modos, por lo que también puede deshacerse de los problemas de UDP al mismo tiempo.
fuente