Un estudio en redes 802.11

Anuncio
Proyecto de Grado
Presentado ante la ilustre Universidad de Los Andes como requisito final para
obtener el Tı́tulo de Ingeniero de Sistemas
Diseño e implementación de un mecanismo de
arranque rápido de flujos transporte: Un
estudio en redes 802.11
Por
Br. Omar A. Dı́az M.
Tutor: Prof. Andrés Arcia Moret
Abril 2012
c
2012
Universidad de Los Andes Mérida, Venezuela
Diseño e implementación de un mecanismo de arranque
rápido de flujos transporte: Un estudio en redes 802.11
Br. Omar A. Dı́az M.
Proyecto de Grado — Sistemas Computacionales, 138 páginas
Resumen: El advenimiento de redes de acceso más rápidas, conlleva la necesidad
de aprovechar el ancho de banda disponible más eficientemente. Esta eficiencia debe
considerar al menos tres aspectos: el aprovechamiento rápido del ancho de banda
disponible, el mantenimiento de la justicia en el uso del ancho de banda y el aumento
efectivo del rendimiento de las transferencias. Es posible modificar TCP sin violar el
principio de extremo a extremo, para aprovechar el ancho de banda disponible en la
red más rápidamente que como se define en el algoritmo clásico de Slow Start. En
esta propuesta la retroalimentación hecha por los ACKs, no significa solamente, como
en el algoritmo clásico, que un paquete ha salido de la red, sino también que pueden
inyectarse tantos paquetes como lo indique el receptor. La idea consiste en dividir los
ACKs (divacks), para que cada uno reconozca una porción de un paquete (sin perder
la semántica de TCP), pudiendo entonces enviarse varios ACKs por un solo paquete
de datos. Esta propiedad permite controlar el ritmo de envı́o de divacks en el receptor
TCP aumentando considerablemente y a voluntad del receptor la tasa de envı́o de
datos en el emisor.
Palabras clave: Control de Congestión, División de ACK, Arranque rápido, Redes
802.11, TCP.
Índice general
Índice general
III
Índice de Figuras
VI
Índice de figuras
VI
Índice de Cuadros
XIII
Agradecimientos
XV
1. Introducción
1
1.1. Antecedentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.2. Definición del Problema . . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.3. Justificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.4. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
1.4.1. Objetivo general . . . . . . . . . . . . . . . . . . . . . . . . . .
6
1.4.2. Objetivos especı́ficos . . . . . . . . . . . . . . . . . . . . . . . .
6
1.5. Metodologı́a de trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
1.6. Alcance del Proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
1.7. Estructura del Documento . . . . . . . . . . . . . . . . . . . . . . . . .
7
2. Marco Teórico
9
2.1. Protocolo de Control de Transmisión . . . . . . . . . . . . . . . . . . .
9
2.2. Control de la congestión: Slow Start y Congestion Avoidance . . . . . .
12
2.2.1. Algoritmo Slow Start . . . . . . . . . . . . . . . . . . . . . . . .
13
iii
2.2.2. Algoritmo Congestion Avoidance . . . . . . . . . . . . . . . . .
14
2.3. Envı́o de ACKs: Delayed-ACK y divacks . . . . . . . . . . . . . . . . .
14
2.3.1. Delayed-ACK . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
2.3.2. División de reconocimientos (divacks) . . . . . . . . . . . . . . .
16
2.4. Aclaratoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
2.5. Kernel Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
2.5.1. Implementación de TCP en el kernel Linux v2.6.35.7 . . . . . .
18
2.5.2. Parámetros TCP . . . . . . . . . . . . . . . . . . . . . . . . . .
21
2.6. Herramientas de medición y procesamiento de tráfico de red . . . . . .
22
2.6.1. Wireshark/Tshark
. . . . . . . . . . . . . . . . . . . . . . . . .
22
2.6.2. Tcpprobe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
2.7. Conclusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
3. Desarrollo de la técnica
25
3.1. División de ACKs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
3.2. Descripción del Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . .
27
3.2.1. Variables implicadas en la formación de los divacks . . . . . . .
28
3.2.2. Mecanismos afectados por los divacks . . . . . . . . . . . . . . .
29
3.2.3. Presentación del algoritmo . . . . . . . . . . . . . . . . . . . . .
29
3.3. Conclusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
4. Implementación de la Técnica
33
4.1. Técnica de control de envı́o de divacks . . . . . . . . . . . . . . . . . .
33
4.2. Modificaciones en el Servidor . . . . . . . . . . . . . . . . . . . . . . . .
36
4.3. Modificaciones en el Cliente . . . . . . . . . . . . . . . . . . . . . . . .
40
4.4. Limitación de los divacks . . . . . . . . . . . . . . . . . . . . . . . . . .
43
4.5. Compilación del kernel . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
4.6. Conclusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
5. Pruebas
53
5.1. Configuración de las pruebas . . . . . . . . . . . . . . . . . . . . . . . .
53
5.2. Pruebas sobre red cableada
54
. . . . . . . . . . . . . . . . . . . . . . . .
5.3. Pruebas sobre red cableada simulando una WAN . . . . . . . . . . . . .
64
5.3.1. Tiempo de retardo de 10 ms . . . . . . . . . . . . . . . . . . . .
65
5.3.2. Tiempos mayores de retardo . . . . . . . . . . . . . . . . . . . .
70
5.4. Pruebas sobre red Inalámbrica . . . . . . . . . . . . . . . . . . . . . . .
77
5.4.1. Configuración de las pruebas . . . . . . . . . . . . . . . . . . . .
77
5.4.2. Pruebas y resultados . . . . . . . . . . . . . . . . . . . . . . . .
78
5.5. Conclusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
6. Conclusiones y Recomendaciones
115
Bibliografı́a
118
Referencias
118
A. Scripts utilizados para la realización y procesamiento de las pruebas120
A.1. Script para la configuración de Netem . . . . . . . . . . . . . . . . . . . 120
A.2. Script para las pruebas de descarga del cliente . . . . . . . . . . . . . . 122
A.3. Script para pruebas de descarga del sevidor . . . . . . . . . . . . . . . . 124
A.4. Scripts para el cálculo del throughput . . . . . . . . . . . . . . . . . . . 125
A.5. Scripts para la creación de las gráficas . . . . . . . . . . . . . . . . . . 128
Índice de figuras
1.1. Crecimiento de la cwnd en slow start mediante el uso de divacks. . . . .
5
2.1. Vida de una conexión TCP . . . . . . . . . . . . . . . . . . . . . . . . .
10
2.2. Comportamiento de la cwnd en slow start . . . . . . . . . . . . . . . .
13
2.3. Comportamiento de la cwnd en congestion avoidance . . . . . . . . . .
14
2.4. Envı́o de un ACK por paquete . . . . . . . . . . . . . . . . . . . . . . .
15
2.5. Delayed-ACK, un ACK por cada dos paquetes . . . . . . . . . . . . . .
16
2.6. Técnica de división de ACKs: 3 ACKs por cada paquete de datos. . . .
17
3.1. Ejemplo de la técnica de divacks. . . . . . . . . . . . . . . . . . . . . .
27
3.2. Valores de snd nxt y snd una en el emisor. . . . . . . . . . . . . . . . .
28
4.1. Proceso de envı́o de datos ante la llegada de un ACK. . . . . . . . . . .
37
4.2. Comportamiento de la función tcp clean rtx queue(). . . . . . . . . . .
39
4.3. Mecanismo de envı́o de ACKs ante la llegada de un paquete de datos. .
41
4.4. Ruta para activar algoritmo de control de congestión por omisión. . . .
50
4.5. Captura de pantalla menuconfig: Selección del algoritmo de control de
congestión. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
5.1. Topologı́a simple Cliente-Servidor. . . . . . . . . . . . . . . . . . . . . .
54
5.2. Captura de pantalla de una traza en Wireshark, sin divacks. . . . . . .
55
5.3. Captura de pantalla de una traza en Wireshark. . . . . . . . . . . . . .
57
5.4. Captura de pantalla de una traza en Wireshark (Fin de la conexión). .
58
5.5. Comparación del crecimiento de la cwnd con y sin divacks. . . . . . . .
60
vi
5.6. Comparación del proceso de descarga de un archivo de 99 KB con y sin
divacks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
5.7. Descarga de archivo de 99 KB con divacks (acercamiento). . . . . . . .
62
5.8. Comparación del proceso de descarga de un archivo de 99 KB con y sin
divacks, sobre una red cableada (Traza del servidor). . . . . . . . . . .
63
5.9. Topologı́a WAN emulada con netem. . . . . . . . . . . . . . . . . . . .
65
5.10. Comparación del crecimiento de la cwnd de control, con n=9, 20 ms de
RTT y archivo de tamaño 99 kB, sobre una red cableada. . . . . . . . .
66
5.11. Comparación del proceso de descarga de un archivo de 99 KB de control,
con n=9 y con 20 ms de RTT, sobre una red cableada (Traza del cliente). 66
5.12. Comparación del proceso de descarga de un archivo de 99 KB de control,
con n=9 y con 20 ms de RTT, sobre una red cableada (Traza del servidor). 68
5.13. Comparación del crecimiento de la cwnd de control, con n=9, 20 ms de
RTT y archivo de tamaño 990 kB, sobre una red cableada. . . . . . . .
68
5.14. Comparación del proceso de descarga de un archivo de 990 KB de
control, con n=9 y con 20 ms de RTT, sobre una red cableada (Traza
del cliente). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
5.15. Comparación del proceso de descarga de un archivo de 990 KB de
control, con n=9 y con 20 ms de RTT, sobre una red cableada (Traza
del servidor). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
5.16. Comparación del crecimiento de la cwnd de control, con n=9, 50 ms de
RTT y archivo de tamaño 99 kB, sobre una red cableada. . . . . . . . .
71
5.17. Comparación del proceso de descarga de un archivo de 99 KB de control,
con n=9 y con 50 ms de RTT, sobre una red cableada (Traza del cliente). 71
5.18. Comparación del proceso de descarga de un archivo de 99 KB de control,
con n=9 y con 50 ms de RTT, sobre una red cableada (Traza del servidor). 72
5.19. Comparación del crecimiento de la cwnd de control, con n=9, 80 ms de
RTT y archivo de tamaño 99 kB, sobre una red cableada. . . . . . . . .
73
5.20. Comparación del proceso de descarga de un archivo de 99 KB de control,
con n=9 y con 80 ms de RTT, sobre una red cableada (Traza del cliente). 73
5.21. Comparación del proceso de descarga de un archivo de 99 KB de control,
con n=9 y con 80 ms de RTT, sobre una red cableada (Traza del servidor). 74
5.22. Comparación del rendimiento de descarga de un archivo de 99 kb, con
diferentes tiempos de retardo, en una red cableada. . . . . . . . . . . .
75
5.23. Comparación del tiempo de descarga de un archivo de 99 kb, con
diferentes tiempos de retardo, en una red cableada. . . . . . . . . . . .
75
5.24. Comparación del rendimiento de descarga de un archivo de 990 kb, con
diferentes tiempos de retardo, en una red cableada. . . . . . . . . . . .
76
5.25. Comparación del tiempo de descarga de un archivo de 990 kb, con
diferentes tiempos de retardo, en una red cableada. . . . . . . . . . . .
76
5.26. Maqueta de red de acceso inalámbrico. . . . . . . . . . . . . . . . . . .
77
5.27. Comparación del crecimiento de la cwnd utilizando diferentes valores de
n y tamaño de archivo de 99 kB, sobre una red inalámbrica. . . . . . .
79
5.28. Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n, sobre una red inalámbrica (Traza del cliente). .
80
5.29. Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n, sobre una red inalámbrica (Traza del servidor).
80
5.30. Comparación crecimiento de la cwnd utilizando diferentes valores de n
y tamaño de archivo de 198 kB, sobre una red inalámbrica. . . . . . . .
81
5.31. Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n, sobre una red inalámbrica (Traza del cliente). .
81
5.32. Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n, sobre una red inalámbrica (Traza del servidor).
82
5.33. Comparación del crecimiento de la cwnd utilizando diferentes valores de
n y tamaño de archivo de 990 kB, sobre una red inalámbrica. . . . . . .
82
5.34. Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n, sobre una red inalámbrica (Traza del cliente). .
83
5.35. Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n, sobre una red inalámbrica (Traza del servidor).
83
5.36. Comparación del crecimiento de la cwnd utilizando diferentes valores de
n, 20 ms de RTT y tamaño de archivo de 99 kB, sobre una red inalámbrica. 84
5.37. Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n y 20 ms de RTT, sobre una red inalámbrica (Traza
del cliente). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
85
5.38. Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n y 20 ms de RTT, sobre una red inalámbrica (Traza
del servidor). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
85
5.39. Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 20 ms de RTT y tamaño de archivo de 198 kB, sobre una red
inalámbrica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
86
5.40. Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n y 20 ms de RTT, sobre una red inalámbrica (Traza
del cliente). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
86
5.41. Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n y 20 ms de RTT, sobre una red inalámbrica (Traza
del servidor). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
87
5.42. Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 20 ms de RTT y tamaño de archivo de 990 kB, sobre una red
inalámbrica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
87
5.43. Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n y 20 ms de RTT, sobre una red inalámbrica (Traza
del cliente). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
88
5.44. Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n y 20 ms de RTT, sobre una red inalámbrica (Traza
del servidor). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
88
5.45. Comparación del crecimiento de la cwnd utilizando diferentes valores de
n, 50 ms de RTT y tamaño de archivo de 99 kB, sobre una red inalámbrica. 89
5.46. Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n y 50 ms de RTT, sobre una red inalámbrica (Traza
del cliente). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
90
5.47. Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n y 50 ms de RTT, sobre una red inalámbrica (Traza
del servidor). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
91
5.48. Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 50 ms de RTT y tamaño de archivo de 198 kB, sobre una red
inalámbrica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
91
5.49. Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n y 50 ms de RTT, sobre una red inalámbrica (Traza
del cliente). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
92
5.50. Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n y 50 ms de RTT, sobre una red inalámbrica (Traza
del servidor). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
93
5.51. Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 50 ms de RTT y tamaño de archivo de 990 kB, sobre una red
inalámbrica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
93
5.52. Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n y 50 ms de RTT, sobre una red inalámbrica (Traza
del cliente). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
94
5.53. Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n y 50 ms de RTT, sobre una red inalámbrica (Traza
del servidor). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
94
5.54. Comparación del crecimiento de la cwnd utilizando diferentes valores de
n, 80 ms de RTT y tamaño de archivo de 99 kB, sobre una red inalámbrica. 95
5.55. Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n y 80 ms de RTT, sobre una red inalámbrica (Traza
del cliente). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
96
5.56. Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n y 80 ms de RTT, sobre una red inalámbrica (Traza
del servidor). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
97
5.57. Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 80 ms de RTT y tamaño de archivo de 198 kB, sobre una red
inalámbrica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
97
5.58. Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n y 80 ms de RTT, sobre una red inalámbrica (Traza
del cliente). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
98
5.59. Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n y 80 ms de RTT, sobre una red inalámbrica (Traza
del servidor). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
99
5.60. Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 80 ms de RTT y tamaño de archivo de 990 kB, sobre una red
inalámbrica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
99
5.61. Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n y 80 ms de RTT, sobre una red inalámbrica (Traza
del cliente). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
5.62. Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n y 80 ms de RTT, sobre una red inalámbrica (Traza
del servidor). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
5.63. Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 250 ms de RTT y tamaño de archivo de 99 kB, sobre una red
inalámbrica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
5.64. Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n y 250 ms de RTT, sobre una red inalámbrica
(Traza del cliente). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
5.65. Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n y 250 ms de RTT, sobre una red inalámbrica
(Traza del servidor). . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
5.66. Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 250 ms de RTT y tamaño de archivo de 198 kB, sobre una red
inalámbrica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
5.67. Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n y 250 ms de RTT, sobre una red inalámbrica
(Traza del cliente). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
5.68. Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n y 250 ms de RTT, sobre una red inalámbrica
(Traza del servidor). . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
5.69. Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 250 ms de RTT y tamaño de archivo de 990 kB, sobre una red
inalámbrica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
5.70. Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n y 250 ms de RTT, sobre una red inalámbrica
(Traza del cliente). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
5.71. Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n y 250 ms de RTT, sobre una red inalámbrica
(Traza del servidor). . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
5.72. Comparación del rendimiento de descarga de archivos de tamaño 99 kB
con diferentes tiempos de retardo. . . . . . . . . . . . . . . . . . . . . . 111
5.73. Comparación del tiempo de descarga de archivos de tamaño 99 kB con
diferentes tiempos de retardo. . . . . . . . . . . . . . . . . . . . . . . . 112
5.74. Comparación del rendimiento de descarga de archivos de tamaño 198
kB con diferentes tiempos de retardo. . . . . . . . . . . . . . . . . . . . 112
5.75. Comparación del tiempo de descarga de archivos de tamaño 198 kB con
diferentes tiempos de retardo. . . . . . . . . . . . . . . . . . . . . . . . 113
5.76. Comparación del rendimiento de descarga de archivos de tamaño 990
kB con diferentes tiempos de retardo. . . . . . . . . . . . . . . . . . . . 113
5.77. Comparación del tiempo de descarga de archivos de tamaño 990 kB con
diferentes tiempos de retardo. . . . . . . . . . . . . . . . . . . . . . . . 114
Índice de Cuadros
2.1. Archivo generado por tcp probe. . . . . . . . . . . . . . . . . . . . . .
23
3.1. Algoritmo de divacks en el receptor TCP. . . . . . . . . . . . . . . . . .
31
4.1. Declaración de tcp divack (net/ipv4/tcp intput.c) . . . . . . . . . . .
34
4.2. ipv4 table[ ] (net/ipv4/sysctl net ipv4.c) . . . . . . . . . . . . . . . . .
35
4.3. Definición de nombres sysctl (include/linux/sysctl.h) . . . . . . . . . .
35
4.4. bin net ipv4 table[ ] (kernel/sysctl binary.c) . . . . . . . . . . . . . . .
36
4.5. sysctl tcp divack (include/net/tcp.h) . . . . . . . . . . . . . . . . . . .
36
4.6. Modificación
en
el
servidor
de
la
función
tcp ack()
(net/ipv4/tcp input.c). . . . . . . . . . . . . . . . . . . . . . . . . .
40
4.7. Implementación de la técnica de divacks en el receptor TCP
(net/ipv4/tcp input.c) . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
4.8. Mensajes de depuración del kernel. . . . . . . . . . . . . . . . . . . . .
44
4.9. Modificación en el cliente de la función
tcp select window()
(net/ipv4/tcp output.c) . . . . . . . . . . . . . . . . . . . . . . . . .
47
4.10. Modificación en el servidor de la función tcp reno cong avoid()
(net/ipv4/tcp input.c) . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
4.11. Compilación del kernel. . . . . . . . . . . . . . . . . . . . . . . . . . . .
51
5.1. Diagrama de flechas de una transmisión TCP, sin divacks. . . . . . . .
56
5.2. Diagrama de flechas . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
5.3. Ping realizado entre el receptor y el emisor usando un retardo de 10 ms. 65
5.4. Ping realizado entre el receptor y el emisor usando un retardo de 25 ms. 70
5.5. Ping realizado entre el receptor y el emisor usando un retardo de 40 ms. 72
A.1. netem.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
A.2. Script bash del cliente para realizar las pruebas de descarga
xiii
. . . . . . 122
A.3. Script bash del servidor para realizar las pruebas de descarga . . . . . . 124
A.4. throughput.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
A.5. throughput.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
A.6. throughput-promedio.py . . . . . . . . . . . . . . . . . . . . . . . . . . 127
A.7. graficar-cwnd.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
A.8. cwnd.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
A.9. graficar-descarga.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
A.10.graficar-descarga-srv.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
A.11.graficar-throughput.sh . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Agradecimientos
Quiero agradecer sinceramente a todos cuyo apoyo y colaboración hicieron posible
la culminación de este proyecto.
Primero a mi mamá, que con su apoyo siempre me anima a salir adelante y con su
ejemplo me impulsa a alcanzar mis metas.
A mi familia, que siempre espera lo mejor de mi lo que me motiva a poner mi mayor
esfuerzo en las cosas que hago.
Al profesor Andrés Arcia Moret, por la confianza que ha puesto en mi y su gran
ayuda, no solo en la realización de este proyecto, sino en parte importante de mi
desarrollo académico.
A mis amigos, que me han demostrado que puedo contar con ellos cuando lo necesito.
En especial a mi querida amiga Samantha Gamboa, con quien inicié este proyecto, lo
cual fue de gran ayuda y un importante impulso para seguir superando obstáculos
durante el desarrollo del proyecto.
A la Universidad de Los Andes, que ha sido mi casa de estudios, el hogar de una
nueva gran familia que ahora forma parte de mi vida. Por brindarme los medios y
conocimientos que hoy me convierten en un profesional. Me siento orgulloso de formar
parte de esta casa de estudios.
A las secretarias de la facultad de Ingenierı́a, siempre dispuestas a ayudar a resolver
cualquier problema y prestar todo su apoyo.
A todos aquellos que a pesar de que no he nombrado, han colaborado de alguna
manera al buen desarrollo y finalización de este proyecto.
xv
Capı́tulo 1
Introducción
Bajo ciertas condiciones, TCP por sı́ solo, no es capaz de aprovechar el ancho de
banda como deberı́a. Por ejemplo en caı́das abruptas de la ventana de congestión por
pérdidas aleatorias, TCP no se comporta de manera apropiada, y trata este tipo de
evento de la misma manera como lidia con la congestión de la red, desperdiciándose
ası́ mucho ancho de banda.
Hoy en dı́a TCP es uno de los protocolos fundamentales, y por lo tanto, más
difundido de Internet. Por ser un protocolo de la capa transporte su función es
comunicar aplicaciones en hosts distintos, para ello, el host emisor divide en segmentos
el flujo de datos a enviar, cada segmento es etiquetado con un número de secuencia
para garantizar el orden y confiabilidad de los datos. Cuando el host receptor recibe
un segmento en orden, éste envı́a un reconocimiento acumulativo, denominado ACK,
el cual notifica al emisor que todos los datos precedentes a ese número de secuencia
han sido recibidos y pueden ser retirados del buffer de retransmisión del emisor.
Una de las caracterı́sticas de TCP es el control de la congestión, para esto utiliza
varios algoritmos, entre los cuales se encuentran slow start y congestion avoidance.
Estos algoritmos controlan el ritmo de envı́o de datos mediante la manipulación de una
ventana de congestión (cwnd ) que limita el número de paquetes que se pueden enviar
sin haber recibido un ACK. Cuando una conexión comienza, el algoritmo slow start es
utilizado para incrementar rápidamente el tamaño de la cwnd y ası́ utilizar el máximo
ancho de banda de envı́o disponible. Durante slow start, TCP incrementa la cwnd
1.1 Antecedentes
2
a lo sumo SMSS (Sender Maximum Segment Size o Tamaño Máximo de Segmento
en el emisor) bytes por cada ACK recibido que reconoce un nuevo dato. Se puede
aprovechar esta caracterı́stica y explotarla como una vulnerabilidad, ası́, cada ACK
puede ser dividido en varios ACKs (igualmente válidos), a los que llamaremos divacks,
incrementando la velocidad con que slow start aumenta el tamaño de la cwnd y de esta
manera poder aprovechar mejor el ancho de banda disponible al inicio de una conexión.
1.1.
Antecedentes
Arcia (2009) realiza un estudio minucioso sobre la división de ACKs, en su tesis
Doctoral expone una recopilación de los estudios y propuestas realizadas sobre esta
técnica, como una forma de mejorar el rendimiento de TCP. Expone las discusiones
existentes sobre este tema y hace un análisis de la técnica basándose en simulaciones
con NS-2 con el objetivo de cuantificar los beneficios y problemas obtenidos a través
del uso de divacks (el autor acuña este término como un diminutivo de ACK dividido).
Como resultado de sus análisis, Arcia (2009) propone el uso de los divacks durante
los primeros RTT del slow start, para inducir la transmisión de una gran cantidad
de paquetes de datos en esta etapa. Esto podrı́a ser utilizado en la recuperación de
conexiones TCP luego de un timeout 1 , para la compensación de la cwnd luego de una
pérdida aleatoria, un handover
2
o simplemente para mejorar la transmisión al inicio
de la conexión y aprovechar más rápidamente el ancho de banda disponible en la red.
El comportamiento de los algoritmos de control de la congestión TCP ante
la presencia de divacks fue originalmente descrito por Savage et al. (1999), su
investigación estaba enfocada en exponer las vulnerabilidades que presentaba TCP
ante un receptor malintencionado que, aprovechándose de éstas, podrı́a controlar el
ritmo de envı́o de datos del emisor. Ellos describen por primera vez la división de ACKs
1
Si el emisor no recibe ningún ACK dentro del intervalo de tiempo esperado (timeout), los datos
son retransmitidos y cwnd se reinicia en 1 SMSS.
2
En redes inalámbricas, handover es un mecanismo que permite a un receptor TCP móvil cambiar
de una red a otra cuando la calidad del enlace es insuficiente.
1.1 Antecedentes
3
como un ataque capaz de inducir en un emisor TCP correctamente implementado, un
envı́o agresivo de datos.
Dado el comportamiento del emisor TCP ante el uso de la técnica de división de
ACKs, se han hecho ya varias propuestas con el fin de mejorar el rendimiento de TCP
en redes inalámbricas:
Jin et al. (1999) , motivados por las significativas pérdidas de paquetes que existen
en las redes inalámbricas debido a las altas tazas de errores de bits, proponen una forma
de mejorar la respuesta de TCP en esta situación. En su propuesta, cuando la estación
base detecta pérdidas, divide los ACKs entrantes en varios y los envia al host fijo (en
una red cableada). El host fijo al recibir muchos paquetes de reconocimiento (ACK),
incrementa rápidamente el tamaño de la cwnd, con lo que se aumenta la velocidad de
recuperación de TCP. Mediante la medición por simulación, los autores comprueban
que TCP muestra un mejor rendimiento utilizando esta técnica que sin ella.
Matsushita et al. (2005), por su parte utilizan la técnica de division de ACKs para
mejorar el rendimiento de TCP durante un handover vertical (handover entre redes
de tipo diferente). Cuando el nodo móvil calcula el ancho de banda de la nueva red,
controlando el ritmo de envı́o de ACKs, puede ajustar rápidamente su cwnd a este
nuevo ancho de banda, mejorando su rendimiento. Sus conclusiones también están
basadas en los resultados obtenidos a través de simulaciones.
Para hacer frente a la caı́da de la cwnd debido a pérdidas inalámbricas aleatorias
en redes cableadas-inalámbricas asimétricas (mayor ancho de banda de bajada que de
subida de datos), Hasegawa et al. (2007) proponen un método en el que resaltan tres
aspectos: el primero es un mecanismo para diferenciar una pérdida inalámbrica de una
pérdida por congestión, de manera de solo usar los divacks cuando una pérdida aleatoria
ocurre; el segundo es el control del intervalo de duración de generación de divacks, para
esto el nodo móvil guarda un estimado del tamaño de la cwnd del emisor, cuando
la pérdida aleatoria ocurre, el receptor envı́a tantos divacks como sea necesario para
recuperar la cwnd que el emisor tenı́a antes que la pérdida ocurriera; por ultimo el
control de la tasa de envı́o de divacks, ya que el envı́o de divack aumenta la carga en
el enlace de subida de datos, se hace un chequeo de la cola de datos de subida (del
1.2 Definición del Problema
4
receptor al emisor). Cuando llega un paquete de datos, se revisa esta cola, si está vacı́a
se aumenta la tasa de envı́o en r = r +1 (donde r es el número de divacks a ser
transmitido), sino, se reduce r por el número de paquetes en la cola esperando a ser
transmitidos. Este método busca adaptar el envı́o de divacks al ancho de banda de
subida disponible en la red.
1.2.
Definición del Problema
TCP fue diseñado para tratar con la congestión en la red. Cuando TCP detecta
que existe congestión en la red, aminora bruscamente el ritmo de transmisión de
datos reduciendo la ventana de congestión (cwnd ), con la cual controla la cantidad
de paquetes que se pueden enviar sin haber recibido un ACK. Luego prueba
cautelosamente el nivel de congestión en la red enviando una cantidad mayor de datos
cada vez, para evitar saturar de nuevo la red.
El problema de este comportamiento de TCP se presenta cuando ocurren eventos
como la pérdida aleatoria de paquetes o handovers, comunes en redes 802.11, donde
TCP reacciona, equivocadamente, como lo harı́a ante la presencia de congestión,
reduciendo abruptamente el tamaño de la cwnd y probando lentamente el nivel de
saturación de la red, aun cuando sabemos que hay suficiente ancho de banda disponible
ya que la reducción de la cwnd no fue provocada por la congestión.
1.3.
Justificación
Utilizando la ténica de divacks podemos luego del primer RTT3 (Round Trip Time)
enviar una ráfaga de ACKs tal que aumentemos de forma inmediata la cwnd al tamaño
que, dependiendo de la congestión estimada, asumamos como óptimo. De esta manera
aprovechamos todo el ancho de banda disponible desde el comienzo de la conexión. Este
ajuste rápido de la cwnd tiene especial utilidad para la adaptación y la recuperación
de la ventana de congestión (cwnd ) luego de una pérdida aleatoria, un handover o un
3
Round-Trip Time o tiempo de ida y vuelta, es el tiempo estimado que tarda un paquete en llegar
al receptor y su ACK al emisor.
1.3 Justificación
5
Figura 1.1: Crecimiento de la cwnd en slow start mediante el uso de divacks.
timeout, de esta manera, mediante el uso de la técnica de divacks se puede recuperar
la velocidad de transmisión de datos rápidamente.
Con la intención de clarificar el efecto del uso de divacks, se presenta en la Figura
1.1 el comportamiento teórico de la ventana de congestión (cwnd ) durante la etapa slow
start, donde se compara con el comportamiento normal (1 ACK por paquete recibido).
En slow start la ventana de congestion (cwnd ) se actualiza en SMSS bytes por cada
ACK que reconoce nuevos datos (Allman et al., 2009), siguiendo este comportamiento
se puede notar el crecimiento acelerado de la cwnd que se logra con el uso de divacks
(en este caso 4 divacks por paquete recibido), tan solo en el tercer RTT la ventana de
congestión es de 250 SMSS bytes en contraste con el escenario normal en el que tan
solo serı́a de 16 SMSS bytes.
Es un hecho que la fuerte presencia de TCP en la Internet y por la tanto su muy
difundido uso, dificulta aplicar cualquier cambio en él, por esta razón TCP no se adapta
bien a algunas tecnologı́as de transmisión de información. Haciendo uso de la técnica
de divacks, se mejora el aprovechamiento del ancho de banda disponible en una red, ası́,
se propone esta técnica para mejorar el rendimiento de TCP bajo ciertas condiciones.
1.4 Objetivos
1.4.
1.4.1.
6
Objetivos
Objetivo general
Implementar la técnica de división de ACKs (divacks) en un kernel linux para
comprobar su viabilidad en redes reales.
1.4.2.
Objetivos especı́ficos
Estudiar el efecto del envı́o de divacks sobre la cwnd, en la implementación de
TCP de un kernel linux.
Desarrollar algoritmos que permitan utilizar la técnica de división de ACKs en
el kernel Linux para aprovechar el ancho de banda disponible en redes de acceso.
Comprobar la mejora en uso del ancho de banda disponible en una red mediante
la observación de experimentos.
1.5.
Metodologı́a de trabajo
Debido a la naturaleza de este proyecto se utilizará como guı́a el Método
Experimental que se basa en el conocimiento empı́rico y la experimentación. Según
este método este proyecto se realizará en las siguientes etapas:
Identificación del Problema: Ante la ocurrencia de ciertos eventos, TCP no
reacciona correctamente, con lo cual desperdicia ancho de banda y castiga el
ritmo de transferencia de datos. Hasta donde se sabe, actualmente no existe una
implementación que trate de corregir este problema.
Formulación de la Hipótesis: Dividiendo los ACKs en el receptor (sin perder la
semántica de TCP), se podrı́an enviar varios ACKs (divacks) por cada paquete
de datos. Esta propiedad permitirı́a controlar el ritmo de envı́o de divacks en el
receptor TCP aumentando considerablemente y a voluntad del receptor la tasa
de envı́o de datos en el emisor. Ası́, serı́a posible recuperarse rápidamente de una
caı́da abrupta de la cwnd bajo ciertas condiciones.
1.6 Alcance del Proyecto
7
Prueba de Hipótesis: La experimentación se realizará de la siguiente manera: Se
montará una red simple de dos nodos modificados para utilizar la técnica de
divacks. Se realizarán las pruebas en esta red, variando ciertas condiciones y se
tomarán los datos usando el programa Wireshark, que permite examinar datos
de una red en vivo.
Resultados: Basándose en los datos obtenidos en la fase de Prueba de Hipótesis, se
podrá concluir sobre la posible utilidad de aplicar la técnica de divacks, ası́ como
las ventajas y desventajas que presenta esta técnica.
1.6.
Alcance del Proyecto
Diseñar e implementar los algoritmos necesarios para utilizar la técnica de división
de ACKs en un kernel linux. Realizar las pruebas necesarias para comprobar la utilidad
y funcionamiento de la técnica de división de ACKs.
1.7.
Estructura del Documento
Este documento se estructura de la siguiente forma:
Capı́tulo 1. Introducción. Describe los conceptos manejados en el proyecto.
Se definen los antecedentes que son la base para solucionar el problema, ası́ como
también, el planteamiento del problema, la justificación y los objetivos, el alcance del
proyecto y la metodologı́a para su desarrollo.
Capı́tulo 2. Marco teórico. Contiene los fundamentos teóricos necesarios para el
entendimiento y comprensión del proyecto.
Capı́tulo 3. Desarrollo de la técnica. Este capı́tulo se refiere al desarrollo del
algoritmo que implementa la técnica de divacks, las variables a ser tomadas en cuenta
y la descripción de su funcionamiento.
1.7 Estructura del Documento
8
Capı́tulo 4. Implementación de la técnica. Comprende la implementación del
algoritmo en lenguaje C en un kernel Linux, se mostrarán los archivos utilizados y
modificados, y se describirá paso a paso cómo se implementará la técnica de divacks
en el kernel.
Capı́tulo 5. Pruebas. Se refiere a la fase de las pruebas de la técnica de divacks,
aquı́ se describirán los escenarios utilizados, las especificaciones de las pruebas y los
resultados obtenidos en cada una.
Capı́tulo 6. Conclusiones y recomendaciones. Se describen las conclusiones
generales basadas en el análisis de los resultados obtenidos en la experimentación,
y se plantean algunas recomendaciones para trabajos futuros.
Capı́tulo 2
Marco Teórico
Para entender cabalmente las propuestas y los experimentos planteados en este
proyecto, es necesario tener conocimiento de algunos conceptos básicos en redes e
Internet. En este capı́tulo se mostrarán estos conceptos con el propósito de aclarar las
ideas expuestas y facilitar la comprensión del proyecto.
2.1.
Protocolo de Control de Transmisión
Abreviado TCP, es uno de las protocolos de capa transporte más utilizado hoy en
dı́a en la Internet, de hecho más del 90 % de los datos en la Internet son transportados
haciendo uso de TCP (Arcia, 2009, p. 21). TCP fue diseñado para proporcionar una
transmisión confiable, garantizando el ritmo de transmisión, el control de la congestión
y el tratamiento de la corrupción, duplicación y reordenamiento de los paquetes.
Como cualquier protocolo de la capa transporte, TCP comunica las aplicaciones de
host distintos, pero también posee ciertas caracterı́sticas que lo diferencia de otros
protocolos:
Es orientado a conexión, eso quiere decir que antes de comenzar la transmisión
de datos los hosts involucrados deben establecer un acuerdo, en el cual intercambian
y establecen los parámetros para asegurar la transferencia de datos. Esta conexión
se realiza mediante un proceso conocido como acuerdo de tres fases (three-way
2.1 Protocolo de Control de Transmisión
10
Figura 2.1: Vida de una conexión TCP
handshake): En la primera fase, el host cliente (receptor) envı́a un segmento especial
que no contiene datos (segmento SYN ) al host servidor (emisor) para hacer la petición
de inicio de la conexión. En la segunda fase, el emisor responde con un segmento
reconociendo la llegada del SYN del receptor (SYN+ACK ). Finalmente, en la última
fase, el receptor envı́a un ACK al emisor y de esta manera queda establecida la
conexión entre ambos. En este punto se han acordado sus los números de secuencia
(identificación de los paquetes) iniciales y se ha reservado espacio para los buffers y
para las variables de la conexión. Luego de esto cualquiera de los dos hosts puede
terminar su conexión mediante el envı́o de un segmento FIN y la recepción del
reconocimiento mediante un ACK, una vez que ambos hosts hacen esto, todos los
recursos son liberados. En la Figura 2.1 se muestra, utilizando diagramas de flechas,
el procedimiento para abrir y cerrar una conexión TCP.
2.1 Protocolo de Control de Transmisión
11
La siguiente caracterı́stica de TCP es su confiabilidad, esto es, TCP garantiza
que los datos serán recibidos de la misma forma como fueron enviados. TCP debe
lidiar con segmentos dañados, perdidos, duplicados o entregados fuera de orden por
la capa IP. Para garantizar el envı́o y recepción correcta de los datos, TCP asigna un
número de secuencia a cada paquete transmitido, de esta manera, cuando al receptor
llega correctamente un paquete de datos, éste envı́a un reconocimiento positivo (ACK)
para notificárselo al emisor. Si el ACK no llega en el intervalo de tiempo de espera
(RTO por sus siglas en inglés: Retransmition Timeout), el emisor asume que el paquete
se perdió, ası́ que, retransmite los datos no reconocidos y duplica el valor del RTO.
Los números de secuencia también son utilizados por el receptor para ordenar los
segmentos recibidos (que pueden llegar de forma desordenada), ası́ como para eliminar
los segmentos repetidos. Cuando el receptor detecta que un paquete ha llegado de forma
desordenada, envı́a ACKs duplicados para avisar al emisor que falta algún segmento,
de esta manera el emisor retransmite el segmento faltante y reduce la ventana de
congestión (cwnd ) para disminuir el ritmo de envı́o de datos.
Cuando hay alguna pérdida, el receptor envı́a 3 (tres) ACKs duplicados. El
emisor TCP toma estos tres ACKs como señal de que la pérdida de un paquete ha
ocurrido y utiliza el algoritmo de retransmisión rápida (fast retransmit) para enviar
el segmento perdido sin esperar a que el RTO expire. Luego que el algoritmo de
retransmisión rápida envı́a el segmento perdido, el emisor aumenta el tamaño de la
cwnd y continua enviado nuevos segmentos en una fase llamada recuperación rápida
(fast recovery) hasta la llegada de un ACK no duplicado que reconoce un nuevo
segmento (Allman et al., 2009).
Otra de las caracterı́sticas importantes de TCP es el control de flujo (flow
control ), éste es un método para lograr que un receptor “lento” pueda tratar con
un emisor “rápido” sin saturarse. El receptor TCP controla la cantidad de datos
que el emisor puede enviar mediante el envı́o de una ventana (receiver window o
rwnd ) en cada ACK, indicando el espacio disponible en el buffer de recepción, esto
permite al emisor saber cuantos segmentos puede enviar sin esperar por un nuevo
reconocimiento (ACK), éste es el mecanismo de ventana deslizante (sliding window ).
2.2 Control de la congestión: Slow Start y Congestion Avoidance
12
El receptor también puede anunciar una rwnd de tamaño 0 (cero), deteniendo la
transmisión cuando se encuentra saturado, en este momento el emisor entra en modo
de persistencia. A partir de aquı́ el emisor enviará regularmente paquetes pequeños
hasta recibir un ACK con el nuevo tamaño de la rwnd, Postel (1981) recomienda que
el envı́o de estos paquetes sea cada dos minutos.(p. 42)
El control de la congestión permite hacer un uso eficiente de la red, es
decir, realizar grandes envı́os de paquetes cuando hay ancho de banda disponible y
decrementar el ritmo de envı́o cuando se detecta congestión en la red. Para el control
de congestión, TCP también utiliza un mecanismo basado en ventana (ventana de
congestión, en inglés congestion window o cwnd ). El emisor TCP incrementará el
ritmo de envı́o de segmentos mediante el aumento del tamaño de la cwnd, cuando se
detecta congestión en la red (generalmente cuando ocurren pérdidas de paquetes), se
reduce el tamaño de la cwnd.
2.2.
Control de la congestión: Slow Start
y
Congestion Avoidance
TCP controla la cantidad de datos que entran en la red con la intención de
evitar la congestión. Para esto juegan un papel importante la ventana de congestión
(cwnd ) y la ventana anunciada (rwnd ) pues la menor entre las dos será la que regirá la
transmisión de datos.
El control de congestión es llevado a cabo por una serie de algoritmos corriendo
en el emisor, en implementaciones modernas de TCP son 4 (cuatro) estos algoritmos:
slow start, congestion avoidance, fast retransmit y fast recovery. Para este proyecto es
de fundamental importancia conocer el funcionamiento de los dos primeros. Entonces
debemos definir una nueva variable, el umbral de slow start (en inglés slow start
threshold o ssthresh), éste determina cual algoritmo utilizar en cualquier momento de
la trasmisión (slow start o congestion avoidance).
2.2 Control de la congestión: Slow Start y Congestion Avoidance
13
Figura 2.2: Comportamiento de la cwnd en slow start
2.2.1.
Algoritmo Slow Start
El algortimo slow start es utilizado cuando cwnd es menor a ssthresh,
generalmente al inicio de una transmisión o luego de recuperar una pérdida detectada
por el temporizador de retransmisión (RTO). La función de slow start consiste en
comenzar enviando un volumen de datos pequeño, que se irá aumentando hasta que
la red se sature, en cuyo caso se reducirá la tasa de envı́o para reducir la saturación.
Todo esto con el fin de medir la capacidad de la red y ası́ fijar el ssthresh.
Durante slow start la cwnd se incrementa de forma exponencial, en a lo sumo
SMSS
1
bytes por cada ACK recibido que reconoce nuevos datos. Slow start finaliza
cuando cwnd supera al ssthresh (o cuando lo alcanza) o cuando se detecta congestión
por la pérdida de algún segmento (Allman et al., 2009). En la Figura 2.2 se muestra
el crecimiento exponencial de la cwnd durante la fase de slow start.
1
Sender Maximum Segment Size, es el tamaño máximo que un segmento puede tener durante la
vida de una conexión, generalmente 1500 bytes.
2.3 Envı́o de ACKs: Delayed-ACK y divacks
14
Figura 2.3: Comportamiento de la cwnd en congestion avoidance
2.2.2.
Algoritmo Congestion Avoidance
Una vez que cwnd alcanza o supera al ssthresh, se pone en funcionamiento
congestion avoidance, el cual sigue probando la disponibilidad de la red pero de una
manera mucho más cautelosa que en slow start.
Congestion avoidance incrementa la cwnd aproximadamente en un SMSS por
RTT. Esto significa que este algoritmo prueba cautelosamente el buffer del receptor
aumentando en cada RTT un paquete más hasta detectar congestión, entonces se
actualiza el valor de la cwnd a la mitad. Si el motivo de la congestión es debido a que
el RTO expiró, se pondrá el valor de cwnd a un SMSS. En la Figura 2.3 se muestra el
crecimiento lineal de la cwnd durante la fase de congestion avoidance.
2.3.
Envı́o de ACKs: Delayed-ACK y divacks
Como se ha mostrado antes los ACKs tienen varias funciones en TCP, pero su
principal objetivo es el de informar al emisor que un segmento ha llegado al receptor
2.3 Envı́o de ACKs: Delayed-ACK y divacks
15
Cliente
Servidor
Data
1:144
A CK
1
Data
8
1449
896
449:2
A CK
2897
Figura 2.4: Envı́o de un ACK por paquete
de forma correcta y ası́ poder descartarlo de la cola de retransmisión. Según esto, por
cada paquete correctamente recibido, el receptor deberı́a enviar un ACK para informar
este evento. La Figura 2.4 es un diagrama de flechas que ejemplifica esta situación,
ası́ ante la llegada del segmento DATA 1:1448 (que contiene los bytes del 1 al 1448) el
receptor responde con el ACK 1449 para indicar que todos los bytes por debajo de este
número han sido correctamente recibidos y 1449 es el siguiente byte que espera recibir.
Cuando el emisor recibe el ACK 1449 sabe que puede eliminar todos los segmentos que
contengan los bytes menores a 1449 de la cola de retransmisión y que debe responder
con el segmento DATA 1449:2896.
2.3.1.
Delayed-ACK
Como ya se ha dicho, los ACKs son acumulativos, de esta manera cuando el
receptor envı́a un ACK significa que ha recibido todos los datos precedentes al número
de secuencia reconocido, siendo ası́, el receptor podrı́a reducir el envı́o de ACKs para
ası́ descongestionar el canal de subida de datos. El envı́o de menos de un ACK por
segmento de datos recibido se conoce como delayed-ACK (ACK retardado).
Según Branden (1989) el receptor TCP puede implementar esta técnica, pero un
2.3 Envı́o de ACKs: Delayed-ACK y divacks
16
Cliente
Servidor
:1448
Data 1
896
449:2
Data 1
ACK 2
897
344
897:4
Data 2
792
345:5
Data 4
ACK 5
793
Figura 2.5: Delayed-ACK, un ACK por cada dos paquetes
ACK no debe retrasarse demasiado (cuando mucho 0.5 segundos) y deberı́a enviarse
un ACK por al menos cada dos segmentos recibidos. (p. 96)
En la Figura 2.5 se muestra con un diagrama de flechas la interacción clienteservidor haciendo uso de delayed-ACK, en este caso un ACK cada dos paquetes
recibidos.
2.3.2.
División de reconocimientos (divacks)
Los algoritmos de control de congestión de TCP están definidos en términos de
segmentos: Durante slow start, TCP incrementa la cwnd en SMSS bytes (1 segmento)
por cada ACK recibido que reconoce un nuevo dato, y durante congestion avoidance,
la cwnd se incrementa en SMSS bytes (1 segmento) por cada RTT. Se puede sacar
provecho de esta caracterı́stica de la siguiente manera:
En lugar de enviar un único ACK por cada paquete de datos recibido, el
receptor puede enviar varios ACKs al emisor, de tal manera que cada uno de estos
ACKs reconozca una parte del paquete de datos recibido.
2.3 Envı́o de ACKs: Delayed-ACK y divacks
17
Cliente
Servidor
Data 1
:1448
ACK 4
83
RTT
ACK 9
65
ACK 1
Data 1
4 49
896
449:2
344
897:4
Data 2
7 92
345:5
Data 4
2 40
793:7
Data 5
Figura 2.6: Técnica de división de ACKs: 3 ACKs por cada paquete de datos.
Esta técnica, conocida como división de ACKs, fue estudiada por primera vez
por Savage et al. (1999). Consiste en dividir cada ACK en varios ACKs, como se
muestra en la Figura 2.6, donde cada uno reconoce una porción del paquete de datos
recibido. Cada ACK es válido ya que reconoce datos que han sido enviados y no han
sido reconocidos aún, por lo tanto, cada uno hace crecer la cwnd según el algoritmo de
control de congestión utilizado (slow start o congestion avoidance).
De ahora en adelante, en este proyecto, llamaremos divack a cada una de la
partes en las que un ACK es dividido (Arcia, 2009). Por lo tanto, a la división de
ACKs la llamaremos la técnica de divacks.
La principal consecuencia de la aplicación de la técnica de divacks es que permite
al emisor incrementar la cwnd a un ritmo mucho mayor que el usual. El número máximo
de divacks en que se podrı́a dividir un ACK serı́a en el cual cada uno reconocerı́a un
único byte del paquete de datos. Esto harı́a crecer la cwnd a un valor exageradamente
grande en pocos RTTs, sin embargo, las velocidades de transmisión están delimitadas
por otros factores como el tamaño de la rwnd, el ancho de banda disponible, entre
2.4 Aclaratoria
18
otros.
Aunque se está aumentando el número de ACKs que están circulando en el
camino hacia el emisor (el tráfico de subida), lo que podrı́a ocasionar sus pérdidas, esto
no es de mayor consideración debido a que los ACKs son acumulativos y si se pierde
alguno, al llegar el siguiente, se considerará el segmento que reconocı́a el ACK perdido,
como reconocido.
2.4.
Aclaratoria
Debido a que las transmisiones de datos tratadas en este proyecto son en una sola
dirección, esto es, un host sólo envı́a datos y el otro por tanto sólo recibe. Se utilizarán
indistintamente los términos emisor o servidor para referirse al host que envı́a datos,
y receptor o cliente para referirse al host que los recibe.
2.5.
Kernel Linux
El kernel Linux es un sistema operativo libre tipo Unix. Es usualmente utilizado
junto a las herramientas GNU como interfaz entre los dispositivos de hardware y los
programas usados por el usuario para manejar un computador. A la unión de ambas
tecnologı́as, más la inclusión de algunas otras (como entornos de escritorio e interfaces
gráficas) se le conoce como distribución GNU/Linux. Fue lanzado bajo la licencia
pública general de GNU y es desarrollado gracias a contribuciones provenientes de
colaboradores de todo el mundo, por lo que es uno de los ejemplos más notables de
software libre. La versión del kernel con la que se trabajará este proyecto es la 2.6.35.7
2.5.1.
Implementación de TCP en el kernel Linux v2.6.35.7
Todos los detalles de implementación de TCP en Linux están visibles y
explicados en su código fuente. La parte relacionada con TCP en IPv4 está en el
directorio net/ipv4/. Los archivos que son de interés para el estudio son tcp input.c
y tcp output.c.
2.5 Kernel Linux
19
tcp input.c:
Es la porción de código que maneja la recepción de los paquetes TCP
provenientes de la red. Según el estado de la conexión TCP se tratan los paquetes
entrantes. Si la conexión ya está establecida, es decir, el estado de la conexión es
TCP ESTABLISHED, el paquete es tratado por la función tcp rcv established() la
cual distingue 2 tipos de tratamiento:
Camino rápido:
• Se recibe un ACK puro en reconocimiento de los datos recientemente
enviados (no un ACK duplicado).
• Se recibe un segmento con los datos que se esperan a continuación (segmento
en orden).
Camino lento:
• Se recibe un segmento con las banderas de SYN, URG, FIN o RST activadas.
• Llega un segmento fuera de orden o un segmento retransmitido.
• Llega un mensaje indicando ventana cero (el receptor no puede recibir mas).
• Se reciben segmentos con opciones inesperadas.
Si se está en el camino rápido, la longitud del segmento se compara con la longitud de
la cabecera de un paquete TCP con el fin de distinguir si se trata de un ACK puro
(su longitud es igual a la de la cabecera) o un paquete de datos (su longitud es mayor
que la de la cabecera). Los segmentos cuya longitud es menor que la longitud de la
cabecera de un paquete TCP, se desechan.
Si es un ACK puro, es procesado por la función tcp ack() y la función
tcp data snd check() realiza la trasmisión de los datos que estaban esperando para
ser enviados cuando llegara el ACK.
Si es un paquete de datos, estos son esperados (pues estamos en el camino
rápido), entonces, si se puede, se remueve la cabecera TCP, se copia directamente
los datos en la memoria de recepción del proceso, las estadı́sticas de la conexión
son actualizadas y el número de secuencia esperado es actualizado. Si no se puede
2.5 Kernel Linux
20
copiar directamente, se almacena en el buffer hasta que pueda hacerlo. Todo esto
es completado por las funciones tcp event data rcv() y tcp data queue(). Luego
se chequea que tipo de reconocimiento es requerido para el paquete mediante
la función
tcp ack snd check(). Dicha función efectúa el llamado a la función
tcp send delayed ack() si se requiere un ACK retrasado o directamente a la función
tcp send ack() si se requiere un ACK sin retraso; estas dos últimas funciones se
especifican en tcp output.c.
Si se está en el camino lento con la función tcp sequence() se comprueba si el
paquete llegó fuera de orden, en cuyo caso afirmativo se activa el modo de QuickACK
para enviar reconocimientos lo más rápido posible. Si la bandera de RST está activa
se llama a la función tcp reset() que reinicia la conexión (cambia el estado de la
conexión a CLOSED, desactiva los temporizadores y libera el buffer del socket). Si la
bandera de SYN está activa indica un error pues se esta en el estado ESTABLISHED,
entonces se reinicia la conexión con la llamada a la función tcp reset(). Si la bandera
de URG está activa se procesa con la función tcp urg().
tcp output.c:
Es la porción de código que maneja el envı́o de los paquetes TCP a la
red. Para el estudio, la función de interés es tcp send ack() pues es la encargada
de construir y enviar los reconocimientos. Para ello, solicita un socket buffer y
asigna los valores correspondientes a este buffer. Posteriormente, se utiliza la función
tcp transmit skb() para terminar de llenar la cabecera del segmento TCP y
transmitirlo a la capa de red.
Cuando se trata del envı́o de ACKs retrasados, la función encargada de
manejarlos es tcp send delayed ack() la cual chequea y ajusta los tiempos de
transmisión y al momento de transmitir el ACK llama a la función tcp send ack()
antes mencionada. La función encargada de solicitar la conexión es tcp connect() la
cual envı́a el segmento con el bit SYN activo para solicitar establecer la conexión.
2.5 Kernel Linux
21
tcp.h:
Ubicado en la carpeta /include/linux/ contiene las estructuras de datos
necesarias para manejar el protocolo TCP en el kernel. La estructura de interés para
el estudio fue tcp sock pues es la que contiene los datos del flujo TCP.
2.5.2.
Parámetros TCP
En un sistema en ejecución, varios parámetros de TCP se pueden ver y modificar
mediante los archivos del directorio /proc, por ejemplo /proc/sys/net/ipv4/. Linux
implementa muchos algoritmos de control de congestión: BIC, CUBIC, Westwood,
Reno, H-TCP, y varios más. Desde la versión 2.6.19 se usa por omisión CUBIC con
Reno como segunda opción, por su simplicidad, para el desarrollo de este proyecto se
utilizará Reno como algoritmo de control de la congestión.
TCP Reno
Este algoritmo de control de congestión implementa una fase llamada fast
recovery (recuperación rápida). Esta implementación previene reiniciar la ventana de
congestión después de una retransmisión, por lo que evita entrar en slow start luego
de haber sufrido la pérdida de un solo paquete. En Reno se utiliza el envı́o de ACKs
duplicados para indicar que un paquete que se ha perdido. Una vez que el emisor recibe
tres ACKs duplicados, se entra en fast recovery. En esta fase, el emisor retransmite el
paquete perdido y reduce su ventana de congestión a la mitad (cwnd ), en lugar de
reiniciarla a un SMSS y entrar en slow start como lo hace Tahoe.
Durante fast recovery por cada ACK duplicado recibido, se aumenta la ventana
de congestión y se envı́a un paquete de la ventana de transmisión2 . Cuando se recibe
un ACK que reconoce datos nuevos, el emisor sale de la fase de fast recovery. Reno
representa una mejora con respecto a su antecesor Tahoe cuando se trata con la pérdida
de un solo paquete, ya que evita entrar en slow start. Sin embargo, ya que Reno puede
retransmitir sólo un paquete perdido por RTT, puede presentar problemas cuando trata
2
Ventana que contiene los segmentos a ser enviados, cuyo tamaño es siempre el mı́nimo entre la
cwnd y la rwnd.
2.6 Herramientas de medición y procesamiento de tráfico de red
22
con pérdidas de múltiples paquetes.
2.6.
Herramientas de medición y procesamiento de
tráfico de red
2.6.1.
Wireshark/Tshark
Wireshark es un analizador de protocolos de red, es decir, una herramienta
utilizada para estudiar y desarrollar protocolos y aplicaciones de red (Wikipedia, 2011).
Permite capturar en tiempo real los paquetes que transitan en una red.
Wireshark brinda múltiples opciones de filtrado y organización de la información
capturada. Permite observar, en cada paquete capturado, información de cada capa. Se
puede monitorear el estado de la red en tiempo real o analizar los datos de una traza
almacenada en disco. Wireshark es software libre, y se ejecuta sobre la mayorı́a de
sistemas operativos Unix y compatibles, incluyendo Linux, Solaris, FreeBSD, NetBSD,
OpenBSD, y Mac OS X, ası́ como en Microsoft Windows.
2.6.2.
Tcpprobe
tcp probe es un módulo que permite guardar el estado de una conexión TCP
durante la llegada de nuevos paquetes. Trabaja dentro del proceso de recepción del
kernel (tcp recv) y utiliza kprobe para ver la información TCP de los paquetes (Linux
Fundation, 2009).
Cada vez que un ACK entrante modifica la ventana de congestión (cwnd ), el
módulo tcp probe imprime una lı́nea en el archivo /proc/net/tcpprobe. Cada linea
contiene la siguiente información:
1. Tiempo de recepción del ACK, en segundos.
2. IP del servidor y puerto.
3. IP del cliente y puerto.
4. Cantidad de bytes en el paquete (longitud).
2.6 Herramientas de medición y procesamiento de tráfico de red
5. Número de secuencia del siguiente paquete a ser enviado (snd nxt).
6. Número de secuencia del último paquete no reconocido (snd una).
7. Ventana de congestión (cwnd ).
8. Umbral de slow start (ssthresh).
9. Ventana anunciada (rwnd ).
10. RTT promedio (srtt).
El siguiente es un ejemplo de un archivo generado por tcp probe:
1
3.214453400 192.168.1.104:80 1 9 2 .1 6 8 .1 . 1 0 2: 4 4 39 3 32 0 x6c4f1537
0 x6c4f043f 3 2147483647 262144 62
2
3.214744264 192.168.1.104:80 1 9 2 .1 6 8 .1 . 1 0 2: 4 4 39 3 32 0 x6c4f2087
0 x6c4f09e7 4 2147483647 260736 62
3
3.215095761 192.168.1.104:80 1 9 2 .1 6 8 .1 . 1 0 2: 4 4 39 3 32 0 x6c4f2bd7
0 x6c4f0f8f 5 2147483647 259328 62
4
3.466880456 192.168.1.104:80 1 9 2 .1 6 8 .1 . 1 0 2: 4 4 39 3 32 0 x6c4f3727
0 x6c4f1537 6 2147483647 257920 62
5
3.467196414 192.168.1.104:80 1 9 2 .1 6 8 .1 . 1 0 2: 4 4 39 3 32 0 x6c4f4277
0 x6c4f1adf 7 2147483647 260032 62
6
3.467548234 192.168.1.104:80 1 9 2 .1 6 8 .1 . 1 0 2: 4 4 39 3 32 0 x6c4f4dc7
0 x6c4f2087 8 2147483647 260032 62
7
3.469590960 192.168.1.104:80 1 9 2 .1 6 8 .1 . 1 0 2: 4 4 39 3 32 0 x6c4f5917
0 x6c4f262f 9 2147483647 260032 62
8
...
Cuadro 2.1: Archivo generado por tcp probe.
23
2.7 Conclusión
2.7.
24
Conclusión
En este capı́tulo se mostraron las caracterı́sticas relevantes de TCP y los
algoritmos principales que utiliza, como para el tratamiento de la congestión (slow
start y congestion avoidance), el inicio y fin de las conexiones (acuerdo de tres fases),
el manejo de las pérdidas de datos (fast recovery), entre otros.
Finalmente se discutió, en términos generales, sobre el kernel Linux, sobre
los archivos y funciones que serán modificadas, utilizadas y agregadas para lograr
implementar la técnica de divacks, ası́ como los parámetros TCP con los que se
trabajará y las herramientas que serán utilizadas a lo largo de este estudio.
Capı́tulo 3
Desarrollo de la técnica
A través del uso de divacks podemos aumentar el ritmo de envió de datos hacia
el receptor TCP, tan solo haciendo algunos cambios en los extremos de la conexión. En
este capı́tulo se describirá detalladamente la técnica de divacks, y se mostrará de manera
general el algoritmo que será implementado en el kernel Linux v2.6.35.7, explicando
y señalando las variables a ser tomadas en cuenta y los casos en los cuales el uso de
divacks es apropiado.
3.1.
División de ACKs
Cada segmento TCP es descrito por un campo para el número de secuencia (en
el caso de los datos) y un campo para el número de reconocimiento (en el caso de los
ACKs). El número de secuencia marca el primer byte del flujo de bytes que el emisor
está enviando al receptor en ese segmento, por lo tanto también indica la cantidad de
bytes que ya se han enviado en una conexión TCP (el número de secuencia es igual al
número de bytes que ya se han transmitido + 1). El número de reconocimiento se utiliza
para que el receptor pueda indicar al emisor cuáles bytes ha recibido correctamente,
ası́ si al receptor llega un segmento con el número de secuencia s, que contiene n bytes,
éste enviará un ACK con número de reconocimiento s+n+1 indicando que ha recibido
correctamente s+n bytes y que espera por el s+n+1. De esta manera TCP garantiza
la confiabilidad de los datos. Por otro lado, los algoritmos de control de congestión de
3.1 División de ACKs
26
TCP están definidos en términos de segmentos en lugar de bytes. El comportamiento
del control de congestión de TCP, definido en (Allman et al., 2009, p. 5), establece:
Durante slow start, TCP incrementa la cwnd a lo sumo en SMSS bytes por
cada ACK recibido que reconoce nuevos datos.
...
Durante congestion avoidance, la cwnd es incrementada aproximadamente
SMSS bytes por round-trip time (RTT).
Esta caracterı́stica de la implementación de TCP permite aumentar la velocidad
con la que crece la cwnd de la siguiente manera:
Cuando recibe un paquete de datos, el receptor TCP puede, en lugar de enviar
un ACK que lo reconozca por completo, enviar varios ACKs (divacks) al emisor, donde
cada uno reconozca una parte del paquete de datos recibido. Cada divack es válido ya
que cubre datos que fueron enviados y no han sido previamente reconocidos, por lo
tanto cada divack provoca la actualización de la cwnd.
En la Figura 3.1 se muestra un ejemplo de la técnica de divacks, donde el
receptor envı́a tres divacks por cada paquete de datos recibido. Al recibir el paquete
con número de secuencia 1 que contiene 1448 bytes, el receptor envı́a un divack
reconociendo los primeros 1446 bytes y los siguientes dos divacks señalando la llegada
de un nuevo byte cada uno. Al final, mediante el envı́o de los tres divacks se han
reconocido los 1448 bytes del paquete recibido, pero se ha actualizado el valor de la
cnwd tres veces.
El uso de la técnica de divacks ocasiona en el emisor TCP un aumento del
tamaño de la cwnd a un ritmo mucho más acelerado que el normal. El receptor puede
controlar este ritmo de crecimiento mediante la división arbitraria de los ACKs, hasta
un máximo de un divack por byte recibido. En este limite, teóricamente se harı́a crecer
la cwnd a un valor exageradamente grande en pocos RTTs, sin embargo, las velocidades
de transmisión son delimitadas también por otros factores como el tamaño de la rwnd,
el ancho de banda disponible en la red, el tamaño del buffer de transmisión, entre otros.
3.2 Descripción del Algoritmo
27
Cliente
Servidor
Data 1
:1448
ACK 1
4 47
ACK 1
4 48
ACK 1
4 49
Data 1
RTT
896
449:2
344
897:4
Data 2
7 92
345:5
Data 4
2 40
793:7
Data 5
Figura 3.1: Ejemplo de la técnica de divacks.
3.2.
Descripción del Algoritmo
Como ya se ha explicado, el objetivo esta técnica es dividir los ACKs salientes
del receptor, en los llamados divacks, de tal manera que cada uno reconozca una parte
del paquete recibido. Una manera de hacer esto es realizando un bucle en la zona del
código donde TCP forma el ACK y lo envı́a, de tal manera que en el momento de
enviar un ACK, nuestro receptor modificado envı́e tantos como se hayan especificado.
Para poder llevar a cabo este proceso se debe verificar que no se
esté interrumpiendo o alterando ningún otro mecanismo de TCP y que los divacks
enviados serán recibidos y aceptados como válidos por el emisor. Por eso existen ciertas
variables y comportamientos que deben ser tomados en cuenta.
3.2 Descripción del Algoritmo
3.2.1.
28
Variables implicadas en la formación de los divacks
Entre estas variables, la primera en ser mencionada debe ser rcv nxt, la cual
almacena el primer byte del próximo paquete de datos que se espera recibir. Cuando
se envı́a un ACK, éste tiene como número de secuencia a rcv nxt, de esta manera se
informa al emisor que todos los bytes anteriores a este número de secuencia han sido
correctamente recibidos y se desea recibir datos nuevos a partir de este byte. Por lo
tanto esta es la variable que debemos manipular para informar el reconocimiento de
cada parte del paquete recibido.
También es importante mencionar a snd nxt y snd una, que representan
respectivamente el primer byte del próximo paquete que será enviado y el primer
byte de aquellos que no han sido reconocidos aún. Estas variables se utilizan para
la validación de los ACKs, de esta manera, el número de secuencia del divack no puede
ser mayor que snd nxt porque ese paquete aún no ha sido enviado, y no puede ser
menor que snd una porque esos datos ya han sido reconocidos.
En la Figura 3.2, los números superiores e inferiores indican el byte inicial y
final de cada paquete, respectivamente. Utilizando este ejemplo, el valor de rcv nxt en
el receptor, cuando llega el último paquete enviado, deberı́a ser el mismo que snd nxt.
snd_una
1449
2897
2896
snd_nxt
4345
4344
5793
5792
7240
Segmento enviado
no reconocido
Segmento no enviado
Figura 3.2: Valores de snd nxt y snd una en el emisor.
Una última variable a tomar en cuenta es sysctl tcp divack, la cual es
implementada en este proyecto con el fin de poder controlar la cantidad de divacks
que se debe enviar en cualquier momento. Es a través de sysctl tcp divack que
se maneja el aumento o reducción del ritmo de envió de divacks, e incluso el poder
desactivarlos.
3.2 Descripción del Algoritmo
3.2.2.
29
Mecanismos afectados por los divacks
Como se ha explicado en capı́tulos anteriores, a pesar de que la función principal
de los ACKs es reconocer la correcta llegada de los datos al receptor, TCP los utiliza
también con otros objetivos. Es en estos casos donde se debe evaluar si es efectivo
enviar divacks, o si por el contrario interrumpen el proceso.
TCP es orientado a conexiones. En la segunda etapa de el acuerdo de tres
fases (three-way handshake), para el inicio de una conexión, el receptor debe enviar
un reconocimiento a un segmento SYN+ACK para establecer la conexión. Al terminar
la transmisión de datos es necesario finalizar la conexión, en esta última fase, luego
de recibir un segmento FIN, es necesario responder con un ACK para que los recursos
de la conexión puedan ser liberados. En ambos casos el ACK reconoce una petición
para cambiar el estado de la conexión, estos ACKs son llamados ACKs de control y no
reconocen datos, por este motivo no se deben enviar divacks.
En el momento de detectar algún error en la llegada de los paquetes, el receptor
utiliza los llamados dup-ACKs (ACKs duplicados) para avisarle al emisor de este error.
Cuando el emisor recibe 3 (tres) ACKs duplicados, debe reenviar el paquete solicitado
sin esperar a que el RTO expire (Allman et al., 2009). Ası́, el envió de divacks en esta
situación solo entorpecerı́a el mecanismo.
De lo descrito anteriormente concluimos que los divacks deben estar limitados a
ser enviados únicamente como respuesta a la llegada de paquetes que contienen nuevos
datos, por esta razón es importante desactivarlos en los casos donde esto no ocurra.
3.2.3.
Presentación del algoritmo
Una vez descrito el funcionamiento de los divacks, ası́ como las variables y los
mecanismos importantes, podemos finalmente mostrar de manera general el algoritmo
de formación y envı́o de los divacks.
El algoritmo mostrado en el Cuadro 3.1 toma el número de secuencia del ACK
y lo almacena en una variable (seq original) para usarlo como referencia para la
asignación del número de secuencia de cada divack. En un bucle que se repetirá tantas
3.2 Descripción del Algoritmo
30
veces como divacks se enviarán (n), se forma y envı́a cada divack. El primer divack
tendrá como número de secuencia:
seq original - n
los siguientes n-1 divacks les será asignado el número de secuencia del divack anterior
+ 1, es decir, reconocerán un nuevo byte cada vez. Finalmente, al salir del bucle, se
envı́a el full-ACK 1 que reconoce el último byte recibido y señala el siguiente byte que
se espera recibir, con el número de secuencia seq original, es decir, el número de
secuencia del ACK original.
Cabe destacar que, en el caso de que la técnica de divacks esté desactivada
(sysctl tcp divack=0), el número de secuencia del ACK no será modificado y no se
entrará en el bucle, por lo que solo se enviará el ACK que reconoce todo el paquete.
Ası́ garantizamos que al desactivar la técnica de divacks, se utiliza el envı́o normal de
un ACK por paquete de datos sin alteración.
1
Full-ACK, es un ACK o el divack que reconoce por completo el paquete recibido.
3.2 Descripción del Algoritmo
1
/* Validamos que el ACK es en respuesta a la llegada de un
paquete de datos */
2
S i ( Segmento contiene datos && Segmento no tiene errores )
entonces
3
4
/* Si es necesario enviar un ack */
5
seq_original = paquete . rcv_nxt
6
7
/* Cambiamos el numero de secuencia del ACK de tal manera
que este entre snd_nxt y snd_una */
8
paquete . rcv_nxt -= sy sctl_t cp_div ack
9
10
Repita mientras ( paquete . rcv_nxt < seq_original )
/* Formamos y enviamos el divack con el nuevo numero de
11
secuencia */
12
envio_ack ( paquete )
13
paquete . rcv_nxt ++
14
/* En este caso cada divack reconoce un byte mas que el
anterior */
15
Fin Repita mientras
16
17
/* Envio del full - ACK */
envio_ack ( paquete )
18
19
Fin S i
Cuadro 3.1: Algoritmo de divacks en el receptor TCP.
31
3.3 Conclusión
3.3.
32
Conclusión
En este capı́tulo se describió el funcionamiento detallado de la técnica de divacks
y como ésta aprovecha una vulnerabilidad que presenta TCP para aumentar el ritmo
de envı́o de datos hacia el receptor. Se mostró de manera general el algoritmo que
será implementado en el kernel Linux, haciendo énfasis en las variables TCP que se
deben tomar en cuenta para la correcta aplicación de la técnica. Igualmente se describe
porqué los divacks solo deben ser usados cuando se ha recibido un paquete de datos
correctamente y que existen mecanismos como el acuerdo de tres fases y los dupACKs, en los que el uso de divacks es perjudicial.
Capı́tulo 4
Implementación de la Técnica
En este capı́tulo se mostrará detalladamente la implementación del algoritmo en
lenguaje C en un kernel Linux v2.6.35.7, en la distribución Ubuntu 9.10. Se explicarán
los algoritmos realizados, describiendo los archivos utilizados y las modificaciones
hechas.
Además se explicarán algunas caracterı́sticas del kernel Linux que nos permitirán
realizar cambios en tiempo de ejecución para evitar compilaciones recurrentes del
kernel. Ası́ como ciertos comportamientos de la implementación de TCP que previenen
el uso de la técnica de divacks.
4.1.
Técnica de control de envı́o de divacks
Cuando se experimenta con el kernel Linux es muy común tener que modificarlo
constantemente de acuerdo a necesidades especı́ficas, y muchas veces esto implica
tener que recompilar el kernel y reiniciar el sistema. En estos casos la mejor idea es
implementar parámetros variables en lugar de constantes. Es posible en Linux modificar
parámetros del kernel en tiempo de ejecución, y una manera de hacerlo es a través
del uso de la interfaz sysctl. Muchas opciones de TCP pueden ser observadas y
modificadas dinámicamente a través de sysctl, como el algoritmo de control de la
congestión (RENO, Cubic, entre otros), el tamaño máximo de la ventana de recepción
(rwnd ), el uso del mecanismo de Conteo Apropiado de Bytes (ABC por sus siglas
4.1 Técnica de control de envı́o de divacks
34
en inglés: Appropriate Byte Counting) y muchos más. Como parte de este proyecto se
propuso crear un parámetro del kernel que permita controlar la cantidad de divacks por
paquete de datos a enviar (ası́ como desactivar el mecanismo en el caso de necesitarlo).
El nombre elegido para este parámetro es tcp divack.
tcp divack entonces permitirá controlar el envı́o de divacks recibiendo como
valor números enteros, donde:
0: Desactiva el mecanismo de envı́o de divacks, es decir, se envı́a un ACK por
paquete de datos.
1: Divide el ACK saliente en dos partes, es decir, se envı́a un divack y el full-ACK.
2: Divide el ACK saliente en tres partes, es decir, se envı́an dos divacks y el
full-ACK.
Y ası́ en adelante hasta SMSS - 1, donde que cada divack y el full-ACK
reconocerı́an un solo byte del paquete de datos.
Los accesos bajo el directorio /proc/sys describen a los parámetros de
configuración del kernel, es decir, /proc/sys es la raı́z del árbol de control del sistema.
Especı́ficamente los parámetros de la implementación de IPv4 están localizados en el
directorio (subárbol) /proc/sys/net/ipv4. Para añadir el nuevo parámetro, es necesario
modificar varios archivos del kernel.
Como cualquier variable, tcp divack debe ser declarada antes de poder ser
usada. Es en el archivo net/ipv4/tcp input.c donde tcp divack será usada, ası́ que
es en ese archivo donde debe declararse (Cuadro 4.1). Se utiliza el prefijo sysctl para
indicar que es un parámetro de control del sistema.
98
i n t sys ctl_tc p_diva ck __read_mostly ;
Cuadro 4.1: Declaración de tcp divack (net/ipv4/tcp intput.c)
El siguiente paso es modificar la estructura de control ctl table ipv4 table[]
definida en el archivo net/ipv4/sysctl net ipv4.c. En esta tabla se especifican el
‘procname’(nombre de la variable en el árbol de control del sistema), la dirección
4.1 Técnica de control de envı́o de divacks
35
de la variable que contiene el dato (‘data’), el tamaño de la variable (‘maxlen’), los
permisos que posee (‘mode’) y la función que la maneja (‘proc handler’). En este caso
(Cuadro 4.2) el ‘procname’(nombre de la variable en el directorio /proc/sys/net/ipv4)
es, como ya se habı́a expuesto, tcp divack, la variable que contiene el dato es la
ya declarada sysctl tcp divack, tiene el tamaño de un entero, para los permisos se
especı́fica que el dueño del archivo es root y que tiene permisos de lectura y escritura,
mientras que el grupo y otros solo tienen permisos de lectura (0644), y por último el
‘proc handler’se asigna a proc dointvec el cual lee y escribe valores enteros desde y
hacia el buffer de usuario.
{
493
. procname = " tcp_divack " ,
494
. data
= & sysctl_tcp_divack ,
495
. maxlen
= sizeof ( int ),
496
. mode
= 0644 ,
497
. proc_handler = proc_dointvec ,
}
498
Cuadro 4.2: ipv4 table[ ] (net/ipv4/sysctl net ipv4.c)
En el archivo include/linux/sysctl.h se definen las interfaces de control del
sistema de Linux, aquı́ se definirá el nombre sysctl a través de un enum (Cuadro 4.3).
428
NET_TCP_divack = 126;
Cuadro 4.3: Definición de nombres sysctl (include/linux/sysctl.h)
Ahora agregamos la variable en la estructura bin net ipv4 table[] del archivo
kernel/sysctl binary.c, en la cual se debe especificar la función de modificación1
(CTL INT para enteros), el nombre sysctl que acabamos de definir y el procname
(Cuadro 4.4).
1
Las funciones de modificación son las encargadas de actualizar el valor de los parámetros de
configuración del kernel.
4.2 Modificaciones en el Servidor
392
36
{ CTL_INT , NET_TCP_divack , " tcp_divack " }
Cuadro 4.4: bin net ipv4 table[ ] (kernel/sysctl binary.c)
Finalmente se agrega sysctl tcp divack (como externa) junto al resto de las
variables sysctl para TCP en el archivo include/net/tcp.h (Cuadro 4.5).
241
extern i n t sys ctl_tc p_diva ck ;
Cuadro 4.5: sysctl tcp divack (include/net/tcp.h)
4.2.
Modificaciones en el Servidor
Nuestro interés para este proyecto en el servidor es conocer el “camino del ACK”,
es decir, lo que sucede desde la llegada de un ACK (y divacks en nuestro caso), hasta
el envı́o de un nuevo paquete de datos en respuesta al ACK recibido.
En la Sección 2.5.1 se explica cómo TCP (en su implementación en Linux)
maneja la llegada de paquetes provenientes de la red una vez que una conexión entre
cliente y servidor es establecida. En la Figura 4.1 se puede observar un diagrama de
flujo con las funciones más relevantes en el proceso de envı́o de un paquete de datos.
Como ya se ha explicado, tcp ack() es la función encargada de lidiar con los
ACKs entrantes. Una vez que el ACK llega al emisor, y se validan sus campos (para
descartar ACKs viejos o inválidos), hay una última validación que determina si este
ACK hace crecer la cwnd, esto es, si el ACK reconoce datos nuevos. Esto se comprueba
en la función tcp clean rtx queue() la cual saca los paquetes reconocidos de la cola
de retransmisión y enciende una bandera (FLAG DATA ACKED) si se reconocieron datos
nuevos. En términos generales ası́ es como trabaja la función tcp clean rtx queue():
1- Toma un paquete de la cola de retransmisión y lo guarda en una estructura skb.
2- Verifica si skb→end seq > tp→snd una (para este momento tp→snd una ya ha
sido actualizado al valor de ack seq), si no es mayor quiere decir que el ACK lo
está reconociendo ası́ que se elimina de la cola de retransmisión, se enciende la
4.2 Modificaciones en el Servidor
37
1.- tcp rcv established()
1.1.- tcp ack()
1.1.1.- tcp clean rtx queue()
tcp skb pcount()
tcp tso acked()
1.1.2.- tcp cong avoid()
1.2.- tcp data snd check()
tcp push pending frames()
tcp push pending frames()
tcp write xmit()
Figura 4.1: Proceso de envı́o de datos ante la llegada de un ACK.
4.2 Modificaciones en el Servidor
38
bandera FLAG DATA ACKED y se regresa a 1 para ver si el ACK recibido reconoce
más de un paquete de datos (como en el caso de los ACKs retrasados).
2.1- Si es cierto (skb→end seq > tp→snd una), es el caso de que un paquete
TSO (TCP Segmentation Offload) no ha sido reconocido por completo
o el ACK no está reconociendo por completo este paquete (el caso
de los divacks) o nada del paquete. Para saber cual de los casos es
verifica si tcp skb pcount(skb) == 1 (entonces no es un paquete TSO)
o si tp→snd una < scb→seq (el ACK no reconoce ningún byte de este
paquete). Si alguna de las estas dos condiciones se cumple, entonces
la función termina. Si era la primera vez en entrar aquı́, la bandera
FLAG DATA ACKED no se encendió y por lo tanto la cwnd no crecerá.
2.2- Si ninguna se cumple, quiere decir que si es un paquete TSO y que el ACK
reconoce una parte. Entonces se llama a la función tcp tso acked() para
saber cuántos paquetes se reconocen.
2.2.1- tcp tso acked() haciendo uso de otras funciones va descartando las
partes del paquete TSO que son reconocidas y comparando con el MSS
(usando tcp current mss()) determina si se ha reconocido un paquete
completo de los que componen al paquete TSO.
2.2.1- En caso de que tcp tso acked() devuelva algún número mayor que
0 (cero) se enciende la bandera FLAG DATA ACKED y se regresa a 1, de lo
contrario se sale.
En la Figura 4.2 se observa como la función tcp clean rtx queue() elimina
paquetes de la cola de retransmisión cuando estos son reconocidos completamente.
Ya explicado el comportamiento de tcp clean rtx queue(), es evidente que los
divacks nunca van a encender la bandera FLAG DATA ACKED, ya que solo reconocen una
parte del paquete de datos y por lo tanto la cwnd no crecerá. Solo cuando llegue el fullACK, que reconoce el paquete de datos completo, dicho paquete será eliminado de la
cola de retransmisión, la bandera FLAG DATA ACKED será encendida y se podrá aumentar
el tamaño de la cwnd. Este mecanismo podrı́a verse como una defensa propia del kernel
Linux contra los divacks.
4.2 Modificaciones en el Servidor
39
Cliente
Cola de Retransmisión
1
1448
1449 2896
2896
4344
snd_una (ack_seq)
cwnd
1449
4
4344
5792
2897
2897 4344
5792
5
Servidor
Data
Data
1:144
1
2
Data
897:4
7240
4345
6
4
Data
5
Data
7
Data
8
Data
8
89 6
449:2
344
345:5
792
240
793:7
241:8
689:1
ACK 1
4
49
ACK 2
8
97
ACK 4
3
45
68 8
01 36
Figura 4.2: Comportamiento de la función tcp clean rtx queue().
Es por esta razón que es necesario realizar algunas modificaciones en el servidor
para eliminar dicha defensa. Una manera sencilla de hacerlo es eliminando la validación
de la bandera FLAG DATA ACKED en la función tcp ack(), de este modo cualquier ACK
(o divack ) válido, es decir, que reconozca todo o parte de un paquete de datos por
el cual se esperaba reconocimiento, activará el llamado al mecanismo de crecimiento
de la cwnd. En el Cuadro 4.6 se encuentra la modificación realizada en el servidor. El
mecanismo encargado del crecimiento de la cwnd es llamado a través de la función
tcp cong avoid(), que depende del algoritmo de control utilizado. En nuestro caso el
algoritmo de control utilizado es TCP RENO, ası́ tcp cong avoid() llama a la función
tcp reno cong avoid() (/net/ipv4/tcp cong.c) la cual, si es posible aumentar la cwnd,
entra en el algoritmo slow-start o congention avoidance (dependiendo del valor de la
cwnd).
4.3 Modificaciones en el Cliente
40
3701
...
3702
i f ( tc p_ ac k_ is _d ub io us ( sk , flag ) ) {
3703
/* Advance CWND , if state allows this . */
3704
/* Eliminamos la validacion de la bandera FLAG_DATA_ACKED
if (( flag & FLAG_DATA_ACKED ) && ! frto_cwnd && */
3705
3706
i f (! frto_cwnd && tcp _m ay _r ai se _c wn d ( sk , flag ) )
3707
tcp_cong_avoid ( sk , ack , prior_in_flight ) ;
tc p _ f a s t r e t r a n s _ a l e r t ( sk , prior_packets - tp - > packets_out ,
3708
flag ) ;
3709
3710
} else {
/* Eliminamos la validacion de la bandera FLAG_DATA_ACKED
3711
if (( flag & FLAG_DATA_ACKED ) && ! frto_cwnd ) */
3712
i f (! frto_cwnd )
3713
tcp_cong_avoid ( sk , ack , prior_in_flight ) ;
3714
3715
}
3716
...
Cuadro 4.6: Modificación
en
el
servidor
de
la
función
tcp ack()
(net/ipv4/tcp input.c).
4.3.
Modificaciones en el Cliente
Finalmente llegamos a la implementación de la técnica de divacks en el kernel
linux. El mecanismo de envı́o de ACKs se activa ante la llegada de un paquete de datos
esperado (en orden), en la Figura 4.3 se puede observar un diagrama de flujo de las
funciones más relevantes en el proceso de envı́o de un ACK.
Como se explica en la Sección 2.5.1, la función tcp rcv established()
distingue dos tipos de tratamiento: Cámino rápido (fast path) o cámino lento (slow
path). Para resumir, se está en fast path cuando se recibe un ACK puro que reconoce
un paquete de datos o un paquete de datos en orden, sino, se estará en slow path.
Esta distinción es muy importante porque como se explica la Subsección 3.2.2, solo nos
interesa activar el uso de divacks para responder la llegada de paquetes que contienen
4.3 Modificaciones en el Cliente
41
1.- tcp rcv established()
1.1.- tcp data queue()
1.2.- tcp ack snd check()
tcp ack snd check()
tcp send ack()
Figura 4.3: Mecanismo de envı́o de ACKs ante la llegada de un paquete de datos.
nuevos datos, es decir, cuando se esté en fast path. Gracias a esto podemos estar seguros
que el uso de divacks no afectará mecanismos como el envı́o de dup-ACKs o los de inicio
y final de una conexión.
Solo cuando se recibe un paquete datos en orden se llama a la función
tcp ack snd check(), que valida si se puede enviar un ACK y finalmente se llama a la
función
tcp ack snd ack(), la cual decide si enviar un ACK o esperar al envı́o de un
ACK retrasado. Esta es la función que nos interesa y donde implementaremos la técnica
de divacks, en Cuadro 4.7 podemos ver los cambios realizados para incluir el envı́o de
divacks. Lo que se hace es guardar el número de secuencia del ACK (rcv nxt original)
y en lugar de enviarlo, se le resta sysctl tcp divack y se entra en un lazo donde, si
el número de secuencia del ACK es menor a rcv nxt original, se envı́a y aumenta en
uno este número de secuencia. Al salir del lazo se habrán enviado tantos divacks como
lo indica sysctl tcp divack, donde el primer divack reconoce:
tamaño del paquete - sysctl tcp divack
bytes, luego cada divack reconoce solo un nuevo byte del paquete, hasta que finalmente
se envı́a el full-ACK para reconocer por completo el último byte recibido. Cuando la
variable sysctl tcp divack sea cero (0), no se modificará el número de secuencia del
ACK, no se entrará en el lazo y se enviará únicamente el full-ACK que reconocerá todo
el paquete de datos recibido.
4.3 Modificaciones en el Cliente
4916
42
s t a t i c void _ _ tc p _ ac k _ sn d _ ch e c k ( s t r u c t sock * sk , i n t
ofo_possible )
4917
{
4918
s t r u c t tcp_sock * tp = tcp_sk ( sk ) ;
4919
u32 rcv_nxt_original = tp - > rcv_nxt ; // Proyecto divacks
4920
4921
/* More than one full frame received ... */
4922
i f ((( tp - > rcv_nxt - tp - > rcv_wup ) > inet_csk ( sk ) -> icsk_ack .
rcv_mss &&
4923
/* ... and right edge of window advances far enough .
4924
* ( tcp_recvmsg () will send ACK otherwise ) . Or ...
4925
*/
4926
_ _ tc p _ se l e ct _ w in d o w ( sk ) >= tp - > rcv_wnd ) ||
4927
/* We ACK each frame or ... */
4928
t c p _ i n _ q u i c k a c k _ m o d e ( sk ) ||
4929
/* We have out of order data . */
4930
( ofo_possible && skb_peek (& tp - > ou t_ of _o rd er _q ue ue ) ) ) {
4931
tp - > rcv_nxt -= sysctl _tcp_ divack ;
4932
/* Proyecto divacks : Envio de divacks */
4933
while ( tp - > rcv_nxt < rcv_nxt_original ) {
4934
tcp_send_ack ( sk ) ;
4935
tp - > rcv_nxt ++;
4936
}
4937
/* Envio del full - ACK */
4938
tcp_send_ack ( sk ) ;
} else {
4939
/* Else , send delayed ack . */
4940
t c p _ s e n d _ d e l a y e d _ a c k ( sk ) ;
4941
}
4942
4943
// Proyecto divacks
}
Cuadro 4.7: Implementación de la técnica de divacks en el receptor TCP
(net/ipv4/tcp input.c)
4.4 Limitación de los divacks
4.4.
43
Limitación de los divacks
Luego de algunas pruebas realizadas, se pudo notar algunos problemas con la
implementación de la técnica de divacks. Uno de estos problemas era que no todos los
divacks que llegaban al emisor estaban haciendo efecto, esto es, no hacian crecer la
cwnd y no provocaban el envı́o de nuevos datos.
Para estudiar porqué no todos los divacks estaban haciendo efecto en el emisor
TCP, se realizaron algunas modificaciones al kernel Linux del lado del servidor, las
cuales permiten ver qué ocurre desde la llegada de un ACK (o divack ), hasta el envı́o
de un paquete de datos en respuesta a éste, a través del buffer circular del kernel.
Estas modificaciones realizadas en el kernel del emisor, ofrecen la siguiente
información:
Número de secuencia del ACK recibido.
Valor de la cwnd y del slow-start thresshold.
Si no se pudo aumentar el tamaño de la cwnd, imprime el motivo.
El espacio libre en la cwnd para enviar paquetes.
Si se pudo enviar un paquete, imprime el mensaje: “Envio exitoso”.
Si no se pudo enviar un paquete, imprime el motivo.
En el Cuadro 4.8 se muestra parte de la salida generada por una transferencia
TCP utilizando sysctl tcp divack=9. Gracias a esta información se puede ver que
existen principalmente dos eventos que interrumpen el comportamiento esperado de
los divacks. El primero ocurre, cuando habiendo espacio disponible en la cwnd para
enviar nuevos datos, no se envı́a ningún paquete, y aparece el mensaje “Salida
por tcp snd wnd test”. El segundo es observado con la aparición del mensaje
“tcp is cwnd limited”, que ocurre cuando la cwnd no crece con la llegada del ACK.
4.4 Limitación de los divacks
1
[1300.533052] Espacio libre en cwnd: 3
2
[1300.533056] S a l i d a por tcp_nagle_test
3
[1300.533071] Espacio libre en cwnd: 3
4
[1300.533085] Envio e x i t o s o
5
[1300.533087] S a l i d a por push_one
6
[1300.533091] Espacio libre en cwnd: 2
7
[1300.533099] Envio e x i t o s o
8
[1300.533101] S a l i d a por push_one
9
[1300.533105] Espacio libre en cwnd: 1
44
10
[1300.533111] Envio e x i t o s o
11
[1300.785075] DIVACK: 4223935476 cwnd: 4 thresshold : 2147483647
( normal )
12
[1300.785079] Espacio libre en cwnd: 1
13
[1300.785088] Envio e x i t o s o
14
[1300.786385] DIVACK: 4223935477 cwnd: 5 thresshold : 2147483647
( normal )
15
[1300.786388] Espacio libre en cwnd: 1
16
[1300.786395] Envio e x i t o s o
17
[1300.786856] DIVACK: 4223935478 cwnd: 6 thresshold : 2147483647
( normal )
18
[1300.786859] Espacio libre en cwnd: 1
19
[1300.786866] Envio e x i t o s o
20
[1300.787097] DIVACK: 4223935479 cwnd: 7 thresshold : 2147483647
( normal )
21
[1300.787100] Espacio libre en cwnd: 1
22
[1300.787106] Envio e x i t o s o
23
[1300.787238] DIVACK: 4223935480 cwnd: 8 thresshold : 2147483647
( normal )
24
[1300.787241] Espacio libre en cwnd: 1
25
[1300.787244] S a l i d a por tcp_snd_wnd_test
26
[1300.787402] DIVACK: 4223935481 cwnd: 9 thresshold : 2147483647
( normal )
4.4 Limitación de los divacks
27
[1300.787405] Espacio libre en cwnd: 2
28
[1300.787407] S a l i d a por tcp_snd_wnd_test
29
[1300.787520] DIVACK: 4223935482 cwnd: 10 thresshold :
2147483647 ( normal )
30
[1300.787523] Espacio libre en cwnd: 3
31
[1300.787525] S a l i d a por tcp_snd_wnd_test
32
[1300.787693] DIVACK: 4223935483 cwnd: 11 thresshold :
2147483647 ( normal )
33
[1300.787696] Espacio libre en cwnd: 4
34
[1300.787698] S a l i d a por tcp_snd_wnd_test
35
[1300.787926] DIVACK: 4223935484 cwnd: 12 thresshold :
2147483647 ( normal )
36
[1300.787929] Espacio libre en cwnd: 5
37
[1300.787931] S a l i d a por tcp_snd_wnd_test
38
[1300.788131] DIVACK: 4223935485 cwnd: 13 thresshold :
2147483647 ( normal )
39
[1300.788135] Espacio libre en cwnd: 7
40
[1300.788137] S a l i d a por tcp_snd_wnd_test
41
[1301.038140] DIVACK: 4223936924 cwnd: 13 thresshold :
2147483647 ( normal )
42
[1301.038144] t c p _i s _ cw n d _l i m it e d max_burst : 3
sysc tl_reo rderin g : 3
43
[1301.041806] DIVACK: 4223936925 cwnd: 13 thresshold :
2147483647 ( normal )
44
[1301.038447] t c p _i s _ cw n d _l i m it e d max_burst : 3
sysc tl_reo rderin g : 3
45
[1301.038451] DIVACK: 4223936926 cwnd: 13 thresshold :
2147483647 ( normal )
46
[1301.038788] t c p _i s _ cw n d _l i m it e d max_burst : 3
sysc tl_reo rderin g : 3
47
[1301.038792] DIVACK: 4223936927 cwnd: 13 thresshold :
2147483647 ( normal )
45
4.4 Limitación de los divacks
48
46
[1301.039604] t c p _i s _ cw n d _l i m it e d max_burst : 3
sysc tl_reo rderin g : 3
49
[1301.039607] DIVACK: 4223936928 cwnd: 13 thresshold :
2147483647 ( normal )
50
[1301.042007] t c p _i s _ cw n d _l i m it e d max_burst : 3
sysc tl_reo rderin g : 3
51
[1301.042008] DIVACK: 4223936929 cwnd: 14 thresshold :
2147483647 ( normal )
52
[1301.042043] Espacio libre en cwnd: 8
53
[1301.042044] Envio e x i t o s o
54
[1301.042047] Espacio libre en cwnd: 7
55
[1301.042052] Envio e x i t o s o
56
[1301.042055] S a l i d a por push_one
57
[1301.042059] Espacio libre en cwnd: 6
58
[1301.042063] S a l i d a por tcp_snd_wnd_test
59
...
Cuadro 4.8: Mensajes de depuración del kernel.
El mensaje “Salida por” se muestra cuando estamos en la función que
escribe los paquetes en la red (tcp write xmit()), pero salimos de dicha función
antes de enviar alguno. En este caso, el motivo de la salida es que falla la prueba
tcp snd wnd test(). Esta función verifica si hay espacio suficiente en la rwnd para
recibir al menos el siguiente paquete de datos.
Según Postel (1981), anunciar una rwnd muy grande puede alentar transmisiones
tan grandes que podrı́a superarse la cantidad de datos que pueden ser aceptados por el
receptor y muchos datos serı́an descartados. Por el contrario, anunciar una rwnd muy
pequeña puede restringir la transmisión de datos haciéndola muy lenta. Tratando de
evitar cualquiera de estos problemas, en la implementación de TCP de Linux, con la
llegada de nuevos paquetes de datos continuamente se aumenta el tamaño anunciado
de la rwnd hasta alcanzar el tamaño de real del buffer de recepción.
Adicionalmente Postel (1981) sugiere que ante la llegada de paquetes de datos
pequeños, se debe enviar un ACK sin actualizar la información de la rwnd. Cuando se
4.4 Limitación de los divacks
47
utiliza la técnica de divacks, únicamente el primero de una ráfaga de divacks enviada
reconoce varios bytes de datos, los demás sólo reconocen un byte nuevo cada vez, es
como si reconocieran un segmento pequeño de un byte de longitud. Por lo tanto sólo
el primer divack enviado, de los n que reconocen el paquete recibido, lleva al emisor
información actualizada de la rwnd. Esto ocasiona que el emisor crea que el receptor
no tiene la capacidad de recibir nuevos datos y restringe la transmisión de nuevos
paquetes.
Sabiendo que se van a recibir muchos datos, se puede anunciar todo el espacio
disponible en el buffer de recepción desde el inicio de la trasferencia. Para esto sólo es
necesario eliminar la restricción de la rwnd del receptor. La modificación de código se
muestra en el Cuadro 4.9.
1909
...
/* Eliminando esta validacion el receptor anuncia todo el
1910
espacio disponible en el buffer de recepcion cada vez */
/* if ( free_space > tp - > rcv_ssthresh )
1911
free_space = tp - > rcv_ssthresh ; */
1912
1913
...
Cuadro 4.9: Modificación en el cliente de la función
tcp select window()
(net/ipv4/tcp output.c)
Como
ya
se
comentó,
el
segundo
evento
que
interrumpe
el
comportamiento esperado de los divacks, se observa con la aparición del
mensaje “tcp is cwnd limited”. Este mensaje se muestra cuando la función
tcp is cwnd limited() devuelve 1 dentro de tcp reno cong avoid(), que es la
la función que implementa el algoritmo de control de congestión Reno en Linux.
tcp is cwnd limited() verifica si la transferencia de datos está limitada por la
aplicación, o por limitada por la red según el RFC 2861. Se dice que el envı́o de datos
está limitado por la red, cuando la aplicación tiene muchos datos que mandar y por
lo tanto usa, en teorı́a, toda la cwnd. Por otro lado el envı́o de datos está limitado
por la aplicación cuando, habiendo suficiente espacio en la cwnd, ésta no se utiliza por
completo debido a que hay pocos datos a enviar, este es el caso de aplicaciones como
4.4 Limitación de los divacks
48
telnet (Handley et al., 2000).
En el caso de transferencias limitadas por la aplicación no tiene sentido aumentar
el tamaño de la cwnd y de detectar esto se encarga tcp is cwnd limited(). Cuando
se utiliza la técnica de divacks, la relación entre paquetes de datos enviados y ACKs
recibidos es bastante desproporcionada, siendo la cantidad de ACKs mucho mayor. Más
aun, debido a que solo el primer divack posee información actualizada de la rwnd, lo
que evita que se puedan enviar más paquetes de datos (como ya se explicó), se tiene una
cwnd mucho mayor a la utilizada. Debido a esto, la función tcp is cwnd limited()
detecta (erróneamente) que la transferencia está limitada por la aplicación y no permite
que la cwnd crezca más.
Como se sabe que se van a transmitir muchos datos, y que definitivamente la
transferencia está limitada por la red y no por la aplicación, se puede eliminar la
validación realizada por la función tcp is cwnd limited() en el emisor, quedando el
código como se muestra en el Cuadro 4.10.
360
361
void t c p_ r e no _ c on g _ av o i d ( s t r u c t sock * sk , u32 ack , u32
in_flight )
362
{
s t r u c t tcp_sock * tp = tcp_sk ( sk ) ;
363
364
/* Eliminamos la validacion , sabemos que necesitamos enviar
365
muchos datos */
/* if (! t cp _ i s_ c w nd _ l im i t ed ( sk , in_flight ) )
366
return ; */
367
368
...
Cuadro 4.10: Modificación en el servidor de la función tcp reno cong avoid()
(net/ipv4/tcp input.c)
4.5 Compilación del kernel
4.5.
49
Compilación del kernel
Todas las pruebas realizadas en este proyecto se hicieron usando el kernel Linux
v.2.6.35.7 sobre Ubuntu 9.10, por lo tanto es necesario descargar las fuentes de dicho
kernel (http://www.kernel.org) y compilarlo en nuestros host de prueba. Una vez
realizados todos los cambios anteriormente explicados en los archivos del kernel nuevo
debemos configurarlo y compilarlo.
Por lo general algunos paquetes necesarios para la compilación del kernel no
están instalados, para asegurarse se realiza:
# Resolucion de dependiencias :
~ $ sudo aptitude install build - essential libncurses5 - dev
Se copian y descomprimen las fuentes del kernel en el directorio /usr/src y se
crea un enlace simbólico a él:
~ $ sudo cp ~/ Descargas / linux -2.6.35.7. tar . bz2 / usr / src /
~ $ cd / usr / src
/ usr / src$ sudo tar - xvf linux -2.6.35.7. tar . bz2
/ usr / src$ sudo ln -s linux linux -2.6.35.7/
Para la configuración del kernel nuevo podemos usar la configuración del kernel
actual como base.
# Buscar la configuracion del kernel actual y copiarla :
/ usr / src$ uname -r
/ usr / src$ sudo cp / boot / config - ‘ Kernel - actual ’ linux /. config
Ahora ejecutamos uno de los menú de configuración gráfica del kernel:
/ usr / src$ cd linux
/ usr / src / linux$ sudo make menuconfig
En esta interfaz activar TCP RENO como algoritmo de control de congestión
por omisión, en la Figura 4.4 se muestra la ruta en la interfaz gráfica donde se modifica
4.5 Compilación del kernel
50
Networking support
Networking options
TCP: advanced congestion control
Default TCP congestion control
Figura 4.4: Ruta para activar algoritmo de control de congestión por omisión.
Figura 4.5: Captura de pantalla menuconfig: Selección del algoritmo de control de
congestión.
este campo. En la Figura 4.5 se muestra una captura de pantalla del menú de elección
del algoritmo de congestión por omisión. Esta modificación debe hacerse en el host
servidor.
4.5 Compilación del kernel
51
Finalmente se muestran los pasos para la compilación del kernel:
# Compilacion del kernel ( - jn para usar varios procesadores ,
donde n : numero de precesadores + 1) :
/ usr / src$ sudo make - j3
# Instalacion de los modulos :
/ usr / src$ sudo make modules_install - j3
# Agregamos la imagen generada por la compilacion en el
directorio / boot
/ usr / src$ sudo make install
# Generacion de archivos de arranque
/ usr / src$ sudo update - initramfs -c -k 2.6.35.7
# Los modulos quedaran instalados en / lib / modules /2.6.35.7 , el
kernel y el archivo initrd en / boot / vmlinuz2 .6.35.7 y / boot /
initrd . img -2.6.35.7 respectivamente .
# Actualizacion del grub :
/ usr / src$ sudo update - grub
# $ Reiniciar el equipo
~ $ sudo reboot
Cuadro 4.11: Compilación del kernel.
4.6 Conclusión
4.6.
52
Conclusión
En este capı́tulo se mostraron detalladamente las modificaciones necesarias para
implementar la técnica de divacks en el kernel Linux v.2.6.35.7, en la distribución
Ubuntu 9.10. Desde la descarga de las fuentes del kernel, las modificaciones realizadas
y la configuración y compilación de dicho kernel.
Se explicó el uso de una variable de configuración del kernel para controlar el
envı́o de divacks y se mostró, paso a paso, como agregarla dentro del kernel.
Se demostró la protección que Linux posee contra los divacks y la manera
de desactivarla para la correcta utilización de la técnica de divacks. Finalmente, se
mostró el código que implementa la técnica de divacks y la importancia de su ubicación
en fast path para no interrumpir otros mecanismos que utilizan el envı́o de ACKs y
que el uso de divacks puede afectar.
Capı́tulo 5
Pruebas
Con el objetivo de observar el efecto del uso de divacks en el rendimiento de
TCP, se realizaron diversas pruebas sobre distintas configuraciones y caracterı́sticas de
red. Buscando estudiar el comportamiento de la ventana de congestión (cwnd ) ante
el uso de diferentes cantidades de divacks por paquete de datos y el impacto de este
comportamiento sobre el rendimiento de las transferencias. Finalmente, se buscaba con
estas pruebas comprobar si realmente se pueden obtener mejores tiempos de descarga
a través del uso de la técnica de divacks y bajo qué condiciones la esta técnica expone
los mejores resultados.
En este capı́tulo se mostrarán las pruebas más importantes realizadas,
describiendo de forma detallada su montaje y los resultados obtenidos.
5.1.
Configuración de las pruebas
Antes de empezar cualquier prueba es necesario configurar el cliente y el servidor
de la siguiente manera:
Asegurar que en el servidor está definido Reno como algoritmo de control de
congestión por omisión. Sino definirlo de la siguiente manera:
~ $ sudo sysctl -w net . ipv4 . t c p _ c o n g e s t i o n _ c o n t r o l = reno
5.2 Pruebas sobre red cableada
54
Definir en ‘1’ el parámetro tcp no metrics save. TCP en Linux generalmente
almacena el valor del último umbral Slow Start (ssthresh) medido. Con el
parámetro tcp no metrics save se evita que se guarden valores de conexiones
TCP anteriores, de tal manera que cada prueba se realice bajo las mismas
condiciones y sean independientes unas de otras.
~ $ sudo sysctl -w net . ipv4 . t c p _n o _ me t r ic s _ sa v e =1
En el cliente dependiendo de la prueba, se cambia el valor del parámetro
tcp divack (que por omisión es ‘0’). Llamaremos n al número de divacks
utilizados, esto es, n divacks + full-ACK. De esta manera n podrı́a tener valores
desde 0 (sin divacks), es decir, el envı́o normal de un ACK por paquete de datos.
Hasta SMSS - 1, es decir, que cada divack y el full-ACK reconocerı́an solo un
byte del paquete de datos.
~ $ sudo sysctl -w net . ipv4 . tcp_divack = n
5.2.
Pruebas sobre red cableada
Las primeras pruebas realizadas tienen como objetivo comprobar si realmente
se están enviando n divacks por cada paquete de datos recibido. También determinar
cuándo se envı́a cada divacks para descartar los casos en los que se interrumpe algún
mecanismo que dependa del envı́o normal de ACKs, este es el caso del acuerdo de
tres fases (three-way handshake) para el inicio de la conexión, el envı́o de ACKs
duplicados (dupacks) para alertar pérdidas de paquetes de datos o en el caso de cierre
de la conexión.
Cliente
Servidor
DATA
ACKs
Figura 5.1: Topologı́a simple Cliente-Servidor.
5.2 Pruebas sobre red cableada
55
Se utilizó la topologı́a mostrada en la Figura 5.1, la cual corresponde a
una topologı́a LAN (Local Area Network ) Cliente-Servidor de manera que pudiese
comprobarse el comportamiento deseado de los divacks.
La Figura 5.2 es la captura de pantalla realizada a la traza de una transferencia
TCP en el programa Wireshark. En ella podemos observar proceso de inicio de la
conexión (three-way handshake): El cliente (192.168.1.100) hace la petición de inicio
de conexión enviando un segmento SYN al servidor (192.168.1.103), éste responde
aceptando la conexión enviando un segmento SYN+ACK, finalmente el cliente envı́a
un ACK para completar el inicio de la conexión. También es posible observar el
comportamiento normal de TCP, en este caso n=0 por lo tanto se utiliza el mecanismo
normal de envı́o de un ACK en reconocimiento de cada paquete de datos.
Three-way
Handshake
Primer
paquete
de datos
ACK
Figura 5.2: Captura de pantalla de una traza en Wireshark, sin divacks.
5.2 Pruebas sobre red cableada
56
En el Cuadro 5.1 se muestra una parte del diagrama de flechas generado con
Wireshark, donde se puede ver la parte inicial de la transferencia y el fin de la conexión.
| Time
|
|
|
|
|0 ,000
|
SYN
|
|(46909)
−−−−−−−−−−−−−−−−−−>
192.168.1.100
|
192.168.1.103
|
|
| Seq = 0 Ack = 3 0 6 7 6 0 5 8 6 6
|0 ,000
|
SYN, ACK
|
|(46909)
<−−−−−−−−−−−−−−−−−−
(80)
|
(80)
|
(80)
|
|
| Seq = 0 Ack = 1
|0 ,000
|
ACK
|
|(46909)
−−−−−−−−−−−−−−−−−−>
|
| Seq = 1 Ack = 1
|0 ,000
|
PSH , ACK − Len :
|
|(46909)
−−−−−−−−−−−−−−−−−−>
|0 ,000
|
ACK
|
|(46909)
<−−−−−−−−−−−−−−−−−−
| Seq = 1 Ack = 1
110
(80)
|
(80)
|
|
| Seq = 1 Ack = 111
|0 ,001
|
ACK − Len :
|
|(46909)
<−−−−−−−−−−−−−−−−−−
| Seq = 1 Ack = 111
|0 ,001
|
ACK
|
|(46909)
−−−−−−−−−−−−−−−−−−>
1448
(80)
|
(80)
|
|
| Seq = 111 Ack = 1449
|0 ,001
|
ACK − Len :
|
|(46909)
<−−−−−−−−−−−−−−−−−−
| Seq = 1449 Ack = 111
|0 ,001
|
ACK
|
|(46909)
−−−−−−−−−−−−−−−−−−>
1448
(80)
|
(80)
|
|
| Seq = 111 Ack = 2897
|0 ,001
|
PSH , ACK − Len :
|
|(46909)
<−−−−−−−−−−−−−−−−−−
|0 ,001
|
ACK
|
|(46909)
−−−−−−−−−−−−−−−−−−>
| Seq = 2897 Ack = 111
1448
(80)
|
(80)
|
|
| Seq = 111 Ack = 4345
|0 ,001
|
ACK − Len :
|
|(46909)
<−−−−−−−−−−−−−−−−−−
| Seq = 4345 Ack = 111
|0 ,002
|
ACK
|
|(46909)
−−−−−−−−−−−−−−−−−−>
1448
(80)
|
(80)
|
|
| Seq = 111 Ack = 5793
|0 ,002
|
ACK − Len :
|
|(46909)
<−−−−−−−−−−−−−−−−−−
| Seq = 5793 Ack = 111
|0 ,002
|
ACK
|
|(46909)
−−−−−−−−−−−−−−−−−−>
1448
(80)
|
(80)
|
|
| Seq = 111 Ack = 7241
|0 ,002
|
ACK − Len :
|
|(46909)
<−−−−−−−−−−−−−−−−−−
| Seq = 7241 Ack = 111
|0 ,002
|
ACK
|
|(46909)
−−−−−−−−−−−−−−−−−−>
1448
(80)
|
(80)
|
|
| Seq = 111 Ack = 8689
|0 ,002
|
ACK − Len :
|
|(46909)
<−−−−−−−−−−−−−−−−−−
| Seq = 8689 Ack = 111
1448
(80)
|
(80)
|
...
|0 ,010
|
ACK
|
|(46909)
−−−−−−−−−−−−−−−−−−>
|
| Seq = 111 Ack = 1 0 1 3 6 1
|0 ,010
|
PSH , ACK − Len :
|
|(46909)
<−−−−−−−−−−−−−−−−−−
|0 ,010
|
ACK
|
|(46909)
−−−−−−−−−−−−−−−−−−>
| Seq = 1 0 1 3 6 1 Ack = 111
298
(80)
|
(80)
|
(80)
|
(80)
|
(80)
|
|
|0 ,010
|
FIN , ACK
|
|(46909)
−−−−−−−−−−−−−−−−−−>
| Seq = 111 Ack = 1 0 1 6 5 9
|
|0 ,011
|
FIN , ACK
|
|(46909)
<−−−−−−−−−−−−−−−−−−
| Seq = 111 Ack = 1 0 1 6 5 9
|
|0 ,011
|
ACK
|
|(46909)
−−−−−−−−−−−−−−−−−−>
| Seq = 1 0 1 6 5 9 Ack = 112
|
| Seq = 112 Ack = 1 0 1 6 6 0
Cuadro 5.1: Diagrama de flechas de una transmisión TCP, sin divacks.
5.2 Pruebas sobre red cableada
57
Por otro lado, en la Figura 5.3 se muestra la captura de pantalla realizada a
la traza en el programa Wireshark de una transferencia TCP usando la técnica de
divacks. Es de hacer notar que el proceso de inicio de la conexión no ha sido afectado,
aun cuando los ACKs se están dividiendo en 10 partes (n=9), el cliente realiza sin
cambios el three-way handshake y completa el inicio de la conexión con un solo ACK.
Three-way
Handshake
Primer
paquete
de datos
Divacks
Fullack
Figura 5.3: Captura de pantalla de una traza en Wireshark.
Luego de la llegada del primer paquete de datos al cliente es posible observar el
comportamiento de TCP cuando se usa la técnica de divacks, en este caso con n=9 el
primer divack reconoce hasta el byte 1439 (longitud del paquete - n), los siguientes 8
divacks reconocen un nuevo byte cada vez, hasta que finalmente se envı́a el full-ACK
que reconoce el último byte recibido y señala el primer siguiente byte que se espera
recibir. Puede observarse que el número del full-ACK se corresponde con el número de
5.2 Pruebas sobre red cableada
58
Divacks
Fullack
Fin de la
conexión
Figura 5.4: Captura de pantalla de una traza en Wireshark (Fin de la conexión).
secuencia del siguiente paquete de datos recibido, es decir, el número que un ACK (sin
usar la técnica de divacks) deberı́a tener.
El fin de la conexión tampoco se ve afectado por el uso de los divacks. Como
se puede apreciar en la Figura 5.4, al llegar el último paquete de datos con número de
secuencia 100835, el cliente envı́a la última ráfaga de divacks. Luego se realiza la fase
de cierre de conexión (sin cambios), mediante el intercambio de paquetes FIN y ACK.
El diagrama de flechas de la transferencia TCP con el uso de divacks se muestra
en el Cuadro 5.2. En este tipo diagrama se facilita observar la división que se hace a los
ACKs salientes desde el cliente por cada paquete de datos recibido, también se puede
apreciar como los mecanismos de inicio y fin de la conexión no son alterados.
5.2 Pruebas sobre red cableada
59
| Time
|
|
|
|
|0 ,000
|
SYN
|
|(47674)
−−−−−−−−−−−−−−−−−−>
192.168.1.100
|
192.168.1.103
|
|
| Seq = 0 Ack = 1 2 8 6 4 0 6 5 0 4
|0 ,000
|
SYN, ACK
|
|(47674)
<−−−−−−−−−−−−−−−−−−
(80)
|
(80)
|
(80)
|
|
| Seq = 0 Ack = 1
|0 ,000
|
ACK
|
|(47674)
−−−−−−−−−−−−−−−−−−>
|
| Seq = 1 Ack = 1
|0 ,000
|
PSH , ACK − Len :
|
|(47674)
−−−−−−−−−−−−−−−−−−>
|0 ,000
|
ACK
|
|(47674)
<−−−−−−−−−−−−−−−−−−
| Seq = 1 Ack = 1
110
(80)
|
(80)
|
|
| Seq = 1 Ack = 111
|0 ,001
|
ACK − Len :
|
|(47674)
<−−−−−−−−−−−−−−−−−−
|0 ,001
|
ACK
|
|(47674)
−−−−−−−−−−−−−−−−−−>
| Seq = 1 Ack = 111
1448
(80)
|
(80)
|
(80)
|
(80)
|
(80)
|
(80)
|
(80)
|
(80)
|
(80)
|
(80)
|
(80)
|
|
| Seq = 111 Ack = 1440
|0 ,001
|
ACK
|
|(47674)
−−−−−−−−−−−−−−−−−−>
|
| Seq = 111 Ack = 1441
|0 ,001
|
ACK
|
|(47674)
−−−−−−−−−−−−−−−−−−>
|
| Seq = 111 Ack = 1442
|0 ,001
|
ACK
|
|(47674)
−−−−−−−−−−−−−−−−−−>
|
| Seq = 111 Ack = 1443
|0 ,001
|
ACK
|
|(47674)
−−−−−−−−−−−−−−−−−−>
|
| Seq = 111 Ack = 1444
|0 ,001
|
ACK
|
|(47674)
−−−−−−−−−−−−−−−−−−>
|
| Seq = 111 Ack = 1445
|0 ,001
|
ACK
|
|(47674)
−−−−−−−−−−−−−−−−−−>
|
| Seq = 111 Ack = 1446
|0 ,001
|
ACK
|
|(47674)
−−−−−−−−−−−−−−−−−−>
|
| Seq = 111 Ack = 1447
|0 ,001
|
ACK
|
|(47674)
−−−−−−−−−−−−−−−−−−>
|
| Seq = 111 Ack = 1448
|0 ,001
|
ACK
|
|(47674)
−−−−−−−−−−−−−−−−−−>
|
| Seq = 111 Ack = 1449
|0 ,001
|
ACK − Len :
|
|(47674)
<−−−−−−−−−−−−−−−−−−
|0 ,001
|
ACK
|
|(47674)
−−−−−−−−−−−−−−−−−−>
| Seq = 1449 Ack = 111
1448
(80)
|
(80)
|
(80)
|
(80)
|
(80)
|
(80)
|
(80)
|
(80)
|
|
| Seq = 111 Ack = 2888
...
|0 ,010
|
ACK
|
|(47674)
−−−−−−−−−−−−−−−−−−>
|
|0 ,010
|
ACK
|
|(47674)
−−−−−−−−−−−−−−−−−−>
| Seq = 111 Ack = 1 0 1 6 5 7
|
|0 ,010
|
ACK
|
|(47674)
−−−−−−−−−−−−−−−−−−>
| Seq = 111 Ack = 1 0 1 6 5 8
|
|0 ,011
|
FIN , ACK
|
|(47674)
−−−−−−−−−−−−−−−−−−>
| Seq = 111 Ack = 1 0 1 6 5 9
|
|0 ,011
|
FIN , ACK
|
|(47674)
<−−−−−−−−−−−−−−−−−−
| Seq = 111 Ack = 1 0 1 6 5 9
|
|0 ,011
|
ACK
|
|(47674)
−−−−−−−−−−−−−−−−−−>
| Seq = 1 0 1 6 5 9 Ack = 112
|
| Seq = 112 Ack = 1 0 1 6 6 0
Cuadro 5.2: Diagrama de flechas
5.2 Pruebas sobre red cableada
60
Haciendo uso del módulo tcp probe es posible capturar los cambios en la
ventana de congestión (cwnd ) en el servidor, y ası́ ver su comportamiento ante la
llegada de los divacks. En la Figura 5.5 se muestra la comparación del crecimiento de
la cwnd cuando se activa la técnica de divacks (en este caso con n=9) con el envı́o
normal de un ACK por paquete de datos, a lo que llamamos de control (cuando n=0).
En la Figura 5.5a se muestra el comportamiento de la cwnd utilizando n=9, mientras
que en la Figura 5.5b muestra la cwnd de control.
9divacks cwnd
9divacks ssthresh
Segmentos (cwnd, ssthresh)
50
40
30
20
10
0
0
0.001
0.002
0.003
0.004
0.005
0.004
0.005
Tiempo (segundos)
(a) con divacks
control cwnd
control ssthresh
Segmentos (cwnd, ssthresh)
50
40
30
20
10
0
0
0.001
0.002
0.003
Tiempo (segundos)
(b) sin divacks
Figura 5.5: Comparación del crecimiento de la cwnd con y sin divacks.
Gracias al envı́o de divacks se logra acelerar el crecimiento de la cwnd como
puede apreciarse en la Figura 5.5. Haciendo uso de n=9 se logró obtener una cwnd =48
5.2 Pruebas sobre red cableada
61
en 4.4 ms, mientras que la cwnd de control (n=0) necesitó 5.2 ms para alcanzar un
valor de 35 MSS. Es decir, mediante el uso de divacks se obtuvo un tamaño de cwnd
mayor en menos tiempo.
Aun con la mejora en el crecimiento de la cwnd obtenido con el uso de divacks, en
la Figura 5.6 podemos observar que la llegada de los datos al receptor, tanto al receptor
con divacks (Figura 5.6a) como al de control (Figura 5.6b), no difiere mayormente.
Ambas transmisiones finalizan la recepción de datos aproximadamente en 10 ms.
120000
DATA
ACKs
Segmentos (bytes)
100000
80000
60000
40000
20000
0
0
0.002
0.004
0.006
0.008
0.01
0.008
0.01
tiempo (segundos)
(a) con divacks
120000
DATA
ACKs
Segmentos (bytes)
100000
80000
60000
40000
20000
0
0
0.002
0.004
0.006
tiempo (segundos)
(b) sin divacks
Figura 5.6: Comparación del proceso de descarga de un archivo de 99 KB con y sin
divacks.
5.2 Pruebas sobre red cableada
10500
10000
62
DATA
ACKs
Segmentos (bytes)
9500
9000
8500
8000
7500
7000
6500
6000
5500
0.0016 0.00165 0.0017 0.00175 0.0018 0.00185 0.0019 0.00195
0.002
tiempo (segundos)
Figura 5.7: Descarga de archivo de 99 KB con divacks (acercamiento).
Debido a la escala de la Figura 5.6, no es posible apreciar el envı́o de los divacks,
lo cual es el objetivo de esta prueba. En la Figura 5.7 se hace un acercamiento a lo
que ocurre en el receptor con n=9. Siguiendo el algoritmo mostrado en el Cuadro 3.1,
se puede observar como el receptor responde la llegada de cada paquete de datos con
una pequeña ráfaga de divacks (9 divacks + full-ACK ).
Para poder entender el porqué, a pesar de obtener una mayor aceleración el
crecimiento de la cwnd con n=9, no se obtienen cambios en la llegada de paquetes al
receptor, se debe observar lo que ocurre en el emisor TCP. En la Figura 5.8 se muestra
como responde el emisor a los ACKs recibidos mediante el envı́o de datos. Nuevamente
en la Figura 5.8a se muestra el comportamiento del emisor ante la llegada de divacks,
mientras que en la Figura 5.8b se muestra el emisor TCP de la transferencia de control.
Podemos ver como la pendiente de la gráfica en la Figura 5.8a es ligeramente mayor
que la de la Figura 5.8b, terminando el envı́o de datos en 5.1 ms, mientras que sin
divacks fueron necesarios 5.9 ms, aproximadamente 15 % más lento.
Vemos que el uso de la técnica de divacks mejora la velocidad de crecimiento
de la cwnd, lo que provoca un aumento en la velocidad de envı́o de datos en el emisor.
Entonces, ¿Por qué no se puede apreciar una diferencia en la llegada de datos en
el receptor? La respuesta a esta pregunta es que, al trabajar sobre una LAN, las
velocidades de transferencia de datos son altas, lo suficiente como para superar la
5.2 Pruebas sobre red cableada
120000
63
DATA
ACKs
Segmentos (bytes)
100000
80000
60000
40000
20000
0
0
0.002
0.004
0.006
0.008
0.01
0.008
0.01
Tiempo (segundos)
(a) con divacks
120000
DATA
ACKs
Segmentos (bytes)
100000
80000
60000
40000
20000
0
0
0.002
0.004
0.006
Tiempo (segundos)
(b) sin divacks
Figura 5.8: Comparación del proceso de descarga de un archivo de 99 KB con y sin
divacks, sobre una red cableada (Traza del servidor).
5.3 Pruebas sobre red cableada simulando una WAN
64
velocidad con la que el router1 puede procesar la llegada de los paquetes y su envı́o a
través del siguiente enlace. En otras palabras, la velocidad obtenida en esta prueba es
la máxima velocidad a la que el router utilizado puede retransmitir los datos recibidos.
El RTT promedio medido fue de 0.12 ms, por lo tanto el retardo de extremo a extremo
es de 0.06 ms. El tipo de cable utilizado es par trenzado categorı́a 5, lo que brinda un
ancho de banda máximo de 100 Mbps, esto da un Producto Retardo-Ancho de banda o
BDP2 (por sus siglas en inglés: Bandwidth-Delay Product) de 786.43 bytes. Sin contar
el encapsulamiento de las demás capas, y el tamaño del encabezado TCP, un segmento
puede llevar 1448 bytes de datos. Esto quiere decir que cada segmento de datos enviado
pasa más tiempo siendo transmitido por cada nodo, que siendo transportado por cada
enlace, llegando al punto que, en algún momento, el segmento vive tanto en el emisor
como en el router o tanto en el router como en el receptor al mismo tiempo.
5.3.
Pruebas sobre red cableada simulando una
WAN
El objetivo de esta prueba es aumentar el BDP de la red incrementando el
tiempo de llegada entre las ráfagas de paquetes y ası́ poder observar el impacto de
los divacks sobre una transferencia TCP cuando la capacidad de la red aumenta. Para
lograr este incremento en el tiempo de llegada de paquetes se utilizó el programa netem
para emular diferentes tiempos de retardo en la red, esto es, el tiempo que tarda un
paquete en viajar desde el origen hasta el destino. Se utilizó la topologı́a mostrada en
la Figura 5.9, donde la nube representa un terminal ejecutando netem para emular los
diferentes tiempos de retardo.
1
Router Linksys Cisco, modelo WRT160N, puertos Ethernet 100 Mbps.
BDP es el cantidad máxima de datos que pueden vivir en la red en un momento determinado, se
refiere al ancho de banda del enlace de datos (bps) multiplicado por el retardo entre dos puntos(s).
2
5.3 Pruebas sobre red cableada simulando una WAN
DATA
Cliente
65
Servidor
ACKs
Figura 5.9: Topologı́a WAN emulada con netem.
5.3.1.
Tiempo de retardo de 10 ms
La primera prueba se realizó agregando un retardo pequeño en la red. Al
utilizar 10 ms de retardo en la red se debe obtener un RTT promedio de 20 ms, lo cual
se puede observar en el Cuadro 5.3, donde se muestra la prueba de ping realizada. En
las siguientes gráficas se muestran los resultados obtenidos de las pruebas realizadas,
comparando en cada una el comportamiento de las transferencias de control con las
transferencias usando la técnica de divacks con n=9.
1
PING 192.168.1.104 (192.168.1.104) 56(84) bytes of data .
2
64 bytes from 192.168.1.104: icmp_seq =1 ttl =64 time =20.6 ms
3
64 bytes from 192.168.1.104: icmp_seq =2 ttl =64 time =20.6 ms
4
64 bytes from 192.168.1.104: icmp_seq =3 ttl =64 time =20.6 ms
5
64 bytes from 192.168.1.104: icmp_seq =4 ttl =64 time =20.6 ms
6
64 bytes from 192.168.1.104: icmp_seq =5 ttl =64 time =20.6 ms
7
64 bytes from 192.168.1.104: icmp_seq =6 ttl =64 time =20.6 ms
8
64 bytes from 192.168.1.104: icmp_seq =7 ttl =64 time =20.6 ms
9
64 bytes from 192.168.1.104: icmp_seq =8 ttl =64 time =21.4 ms
10
64 bytes from 192.168.1.104: icmp_seq =9 ttl =64 time =20.6 ms
11
64 bytes from 192.168.1.104: icmp_seq =10 ttl =64 time =20.9 ms
12
13
--- 192.168.1.104 ping statistics ---
14
10 packets transmitted , 10 received , 0 % packet loss , time 9016 ms
15
rtt min / avg / max / mdev = 2 0 . 6 0 7 / 2 0 . 7 4 2 / 2 1 . 4 0 9 / 0 . 2 5 3 ms
Cuadro 5.3: Ping realizado entre el receptor y el emisor usando un retardo de 10 ms.
5.3 Pruebas sobre red cableada simulando una WAN
50
control cwnd
control ssthresh
9divacks cwnd
9divacks ssthresh
45
Segmentos (cwnd, ssthresh)
66
40
35
30
25
20
15
10
5
0
0
0.01
0.02
0.03
0.04
0.05
0.06
0.07
Tiempo (segundos)
Figura 5.10: Comparación del crecimiento de la cwnd de control, con n=9, 20 ms de
RTT y archivo de tamaño 99 kB, sobre una red cableada.
En la Figura 5.10 se muestra la dinámica de la cwnd. Está claramente
evidenciada la mejora en la velocidad de crecimiento de la cwnd con n=9, en cada
RTT se nota el efecto de los divacks haciendo crecer la cwnd a un tamaño mayor que
la de control. Sin embargo se puede observar que la cwnd no crece proporcionalmente
a n, es decir, no todos los divacks están haciendo efecto. La cwnd, si bien crece a un
ritmo mayor, no está creciendo por cada divack recibido.
120000
control
9divacks
Segmentos (bytes)
100000
80000
60000
40000
20000
0
0
0.02
0.04
0.06
0.08
0.1
0.12
0.14
0.16
tiempo (segundos)
Figura 5.11: Comparación del proceso de descarga de un archivo de 99 KB de control,
con n=9 y con 20 ms de RTT, sobre una red cableada (Traza del cliente).
En la Figura 5.11 se puede observar el efecto de este crecimiento aumentado de
la cwnd en el rendimiento de la descarga. En cada RTT el receptor cuando se utiliza
5.3 Pruebas sobre red cableada simulando una WAN
67
n=9 recibe una ráfaga mayor de paquetes de datos que en la descarga de control.
Para facilitar la visualización del efecto de los divacks, en el Cuadro 5.1 se muestra un
resumen de las llegadas de paquetes de datos al receptor de control y cuando se utiliza
n=9.
RTT
Control (pkts) divacks(n=3) (pkts)
1
0
0
2
3
3
3
6
10
4
12
24
5
24
34
6
26
––
Total
71
71
Cuadro 5.1: Paquetes de datos recibidos en cada RTT.
Durante el primer RTT en ambas pruebas se reciben los paquetes de control,
luego de los primeros 40 ms (segundo RTT) se reciben 3 paquetes de datos, a partir de
este punto la diferencia entre la cantidad de paquetes recibidos va aumentando hasta
que finalmente el receptor cuando se utiliza n=9 termina de recibir datos en el quinto
RTT, mientras que en la descarga de control el receptor necesita un RTT adicional
para finalizar.
A pesar de la mejora en el tiempo de descarga (un RTT menos de tiempo), existe
una diferencia apreciable entre el crecimiento de la cwnd mostrado en la Figura 5.10 y
las ráfagas de segmentos apreciadas en la Figura 5.11. En la Figura 5.12 se muestra el
envı́o de datos desde el emisor TCP, se puede notar como se corresponde el envı́o de
paquete de datos con la llegada de dichos paquetes al receptor, tanto en la descarga
de control como en la de n=9. Esto significa que ya no ocurre lo que se describió en la
Sección 5.2, donde la llegada de paquetes al receptor estaba limitada por la velocidad
de transmisión del router. Sino que, no todos los divacks enviados por el receptor están
provocando en el emisor el envı́o de datos nuevos. Esto se debe a que no solamente la
cwnd dirige el crecimiento abrupto de la tasa de emisión de datos, sino que el receptor
5.3 Pruebas sobre red cableada simulando una WAN
68
puede, a través de la función de control de flujo, frenar la emisión de ráfagas de gran
tamaño (como se explica en la Sección 4.4).
120000
control
9divacks
Segmentos (bytes)
100000
80000
60000
40000
20000
0
0
0.02
0.04
0.06
0.08
0.1
0.12
0.14
Tiempo (segundos)
Figura 5.12: Comparación del proceso de descarga de un archivo de 99 KB de control,
con n=9 y con 20 ms de RTT, sobre una red cableada (Traza del
servidor).
Las siguientes gráficas muestran los resultados obtenidos al realizar la misma
prueba con un archivo de 990 kB:
Segmentos (cwnd, ssthresh)
250
control cwnd
control ssthresh
9divacks cwnd
9divacks ssthresh
200
150
100
50
0
0
0.02
0.04
0.06
0.08
0.1
0.12
0.14
0.16
0.18
0.2
Tiempo (segundos)
Figura 5.13: Comparación del crecimiento de la cwnd de control, con n=9, 20 ms de
RTT y archivo de tamaño 990 kB, sobre una red cableada.
5.3 Pruebas sobre red cableada simulando una WAN
1.2e+06
69
control
9divacks
Segmentos (bytes)
1e+06
800000
600000
400000
200000
0
0
0.05
0.1
0.15
0.2
0.25
0.3
tiempo (segundos)
Figura 5.14: Comparación del proceso de descarga de un archivo de 990 KB de
control, con n=9 y con 20 ms de RTT, sobre una red cableada (Traza
del cliente).
1.2e+06
control
9divacks
Segmentos (bytes)
1e+06
800000
600000
400000
200000
0
0
0.05
0.1
0.15
0.2
0.25
0.3
Tiempo (segundos)
Figura 5.15: Comparación del proceso de descarga de un archivo de 990 KB de
control, con n=9 y con 20 ms de RTT, sobre una red cableada (Traza
del servidor).
5.3 Pruebas sobre red cableada simulando una WAN
70
Como se puede observar en las gráficas anteriores, los resultados se corresponden
con los ya descritos para el archivo de 99 kB. Existe un aumento en la tasa de
crecimiento de la cwnd usando n=9, lo que provoca en el emisor un envı́o mayor, aunque
limitado (Sección 4.4), de paquetes de datos, para finalmente terminar la transferencia
del archivo en un RTT menos de tiempo.
5.3.2.
Tiempos mayores de retardo
Con el objetivo de observar el efecto de la aplicación de la técnica de divacks
sobre redes con tiempos de retardo mayores, es decir, redes donde la capacidad de
datos es mayor debido a su mayor BDP. Se simularon (utilizando el programa netem)
tiempos de retardo de 25 ms y 40 ms, para realizar las transferencias de archivos de
tamaño 99 kB.
Tiempo de Retardo de 25 ms:
1
PING 192.168.1.104 (192.168.1.104) 56(84) bytes of data .
2
64 bytes from 192.168.1.104: icmp_seq =1 ttl =64 time =50.6 ms
3
64 bytes from 192.168.1.104: icmp_seq =2 ttl =64 time =50.6 ms
4
64 bytes from 192.168.1.104: icmp_seq =3 ttl =64 time =50.6 ms
5
64 bytes from 192.168.1.104: icmp_seq =4 ttl =64 time =50.6 ms
6
64 bytes from 192.168.1.104: icmp_seq =5 ttl =64 time =50.6 ms
7
64 bytes from 192.168.1.104: icmp_seq =6 ttl =64 time =50.6 ms
8
64 bytes from 192.168.1.104: icmp_seq =7 ttl =64 time =51.0 ms
9
64 bytes from 192.168.1.104: icmp_seq =8 ttl =64 time =51.3 ms
10
64 bytes from 192.168.1.104: icmp_seq =9 ttl =64 time =53.7 ms
11
64 bytes from 192.168.1.104: icmp_seq =10 ttl =64 time =51.1 ms
12
13
--- 192.168.1.104 ping statistics ---
14
10 packets transmitted , 10 received , 0 % packet loss , time 9015 ms
15
rtt min / avg / max / mdev = 5 0 . 6 4 7 / 5 1 . 1 3 2 / 5 3 . 7 8 5 / 0 . 9 1 9 ms
Cuadro 5.4: Ping realizado entre el receptor y el emisor usando un retardo de 25 ms.
5.3 Pruebas sobre red cableada simulando una WAN
50
control cwnd
control ssthresh
9divacks cwnd
9divacks ssthresh
45
Segmentos (cwnd, ssthresh)
71
40
35
30
25
20
15
10
5
0
0
0.02
0.04
0.06
0.08
0.1
0.12
0.14
0.16
Tiempo (segundos)
Figura 5.16: Comparación del crecimiento de la cwnd de control, con n=9, 50 ms de
RTT y archivo de tamaño 99 kB, sobre una red cableada.
120000
control
9divacks
Segmentos (bytes)
100000
80000
60000
40000
20000
0
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
0.4
tiempo (segundos)
Figura 5.17: Comparación del proceso de descarga de un archivo de 99 KB de control,
con n=9 y con 50 ms de RTT, sobre una red cableada (Traza del cliente).
5.3 Pruebas sobre red cableada simulando una WAN
120000
72
control
9divacks
Segmentos (bytes)
100000
80000
60000
40000
20000
0
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
Tiempo (segundos)
Figura 5.18: Comparación del proceso de descarga de un archivo de 99 KB de control,
con n=9 y con 50 ms de RTT, sobre una red cableada (Traza del
servidor).
Tiempo de Retardo de 40 ms:
1
PING 192.168.1.104 (192.168.1.104) 56(84) bytes of data .
2
64 bytes from 192.168.1.104: icmp_seq =1 ttl =64 time =83.0 ms
3
64 bytes from 192.168.1.104: icmp_seq =2 ttl =64 time =80.6 ms
4
64 bytes from 192.168.1.104: icmp_seq =3 ttl =64 time =80.6 ms
5
64 bytes from 192.168.1.104: icmp_seq =4 ttl =64 time =80.6 ms
6
64 bytes from 192.168.1.104: icmp_seq =5 ttl =64 time =80.6 ms
7
64 bytes from 192.168.1.104: icmp_seq =6 ttl =64 time =80.6 ms
8
64 bytes from 192.168.1.104: icmp_seq =7 ttl =64 time =80.6 ms
9
64 bytes from 192.168.1.104: icmp_seq =8 ttl =64 time =80.6 ms
10
64 bytes from 192.168.1.104: icmp_seq =9 ttl =64 time =80.6 ms
11
64 bytes from 192.168.1.104: icmp_seq =10 ttl =64 time =81.5 ms
12
13
--- 192.168.1.104 ping statistics ---
14
10 packets transmitted , 10 received , 0 % packet loss , time 9006 ms
15
rtt min / avg / max / mdev = 8 0 . 6 4 0 / 8 0 . 9 6 9 / 8 3 . 0 2 1 / 0 . 8 0 5 ms
Cuadro 5.5: Ping realizado entre el receptor y el emisor usando un retardo de 40 ms.
5.3 Pruebas sobre red cableada simulando una WAN
50
control cwnd
control ssthresh
9divacks cwnd
9divacks ssthresh
45
Segmentos (cwnd, ssthresh)
73
40
35
30
25
20
15
10
5
0
0
0.05
0.1
0.15
0.2
0.25
Tiempo (segundos)
Figura 5.19: Comparación del crecimiento de la cwnd de control, con n=9, 80 ms de
RTT y archivo de tamaño 99 kB, sobre una red cableada.
120000
control
9divacks
Segmentos (bytes)
100000
80000
60000
40000
20000
0
0
0.1
0.2
0.3
0.4
0.5
0.6
tiempo (segundos)
Figura 5.20: Comparación del proceso de descarga de un archivo de 99 KB de control,
con n=9 y con 80 ms de RTT, sobre una red cableada (Traza del cliente).
5.3 Pruebas sobre red cableada simulando una WAN
120000
74
control
9divacks
Segmentos (bytes)
100000
80000
60000
40000
20000
0
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
0.4
0.45
0.5
Tiempo (segundos)
Figura 5.21: Comparación del proceso de descarga de un archivo de 99 KB de control,
con n=9 y con 80 ms de RTT, sobre una red cableada (Traza del
servidor).
Resultados:
Los resultados de las pruebas utilizando tiempos de retardos mayores se
mantuvieron similares a los resultados obtenidos en la Subsección 5.3.1, utilizando la
técnica de divacks se produce un aumento en la tasa de crecimiento de la cwnd, debido a
esto, el emisor envı́a una mayor cantidad de paquetes de datos, lo que permite finalizar
la transferencia del archivo en un RTT menos de tiempo. Lo que significa que, a mayor
retardo en la red, mayor será el tiempo ahorrado utilizando divacks.
En las siguientes gráficas se muestran el rendimiento y el tiempo promedio de
descarga obtenido en las pruebas para los diferentes tiempos de retardo, comparando
las descargas de control y usando n=9. Debido a la magnitud del error, casi inapreciable
en las gráficas, éste fue omitido.
A medida que el retardo de la red es mayor, el tiempo de descargar también lo
es (por lo tanto el rendimiento disminuye) y la diferencia entre el tiempo de descarga
de control y de n=9 crece. Para todas las pruebas realizadas, se obtuvieron mejores
resultados utilizando la técnica de divacks. Obteniendo tiempos de descarga reducidos
(en promedio un RTT menos) con respecto a las descarga de control y por lo tanto
logrando un mejor rendimiento de las transferencias.
5.3 Pruebas sobre red cableada simulando una WAN
75
8000
9divacks
control
Rendimiento (KBytes/sec)
7000
6000
5000
4000
3000
2000
1000
0
10
15
20
25
30
35
40
Retardo (ms)
Figura 5.22: Comparación del rendimiento de descarga de un archivo de 99 kb, con
diferentes tiempos de retardo, en una red cableada.
0.5
0.45
9divacks
control
Tiempo de descarga (s)
0.4
0.35
0.3
0.25
0.2
0.15
0.1
0.05
0
10
25
40
Retardo (ms)
Figura 5.23: Comparación del tiempo de descarga de un archivo de 99 kb, con
diferentes tiempos de retardo, en una red cableada.
5.3 Pruebas sobre red cableada simulando una WAN
76
35000
9divacks
control
Rendimiento (KBytes/sec)
30000
25000
20000
15000
10000
5000
0
10
15
20
25
30
35
40
Retardo (ms)
Figura 5.24: Comparación del rendimiento de descarga de un archivo de 990 kb, con
diferentes tiempos de retardo, en una red cableada.
1
0.9
9divacks
control
Tiempo de descarga (s)
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
10
25
40
Retardo (ms)
Figura 5.25: Comparación del tiempo de descarga de un archivo de 990 kb, con
diferentes tiempos de retardo, en una red cableada.
5.4 Pruebas sobre red Inalámbrica
5.4.
77
Pruebas sobre red Inalámbrica
El objetivo de estas pruebas es observar finalmente el efecto de la técnica
de divacks sobre transmisiones TCP en una red inalámbrica, tomando en cuenta
los resultados de las pruebas mostradas en las secciones anteriores. Se aplicaron las
modificaciones descritas en Sección 4.4, para evitar limitaciones en el crecimiento de la
cwnd y anunciar una rwnd fija indicando todo el espacio libre en el buffer de recepción
desde el principio de la conexión. También se utilizó el programa netem para simular
diferentes retardos de red, con el objetivo de determinar en qué situación es conveniente
usar divacks.
DATA
Cliente
Servidor
ACKs
Figura 5.26: Maqueta de red de acceso inalámbrico.
Se utilizó la topologı́a mostrada en la Figura 5.26, donde la nube representa un
terminal ejecutando netem para emular los diferentes tiempos de retardo. Se utilizaron
archivos de tamaños 99 kB, 198 kB y 990 kB, para observar el comportamiento de los
divacks en transferencias largas y cortas. Finalmente, se probaron diferentes valores
de n para observar cómo afectan a la transmisión de paquetes y a la congestión de la red.
5.4.1.
Configuración de las pruebas
Además de las configuraciones descritas en la Sección 5.1, que son necesarias
para todas las pruebas, se realizaron las siguientes configuraciones en el receptor para
aumentar el tamaño del buffer de recepción.
Asegurar que la variable tcp window scaling sea igual a ‘1’. Debido a que el
campo de la ventana anunciada en la cabecera TCP es de solo 16 bits, solo
se puede utilizar ventana de tamaño menor a 64 kbytes. Está variable permite
5.4 Pruebas sobre red Inalámbrica
78
escalar la ventana según el RFC 1323 para utilizar ventanas mayores a 64 kbytes.
Por omisión el valor de tcp window scaling es ‘1’:
~ $ sudo sysctl -w net . ipv4 . t cp_ wi nd ow _s ca li ng =1
Aumentar el tamaño del buffer de recepción a través de la variable tcp rmem. Esta
variable recibe tres enteros que representan respectivamente el tamaño mı́nimo,
por omisión y máximo del buffer de recepción. Aumentaremos cuatro veces el
valor por omisión del buffer:
~ $ sudo sysctl -w net . ipv4 . tcp_rmem = " 4096 349520 3334144 "
5.4.2.
Pruebas y resultados
En esta sección se mostrarán los resultados obtenidos. Para las pruebas se
utilizaron retardos de red de 0 ms, 10 ms, 25 ms, 40 ms y 125 ms, mediante el programa
netem. Se utilizaron archivos de tamaños 99 kB, 198 kB y 990 kB, para observar
el comportamiento de los divacks en transferencias largas y cortas. Finalmente, se
probaron diferentes valores de n para observar cómo afectan a la transmisión de
paquetes y a la congestión de la red. Se debe recordar que cuando n=0 se habla de
“prueba de control”, porque en este caso no se está usando la técnica de divacks.
Sin retardo adicional:
La primera prueba se realizó sin agregar algún retardo adicional, para observar
el efecto de las llegadas rápidas al punto de acceso inalámbrico3 (AP por sus siglas en
inglés: Access Point) de los divacks y cómo éste es capaz de retransmitir estas grandes
ráfagas de paquetes.
En las siguientes gráficas se muestran los resultados obtenidos, comparando en
cada una el comportamiento de las transferencias con valores de n de 0 (control), 3, 9
y 15.
3
Router Linksys, CISCO, modelo WRT160N, norma 802.11g (54 Mbps).
5.4 Pruebas sobre red Inalámbrica
Segmentos (cwnd, ssthresh)
1200
79
control cwnd
3divacks cwnd
9divacks cwnd
15divacks cwnd
control ssthresh
1000
800
600
400
200
0
0
0.05
0.1
0.15
0.2
0.25
Tiempo (segundos)
Figura 5.27: Comparación del crecimiento de la cwnd utilizando diferentes valores de
n y tamaño de archivo de 99 kB, sobre una red inalámbrica.
En la Figura 5.27 podemos observar el crecimiento de la cwnd. Se observa que
el ritmo de crecimiento de la cwnd es igual para todos los valores de n, sin embargo a
medida que el número de divacks utilizado es mayor, el tiempo en el que la cwnd sigue
creciendo también lo es. En la Figura 5.28 y Figura 5.29 se puede notar que el envı́o y
recepción de paquetes de datos termina en menos de 50 ms, y aun ası́ la cwnd sigue
creciendo (en los casos en que n > 0) por más tiempo. Además el fin de la conexión
también tarda más a medida que el número de divacks usado es mayor. Esto significa
que la llegada de ACKs al AP, supera la velocidad con la que éste puede retransmitirlos
a su destino. Entre mayor es el valor de n, mayor es la cantidad de ACKs acumulados en
el AP. Por eso, aun cuando la transmisión de paquetes de datos ya ha terminado, el AP
sigue enviando los ACKs en cola, lo que ocasiona que la cwnd siga creciendo aunque ya
no sea necesario, y que se retrase la llegada del paquete que marca el fin de la conexión.
5.4 Pruebas sobre red Inalámbrica
80
120000
Segmentos (bytes)
100000
80000
60000
40000
control
3divacks
9divacks
15divacks
20000
0
0
0.05
0.1
0.15
0.2
0.25
0.3
tiempo (segundos)
Figura 5.28: Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n, sobre una red inalámbrica (Traza del cliente).
120000
Segmentos (bytes)
100000
80000
60000
40000
control
3divacks
9divacks
15divacks
20000
0
0
0.05
0.1
0.15
0.2
0.25
0.3
Tiempo (segundos)
Figura 5.29: Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n, sobre una red inalámbrica (Traza del servidor).
5.4 Pruebas sobre red Inalámbrica
81
En las siguientes gráficas se muestran los resultados obtenidos en la descarga de
archivos de mayor tamaño. Se puede notar que los resultados son bastante parecidos
a los obtenidos por la transferencia de un archivo pequeño, sin embargo, en la
Figura 5.34 se advierte que entre mayor es la cantidad de divacks utilizados es más
lenta la llegada de datos. Esto significa que la transmisión de la gran cantidad de
ACKs está entorpeciendo la transmisión de datos:
1400
control cwnd
3divacks cwnd
9divacks cwnd
15divacks cwnd
control ssthresh
Segmentos (cwnd, ssthresh)
1200
1000
800
600
400
200
0
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
Tiempo (segundos)
Figura 5.30: Comparación crecimiento de la cwnd utilizando diferentes valores de n
y tamaño de archivo de 198 kB, sobre una red inalámbrica.
250000
Segmentos (bytes)
200000
150000
100000
control
3divacks
9divacks
15divacks
50000
0
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
tiempo (segundos)
Figura 5.31: Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n, sobre una red inalámbrica (Traza del cliente).
5.4 Pruebas sobre red Inalámbrica
82
250000
Segmentos (bytes)
200000
150000
100000
control
3divacks
9divacks
15divacks
50000
0
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
Tiempo (segundos)
Figura 5.32: Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n, sobre una red inalámbrica (Traza del servidor).
2000
control cwnd
3divacks cwnd
9divacks cwnd
15divacks cwnd
control ssthresh
Segmentos (cwnd, ssthresh)
1800
1600
1400
1200
1000
800
600
400
200
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Tiempo (segundos)
Figura 5.33: Comparación del crecimiento de la cwnd utilizando diferentes valores de
n y tamaño de archivo de 990 kB, sobre una red inalámbrica.
5.4 Pruebas sobre red Inalámbrica
83
1.2e+06
Segmentos (bytes)
1e+06
800000
600000
400000
control
3divacks
9divacks
15divacks
200000
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
tiempo (segundos)
Figura 5.34: Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n, sobre una red inalámbrica (Traza del cliente).
1.2e+06
Segmentos (bytes)
1e+06
800000
600000
400000
control
3divacks
9divacks
15divacks
200000
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Tiempo (segundos)
Figura 5.35: Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n, sobre una red inalámbrica (Traza del servidor).
5.4 Pruebas sobre red Inalámbrica
84
Tiempo de retardo de 10 ms:
Al utilizar 10 ms de retardo en la red se debe obtener un RTT promedio de
20 ms, el cual se puede apreciar en las gráficas como el intervalo de tiempo entre
las ráfagas de paquetes de datos recibidos (en las trazas del cliente) y enviados (en
las trazas del servidor). A continuación se muestran los resultados obtenidos de las
pruebas realizadas. Se mantienen los resultados obtenidos en las pruebas anteriores,
sin embargo, los 10 ms de retardo reducen el ritmo de llegada de paquetes al AP, y
aumentan los intervalos de tiempo entre las ráfagas de paquetes. Gracias a esto se
puede apreciar el efecto de los divacks en el crecimiento de las ráfagas de paquetes
de datos y se empieza a notar la mejora en los tiempos de descarga cuando se usa la
técnica de divacks.
Segmentos (cwnd, ssthresh)
1200
control cwnd
3divacks cwnd
9divacks cwnd
15divacks cwnd
control ssthresh
1000
800
600
400
200
0
0
0.05
0.1
0.15
0.2
0.25
Tiempo (segundos)
Figura 5.36: Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 20 ms de RTT y tamaño de archivo de 99 kB, sobre una red
inalámbrica.
5.4 Pruebas sobre red Inalámbrica
85
120000
Segmentos (bytes)
100000
80000
60000
40000
control
3divacks
9divacks
15divacks
20000
0
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
tiempo (segundos)
Figura 5.37: Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n y 20 ms de RTT, sobre una red inalámbrica
(Traza del cliente).
120000
Segmentos (bytes)
100000
80000
60000
40000
control
3divacks
9divacks
15divacks
20000
0
0
0.05
0.1
0.15
0.2
0.25
0.3
Tiempo (segundos)
Figura 5.38: Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n y 20 ms de RTT, sobre una red inalámbrica
(Traza del servidor).
5.4 Pruebas sobre red Inalámbrica
1400
control cwnd
3divacks cwnd
9divacks cwnd
15divacks cwnd
control ssthresh
1200
Segmentos (cwnd, ssthresh)
86
1000
800
600
400
200
0
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
Tiempo (segundos)
Figura 5.39: Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 20 ms de RTT y tamaño de archivo de 198 kB, sobre una red
inalámbrica.
250000
Segmentos (bytes)
200000
150000
100000
control
3divacks
9divacks
15divacks
50000
0
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
0.4
tiempo (segundos)
Figura 5.40: Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n y 20 ms de RTT, sobre una red inalámbrica (Traza
del cliente).
5.4 Pruebas sobre red Inalámbrica
87
250000
Segmentos (bytes)
200000
150000
100000
control
3divacks
9divacks
15divacks
50000
0
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
0.4
Tiempo (segundos)
Figura 5.41: Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n y 20 ms de RTT, sobre una red inalámbrica (Traza
del servidor).
2000
control cwnd
3divacks cwnd
9divacks cwnd
15divacks cwnd
control ssthresh
Segmentos (cwnd, ssthresh)
1800
1600
1400
1200
1000
800
600
400
200
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Tiempo (segundos)
Figura 5.42: Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 20 ms de RTT y tamaño de archivo de 990 kB, sobre una red
inalámbrica.
5.4 Pruebas sobre red Inalámbrica
88
1.2e+06
Segmentos (bytes)
1e+06
800000
600000
400000
control
3divacks
9divacks
15divacks
200000
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
tiempo (segundos)
Figura 5.43: Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n y 20 ms de RTT, sobre una red inalámbrica (Traza
del cliente).
1.2e+06
Segmentos (bytes)
1e+06
800000
600000
400000
control
3divacks
9divacks
15divacks
200000
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Tiempo (segundos)
Figura 5.44: Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n y 20 ms de RTT, sobre una red inalámbrica (Traza
del servidor).
5.4 Pruebas sobre red Inalámbrica
89
Tiempo de retardo de 25 ms:
Al utilizar 25 ms de retardo en la red se debe obtener un RTT promedio de 50
ms, el cual se puede apreciar en las gráficas. A continuación se muestran los resultados
obtenidos de las pruebas realizadas. Se mantienen los resultados obtenidos en las
pruebas anteriores, pero gracias a los 25 ms de retardo se puede apreciar el efecto de
los divacks en el crecimiento de las ráfagas de paquetes de datos en cada RTT de la
transmisión.
Segmentos (cwnd, ssthresh)
1200
control cwnd
3divacks cwnd
9divacks cwnd
15divacks cwnd
control ssthresh
1000
800
600
400
200
0
0
0.05
0.1
0.15
0.2
0.25
0.3
Tiempo (segundos)
Figura 5.45: Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 50 ms de RTT y tamaño de archivo de 99 kB, sobre una red
inalámbrica.
5.4 Pruebas sobre red Inalámbrica
90
120000
Segmentos (bytes)
100000
80000
60000
40000
control
3divacks
9divacks
15divacks
20000
0
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
0.4
0.45
tiempo (segundos)
Figura 5.46: Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n y 50 ms de RTT, sobre una red inalámbrica
(Traza del cliente).
RTT (s)
Control (pkts) n=3 (pkts) n=9 (pkts)
n=15 (pkts)
1
0
0
0
0
2
3
3
3
3
3
6
15
33
51
4
12
55
37
19
5
24
––
––
––
6
28
––
––
––
Total
73
73
73
73
Cuadro 5.2: Paquetes de datos recibidos en cada RTT.
5.4 Pruebas sobre red Inalámbrica
91
120000
Segmentos (bytes)
100000
80000
60000
40000
control
3divacks
9divacks
15divacks
20000
0
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
0.4
Tiempo (segundos)
Figura 5.47: Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n y 50 ms de RTT, sobre una red inalámbrica
(Traza del servidor).
1600
control cwnd
3divacks cwnd
9divacks cwnd
15divacks cwnd
control ssthresh
Segmentos (cwnd, ssthresh)
1400
1200
1000
800
600
400
200
0
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
0.4
Tiempo (segundos)
Figura 5.48: Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 50 ms de RTT y tamaño de archivo de 198 kB, sobre una red
inalámbrica.
5.4 Pruebas sobre red Inalámbrica
92
250000
Segmentos (bytes)
200000
150000
100000
control
3divacks
9divacks
15divacks
50000
0
0
0.1
0.2
0.3
0.4
0.5
0.6
tiempo (segundos)
Figura 5.49: Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n y 50 ms de RTT, sobre una red inalámbrica (Traza
del cliente).
RTT (s)
Control (pkts) n=3 (pkts) n=9 (pkts)
n=15 (pkts)
1
0
0
0
0
2
3
3
3
3
3
6
15
33
51
4
12
123
105
87
5
24
––
––
––
6
48
––
––
––
7
48
––
––
––
Total
141
141
141
141
Cuadro 5.3: Paquetes de datos recibidos en cada RTT.
5.4 Pruebas sobre red Inalámbrica
93
250000
Segmentos (bytes)
200000
150000
100000
control
3divacks
9divacks
15divacks
50000
0
0
0.1
0.2
0.3
0.4
0.5
0.6
Tiempo (segundos)
Figura 5.50: Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n y 50 ms de RTT, sobre una red inalámbrica (Traza
del servidor).
2000
control cwnd
3divacks cwnd
9divacks cwnd
15divacks cwnd
control ssthresh
Segmentos (cwnd, ssthresh)
1800
1600
1400
1200
1000
800
600
400
200
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
Tiempo (segundos)
Figura 5.51: Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 50 ms de RTT y tamaño de archivo de 990 kB, sobre una red
inalámbrica.
5.4 Pruebas sobre red Inalámbrica
94
1.2e+06
Segmentos (bytes)
1e+06
800000
600000
400000
control
3divacks
9divacks
15divacks
200000
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
tiempo (segundos)
Figura 5.52: Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n y 50 ms de RTT, sobre una red inalámbrica (Traza
del cliente).
1.2e+06
Segmentos (bytes)
1e+06
800000
600000
400000
control
3divacks
9divacks
15divacks
200000
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
Tiempo (segundos)
Figura 5.53: Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n y 50 ms de RTT, sobre una red inalámbrica (Traza
del servidor).
5.4 Pruebas sobre red Inalámbrica
95
Tiempo de retardo de 40 ms:
Al utilizar 40 ms de retardo en la red se debe obtener un RTT promedio de 80
ms, el cual se puede apreciar en las gráficas. A continuación se muestran los resultados
obtenidos de las pruebas realizadas. Se mantienen los resultados obtenidos en las
pruebas anteriores.
Segmentos (cwnd, ssthresh)
1200
control cwnd
3divacks cwnd
9divacks cwnd
15divacks cwnd
control ssthresh
1000
800
600
400
200
0
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
Tiempo (segundos)
Figura 5.54: Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 80 ms de RTT y tamaño de archivo de 99 kB, sobre una red
inalámbrica.
5.4 Pruebas sobre red Inalámbrica
96
120000
Segmentos (bytes)
100000
80000
60000
40000
control
3divacks
9divacks
15divacks
20000
0
0
0.1
0.2
0.3
0.4
0.5
0.6
tiempo (segundos)
Figura 5.55: Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n y 80 ms de RTT, sobre una red inalámbrica
(Traza del cliente).
RTT (s)
Control (pkts) n=3 (pkts) n=9 (pkts)
n=15 (pkts)
1
0
0
0
0
2
3
3
3
3
3
6
15
33
51
4
12
55
37
19
5
24
––
––
––
6
28
––
––
––
Total
73
73
73
73
Cuadro 5.4: Paquetes de datos recibidos en cada RTT.
5.4 Pruebas sobre red Inalámbrica
97
120000
Segmentos (bytes)
100000
80000
60000
40000
control
3divacks
9divacks
15divacks
20000
0
0
0.1
0.2
0.3
0.4
0.5
0.6
Tiempo (segundos)
Figura 5.56: Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n y 80 ms de RTT, sobre una red inalámbrica
(Traza del servidor).
1800
control cwnd
3divacks cwnd
9divacks cwnd
15divacks cwnd
control ssthresh
Segmentos (cwnd, ssthresh)
1600
1400
1200
1000
800
600
400
200
0
0
0.05
0.1
0.15
0.2
0.25
0.3
0.35
0.4
0.45
0.5
Tiempo (segundos)
Figura 5.57: Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 80 ms de RTT y tamaño de archivo de 198 kB, sobre una red
inalámbrica.
5.4 Pruebas sobre red Inalámbrica
98
250000
Segmentos (bytes)
200000
150000
100000
control
3divacks
9divacks
15divacks
50000
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
tiempo (segundos)
Figura 5.58: Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n y 80 ms de RTT, sobre una red inalámbrica (Traza
del cliente).
RTT (s)
Control (pkts) n=3 (pkts) n=9 (pkts)
n=15 (pkts)
1
0
0
0
0
2
3
3
3
3
3
6
15
33
51
4
12
75
105
87
5
24
48
––
––
6
48
––
––
––
7
48
––
––
––
Total
141
141
141
141
Cuadro 5.5: Paquetes de datos recibidos en cada RTT.
5.4 Pruebas sobre red Inalámbrica
99
250000
Segmentos (bytes)
200000
150000
100000
control
3divacks
9divacks
15divacks
50000
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
Tiempo (segundos)
Figura 5.59: Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n y 80 ms de RTT, sobre una red inalámbrica (Traza
del servidor).
Segmentos (cwnd, ssthresh)
2500
control cwnd
3divacks cwnd
9divacks cwnd
15divacks cwnd
control ssthresh
2000
1500
1000
500
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
Tiempo (segundos)
Figura 5.60: Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 80 ms de RTT y tamaño de archivo de 990 kB, sobre una red
inalámbrica.
5.4 Pruebas sobre red Inalámbrica
100
1.2e+06
Segmentos (bytes)
1e+06
800000
600000
400000
control
3divacks
9divacks
15divacks
200000
0
0
0.2
0.4
0.6
0.8
1
1.2
tiempo (segundos)
Figura 5.61: Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n y 80 ms de RTT, sobre una red inalámbrica (Traza
del cliente).
1.2e+06
Segmentos (bytes)
1e+06
800000
600000
400000
control
3divacks
9divacks
15divacks
200000
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
Tiempo (segundos)
Figura 5.62: Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n y 80 ms de RTT, sobre una red inalámbrica (Traza
del servidor).
5.4 Pruebas sobre red Inalámbrica
101
Tiempo de retardo de 125 ms:
Al utilizar 125 ms de retardo en la red se debe obtener un RTT promedio
de 250 ms, el cual se puede apreciar en las gráficas. A continuación se muestran
los resultados obtenidos de las pruebas realizadas. Con este retardo se da suficiente
tiempo al AP para recibir y retransmitir cada ráfaga de paquetes antes de la siguiente
(en el próximo RTT), esto permite apreciar claramente el efecto de los divacks en
la transferencia TCP. Por esta razón estas pruebas serán utilizadas para describir
detalladamente los resultados obtenidos mediante la aplicación de la técnica de divacks.
En la Figura 5.63 se muestra la dinámica de la cwnd. Está claramente
evidenciada la mejora en la velocidad de crecimiento de la cwnd a medida que se
envı́an más divacks, esto es, cuando el valor de n es mayor. En cada RTT se nota el
efecto de los divacks haciendo crecer la cwnd a un tamaño mayor. Se observa como
todos los divacks están haciendo efecto en la cwnd, haciéndola crecer proporcionalmente
a la cantidad de divacks enviados.
Segmentos (cwnd, ssthresh)
1200
control cwnd
3divacks cwnd
9divacks cwnd
15divacks cwnd
control ssthresh
1000
800
600
400
200
0
0
0.2
0.4
0.6
0.8
1
1.2
Tiempo (segundos)
Figura 5.63: Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 250 ms de RTT y tamaño de archivo de 99 kB, sobre una red
inalámbrica.
5.4 Pruebas sobre red Inalámbrica
102
120000
Segmentos (bytes)
100000
80000
60000
40000
control
3divacks
9divacks
15divacks
20000
0
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
tiempo (segundos)
Figura 5.64: Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n y 250 ms de RTT, sobre una red inalámbrica
(Traza del cliente).
En la Figura 5.64 se puede observar el efecto de este crecimiento aumentado de
la cwnd en el rendimiento de la descarga de un archivo de tamaño 99 kB. En cada RTT
las ráfagas de paquetes de datos recibidos son mayores cuando se utilizan valores más
grandes de n. Para facilitar la visualización del efecto de los divacks, en el Cuadro 5.6
se muestra un resumen de las llegadas de paquetes de datos al receptor.
RTT (s)
Control (pkts) n=3 (pkts) n=9 (pkts)
n=15 (pkts)
1
0
0
0
0
2
3
3
3
3
3
6
15
33
51
4
12
55
37
19
5
24
––
––
––
6
28
––
––
––
Total
73
73
73
73
Cuadro 5.6: Paquetes de datos recibidos en cada RTT.
Durante el primer RTT se reciben los paquetes de control. Luego de los primeros
0.5 segundos (segundo RTT), el receptor recibe 3 paquetes de datos en todas las
5.4 Pruebas sobre red Inalámbrica
103
120000
Segmentos (bytes)
100000
80000
60000
40000
control
3divacks
9divacks
15divacks
20000
0
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
Tiempo (segundos)
Figura 5.65: Comparación del proceso de descarga de un archivo de 99 kB utilizando
diferentes valores de n y 250 ms de RTT, sobre una red inalámbrica
(Traza del servidor).
pruebas. A partir de este punto, la diferencia entre la cantidad de paquetes recibidos
por el receptor está bastante marcada, el receptor en la prueba de control recibe, en el
tercer RTT (0.75 segundos), 6 paquetes de datos, mientras que en las pruebas con n=3,
n=9 y n=15, recibe 15, 33 y 51 paquetes de datos respectivamente. En el cuarto RTT (1
segundo), el receptor en las pruebas con n=3, n=9 y n=15, recibe los paquetes de datos
restantes para finalizar las transmisión de datos, mientras que en la prueba de control
el receptor necesita dos RTT adicionales para finalizar la descarga. Obteniéndose ası́,
aproximadamente un 50 % de ahorro de tiempo de descarga para el archivo de 99 kB.
En la Figura 5.65 se muestra el envı́o de datos desde el emisor TCP. Su
comportamiento se corresponde con la llegada de paquetes de datos al receptor. Esto
significa que el AP no está siendo saturado con la llegada de paquetes, es decir, que
estamos viendo el comportamiento normal de una transmisión TCP con el uso de
divacks.
A continuación se muestran los resultados de la descarga de un archivo de
tamaño 198 kB, el doble de la prueba anterior, para observar el comportamiento de los
divacks a medida que la cantidad de datos a transmitir es mayor.
En la Figura 5.66 se muestra la dinámica de la cwnd. El resultado, al igual que
en el caso anterior, es que entre mayor es el valor de n, mayor es la tasa de crecimiento
5.4 Pruebas sobre red Inalámbrica
2000
control cwnd
3divacks cwnd
9divacks cwnd
15divacks cwnd
control ssthresh
1800
Segmentos (cwnd, ssthresh)
104
1600
1400
1200
1000
800
600
400
200
0
0
0.2
0.4
0.6
0.8
1
1.2
1.4
Tiempo (segundos)
Figura 5.66: Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 250 ms de RTT y tamaño de archivo de 198 kB, sobre una red
inalámbrica.
de la cwnd.
En la Figura 5.67 se muestra la llegada de paquetes de datos al receptor. Se
observa el efecto del ritmo acelerado de crecimiento de la cwnd en el rendimiento de
la descarga del un archivo. En cada RTT las ráfagas de paquetes de datos recibidos
son mayores cuando se utilizan valores más grandes de n. Para facilitar la visualización
del efecto de los divacks, en el Cuadro 5.7 se muestra un resumen de las llegadas de
paquetes de datos al receptor.
5.4 Pruebas sobre red Inalámbrica
105
250000
Segmentos (bytes)
200000
150000
100000
control
3divacks
9divacks
15divacks
50000
0
0
0.5
1
1.5
2
2.5
tiempo (segundos)
Figura 5.67: Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n y 250 ms de RTT, sobre una red inalámbrica
(Traza del cliente).
Durante el primer RTT el receptor recibe los paquetes de control. Luego de
los primeros 0.5 segundos (segundo RTT), el receptor en todas las pruebas recibe 3
paquetes de datos. A partir de este punto, la diferencia entre la cantidad de paquetes
recibidos por cada prueba está bastante marcada, en el tercer RTT (0.75 segundos)
el receptor en la prueba de control recibe 6 paquetes de datos, mientras que en las
pruebas con n=3, n=9 y n=15, recibe 15, 33 y 51 paquetes de datos respectivamente.
En el cuarto RTT (1 segundo), el receptor en la prueba de control recibe 12 paquetes
de datos y en la prueba con n=3 recibe 75, mientras que en las pruebas con n=9 y
n=15, el receptor recibe los paquetes restantes para finalizar su transmisión de datos, en
una ráfaga de 105 y 87 paquetes respectivamente. En el quinto RTT (1,25 segundos)
el receptor en la prueba con n=3 recibe los 48 paquetes restantes para finalizar la
descarga, mientras que en la prueba de control se necesitan dos RTT adicionales para
finalizar.
Para la descarga de un archivo de tamaño 198 kB, se obtuvo un ahorro de 2
RTT usando n=3, y 3 RTT usando n=9 y n=15, con respecto a la descarga de control.
Esto supone una reducción de hasta un 57 % del tiempo de descarga utilizando divacks.
En la Figura 5.68 se muestra el envı́o de datos desde el emisor TCP. Al igual
que en el caso anterior, su comportamiento se corresponde con la llegada de paquetes
5.4 Pruebas sobre red Inalámbrica
RTT (s)
106
Control (pkts) n=3 (pkts) n=9 (pkts)
n=15 (pkts)
1
0
0
0
0
2
3
3
3
3
3
6
15
33
51
4
12
75
105
87
5
24
48
––
––
6
48
––
––
––
7
48
––
––
––
Total
141
141
141
141
Cuadro 5.7: Paquetes de datos recibidos en cada RTT.
250000
Segmentos (bytes)
200000
150000
100000
control
3divacks
9divacks
15divacks
50000
0
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
2
Tiempo (segundos)
Figura 5.68: Comparación del proceso de descarga de un archivo de 198 kB utilizando
diferentes valores de n y 250 ms de RTT, sobre una red inalámbrica
(Traza del servidor).
5.4 Pruebas sobre red Inalámbrica
107
de datos al receptor. Por lo tanto el AP no está siendo saturado con la llegada de
paquetes.
Finalmente se muestran los resultados de la descarga de un archivo de tamaño
990 kB, para observar el comportamiento de los divacks en transferencias largas. En la
Figura 5.69 se muestra la dinámica de la cwnd. El resultado es el mismo, entre mayor es
el valor de n, mayor es la tasa de crecimiento de la cwnd. Sin embargo, se observa que
el tiempo de crecimiento de la cwnd utilizando n=9 se prolonga más que los demás.
Esto se debe, como vimos en las pruebas con retardos de red pequeños, a que el AP se
está demorando en reenviar los divacks recibidos.
4000
control cwnd
3divacks cwnd
9divacks cwnd
15divacks cwnd
control ssthresh
Segmentos (cwnd, ssthresh)
3500
3000
2500
2000
1500
1000
500
0
0
0.5
1
1.5
2
2.5
Tiempo (segundos)
Figura 5.69: Comparación del crecimiento de la cwnd utilizando diferentes valores
de n, 250 ms de RTT y tamaño de archivo de 990 kB, sobre una red
inalámbrica.
En la Figura 5.70 se muestra la llegada de paquetes de datos al receptor. Se
observa el efecto del ritmo acelerado de crecimiento de la cwnd en el rendimiento
de la descarga del un archivo. Sin embargo, en las gráficas de descarga con n=3
y n=9 no se puede demarcar las ráfagas de paquetes recibidas en cada RTT. Esto
quiere decir que el AP está recibiendo muchos más paquetes de datos de los que puede
reenviar, o recordando que estamos trabajando en una de red 802.11, donde el medio
es compartido, el flujo excesivo de divacks compite con los paquetes de datos en la
contención por el medio, lo que retrasa el envı́o de datos, como lo demuestra Arcia
(2009).
5.4 Pruebas sobre red Inalámbrica
1.2e+06
control
3divacks
9divacks
15divacks
1e+06
Segmentos (bytes)
108
800000
600000
400000
200000
0
0
0.5
1
1.5
2
2.5
3
tiempo (segundos)
Figura 5.70: Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n y 250 ms de RTT, sobre una red inalámbrica
(Traza del cliente).
Es posible, sin embargo, comparar la recepción de paquetes del receptor en la
descarga con n=15 y la de control. Luego haber recibido los paquetes de control y la
primera llegada de 3 paquetes de datos, el receptor en la prueba de control recibe 6
paquetes en el tercer RTT (0.75 segundos), mientras que el receptor en la prueba con
n=15 recibe 51 paquetes de datos. A partir del cuarto RTT (1 segundo), el receptor en
la prueba con n=15 empieza a recibir todos los datos restantes de forma continua, es
decir, que está utilizando todo el ancho de banda disponible, terminando la descarga
en 1.325 segundos. Mientras que el receptor en la prueba de control le toma todavı́a
6 RTT adicionales para finalizar la descarga en 2.663 segundos, más del doble que lo
que tomo la prueba con n=15.
5.4 Pruebas sobre red Inalámbrica
1.2e+06
control
3divacks
9divacks
15divacks
1e+06
Segmentos (bytes)
109
800000
600000
400000
200000
0
0
0.5
1
1.5
2
2.5
3
Tiempo (segundos)
Figura 5.71: Comparación del proceso de descarga de un archivo de 990 kB utilizando
diferentes valores de n y 250 ms de RTT, sobre una red inalámbrica
(Traza del servidor).
Gracias a la gráfica del envı́o de datos del emisor, en la Figura 5.71, se confirman
que el emisor está enviando sin problemas los paquetes de datos en respuesta de los
ACKs entrantes, entonces el retardo en la recepción de paquetes en el cliente se produce
en el enlace inalámbrico de nuestra red. En el Tabla 5.8, se resume el envı́o de paquetes
en el servidor por cada RTT, para facilitar la comparación con los distintos valores de
n.
Al empezar la conexión se envı́an los paquetes de control. Luego de los primeros
0.25 segundos (transcurso del segundo RTT), el emisor envı́a 3 paquetes de datos en
todas las pruebas. A partir de este punto, se observa la diferencia entre la cantidad
de paquetes enviados en cada prueba, en el transcurso del tercer RTT (0.5 segundos),
el emisor transmite 6 paquetes de datos en la prueba de control, 15 en la prueba con
n=3, 33 en la prueba con n=9 y 51 en la prueba con n=15. En el transcurso del cuarto
RTT (0.75 segundos), envı́a en la prueba de control 12 paquetes de datos, en la prueba
con n=3 y con n=9 envı́a 75 y 363 paquetes de datos respectivamente, mientras que
en la prueba con n=15 envı́a 673 paquetes, finalizando la transmisión de datos. En el
transcurso del quinto RTT (1,25 segundos) el emisor transmite 24, 364 y 328 paquetes
de datos en la prueba de control, la de n=3 y la de n=9 respectivamente, finalizando la
transmisión de datos para esta última. En el transcurso del sexto RTT (1.25 segundos),
5.4 Pruebas sobre red Inalámbrica
RTT (s)
110
Control (pkts) n=3 (pkts) n=9 (pkts)
n=15 (pkts)
1
0
0
0
0
2
3
3
3
3
3
6
15
33
51
4
12
75
363
673
5
24
364
328
––
6
48
270
––
––
7
96
––
––
––
4
147
––
––
––
5
238
––
––
––
6
152
––
––
––
Total
727
727
727
727
Cuadro 5.8: Paquetes de datos recibidos en cada RTT.
envı́a 48 paquetes en la prueba de control y los restantes 270 paquetes en la prueba
con n=3.
Para terminar de enviar los datos al receptor en la prueba de control, al emisor
TCP le toma 4 RTT adicionales.
Con esta prueba queda demostrado que el uso de divacks proporciona una gran
ventaja aun en transmisiones largas, sin embargo debe tenerse cuidado con la cantidad
de divacks que se utilizan. Debido al medio compartido que el enlace inalámbrico
representa, los paquetes de datos disputan el derecho a ser transmitidos con los divacks.
Por lo tanto el uso de una cantidad excesiva de divacks puede entorpecer la transmisión
de datos.
Resultados:
En las siguientes gráficas se resumen los resultados obtenidos en las pruebas
realizadas. Se muestra el rendimiento y el tiempo promedio obtenido en las pruebas
para los diferentes tiempos de retardo, con distintos valores de n y tres los tamaños de
archivo.
5.4 Pruebas sobre red Inalámbrica
111
En términos generales, en las pruebas de descarga para los tres tamaños de
archivos se obtuvieron mejores resultados con el uso de la técnica de divacks, que sin
ella. Se puede observar en las gráficas que a medida que el retardo de la red es más
grande, la mejora en el rendimiento de la transferencia es mucho mayor. Para el caso
de un retardo de 125 ms (el mayor con el que se hicieron pruebas), se obtuvieron
reducciones de los tiempos promedio de descarga de 49,3 % para archivos de tamaño
99 kB, 58,6 % para archivos de tamaño 198 kB y hasta 64,9 % para archivos de tamaño
990 kB.
Para redes con retardos muy pequeños, los divacks no proporcionan mucha
ventaja, llegando incluso hasta entorpecer la transferencia de datos. Sin embargo, el
rendimiento de la transferencia no se ve afectado muy notablemente. Como podemos ver
en las gráficas, mediante el uso de divacks los tiempos de descarga siempre estuvieron
por debajo de los tiempos de descarga de control, excepto cuando no se utilizó ningún
retardo adicional, pero incluso en esos casos el aumento en el tiempo de descarga es
muy pequeño.
Por último se puede notar que entre mayor es el número de divacks utilizado,
menor es el tiempo de descarga obtenido, y por lo tanto, más grande es el rendimiento
de la transferencia.
Rendimiento (KBytes/sec)
25000
control
3divacks
9divacks
15divacks
20000
15000
10000
5000
0
0
20
40
60
80
100
120
140
Retardo (ms)
Figura 5.72: Comparación del rendimiento de descarga de archivos de tamaño 99 kB
con diferentes tiempos de retardo.
5.4 Pruebas sobre red Inalámbrica
1.2
3divacks
9divacks
15divacks
control
1
Tiempo de descarga (s)
112
0.8
0.6
0.4
0.2
0
0
10
25
40
125
Retardo (ms)
Figura 5.73: Comparación del tiempo de descarga de archivos de tamaño 99 kB con
diferentes tiempos de retardo.
Rendimiento (KBytes/sec)
25000
control
3divacks
9divacks
15divacks
20000
15000
10000
5000
0
0
20
40
60
80
100
120
140
Retardo (ms)
Figura 5.74: Comparación del rendimiento de descarga de archivos de tamaño 198
kB con diferentes tiempos de retardo.
5.4 Pruebas sobre red Inalámbrica
1.4
3divacks
9divacks
15divacks
control
1.2
Tiempo de descarga (s)
113
1
0.8
0.6
0.4
0.2
0
0
10
25
40
125
Retardo (ms)
Figura 5.75: Comparación del tiempo de descarga de archivos de tamaño 198 kB con
diferentes tiempos de retardo.
Rendimiento (KBytes/sec)
25000
control
3divacks
9divacks
15divacks
20000
15000
10000
5000
0
0
20
40
60
80
100
120
140
Retardo (ms)
Figura 5.76: Comparación del rendimiento de descarga de archivos de tamaño 990
kB con diferentes tiempos de retardo.
5.5 Conclusión
114
2.5
Tiempo de descarga (s)
2
3divacks
9divacks
15divacks
control
1.5
1
0.5
0
0
10
25
40
125
Retardo (ms)
Figura 5.77: Comparación del tiempo de descarga de archivos de tamaño 990 kB con
diferentes tiempos de retardo.
5.5.
Conclusión
En esté capı́tulo se describió detalladamente las pruebas utilizadas para observar
y medir el comportamiento de los divacks sobre transferencias de datos TCP. Ası́ como
también comprobar que la técnica de divacks fue bien implementada en el kernel Linux
v2.6.35.7 en este proyecto.
Las pruebas realizadas lograron su objetivo, se demostró que la técnica de
divacks se implementó correctamente en el kernel Linux y que ésta no interrumpe
otros algoritmos que requieren del normal funcionamiento de los ACKs.
También se comprobó bajo qué condiciones los divacks presentan mejores
resultados, y cómo su uso mejora significativamente el rendimiento de las transmisiones
de datos aprovechando rápidamente el ancho de banda disponible en la red. A medida
que el retardo de la red es más grande, la mejora en el rendimiento de la transferencia
es mucho mayor con el uso de divacks, igualmente entre mayor es el número de divacks
utilizado, menor será el tiempo de descarga, y por lo tanto, mucho mayor el rendimiento
de la transferencia.
Capı́tulo 6
Conclusiones y Recomendaciones
A lo largo del desarrollo de este proyecto se ha discutido el funcionamiento
general de TCP y la implementación de la técnica de divacks en el sistema operativo
Linux. Ası́ como también, las pruebas realizadas para comprobar su comportamiento
en distintos escenarios.
Como es bien conocido, TCP no tiene una reacción estándar para el
aprovechamiento rápido de ancho de banda disponible. Tal es el caso que planteamos
donde se tiene un acceso a los datos del orden de los cientos de milisegundos con un
acceso 802.11. En las pruebas con este escenario de gran capacidad, la técnica de divacks
busca aprovechar rápidamente este ancho de banda desde el principio de la conexión.
En el Capı́tulo 2 se habla sobre las caracterı́sticas y algoritmos de TCP, ası́ como
una vista de su implementación en Linux enfocada en la recepción y envı́o de paquetes.
Se describen los algoritmos de control de congestión utilizados, en los que se basa
la técnica de divacks y los detalles de implementación de la técnica; por ejemplo, se
describen los cuidados al inicio y fin de una conexión, el procedimiento a seguir con los
algoritmos de control de congestión, el mecanismo de envı́o de ACKs, el manejo de las
pérdidas de paquetes y el control de flujo.
La técnica de divacks se aprovecha del doble tratamiento que TCP le da a la
información. Por un lado envı́a la data en segmentos, pero por otro la cuenta en bytes.
Esto se aprovecha para aumentar el ritmo de envı́o de datos hacia el receptor. Entonces
para enviar divacks, se reconocen paquetes de datos en varios divacks que reconocen sólo
6 Conclusiones y Recomendaciones
116
una porción de dicho paquete (sin perder la semántica de TCP), pudiendo entonces
enviarse varios ACKs por un solo paquete de datos, lo que provoca un crecimiento
acelerado de la cwnd en el emisor. En el Capı́tulo 3 se explican los fundamentos de la
técnica de divacks y se demuestra cómo es capaz de ocupar rápidamente el ancho de
banda disponible mediante el incremento del ritmo de crecimiento de la cwnd.
Para probar la efectividad de la técnica de divacks, se implementó en el kernel
Linux v2.6.35.7. En el Capı́tulo 4, se explican los detalles de la implementación, desde la
descarga de las fuentes del kernel, las modificaciones realizadas, hasta la configuración
y compilación de dicho kernel.
En el Capı́tulo 5 se muestran las pruebas realizadas para cuantificar el efecto de
la técnica de divacks en el rendimiento de TCP. Se pudo observar claramente que los
divacks incrementan la velocidad de crecimiento de la cwnd a un ritmo proporcional
al número de divacks utilizado, lo cual ha demostrado en otros trabajos ser útil para
compensar la cwnd luego de pérdidas aleatorias de paquetes, timeouts o handovers.
También, gracias a este crecimiento acelerado de la cwnd, es posible aprovechar el
ancho de banda disponible más rápidamente, traduciéndose básicamente al ahorro de
varios RTT durante la transferencia de datos. El efecto de los divacks puede ser mejor
apreciado en redes con retardos grandes; tal es el caso de las redes satelitales, que
tratan con retardos de 400 ms a 800 ms. Con los resultados obtenidos en este proyecto,
se puede prever que el tiempo de mejora estarı́a en el orden de los segundos.
Una propiedad importante encontrada durante la ejecución de las pruebas, es
que el uso de un mayor número de divacks mejora el rendimiento de la transferencia
TCP. La cwnd aumenta mucho más rápido, y aunque existen otros mecanismos que
limitan el envı́o de datos, como la ventana anunciada (rwnd ) en el receptor, o el tamaño
del buffer de envı́o en el emisor, si estos son adaptados, se pueden obtener ráfagas muy
grandes de paquetes de datos en pocos RTTs. Sin embargo, se debe tomar en cuenta
que al utilizar una gran cantidad de divacks, la transferencia puede verse entorpecida
en redes 802.11, donde el medio es compartido, ya que el flujo excesivo de divacks
compite con los paquetes de datos en la contención por el medio, lo que puede retrasar
el envı́o de datos.
6 Conclusiones y Recomendaciones
117
Recomendaciones para trabajos futuros:
Se ha demostrado que la técnica de divacks permite aprovechar rápidamente el
ancho de banda disponible en una red desde el inicio de la conexión, pero para que
el mecanismo de arranque rápido sea eficiente se propone implementar en un trabajo
futuro las siguientes propuestas:
Un mecanismo para obtener un estimado del ancho de banda disponible en la
red. Esto permitirı́a calcular la cantidad necesaria de divacks que deben enviarse
para alcanzar una cwnd suficiente para utilizarlo por completo.
Un control sobre el envı́o de divacks. La intención es que una vez alcanzada la
cwnd necesaria para ocupar el ancho de banda disponible (o por lo menos la
mitad de ésta, para no saturar la red), se detenga el envı́o de divacks.
Una interfaz sencilla que permita introducir la reducción esperada en el tiempo
de descarga de un archivo, y ésta utilice la cantidad de divacks necesaria para
lograr la reducción esperada.
Referencias
Allman, M., Paxson, V., and Blanton, E. (2009). TCP Congestion Control. Internet
Standards Track RFC 5681, IETF.
Arcia, A. (2009).
Modifications du mécanisme dácquittemen du protocole TCP :
évaluation et application aux réseaux filaires et sans fils. PhD thesis, École nationale
supérieure des télécomunications de Bretagne.
Linux
linea].
Fundation
(2009,
Recuperado
19
de
noviembre).
el
16
de
Tcpprobe,
septiembre
de
2011,
[en
de
http://www.linuxfoundation.org/collaborate/workgroups/networking/tcpprobe.
Branden, R. (1989). Requirements for internet hosts – communication layers. Internet
Standards Track RFC 1122, IETF.
Handley, M., Padhye, J., and Floyd, S. (2000). TCP congestion window validation.
Internet Standards Track RFC 2861, IETF.
Hasegawa, G., Nakata, M., and Nakano, H. (2007).
Receiver-based ACK
splitting mechanism for TCP over wired/wireless heterogeneous networks. IEICE
Transactions on Communications, E90-B(5):1132–1141.
Jacobson, V., Braden, R., and Borman, D. (1992).
TCP extensions for high
performance. Internet Standards Track RFC 1323, IETF.
Jin, K., Kim, K., and Lee, J. (1999). SPACK: Rapid recovery of the TCP performance
using split-ACK in mobile communication environments. In Proceedings of IEEE
TENCON, pages 761–764, Cheju,South Korea.
REFERENCIAS
119
Kurose, J. F. and Ross, K. W. (2004). Redes de Computadores, un enfoque descendiente
basado en Internet. PEARSON Addison-Wesley, Madrid, España, 2 edition.
Matsushita, Y., Matsuda, T., and Yamamoto, M. (2005). TCP congestion control with
ACK-pacing for vertical handover. In Proceedings of IEEE WCNC, page 1497–1502,
New Orleans.
Postel, J. (1981). Transmission Control Protocol. Internet Standards Track RFC 793,
IETF.
Savage, S., Cardwell, N., Wetherall, D., and Anderson, T. (1999). TCP congestion
control with a misbehaving receiver. ACM SIGCOMM Computer Communications
Review.
Seth, S. and Venkatesulu, M. A. (2008).
TCP-IP Architecture, Design, and
Implementation in Linux. JOHN WILEY & SONS, INC., New Jersey, USA.
Wikipedia (2010, 11 de noviembre). Linux kernel, [en linea]. Recuperado el 22 de
noviembre de 2010, de http://en.wikipedia.org/wiki/Linux kernel.
Wikipedia
[en
(2010,
linea].
21
de
agosto).
Recuperado
el
Transmission
26
de
noviembre
Control
de
Protocol,
2010,
de
http://en.wikipedia.org/wiki/Transmission Control Protocol.
Wikipedia (2011, 21 de junio). Wireshark, [en linea]. Recuperado el 16 de septiembre
de 2011, de http://es.wikipedia.org/wiki/Wireshark.
Apéndice A
Scripts utilizados para la realización
y procesamiento de las pruebas
A.1.
Script para la configuración de Netem
1
# !/ bin / bash
2
#
3
# # Calomel . org
4
# # https :// calomel . org / n e t w o r k _ l o s s _ e m u l a t i o n . html
5
#
6
# Usage : ./ netem . sh $argument
7
8
9
i f [ $ # - eq 0 ]
then
10
echo " "
11
echo "
12
echo " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - "
13
echo " off
= clear all netem profiles "
14
echo " show
= show active profiles "
15
echo " activar | retraso | = enable netem profile with retraso
Calomel . org
ms of delay "
16
echo " "
netem . sh "
A.1 Script para la configuración de Netem
exit
17
18
fi
19
20
i f [ $1 = " off " ]
then
21
22
echo " netem profile off "
23
tc qdisc del dev eth0 root
24
tc qdisc del dev eth1 root
exit
25
26
fi
27
28
i f [ $1 = " show " ]
then
29
30
echo " show netem profile "
31
tc qdisc show dev eth0
32
tc qdisc show dev eth1
exit
33
34
fi
35
36
i f [ $1 = " activar " ]
then
37
38
tc qdisc add dev eth0 root netem delay $2ms
39
tc qdisc add dev eth1 root netem delay $2ms
exit
40
41
fi
42
43
# ### EOF #####
Cuadro A.1: netem.sh
121
A.2 Script para las pruebas de descarga del cliente
A.2.
1
Script para las pruebas de descarga del cliente
# !/ bin / bash
2
3
# uso : ./ downlink . sh
4
# Ejemplo : ./ downlink . sh
prueba
15 divacks
5
6
mkdir $1
7
cd $1
8
mkdir 70 packets
9
cd 70 packets
10
f o r i in $ ( seq 20) ; do
tcpdump -i wlan0 -n port 80 - vvv -w traza$i 2 >&1 >>
11
throughput . txt &
12
#
tcpdump -i eth0 -n port 80 - vvv -w traza$i 2 >&1 >>
throughput . txt &
13
tdid = $ !
14
sleep 1
15
wget http : // 1 9 2. 1 6 8. 1 . 10 4 / 70 packets 2 >&1 -o wget . out
16
cat wget . out >> throughput . txt
17
sleep 1
18
rm 70 packets
19
k i l l $tdid
20
done
21
rm wget . out
22
cat / var / log / kern . log > dmesg - cli . txt
23
cd ..
24
mkdir 140 packets
25
cd 140 packets
26
f o r i in $ ( seq 20) ; do
27
122
tcpdump -i wlan0 -n port 80 - vvv -w traza$i 2 >&1 >>
throughput . txt &
A.2 Script para las pruebas de descarga del cliente
28
#
tcpdump -i eth0 -n port 80 - vvv -w traza$i 2 >&1 >>
throughput . txt &
29
tdid = $ !
30
sleep 1
31
wget http : / / 1 9 2 . 1 6 8 . 1 . 1 0 4 / 1 4 0 packets -o wget . out
32
cat wget . out >> throughput . txt
33
sleep 1
34
rm 140 packets
35
k i l l $tdid
36
done
37
rm wget . out
38
cat / var / log / kern . log > dmesg - cli . txt
39
cd ..
40
mkdir 700 packets
41
cd 700 packets
42
f o r i in $ ( seq 20) ; do
tcpdump -i wlan0 -n port 80 - vvv -w traza$i 2 >&1 >>
43
throughput . txt &
44
#
tcpdump -i eth0 -n port 80 - vvv -w traza$i 2 >&1 >>
throughput . txt &
45
tdid = $ !
46
sleep 1
47
wget http : / / 1 9 2 . 1 6 8 . 1 . 1 0 4 / 7 0 0 packets -o wget . out
48
cat wget . out >> throughput . txt
49
sleep 1
50
rm 700 packets
51
k i l l $tdid
52
done
53
rm wget . out
54
cat / var / log / kern . log > dmesg - cli . txt
Cuadro A.2: Script bash del cliente para realizar las pruebas de descarga
123
A.3 Script para pruebas de descarga del sevidor
A.3.
1
124
Script para pruebas de descarga del sevidor
# !/ bin / bash
2
3
# uso : ./ download - servidor . sh
prueba
4
# Ejemplo : ./ download - servidor . sh
15 divacks
5
6
mkdir $1
7
cd $1
8
9
modprobe tcp_probe port =80
10
chmod 777 / proc / net / tcpprobe
11
cat / proc / net / tcpprobe > cwnd . txt &
12
TCPCAP = $ !
13
tcpdump -i eth0 -n host 192.168.1.102 - vvv -w traza - servidor &
14
TCPDUMP = $ !
15
16
read
17
18
k i l l $TCPCAP
19
k i l l $TCPDUMP
20
21
cat / var / log / kern . log > dmesg - srv . txt
Cuadro A.3: Script bash del servidor para realizar las pruebas de descarga
A.4 Scripts para el cálculo del throughput
A.4.
1
125
Scripts para el cálculo del throughput
# !/ bin / bash
2
3
# USO : throughput . sh ip . client ip . servidor
4
# EJEMPLO : ./ throughput . sh 150.185.182.66 200.47.79.53
5
6
# para download wget
7
f o r j in $ ( ls -F | grep \/ $ ) ; do
8
echo $j
9
cd $j
10
11
mv calculo - throughput . txt calculo - throughput . old
12
13
f o r i in $ ( ls - tr traza *) ; do
14
echo $i
15
tshark -r $i -o column . format : " " Time " , " %t " ," Source " , " %s
" , " Destination " , " %d " , " tcp . seq " , " %Cus : tcp . seq " , " tcp
. len " , " %Cus : tcp . len " , " IP_Flags " , " %Cus : tcp . flags " " "
ip . addr == $2 " > prueba . txt
python ~/ tesis / throughput . py $1 $2 < prueba . txt >>
16
calculo - throughput . txt
17
done
18
19
python ~/ tesis / throughput - promedio . py < calculo - throughput .
txt >> calculo - throughput . txt
20
21
22
cd ..
done
Cuadro A.4: throughput.sh
A.4 Scripts para el cálculo del throughput
1
import sys
2
3
cli = sys . argv [1]
4
srv = sys . argv [2]
5
linea = raw_input ()
6
7
# Download wget
8
primero = True
9
while linea :
datos = linea . split ()
10
11
#
T0 = tiempo de la llegada del primer paquete con datos .
i f datos [5]!= " 0 " and datos [1]== srv and primero :
12
13
t0 = float ( datos [0])
14
primero = False
15
i f datos [6]== " 0 x11 " :
16
i f datos [1]== srv :
bytes = long ( datos [4])
17
18
19
20
#
Llegada de datos desde servidor
i f datos [5]!= " 0 " and datos [1]== srv :
t1 = float ( datos [0])
21
22
23
24
25
try :
linea = raw_input ()
except EOFError :
break
26
27
tiempo = t1 - t0
28
throughput =( bytes *8) /( tiempo *1024)
29
p r i n t cli , srv , bytes /1024 , " KB " , tiempo , " s " , throughput , "
kbps "
Cuadro A.5: throughput.py
126
A.4 Scripts para el cálculo del throughput
1
linea = raw_input ()
2
3
tiempo =0
4
promedio =0
5
count =0
6
7
8
while linea :
datos = linea . split ()
9
10
count = count +1
11
tiempo = tiempo + float ( datos [4])
12
promedio = promedio + float ( datos [6])
13
14
15
16
17
try :
linea = raw_input ()
except EOFError :
break
18
19
tiempo = tiempo / count
20
promedio = promedio / count
21
22
p r i n t " Promedio " ," \ t " , tiempo , " s " , " \ t " , promedio , " Kbps "
Cuadro A.6: throughput-promedio.py
127
A.5 Scripts para la creación de las gráficas
A.5.
1
Scripts para la creación de las gráficas
# !/ bin / bash
2
3
# Uso : ./ graficar - cwnd . sh tamano - archivo ( el de la descarga )
nombre - datos1 puerto - datos1 nombre - datos2 puerto - datos2
4
# ./ graficar - cwnd . sh 99 kb 5 divacks - no - metric 49654 5 divacks
44442
5
6
python ~/ tesis / cwnd . py $3 < $2 / cwnd . txt > cwnd - $1 - $2 . txt
7
python ~/ tesis / cwnd . py $5 < $4 / cwnd . txt > cwnd - $1 - $4 . txt
8
9
python ~/ tesis / cwnd . py $7 < $6 / cwnd . txt > cwnd - $1 - $6 . txt
10
python ~/ tesis / cwnd . py $9 < $8 / cwnd . txt > cwnd - $1 - $8 . txt
11
12
gnuplot - persist << EOF
13
s e t terminal pdf
14
s e t grid
15
s e t style data linespoints
16
show timestamp
17
# set title " $2 "
18
s e t xlabel " Tiempo ( seconds ) "
19
s e t ylabel " segmentos ( cwnd , ssthresh ) "
20
21
# Leyenda
22
s e t key box
23
# set key right bottom
24
s e t key left
25
26
# Las dos muestras en una grafica
27
# set output " cwnd - $1 . pdf "
28
# plot " cwnd - $1 - $2 . txt " using 1:7 title " $2 cwnd " , \\
128
A.5 Scripts para la creación de las gráficas
29
#
129
" cwnd - $1 - $2 . txt " using 1:(\ $8 >=2147483647 ? 0 : \ $8 ) title "
$2 ssthresh " , \\
30
#
" cwnd - $1 - $4 . txt " using 1:7 title " $4 cwnd " , \\
31
#
" cwnd - $1 - $4 . txt " using 1:(\ $8 >=2147483647 ? 0 : \ $8 ) title "
$4 ssthresh "
32
33
# Cada muestra en una grafica
34
# set output " cwnd - $1 - $2 . pdf "
35
# # set xrange [0:0.07]
36
# # set yrange [0:55]
37
# plot " cwnd - $1 - $2 . txt " using 1:7 title " $2 cwnd " , \\
38
#
" cwnd - $1 - $2 . txt " using 1:(\ $8 >=2147483647 ? 0 : \ $8 ) title "
$2 ssthresh "
39
#
40
# set output " cwnd - $1 - $4 . pdf "
41
42
# plot " cwnd - $1 - $4 . txt " using 1:7 title " $4 cwnd " , \\
43
#
" cwnd - $1 - $4 . txt " using 1:(\ $8 >=2147483647 ? 0 : \ $8 ) title "
$4 ssthresh "
44
45
46
# Comparacion varios archivos
47
s e t output " cwnd - $1 - comparacion . pdf "
48
plot " cwnd - $1 - $2 . txt " using 1:7 title " $2 cwnd " , \\
49
" cwnd - $1 - $4 . txt " using 1:7 title " $4 cwnd " , \\
50
" cwnd - $1 - $6 . txt " using 1:7 title " $6 cwnd " , \\
51
" cwnd - $1 - $8 . txt " using 1:7 title " $8 cwnd " , \\
52
" cwnd - $1 - $2 . txt " using 1:(\ $8 >=2147483647 ? 0 : \ $8 ) title "
$2 ssthresh "
53
EOF
Cuadro A.7: graficar-cwnd.sh
A.5 Scripts para la creación de las gráficas
130
1
# ############################################################
2
# Filtra el achivo de la cwnd de tcp_probe usando el puerto #
3
# del cliente para que solo aparezca la cwnd de la descarga #
4
# que nos interesa y establece el tiempo de inicio en 0.
5
# ############################################################
6
import sys
7
8
prt = sys . argv [1]
9
linea = raw_input ()
10
11
while linea :
12
datos = linea . split ()
13
dst = datos [2]. split ( " : " )
14
15
i f dst [1]== prt :
16
t0 = float ( datos [0])
17
p r i n t " 0.0 " , datos [1] , datos [2] , datos [3] , datos [4] ,
datos [5] , datos [6] , datos [7] , datos [8] , datos [9]
18
break
19
20
21
22
23
try :
linea = raw_input ()
except EOFError :
break
24
25
linea = raw_input ()
26
27
while linea :
28
datos = linea . split ()
29
dst = datos [2]. split ( " : " )
30
31
i f dst [1]== prt :
#
A.5 Scripts para la creación de las gráficas
32
131
p r i n t float ( datos [0]) -t0 , datos [1] , datos [2] , datos [3] ,
datos [4] , datos [5] , datos [6] , datos [7] , datos [8] , datos
[9]
33
34
35
36
37
try :
linea = raw_input ()
except EOFError :
break
Cuadro A.8: cwnd.py
1
# !/ bin / bash
2
3
# uso : ../../../ graficar - descarga . sh
tamano - archivo ( descarga )
traza - datos1 nombre - datos1 traza - datos2 nombre - datos2
4
# Ejemplo : ../../../ graficar - descarga . sh 99 kb 5 divacks /70 packets
/ traza3 5 divacks control /70 packets / traza3 control
5
6
tshark -r $2 -o column . format : " " Time " , " %t " ," tcp . seq " , " %Cus :
tcp . seq " ," tcp . port " , " %Cus : tcp . port " " " ip . dst ==192.168.1.102
&& ip . src ==192.168.1.104 " > data - cliente - $1 - $3 . txt
7
tshark -r $2 -o column . format : " " Time " , " %t " ," tcp . ack " , " %Cus :
tcp . ack " ," tcp . port " , " %Cus : tcp . port " " " ip . dst ==192.168.1.104
&& ip . src ==192.168.1.102 " > acks - cliente - $1 - $3 . txt
8
tshark -r $4 -o column . format : " " Time " , " %t " ," tcp . seq " , " %Cus :
tcp . seq " ," tcp . port " , " %Cus : tcp . port " " " ip . dst ==192.168.1.102
&& ip . src ==192.168.1.104 " > data - cliente - $1 - $5 . txt
9
tshark -r $4 -o column . format : " " Time " , " %t " ," tcp . ack " , " %Cus :
tcp . ack " ," tcp . port " , " %Cus : tcp . port " " " ip . dst ==192.168.1.104
&& ip . src ==192.168.1.102 " > acks - cliente - $1 - $5 . txt
10
A.5 Scripts para la creación de las gráficas
11
132
tshark -r $6 -o column . format : " " Time " , " %t " ," tcp . seq " , " %Cus :
tcp . seq " ," tcp . port " , " %Cus : tcp . port " " " ip . dst ==192.168.1.102
&& ip . src ==192.168.1.104 " > data - cliente - $1 - $7 . txt
12
tshark -r $6 -o column . format : " " Time " , " %t " ," tcp . ack " , " %Cus :
tcp . ack " ," tcp . port " , " %Cus : tcp . port " " " ip . dst ==192.168.1.104
&& ip . src ==192.168.1.102 " > acks - cliente - $1 - $7 . txt
13
tshark -r $8 -o column . format : " " Time " , " %t " ," tcp . seq " , " %Cus :
tcp . seq " ," tcp . port " , " %Cus : tcp . port " " " ip . dst ==192.168.1.102
&& ip . src ==192.168.1.104 " > data - cliente - $1 - $9 . txt
14
tshark -r $8 -o column . format : " " Time " , " %t " ," tcp . ack " , " %Cus :
tcp . ack " ," tcp . port " , " %Cus : tcp . port " " " ip . dst ==192.168.1.104
&& ip . src ==192.168.1.102 " > acks - cliente - $1 - $9 . txt
15
16
gnuplot - persist << EOF
17
s e t terminal pdf
18
s e t xrange [0.0:]
19
s e t style data linespoints
20
s e t grid
21
show timestamp
22
s e t xlabel " Tiempo ( segundos ) "
23
s e t ylabel " Segmentos ( bytes ) "
24
25
# Leyenda
26
s e t key box
27
# set key right bottom
28
s e t key left
29
30
# Las dos muestras en una grafica
31
# set output " descarga - cliente - $1 . pdf "
32
# plot " data - cliente - $1 - $3 . txt " using 1:2 title " $3 " , \
33
#
" data - cliente - $1 - $5 . txt " using 1:2 title " $5 "
34
35
# Varias graficas
A.5 Scripts para la creación de las gráficas
36
s e t output " descarga - cliente - $1 . pdf "
37
plot " data - cliente - $1 - $3 . txt " using 1:2 title " $3 " , \
38
" data - cliente - $1 - $5 . txt " using 1:2 title " $5 " ,\
39
" data - cliente - $1 - $7 . txt " using 1:2 title " $7 " ,\
40
" data - cliente - $1 - $9 . txt " using 1:2 title " $9 "
133
41
42
# Cada muestra en una grafica
43
# set output " descarga - $3 . pdf "
44
# # set xrange [0:0.16]
45
# # set yrange [0:0.006]
46
# # set xrange [0.001:0.002] # zoom entre ese rango
47
# plot " data - cliente - $1 - $3 . txt " using 1:2 title " DATA " , \
48
#
" acks - cliente - $1 - $3 . txt " using 1:2 title " ACKs "
49
50
# set output " descarga - $5 . pdf "
51
# plot " data - cliente - $1 - $5 . txt " using 1:2 title " DATA " , \
52
#
" acks - cliente - $1 - $5 . txt " using 1:2 title " ACKs "
53
54
# Usando ’ with ’ cambio el estilo de la grafica - estilos : http
:// t16web . lanl . gov / Kawano / gnuplot / intro / style - e . html
55
# plot " data - cliente - $1 - $3 . txt " using 1:2 with linespoints
pointtype 6 pointsize 0.5 title " DATA " , \
56
#
" acks - cliente - $1 - $3 . txt " using 1:2 with points pointtype 4
pointsize 0.5 title " ACKs "
57
#
58
EOF
Cuadro A.9: graficar-descarga.sh
A.5 Scripts para la creación de las gráficas
1
134
# !/ bin / bash
2
3
# Uso : ../../ graficar - descarga - srv . sh tamano - archivo nombre datos1 puerto - datos1 nombre - datos2 puerto - datos2
4
# Ejemplo : ../../ graficar - descarga - srv . sh 99 kb 9 divacks 47674
control 46909
5
6
tshark -r $2 / traza - servidor -o column . format : " " Time " , " %t " ," tcp
. seq " , " %Cus : tcp . seq " ," tcp . port " , " %Cus : tcp . port " " " ip . dst
==192.168.1.102 && tcp . port == $3 " > data - $1 - $2 - srv . txt
7
tshark -r $2 / traza - servidor -o column . format : " " Time " , " %t " ," tcp
. ack " , " %Cus : tcp . ack " ," tcp . port " , " %Cus : tcp . port " " " ip . dst
==192.168.1.104 && tcp . port == $3 " > acks - $1 - $2 - srv . txt
8
tshark -r $4 / traza - servidor -o column . format : " " Time " , " %t " ," tcp
. seq " , " %Cus : tcp . seq " ," tcp . port " , " %Cus : tcp . port " " " ip . dst
==192.168.1.102 && tcp . port == $5 " > data - $1 - $4 - srv . txt
9
tshark -r $4 / traza - servidor -o column . format : " " Time " , " %t " ," tcp
. ack " , " %Cus : tcp . ack " ," tcp . port " , " %Cus : tcp . port " " " ip . dst
==192.168.1.104 && tcp . port == $5 " > acks - $1 - $4 - srv . txt
10
11
tshark -r $6 / traza - servidor -o column . format : " " Time " , " %t " ," tcp
. seq " , " %Cus : tcp . seq " ," tcp . port " , " %Cus : tcp . port " " " ip . dst
==192.168.1.102 && tcp . port == $7 " > data - $1 - $6 - srv . txt
12
tshark -r $6 / traza - servidor -o column . format : " " Time " , " %t " ," tcp
. ack " , " %Cus : tcp . ack " ," tcp . port " , " %Cus : tcp . port " " " ip . dst
==192.168.1.104 && tcp . port == $7 " > acks - $1 - $6 - srv . txt
13
tshark -r $8 / traza - servidor -o column . format : " " Time " , " %t " ," tcp
. seq " , " %Cus : tcp . seq " ," tcp . port " , " %Cus : tcp . port " " " ip . dst
==192.168.1.102 && tcp . port == $9 " > data - $1 - $8 - srv . txt
14
tshark -r $8 / traza - servidor -o column . format : " " Time " , " %t " ," tcp
. ack " , " %Cus : tcp . ack " ," tcp . port " , " %Cus : tcp . port " " " ip . dst
==192.168.1.104 && tcp . port == $9 " > acks - $1 - $8 - srv . txt
A.5 Scripts para la creación de las gráficas
15
16
17
18
19
f o r T1 in $ ( cat data - $1 - $2 - srv . txt ) ; do
break
done
20
21
22
23
f o r T2 in $ ( cat data - $1 - $4 - srv . txt ) ; do
break
done
24
25
26
27
f o r T3 in $ ( cat data - $1 - $6 - srv . txt ) ; do
break
done
28
29
30
31
f o r T4 in $ ( cat data - $1 - $8 - srv . txt ) ; do
break
done
32
33
echo T1 : $T1 T2 : $T2 T3 : $T3 T4 : $T4
34
35
36
gnuplot - persist << EOF
37
s e t terminal pdf
38
s e t xrange [0.0:]
39
s e t style data linespoints
40
s e t grid
41
show timestamp
42
# set title " $2 "
43
s e t xlabel " Tiempo ( segundos ) "
44
s e t ylabel " Segmentos ( bytes ) "
45
46
# Leyenda
47
s e t key box
135
A.5 Scripts para la creación de las gráficas
48
s e t key left
49
# set key right bottom
136
50
51
# Varias muestras en una grafica
52
s e t output " descarga - servidor - $1 . pdf "
53
plot " data - $1 - $2 - srv . txt " using (\ $1 - $T1 ) :2 title " $2 " , \
54
" data - $1 - $4 - srv . txt " using (\ $1 - $T2 ) :2 title " $4 " , \
55
" data - $1 - $6 - srv . txt " using (\ $1 - $T3 ) :2 title " $6 " , \
56
" data - $1 - $8 - srv . txt " using (\ $1 - $T4 ) :2 title " $8 "
57
58
# Cada muestra en una grafica
59
# set output " descarga - $1 - $2 - srv . pdf "
60
# # set xrange [0.0:0.16]
61
# # set xrange [0.001:0.002] # zoom entre ese rango o para colocar
ambas graficas en la misma escala
62
# plot " data - $1 - $2 - srv . txt " using (\ $1 - $T1 ) :2 title " DATA " , \
63
#
" acks - $1 - $2 - srv . txt " using (\ $1 - $T1 ) :2 title " ACKs "
64
65
# set output " descarga - $1 - $4 - srv . pdf "
66
# # set xrange [0.001:0.002] # zoom entre ese rango
67
# plot " data - $1 - $4 - srv . txt " using (\ $1 - $T2 ) :2 title " DATA " , \
68
#
" acks - $1 - $4 - srv . txt " using (\ $1 - $T2 ) :2 title " ACKs "
69
70
EOF
Cuadro A.10: graficar-descarga-srv.sh
A.5 Scripts para la creación de las gráficas
1
137
# !/ bin / bash
2
3
# Uso :
./ graficar - throughput . sh archivo - datos ( sin extencion )
nombre - datos1 nombre - datos2 ...
4
# Ejemplo :
./ graficar - throughput . sh prueba2 -99 kb 9 divacks
control
5
6
gnuplot - persist << EOF
7
8
s e t terminal pdf
9
s e t output " $1 - tiempo . pdf "
10
# set output " $1 - Throughput . pdf "
11
s e t grid
12
13
# Leyenda
14
s e t key box
15
s e t key left
16
17
# Girar etiquetas en X
18
# set xtics rotate by 45 nomirror offset 0 , -1
19
20
# set title " Prueba de Rendimiento "
21
s e t ylabel " Tiempo de descarga ( s ) "
22
# set ylabel " Rendimiento ( KBytes / sec ) "
23
s e t xlabel " Retardo ( ms ) "
24
s e t yrange [0:]
25
s e t boxwidth 1.0 relative
26
s e t style data histograms
27
s e t style fill pattern 4 border lt -1 # Barras con patrones (
interior )
28
# set style fill solid 1.0 border # barras con color solido
29
# Para histograma sin graficar error
A.5 Scripts para la creación de las gráficas
30
138
s e t style histogram clustered gap 1
31
32
# Para comparar dos graficas
33
# Tempo de descarga :
34
plot f o r [ COL =2:2:1] ’ $1 . txt ’ using COL : xticlabels (1) title " $2
", \
f o r [ COL =4:4:1] ’ $1 . txt ’ using COL : xticlabels (1) title " $3 "
35
36
# Throughput graficas suavizadas
37
# plot " $1 . txt " using 1:3 with lines title " $2 " smooth sbezier ,
\
38
#
" $1 . txt " using 1:5 with lines title " $3 " smooth sbezier
39
# Varios divacks , control referencia , tiempo
40
plot f o r [ COL =4:4:1] ’ $1 . txt ’ using COL : xticlabels (1) title " $3
", \
f o r [ COL =6:6:1] ’ $1 . txt ’ using COL : xticlabels (1) title " $4 "
41
, \
f o r [ COL =8:8:1] ’ $1 . txt ’ using COL : xticlabels (1) title " $5 "
42
, \
’ $1 . txt ’ using 2: xticlabels (1) with histeps lc -1 title " $2
43
"
44
# Varios divacks throughput graficas suavizadas
45
# plot " $1 . txt " using 1:3 with lines title " $2 " lc -1 smooth
sbezier , \
46
#
" $1 . txt " using 1:5 with lines title " $3 "
lc 1 smooth
sbezier , \
47
#
" $1 . txt " using 1:7 with lines title " $4 "
lc 2 smooth
sbezier , \
48
#
" $1 . txt " using 1:9 with lines title " $5 "
lc 3 smooth
sbezier
49
50
EOF
Cuadro A.11: graficar-throughput.sh
Descargar