'Transport_Layer'에 해당되는 글 16건

  1. 2014.02.20 4_TCP Slow Start by 훈승오승훈 1
  2. 2014.02.20 3_TCP AIMD by 훈승오승훈
  3. 2014.02.20 2_TCP Congestion Control by 훈승오승훈
  4. 2014.02.20 1_Congestion 개요 by 훈승오승훈
  5. 2014.02.17 1_ARQ by 훈승오승훈
  6. 2014.02.17 10_RDT_3.0 by 훈승오승훈
  7. 2014.02.17 9_RDT_2.2_CASE2 by 훈승오승훈
  8. 2014.02.17 8_RDT_2.2_CASE1 by 훈승오승훈 1
  9. 2014.02.14 7_RDT_2.1_CASE3 by 훈승오승훈
  10. 2014.02.14 6_RDT_2.1_CASE2 by 훈승오승훈 2

1. Slow Start

 -> TCP Congestion Algorithm

 -> 혼잡회피

2. Lost Event 발생하면

 -> 즉, Timeout이 발생하게 되면 재전송을 하게 된다.

 -> 불필요한 재전송으로 인해 네트워크는 혼잡해진다.

3. Actions

 -> 처음에 통신하고 있는 Congestion Window Size에 상관없이

  : 1 MSS로 초기화된다.

4. Lost Event가 멈추면

 -> 모든 ACK가 수신될 때마다, 1 MSS를 추가한다.

  : 즉 Congestion Window Size가 1이 늘어난 것이다.

 -> 결국 RTT마다 

  : Congestion Windows Size는 2배가 된다.

  : [1 -> 2 -> 4 -> 8 -----] 이렇게 증가하게 된다.

  -> 그러다가 Threshold에 도착하게 되면

  : AIMD Algorithm으로 선형증가를 하게 된다.

5. 지수증가

 -> RTT마다 2배씩 증가하여 지수증가라고 불린다.

  : 선형증가를 하게 되면 적당한 수준에 오를때 까지 긴 지연이 필요하다.

'Transport_Layer > $_Congestion' 카테고리의 다른 글

3_TCP AIMD  (0) 2014.02.20
2_TCP Congestion Control  (0) 2014.02.20
1_Congestion 개요  (0) 2014.02.20
Posted by 훈승오승훈
l

1. AIMD

 -> Addictive Increase Multiplicative Decrease

 -> TCP Congestion Algorithm

 -> 혼잡회피

2. Loss Event 발생하면

 -> 즉, 중복된 ACK 3번을 받게 되면 재전송을 하게 된다.

 -> 불필요한 재전송으로 인해 네트워크는 혼잡해진다.

3. Actions

 -> 처음에 통신하고 있는 Congestion Window Size를 Threshold까지 줄인다.

  : 예를 들어 Congestion Window Size = 10이라면

  : 5까지 줄인다.

4. Loss Event가 멈추면

 -> 최종 ACK를 받을 때마다

  : 각각의 RTT마다

 -> Congestion Window Size를 1 MSS씩 증가한다.

  : [5부터 6 -> 7 -> 8---] 이렇게 증가하게 된다.

5. 선형증가

 -> 1씩 증가하기 때문에 선형증가라고 부른다.

'Transport_Layer > $_Congestion' 카테고리의 다른 글

4_TCP Slow Start  (1) 2014.02.20
2_TCP Congestion Control  (0) 2014.02.20
1_Congestion 개요  (0) 2014.02.20
Posted by 훈승오승훈
l

1. End End Congestion Control

 -> 종단간의 혼잡제어를 의미한다.

 -> network로부터 어떠한 feedback도 받지 않는다.

2. TCP에서는 어떻게 해결하는가??

 -> TCP에서는 Congestion Window Size를 줄인다.

  : Sender에서 전송량을 제한하는 것이다.

 -> Congestion Window Size는 Network 혼잡도에 따라 다르다.

 -> Rate = Congestion Window Size / RTT (byte/sec)

3. Threshold

 -> 한계치이다.

 -> 통신을 하는 도중

  : 손실 packet이 발생하기 직전까지의 Congestion Window Size의 절반을 의미한다.

4. MSS

 -> Maximum Segment Size

  : 하나의 packet을 의미한다.

5. Sender는 어떻게 반응하는가??

 -> 중복된 ACK가 3번 일어날 때??

  : Congestion Window Size를 Threshold까지 줄인다.

  : TCP AIMD

 -> Timeout이 발생했을 때??

  : Congestion Window Size를 최소로 낮춘다.

  : 즉, 1 MSS를 초기화 한다.

  : TCP Slow Start

'Transport_Layer > $_Congestion' 카테고리의 다른 글

4_TCP Slow Start  (1) 2014.02.20
3_TCP AIMD  (0) 2014.02.20
1_Congestion 개요  (0) 2014.02.20
Posted by 훈승오승훈
l

1. Circuit Network

-> 회선망에서는 Congestion이 발생하지 않는다.

  : 그렇기 때문에 Congestion Control를 할 필요성을 느끼지 않는다.

2. Packet Network

 -> 우리가 사용하는 Packet망에서는 Congestion이 발생한다.

  : 그렇기 때문에 Congestion Control를 당연히 해야 한다.

3. Flow Control보다

-> Flow Control은 CPU가 많이 발전했기 때문에 잘 하지 않는다.

4. 트래픽강도 (Traffic Intensity)

 -> 처리할 수 있는 Queue에 트래픽의 집중성을 의미한다.

 -> La / R

  : R (packet를 처리할 수 있는 bandwidth)

  : L (packet의 길이 또는 개수)

  : a (packet이 Queue에 도착하는 평균 속도)

 -> La / R < 0

  : Queueing Delay가 매우 작다.

 -> La / R -> 1

  : Queueing Delay가 커진다.

 -> La / R > 1

  : Queueing Delay가 무한대로 증가한다.

  : 즉, Queue에 도착하는 비트가 Queue에서 전송되는 비율을 초과하는 경우

5. 발생하는 이유

 -> Packet Network에서는 하나의 공용라인을 사용하여 여러 Sender가 data를 전송한다.

  : 여러개의 Sender가 높은 전송률로 data를 전송하게 된다.

  : 통계적 다중화 방식

 ->  트래픽 강도가 1로 가거나 넘었을 때

  : 큐잉지연이 증가되고

  -> Queue의 용량이 무한대가 아님으로 Packet의 지연이 무한대가 되지 않는다.

  : Queue에서 더 이상 받을 수 없고 

  : 손실이 생기고 

  : 불필요한 재전송이 발생하게 된다.

6. Congestion의 또 하나의 Cost

 -> Congestion으로 인해 packet이 경로상에 버려질 때

  : 버려지는 지점까지

  : packet을 전송하는데 사용된 router의 전송 용량은 쓸모없어진다.

7. Congestion Control 접근방법

 -> End-End Congestion Control

 -> Network-assisted Congestion Control

8. End-End Congestion Control

 -> TCP가 Congestion Control을 하기 위해 사용하는 방식이다.

 -> Network로부터 어떠한 Feedback을 받지않고

  : 손실과 지연등의 현상을 관찰하여 End System이 추측한다.

'Transport_Layer > $_Congestion' 카테고리의 다른 글

4_TCP Slow Start  (1) 2014.02.20
3_TCP AIMD  (0) 2014.02.20
2_TCP Congestion Control  (0) 2014.02.20
Posted by 훈승오승훈
l

1_ARQ

Transport_Layer/$_ARQ 2014. 2. 17. 22:58

1. ARQ

 -> Automatic Repeat reQuest

  : 자동재전송요구

2. 개요

 -> [정확하게 수신이 되었는지 / 잘못 수신되었으니 반복이 필요한지]

  : Receiver가 Sender에게 알려주는 것이다.

 -> 재전송을 기반으로 하는 신뢰적인 데이터 전송 프로토콜(RDT)이다.

3. 오류 검출

 -> Bit Error가 발생했을 때

  : Receiver는 Bit Error를 검출할 수 있어야 하는 기능이 필요하다.

  : checksum이 필요하다.

 -> 오류 검출과 복구 기술은 따로 설명한다.

4. Receiver의 Feedback

 -> 서로 다른 End System에서 동작하므로

  : Sender가 Receiver의 상태를 알기 위한 유일한 방법은 Feedback을 제공하는 것이다.

5. 재전송

 -> Receiver에서 Bit Error를 가지고 수신된 packet은 Sender가 재전송해준다.


Posted by 훈승오승훈
l

10_RDT_3.0

Transport_Layer/$_RDT 2014. 2. 17. 15:33

1. RDT 1.0 ~ RDT2.2

 -> RDT 1.0

  : 완전 신뢰하는 통신

 -> RDT 2.0

  : 보내는 data에 Bit Error가 있는 통신

  : Checksum을 통해 해결

 -> RDT 2.1

  : 응답 packet의 변형이 일어나는 경우

  : 재전송을 했을 때, 중복packet이 발생하는 경우

 -> RDT 2.2

  : RDT 2.1과 같은 환경

  : 다른점은, 응답 packet중에 ACK만 있는 경우

2. RDT 3.0

 -> 새로운 가정을 추가한다.

 -> Channel Error 또는 Packet Loss가 일어나는 경우

3, 새로운 접근방식

 -> Sender는 합리적인 시간만큼 ACK를 기다린다.

 -> 합리적인 시간만큼 ACK가 오지 않는 경우

  : 재전송을 한다.

 -> 만약, RTT가 합리적인 시간보다 길어진 경우

  : 즉, ACK가 지연된 것이라면???

  : Receiver는 중복된 packet을 받게된다.

  : 중복제어는 이전에 배웠던 것으로 처리한다.

 -> **** 합리적인 시간, 즉 Timer가 필요하다.****

4. Sender

 -> Wait for 0 call from above

  : 상위 Layer로부터, Sequence Number 0을 추가할 data를 대기한다.

 -> Event 

  : rdt_send(data)

  : 상위 Layer로부터, Message(data)를 받는다.

 -> Actions

  : packet_$ = make(0, data, checksum)

  : 중복된 packet을 피하기 위한 Sequence Number 0을 추가

  : Bit Error를 위한 checksum 추가하여 Segment(packet_$)를 생성한다.

  : udt_send(packet_$)

  : 하위 Layer로 Segment(packet_$)를 전송한다.

  : start_timer

  : 합리적인 시간을 위해(ACK를 기다리는 시간) Timer를 작동시킨다.

 -> Wait for 0 ACK

  : Sequence Number 0을 가진 Segment(packet_$)에 대한 응답 packet을 대기한다.

5. CASE 1

 -> Receiver로부터 응답을 받았을 경우

 -> Wait for 0 ACK

  : Sequence Number 0을 가진 Segment(packet_$)에 대한 응답 packet을 대기한다.

 -> Event

  : rdt_rcv(rcvpkt) && corrupt(rcvpkt) || isACK(rcvpkt,1)

  : Receiver로부터 응답 packet을 받았다.

  : 응답 packet이 깨진 경우

  : 제대로 된 응답 packet이 오지만 Sequence Number 1이 오는 경우

   - 즉, 내가 기다리고 있는 응답 packet이 오지 않는 경우

 -> Actions

  : 내가 원한 응답이 아니기 때문에 아무것도 하지 않는다.

  : Timer는 지속적으로 흘러가고 있다.

 -> Wait for 0 ACK

  : 내가 원하는 응답이 오지 않았기 때문에 계속 응답 packet을 대기한다.

6. CASE 2

 -> 제대로 된 packet이 온 경우

 -> Wait for 0 ACK

  : Sequence Number 0을 가진 Segment(packet_$)에 대한 응답 packet을 대기한다.

 -> Event

  : rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt,0)

  : 하위 Layer로부터 Segment(rcvpkt)를 받는다.

  : Segment는 손상되지 않았다.

  : Sender가 대기하고 있던 Sequence Number 0에 대한 응답 packet을 받았다.

 -> Actions

  : stop_timer

  : 정상적인 응답 packet을 받았으므로 timer를 종료한다.

 -> Wait for 1 call from abve

  : Sequence Number 0에 대한 처리는 끝났기 때문에 1로 돌아간다.

7. CASE 3

 -> ACK가 훼손된 경우 && ACK 지연이 되는 경우

  : 즉 Timer가 끝날때까지 응답 packet이 안오는 경우

 -> Wait for 0 ACK

  : Sequence Number 0을 가진 Segment(packet_$)에 대한 응답 packet을 대기한다.

 -> Event

  : Timeout

  : start_timer에서 작동한 Timer가 중지된 상태이다.

 -> Actions

  : udt_send(packet_$)

  : buffer에 저장되고 있던 Segment(packet_$)을 다시 재전송한다.

  : start_timer

  : 다시 ACK를 기다리기 위한(합리적인 시간)시간을 작동한다.

 -> Receiver

  : CASE3에서 Receiver는 중복된 packet을 받는 경우

  : 마지막 수신한 Packet에 대한ACK를 보낸 Sequence를 담아서 보내준다.

 -> Wait for 0 ACK

'Transport_Layer > $_RDT' 카테고리의 다른 글

9_RDT_2.2_CASE2  (0) 2014.02.17
8_RDT_2.2_CASE1  (1) 2014.02.17
7_RDT_2.1_CASE3  (0) 2014.02.14
6_RDT_2.1_CASE2  (2) 2014.02.14
5_RDT_2.1_CASE1  (0) 2014.02.14
Posted by 훈승오승훈
l

1. RDT 2.1

 -> RDT 2.0에는 치명적인 오류가 있다.

2. RDT 2.0의 치명적인 오류 & 해결

 -> ACK와 NAK가 깨졌을 때??

  : ACK와 NAK에도 checksum을 통해 해결한다.

 -> 즉, 응답 packet의 변형이 발생하면 Sender는 재전송하게 된다.

  : 그런데 Receiver가 보낸 응답 packet이 ACK였다면??

  : Sender는 Receiver가 받은 이전 packet을 재전송을하게 되면서

  : Receiver는 중복된 packet을 받는다.

 -> 중복된 packet을 구별하기 위해서

  : Sender는 packet에 Sequence Number를 추가하여

  : Receiver는 해당 packet이 재전송인지 다음 packet인지 구별한다.

3. RDT 2,2

 -> RDT 2.1과 똑같은 상황이다.

 -> 차이점은 NAK packet이 없는 RDT이다.

4. CASE 2

 -> Bit Error가 있는 Segment를 받았을 경우를 본다.

  : Receiver로부터 ACK 응답을 받게 된다.

 -> Wait for 0 call from below 상태에서

  : 중복 Pakcet을 받았을 경이다.

 -> Wait for 0 ACK 상태에서

  : 응답 packet이 이전 Sequence Number 정보를 담고있는 경우를 본다.

  : 즉, Sender가 보낸 packet에 문제가 생겼다는 것을 말한다.

4_1. Sender

 -> Wait for 0 call from above

  : 상위 Layer로부터 Data를 받기 위해 대기하는 단계이다.

  : Sequence Number 0을 추가할 Data를 대기하는 것이다.

 -> Event

  : rdt_send(data)

  : 상위 Layer로부터 data를 받는다.

 -> Actions  

  : packet_# = make(0, data, checksum)

  : 하위 Layer로 보낼 Segment(packet_#)을 만든다.

  : packet의 중복을 피하기 위한 Sequence Number 0

  : Bit Error를 판별하기 위한 checksum을 추가하여 생성한다.

  : udt_send(packet_#)

  : 하위 Layer로 Segment(packet_#)을 전송한다.

  : Wait for 0 ACK

  : Sequence Number 0을 가진 Segment(packet_#)에 대한 응답을 기다린다.

4_2. Receiver

 -> Wait for 0 call from below

  : 하위 Layer로부터 Sequence Number 0을 가진 Segment를 대기하는 단계이다.

 -> Event

  : rdt_rcv(packet_#) && corrupt(packet_#) || has seq1(packet_#)

  : 하위 Layer로부터 Segment(packet_#)을 받는다.

  : 해당 packet이 훼손되어 알아 볼 수 없게 되는 경우

  : 또는, 받은 packet이 Sequence Number 1일 경우

  : 이전에 통신이 이루어져 있을 때, 이전 Sequence Nubmer가 1인 경우

  : 즉, 중복된 packet이 들어올 때 하는 방법

 -> Actions

  : packet_$ = make(ACK1, checksum)

  : 첫 data부터 오류시 : 하위 Layer로 보낼 응답 packet을 생성한다.

  : 그 다음, Wait for [이전 Sequence Number]  from below에서 만들었던 응답 packet

  : 이는 처음에 생성해 놓고 다음 packet이 정상적으로 들어올 때 까지 buffer에 저장한다.

  : udt_send(packet_$)

  : 하위 Layer로 Segment(packet_$)를 보낸다.

 -> Wait for 0 call from below

  : 하위 Layer로부터 Sequence Number 0을 가진 Segment를 대기하는 단계이다.

4_3. Sender

 -> Wait for ACK 0

  : Sequence Number 0을 가진 Segment에 대한 응답을 기다린다.

 -> Event

  : rdt_rcv(packet_$) && corrupt(packet_$) || isACK(packet_$,1)

  : 하위 Layer로부터 Segment(packet_$)을 받는다.

  : 응답 packet을 못 알아보는 경우

  : 응답 packet을 확인한 결과, 이전 Sequence Number가 있는 경우

 -> Actions

  : udt_send(packet_#)

  : 해당 Buffer에 저장되어 있던 이전 Segment(packet_#)를 재전송하게 된다.

4_4. Receiver & Sender

 -> 재전송을 한 경우 제대로 된 통신을 한다면

  : CASE 1

 -> 다시 Bit Error가 발생, 응답 packet이 손상, 중복딘 packet을 받는 경우

  : CASE 2

'Transport_Layer > $_RDT' 카테고리의 다른 글

10_RDT_3.0  (0) 2014.02.17
8_RDT_2.2_CASE1  (1) 2014.02.17
7_RDT_2.1_CASE3  (0) 2014.02.14
6_RDT_2.1_CASE2  (2) 2014.02.14
5_RDT_2.1_CASE1  (0) 2014.02.14
Posted by 훈승오승훈
l

1. RDT 2.1

 -> RDT 2.0에는 치명적인 오류가 있다.

2. RDT 2.0의 치명적인 오류 & 해결

 -> ACK와 NAK가 깨졌을 때??

  : ACK와 NAK에도 checksum을 통해 해결한다.

 -> 즉, 응답 packet의 변형이 발생하면 Sender는 재전송하게 된다.

  : 그런데 Receiver가 보낸 응답 packet이 ACK였다면??

  : Sender는 Receiver가 받은 이전 packet을 재전송을하게 되면서

  : Receiver는 중복된 packet을 받는다.

 -> 중복된 packet을 구별하기 위해서

  : Sender는 packet에 Sequence Number를 추가하여

  : Receiver는 해당 packet이 재전송인지 다음 packet인지 구별한다.

3. RDT 2.2

 -> RDT 2.1과 똑같은 상황이다.

 -> 차이점은 NAK pakcet이 없는 RDT이다.

4. CASE 1

 -> Bit Error가 없는 Segment를 받았을 경우를 본다.

  : Receiver로부터 ACK 응답을 받게 된다.

 -> 응답 packet에 손상이 없는 경우를 본다.

 -> RDT_2.1_CASE1과 비슷하다.

4_1. Sender

 -> Wait for 0 call from above

  : 상위 Layer로부터 Sequenceㅠ Number 0을 추가할 Data를 대기하고 있는 단계이다.

 -> Event

  : rdt_send(data)

  : 상위 Layer로부터 Message(data)를 받는다.

 -> Actions

  : packet_! = make(0,data,checksum)

  : 하위 Layer로 전송할 Segment(packet_!)를 만든다.

  : packet의 중복을 피하기 위한 Sequence Number 0

  : Bit Error를 판별하기 위한 checksum을 추가하여 생성한다.

  : udt_send(packet_!)

  : 하위 Layer로 Segment(packet_!)을 전송한다.

 -> Wait for 0 ACK or NAK

  : Sequence Number 0에 대한 응답 pakcet을 대기한다.

4_2. Receiver

 -> Wait for 0 call from below

  : 하위 Layer로부터 Sequence Number 0을 가진 Segment를 대기한다.

 -> Event

  : rdt_rcv(packet_!) && notcorrupt(packet_!) && has seq0(packet_!)

  : 하위 Layer로부터 Segment를 받는다.

  : Segment(packet_!)는 Bit Error가 발생하지 않았다는 것을 확인한다.

  : 해당 Segment(packet_!)는 Sequnence Number 0을 가진 것을 포함한다.

 -> Actions

  : extract(packet_!,data)

  : 아무 이상이 없기 때문에, packet_!에서 data를 추출한다.

  : deliver_data(data)

  : 상위 Layer로 추출한 Message(data)를 전송한다.

  : packet_@ = make(ACK0,checksum)

  : Sender가 보낸 Segment를 잘 받았다는 응답 pakcet을 생성한다.

  : ACK0응답과 함께, ACK의 훼손을 막기위해 checksum을 추가한다.

  : udt_send(packet_@)

  : 해당 Segment를 하위 Layer로 전송한다.

 -> Wait for 1 call from below

  : Sequence Number 0 packet에 대한 처리가 끝났기 때문에 1을 기다린다.

4_3. Sender

 -> Wait for 0 ACK or NAK

  : Sequence Number 0 packet을 보내고 잘 받았다는 응답 packet을 기다린다.

 -> Evenet

  : ----------------------------------------응답 packet이 제대로 간 경우

  : rdt_rcv(packet_@) && notcorrupt(packet_@) && isACK(packet_@,0)

  : 하위 Layer로부터 Segment(packet_@)를 받았다.

  : Segment(packet_@)는 훼손되지 않은 packet임을 확인한다.

  : packet_!에 대한 응답으로, Sequence Number 0에 대한 ACK임을 알 수 있다.

 -> Actions

  : 잘 전송되었기 때문에 할 행동이 없다.

 -> Wait for 1 call from above

  : 상위 Layer로부터, Sequence Number 1을 추가할 data를 대기한다.

'Transport_Layer > $_RDT' 카테고리의 다른 글

10_RDT_3.0  (0) 2014.02.17
9_RDT_2.2_CASE2  (0) 2014.02.17
7_RDT_2.1_CASE3  (0) 2014.02.14
6_RDT_2.1_CASE2  (2) 2014.02.14
5_RDT_2.1_CASE1  (0) 2014.02.14
Posted by 훈승오승훈
l

1. RDT 2.1

 -> RDT 2.0에는 치명적인 오류가 있다.

2. RDT 2.0의 치명적인 오류

 -> ACK와 NAK가 깨졌을 때??

  : Receiver가 보낸 응답 packet에 손상이 있을 때는 어떻게 할 것인가??

  : Sender가 보낸 packet이 잘 받아졌는지 아닌지 알 수 없다.

 -> ACK가 깨졌을 때??

  : Sender는 다음 packet을 보내야할지 말아야할지 구별할 수 없다.

 -> NAK가 깨졌을 때??

  : Sender는 해당 packet을 재전송 해야할지 말아야할지 구별할 수 없다.

 -> 응답 packet이 변형되면 Sender는 재전송하는 경우가 발생한다.

  : 그렇게 되면 Receiver는 중복된 packet을 받는다.

3. 치명적인 오류 해결방법

 -> ACK와 NAK에도 checksum을 통해 해결한다.

 -> 만약 Receiver에서 똑같은 packet을 받았을 때

  : Sender는 packet에 Sequence Number를 추가하여

  : Receiver는 해당 packet이 재전송인지 다음 packet인지 구별한다.

4. CASE 3

 -> Bit Error가 없는 Segment를 받았을 경우를 본다.

  : Receiver로부터 ACK 응답을 받게 된다.

 -> 응답 packet에 손상이 있는 경우를 본다.

  : 이 때, ACK 응답이 손상된 상황이다.

  -> Sender는 재전송을 하게 되는데

  : 이 packet은 중복이 되는 상황이다. 

4_1. Sender

 -> Wait for 0 call from above

  : 상위 Layer로부터 Data를 받기 위해 대기하는 상태이다.

  : Sequence Number 0을 추가할 Data를 대기한다.

 -> Event

  : rdt_send(data)

  : 상위 Layer로 부터 data를 받는다.

 -> Actions

  : packet_% = make(0,data,checksum)

  : 하위 Layer로 보낼 Segment(packet_%)를 만든다.

  : packet의 중복을 피하기 위한 Sequence Number 0

  : Bit Error를 판별하기 위한 checksum을 추가하여 생성한다.

  : udt_send(packet_%)

  : 하위 Layer로 Segment(packet_%)을 전송한다.

 -> Wait for 0 ACK or NAK

  : Sequence Number 0을 가진 Segment(packet_%)에 대한 응답을 기다린다.

4_2. Receiver

  -> Wait for 0 call from below

  : 하위 Layer로부터 Sequence Number 0을 가진 Segment를 기다린다.

 -> Evenet 

  : rdt_rcv(packet_%) && notcorrupt(packet_%) && has seq0(packet_%)

  : 하위 Layer로부터 Segment(packet_%)을 받는다.

  : Segment(packet_%)는 Bit Error가 발생하지 않았다는 것을 확인한다.

  : 해당 Segment(packet_%)는 Sequence Number 0을 가진 것을 포함한다.

 -> Actions

  : packet_^ = make(ACK,checksum)

  : 하위 Layer로 보낼 Segment(packet_^)를 생성한다.

  : Sender에서 보낸 packet을 잘 받았다는 것에 대한 응답(ACK)을 하는 것이다.

  : 또한, ACK의 훼손여부를 위한 checksum을 추가하여 Segment(packet_^)을 생성한다.

  : udt_send(packet_^)

  : 하위 Layer로 Segment(packet_^)을 전송한다.

 -> Wait for 1 call from below

  : 하위 Layer로부터 Sequence Number 1을 가진 Segment를 대기한다.

  : CASE2와는 다르다.

4_3. Sender

 -> Wait for 0 ACK or NAK

  : Sequence Number 0을 가진 Segment(packet_%)에 대한 응답을 기다린다.

 -> Event

  : ----------------------------------응답 packet이 제대로 가지 않은 경우

  : rdt_rcv(packet_^) && (corrupt(packet_^ || isACK(packet_^))

  : 하위 Layer로부터 Segment(packet_^)를 받는다.

  : 그런데 두 가지 경우의 수가 발생한다. (CASE3은 1번 포함)

  : 첫번째는 응답 packet에 손상이 가는 경우

  : 두번째는 Bit Error에 해당하는 NAK 응답을 받는 경우

 -> Actions

  : 해당 경우에는, Sender가 보낸 packet을 Receiver가 잘 받았음에도 불구하고

  : ACK를 담은 packet이 손상되어서 알아 볼 수 없기 때문에

  : udt_send(packet_%)

  : Sender는 Buffer에 있는 Segment(packet_%)를 재전송을 하게 된다.

 -> Wait for 0 ACK or NAK

  : Sequence Number 0을 가진 Segment(packet_%)에 대한 응답을 기다린다.

4_4. Receiver

 -> Wait for 1 call from below

  : 하위 Layer로부터 Sequence Number 1을 가진 Segment를 대기한다.

  : -----------------------------------------중복되는 상황을 보여주는 경우

  : Receiver는 Sequence Number 0을 가진 Segment에 대한 응답 packet을 보냈기 때문에

  : Sequence Number 1를 기다리고 있는 Event가 발생한다.

 -> Event

  : rdt_rcv(packet_$) && notcorrupt(packet_$) && has seq0(packet_$)

  : 해당 Segment(packet_$)는 Sequence Number 0을 가진 packet이므로

  : Receiver는 중복을 제어해야 한다.

  : 이는 Sequence Number를 보고 판단하는데 내가 원하는 것은 1이기 때문에

  : 0으로 들어온 해당 packet은 버린다.

 -> Actions

  : packet_& = make(ACK, checksum)

  : 하위 Layer로 보낼 응답 Segment(packet_&)를 생성한다.

  : 받은 packet은 버리지만, 해당 packet에 대한 응답 packet은 해준다.

  : udt_send(packet_&)

  : 하위 Layer로 응답 Segment(packet_&)를 전송한다.

 -> Wait for 1 call from below

  : 하위 Layer로부터 Sequence Number 1을 가진 Segment를 대기한다.

4_5. Sender & Receiver

 -> 다시 보냈을 때 응답 packet에 손상이 없고 제대로 된 통신을 한다면

  : CASE 1

 -> 다시 보냈을 떄 응답 packet에 손상(ACK 손상)이 된 경우

  : CASE 2

'Transport_Layer > $_RDT' 카테고리의 다른 글

9_RDT_2.2_CASE2  (0) 2014.02.17
8_RDT_2.2_CASE1  (1) 2014.02.17
6_RDT_2.1_CASE2  (2) 2014.02.14
5_RDT_2.1_CASE1  (0) 2014.02.14
4_RDT_2.0_CASE2  (0) 2014.02.14
Posted by 훈승오승훈
l

1. RDT 2.1

 -> RDT 2.0에는 치명적인 오류가 있다.

2. RDT 2.0의 치명적인 오류

 -> ACK와 NAK가 깨졌을 때??

  : Receiver가 보낸 응답 packet에 손상이 있을 때는 어떻게 할 것인가??

  : Sender가 보낸 packet이 잘 받아졌는지 아닌지 알 수 없다.

 -> ACK가 깨졌을 때??

  : Sender는 다음 packet을 보내야할지 말아야할지 구별할 수 없다.

 -> NAK가 깨졌을 때??

  : Sender는 해당 packet을 재전송 해야할지 말아야할지 구별할 수 없다.

 -> 응답 packet이 변형되면 Sender는 재전송하는 경우가 발생한다.

  : 그렇게 되면 Receiver는 중복된 packet을 받는다.

3. 치명적인 오류 해결방법

 -> ACK와 NAK에도 checksum을 통해 해결한다.

 -> 만약 Receiver에서 똑같은 packet을 받았을 때

  : Sender는 packet에 Sequence Number를 추가하여

  : Receiver는 해당 packet이 재전송인지 다음 packet인지 구별한다.

4. CASE 2

 -> Bit Error가 있는 Segment를 받았을 경우를 본다.

  : Receiver로부터 NAK 응답을 받게 된다.

 -> 응답 packet에 손상이 있는 경우를 본다.

  : 이 때는 NAK 응답이 손상된 상황이다.

4_1. Sender

 -> Wait for 0 call from above

  : 현 상태는, 상위 Layer로부터 Data를 받기 위해 대기하는 단계이다.

  : Sequence Number 0을 추가할 Data를 대기하는 것이다.

 -> Event

  : udt_send(data)

  : 상위 Layer로부터 data를 받는다.

 -> Actions

  : packet_# = make(0, data, checksum)

  : 하위 Layer로 보낼 Segment(packet_#)을 만든다.

  : packet의 중복을 피하기 위한 Sequence Number 0과 

  : Bit Error를 판별하기 위한 checksum을 추가하여 생성한다.

  : udt_send(packet_#)

  : 하위 Layer로 Segment(packet_#)을 전송한다.

  : Wait for 0 ACK or NAK

  : Sequence Number 0을 가진 Segment(packet_#)에 대한 응답을 기다린다.

4_2. Receiver

 -> Wait for 0 call from below

  : 하위 Layer로부터 Sequence Number 0을 가진 Segment를 대기하는 단계이다.

 -> Event

  :  rdt_rcv(packet_#) && corrupt(packet_#)

  : 하위 Layer로부터 Segment(packet_#)를 받는다.

  : Segment(packet_#)은 Bit Error가 발생했다는 것을 확인한다.

 -> Actions

  : packet_$ = make(NAK,checksum)

  : Sender로부터 받은 Segmnet(packet_#)에 Bit Error가 있기 때문에

  : 제대로 받지 못했다는 응답을 날리기 위해 NAK를 포함한 데이터를 보낸다. 

  : 또한, NAK의 훼손여부를 위한 checksum을 추가하여 Segment(packet_$)을 생성한다.

  : udt_send(packet_$)

  : 하위 Layer로 Segment(packet_$)을 전송한다.

 -> Wait for 0 call from below

  : 잘못된 packet이 왔기 때문에 다시 Sequence Number 0을 가진 Segment를 대기한다.

4_3. Sender

 -> Wait for 0 ACK or NAK

  : Sequence Number 0을  Segment(packet_#)에 대한 응답을 기다린다.

 ->Event

  : rdt_rcv(packet_$) && (corrupt(packet_$) || isNAK(packet_$))

  : ----------------------------------응답 packet이 제대로 가지 않은 경우

  : 하위 Layer로부터 Segment(packet_$)을 받는다.

  : 그런데 두 가지 경우의 수가 발생한다. (CASE2는 둘 다 포함)

  : 첫번째는 응답 packet에 손상이 가는 경우

  : 두번째는 Bit Error에 해당하는 NAK 응답을 받는 경우

 -> Actions

 : udt_send(packet_#)

  : Buffer에 저장하고 있던 Segment(packet_#)를 하위 Layer에 보낸다.

 -> Wait for 0 ACK or NAK

  : Sequence Number 0을 가진 Segment에 대한 응답을 기다린다.

  : 즉, 재전송을 했기 때문에 Segment(packet_#)에 대한 응답을 다시 기다리게 된다.

4_4. Receiver & Sender

 -> 재전송을 한 경 제대로 된 통신 한다면

  : CASE 1

 -> 다시 한 번 Bit Error가 발생하거나 응답 packet이 손상된 경우

  : CASE 2

'Transport_Layer > $_RDT' 카테고리의 다른 글

8_RDT_2.2_CASE1  (1) 2014.02.17
7_RDT_2.1_CASE3  (0) 2014.02.14
5_RDT_2.1_CASE1  (0) 2014.02.14
4_RDT_2.0_CASE2  (0) 2014.02.14
3_RDT_2.0_CASE1  (0) 2014.02.14
Posted by 훈승오승훈
l