Projet

Général

Profil

Projet agregation v2 » Historique » Version 93

Laurent GUERBY, 01/05/2016 09:33

1 14 Laurent GUERBY
{{>toc}}
2 14 Laurent GUERBY
3 1 Laurent GUERBY
h1. Projet agregation v2
4 1 Laurent GUERBY
5 93 Laurent GUERBY
* http://ee.lbl.gov/papers/congavoid.pdf
6 93 Laurent GUERBY
** Congestion Avoidance and Control
7 12 Laurent GUERBY
* [[Projet agregation]]
8 12 Laurent GUERBY
* uTP (uTorrent transport protocol) is a transport protocol which uses one-way delay measurements for its congestion controller. http://www.rasterbar.com/products/libtorrent/utp.html
9 13 Laurent GUERBY
* Low Extra Delay Background Transport (LEDBAT) https://datatracker.ietf.org/doc/draft-ietf-ledbat-congestion/
10 20 Laurent GUERBY
* QoS tail drop vs by IP http://lists.tetalab.org/pipermail/tetaneutral/2011-April/000129.html
11 24 Laurent GUERBY
* tc http://marc.info/?l=netfilter&m=129669999112670&w=2
12 27 Laurent GUERBY
* tc TEQL http://lartc.org/howto/lartc.loadshare.html
13 27 Laurent GUERBY
* tc NATALIE http://flap.mynetmemo.com/wp-content/uploads/2012/04/NATALIE.pdf
14 28 Laurent GUERBY
* VXLAN Virtual eXtensible LANs layer 2 over UDP tunnel http://linux-network-plumber.blogspot.fr/2012/09/just-published-linux-kernel.html
15 28 Laurent GUERBY
** http://tools.ietf.org/html/draft-mahalingam-dutt-dcops-vxlan-02
16 28 Laurent GUERBY
** http://blogs.cisco.com/datacenter/digging-deeper-into-vxlan/
17 29 Laurent GUERBY
* http://hardware.slashdot.org/story/12/10/23/1946248/increasing-wireless-network-speed-by-1000-by-replacing-packets-with-algebra
18 29 Laurent GUERBY
** http://www.mit.edu/~medard/papers2011/Modeling%20Network%20Coded%20TCP.pdf
19 30 Laurent GUERBY
** http://en.wikipedia.org/wiki/Linear_network_coding
20 31 Laurent GUERBY
* MPTCP
21 31 Laurent GUERBY
** https://linuxfr.org/news/mptcp-tcp-dans-un-monde-ultra-connecte
22 31 Laurent GUERBY
** https://archive.fosdem.org/2012/schedule/event/multipathtcp.html
23 32 Laurent GUERBY
* LEDBAT
24 32 Laurent GUERBY
** http://www.bortzmeyer.org/6817.html
25 32 Laurent GUERBY
** http://tools.ietf.org/wg/ledbat
26 33 Laurent GUERBY
* http://www.coverfire.com/archives/2013/01/01/improving-my-home-internet-performance/
27 33 Laurent GUERBY
** http://git.coverfire.com/?p=linux-qos-scripts.git;a=blob;f=src-3tos.sh;hb=HEAD
28 34 Laurent GUERBY
** http://www.coverfire.com/archives/2011/02/21/network-latency-experiments
29 34 Laurent GUERBY
** http://www.coverfire.com/projects/ping-exp/
30 35 Laurent GUERBY
* http://multipath-tcp.org/pmwiki.php?n=Main.50Gbps
31 35 Laurent GUERBY
* https://code.google.com/p/kernel/wiki/NetScalingGuide
32 36 Laurent GUERBY
* Rate < (MSS/RTT)*(1 / sqrt(p)) where p is the probability of packet loss.
33 36 Laurent GUERBY
** Credit: Mathis, Semke, Mahdavi & Ott in Computer Communication Review, 27 (3), July 1997, titled The macroscopic behavior of the TCP congestion avoidance algorithm.
34 36 Laurent GUERBY
** http://www.infoblox.com/community/blog/tcp-performance-and-mathis-equation 
35 37 Laurent GUERBY
* https://gettys.wordpress.com/2013/07/10/low-latency-requires-smart-queuing-traditional-aqm-is-not-enough/
36 38 Laurent GUERBY
* Confused, Timid, and Unstable: Picking a Video Streaming Rate is Hard http://www.stanford.edu/~huangty/imc012-huang.pdf
37 39 Laurent GUERBY
* http://linuxfr.org/wiki/Une-introduction-au-contr%C3%B4le-du-trafic-r%C3%A9seau-avec-Linux
38 40 Laurent GUERBY
* http://www.coverfire.com/articles/queueing-in-the-linux-network-stack/
39 41 Laurent GUERBY
* A delay-based metric for the Babel routing protocol http://www.pps.univ-paris-diderot.fr/~jch/research/rapport-jonglez-2013.pdf
40 42 Laurent GUERBY
* Linux Base Driver for the Intel(R) Ethernet 10 Gigabit PCI Express Family of Adapters http://downloadmirror.intel.com/14687/eng/readme.txt
41 43 Laurent GUERBY
* HTB burst cburst http://mailman.ds9a.nl/pipermail/lartc/2005q3/016682.html
42 43 Laurent GUERBY
** http://www.docum.org/docum.org/tests/htb/burst/
43 43 Laurent GUERBY
** http://linux-ip.net/traffic-control/htb-class.png
44 43 Laurent GUERBY
** http://linux-ip.net/traffic-control/diagram.html
45 44 Laurent GUERBY
* Multiwan avec une Mikrotik RB750UP http://blog.lekermeur.net/?p=2129
46 44 Laurent GUERBY
** Load Balancing Using  PCC & RouterOS http://mum.mikrotik.com/presentations/US12/steve.pdf
47 45 Laurent GUERBY
* http://git.coverfire.com/?p=linux-qos-scripts.git;a=blob;f=src-3tos.sh;hb=HEAD
48 46 Laurent GUERBY
* UDT: Breaking the Data Transfer Bottleneck http://udt.sourceforge.net/index.html
49 92 Laurent GUERBY
* TCP Tuning for the Web [linux.conf.au 2014] https://www.youtube.com/watch?v=hzPVeYtoNdE
50 1 Laurent GUERBY
51 1 Laurent GUERBY
h2. Divers
52 1 Laurent GUERBY
53 1 Laurent GUERBY
* 1 Mbit/s = 83 frames de 1500 byte/sec = 1 frame de 1500 byte toutes les 12 ms
54 1 Laurent GUERBY
* l'augmentation de latence sur la ligne permet la detection de la saturation des buffer
55 1 Laurent GUERBY
* on peut mesurer les variations de latence en regardant les variations de difference de timestamp destination moins source
56 8 Laurent GUERBY
* sur 1 Mbit/s si 20 utilisateurs envoient des paquets de 1500 byte ca fait 4 frame de 1500 byte/sec par utilisateur soit une latence de 250ms (~ 50 kbit/s par utilisateur)
57 2 Laurent GUERBY
58 6 Laurent GUERBY
h2. Resolution de time.time()
59 1 Laurent GUERBY
60 4 Laurent GUERBY
* http://stackoverflow.com/questions/1938048/high-precision-clock-in-python
61 2 Laurent GUERBY
62 4 Laurent GUERBY
<pre>
63 2 Laurent GUERBY
guerby@pc2:~/work/tetaneutral.net/python/pa2$ cat ttime.py 
64 2 Laurent GUERBY
import time
65 2 Laurent GUERBY
66 2 Laurent GUERBY
N=1000
67 2 Laurent GUERBY
l=[]
68 2 Laurent GUERBY
for i in xrange(N):
69 2 Laurent GUERBY
    t1=time.time()
70 2 Laurent GUERBY
    t2=time.time()
71 2 Laurent GUERBY
    dt=t2-t1
72 2 Laurent GUERBY
    l.append(dt)
73 2 Laurent GUERBY
74 2 Laurent GUERBY
l.sort()
75 2 Laurent GUERBY
print l[0],l[-1],l[N/2],l[9*N/10]
76 2 Laurent GUERBY
guerby@pc2:~/work/tetaneutral.net/python/pa2$ python ttime.py 
77 2 Laurent GUERBY
9.53674316406e-07 3.00407409668e-05 1.90734863281e-06 2.14576721191e-06
78 2 Laurent GUERBY
guerby@pc2:~/work/tetaneutral.net/python/pa2$ python ttime.py 
79 2 Laurent GUERBY
9.53674316406e-07 1.19209289551e-05 1.90734863281e-06 2.14576721191e-06
80 2 Laurent GUERBY
guerby@pc2:~/work/tetaneutral.net/python/pa2$ python ttime.py 
81 2 Laurent GUERBY
9.53674316406e-07 0.000508069992065 1.90734863281e-06 2.14576721191e-06
82 2 Laurent GUERBY
</pre>
83 2 Laurent GUERBY
84 2 Laurent GUERBY
=> autour de 2 microsecondes en pratique
85 1 Laurent GUERBY
86 45 Laurent GUERBY
h2. Résolution de select en python
87 3 Laurent GUERBY
88 4 Laurent GUERBY
<pre>
89 3 Laurent GUERBY
guerby@pc2:~/work/tetaneutral.net/python/pa2$ cat tselect.py 
90 3 Laurent GUERBY
import time
91 3 Laurent GUERBY
import select
92 3 Laurent GUERBY
from socket import *
93 3 Laurent GUERBY
from select import select
94 3 Laurent GUERBY
95 3 Laurent GUERBY
96 3 Laurent GUERBY
97 3 Laurent GUERBY
s1 = socket(AF_INET, SOCK_DGRAM)
98 3 Laurent GUERBY
s2 = socket(AF_INET, SOCK_DGRAM)
99 3 Laurent GUERBY
100 3 Laurent GUERBY
N=1000
101 3 Laurent GUERBY
l=[]
102 3 Laurent GUERBY
for i in xrange(N):
103 3 Laurent GUERBY
    t1=time.time()
104 3 Laurent GUERBY
    r = select([s1,s2],[],[],1.0e-9)
105 3 Laurent GUERBY
    t2=time.time()
106 3 Laurent GUERBY
    dt=t2-t1
107 3 Laurent GUERBY
    l.append(dt)
108 3 Laurent GUERBY
109 3 Laurent GUERBY
l.sort()
110 1 Laurent GUERBY
print l[0],l[-1],l[N/2],l[9*N/10]
111 3 Laurent GUERBY
guerby@pc2:~/work/tetaneutral.net/python/pa2$ python tselect.py 
112 3 Laurent GUERBY
9.77516174316e-06 0.000253915786743 1.09672546387e-05 1.12056732178e-05
113 3 Laurent GUERBY
guerby@pc2:~/work/tetaneutral.net/python/pa2$ python tselect.py 
114 3 Laurent GUERBY
9.77516174316e-06 5.41210174561e-05 1.09672546387e-05 1.12056732178e-05
115 4 Laurent GUERBY
</pre>
116 3 Laurent GUERBY
117 1 Laurent GUERBY
=> 12 microsecondes
118 1 Laurent GUERBY
=> 18 microsecondes avec 5 socket vs 2 donc compter + 2 micro/socket
119 6 Laurent GUERBY
120 6 Laurent GUERBY
h2. Generer un payload random
121 6 Laurent GUERBY
122 6 Laurent GUERBY
* http://docs.python.org/library/random.html
123 6 Laurent GUERBY
* http://docs.python.org/library/struct.html
124 6 Laurent GUERBY
125 6 Laurent GUERBY
<pre>
126 6 Laurent GUERBY
import random
127 6 Laurent GUERBY
import struct
128 6 Laurent GUERBY
129 6 Laurent GUERBY
130 6 Laurent GUERBY
N=256*256*256*256-1
131 6 Laurent GUERBY
S=160000
132 6 Laurent GUERBY
random.seed(0)
133 6 Laurent GUERBY
s="".join([struct.pack("I",random.randint(0,N)) for i in xrange(S/4)])
134 6 Laurent GUERBY
print S,len(s)
135 6 Laurent GUERBY
</pre>
136 6 Laurent GUERBY
137 9 Laurent GUERBY
h2. Premiere mesure de controle de latence : debit
138 6 Laurent GUERBY
139 6 Laurent GUERBY
* sur une ligne ADSL capable de 11 Mbit/s soutenu TCP
140 6 Laurent GUERBY
* du serveur (gw) vers le client (stg) on envoie un paquet UDP de 1200 byte toutes les 1200/D secondes avec un numero de sequence, un timestamp serveur en microseconde et un payload random
141 6 Laurent GUERBY
* sur le client on note le timestamp client en microseconde, le numero de sequence et le timestamp server du paquet
142 6 Laurent GUERBY
* une fois le test fini (1000 paquets) on calcule paquet par paquet la difference timestamp client moins timestamp server
143 7 Laurent GUERBY
* on calcul le min de ces differences sur tous les paquets
144 1 Laurent GUERBY
* on graphe chaque difference moins le min des difference = la deviation par rapport a la normale en microseconde
145 6 Laurent GUERBY
146 45 Laurent GUERBY
Avec D = 10 Mbit/s = en dessous de la capacité de la ligne ça donne :
147 1 Laurent GUERBY
148 6 Laurent GUERBY
!10-1200.png!
149 6 Laurent GUERBY
150 45 Laurent GUERBY
Avec D = 15 Mbit/s = au dessus de la capacité de la ligne ça donne :
151 1 Laurent GUERBY
152 1 Laurent GUERBY
!15-1200.png!
153 6 Laurent GUERBY
154 7 Laurent GUERBY
On voit sur les deux graphes des petits pics qui correspondent aux moments ou le modem ADSL pedale un peu pour envoyer.
155 7 Laurent GUERBY
156 1 Laurent GUERBY
On voit donc dans le deuxieme cas le buffer du modem se remplir au fur et a mesure de l'envoi des paquets => c'est parfaitement observable donc maitrisable.
157 6 Laurent GUERBY
158 7 Laurent GUERBY
Le but de l'algorithme de controle est de baisser le debit cible quand on voit la mesure de controle deriver pour la ramener proche d'un niveau normal.
159 1 Laurent GUERBY
160 45 Laurent GUERBY
Note : a cause d'un drift possible d'horloge entre le client et le serveur le niveau normal de la mesure doit etre calculé sur les N derniers paquets / minutes.
161 9 Laurent GUERBY
162 9 Laurent GUERBY
h2. Deuxieme mesure : paquet par seconde
163 9 Laurent GUERBY
164 45 Laurent GUERBY
Cette fois ci a debit fixé a 10 Mbit/s soit en dessous de la capacité de la ligne on fait varier la taille du paquet donc le nombre de paquet par seconde (pps)
165 9 Laurent GUERBY
166 9 Laurent GUERBY
* Taille 200 = 5485 pps 8.7 Mbit/s sur theo a 6250 pps
167 9 Laurent GUERBY
!10-200.png!
168 9 Laurent GUERBY
169 9 Laurent GUERBY
* Taille 350 = 3552 pps 9.9 Mbit/s sur theo a 3570 pps
170 9 Laurent GUERBY
!10-350.png!
171 1 Laurent GUERBY
172 1 Laurent GUERBY
* Taille 400 = 3126 pps 10 Mbit/s sur theo a 3125 pps
173 9 Laurent GUERBY
!10-400.png!
174 9 Laurent GUERBY
175 9 Laurent GUERBY
On voit donc qu'il y a aussi une limite de traitement en pps sur le modem qui peut entrainer du buffer bloat
176 10 Laurent GUERBY
177 45 Laurent GUERBY
A noter que si on rajoute les 20 bytes de header IP et 8 byte de header UDP dans le compteur de débit on sature plutot vers 6500 pps pour 10 Mbit/s, soit 190 byte/packet, payload de 190-20-8=162 byte
178 10 Laurent GUERBY
179 45 Laurent GUERBY
Script de test utilisé : attachment:iperf-20120304.py
180 14 Laurent GUERBY
181 14 Laurent GUERBY
h2. tuntap
182 14 Laurent GUERBY
183 22 Laurent GUERBY
http://en.wikipedia.org/wiki/IEEE_802.3
184 22 Laurent GUERBY
185 14 Laurent GUERBY
http://backreference.org/2010/03/26/tuntap-interface-tutorial/
186 14 Laurent GUERBY
187 14 Laurent GUERBY
* http://www.mjmwired.net/kernel/Documentation/networking/tuntap.txt#102
188 14 Laurent GUERBY
<pre>
189 14 Laurent GUERBY
3.2 Frame format:
190 14 Laurent GUERBY
	  If flag IFF_NO_PI is not set each frame format is: 
191 14 Laurent GUERBY
	     Flags [2 bytes]
192 1 Laurent GUERBY
	     Proto [2 bytes]
193 14 Laurent GUERBY
	     Raw protocol(IP, IPv6, etc) frame.
194 14 Laurent GUERBY
</pre>
195 14 Laurent GUERBY
196 25 Laurent GUERBY
* http://www.siongboon.com/projects/2006-03-06_serial_communication
197 14 Laurent GUERBY
198 14 Laurent GUERBY
* http://en.wikipedia.org/wiki/Ethernet_frame
199 14 Laurent GUERBY
<pre>
200 45 Laurent GUERBY
Preamble		Start of frame delimiter	MAC destination	MAC source	802.1Q tag (optional)	Ethertype (Ethernet II) or length (IEEE 802.3)	Payload	Frame check sequence (32‑bit CRC)	Interframe gap
201 45 Laurent GUERBY
7 octets of 10101010	1 octet of 10101011	6 octets	6 octets	(4 octets)	2 octets	42–1500 octets	4 octets	12 octets
202 14 Laurent GUERBY
</pre>
203 14 Laurent GUERBY
204 16 Laurent GUERBY
* http://en.wikipedia.org/wiki/Ethernet_II_framing#Ethernet_II
205 17 Laurent GUERBY
* http://en.wikipedia.org/wiki/EtherType
206 17 Laurent GUERBY
For example, an EtherType value of 
207 17 Laurent GUERBY
0x0800 signals that the frame contains an IPv4 datagram. 
208 17 Laurent GUERBY
0x0806 indicates an ARP frame, 
209 17 Laurent GUERBY
0x8100 indicates an IEEE 802.1Q frame
210 17 Laurent GUERBY
0x86DD indicates an IPv6 frame. 
211 17 Laurent GUERBY
0x8035 RARP
212 17 Laurent GUERBY
0x8870	Jumbo Frames
213 17 Laurent GUERBY
0x88A2	ATA over Ethernet
214 17 Laurent GUERBY
0x88CC	LLDP
215 17 Laurent GUERBY
0x9100	Q-in-Q
216 17 Laurent GUERBY
217 16 Laurent GUERBY
218 14 Laurent GUERBY
* http://en.wikipedia.org/wiki/IPv4#Packet_structure
219 14 Laurent GUERBY
version premier 4 bits du premier octet = 4
220 14 Laurent GUERBY
ip source octet 13 a 16
221 14 Laurent GUERBY
ip dest octet 17 a 20
222 14 Laurent GUERBY
223 14 Laurent GUERBY
* http://en.wikipedia.org/wiki/IPv6_packet
224 14 Laurent GUERBY
version premier 4 bits du premier octet = 6
225 14 Laurent GUERBY
ip source octet 9 a 24
226 14 Laurent GUERBY
ip dest octet 25 a 40
227 15 Laurent GUERBY
228 18 Laurent GUERBY
<pre>
229 18 Laurent GUERBY
# envoyer un paquet UDP "AAAA" en python IPv4 et IPv6
230 18 Laurent GUERBY
import socket
231 18 Laurent GUERBY
addr=""
232 18 Laurent GUERBY
buf="AAAA"
233 18 Laurent GUERBY
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
234 18 Laurent GUERBY
peer=("10.40.0.1",32767)
235 18 Laurent GUERBY
s.bind((addr, 0))
236 18 Laurent GUERBY
s.sendto(buf,peer)
237 18 Laurent GUERBY
238 18 Laurent GUERBY
s6 = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
239 18 Laurent GUERBY
s6.bind((addr, 0))
240 18 Laurent GUERBY
peer6=("2a01:6600:8081:cb01::1",32767)
241 18 Laurent GUERBY
s6.sendto(buf,peer6)
242 18 Laurent GUERBY
</pre>
243 18 Laurent GUERBY
244 18 Laurent GUERBY
Resultats sur tuntap :
245 18 Laurent GUERBY
246 18 Laurent GUERBY
<pre>
247 18 Laurent GUERBY
ipv4
248 19 Laurent GUERBY
depuis 10.40.0.2 MAC f2:b3:28:1c:f4:88 
249 19 Laurent GUERBY
vers 10.40.0.1:32767 MAC 26:af:3e:41:71:be
250 18 Laurent GUERBY
envoi UDP payload "AAAA"
251 18 Laurent GUERBY
252 19 Laurent GUERBY
paquet len = 50
253 18 Laurent GUERBY
000 00  000 00  008 08  000 00  038 26  175 AF  062 3E  065 41  113 71  190 BE  242 F2  179 B3  040 28  028 1C  244 F4  136 88 
254 1 Laurent GUERBY
008 08  000 00  069 45  000 00  000 00  032 20  000 00  000 00  064 40  000 00  064 40  017 11  038 26  123 7B  010 0A  040 28 
255 1 Laurent GUERBY
000 00  002 02  010 0A  040 28  000 00  001 01  203 CB  245 F5  127 7F  255 FF  000 00  012 0C  029 1D  012 0C  065 41  065 41 
256 1 Laurent GUERBY
065 41  065 41 
257 19 Laurent GUERBY
258 19 Laurent GUERBY
ipv4 pareil mais depuis 10.50.0.2 vers 10.50.0.1:32767 avec vlan tag 128
259 19 Laurent GUERBY
paquet len = 54
260 19 Laurent GUERBY
000 00  000 00  129 81  000 00  038 26  175 AF  062 3E  065 41  113 71  190 BE  242 F2  179 B3  040 28  028 1C  244 F4  136 88 
261 19 Laurent GUERBY
129 81  000 00  000 00  128 80  008 08  000 00  069 45  000 00  000 00  032 20  000 00  000 00  064 40  000 00  064 40  017 11 
262 19 Laurent GUERBY
038 26  103 67  010 0A  050 32  000 00  002 02  010 0A  050 32  000 00  001 01  178 B2  222 DE  127 7F  255 FF  000 00  012 0C 
263 19 Laurent GUERBY
054 36  015 0F  065 41  065 41  065 41  065 41 
264 19 Laurent GUERBY
265 18 Laurent GUERBY
266 18 Laurent GUERBY
ipv6 
267 18 Laurent GUERBY
depuis 2a01:6600:8081:cb01::2 MAC  f2:b3:28:1c:f4:88 
268 18 Laurent GUERBY
vers [2a01:6600:8081:cb01::1]:32767 MAC 26:af:3e:41:71:be
269 18 Laurent GUERBY
envoi UDP payload "AAAA" 
270 18 Laurent GUERBY
271 18 Laurent GUERBY
from tap paquet len = 70
272 18 Laurent GUERBY
000 00  000 00  134 86  221 DD  038 26  175 AF  062 3E  065 41  113 71  190 BE  242 F2  179 B3  040 28  028 1C  244 F4  136 88 
273 18 Laurent GUERBY
134 86  221 DD  096 60  000 00  000 00  000 00  000 00  012 0C  017 11  255 FF  042 2A  001 01  102 66  000 00  128 80  129 81 
274 18 Laurent GUERBY
203 CB  001 01  000 00  000 00  000 00  000 00  000 00  000 00  000 00  002 02  042 2A  001 01  102 66  000 00  128 80  129 81 
275 18 Laurent GUERBY
203 CB  001 01  000 00  000 00  000 00  000 00  000 00  000 00  000 00  001 01  193 C1  022 16  127 7F  255 FF  000 00  012 0C 
276 18 Laurent GUERBY
133 85  049 31  065 41  065 41  065 41  065 41 
277 18 Laurent GUERBY
</pre>
278 18 Laurent GUERBY
279 15 Laurent GUERBY
h2. Compression
280 15 Laurent GUERBY
281 15 Laurent GUERBY
http://www.oberhumer.com/opensource/lzo/
282 15 Laurent GUERBY
<pre>
283 15 Laurent GUERBY
Here are some original timings done on an Intel Pentium 133 back in 1997. Multiply by a constant factor for modern machines.
284 1 Laurent GUERBY
285 15 Laurent GUERBY
memcpy(): ~60 MB/sec
286 15 Laurent GUERBY
LZO1X decompression in C: ~16 MB/sec
287 1 Laurent GUERBY
LZO1X decompression in optimized assembler: ~20 MB/sec
288 1 Laurent GUERBY
LZO1X-1 compression: ~5 MB/sec
289 15 Laurent GUERBY
More detailed results can be found in the documentation.
290 15 Laurent GUERBY
</pre>
291 15 Laurent GUERBY
292 15 Laurent GUERBY
https://github.com/jd-boyd/python-lzo
293 15 Laurent GUERBY
294 45 Laurent GUERBY
h2. Allocation équitable de bande passante
295 1 Laurent GUERBY
296 15 Laurent GUERBY
Les outils comme tc http://en.wikipedia.org/wiki/Tc_(Linux) permettent d'allouer equitablement de la bande passante par IP source cf leur usage actuel [[Buffer_Bloat#QoS]].
297 15 Laurent GUERBY
298 45 Laurent GUERBY
Ces outils travaillent au niveau paquet par paquet donc en présence de plusieurs paquets de 1500 bytes provenant de plusieurs utilisateurs la latence pour les petits paquets d'autre utilisateurs va être fortement impactée, par exemple si 15 utilisateurs
299 15 Laurent GUERBY
300 45 Laurent GUERBY
Une solution alternative est de travailler en volume et non plus par paquet : chaque paquet envoyé sur le tunnel va contenir des fragments de paquet de tous les utisateurs au prorata equitable.
301 15 Laurent GUERBY
302 15 Laurent GUERBY
Exemple concret : une ligne ADSL avec 15 utilisateurs, pour arrondir supporte un paquet a 1500 byte a 1 Mbit/s soit un paquet 1500 toute les 12 ms. 14 envoient du TCP a 1500 byte et le dernier fait des ping de 100 byte.
303 15 Laurent GUERBY
* solution par paquet classique : la latence du ping dans le pire des cas est 14*12ms= 168 ms et elle va etre fortement variable suivant le nombre de paquet de 1500 des autres utilisateurs.
304 15 Laurent GUERBY
* solution en volume : la latence du ping est de 12ms constante. Si le paquet ping est entre 100 et 200 alors la latence sera simplement de 2*12ms = 24ms constante aussi.
305 15 Laurent GUERBY
306 21 Laurent GUERBY
h2. Test de re-bind
307 21 Laurent GUERBY
308 45 Laurent GUERBY
En cas de changement d'IP sur la ligne ADSL le NAT des modem / routeurs peut couper une connection UDP établie (visible sur openvpn) la solution est de forcer un changement de port source si la connection apparait comme non fonctionnelle
309 21 Laurent GUERBY
310 21 Laurent GUERBY
<pre>
311 21 Laurent GUERBY
import sys
312 21 Laurent GUERBY
import socket
313 21 Laurent GUERBY
314 21 Laurent GUERBY
mode=sys.argv[1]
315 21 Laurent GUERBY
RBUFL=2000
316 21 Laurent GUERBY
remote_port=6600
317 21 Laurent GUERBY
318 21 Laurent GUERBY
if mode=="client":
319 21 Laurent GUERBY
    remote_addr=sys.argv[2]
320 21 Laurent GUERBY
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
321 21 Laurent GUERBY
    s.bind(("", 0))
322 21 Laurent GUERBY
    peer=(remote_addr,remote_port)
323 21 Laurent GUERBY
    s.sendto("TOTO1",peer)
324 21 Laurent GUERBY
    s.close()
325 21 Laurent GUERBY
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
326 21 Laurent GUERBY
    s.bind(("", 0))
327 21 Laurent GUERBY
    s.sendto("TOTO2",peer)
328 21 Laurent GUERBY
else:
329 21 Laurent GUERBY
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
330 21 Laurent GUERBY
    s.bind(("", remote_port))
331 21 Laurent GUERBY
    p,peer=s.recvfrom(RBUFL)
332 21 Laurent GUERBY
    print p,peer
333 21 Laurent GUERBY
    p,peer=s.recvfrom(RBUFL)
334 21 Laurent GUERBY
    print p,peer
335 21 Laurent GUERBY
</pre>
336 21 Laurent GUERBY
337 21 Laurent GUERBY
Test :
338 21 Laurent GUERBY
339 21 Laurent GUERBY
<pre>
340 21 Laurent GUERBY
client$ python tbind.py client testlg1 6600
341 21 Laurent GUERBY
# while on server:
342 21 Laurent GUERBY
server$ python tbind.py server
343 21 Laurent GUERBY
TOTO1 ('192.168.1.18', 47975)
344 21 Laurent GUERBY
TOTO2 ('192.168.1.18', 60607)
345 21 Laurent GUERBY
</pre>
346 21 Laurent GUERBY
=> changement de port effectif
347 15 Laurent GUERBY
348 23 Laurent GUERBY
h2. Perte de paquet
349 23 Laurent GUERBY
350 23 Laurent GUERBY
On observe des pertes de paquets consecutifs sur la ligne ADSL free a Saint-Gaudens mais pas de saturation de buffer a 15 Mbit/s : c'est probablement ce qui explique la faible performance TCP.
351 23 Laurent GUERBY
352 23 Laurent GUERBY
!z-free-16m.png!
353 23 Laurent GUERBY
354 26 Laurent GUERBY
h2. Perte de paquet 3 lignes
355 26 Laurent GUERBY
356 26 Laurent GUERBY
Envoi de 10000 paquets de 1200 byte UDP a un rythme de 2 Mbit/s sur les 3 lignes ADSL de saint gaudens (orange, free, FDN), on mesure la variation de demi-ping = Y par time stamp reception saint-gaudens = X, le tout en nombre de microseconde
357 26 Laurent GUERBY
358 26 Laurent GUERBY
!lagstg2.png!
359 26 Laurent GUERBY
360 26 Laurent GUERBY
Les pertes sont donc bien synchrones entre les 3 lignes ADSL.
361 26 Laurent GUERBY
362 15 Laurent GUERBY
h2. Attachements