A Discrete-Event Network Simulator
API
tcp-highspeed.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2014 Natale Patriciello, <natale.patriciello@gmail.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 */
19
20#include "tcp-highspeed.h"
21#include "tcp-socket-state.h"
22
23#include "ns3/log.h"
24
25namespace ns3 {
26
27NS_LOG_COMPONENT_DEFINE ("TcpHighSpeed");
28NS_OBJECT_ENSURE_REGISTERED (TcpHighSpeed);
29
30TypeId
32{
33 static TypeId tid = TypeId ("ns3::TcpHighSpeed")
35 .AddConstructor<TcpHighSpeed> ()
36 .SetGroupName ("Internet")
37 ;
38 return tid;
39}
40
42 : TcpNewReno (),
43 m_ackCnt (0)
44{
45 NS_LOG_FUNCTION (this);
46}
47
49 : TcpNewReno (sock),
50 m_ackCnt (sock.m_ackCnt)
51{
52 NS_LOG_FUNCTION (this);
53}
54
56{
57 NS_LOG_FUNCTION (this);
58}
59
62{
63 return CopyObject<TcpHighSpeed> (this);
64}
65
98void
100{
101 NS_LOG_FUNCTION (this << tcb << segmentsAcked);
102
103 uint32_t segCwnd = tcb->GetCwndInSegments ();
104 uint32_t oldCwnd = segCwnd;
105
106 if (segmentsAcked > 0)
107 {
108 uint32_t coeffA = TableLookupA (segCwnd);
109 m_ackCnt += segmentsAcked * coeffA;
110 }
111
112 while (m_ackCnt >= segCwnd)
113 {
114 m_ackCnt -= segCwnd;
115 segCwnd += 1;
116 }
117
118 if (segCwnd != oldCwnd)
119 {
120 tcb->m_cWnd = segCwnd * tcb->m_segmentSize;
121 NS_LOG_INFO ("In CongAvoid, updated to cwnd " << tcb->m_cWnd <<
122 " ssthresh " << tcb->m_ssThresh);
123 }
124}
125
126std::string
128{
129 return "TcpHighSpeed";
130}
131
142 uint32_t bytesInFlight)
143{
144 NS_LOG_FUNCTION (this << tcb << bytesInFlight);
145
146 uint32_t segCwnd = bytesInFlight / tcb->m_segmentSize;
147
148 double b = 1.0 - TableLookupB (segCwnd);
149 uint32_t ssThresh = static_cast<uint32_t> (std::max (2.0, segCwnd * b));
150
151 NS_LOG_DEBUG ("Calculated b(w) = " << b <<
152 " resulting (in segment) ssThresh=" << ssThresh);
153
154 return ssThresh * tcb->m_segmentSize;
155}
156
159{
160 if (w <= 38)
161 {
162 return 1;
163 }
164 else if (w <= 118)
165 {
166 return 2;
167 }
168 else if (w <= 221)
169 {
170 return 3;
171 }
172 else if (w <= 347)
173 {
174 return 4;
175 }
176 else if (w <= 495)
177 {
178 return 5;
179 }
180 else if (w <= 663)
181 {
182 return 6;
183 }
184 else if (w <= 851)
185 {
186 return 7;
187 }
188 else if (w <= 1058)
189 {
190 return 8;
191 }
192 else if (w <= 1284)
193 {
194 return 9;
195 }
196 else if (w <= 1529)
197 {
198 return 10;
199 }
200 else if (w <= 1793)
201 {
202 return 11;
203 }
204 else if (w <= 2076)
205 {
206 return 12;
207 }
208 else if (w <= 2378)
209 {
210 return 13;
211 }
212 else if (w <= 2699)
213 {
214 return 14;
215 }
216 else if (w <= 3039)
217 {
218 return 15;
219 }
220 else if (w <= 3399)
221 {
222 return 16;
223 }
224 else if (w <= 3778)
225 {
226 return 17;
227 }
228 else if (w <= 4177)
229 {
230 return 18;
231 }
232 else if (w <= 4596)
233 {
234 return 19;
235 }
236 else if (w <= 5036)
237 {
238 return 20;
239 }
240 else if (w <= 5497)
241 {
242 return 21;
243 }
244 else if (w <= 5979)
245 {
246 return 22;
247 }
248 else if (w <= 6483)
249 {
250 return 23;
251 }
252 else if (w <= 7009)
253 {
254 return 24;
255 }
256 else if (w <= 7558)
257 {
258 return 25;
259 }
260 else if (w <= 8130)
261 {
262 return 26;
263 }
264 else if (w <= 8726)
265 {
266 return 27;
267 }
268 else if (w <= 9346)
269 {
270 return 28;
271 }
272 else if (w <= 9991)
273 {
274 return 29;
275 }
276 else if (w <= 10661)
277 {
278 return 30;
279 }
280 else if (w <= 11358)
281 {
282 return 31;
283 }
284 else if (w <= 12082)
285 {
286 return 32;
287 }
288 else if (w <= 12834)
289 {
290 return 33;
291 }
292 else if (w <= 13614)
293 {
294 return 34;
295 }
296 else if (w <= 14424)
297 {
298 return 35;
299 }
300 else if (w <= 15265)
301 {
302 return 36;
303 }
304 else if (w <= 16137)
305 {
306 return 37;
307 }
308 else if (w <= 17042)
309 {
310 return 38;
311 }
312 else if (w <= 17981)
313 {
314 return 39;
315 }
316 else if (w <= 18955)
317 {
318 return 40;
319 }
320 else if (w <= 19965)
321 {
322 return 41;
323 }
324 else if (w <= 21013)
325 {
326 return 42;
327 }
328 else if (w <= 22101)
329 {
330 return 43;
331 }
332 else if (w <= 23230)
333 {
334 return 44;
335 }
336 else if (w <= 24402)
337 {
338 return 45;
339 }
340 else if (w <= 25618)
341 {
342 return 46;
343 }
344 else if (w <= 26881)
345 {
346 return 47;
347 }
348 else if (w <= 28193)
349 {
350 return 48;
351 }
352 else if (w <= 29557)
353 {
354 return 49;
355 }
356 else if (w <= 30975)
357 {
358 return 50;
359 }
360 else if (w <= 32450)
361 {
362 return 51;
363 }
364 else if (w <= 33986)
365 {
366 return 52;
367 }
368 else if (w <= 35586)
369 {
370 return 53;
371 }
372 else if (w <= 37253)
373 {
374 return 54;
375 }
376 else if (w <= 38992)
377 {
378 return 55;
379 }
380 else if (w <= 40808)
381 {
382 return 56;
383 }
384 else if (w <= 42707)
385 {
386 return 57;
387 }
388 else if (w <= 44694)
389 {
390 return 58;
391 }
392 else if (w <= 46776)
393 {
394 return 59;
395 }
396 else if (w <= 48961)
397 {
398 return 60;
399 }
400 else if (w <= 51258)
401 {
402 return 61;
403 }
404 else if (w <= 53667)
405 {
406 return 62;
407 }
408 else if (w <= 56230)
409 {
410 return 63;
411 }
412 else if (w <= 58932)
413 {
414 return 64;
415 }
416 else if (w <= 61799)
417 {
418 return 65;
419 }
420 else if (w <= 64851)
421 {
422 return 66;
423 }
424 else if (w <= 68113)
425 {
426 return 67;
427 }
428 else if (w <= 71617)
429 {
430 return 68;
431 }
432 else if (w <= 75401)
433 {
434 return 69;
435 }
436 else if (w <= 79517)
437 {
438 return 70;
439 }
440 else if (w <= 84035)
441 {
442 return 71;
443 }
444 else if (w <= 89053)
445 {
446 return 72;
447 }
448 else if (w <= 94717)
449 {
450 return 73;
451 }
452 else
453 {
454 return 73;
455 }
456}
457
458double
460{
461 if (w <= 38)
462 {
463 return 0.50;
464 }
465 else if (w <= 118)
466 {
467 return 0.44;
468 }
469 else if (w <= 221)
470 {
471 return 0.41;
472 }
473 else if (w <= 347)
474 {
475 return 0.38;
476 }
477 else if (w <= 495)
478 {
479 return 0.37;
480 }
481 else if (w <= 663)
482 {
483 return 0.35;
484 }
485 else if (w <= 851)
486 {
487 return 0.34;
488 }
489 else if (w <= 1058)
490 {
491 return 0.33;
492 }
493 else if (w <= 1284)
494 {
495 return 0.32;
496 }
497 else if (w <= 1529)
498 {
499 return 0.31;
500 }
501 else if (w <= 1793)
502 {
503 return 0.30;
504 }
505 else if (w <= 2076)
506 {
507 return 0.29;
508 }
509 else if (w <= 2378)
510 {
511 return 0.28;
512 }
513 else if (w <= 2699)
514 {
515 return 0.28;
516 }
517 else if (w <= 3039)
518 {
519 return 0.27;
520 }
521 else if (w <= 3399)
522 {
523 return 0.27;
524 }
525 else if (w <= 3778)
526 {
527 return 0.26;
528 }
529 else if (w <= 4177)
530 {
531 return 0.26;
532 }
533 else if (w <= 4596)
534 {
535 return 0.25;
536 }
537 else if (w <= 5036)
538 {
539 return 0.25;
540 }
541 else if (w <= 5497)
542 {
543 return 0.24;
544 }
545 else if (w <= 5979)
546 {
547 return 0.24;
548 }
549 else if (w <= 6483)
550 {
551 return 0.23;
552 }
553 else if (w <= 7009)
554 {
555 return 0.23;
556 }
557 else if (w <= 7558)
558 {
559 return 0.22;
560 }
561 else if (w <= 8130)
562 {
563 return 0.22;
564 }
565 else if (w <= 8726)
566 {
567 return 0.22;
568 }
569 else if (w <= 9346)
570 {
571 return 0.21;
572 }
573 else if (w <= 9991)
574 {
575 return 0.21;
576 }
577 else if (w <= 10661)
578 {
579 return 0.21;
580 }
581 else if (w <= 11358)
582 {
583 return 0.20;
584 }
585 else if (w <= 12082)
586 {
587 return 0.20;
588 }
589 else if (w <= 12834)
590 {
591 return 0.20;
592 }
593 else if (w <= 13614)
594 {
595 return 0.19;
596 }
597 else if (w <= 14424)
598 {
599 return 0.19;
600 }
601 else if (w <= 15265)
602 {
603 return 0.19;
604 }
605 else if (w <= 16137)
606 {
607 return 0.19;
608 }
609 else if (w <= 17042)
610 {
611 return 0.18;
612 }
613 else if (w <= 17981)
614 {
615 return 0.18;
616 }
617 else if (w <= 18955)
618 {
619 return 0.18;
620 }
621 else if (w <= 19965)
622 {
623 return 0.17;
624 }
625 else if (w <= 21013)
626 {
627 return 0.17;
628 }
629 else if (w <= 22101)
630 {
631 return 0.17;
632 }
633 else if (w <= 23230)
634 {
635 return 0.17;
636 }
637 else if (w <= 24402)
638 {
639 return 0.16;
640 }
641 else if (w <= 25618)
642 {
643 return 0.16;
644 }
645 else if (w <= 26881)
646 {
647 return 0.16;
648 }
649 else if (w <= 28193)
650 {
651 return 0.16;
652 }
653 else if (w <= 29557)
654 {
655 return 0.15;
656 }
657 else if (w <= 30975)
658 {
659 return 0.15;
660 }
661 else if (w <= 32450)
662 {
663 return 0.15;
664 }
665 else if (w <= 33986)
666 {
667 return 0.15;
668 }
669 else if (w <= 35586)
670 {
671 return 0.14;
672 }
673 else if (w <= 37253)
674 {
675 return 0.14;
676 }
677 else if (w <= 38992)
678 {
679 return 0.14;
680 }
681 else if (w <= 40808)
682 {
683 return 0.14;
684 }
685 else if (w <= 42707)
686 {
687 return 0.13;
688 }
689 else if (w <= 44694)
690 {
691 return 0.13;
692 }
693 else if (w <= 46776)
694 {
695 return 0.13;
696 }
697 else if (w <= 48961)
698 {
699 return 0.13;
700 }
701 else if (w <= 51258)
702 {
703 return 0.13;
704 }
705 else if (w <= 53667)
706 {
707 return 0.12;
708 }
709 else if (w <= 56230)
710 {
711 return 0.12;
712 }
713 else if (w <= 58932)
714 {
715 return 0.12;
716 }
717 else if (w <= 61799)
718 {
719 return 0.12;
720 }
721 else if (w <= 64851)
722 {
723 return 0.11;
724 }
725 else if (w <= 68113)
726 {
727 return 0.11;
728 }
729 else if (w <= 71617)
730 {
731 return 0.11;
732 }
733 else if (w <= 75401)
734 {
735 return 0.10;
736 }
737 else if (w <= 79517)
738 {
739 return 0.10;
740 }
741 else if (w <= 84035)
742 {
743 return 0.10;
744 }
745 else if (w <= 89053)
746 {
747 return 0.10;
748 }
749 else if (w <= 94717)
750 {
751 return 0.09;
752 }
753 else
754 {
755 return 0.09;
756 }
757}
758
759} // namespace ns3
#define max(a, b)
Definition: 80211b.c:43
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
An implementation of TCP HighSpeed.
Definition: tcp-highspeed.h:50
static double TableLookupB(uint32_t w)
Lookup table for the coefficient b (from RFC 3649)
virtual Ptr< TcpCongestionOps > Fork()
Copy the congestion control algorithm across sockets.
static uint32_t TableLookupA(uint32_t w)
Lookup table for the coefficient a (from RFC 3649)
TcpHighSpeed(void)
Create an unbound tcp socket.
static TypeId GetTypeId(void)
Get the type ID.
virtual void CongestionAvoidance(Ptr< TcpSocketState > tcb, uint32_t segmentsAcked)
Congestion avoidance of TcpHighSpeed.
virtual uint32_t GetSsThresh(Ptr< const TcpSocketState > tcb, uint32_t bytesInFlight)
Get slow start threshold following HighSpeed principles.
uint32_t m_ackCnt
Number of received ACK, corrected with the coefficient a.
Definition: tcp-highspeed.h:99
virtual std::string GetName() const
Get the name of the congestion control algorithm.
virtual ~TcpHighSpeed(void)
The NewReno implementation.
uint32_t m_segmentSize
Segment size.
uint32_t GetCwndInSegments() const
Get cwnd in segments rather than bytes.
TracedValue< uint32_t > m_cWnd
Congestion window.
TracedValue< uint32_t > m_ssThresh
Slow start threshold.
a unique identifier for an interface.
Definition: type-id.h:59
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:922
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:281
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
Every class exported by the ns3 library is enclosed in the ns3 namespace.