2010-05-06 11 views
7

¿Cuál es la forma correcta de que un servidor HTTP envíe datos a través de múltiples paquetes?trozos de datos HTTP sobre varios paquetes?

Por ejemplo quiero transferir un archivo, el primer paquete de envío es:

HTTP/1.1 200 OK 
Content-type: application/force-download 
Content-Type: application/download 
Content-Type: application/octet-stream 
Content-Description: File Transfer 
Content-disposition: attachment; filename=test.dat 
Content-Transfer-Encoding: chunked 

400 
<first 1024 bytes here> 

400 
<next 1024 bytes here> 

400 
<next 1024 bytes here> 

ahora tengo que hacer un nuevo paquete, si acabo de enviar:

400 
<next 1024 bytes here> 

Todo el los clientes cierran allí las conexiones conmigo y los archivos se acortan.

¿Qué encabezados pongo en un segundo paquete para continuar con la secuencia de datos?

+0

¿Está tratando de implementar o falsificar un servidor web? – dlamotte

+0

Entonces, ¿qué quiere decir con paquete? Un paquete de IP? Un segmento TCP? – WhirlWind

+0

Ahh, al parecer, te refieres a trozos ... confusos. Los trozos realmente no tienen nada que ver con los paquetes. – WhirlWind

Respuesta

3

Parece que mi falta de representación no me permite comentar la pregunta, simplemente respóndela, así que supongo que algo como "estás tratando de implementar HTTP 1.1 en el servidor web de un dispositivo incrustado" que tiene una pila de red orientada a paquetes en lugar de una orientada a secuencias "es verdadera, o no estaría hablando de paquetes. (Si usted está hablando de fragmentos, vea otras respuestas.)

Dado que - use enchufes si puede; no deberías tener que pensar en paquetes. Probablemente haya un envoltorio en alguna parte para su pila de red. Si no lo hay, escribe uno que no nuke tu rendimiento demasiado mal.

Si no puede, por el motivo que sea, probablemente esté eliminando el tamaño del primer paquete. Su MTU es probablemente algo así como 1500 o 1492 (o más pequeño), y tiene + 5 + 1024 + 5 + 1024 + 5 + 1024 bytes enumerados "en su primer paquete". Su pila de red puede absorber lo suficiente como para que no le proporcione códigos de error, o es posible que su código no los esté verificando, o que esté haciendo otra cosa igualmente inútil.

+0

Gracias, de hecho, el problema estaba en la pila de red en la capa de TCP. Por alguna razón, se estaba encargando de finalizar la conexión TCP después de los paquetes ACK. Instalé una nueva pila de tcp de un proveedor diferente y las cosas funcionan bien. – myforwik

+0

Y esta es la razón por la cual, si puedes incluir Linux en algo, realmente deberías. Buggy incrustado es la perdición de mi existencia. –

3

HTTP no tiene noción de paquetes. Su flujo HTTP podría dividirse en paquetes de 1 byte.

Para la codificación fragmentada, debe especificar los encabezados necesarios para cada fragmento (que no tiene relación con los paquetes) como se indica en el RFC.

+0

He ** está ** especificando los encabezados de fragmento necesarios? 1024 KB es hexadecimal 400. Sin embargo, 'Content-Transfer-Encoding' debería haber sido' Transfer-Encoding'. – BalusC

+0

Estás en lo correcto. El problema estaba en la capa TCP y no en la corriente de información HTTP. Gracias. – myforwik

2

En primer lugar, el encabezado que desea es

Transfer-Encoding: chunked 
no

Content-Transfer-Encoding.

Además, ¿por qué envía tres encabezados Content-Type diferentes?

2

Normalmente usaría los encabezados Accept-Ranges y Content-Range desde el lado del servidor para notificar al cliente que el servidor acepta currículos. El cliente luego enviará el encabezado Range para solicitar la descarga parcial.

Dado que el encabezado Content-Range requiere una noción de la longitud completa del archivo y esto parece ser desconocido aquí (de lo contrario no había ninguna razón para elegir la codificación chunked), está perdido con respecto a la especificación HTTP estándar. O bien elegirá otro protocolo, o homegrow su propia especificación, o buscará formas alternativas de averiguar la longitud del contenido de antemano de todos modos.


Dicho esto, las tres cabeceras Content-Type no tiene sentido. Elige uno. También el Content-Transfer-Encoding está mal, debería haber sido Transfer-Encoding.

+0

Los clientes incrustrados dicen que necesitan esos encabezados para poder almacenar los archivos ... quién sabe por qué. Reanudar sería una buena característica para apoyar, por lo que definitivamente voy a buscar en los rangos. – myforwik

Cuestiones relacionadas