Algoritmo de retroceso de inicio lento para Ad-Hoc

Si el receptor proclama un tamaño de ventana grande, más grande de lo que puede manejar la red en ruta, siempre habrá pérdidas de paquetes. Así que también habrá retransmisiones. Sin embargo, el remitente no puede enviar todos los paquetes para los que no se ha recibido ACK (Acknowledgement). De esta manera, se provocará aún más congestión en la red. Además, el remitente no puede estar seguro de los paquetes que se han perdido debido a la transmisión. Puede ser que este sea el único paquete que se ha perdido. Tampoco se sabrá cuántos paquetes ha recibido y almacenado en búfer el receptor. En ese caso, el remitente habrá enviado superfluamente varios paquetes.
Por lo tanto, la retransmisión de los paquetes también sigue un mecanismo de retroceso de inicio lento. Sin embargo, necesitamos precisamente mantener un límite superior en el tamaño de los paquetes a medida que aumenta en el inicio lento, para evitar que aumente sin límites y cause congestión. En el mecanismo de retroceso de inicio lento, 
el tamaño de la ventana de umbral es la mitad del valor del tamaño de la ventana de congestión.
Requisito previo: Algoritmo de retroceso para el algoritmo CSMA/CD  
del mecanismo de arranque lento:- 
 

repeat
 if ACK frame received then successful transmission
  if current backoff window size <= Wm then
   if current backoff window size = W0 then
    current backoff window size = W0
  else
  current backoff window size =  current backoff window size ÷ 2
 else
 current backoff window size = current backoff window size-W0
else
 if current backoff window size < Wm then
 current backoff window size = current backoff window size × 2
  else frame lost due to collision or interference
   if current backoff window size = Wn then
   current backoff window size = Wn
   else
 current backoff window size = current backoff window size +W0
until no more frame to transmit
end

Ejemplos: 
 

Esto representa la transmisión exitosa porque la ventana de umbral es menor que la ventana actual. 
Entrada: 
Ingrese el valor del umbral:–>512 
Ingrese el tamaño actual de la ventana de retroceso:–>64 
Salida: El 
tamaño de la ventana de retroceso es:–>128  El tamaño de la ventana de retroceso
es:–>96 
Transmisión exitosa  El tamaño de la ventana de retroceso
es:–>32 
Transmisión exitosa 
El tamaño de la ventana de retroceso es:–>32 
El tamaño de la ventana de retroceso es:–>128 
El tamaño de la ventana de retroceso es:–>96 
La transmisión exitosa 
El tamaño de la ventana de retroceso es:–>32
Esto representa la transmisión fallida porque el umbral de la ventana es mayor que la ventana actual. 
Entrada: 
Ingrese el valor del umbral:–>512 
Ingrese el tamaño actual de la ventana de retroceso:–>1024 
Salida: 
Trama perdida debido a colisión o interferencia El tamaño de la ventana de retroceso es:–>1056 
Transmisión exitosa  El tamaño de la ventana de retroceso
es:–>512 
La transmisión exitosa 
El tamaño de la ventana de retroceso es:–>512 
El marco se perdió debido a colisión o interferencia El tamaño de la ventana de retroceso es:–>1056 
Transmisión exitosa 
El tamaño de la ventana de retroceso es:–>512 
 

Notaciones:- 

W0 -->  Initial backoff window size
Wm -->  Threshold
Wn -->  Maximum backoff window size
ACK --> Acknowledgement
Curr_BT --> Current  backoff window size

Implementación del mecanismo de inicio lento: – 

CPP

#include <cstdlib>
#include <iostream>
#include <math.h>
#include <random>
#include <string>
#include <time.h>
 
using namespace std;
 
void signal(int array_ACK[])
{
    srand(time_t(0));
    for (int i = 0; i < 5; i++) {
        array_ACK[i] = rand() % 2;
    }
}
 
void Slow_Start_Backoff(int Wm, int Wo, int Wn,
                        int Curr_BT, int array_ACK[])
{
    // Taking ACK Binary values in
    // array by user one by one
 
    // backoff_win_size defines
    // backoff window size
 
    int backoff_win_size = 0;
 
    // Printing of backoff window size takes place
 
    for (int j = 0; j < 5; j++) {
        if (array_ACK[j] == 1) {
            cout << "Successful transmission" << endl;
            if (Curr_BT <= Wm) {
                if (Curr_BT == Wo) {
                    Curr_BT = Wo;
                    cout << "Backoff Window Size is:-->"
                            << Curr_BT << endl;
                }
                else {
                    Curr_B= Curr_BT / 2;
                    cout << "Backoff Window Size is:-->"
                            << Curr_BT << endl;
                }
            }
            else {
                Curr_BT = Curr_BT - Wo;
                cout << "Backoff Window Size is:-->"
                        << Curr_BT << endl;
            }
        }
        else {
            if (Curr_BT < Wm) {
                Curr_BT = Curr_BT * 2;
                cout << "Backoff Window Size is:-->"
                        << Curr_BT << endl;
            }
            else {
                cout << "Frame lost due to collision"
                        <<" or interference";
            }
            if (Curr_BT == Wn) {
                Curr_BT = Wn;
                cout << "Backoff Window Size is:-->"
                        << Curr_BT << endl
                            << endl;
            }
            else {
                Curr_BT = Curr_BT + Wo;
                cout << "Backoff Window Size is:-->"
                        << Curr_BT << endl;
            }
        }
    }
}
 
// Driver Code
int main()
{
    int Wm, Wo, Wn, Curr_BT;
    int array_ACK[5];
 
    Wo = 32; // Initial backoff window size
    Wn = 1024; // Maximum backoff window size
 
    // Curr_BT defines the current backoff window size
 
    cout << "Enter the Threshold value:-->";
    cin >> Wm; // Threshold backoff window size
    cout << "Enter the Current backoff window size:-->";
    cin >> Curr_BT;
    signal(array_ACK);
    Slow_Start_Backoff(Wm, Wo, Wn, Curr_BT, array_ACK);
 
    return 0;
}

Cómo se envían los datos en forma de paquetes a través de la red:
cualquier tipo de datos se convierte en formato binario y este formato binario contiene bytes de 0 y 1 
que se dividen en pequeñas secuencias de bits binarios llamadas paquetes.
Ahora, estamos implementando un código en el que la array aleatoria de 0 y 1 genera y supongamos que la secuencia de bits del archivo binario se organiza en la array en forma de fila en longitud fija (tomando una longitud de 10). Luego, cada fila de la array representa un único paquete de datos que se va a transmitir.
Implementación del Generador de Array Aleatoria:-

CPP

// C++ program to construct the
// Random Matrix Generator.
#include <iostream>
#include <iterator>
#include <list>
#include <random>
#include <string>
using namespace std;
 
void showlist(list<string> l1)
{
    list<string>::iterator it;
    cout << "list of frame packets are "
            <<"show as below :-> " << endl;
    cout << endl;
     
    for (it = l1.begin(); it != l1.end(); ++it)
        cout << *it << endl;
    cout << '\n';
}
 
// Driver Code
int main()
{
    int x, y, k = 1;
    string s, s1, s2;
     
    list<string> l1;
     
    srand(time_t(0));
     
    cout << "Rows: " << endl;
    cin >> x;
     
    cout << "Columns: " << endl;
    cin >> y;
     
    int randomNums[x][y];
    std::string temp[x];
     
    int random;
     
    for (int i = 0; i < x; i++) {
     
        // This loop is for the row
        for (int p = 0; p < y; p++) {
             
            // Here you would randomize each
            // element for the array.
            random = rand() % 2;
            randomNums[i][p] = random;
        }
    }
 
    for (int i = 0; i < x; i++) {
         
        // This loop is for the row
        for (int p = 0; p < y; p++) {
             
            // Here you would randomize each
            // element for the array.
            cout << randomNums[i][p] << "\t";
        }
         
        cout << endl;
    }
    cout << endl;
     
    // concatenation of the bits in the matrix row
    // to form a single data packet
    for (int i = 0; i < x; i++) {
         
        temp[i] = to_string(randomNums[i][0]);
         
        for (int j = 0; j < y; ++j) {
             
            s1 = temp[i];
            s2 = to_string(randomNums[i][j]);
 
            s = s1 + s2;
 
            temp[i] = s;
            k++;
        }
         
        temp[i].erase(temp[i].begin() + 1);
        l1.push_back(temp[i]);
    }
 
    showlist(l1);
    return 0;
}

Ejemplo: 
 

Entrada: 
Filas: 
10 
Columnas: 
10 
Salida: 
0 1 1 0 1 1 0 1 0 1 
0 0 0 0 0 0 0 1 1 0 0 
0 1 1 0 1 1 0 1 1 1 
0 1 0 0 0 0 1 0 0 0 
0 0 1 1 0 0 1 0 0 0 
0 0 0 0 1 0 1 1 1 0 
0 0 1 1 0 0 1 1 0 1 
1 1 0 0 1 1 0 0 0 1 
1 1 0 0 1 0 1 1 1 1 
0 1 0 1 1 0 0 1 1 1 
la lista de paquetes de trama se muestra a continuación: -> 
0110110101 
0000001100 
0110110111 
0100001000 
0011001000 
0000101110  0011001101 
1100110001 
11110 
010110 

 

Referencia: Algoritmo de retroceso de inicio lento para redes inalámbricas ad-hoc

Publicación traducida automáticamente

Artículo escrito por devashishchoudhary y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *