{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Sujet 4 : Estimation de la latence et de la capacité d’une connexion à partir de mesures asymétriques"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On commence par déclarer les bibliothèques utilisés :\n",
"\n",
"Note : `urllib.request` n'y est pas car elle n'est utilisée que dans le cas où on doit télécharger les données."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import re\n",
"import gzip\n",
"import time\n",
"import pandas\n",
"import io\n",
"import os\n",
"import datetime\n",
"import matplotlib.pyplot as plt\n",
"import statsmodels.api"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Connexion courte à l'intérieur d'un campus"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On commence par récupérer les données à étudier :"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Les données sont déjà présentes en local.\n"
]
}
],
"source": [
"def telecharger_fichier_si_necessaire(data_url):\n",
"\n",
" # Extrait le nom du fichier à partir de l'URL\n",
" data_file = data_url[(data_url.rindex(\"/\")+1):]\n",
"\n",
" # Vérification de l'extention\n",
" if data_file[-7:] != \".log.gz\":\n",
" raise Exception(\"Le fichier nom de fichier \"+data_file+\" ne finit pas par \\\".log.gz\\\" !\")\n",
"\n",
" if not os.access(data_file, os.R_OK):\n",
" import urllib.request\n",
" print(\"Les données n'existent pas en local, on les télécharges.\")\n",
" urllib.request.urlretrieve(data_url, data_file)\n",
" if os.access(data_file, os.R_OK):\n",
" print(\"Fichier récupéré.\")\n",
" else:\n",
" raise Exception(\"Le fichier n'a pas pu être récupéré !\")\n",
" else:\n",
" print(\"Les données sont déjà présentes en local.\")\n",
"\n",
"telecharger_fichier_si_necessaire(\"http://mescal.imag.fr/membres/arnaud.legrand/teaching/2014/RICM4_EP_ping/liglab2.log.gz\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On définit la fonction qui va lire chaque ligne pour en extraire les données. La ligne retournée sera formatée en CSV.\n",
"\n",
"Comme ce qui nous intéresse est le temps mis pour latence (ou \"ping\") il faut impérativement que celle ci soit présente pour que la ligne soit reconnue, pour les lignes dans ce cas on retournera `Ǹone`.\n",
"\n",
"Si la ligne est totalement illisible on soulèvera une exception afin d'avertir l'utilisateur qu'il y a des lignes dont le format est illisible par le programme. Ceci est préférable au fait de retourner `Ǹone` car si c'était le cas on risquerait de masquer des données utiles, par exemple si `ping` avait retourné des données en secondes plutôt qu'en millisecondes."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1421761682.052172,665,22.5\n",
"\n",
"None\n",
"\n",
"Exception (attendue) : La ligne \"[1421761682.052172] 665 bytes from lig-publig.imag.fr (129.88.11.7): icmp_seq=1 ttl=60 time=22.5 s\" n'est pas dans le format attendu.\n"
]
}
],
"source": [
"extractDataFromLineRegExp = re.compile(\"^\\[([0-9\\.]+)\\] ([0-9]+) bytes[^:]*: icmp_seq=[0-9]+ ttl=[0-9]+( time=([0-9\\.]+) ms)?$\")\n",
"def extractDataFromLine(line):\n",
" match = extractDataFromLineRegExp.match(line)\n",
" if match and match[4]:\n",
" return match[1]+\",\"+match[2]+\",\"+match[4]+\"\\n\"\n",
" elif match:\n",
" return None\n",
" else:\n",
" raise Exception(\"La ligne \\\"\"+line+\"\\\" n'est pas dans le format attendu.\")\n",
"\n",
"# Quelques essais\n",
"print(extractDataFromLine(\"[1421761682.052172] 665 bytes from lig-publig.imag.fr (129.88.11.7): icmp_seq=1 ttl=60 time=22.5 ms\")) # Le retour à la ligne est inclus dans ce qui est retourné\n",
"print(extractDataFromLine(\"[1421773281.582445] 13 bytes from stackoverflow.com (198.252.206.140): icmp_seq=1 ttl=50\"))\n",
"print()\n",
"try:\n",
" print(extractDataFromLine(\"[1421761682.052172] 665 bytes from lig-publig.imag.fr (129.88.11.7): icmp_seq=1 ttl=60 time=22.5 s\"))\n",
" print(\"On devrait avoir une exception ici.\")\n",
"except Exception as e:\n",
" print(\"Exception (attendue) : \"+e.args[0])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Lit les données du fichier, utilise la fonction `extractDataFromLine` définit précédemment pour extraire les données et les placer dans une variables `csv_data` qui contiendra les données au format CSV.\n",
"\n",
"J'ai dans un premier temps essayé de ne pas passer par une variable intermédiaire et ajouter les données directement dans le DataFrame mais c'était extrêmement lent. Il aurait aussi été possible de passer par un fichier intermédiaire. En cas de données plus imposantes cela aurait été nécessaire."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Lu 44413 lignes en 0.189 sec\n"
]
}
],
"source": [
"def convertit_fichier_en_csv(data_file):\n",
" nb = 0\n",
" start_time = time.time()\n",
" data = '\"date\",\"size\",\"time\"\\n' # La première ligne du CSV à les noms de champs\n",
" with gzip.open(data_file, 'rb') as file:\n",
" for line in file:\n",
" line_data = extractDataFromLine(line.decode('utf-8').strip())\n",
" if line_data:\n",
" data += line_data\n",
" nb += 1\n",
"\n",
" print (\"Lu %d lignes en %.3f sec\" % (nb, time.time() - start_time))\n",
" return data\n",
"\n",
"csv_data = convertit_fichier_en_csv(\"liglab2.log.gz\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Traduit le tableau du format CSV en temps que DataFrame pandas. Comme on lit depuis le contenu d'une variable on utilise `io.StringIO` qui permet de lire une variable comme on lit un fichier."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"raw_data['time'].plot(style='*')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On remarque quelques points avec une latence nettement plus importante que d'habitude.\n",
"\n",
"Sinon en histogramme (attention l'échelle est logarithmique) :"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"raw_data['time'].hist(log=True, bins=50)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On remarque bien que la majorité des requêtes ont une réponse quasi immédiate. Beaucoup ont une réponse dans les 30 ms. Les durées de 70-80 ms semble être surprenamment courantes. Il n'y a que très peu de réponses dont la durée est supérieure à 90ms."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Y a t'il une variabilité par heure ou par jour de la semaine ?\n",
"\n",
"Comme il s'agit d'un campus on peut s'attendre à une variabilité des performances due aux activités. On peut supposer que le réseau soit plus chargé durant les jours ouvrées et aux heures de travail."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"def timestamp_vers_heure(timestamp):\n",
" str_time = datetime.datetime.fromtimestamp(timestamp).strftime('%H:%M:%S')\n",
" parts = str_time.split(':')\n",
" return float(parts[0]) + (float(parts[1]) / 60.0) + (float(parts[0]) / 3600.0)\n",
"\n",
"raw_data['heure'] = [timestamp_vers_heure(ts) for ts in raw_data['date']]\n",
"raw_data.plot(x='heure', y='time', style='*')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Il semblerait que seuls quelques heures dans l'après midi soit présentes. Les données ont été prises juste sur quelques heures ou plusieurs jours aux mêmes heures ? Il aurait fallu vérifier la durée des l'observation."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"20/01/2015 13:48:02\n",
"20/01/2015 16:26:26\n"
]
}
],
"source": [
"print(datetime.datetime.fromtimestamp(raw_data['date'].min()).strftime('%d/%m/%Y %H:%M:%S'))\n",
"print(datetime.datetime.fromtimestamp(raw_data['date'].max()).strftime('%d/%m/%Y %H:%M:%S'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Les données ne sont présente que pour une petite tranche horaire durant une seule journée. Il s'agit d'un mardi donc jour ouvré mais je ne penses pas que l'on puisse faire des statistiques liés à la variation de charge réseau. Les données ne montrent pas de fortes variations qui pourrait être expliqué par un usage très différent du réseau à un moment donné."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Temps de transmission en fonction de la taille des messages et effet de la segmentation.\n",
"\n",
"On va commencer par une petite visualisation graphique du phénomène :"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"raw_data.plot(x='size', y='time', style='*')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On voit bien les effets de la segmentation du paquet qui commence un peu avant 1500. C'est visiblement ce qui à été à l'origine de la bizarrerie que j'avais constaté et qui fait qu'il y a une augmentation du nombre de requêtes autour de 70~80 ms par rapport à des durées légèrement plus brèves.\n",
"\n",
"Il faut donc savoir si on veut tester la transmission avec ou sans la capacité des routeurs à segmenter les paquets.\n",
"\n",
"Le fait que la limite soit proche de 1500 laisse penser que le réseau est basé sur de l'Ethernet sans Jumbo frames ce qui est cohérent avec ce que l'on trouve habituellement dans les universités. Le MTU de l'Ethernet est de 1500 auquel il faut soustraire la taille de l'entête IPv4 qui est de 20 octets (sauf options mais peu probable). L'entête du paquet ICMP (8 octets) est normalement inclus dans le retour de la commande `ping` donc on ne le retranchera pas.\n",
"\n",
"Il aurait été intéressant de tester le MTU grâce aux commandes suivantes :\n",
"```\n",
"ping -4 -M do -s 1472 lig-publig.imag.fr\n",
"ping -4 -M do -s 1473 lig-publig.imag.fr\n",
"```\n",
"Si le MTU est bien de 1500 (incluant l'entête IPv4) la première commande devrait réussir mais la seconde échouer. Je précise que contrairement à la sortie de la commande, le paramètre \"-s\" n'inclus pas les 8 octets de l'entête ICMP.\n",
"\n",
"#### Cas sans segmentation (size <= 1480) \n",
"\n",
"On sélectionne donc les entrées de 1480 octets ou moins :"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"