En esta parte del codigo: Que es cuando se reciben los acks.
base = getacknum(rcvpkt)+1
If (base == nextseqnum)
stop_timer
else
start_time
Exactamente, cuando hace base = getacknum(recvpkt) + 1, que pasa si los ack llegaron en des orden y/o se perdio alguno? La base va a tomar un valor invalido, puede ser? pregunto porque al seguir la maquina de estados tal y como esta aca, y usar lo que nos dieron que genera ruido, pasa esto.
En respuesta a Cristiano Coelho De Asis
Re: Duda maquina de estados del emisor.
de Usuario eliminado -
Hola
El receptor manda un ACK de un paquete sii recibió los paquetes anteriores y en orden(es acumulativo). Si el emisor recibe un ACK del paquete 5 por ejemplo, antes de recibir el 4 (porque se pierde o se desordenan), igual no importa porque quiere decir que todos los paquetes anteriores al 5 fueron recibidos bien. Lo que sí hay que fijarse es que después si llega un ACK de un paquete más chico que la base, no se tome en cuenta, no? Porque la base decrementaría.
Saludos,
Carolina
En respuesta a Usuario eliminado
Re: Duda maquina de estados del emisor.
Si mi problema principal, es la comparacion de los acks/base etc al ser todo modulo 256. Por ejemplo si mi base esta en 250, y me llega el ack del 0 (osea del 256) ahi no me sirve comparar ack > base, me estoy perdiendo de algo de aritmetica modular para saber si un numero es mayor que otro, alguna idea?
En respuesta a Cristiano Coelho De Asis
Re: Duda maquina de estados del emisor.
de Usuario eliminado -
Nosotros asumimos que la ventana nunca es mayor a 256. Entonces si te llega un paquete con número 0 por ejemplo, y tu base es 250, sabes que es mayor. Sino tenés el problema que pueden haber 2 paquetes con el mismo número en la misma ventana y no tenes forma de saber el ACK con que paquete se corresponde.
En respuesta a Usuario eliminado
Re: Duda maquina de estados del emisor.
Y que pasa en este escenario? Base = 15
Te llegan los siguientes ack (porque se desordenaron y perdieron algunos): 15, 20, 16
Llega el 15, que no es menor a la base, entonces moves la base hasta el 16, llega el 20, que no es menor a la base, moves la base hasta el 21, llega el 16(que se desordeno), el cual es menor a la base, y no tendrias que moverla, pero con lo que decís, al llegar el 16 estas diciendo que es mayor, lo cual esta mal.. Capaz que es un poco extremo el caso pero si lo haces cerca del 250 podria pasar tambien no?
Te llegan los siguientes ack (porque se desordenaron y perdieron algunos): 15, 20, 16
Llega el 15, que no es menor a la base, entonces moves la base hasta el 16, llega el 20, que no es menor a la base, moves la base hasta el 21, llega el 16(que se desordeno), el cual es menor a la base, y no tendrias que moverla, pero con lo que decís, al llegar el 16 estas diciendo que es mayor, lo cual esta mal.. Capaz que es un poco extremo el caso pero si lo haces cerca del 250 podria pasar tambien no?
En respuesta a Cristiano Coelho De Asis
Re: Duda maquina de estados del emisor.
de Federico Rodriguez -
En la letra se aclara:
"Se debe implementar el protocolo según se presenta en el libro de texto del curso. Los números de secuencia se deben incrementar modulo 256, para asegurarse que pueden ser contenidos en el campo nro_SEC_pct y nro_ACK_pct, y se deben redefinir las comparaciones realizadas en la máquina de estados."
Las comparaciones en la máquina de estados están hechas con números siempre crecientes. (no en módulo 256).
La recepción sólo acepta el número de secuencia esperado.
Federico
"Se debe implementar el protocolo según se presenta en el libro de texto del curso. Los números de secuencia se deben incrementar modulo 256, para asegurarse que pueden ser contenidos en el campo nro_SEC_pct y nro_ACK_pct, y se deben redefinir las comparaciones realizadas en la máquina de estados."
Las comparaciones en la máquina de estados están hechas con números siempre crecientes. (no en módulo 256).
La recepción sólo acepta el número de secuencia esperado.
Federico
En respuesta a Federico Rodriguez
Re: Duda maquina de estados del emisor.
Si pero surgen varios problemas al trabajar con modulo 256, y al tener que comparar los acks recibidos con la base para saber si moverla o no (en caso de que no lleguen en orden, o se pierdan), incluso asumiento que la ventana no va a ser mayor o igual a 256, no hay forma coherente de comparar si el ack recibido es "mayor" a la base actual, en caso de haber 'dado la vuelta' en el modulo 256.
Por ejemplo, si solo usamos ack >= base para comparar, y estamos en base = 255 y me llega un ack del 0(el del 255 se perdio) la base no se va a mover y a partir de ahi me quedo trancado porque el receptor no va a enviar los acks perdidos, y solo va a enviar acks menores a 255 que es donde se quedo la base.
Si contamos la 'distancia' de la base al ack recibido, y vemos que sea menor al tamaño de la ventana, el problema se arregla, por ejemplo si N =10, me llega el ack del 0, la distancia del 255 al 0 es 1 por lo que acepto y muevo la base a 0, pero en caso de que la ventana sea muy grande, por ejemplo 250, ahi me puede fallar.
Como solucionamos este tipo de problemas?
Por ejemplo, si solo usamos ack >= base para comparar, y estamos en base = 255 y me llega un ack del 0(el del 255 se perdio) la base no se va a mover y a partir de ahi me quedo trancado porque el receptor no va a enviar los acks perdidos, y solo va a enviar acks menores a 255 que es donde se quedo la base.
Si contamos la 'distancia' de la base al ack recibido, y vemos que sea menor al tamaño de la ventana, el problema se arregla, por ejemplo si N =10, me llega el ack del 0, la distancia del 255 al 0 es 1 por lo que acepto y muevo la base a 0, pero en caso de que la ventana sea muy grande, por ejemplo 250, ahi me puede fallar.
Como solucionamos este tipo de problemas?
En respuesta a Cristiano Coelho De Asis
Re: Duda maquina de estados del emisor.
de Federico Rodriguez -
No llego a comprender exactamente cual es el problema planteado, dado que la solución está en tu correo. el número que sigue a 255 es 0, por lo que la distancia de 255 a 3 es 4 (0, 1, 2, 3).
Por lo tanto, cuando llega un ACK, debo verificar si se encuentra entre el último ACK recibido y el el último ACK recibido + N, considerando la arítmética modulo 256.
Sobre el último parágrafo de tu consulta "Si contamos la 'distancia' de la base al ack recibido, y vemos que sea menor al tamaño de la ventana, el problema se arregla, por ejemplo si N =10, me llega el ack del 0, la distancia del 255 al 0 es 1 por lo que acepto y muevo la base a 0, pero en caso de que la ventana sea muy grande, por ejemplo 250, ahi me puede fallar. Como solucionamos este tipo de problemas?", Se debe considerar lo siguiente: Go Back N, debe cumplir que el N debe ser menor que el módulo de los números de secuencia (en nuestro caso 256). Si tu protocolo Go Back N está bien implementado, debería soportar una ventana N de hasta 255, que es lo que garantiza que no se repetirán números de secuencia en una ventana.
Estudien el protocolo Go Back N, y entiendanló antes de implementarlo.
Federico
En respuesta a Federico Rodriguez
Re: Duda maquina de estados del emisor.
"Por lo tanto, cuando llega un ACK, debo verificar si se encuentra entre el último ACK recibido y el el último ACK recibido + N, considerando la arítmética modulo 256."
Esto lo entiendo, el problema esta al considerar aritmetica modulo 256 no funciona del todo bien, hay casos (como por ejemplo con N = 255 o muy grande) en que la base puede llegar a ir hacia atras, ya que no se puede distinguir entre si el ack es menor a la base porque "dio la vuelta" o si es menor porque no llego en orden, si N es chico ( < a 100) no hay problema. Alguna sugerencia?
Esto lo entiendo, el problema esta al considerar aritmetica modulo 256 no funciona del todo bien, hay casos (como por ejemplo con N = 255 o muy grande) en que la base puede llegar a ir hacia atras, ya que no se puede distinguir entre si el ack es menor a la base porque "dio la vuelta" o si es menor porque no llego en orden, si N es chico ( < a 100) no hay problema. Alguna sugerencia?
En respuesta a Cristiano Coelho De Asis
Re: Duda maquina de estados del emisor.
de Usuario eliminado -
Si tu ventana es siempre menor a 256 y sabés cuál es tu base, siempre vas a saber si recibís un ACK si está "más adelante" o no, porque nunca va a pasar que en la misma ventana hayan 2 paquetes con el mismo número de secuencia.
En respuesta a Usuario eliminado
Re: Duda maquina de estados del emisor.
Perdón que insista con el tema, pero aún asi me parece que puede fallar, voy a tratar de ser lo mas claro posible con el ejemplo:
Supongo N = 255, base = 0.
Se realiza la operacion de escritura, el cual tiene muchos datos por lo que la ventana se llena instantaneamente(se envia una ráfaga), osea que de los "slots" 0 al 254 que tiene la ventana, quedan todos ocupados, la base sigue siendo 0, nextseqnum queda en 255, y no se escribe mas en la ventana ya que se llenó.
Luego, el receptor, empieza a recibir cada uno de los paquetes (suponemos que no hay pérdida y llegan todos en orden) y a enviar sus acks correspondientes, por lo que enviaria acks del 0 al 254.
El emisor, empieza a recibir los acks, suponemos que los ack del 1 2 3 y 4 se perdieron y el del 0 se retrasó, pero llego el ack del 5(ignoremos los restantes por ahora), por lo que la base se mueve al 6, y lo que habilita nuevos slots en la ventana(5 mas). Luego como habian muchos datos, y ya hay espacio en la ventana, se procede a enviar el resto, por lo que el nextseqnum avanza a 255, a 0 (da la vuelta), 1 2 3 y 4 (y ahi se queda ya que se vuelve a llenar la ventana), por ultimo, llega el ack del 0 (de la tanda anterior que se habia retrasado) antes de los otros acks que faltaban, ahí como me doy cuenta si el ack del 0 fue del anterior que quedo perdido, o fue del nuevo paquete que recien envie? En la ventana, obviamente, solo hay un paquete con seqnum 0, que es el que envie recien, pero aun asi me llega un 0 de la rafaga anterior, no hay forma de diferenciarlos, y la base se mueve y queda todo mal. Espero ser claro.
Supongo N = 255, base = 0.
Se realiza la operacion de escritura, el cual tiene muchos datos por lo que la ventana se llena instantaneamente(se envia una ráfaga), osea que de los "slots" 0 al 254 que tiene la ventana, quedan todos ocupados, la base sigue siendo 0, nextseqnum queda en 255, y no se escribe mas en la ventana ya que se llenó.
Luego, el receptor, empieza a recibir cada uno de los paquetes (suponemos que no hay pérdida y llegan todos en orden) y a enviar sus acks correspondientes, por lo que enviaria acks del 0 al 254.
El emisor, empieza a recibir los acks, suponemos que los ack del 1 2 3 y 4 se perdieron y el del 0 se retrasó, pero llego el ack del 5(ignoremos los restantes por ahora), por lo que la base se mueve al 6, y lo que habilita nuevos slots en la ventana(5 mas). Luego como habian muchos datos, y ya hay espacio en la ventana, se procede a enviar el resto, por lo que el nextseqnum avanza a 255, a 0 (da la vuelta), 1 2 3 y 4 (y ahi se queda ya que se vuelve a llenar la ventana), por ultimo, llega el ack del 0 (de la tanda anterior que se habia retrasado) antes de los otros acks que faltaban, ahí como me doy cuenta si el ack del 0 fue del anterior que quedo perdido, o fue del nuevo paquete que recien envie? En la ventana, obviamente, solo hay un paquete con seqnum 0, que es el que envie recien, pero aun asi me llega un 0 de la rafaga anterior, no hay forma de diferenciarlos, y la base se mueve y queda todo mal. Espero ser claro.
En respuesta a Cristiano Coelho De Asis
Re: Duda maquina de estados del emisor.
de Federico Rodriguez -
Es correcta tu observación, en el caso planteado, que es muy extremo (dado que se utiliza el máximo de tamaño de ventana y se utiliza toda).
Lo que se debería considerar para que ésto no ocurra, es el tiempo máximo de vida de paquetes en la red, para asegurar que no se puedan tomar ACKs de la ventana anterior.
Igualmente, éste caso no lo consideren. Para evitar que ocurra pueden setear que no se realice reorder de paquetes con el netemulator.sh y así se asegura que no pasará.
Federico
En respuesta a Federico Rodriguez
Re: Duda maquina de estados del emisor.
El emulator tambien tiene una parte para agregar delay, que esta seteada en 100ms 10ms, por lo que tambien se pueden desordenar por eso.
Seria necesario documentar este caso? Con el tiempo de vida te referis al TTL? Seria muy complicado implementar lo que decis?
Seria necesario documentar este caso? Con el tiempo de vida te referis al TTL? Seria muy complicado implementar lo que decis?
En respuesta a Cristiano Coelho De Asis
Re: Duda maquina de estados del emisor.
de Federico Rodriguez -
El parámetro delay no desordena los paquetes, les agrega o quita latencia.
Federico
Federico
En respuesta a Federico Rodriguez
Re: Duda maquina de estados del emisor.
Pero si es variable (ustedes nos dieron con parametros 100 y 10) algunos igual se van a desordenar.
En respuesta a Federico Rodriguez
Re: Duda maquina de estados del emisor.
Hola. Leyendo en al web que dice en netEmulator.sh constatamos que depende como se configure en la mayoría de los casos sí reordena paquetes.
Saludos.