Me remitieron a este sitio cuando pregunté originalmente en Networking SE.
Tengo algunas preguntas sobre los anuncios rwnd en TCP. Leí el RFC pero me quedé con pensamientos sin respuesta (o tal vez me perdí algunas cosas). Quizás algunas de las respuestas dependan de la implementación; en este caso, responda utilizando su experiencia, ya que deseo saber qué sucede en el caso general.
El estándar TCP establece lo siguiente:
El TCP de envío debe estar preparado para aceptar del usuario y enviar al menos un octeto de datos nuevos incluso si la ventana de envío es cero.
Supongo que la razón de esto es que los mensajes de la sonda de ventana contienen un octeto de datos. Sin embargo, me hizo pensar:
No he visto que se indique en el estándar que los paquetes de sonda deben contener un octeto de datos nuevos. ¿Existen diferentes formas de comprobar el tamaño de la ventana?
Si es la única manera, me pregunto por qué no será suficiente reenviar un segmento antiguo (con un número de secuencia antiguo). ¿El receptor tiene que reconocer sólo los datos que están dentro de la ventana en un momento determinado (lo que significa que los datos antiguos no necesariamente serán reconocidos), lo que significa que tenemos que tratar los paquetes de sondeo como una excepción a esa regla?
En términos generales, ¿el receptor notifica al remitente cuando su ventana aumenta de tamaño? ¿Tiene que hacerlo (entiendo que el reconocimiento puede perderse, por lo que el remitente tendrá que investigar de todos modos)?
¿Los paquetes de prueba se envían sólo cuando
window = 0
o pueden enviarse antes?
Respuesta1
Supongo que la razón de esto es que los mensajes de la sonda de ventana contienen un octeto de datos.
Para que quede claro, no existe un formato de paquete especial, ni un encabezado, ni ningún otro identificador para un paquete de sonda de ventana. TCP simplemente envía un paquete TCP estándar cuando necesita sondear una ventana. Simplemente limita los datos de usuario/aplicación en ese paquete TCP a un solo octeto.
- No he visto que se indique en el estándar que los paquetes de sonda deben contener un octeto de datos nuevos.
Acaba de citar la afirmación del estándar de que los paquetes de sonda deben contener al menos un octeto de datos nuevos, ¿no es así? Si desea declaraciones adicionales, encontrará declaraciones en RFC 793 y RFC 1122 que le recuerdan que los Acks sin datos de aplicación nuevos no se transportan de manera confiable (con la implicación de que debe transmitir algunos datos nuevos para poder saber si pasó por).
¿Existen diferentes formas de comprobar el tamaño de la ventana?
Uno podría imaginar que los autores del estándar TCP podrían haber ideado otras formas, pero la forma que usted citó es la única que previeron en el estándar.
- Si es la única manera, me pregunto por qué no será suficiente reenviar un segmento antiguo (con un número de secuencia antiguo).
No se trata de si sería suficiente, sino de cuál es la mejor manera. Si no tiene más datos para enviar, no necesita sondear la ventana. Si ustedhacerTengo más datos para enviar, ¿por qué no utilizar?esopara sondear la ventana, en lugar de desperdiciar ancho de banda en datos enviados previamente (y presumiblemente confirmados)?
¿El receptor tiene que reconocer solo los datos que están dentro de la ventana en un momento determinado (lo que significa que los datos antiguos no necesariamente serán reconocidos)?
El receptor solo debe reconocer los últimos datos que ha recibido, que son contiguos a todos los datos recibidos desde el principio (por contiguos, digo si tiene un agujero porque perdió uno o más paquetes, pero recibió un paquete posterior, no puede registrar ese paquete posterior; tiene que seguir registrando el último número de secuencia antes del primer hoyo).
- En términos generales, ¿el receptor notifica al remitente cuando su ventana aumenta de tamaño?
Sí, en términos generales, el receptor notifica al remitente las actualizaciones del tamaño de la ventana con cada confirmación.
Además, en "Sugerencias para la administración de ventanas" en la pág. 43 de RFC 793, los autores sugieren que los receptores TCP "envíen otro acuse de recibo con información de nueva ventana cuando la ventana sea más grande". Este RFC es anterior al RFC 2119 que definió los estándares terminológicos MAYO/DEBE/DEBE, pero esta sugerencia parece considerarse un DEBERÍA según la guía de niveles de requisitos del RFC 2119.
¿Tiene que hacerlo (entiendo que el reconocimiento puede perderse, por lo que el remitente tendrá que investigar de todos modos)?
No conozco ningún RFC que actualice el RFC 793 que haría que este comportamiento sea OBLIGATORIO.
¿Los paquetes de sonda se envían solo cuando ventana = 0 o pueden enviarse antes?
Si la ventana no fuera cero, entonces un segmento TCP de un solo byte de datos no se consideraría realmente una sonda. Por ejemplo, si tuviera una conexión telnet que enviara pulsaciones de teclas individuales al host remoto, cada pulsación de tecla podría enviarse como un segmento TCP de un solo byte de datos. Está bien enviarlos en un caso como telnet, incluso cuando la ventana es mayor que 0 o 1, pero no se considerarían sondas.
Respuesta2
Esto se basa enLa respuesta de Spiff., pero con más adiciones de las que cabrían en un comentario. Tenga en cuenta que en agosto de 2022RFC9293finalmente reemplazó la especificación TCP original e incluye todo el lenguaje MUST/SHOULD/MAY.
P1. No he visto que se indique en el estándar que los paquetes de sonda deben contener un octeto de datos nuevos.
El siguiente requisito, que no está restringido a un octeto, estaba en la especificación TCP originalRFC793y fue copiado palabra por palabra en RFC9293:
When the receiving TCP peer has a zero window and a segment arrives, it must
still send an acknowledgment showing its next expected sequence number
and current window (zero).
P2. Me pregunto por qué reenviar un segmento antiguo... no será suficiente.
No es la forma más eficiente (si la ventana se vuelve lo suficientemente grande, el octeto aún debe descartarse). Pero funcionaría, porque las especificaciones de control de congestión de TCP siempre han dicho algo comoRFC5681ahora dice:
A TCP receiver SHOULD send an immediate duplicate ACK when an out-of-
order segment arrives.
P3. En términos generales, ¿el receptor notifica al remitente cuando su ventana aumenta de tamaño?
Supongo que quiere decir que la ventana del receptor crece porque la aplicación receptora consume algunos datos del búfer de recepción. Entonces, creo que no hay ningún requisito en las especificaciones para enviar un ACK para notificar esto. De ahí la necesidad de que la sonda de ventana genere un ACK.
P4. ¿Se envían los paquetes de sonda solo cuando ventana = 0?
Sí, por definición. Porque si se enviara un paquete de un octeto antes de ventana = 0, sería simplemente un paquete normal que tendría un octeto de tamaño.