2008-12-09 13 views

Respuesta

14

La fragmentación no siempre es invisible en todas las capas superiores. Algunas de las primeras (y probablemente hasta actuales) pilas de microcontroladores TCP/IP no implementaron todas las capacidades, como el manejo de la fragmentación. El uso de la bandera en esa situación aseguraría que el paquete llegara en su forma original en lugar de una gran cantidad de fragmentos que el otro extremo no podría manejar.

Además, cuando se utiliza UDP, no es necesario que todos los fragmentos lleguen al destino, por lo que evitar la fragmentación significa que el mensaje llega o no llega; no hay posibilidad de que solo un bit del datagrama UDP alcanzará el destino No recuerdo cuánto tiempo la pila de TCP/IP se aferraba a los paquetes de IP no ensamblados esperando los fragmentos faltantes, pero el uso de la bandera de DF significaba que no había recursos innecesarios vinculados durante ese tiempo.

Finalmente, puede usarlo para probar el comportamiento de la infraestructura de red, como qué ocurre cuando se obtiene un paquete mayor que la unidad de transmisión máxima (DF evitará que ese paquete se "fragmente" en el agujero) .

12

Además de @Pax's answer (o tal vez como parte de las pruebas que mencionó), la bandera DP también se usa en . Esto es cuando intentas averiguar cuál es el paquete más grande que se puede enviar sin fragmentar, para un enlace determinado.

A menudo es útil para evitar la fragmentación, a pesar de que los protocolos de nivel superior están, en teoría, aislados de la mecánica de la misma, aún pueden "sentir" las consecuencias. Si un solo nivel de aplicación write() en el socket de red termina siendo fragmentado porque es demasiado grande, y uno de los fragmentos se pierde en la red, se perderá todo el paquete IP. Esto, por supuesto, afecta el rendimiento.

Por esta razón, a menudo es conveniente conocer la unidad de transmisión máxima , es decir, el paquete más grande que se puede enviar a un destino sin estar fragmentado. El descubrimiento MTU de ruta se utiliza para encontrar este tamaño, simplemente configurando el bit DF y enviando sucesivamente paquetes más grandes hasta que la red informa (más de ICMP) una falla.

+2

Eso es muy útil para saber. +1. – paxdiablo

5

tenga en cuenta que no hay una forma estándar para establecer DF en C. En Linux, este código funciona:

result = setsockopt(mysocket, IPPROTO_IP, 
       IP_MTU_DISCOVER, IP_PMTUDISC_DO, sizeof(int)); 

pero no es así en FreeBSD 6

Además, el descubrimiento de MTU de ruta es extremadamente poco confiable en la Internet real. Demasiados cortafuegos y middleboxes rotos filtran los mensajes ICMP "Paquete demasiado grande" (esta es una buena forma de probar a un administrador de red candidato durante una entrevista: pedirle que pare el ping y probablemente bloqueará por completo ICMP). Ver RFC 2923: "Problemas TCP con Path MTU Discovery"

Esa es la razón por la IETF sugieren ahora una nueva manera de probar la MTU, sin depender de Path MTU Discovery: RFC 4821: "Ruta de empaquetamiento de la capa de MTU Discovery"

Cuestiones relacionadas