Colección de citas famosas - Slogan de motivación - ¿Qué significa fragmentado?

¿Qué significa fragmentado?

El método básico de codificación de fragmentos es descomponer un conjunto de datos grande en varios fragmentos pequeños. Cada fragmento pequeño puede especificar su propia longitud. El formato específico es el siguiente (gramática BNF):

Chunked-Body =. *fragmento / /0 en varios bloques.

Último fragmento //Último fragmento

Tráiler //Cola

CRLF //Marca final

fragmento = tamaño del fragmento[ fragmento -extensión]CRLF

Datos del bloque CRLF

Tamaño del bloque = 1 *hex

último fragmento = 1 *(0))[ extensión del fragmento]CRLF

extensión-chunk = *(";"chunk-ext-name[" = " chunk-ext-val])

Nombre de extensión del fragmento = let token

chunk-ext-val = token | cadena entrecomillada

datos del fragmento = tamaño del fragmento (octetos)

trailer = *( Título de la entidad CRLF)

Explicación :

El texto bloqueado se refiere al estilo del periódico después de la codificación del bloque. El estilo del periódico se puede dividir en cuatro partes: bloque grande, bloque grande final, tráiler y terminador. El número de bloques estilo periódico puede ser al menos 0, sin límite superior, la longitud de cada bloque se especifica por sí misma, es decir, los datos iniciales deben ser una cadena de 16 dígitos hexadecimales, que representan la longitud del bloque posterior. datos (número de bytes). Si el primer carácter de esta cadena de 16 hexadecimales es "0", significa que el tamaño del bloque es 0 y el bloque es el último bloque sin una parte de datos de bloque. La extensión de fragmento opcional la deciden ambas partes y puede ignorarse si el destinatario no comprende su significado.

El avance es un campo adicional que se agrega al final y que generalmente contiene algunos metadatos (meta significa "información sobre"). Estos campos de encabezado se pueden agregar a los campos de encabezado existentes después de la decodificación.

Estudio de caso:

Analicemos los resultados de usar ethereal para capturar un paquete y usar Firefox para comunicarnos con un sitio web (comenzando desde el terminador principal):

Dirección 0........................f

000c0 31

000d066 6630d0a... . ...........//Código ASCII: 1ffc \ r \ n, la dirección inicial de los datos fragmentados es 000d5.

Obviamente, "1ffc" es el tamaño del primer fragmento, que es 8188 cuando se convierte a int. Porque viene inmediatamente después de 1ffc.

CRLF, por lo que no hay expansión de fragmentos. La dirección inicial de los datos del fragmento es 000d5 y el cálculo muestra el inicio del siguiente fragmento.

La dirección es 000d5 1ffc 2 = 00d3, como sigue:

02D0..0d0a31 66 66 630d0a...//Código ASCII: \r\n1ffc\r\n< /p >

El primer 0d0a es la marca final del último bloque y el último 0d0a es el delimitador entre el tamaño del bloque y los datos del bloque.

La longitud de este fragmento también es 8188, y así sucesivamente, hasta el último fragmento.

100e0 0d 0a 31

100f65 61 390d0a...//Código ASII:\r\n\1ea9\r\n

La longitud de este El bloque es 0x1ea9 = 7849, el punto de inicio del siguiente bloque es 100 F5 1ea 9 2 = 11fa 0, de la siguiente manera:

100A0 300d0A0//Código ASCII: 0\r\n\r\n

"0" indica que el fragmento actual es el último fragmento y el primer 0d 0a es el terminador del fragmento. El segundo 0d0a significa que no hay una parte final y que todo el cuerpo del Chunk ha terminado.

Proceso de decodificación:

El propósito de decodificar el código fragmentado es integrar y restaurar los datos fragmentados en un párrafo estilo periódico y registrar la longitud del párrafo al mismo tiempo.

El proceso de decodificación incluido con RFC2616 es el siguiente: (pseudocódigo)

Longitud: = 0 //El contador de longitud se establece en 0.

Leer tamaño de bloque, extensión de bloque (si corresponde) y crlf // Leer tamaño de bloque, extensión de bloque.

//También hay CRLF

while (tamaño de bloque gt0) {// Indica que no es el último fragmento.

Leer datos de bloque y CRLF //Leer datos de bloque de tamaño de bloque, omitir CRLF.

Agregar datos del bloque al cuerpo de la entidad //Agregar datos del bloque al cuerpo de la entidad.

Leer tamaño de bloque y CRLF //Leer el tamaño de bloque y CRLF del nuevo bloque.

}

leer encabezado de entidad//El formato del encabezado de entidad es nombre: valorCRLF. Si está vacío, solo CRLF está disponible.

While (encabezado de entidad no vacío) //En otras palabras, no solo hay líneas CRLF vacías.

{

Agregar título de entidad al campo de título existente

Leer título de entidad

}

Contenido- Longitud:=longitud //La longitud del nuevo estilo de periódico calculada después de todo el proceso de decodificación.

//Como valor del campo Longitud del contenido, escríbalo en el mensaje.

Eliminar "fragmentado" de transferencia-codificación //Al mismo tiempo, elimine la bandera fragmentada del valor del campo en Transfer-Encoding.

El valor final de la longitud es en realidad la suma de los tamaños de bloque de todos los bloques. En el ejemplo de captura de paquetes anterior, un * tiene ocho bloques, el tamaño del bloque es 0x1ffc (8188) y los bloques restantes son 0x1ea9 (7849), lo que suma un * * 7353.

Nota: Para los primeros fragmentos del ejemplo anterior, el tamaño es 8188, probablemente porque: "1 ffc" 4 bytes, "\r\n" 2 bytes, más "\r\n" "al final del bloque hay 2 bytes y el bloque completo es 865438.