통신프로토콜 TCP(3)
Flow Control
-Source측에서 보낼 수 있는 data의 양을 조절한다.
- Receiver window : rwnd(수신 할 수 있는 data의 양) 와, Sender window : cwnd(ack의 수신없이 전송할 수 있는 data의 양)로 Source가 Destination에게 전송하는 data의 양을 조절한다.
- window size는 rwnd와 cwnd중 작은 값을 따른다.
① Stop – and – Wait
- Stop – and – Wait 방식은 Source가 Destination에게 data를 하나를 전송 한 후 Destination으로부터 ack를 받기 까지 기다리는 방식이다. 따라서 ack가 오기 전까지 낭비되는 시간이 많아 전송효율이 떨어진다. ※ 전송하려는 data를 하나씩 전송하는 방법
② Sliding Window
- Sliding Window는 Stop – and – wait 방식과는 달리 Source가 여러 data를 전송하는 방식이다. Source가 Destination에게 data를 전송할 때 Window Size만큼 전송을 한다. Destination에게로 data를 전송도중 Destination에게로부터 ack를 수신 하면 ack값에 따라 Window가 움직이게 되어 새로운 data를 전송할 수 있게 된다. 만약 Window안에 n~m 까지의 data가 있다고 치면 m+1까지는 ack를 받은 data이다. 그리고 Window안에 있는 data들을 전송하고 있는데 m-1번 data까지 수신을 했다는 ack를 받으면 Window는 움직이게 되어 n-2~m-2까지의 data가 Window안에 들어가게 된다.
- 위 그림은 Sliding Window를 통해 한번에 여러 data를 전송하는 것을 보여주는 그림이다. 위 그림을 보면 Source측 window는 4096이며, Destination window는 4096인 것으로 Window size는 4096이 된다. 또, data의 크기가 1024로 한번에 전송할 수 있는 data의 수는 4(4096/1024 = 4)개 인 것을 알 수 있다.
- 처음 window에는 1, 2, 3, 4 총 4개의 data가 들어가게 된다. Source가 window에 있는 data를 전송하고 있는 도중 Destination에서부터 Ack block 2 win 4096 이란 응답을 받으면 window는 움직이게 되어 3, 4, 5, 6 총 4개의 data가 들어가게 된다. 그 이 후 3번 data에 대해 ack를 발생 하며 win 3072라는 응답을 발생 하게 되는데 그럼 Destination이 받을 수 있는 data가 3(3072/1024 = 3)개 라는 것을 인지하고 window에는 4, 5, 6 총 3개의 data가 들어가게 된다. 그 이후 source가 data를 전송하는데 Destination으로부터 4번 data에 대한 ack를 발생하며 win 4096이라고 응답을 받으면 Destination이 받을 수 있는 data가 4개 이고 4번까지 잘 받았다는 것을 인지하고 window가 움직이게 되어 5, 6, 7, 8 data가 들어가게 된다.
- 위 그림도 마찬가지로 Window size를 이용한 전송 방법을 나타내고 있다.
- Destination이 자신이 수신 가능한 data의 크기는 1000byte라는 것을 Source에게 알려주면 Source는 1000byte의 data를 전송하게 된다. 그럼 Destination은 수신 한 1000byte를 처리 하지 못하였지만 잘 받았기 때문에 자신이 수신 가능한 data의 크기가 0byte라는 것을 알려주며 ack를 발생한다. 그럼 Source는 Destination의 window size가 0인 것을 알고 대기 하게 된다. 그 후 Destination이 data를 처리하고 자신이 수신 할 수 있는 data의 크기가 500byte라는 것을 알려주면 Source는 이전에 전송한 data부터 500byte를 전송한다.
→ Flow Control은 Source측의 Window Size에 대해서 전송하는 data의 양을 조절하는 방법이다.
Persist Timer
- Persist Timer는 Source로부터 data를 전송 받고 있는 도중 Destination자신이 처리하는 data의 양이 꽉 차서 window size가 0이 되어 ack를 발생 한 다음 data를 처리 후 data를 수신 할 수 있다는 ack를 발생 시켰지만 ack가 손실될 경우를 방지하기 위한 Timer이다
- Destination이 이제 data를 수신할 수 있다는 것을 Source에게 알려주기 위해 ack를 발생 시켰지만 ack가 손실이 되어 Source가 이를 수신 하지 못한 경우 Source는 Destination이 data가 꽉 차있다는 ack를 받은 후 일정 시간 지나서 probe message를 발생 시키게 된다. Destination으로부터 ack가 오지 않으면 처음에 전송한 시간의 2배씩 증가 시키며 probe message를 발생 하게 되고 시간이 약 1분이 되면 1분 간격으로 probe message를 전송하게 된다. 만약 probe message에 대한 ack가 올 경우 Source는 Destination에게 data를 다시 전송하게 된다.
SWS(Sily Window Syndrome)
- 전송 하려는 data의 크기가 매우 작아 data 크기 보다 header의 크기가 훨씬 커지는 현상을 말한다.
- 이 경우에는 Destination이 자신이 수신 가능한 data의 양을 알려주면 Source는 알려준 양의 50%만큼 data가 모일 때 까지 기다린 후 data가 모이면 전송 한다. 이때 Source측은 data가 모일 때까지 무한정 기다리지 않고 일정 시간 지나면 data를 전송한다. 만약 모인 data의 양이 MSS만큼 모이게 되면 ack없이도 전송이 가능하다.
- Destination은 자신이 수신 가능한 data의 양이 0이 되고 난 후 약간의 data가 처리가 되고 수신 가능한 data의 양이 약간 생기면 바로 Source에게 알려주지 않는다. 만약 알려주게 되면 패킷의 낭비가 심해지기 때문이다. 이것을 방지하기 위해 Destination은 자신이 수신 가능한 data의 양이 전체의 50%가 될 때 까지 Source에게 알려주지 않고 기다린다. 만약 처리가 느려져 오래 기다리는 것을 방지하기 위해 일정 시간 지나면 Source에게 알려주게 된다. 만약 Destination이 자신이 수신 할 수 있는 data의 양이 늘게 되면 Source에게 알려주기 위한 시간이 새롭게 갱신된다.
Congestion Control
- Congestion은 Source가 전송하는 data의 속도가 Destination이 data를 처리하는 속도보다 빠른 경우에 발생한다.
- Congestion Control을 위한 방법 중 하나인 Slow Start, Exponential Increase 방식이다. 이 방식은 처음 Source는 ack를 수신 하지 않은 상태에서 전송할 수 있는 data의 개수를 1개로 하여 전송한다. 그 후 Destination에서 ack가 오면 Source는 ack를 수신 하지 않은 상태에서 전송할 수 있는 data의 개수를*2하여 전송하는 방식이다. cwnd는 최대 임계치 까지 증가한다.
- Source가 data를 전송하고 그에 따른 ack가 오면 Source는 전송하는 data의 개수를 *2배씩 증가시키는 방식이 Slow Start, Exponential Increase이다.
- Congestion Control을 위한 다른 방법은 Congestion Avoidance, Additive Increase 방식이다. 이 방식은 처음 Source는 ack를 수신 하지 않은 상태에서 전송 할 수 있는 data의 개수를 1개로 하여 전송한다. 그 후 Destination에서 ack가 오면 Source는 ack를 수신 하지 않은 상태에서 전송할 수 있는 data의 개수를+1하여 전송하는 방식이다.
- Source가 data를 전송하고 그에 따른 ack가 오면 Source는 전송하는 data의 개수를 +1개씩 증가시켜 전송하는 방식이 Congestion Avoidance, Additive Increase 방식이다.
→ Slow Start, Exponential Increase와 Congestion Avoidance, Additive Increase방식의 차이점은 cwnd가 증가 하는 방식에 따라 있다. Slow Start는 *2배씩 증가하는 반면 congestion Avoidance방식은 +1개씩 증가한다.