Projet agregation v2 » Historique » Version 41
Laurent GUERBY, 09/09/2013 12:58
1 | 14 | Laurent GUERBY | {{>toc}} |
---|---|---|---|
2 | 14 | Laurent GUERBY | |
3 | 1 | Laurent GUERBY | h1. Projet agregation v2 |
4 | 1 | Laurent GUERBY | |
5 | 12 | Laurent GUERBY | * [[Projet agregation]] |
6 | 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 |
7 | 13 | Laurent GUERBY | * Low Extra Delay Background Transport (LEDBAT) https://datatracker.ietf.org/doc/draft-ietf-ledbat-congestion/ |
8 | 20 | Laurent GUERBY | * QoS tail drop vs by IP http://lists.tetalab.org/pipermail/tetaneutral/2011-April/000129.html |
9 | 24 | Laurent GUERBY | * tc http://marc.info/?l=netfilter&m=129669999112670&w=2 |
10 | 27 | Laurent GUERBY | * tc TEQL http://lartc.org/howto/lartc.loadshare.html |
11 | 27 | Laurent GUERBY | * tc NATALIE http://flap.mynetmemo.com/wp-content/uploads/2012/04/NATALIE.pdf |
12 | 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 |
13 | 28 | Laurent GUERBY | ** http://tools.ietf.org/html/draft-mahalingam-dutt-dcops-vxlan-02 |
14 | 28 | Laurent GUERBY | ** http://blogs.cisco.com/datacenter/digging-deeper-into-vxlan/ |
15 | 29 | Laurent GUERBY | * http://hardware.slashdot.org/story/12/10/23/1946248/increasing-wireless-network-speed-by-1000-by-replacing-packets-with-algebra |
16 | 29 | Laurent GUERBY | ** http://www.mit.edu/~medard/papers2011/Modeling%20Network%20Coded%20TCP.pdf |
17 | 30 | Laurent GUERBY | ** http://en.wikipedia.org/wiki/Linear_network_coding |
18 | 31 | Laurent GUERBY | * MPTCP |
19 | 31 | Laurent GUERBY | ** https://linuxfr.org/news/mptcp-tcp-dans-un-monde-ultra-connecte |
20 | 31 | Laurent GUERBY | ** https://archive.fosdem.org/2012/schedule/event/multipathtcp.html |
21 | 32 | Laurent GUERBY | * LEDBAT |
22 | 32 | Laurent GUERBY | ** http://www.bortzmeyer.org/6817.html |
23 | 32 | Laurent GUERBY | ** http://tools.ietf.org/wg/ledbat |
24 | 33 | Laurent GUERBY | * http://www.coverfire.com/archives/2013/01/01/improving-my-home-internet-performance/ |
25 | 33 | Laurent GUERBY | ** http://git.coverfire.com/?p=linux-qos-scripts.git;a=blob;f=src-3tos.sh;hb=HEAD |
26 | 34 | Laurent GUERBY | ** http://www.coverfire.com/archives/2011/02/21/network-latency-experiments |
27 | 34 | Laurent GUERBY | ** http://www.coverfire.com/projects/ping-exp/ |
28 | 35 | Laurent GUERBY | * http://multipath-tcp.org/pmwiki.php?n=Main.50Gbps |
29 | 35 | Laurent GUERBY | * https://code.google.com/p/kernel/wiki/NetScalingGuide |
30 | 36 | Laurent GUERBY | * Rate < (MSS/RTT)*(1 / sqrt(p)) where p is the probability of packet loss. |
31 | 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. |
32 | 36 | Laurent GUERBY | ** http://www.infoblox.com/community/blog/tcp-performance-and-mathis-equation |
33 | 37 | Laurent GUERBY | * https://gettys.wordpress.com/2013/07/10/low-latency-requires-smart-queuing-traditional-aqm-is-not-enough/ |
34 | 38 | Laurent GUERBY | * Confused, Timid, and Unstable: Picking a Video Streaming Rate is Hard http://www.stanford.edu/~huangty/imc012-huang.pdf |
35 | 39 | Laurent GUERBY | * http://linuxfr.org/wiki/Une-introduction-au-contr%C3%B4le-du-trafic-r%C3%A9seau-avec-Linux |
36 | 40 | Laurent GUERBY | * http://www.coverfire.com/articles/queueing-in-the-linux-network-stack/ |
37 | 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 |
38 | 1 | Laurent GUERBY | |
39 | 1 | Laurent GUERBY | h2. Divers |
40 | 1 | Laurent GUERBY | |
41 | 1 | Laurent GUERBY | * 1 Mbit/s = 83 frames de 1500 byte/sec = 1 frame de 1500 byte toutes les 12 ms |
42 | 1 | Laurent GUERBY | * l'augmentation de latence sur la ligne permet la detection de la saturation des buffer |
43 | 1 | Laurent GUERBY | * on peut mesurer les variations de latence en regardant les variations de difference de timestamp destination moins source |
44 | 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) |
45 | 2 | Laurent GUERBY | |
46 | 6 | Laurent GUERBY | h2. Resolution de time.time() |
47 | 1 | Laurent GUERBY | |
48 | 4 | Laurent GUERBY | * http://stackoverflow.com/questions/1938048/high-precision-clock-in-python |
49 | 2 | Laurent GUERBY | |
50 | 4 | Laurent GUERBY | <pre> |
51 | 2 | Laurent GUERBY | guerby@pc2:~/work/tetaneutral.net/python/pa2$ cat ttime.py |
52 | 2 | Laurent GUERBY | import time |
53 | 2 | Laurent GUERBY | |
54 | 2 | Laurent GUERBY | N=1000 |
55 | 2 | Laurent GUERBY | l=[] |
56 | 2 | Laurent GUERBY | for i in xrange(N): |
57 | 2 | Laurent GUERBY | t1=time.time() |
58 | 2 | Laurent GUERBY | t2=time.time() |
59 | 2 | Laurent GUERBY | dt=t2-t1 |
60 | 2 | Laurent GUERBY | l.append(dt) |
61 | 2 | Laurent GUERBY | |
62 | 2 | Laurent GUERBY | l.sort() |
63 | 2 | Laurent GUERBY | print l[0],l[-1],l[N/2],l[9*N/10] |
64 | 2 | Laurent GUERBY | guerby@pc2:~/work/tetaneutral.net/python/pa2$ python ttime.py |
65 | 2 | Laurent GUERBY | 9.53674316406e-07 3.00407409668e-05 1.90734863281e-06 2.14576721191e-06 |
66 | 2 | Laurent GUERBY | guerby@pc2:~/work/tetaneutral.net/python/pa2$ python ttime.py |
67 | 2 | Laurent GUERBY | 9.53674316406e-07 1.19209289551e-05 1.90734863281e-06 2.14576721191e-06 |
68 | 2 | Laurent GUERBY | guerby@pc2:~/work/tetaneutral.net/python/pa2$ python ttime.py |
69 | 2 | Laurent GUERBY | 9.53674316406e-07 0.000508069992065 1.90734863281e-06 2.14576721191e-06 |
70 | 2 | Laurent GUERBY | </pre> |
71 | 2 | Laurent GUERBY | |
72 | 2 | Laurent GUERBY | => autour de 2 microsecondes en pratique |
73 | 3 | Laurent GUERBY | |
74 | 6 | Laurent GUERBY | h2. Résolution de select en python |
75 | 3 | Laurent GUERBY | |
76 | 4 | Laurent GUERBY | <pre> |
77 | 3 | Laurent GUERBY | guerby@pc2:~/work/tetaneutral.net/python/pa2$ cat tselect.py |
78 | 3 | Laurent GUERBY | import time |
79 | 3 | Laurent GUERBY | import select |
80 | 3 | Laurent GUERBY | from socket import * |
81 | 3 | Laurent GUERBY | from select import select |
82 | 3 | Laurent GUERBY | |
83 | 3 | Laurent GUERBY | |
84 | 3 | Laurent GUERBY | |
85 | 3 | Laurent GUERBY | s1 = socket(AF_INET, SOCK_DGRAM) |
86 | 3 | Laurent GUERBY | s2 = socket(AF_INET, SOCK_DGRAM) |
87 | 3 | Laurent GUERBY | |
88 | 3 | Laurent GUERBY | N=1000 |
89 | 3 | Laurent GUERBY | l=[] |
90 | 3 | Laurent GUERBY | for i in xrange(N): |
91 | 3 | Laurent GUERBY | t1=time.time() |
92 | 3 | Laurent GUERBY | r = select([s1,s2],[],[],1.0e-9) |
93 | 3 | Laurent GUERBY | t2=time.time() |
94 | 3 | Laurent GUERBY | dt=t2-t1 |
95 | 3 | Laurent GUERBY | l.append(dt) |
96 | 3 | Laurent GUERBY | |
97 | 3 | Laurent GUERBY | l.sort() |
98 | 1 | Laurent GUERBY | print l[0],l[-1],l[N/2],l[9*N/10] |
99 | 3 | Laurent GUERBY | guerby@pc2:~/work/tetaneutral.net/python/pa2$ python tselect.py |
100 | 3 | Laurent GUERBY | 9.77516174316e-06 0.000253915786743 1.09672546387e-05 1.12056732178e-05 |
101 | 3 | Laurent GUERBY | guerby@pc2:~/work/tetaneutral.net/python/pa2$ python tselect.py |
102 | 3 | Laurent GUERBY | 9.77516174316e-06 5.41210174561e-05 1.09672546387e-05 1.12056732178e-05 |
103 | 4 | Laurent GUERBY | </pre> |
104 | 3 | Laurent GUERBY | |
105 | 1 | Laurent GUERBY | => 12 microsecondes |
106 | 1 | Laurent GUERBY | => 18 microsecondes avec 5 socket vs 2 donc compter + 2 micro/socket |
107 | 6 | Laurent GUERBY | |
108 | 6 | Laurent GUERBY | h2. Generer un payload random |
109 | 6 | Laurent GUERBY | |
110 | 6 | Laurent GUERBY | * http://docs.python.org/library/random.html |
111 | 6 | Laurent GUERBY | * http://docs.python.org/library/struct.html |
112 | 6 | Laurent GUERBY | |
113 | 6 | Laurent GUERBY | <pre> |
114 | 6 | Laurent GUERBY | import random |
115 | 6 | Laurent GUERBY | import struct |
116 | 6 | Laurent GUERBY | |
117 | 6 | Laurent GUERBY | |
118 | 6 | Laurent GUERBY | N=256*256*256*256-1 |
119 | 6 | Laurent GUERBY | S=160000 |
120 | 6 | Laurent GUERBY | random.seed(0) |
121 | 6 | Laurent GUERBY | s="".join([struct.pack("I",random.randint(0,N)) for i in xrange(S/4)]) |
122 | 6 | Laurent GUERBY | print S,len(s) |
123 | 6 | Laurent GUERBY | </pre> |
124 | 6 | Laurent GUERBY | |
125 | 9 | Laurent GUERBY | h2. Premiere mesure de controle de latence : debit |
126 | 6 | Laurent GUERBY | |
127 | 6 | Laurent GUERBY | * sur une ligne ADSL capable de 11 Mbit/s soutenu TCP |
128 | 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 |
129 | 6 | Laurent GUERBY | * sur le client on note le timestamp client en microseconde, le numero de sequence et le timestamp server du paquet |
130 | 6 | Laurent GUERBY | * une fois le test fini (1000 paquets) on calcule paquet par paquet la difference timestamp client moins timestamp server |
131 | 7 | Laurent GUERBY | * on calcul le min de ces differences sur tous les paquets |
132 | 7 | Laurent GUERBY | * on graphe chaque difference moins le min des difference = la deviation par rapport a la normale en microseconde |
133 | 6 | Laurent GUERBY | |
134 | 6 | Laurent GUERBY | Avec D = 10 Mbit/s = en dessous de la capacité de la ligne ça donne : |
135 | 6 | Laurent GUERBY | |
136 | 6 | Laurent GUERBY | !10-1200.png! |
137 | 6 | Laurent GUERBY | |
138 | 6 | Laurent GUERBY | Avec D = 15 Mbit/s = au dessus de la capacité de la ligne ça donne : |
139 | 1 | Laurent GUERBY | |
140 | 1 | Laurent GUERBY | !15-1200.png! |
141 | 6 | Laurent GUERBY | |
142 | 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. |
143 | 7 | Laurent GUERBY | |
144 | 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. |
145 | 6 | Laurent GUERBY | |
146 | 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. |
147 | 7 | Laurent GUERBY | |
148 | 1 | 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. |
149 | 9 | Laurent GUERBY | |
150 | 9 | Laurent GUERBY | h2. Deuxieme mesure : paquet par seconde |
151 | 9 | Laurent GUERBY | |
152 | 9 | 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) |
153 | 9 | Laurent GUERBY | |
154 | 9 | Laurent GUERBY | * Taille 200 = 5485 pps 8.7 Mbit/s sur theo a 6250 pps |
155 | 9 | Laurent GUERBY | !10-200.png! |
156 | 9 | Laurent GUERBY | |
157 | 9 | Laurent GUERBY | * Taille 350 = 3552 pps 9.9 Mbit/s sur theo a 3570 pps |
158 | 9 | Laurent GUERBY | !10-350.png! |
159 | 9 | Laurent GUERBY | |
160 | 9 | Laurent GUERBY | * Taille 400 = 3126 pps 10 Mbit/s sur theo a 3125 pps |
161 | 9 | Laurent GUERBY | !10-400.png! |
162 | 9 | Laurent GUERBY | |
163 | 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 |
164 | 10 | Laurent GUERBY | |
165 | 11 | 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 |
166 | 10 | Laurent GUERBY | |
167 | 11 | Laurent GUERBY | Script de test utilisé : attachment:iperf-20120304.py |
168 | 14 | Laurent GUERBY | |
169 | 14 | Laurent GUERBY | h2. tuntap |
170 | 14 | Laurent GUERBY | |
171 | 22 | Laurent GUERBY | http://en.wikipedia.org/wiki/IEEE_802.3 |
172 | 22 | Laurent GUERBY | |
173 | 14 | Laurent GUERBY | http://backreference.org/2010/03/26/tuntap-interface-tutorial/ |
174 | 14 | Laurent GUERBY | |
175 | 14 | Laurent GUERBY | * http://www.mjmwired.net/kernel/Documentation/networking/tuntap.txt#102 |
176 | 14 | Laurent GUERBY | <pre> |
177 | 14 | Laurent GUERBY | 3.2 Frame format: |
178 | 14 | Laurent GUERBY | If flag IFF_NO_PI is not set each frame format is: |
179 | 14 | Laurent GUERBY | Flags [2 bytes] |
180 | 14 | Laurent GUERBY | Proto [2 bytes] |
181 | 14 | Laurent GUERBY | Raw protocol(IP, IPv6, etc) frame. |
182 | 14 | Laurent GUERBY | </pre> |
183 | 14 | Laurent GUERBY | |
184 | 25 | Laurent GUERBY | * http://www.siongboon.com/projects/2006-03-06_serial_communication |
185 | 14 | Laurent GUERBY | |
186 | 14 | Laurent GUERBY | * http://en.wikipedia.org/wiki/Ethernet_frame |
187 | 14 | Laurent GUERBY | <pre> |
188 | 14 | 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 |
189 | 14 | 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 |
190 | 14 | Laurent GUERBY | </pre> |
191 | 14 | Laurent GUERBY | |
192 | 16 | Laurent GUERBY | * http://en.wikipedia.org/wiki/Ethernet_II_framing#Ethernet_II |
193 | 17 | Laurent GUERBY | * http://en.wikipedia.org/wiki/EtherType |
194 | 17 | Laurent GUERBY | For example, an EtherType value of |
195 | 17 | Laurent GUERBY | 0x0800 signals that the frame contains an IPv4 datagram. |
196 | 17 | Laurent GUERBY | 0x0806 indicates an ARP frame, |
197 | 17 | Laurent GUERBY | 0x8100 indicates an IEEE 802.1Q frame |
198 | 17 | Laurent GUERBY | 0x86DD indicates an IPv6 frame. |
199 | 17 | Laurent GUERBY | 0x8035 RARP |
200 | 17 | Laurent GUERBY | 0x8870 Jumbo Frames |
201 | 17 | Laurent GUERBY | 0x88A2 ATA over Ethernet |
202 | 17 | Laurent GUERBY | 0x88CC LLDP |
203 | 17 | Laurent GUERBY | 0x9100 Q-in-Q |
204 | 17 | Laurent GUERBY | |
205 | 16 | Laurent GUERBY | |
206 | 14 | Laurent GUERBY | * http://en.wikipedia.org/wiki/IPv4#Packet_structure |
207 | 14 | Laurent GUERBY | version premier 4 bits du premier octet = 4 |
208 | 14 | Laurent GUERBY | ip source octet 13 a 16 |
209 | 14 | Laurent GUERBY | ip dest octet 17 a 20 |
210 | 14 | Laurent GUERBY | |
211 | 14 | Laurent GUERBY | * http://en.wikipedia.org/wiki/IPv6_packet |
212 | 14 | Laurent GUERBY | version premier 4 bits du premier octet = 6 |
213 | 14 | Laurent GUERBY | ip source octet 9 a 24 |
214 | 14 | Laurent GUERBY | ip dest octet 25 a 40 |
215 | 15 | Laurent GUERBY | |
216 | 18 | Laurent GUERBY | <pre> |
217 | 18 | Laurent GUERBY | # envoyer un paquet UDP "AAAA" en python IPv4 et IPv6 |
218 | 18 | Laurent GUERBY | import socket |
219 | 18 | Laurent GUERBY | addr="" |
220 | 18 | Laurent GUERBY | buf="AAAA" |
221 | 18 | Laurent GUERBY | s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) |
222 | 18 | Laurent GUERBY | peer=("10.40.0.1",32767) |
223 | 18 | Laurent GUERBY | s.bind((addr, 0)) |
224 | 18 | Laurent GUERBY | s.sendto(buf,peer) |
225 | 18 | Laurent GUERBY | |
226 | 18 | Laurent GUERBY | s6 = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) |
227 | 18 | Laurent GUERBY | s6.bind((addr, 0)) |
228 | 18 | Laurent GUERBY | peer6=("2a01:6600:8081:cb01::1",32767) |
229 | 18 | Laurent GUERBY | s6.sendto(buf,peer6) |
230 | 18 | Laurent GUERBY | </pre> |
231 | 18 | Laurent GUERBY | |
232 | 18 | Laurent GUERBY | Resultats sur tuntap : |
233 | 18 | Laurent GUERBY | |
234 | 18 | Laurent GUERBY | <pre> |
235 | 18 | Laurent GUERBY | ipv4 |
236 | 19 | Laurent GUERBY | depuis 10.40.0.2 MAC f2:b3:28:1c:f4:88 |
237 | 19 | Laurent GUERBY | vers 10.40.0.1:32767 MAC 26:af:3e:41:71:be |
238 | 18 | Laurent GUERBY | envoi UDP payload "AAAA" |
239 | 18 | Laurent GUERBY | |
240 | 19 | Laurent GUERBY | paquet len = 50 |
241 | 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 |
242 | 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 |
243 | 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 |
244 | 1 | Laurent GUERBY | 065 41 065 41 |
245 | 19 | Laurent GUERBY | |
246 | 19 | Laurent GUERBY | ipv4 pareil mais depuis 10.50.0.2 vers 10.50.0.1:32767 avec vlan tag 128 |
247 | 19 | Laurent GUERBY | paquet len = 54 |
248 | 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 |
249 | 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 |
250 | 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 |
251 | 19 | Laurent GUERBY | 054 36 015 0F 065 41 065 41 065 41 065 41 |
252 | 19 | Laurent GUERBY | |
253 | 18 | Laurent GUERBY | |
254 | 18 | Laurent GUERBY | ipv6 |
255 | 18 | Laurent GUERBY | depuis 2a01:6600:8081:cb01::2 MAC f2:b3:28:1c:f4:88 |
256 | 18 | Laurent GUERBY | vers [2a01:6600:8081:cb01::1]:32767 MAC 26:af:3e:41:71:be |
257 | 18 | Laurent GUERBY | envoi UDP payload "AAAA" |
258 | 18 | Laurent GUERBY | |
259 | 18 | Laurent GUERBY | from tap paquet len = 70 |
260 | 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 |
261 | 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 |
262 | 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 |
263 | 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 |
264 | 18 | Laurent GUERBY | 133 85 049 31 065 41 065 41 065 41 065 41 |
265 | 18 | Laurent GUERBY | </pre> |
266 | 18 | Laurent GUERBY | |
267 | 15 | Laurent GUERBY | h2. Compression |
268 | 15 | Laurent GUERBY | |
269 | 15 | Laurent GUERBY | http://www.oberhumer.com/opensource/lzo/ |
270 | 15 | Laurent GUERBY | <pre> |
271 | 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. |
272 | 15 | Laurent GUERBY | |
273 | 15 | Laurent GUERBY | memcpy(): ~60 MB/sec |
274 | 15 | Laurent GUERBY | LZO1X decompression in C: ~16 MB/sec |
275 | 15 | Laurent GUERBY | LZO1X decompression in optimized assembler: ~20 MB/sec |
276 | 15 | Laurent GUERBY | LZO1X-1 compression: ~5 MB/sec |
277 | 15 | Laurent GUERBY | More detailed results can be found in the documentation. |
278 | 15 | Laurent GUERBY | </pre> |
279 | 15 | Laurent GUERBY | |
280 | 15 | Laurent GUERBY | https://github.com/jd-boyd/python-lzo |
281 | 15 | Laurent GUERBY | |
282 | 15 | Laurent GUERBY | h2. Allocation équitable de bande passante |
283 | 15 | Laurent GUERBY | |
284 | 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]]. |
285 | 15 | Laurent GUERBY | |
286 | 15 | 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 |
287 | 15 | Laurent GUERBY | |
288 | 15 | 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. |
289 | 15 | Laurent GUERBY | |
290 | 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. |
291 | 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. |
292 | 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. |
293 | 15 | Laurent GUERBY | |
294 | 21 | Laurent GUERBY | h2. Test de re-bind |
295 | 21 | Laurent GUERBY | |
296 | 21 | 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 |
297 | 21 | Laurent GUERBY | |
298 | 21 | Laurent GUERBY | <pre> |
299 | 21 | Laurent GUERBY | import sys |
300 | 21 | Laurent GUERBY | import socket |
301 | 21 | Laurent GUERBY | |
302 | 21 | Laurent GUERBY | mode=sys.argv[1] |
303 | 21 | Laurent GUERBY | RBUFL=2000 |
304 | 21 | Laurent GUERBY | remote_port=6600 |
305 | 21 | Laurent GUERBY | |
306 | 21 | Laurent GUERBY | if mode=="client": |
307 | 21 | Laurent GUERBY | remote_addr=sys.argv[2] |
308 | 21 | Laurent GUERBY | s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) |
309 | 21 | Laurent GUERBY | s.bind(("", 0)) |
310 | 21 | Laurent GUERBY | peer=(remote_addr,remote_port) |
311 | 21 | Laurent GUERBY | s.sendto("TOTO1",peer) |
312 | 21 | Laurent GUERBY | s.close() |
313 | 21 | Laurent GUERBY | s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) |
314 | 21 | Laurent GUERBY | s.bind(("", 0)) |
315 | 21 | Laurent GUERBY | s.sendto("TOTO2",peer) |
316 | 21 | Laurent GUERBY | else: |
317 | 21 | Laurent GUERBY | s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) |
318 | 21 | Laurent GUERBY | s.bind(("", remote_port)) |
319 | 21 | Laurent GUERBY | p,peer=s.recvfrom(RBUFL) |
320 | 21 | Laurent GUERBY | print p,peer |
321 | 21 | Laurent GUERBY | p,peer=s.recvfrom(RBUFL) |
322 | 21 | Laurent GUERBY | print p,peer |
323 | 21 | Laurent GUERBY | </pre> |
324 | 21 | Laurent GUERBY | |
325 | 21 | Laurent GUERBY | Test : |
326 | 21 | Laurent GUERBY | |
327 | 21 | Laurent GUERBY | <pre> |
328 | 21 | Laurent GUERBY | client$ python tbind.py client testlg1 6600 |
329 | 21 | Laurent GUERBY | # while on server: |
330 | 21 | Laurent GUERBY | server$ python tbind.py server |
331 | 21 | Laurent GUERBY | TOTO1 ('192.168.1.18', 47975) |
332 | 21 | Laurent GUERBY | TOTO2 ('192.168.1.18', 60607) |
333 | 21 | Laurent GUERBY | </pre> |
334 | 21 | Laurent GUERBY | => changement de port effectif |
335 | 15 | Laurent GUERBY | |
336 | 23 | Laurent GUERBY | h2. Perte de paquet |
337 | 23 | Laurent GUERBY | |
338 | 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. |
339 | 23 | Laurent GUERBY | |
340 | 23 | Laurent GUERBY | !z-free-16m.png! |
341 | 23 | Laurent GUERBY | |
342 | 26 | Laurent GUERBY | h2. Perte de paquet 3 lignes |
343 | 26 | Laurent GUERBY | |
344 | 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 |
345 | 26 | Laurent GUERBY | |
346 | 26 | Laurent GUERBY | !lagstg2.png! |
347 | 26 | Laurent GUERBY | |
348 | 26 | Laurent GUERBY | Les pertes sont donc bien synchrones entre les 3 lignes ADSL. |
349 | 26 | Laurent GUERBY | |
350 | 15 | Laurent GUERBY | h2. Attachements |