Resumen

  • Cada dirección de un flujo QUIC es una secuencia ordenada de bytes; los límites de STREAM no se conservan como límites de mensajes.
  • FIN y RESET_STREAM comunican una Final Size inmutable para reconciliar el crédito de control de flujo consumido.
  • Final Size no prueba que la aplicación haya leído, interpretado, confirmado o completado una operación.

El error habitual nace cuando un panel convierte un hecho de transporte en un resultado de negocio. Al observar una Final Size conocida, puede mostrar «solicitud completada», aunque el valor solo describe el extremo de la secuencia de bytes. La dirección puede terminar limpiamente mediante una trama STREAM con FIN o de forma abrupta mediante RESET_STREAM. La contabilidad puede quedar cerrada en ambos casos, pero la aplicación puede seguir sin haber leído o procesado los datos.

QUIC ofrece cada dirección como una secuencia ordenada de bytes. Los límites de las tramas STREAM no permanecen durante la transmisión, la retransmisión ni la entrega. Por eso, el protocolo de aplicación debe definir su propio encuadre de mensajes. Una frontera de trama no delimita automáticamente una petición, un registro ni una transacción.

Cuando una trama STREAM lleva FIN, Final Size es su desplazamiento más la longitud de sus datos. RESET_STREAM incluye un campo Final Size explícito. El valor es uno más que el mayor desplazamiento enviado, o cero si no se envió ningún byte. Representa el crédito de control de flujo consumido por esa dirección. A nivel de conexión, el control de flujo suma las Final Size de los flujos, incluidos los que terminan. Es una obligación contable, no un certificado de éxito.

Una vez conocida, Final Size no cambia. Datos situados en esa posición o después, o una declaración posterior distinta, pueden producir FINAL_SIZE_ERROR. La comprobación puede exigir conservar estado después del cierre. La inmutabilidad protege la coherencia del consumo, pero no convierte el tamaño en una prueba de entrega.

El estado de recepción tiene varias etapas. Conocer Final Size no equivale a recibir todos los bytes anteriores. Recibirlos no equivale a entregarlos a la aplicación. Entregarlos no equivale a que la aplicación los lea, los interprete correctamente, confirme una transacción, escriba un estado duradero, haga rollback o complete el negocio. RESET_STREAM puede interrumpir la entrega y permitir descartar bytes no leídos, pero no demuestra que no se entregara nada: todos los bytes podrían estar ya almacenados en búfer, y la indicación de reset podría suprimirse.

El acuse de recibo de un paquete pertenece a una capa inferior. Procesar una trama STREAM exige poner sus bytes a disposición de la aplicación, no demostrar que esta los leyó o actuó sobre ellos. Del mismo modo, Final Size no demuestra el éxito de la dirección opuesta ni de toda la conexión.

El registro de evidencia debe separar el identificador y la dirección del flujo; FIN o RESET_STREAM; el código de error de aplicación cuando haya reset; la fuente y el valor numérico de Final Size; el mayor desplazamiento observado y la cobertura contigua; la entrada de todos los bytes en el receptor; la entrega o lectura por la aplicación; el encuadre de mensajes; commit duradero, compensación, rollback y resultado de negocio; y cualquier estado retenido para detectar FINAL_SIZE_ERROR.

También deben mantenerse separadas cinco dimensiones. TR-046 trata del permiso para enviar, no del total final. TR-052 trata de fronteras de mensajes DATAGRAM, mientras que el flujo ordenado no conserva límites STREAM. TR-053 trata del cierre de la conexión. TR-054 trata de STOP_SENDING y la cancelación. TR-045 limita lo que prueba un ACK sobre el procesamiento de paquetes. Ninguna de esas señales sustituye a las demás.