Flow dan Error Control

  ! "" " # ! "" $ # % " % & " &

  ' ( ( )*+,-

  .

  % ! "" / # ! " #

  1

  • 3

  1

  ! " % # .

  10 while(true) // ulangi selamanya { WaitForEvent(); // sleep sampai terjadi event if(Event(ArrivalNotification)) // Frame data diterima { ReceiveData(); ExtractData(); DeliverData(); // kirim data ke network layer } }

  9

  8

  7

  6

  5

  4

  3

  2

  3

  10 while(true) // ulangi selamanya { WaitForEvent(); // sleep sampai terjadi event if(Event(RequestToSend)) // ada paket untuk dikirim { GetData(); MakeFrame(); SendFrame(); // kirim frame } }

  9

  8

  7

  6

  5

  4

  3

  2

  1

  .

  • 4
  • * 4

  • 3

  16

  11 while(true) // ulangi selamanya { WaitForEvent(); // sleep sampai terjadi event if(Event(ArrivalNotification)) // Frame data diterima { ReceiveData(); ExtractData(); DeliverData(); // kirim data ke network layer SendFrame(); // kirim frame ACK } }

  10

  9

  8

  7

  6

  5

  4

  3

  2

  1

  18 while(true) // ulangi selamanya canSend = true // ijinkan frame pertama dikirim { WaitForEvent(); // sleep sampai terjadi event if(Event(RequestToSend) AND canSend) { GetData(); MakeFrame(); SendFrame(); // kirim frame canSend = false; // tidak bisa kirim sampai ACK } WaitForEvent() // sleep sampai terjadi event if(Event(ArrivalNotification)) // ACK diterima { ReceiveFrame(); // frame ACK diterima canSend = true; } }

  17

  15

  14

  13

  12

  11

  10

  9

  8

  7

  6

  5

  4

  3

  2

  1

  • 3

  ! "" 6 # *

  ( %

  7

  8 ! " % )* # + " + ,* -)+./ 9 *+, :

  3 .

  )* 4-

  8 & " & * 4 " & "

  1

  • 4 1 .
    • )& "- 0 )& "- 1 * 4 .
      • 4 ) .

  : ;

  • 4
  • 3

  ! "" < # *+,

  18

  32

  31

  30

  29

  28

  27

  26

  25

  24

  23

  22

  21

  20

  19

  17

  1

  8

  2

  3

  4

  5

  6

  7

  9

  16

  10

  11

  12

  13

  14

  15

  33 Sn = 0; // frame 0 hrs dikirim dulu canSend = true; // ijinkan request pertama dikirim while(true) // ulangi selamanya { WaitForEvent(); // sleep sampai terjadi event if(Event(RequestToSend) AND canSend) { GetData(); MakeFrame(Sn); // nomor urut Sn StoreFrame(Sn); // simpan salinannya SendFrame(Sn); // kirim frame StartTimer(); Sn = Sn + 1; canSend = false; } WaitForEvent() // sleep sampai terjadi event if(Event(ArrivalNotification)) // ACK diterima { ReceiveFrame(ackNo); // frame ACK diterima if(Not corrupted AND ackNo == Sn) // ACK valid { StopTimer(); PurgeFrame(Sn-1); // frame tidak perlu lagi canSend = true; } } If(Event(TimeOut)) // timer expired { StartTimer(); ResendFrame(Sn-1); // kirim ulang salinan } }

  3 *

  1 Rn = 0; // frame 0 diharapkan dtg dulu 2 while(true) // ulangi selamanya 3 {

  4 WaitForEvent(); // sleep sampai terjadi event 5 if(Event(ArrivalNotification)) // Frame data diterima 6 {

  7 ReceiveFrame();

  8 If(corrupted(frame));

  9 Sleep();

  10 If(seqNo == Rn) // no frame valid 11 {

  12 ExtractData();

  13 DeliverData(); // kirim data ke network layer

  14 Rn= Rn + 1; 15 }

  16 SendFrame(Rn); // kirim frame ACK 17 } 18 }

  ! "" = # *+, 2 # )+.

  % ; *+,

  9

  • 4 4 * 4 .
    • , ;

  9

  8

  • 4

  4

  • 4 8 $ " 8 ) > . - 9
  • 4

  1

  9

  8 " 9 % 0 0

  ? @ @

  1

  9

  9A0 @

  • 0 B" 0

  1

  • 1
  • .

  >

  • . * 4

  1

  1

  • 4

  4 : ; *+,

  ! "" "& # % ; *+,

  

3

! "" "" # ; *+, % ! ; *+,

  $ "

  • 4
  • 3

    • – 1; Sf = 0; Sn = 0; While(true) // ulangi terus { WaitForEvent();

  17

  m

  30 Sw = 2

  29

  28

  27

  26

  25

  24

  23

  22

  21

  20

  19

  18

  16

  ! "" "$ # ; *+, %

  7

  1

  2

  3

  4

  5

  6

  8

  15

  9

  10

  11

  12

  13

  14

  If(Event(RequestToSend)) // jika paket hendak dikirim { If(Sn-Sf >= Sw) // jika window penuh Sleep(); GetData(); MakeFrame(Sn); StoreFrame(Sn); SendFrame(sn); Sn = Sn + 1; If(timer not running) StartTimer(); } If(event(ArrivalNotification)) // ACK dtg { Receive(ACK); If(corrupted(ACK)) Sleep(); If((ackNo>Sf)&&(ackNo<=<=Sn)) // jika ACK valid While(Sf <= ackNo) { PurgeFrame(Sf); Sf = Sf + 1; }

  @

  12

  6

  7

  8

  9

  10

  11

  13

  4

  14

  15

  16

  17

  18 Rn = 0; // frame 0 diharapkan dtg dulu while(true) // ulangi selamanya { WaitForEvent(); // sleep sampai terjadi event if(Event(ArrivalNotification)) // Frame data diterima { ReceiveFrame(); If(corrupted(frame)); Sleep(); If(seqNo == Rn) // no frame valid { DeliverData(); // kirim data ke network layer Rn= Rn + 1; SendACK(Rn); } } } ! # 6 + " )+.

  4 ;

  5

  3

  31

  38

  32

  33

  34

  35

  36

  37

  39

  2

  40

  41

  42

  43

  44 StopTimer(); } If(event(TimeOut)) // timer expires { StartTimer(); Temp = Sf; While(Temp < Sn) { SendFrame(Sf); Sf = Sf + 1; } } }

  3

  1

  • , ; *+,
  • <
  • , ; *+,
  • , 8 $ 1

  ! "" "/ # *+, ! "" "2 # *+,

% *+, * 4 );* 4-

! "" "5 # *+,

  • 3

  m

  1 Sw = 2 – 1;

  2 Sf = 0;

  3 Sn = 0;

  4

  16 Rn = 0; Naksent = false; Ackneeded = false; Repeat(for all slots) Marked(slot) = false; while(true) // ulangi selamanya { WaitForEvent(); // sleep sampai terjadi event if(Event(ArrivalNotification)) // Frame data diterima { ReceiveFrame(); If(corrupted(frame) &amp;&amp; (NOT naksent) { sendNAK(Rn); NAKsent = true;

  2

  37

  38

  39

  40

  41

  42

  43

  44

  45

  46

  47 { WaitForEvent(); If(Event(RequestToSend)) // jika paket hendak dikirim { If(Sn-Sf &gt;= Sw) // jika window penuh Sleep(); GetData(); MakeFrame(Sn); StoreFrame(Sn); SendFrame(sn); Sn = Sn + 1; StartTimer(Sn); } If(event(ArrivalNotification)) // ACK dtg { Receive(frame); // terima ACK atau NAK If(corrupted(frame)) Sleep(); If(FrameType == NAK) If(nakNo betweeen Sf and Sn) { Resend(nakNo); StartTimer(nakNo); } If(FrameType == ACK) If(nakNo between Sf and Sn) { While(Sf&lt;ackNo) { Purge(Sf); StopTimer(Sf); Sf = Sf +1; } } } If(event(TimeOut(t))) // timer expires { StartTimer(t); SendFrame(t); } }

  1

  3

  35

  4

  5

  6

  7

  8

  9

  10

  11

  12

  13

  14

  15

  36

  34

  6

  19

  7

  8

  9

  10

  11

  12

  13

  14

  15

  16

  17

  18

  20

  33

  21

  22

  23

  24

  25

  26

  27

  28

  29

  30

  31

  32

  • 3

  ; *+, &gt; &amp; ( * 4

&gt; " ( ;*4

  32

  ! "6 # *+, .

  43 } If(seqNo &lt;&gt; Rn) &amp;&amp; (NOT naksent) { sendNAK(Rn); naksent = true; if((seqNo in window) &amp;&amp; (!marked(seqno)) { Storeframe(seqno) Marked(seqno) = true; While(marked(Rn)) { DeliverData(Rn); Purge(Rn); Rn = Rn + 1; Ackneeded = true; } If(ackneeded) { Sendack(Rn); Ackneeded = false; Naksent = false; } } } } }

  42

  41

  40

  39

  38

  37

  36

  35

  34

  33

  31

  18

  30

  29

  28

  27

  26

  25

  24

  23

  22

  21

  20

  19

  • 4 %

  .

  . $

"

4 / D

  " " $ /

  • 7

  6 -7 / D%@ % *+,

  • 8

  9 : ;+E * E * ;+E % ;+E

  4 ;+E ! "" "&lt; ;+E

  • E % * E @

  ! "= * E

  ): - D%@

  • )0 )8 - 0 : ) - 0

  8 :

  8 ! "" "C # D%@

  D%@ 6 )

  • 2 = &amp;""""""&amp;

  1

  1 . " "$= )" - 1 " " &amp;

  " &amp;

  1 ' " $ :

  .

  (

  ;

  : %

  • ) : &amp; : / ;)0- % / &amp; &lt; . " / ;)+- * 4

  !

  $ "&amp; $ 2 )++- &amp;&amp; )+;+- "&amp;

  )+'1- &amp;" )0+'1- "" 5 . : / ;F * 4 ;*4

  &lt;

  8 ! "" $&amp; :

  8

  8 4

8 $ $ . )

  G- . ) G-

  &amp;&amp; &amp;&amp;" 0;+E "" &amp;"" 0;+E' "" "&amp;&amp; 0* E %E "" ""&amp; 0* E' &amp;&amp; &amp;&amp;&amp; 8: 8: :

  • &amp;&amp; ""&amp; 8* &amp;&amp; &amp;"&amp; %:0 +% % ( "&amp; &amp;&amp;&amp; 0:E +:E

  ( &amp;&amp; "&amp;&amp; 8. .

  • "" &amp;&amp;" +0'&gt; "" "&amp;" H:% H:% 'G :% "&amp; &amp;&amp;" +E+ +E+
    • # /

  E D%@ . . . )...- : ...

  %0@ ! "" $" # ...

  ...

  3 D%@ ... &amp;""""""&amp; 4 ...

  D%@ """""""

  8 D%@ ; ""&amp;&amp;&amp;&amp;&amp;&amp;

  ( 0 0 D%@ + $

  2 : 4 ...

  ! "" $$ # %

  &gt; ' 4 %

  1

  • ) 4 *

  1 1 ;

  .

  I

  4

  4 &gt;

  4

  ! "" $/ # ... 0 E ... ...

  @ . )@ .-

:

1 ... @ .

  ! "" $2 # @ .

  .

  I ...

  ).*.- ) D*.- .*.

  3

  8

  ! "" $5 # .*.

  D*. .*. &gt;

  3

  8

  8 % D

  1

  ! "" $6 # D*.

  ) ; . - ; . ... 0 :. .

  .

  ! "" $&lt; # :. .