오늘도 돌아온 TCP
요즘 네트워크만 보는데 볼수록 너무 재미있다. 역시 전공은 전공인가
TCP는 패킷 교환방식 네트워크에서 패킷들이 안전하게 이동할 수 있도록 신뢰성을 보장해주는 프로토콜인데~~ 지난번 정리를 통해 TCP가 그놈의 신뢰성 신뢰성을 보장하기 위해 3 way handshake로 전송 전 연결을 설정하고 전송이 끝나면 4 way handshake로 연결을 종료한다는 것을 알게되었다.
오늘은 TCP는 흐름제어에 대해서 알아보자.
그리고 혼잡제어는...다음에 알아보자
: 송신 측과 수신 측의 TCP 버퍼 크기 차이로 인해 생기는 데이터 처리 속도 차를 해결하기 위한 기법이다.
(흐름제어를 통한 메시지 전송 보장)
송, 수신측의 컴퓨터 성능과 상황이 모두 같으면 좋겠지만~현실은 그렇지않다.
결론부터 말하자면 흐름제어는 수신측이 너무 많은 패킷을 수신받지 않도록 하는 것이다.
데이터 전송 시 수신 측이 송신 측보다 데이터 처리 속도가 빠르면 문제 없지만, 송신 측 속도가 빠를 경우에는 문제가 생긴다.
왜냐하면 수신 측의 패킷을 받는 버퍼의 크기가 정해져 있는데, 송신 측 전송 속도가 너무 빨라 한번에 많은 패킷을 수신 받는다면, 버퍼가 가득차 손실되는 패킷이 발생할 수 있고, 패킷이 손실되면 이를 재전송하기 위한 불필요한 추가 패킷 전송이 발생하게 된다.
😎 TCP 버퍼
송신 측은 버퍼에 TCP 세그먼트를 보관한 후 순차적으로 전송하고, 수신 측은 도착한 TCP 세그먼트를 애플리케이션이 읽을 때까지 버퍼에 보관한다.
조금 더 조금 더 쉽게 정리하면,
흐름제어란 결국 송신자가 [메시지를 보내는 속도]가 수신자가 [메시지를 받고 처리하는 속도]보다 빠를 때, 수신자의 메시지 함은 점점 차고~ 그렇게 가득 차면 더 이상 저장할 공간이 없기 때문에 메시지를 버려야하는 상황이 온다.(오버 플로우)
이러한 오버 플로우 현상을 방지하기위해 송신자와 수신자의 속도를 맞춰주는 것을 흐름제어라고 한다!
흐름제어의 기본 개념은 수신측이 송신측에게 "나 패킷 잘 받고있어"하며 자신의 상태를 계속 알리는 것이다.
데이터를 더 받을 준비가 되어있다는 피드백을 받으면 송신 측은 패킷을 이어서 전송한다.
매번 전송한 패킷에 대해 확인 응답(ACK)를 받아야만 그 다음 패킷을 전송하는 방법
패킷을 보내고 받았다는 확인 응답(ACK) 받아면 다음거 보내고 또 확인하고
이 방식은 누가봐도 굉장히 비효율적인 방법이다.
이런 방법을 사용하여 흐름 제어를 하게되면 굉장히 비효율적이기 때문에 오늘날의 TCP는 특별한 경우가 아닌 이상 대부분 슬라이딩 윈도우 방식을 사용한다.
슬라이딩 윈도우는 전송 측이 전송한 패킷에 대한 확인(ACK)을 받지 않고도 여러 패킷을 보내는 것을 가능하도록 하는데 수신 측이 한번에 처리할 수 있는 데이터의 양을 정해두고 그때 그때 수신 측 데이터 처리 상황을 송신 측에 알려줘서 데이터의 흐름을 제어하는 방식이다.
Stop And Wait와 가장 큰 차이는 송신 측이 수시 측이 처리할 수 있는 데이터의 양을 알고있다는 점이다.
이미 수신 측이 처리할 수 있는 데이터 양을 알고 있으니 굳이 수신 측에게서 ACK를 받지않아도 예측이 가능하다는 것이다.
송신 측과 수신 측은 각각 데이터를 담을 수 있는 버퍼
를 가지고 있고, 윈도우
라는 일종의 마스킹 도구를 가지고 있다.
송신 측은 이 윈도우에 들어있는 데이터를 수신 측 응답 없이도 연속적으로 보낼 수 있다.
Window Size
손신 측 윈도우 크기는 처음 TCP 연결을 생성하는 과정인 3 way handshake때 결정된다. 송신 측과 수신 측은 ACK를 보낼 때 자신의 현재 버퍼 크기를 TCP Header에 담아 보내 서로에게 알려주고, 송신 측은 수신 측이 보낸 버퍼 크기를 사용하여 "어~ 너는 이 정도 처리가 가능하구나~"라는 과정을 통해 자기 윈도우 크기를 정하게된다.
이 윈도우 크기는 고정이 아니라 통신을 하는 과정 중간 중간 계속 동적으로 변경될 수 있다. 이 말은 즉, 연속적으로 보낼 데이터의 양을 변경해가며 유연한 흐름제어가 가능하다는 말이다.
송신 측은 수신 측에게 받은 윈도우 크기와 현재 네트워크 상황 등을 고려하여 윈도우 크기를 7로 설정하고 ACK를 받기 전까지 윈도우 안에 있는 데이터를 주르르르륵 보낸다.
(윈도우에 있는 데이터들을 전송 했지만 상대가 처리했는지는 모르는 상태)
수신 측은 자신의 처리 속도에 맞게 데이터를 처리한 후 응답으로 현재 버퍼에 남은 공간이 얼마인지 ACK와 함께 보낸다.
ACK를 받은 송신 측은 받은 윈도우 사이즈에 맞게 윈도우를 옆으로 옮긴다.
윈도우를 옆으로 이동시키며 새로 들어온 데이터를 전송하기 때문에 슬라이딩 윈도우라고 한다.
보내고 > 응답받고 > 윈도우 밀고
데이터를 다 받을 때까지 위 과정을 반복 반복
오늘은 TCP의 흐름 제어 기법에 대해 알아봤다.
그래 알아봤다.... 으ㅁ...끝@@
출처
https://steady-coding.tistory.com/507
https://jvinci.tistory.com/67
https://evan-moon.github.io/2019/11/22/tcp-flow-control-error-control/
https://velog.io/@haero_kim/TCP-%ED%9D%90%EB%A6%84%EC%A0%9C%EC%96%B4-%EA%B8%B0%EB%B2%95-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0