Uno de los mecanismos de la propiedad intelectual es la fragmentación y el mo
ntaje. Bajo determinadas circunstancias, un datagrama originalmente transmitida como una sol a unidad llegará a su destino final roto en varios fragmentos. La capa de IP en el host receptor debe acumular estos fragmentos hasta suficiente haber llegado a reconstituir totalmente el datagrama original. El documento de especificaciones de IP proporciona una descripción completa del montaje mecanismo, y contiene varios ejemplos. También proporciona un algoritmo posible para volver a montar, con base en el seguimiento de llegan fragmentos en un vector de bits. Este documento describe un enfoque alternativo que resulte más adecuado en algunas máquinas.
Un examen superficial del proceso de montaje puede sugerir
que es bastante complicado. En primer lugar, es necesario no perder de vista todos los fragmentos, lo que sugiere un trabajo de contabilidad pequeña. En segund o lugar, cuando un nuevo fragmento llega, se puede combinar con los fragmentos existentes en una número de maneras diferentes. Es precisamente puede llenar el espacio entre dos fragmentos, o bien pueden coincidir con los fragmentos existentes, o en su total idad 2
fragmentos duplicados existentes, o en parte, llenar un espacio entre dos
fragmentos sin colindante a cualquiera de ellos. Por lo tanto, podría parecer que la proceso de montaje puede implicar el diseño de un bastante complicado algoritmo que comprueba una serie de diferentes opciones.
De hecho, el proceso de montaje es extremadamente simple. Esta
documento describe una forma de tratar con el montaje que reduce la contabilidad problema a un mínimo, que requiere para el almacenamiento de una sola amortiguamiento del mismo tamaño que el datagrama final es volver a montar, lo que puede montamos un datagrama desde cualquier número de fragmentos que llegan a cualquier orden con cualquier posible patrón de superposición y duplicación de esfuerzos, y que es adecuada para casi cualquier tipo de sistema operativo.
El lector debe consultar el documento de especificación de IP para asegurarse
de que está completamente familiarizado con el concepto general del montaje, y los campos de cabecera particular, y el vocabulario utilizado para describir e l proceso.
2. El Algoritmo
Para definir este algoritmo volver a montar, es necesario
definir algunos términos. Un datagrama parcialmente reensamblado consiste en deter minados secuencias de octetos que ya han llegado, y algunas zonas todavía por venir. Nos referiremos a estas áreas que faltan como "agujeros". Cada hoyo puede ser caracterizada por dos números, hole.first, el número de la primera octeto en el agujero, y hole.last, el número del último octeto en el agujero. Este par de números que llamaremos el descriptor "hueco", y asumirá que todos los descriptores agujero para un datagrama particular se reúnen en la lista "agujero descriptor". 3
La forma general del algoritmo es el siguiente. Cuando una nueva
fragmento del datagrama llega, posiblemente se llenará en una o más de los agujeros existentes. Examinaremos cada una de las entradas en el agujero lista de descriptores para ver si el agujero en cuestión se elimina por este fragmento de entrada. Si es así, vamos a eliminar esa entrada de la lista. Finalmente, un fragmento llegará lo que elimina todas las entradas de la lista. En este punto, el datagrama ha sido totalmente montados y se puede pasar a niveles superiores de protocolo para su posterior procesamiento .
El algoritmo se describe en dos fases. En la primera parte,
vamos a mostrar la secuencia de pasos que se ejecutan cuando un nuevo fragmento llega, con el fin de determinar si alguna de las orificios existentes están ocupados por el nuevo fragmento. En la segunda parte de esta descripción, vamos a mostrar un algoritmo ridículamente simple para gestión de la lista de descriptores agujero.
3. Fragmento de procesamiento del algoritmo
Un fragmento de llegar puede llenar cualquiera de los orificios existentes
en una serie maneras. La mayoría simplemente, se puede llenar por completo un agujero. Como alt ernativa, puede dejar algo de espacio en ya sea al inicio o al final de un existentes agujero. O, por último, puede permanecer en medio de una ya existente agujero, rompiendo el agujero en medio y dejando un agujero más pequeño en cada extr emo. Debido a estas posibilidades, podría parecer que una serie de pruebas debe realizarse un nuevo fragmento llega, lo que lleva a un lugar complicado algoritmo. De hecho, si se expresa, el algoritmo puede comparar cada agujero para el fragmento de llegar a sólo cuatro pruebas. 4
Comenzamos el algoritmo cuando los primeros fragmentos del datagrama
llega. Empezamos por crear una zona buffer de datos vacía y poner un la entrada en su lista de descriptores agujero, la entrada que describe la datagrama como completamente desaparecidos. En este caso, es igual a hole.first cero, y hole.last es igual a infinito. (Infinity es presumiblemente a cabo por un entero muy grande, superior a 576, según decida el implementador de.) Los ocho pasos siguientes se utilizan para insertar cada uno de los que llegan fragmentos en la zona de amortiguación en el datagrama completo se está acumulado. El fragmento que llegan es descrito por fragment.first, el primer octeto del fragmento, y fragment.last, el último octeto de la fragmento.
1. Seleccione el siguiente hoyo descriptor del descriptor de agujero
lista. Si no hay más entradas, vaya al paso ocho. 2. Si es mayor que fragment.first hole.last, vaya al paso uno. 3. Si es inferior a fragment.last hole.first, vaya al paso uno.
- (Si bien el paso dos o tres pasos es cierto, entonces el
fragmento recién llegados no se superpone con el agujero en modo alguno, por lo que necesitamos no prestar atención adicional a est e agujero. Volvemos al comienzo del algoritmo, donde seleccionamos el siguiente hoyo para su examen.)
4. Eliminar la entrada actual de la lista de descriptores agujero.
- (Ya que ni el paso dos, ni tres pasos era cierto, la
fragmento recién llegados no interactuar con este agujero en alguna manera. Por lo tanto, el descriptor actual, sin dejará de ser válida. Vamos a destruirlo, y en los próximos dos pasos que determinará si es o no necesarias para crear cualquier descriptores nuevo agujero.)
5. Si es mayor que fragment.first hole.first, a continuación, crear una
Descriptor nuevo agujero "new_hole" con new_hole.first igual a hole.first y new_hole.last igual a menos fragment.first una. 5
- (Si la prueba en el paso cinco es cierto, entonces la primera parte
del agujero original no sea ocupado por este fragmento. Nosotros crear un nuevo descriptor de este agujero más pequeño.)
6. Si es inferior a fragment.last hole.last y fragment.more
fragmentos es verdad, entonces crea un nuevo agujero descriptor "New_hole", con new_hole.first igual a fragment.last más y un new_hole.last igual a hole.last.
- (Esta prueba es el espejo del paso de cinco años con un
característica adicional. En un principio, no sabíamos cuánto tiempo volver a montar el datagrama sería, y por lo tanto creó un agujero que va de cero a infinito. Con el tiempo, vamos a recibir el último fragmento de la datagrama. En este punto, que ese agujero descriptor se extiende desde el último octeto de la memoria intermedia hasta el in finito pueden ser descartados. El fragmento que contiene los últimos fragmento indica este hecho con una bandera en la Internet cabecera llamados "fragmentos más". La prueba de este bit en Esta declaración nos impide crear un descriptor para el hoyo innecesarios que describe el espacio de la final del datagrama hasta el infinito.)
7. Vaya al paso uno.
8. Si la lista de descriptores agujero está vacío, el datagrama es ahora completa. Pase la información al procesador de protocolo de nivel superior para su posterior manipulación. De lo contrario, el regreso.
4. Segunda Parte: Gestión de la lista de descriptores del agujero
La complejidad principal en el algoritmo de paso ocho de arriba no es
realización de las pruebas aritméticas, pero en adición y eliminación de entradas de la lista de descriptores agujero. Uno podría imaginar una aplicación en que el paquete de gestión de almacenamiento era muchas veces más complicado que el resto del algoritmo, ya que no existe un límite superior especificado sobre el número de descriptores agujero que existen para un datagrama en volver a montar. Hay una manera muy simple para tratar con el agujero descriptores, sin embargo. Sólo hay que poner cada descriptor agujero en los octet os primero 6
del propio agujero. Tenga en cuenta que en la definición del montaje
algoritmo, el tamaño mínimo de un agujero es de ocho octetos. Para almacenar hole.first y hole.last presumiblemente requerirá dos octetos cada uno. Una dos octetos adicionales deberán hilo juntos las entradas de la lista de descriptores agujero. Esto deja al menos dos octetos más para tratar con idiosincrasias aplicación.
Sólo hay un escollo evidente para esta estrategia de almacenamiento. Uno
debe ejecutar el algoritmo de ocho paso anterior antes de copiar los datos de el fragmento en el búfer de reensamblaje. Si uno se para copiar los datos primera vista, podría aplastar a los descriptores una o más hoyos. Una vez que el al goritmo anterior se ha ejecutado, cualquier agujero que los descriptores están a punto de ser aplastado ya han quedado obsoletas.
5. Loose Ends
Dispersión de los descriptores en todo el agujero de montaje de amortiguación
se exige que se enrosca en una especie de lista de manera que se pueden encontrar. Esto a su vez implica que debe ser un puntero a la cabeza de la lista. En muchos casos, este puntero se puede almacenar en algun os especie de bloque de descriptor que los asociados con cada aplicación reensamblaje de amortiguación. Si no se almacenen en que se disponga, una sucia, p ero truco eficaz es almacenar la cabeza de la lista en una parte de la cabecera internet en el búfer de montaje que ya no es necesario. Una sitio obvio es el campo de control.
Cuando el último fragmento del datagrama llega, la longitud del paquete
campo en el encabezado de Internet debe ser llenado pulg 7
6. Opciones
La descripción anterior hizo una simplificación inaceptable. Lo
supone que no hay opciones de Internet relacionados con el datagrama ser montados de nuevo. La dificultad con las opciones es que hasta un recibe el primer fragmento del datagrama, no se sabe cuán grande es el cabecera internet será. Esto es porque, mientras que las opciones son ciertas copiado de forma idéntica en cada fragmento de un datagrama, otras opciones, tales como "registro de ruta", se colocan en el primer fragmento solamente. (El primer " fragmento "es el fragmento que contiene el octeto cero de la original datagrama.) Hasta se sabe qué tan grande es el encabezado de Internet, uno no sabe dónde copiar los datos de cada fragmento en el búfer de reensamblaje. Si el inicio de los fragmentos para llegar pasa a ser el primer fragmento, entonces esto no es problema. De lo contrario, hay dos soluciones. En primer lug ar, uno puede dejar un espacio en el buffer de reensamblado para el máximo posible Internet cabecera. De hecho, el tamaño máximo no es muy grande, de 64 años octetos. Por otra parte, uno simplemente puede apostar que el primer fragmento contendrá ninguna opción. Si, cuando el primer fragmento finalmente llega, hay opciones, una a continuación, puede cambiar los datos en el buffer de un distancia suficiente para permitir que para ellos. El único peligro en la copia de la datos es que uno va a la basura los punteros de ese hilo del agujero descriptores juntos. Es fácil ver cómo untrash los punteros.
La fuente y las opciones de registro de ruta tiene la característica interesa
nte que, desde diferentes fragmentos pueden seguir diferentes caminos, pueden llegan con diferentes rutas de regreso registrados en distintos fragmentos. 8
Generalmente, esto es más información que el módulo de Internet que reciben
necesidades. El procedimiento que se especifica es tomar la ruta de regreso regi strados en el primer fragmento e ignorar las demás versiones.
7. El algoritmo completo
Además del algoritmo descrito anteriormente, hay dos partes
el proceso de montaje. En primer lugar, cuando un fragmento llega, es necesario para encontrar el montaje de búfer asociado con ese fragmento. Esta requiere de algún mecanismo para la búsqueda de todos los existentes montaje buffers. El buffer de montaje correctos se identifica por una igualdad de los siguientes ámbitos: la dirección de Internet extranjeros y locales, el el protocolo de identificación, y el campo de identificación.
La parte final del algoritmo es una especie de temporizador basado
mecanismo que disminuye el tiempo de vivir el terreno de cada parte datagrama vuelto a montar, por lo que los datagramas incompleta que han dejado su utilidad puede ser detectado y eliminado. Uno puede crear un demonio que cobra vida una vez por segundo y decrementos de la materia en cada datagrama por uno, o uno puede leer el reloj cuando cada fragmento de primera llega, y la cola de algún tipo de llamada de temporizador, utilizando cualquier si stema de mecanismo es adecuado, para aprovechar los datagramas cuando su tiempo ha llegad o.
Una implementación del algoritmo completo que incluye todos estos
partes se construyó en BCPL como una prueba. El algoritmo completo se menos de uno y las páginas de la mitad de la enumeración, y generó aproximadamente 400 nova instrucciones de máquina. La parte del algoritmo de hecho
involucrados con la gestión de los descriptores agujero es alrededor de 20 líneas de