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