CS☝🏻 TCP의 대표적 3가지 제어
✨TCP의 3가지 제어
- 전송 데이터의 양을 조절하는 흐름제어
- 통신 중 데이터가 유실되거나 잘못 수신되었을 경우 대처하기 위한 오류제어
- 네트워크 혼잡에 대처하기 위한 혼잡제어
1. 흐름제어
송신 측과 수신 측의 데이터 처리 속도가 상이할 시 발생할 수 있는 오류에 대비하기 위해 전송되는 데이터의 양을 조절하는 흐름제어 기능이 있다. 송신 측이 빠르면, 수신 측 버퍼가 넘치는 오버플로우 문제가 발생한다. 이 문제를 줄이기 위해 윈도우 크기로 송신 측 데이터 전송량을 조절한다.
해결방법 1) Stop and Wait: 상대방에게 데이터를 보낸 후 응답 신호를 받고서 다음 패킷을 보내는 방법
해결방법 2) Sliding Window: 송신 측이 수신 측에서 받은 윈도우 크기를 참고해서 데이터 흐름을 제어하는 방법
* 윈도우 크기란 처리할 수 있는 데이터의 양을 의미한다.
수신 측(sender)이 한 번에 처리할 수 있는 윈도우 크기만큼의 데이터를 3 way-handshake할 때 송신 측(receiver)에 전달한다.
- 상대방에게 응답을 받지 않아도 범위 내에서 데이터를 보낼 수 있다.
- 패킷의 왕복시간(RTT)이 크면 네트워크가 혼잡하다고 간주되므로 윈도우 크기를 실제 버퍼 크기보다 작게 설정해야 한다.
- 통신 과정 중에도 윈도우 크기는 유동적으로 설정된다.
1) 최초 윈도우 사이즈를 7로 설정
2) 송신자(sender)는 수신자(receiver)의 응답(ACK)을 받기 전까지 데이터 전송
3) 수신자는 응답을 송신자에게 보내면, 슬라이딩 윈도우 사이즈를 충족할 수 있도록 옆으로 윈도우 이동
4) 데이터를 모두 전송할 때까지 위 과정 반복
2. 오류제어
TCP는 통신 중에 오류가 발생하면 해당 데이터를 재전송하는데 이때 재전송 기반 오류 제어인 ARQ(Automatic Repeat Request)를 사용한다. 재전송은 비효율적이기 때문에 적을수록 좋다.
오류를 알 수 있는 방법
- 송신 측이 보낸 데이터가 유실되거나 수신 측이 보낸 ACK 데이터가 유실되어 송신 측이 ACK를 받지 못한 경우
- 중복된 ACK를 받은 경우
- 수신 측이 NACK(부정 응답)를 보낸 경우
해결방법1) Stop and Wait: ACK를 받고 나서 다음 데이터를 보내는 방식이다.
일정 시간이 지나 시간초과가 발생하면 이전 데이터를 재전송한다.
흐름 제어에서의 슬라이딩 윈도우를 사용하지 못하므로 효율적인 ARQ가 필요하다.
해결방법2) Go Back N: 연속으로 데이터를 보내다가 오류 발생 지점부터 데이터를 재전송하는 방식이다.
오류가 발생한 시점 이후의 데이터는 모두 삭제하고 재전송하는데 성공했던 데이터까지 재전송하므로 비효율적이다.
해결방법3) Selective Repeat: 오류가 발생한 데이터만 재전송하는 방식이다.
때문에 수신 측 버퍼의 데이터가 순차적이지 않아 정렬의 과정과 별도의 버퍼가 필요하다.
3. 혼잡제어
네트워크 내에 패킷의 수가 과도하게 증가하는 현상을 혼잡이라 하는데, 혼잡 제어는 이러한 혼잡 현상을 방지하고 제거하기 위한 기능이다.
흐름제어는 송신 측과 수신 측의 전송 속도를, 혼잡제어는 라우터를 포함한 넓은 범위의 전송 문제를 다룬다.
해결방법1) AIMD (Addictive Increase / Multiplicative Decrease)
- 처음에 패킷을 하나씩 보내다가 문제가 발생하지 않으면 윈도우 사이즈를 1씩 증가하는 방법이다.
- 반면, 패킷 전송에 실패하거나 타임아웃이 발생하면 전송 속도를 절반으로 줄인다.
- 처음에 전송 속도를 올리는 데 시간이 오래걸리고, 네트워크의 혼잡 상황을 미리 감지하지 못해 사전대처가 안된다.
해결방법2) Slow Start (느린 시작)
- ACK를 받을 때마다 각 ACK 패킷마다 윈도우 사이즈를 1씩 증가시키고 전송 속도는 지수 함수 꼴로 증가시킨다.
- 혼잡이 감지될 시 윈도우 사이즈를 1로 줄인다.
- 한번 혼잡 현상이 발생하면 네트워크 수용량을 예측할 수 있다. 그래서 혼잡 현상이 발생하는 윈도우 사이즈의 절반까지 지수 함수 꼴로 증가시키다가 그 후에는 1씩 증가시킨다.
해결방법3) Fast Retransmit (빠른 전송)
- 수신자 측에서 먼저 도착해야 할 패킷이 아닌 다음 패킷을 받아도 ACK 패킷을 보낸다.
- 지금까지 받은 데이터 중 연속되는 패킷의 마지막 순번 이후를 ACK 패킷에 실어 보낸다.
- 중복된 순번의 패킷을 3개 받으면 데이터를 재전송하고, 이 상황을 혼잡하다고 판단하여 윈도우 사이즈를 줄인다.
해결방법4) Fast Recovery (빠른 회복)
- 혼잡 상황이면 윈도우 사이즈를 반으로 줄이고, 선형 증가시킨다.
- 한번 혼잡 상황 발생 후엔 AIMD 방식으로 동작한다.
출처
https://gyoogle.dev/blog/computer-science/network/%ED%9D%90%EB%A6%84%EC%A0%9C%EC%96%B4%20&%20%ED%98%BC%EC%9E%A1%EC%A0%9C%EC%96%B4.html
https://sleepyeyes.tistory.com/4
https://velog.io/@thdgorhkd97/TCP%EC%9D%98-%EB%8C%80%ED%91%9C%EC%A0%81%EC%9D%B8-3%EA%B0%80%EC%A7%80-%EC%A0%9C%EC%96%B4%EB%B0%A9%EB%B2%95-cjup7jqt
https://benlee73.tistory.com/186
'CS study' 카테고리의 다른 글
6. 데이터베이스의 반정규화 (0) | 2022.08.02 |
---|---|
5. 문맥 교환(Context Switching)이란? (0) | 2022.08.02 |
3. 커널(kernel)이란? (0) | 2022.08.01 |
2. 패킷교환방식과 회선교환방식 (0) | 2022.07.28 |
1. 멀티스레딩(Multi-Threading)이란? (0) | 2022.07.26 |
댓글