눈송이의 개발생활
[Network]TCP/IP 흐름제어(Flow Control)와 혼잡제어(Congestion Control) 본문
TCP
- TCP 3-way handshake가 완료되면 데이터 교환 시작
- 데이터 전송의 신뢰성을 확보하기 위해 흐름 제어, 혼잡 제어, 재전송 제어를 조합해가며 전송
unreliable network의 4가지 문제
- 손실 : packet 손실되는 문제
- 순서 바뀜 : packet의 순서 바뀌는 문제
- congestion : 네트워크 혼잡
- overload : 수신측(receiver)이 overload되는 문제
흐름 제어(Flow Control)
- 수신측(receiver) 단말이 수행하는 흐름(데이터 전달 속도) 양 조정
- 송신측(sender)이 수신측(receiver)보다 속도가 빠른 경우 문제가 발생
- 수신특에서 제한한 저장 용량을 초과한 이후 도착하는 데이터는 손실될 수 있음
- 위험을 줄이기 위해 수신측에 맞춰 송신 측의 데이터 전송량을 조절해야 함
Stop and Wait
1️⃣- 매번 전송한 패킷에 대한 확인(ACK) 응답을 받으면 다음 패킷 전송하는 방법
- 패킷을 하나씩 보내기 때문에 비효율적
Sliding Window
2️⃣- 수신측에서 설정한 window 크기만큼 송신측에서 확인 응답(ACK) 없이 세그먼트 전송
- 데이터 흐름 동적으로 조절
- window에 포함되는 모든 패킷 전송 ⇒ 패킷 전달 확인 응답(ACK) 받음 ⇒ window 옆으로 이동 후 해당하는 패킷들 전송
- window
- TCP/IP 사용하는 호스트는 송신 window와 수신 window 갖고 있음
- 3-way handshaking 후 수신특의 receive window size에 송신측이 자신의 send window size 맞춤
재전송
3️⃣- 송신측은 일정 시간동안 수신축으로부터 확인 응답(ACK)을 받지 못하면 패킷을 재전송함
- 송신측이 재전송했는데 페킷이 소실된 경우가 아니라면 수신측 버퍼에 남는 공간이 없어 문제 발생
- 이를 해결하기 위해 송신측은 ACK와 window size(남은 buffer size)를 보냄
혼잡 제어(Congestion Control)
- 송신측(sender) 단말이 수행하는 흐름(데이터 처리 속도) 양 조절
- 네트워크의 혼잡을 제어하기 위해 송신측에서 보내는 데이터의 전송 속도 강제로 줄이는 것
- 혼잡 : 네트워크 내 패킷 수가 과하게 증하는 현상
- 혼잡제어 : 혼잡 현상 방지하거나 제거하는 것
AIMD(Additive Increase / Multiplicative Decrease)
1️⃣- 처음에 패킷을 하나씩 보내다가 문제가 없으면 window 크기를 1씩 증가시키며 전송
- 패킷 전송에 실패하거나 일정 시간을 넘으면 패킷 보내는 속도를 절반으로 줄임
- 공평한 방식
- 한 네트워크를 여러명이 사용할 경우, 처음에는 나중에 진입한 사람이 불리하지만 시간이 지날수록 평형상태로 수렴
- 문제
- 초기에 높은 대역폭을 사용하지 못해서 시간 오래 걸림
- 네트워크 혼잡해지는 상황 미리 감지 ❌
- 네트워크가 혼잡해지고 나서야 대역폭 줄임
Slow Start
2️⃣- 처음에 패킷을 하나씩 보내다가 문제가 없으면 각각의 ACK 패킷마다 window 크기를 1씩 증가시키며 전송
- 한 주기 지나면 window size는 2배
- 전송속도는 지수 함수 꼴로 증가
- 미리 정해진 임계값에 도달할 때까지 윈도우 크기 2배씩 증가
- 전송되는 데이터의 크기가 임계값에 도달하면 혼잡 회피 단계로 넘어감
- 혼잡 현상 발생하면 window size 1로 떨어뜨림
- 처음에는 네트워크 수용량 예상할 수 없지만 한 번 혼잡 현상이 발생하면 네트워크 수용량 어느정도 예상할 수 있음
- 혼잡 현상이 발생하였던 window size의 절반까지는 이전처럼 지수 함수 꼴로 창 크기를 증가시키고 그 이후부터는 완만하게 1씩 증가
Congestion Avoidance (혼잡 회피)
- 윈도우의 크기 임계값에 도달하면 데이터 손실이 발생할 확률 증가
- 이를 회피하기 위해 윈도우 크기 선형적으로 1씩 증가시키는 방법
- 수신측으로부터 일정 시간 ACK를 수신하지 못하는 경우 혼잡 상태로 인식 ⇒ 윈도우 크기 1로 감소 ⇒ 임계값을 패킷 손실이 발생했을 때의 윈도의 크기의 절반으로 줄임
Fast Retransmit
- 먼저 도착해야할 패킷은 오지 않고 그 다음 패킷이 도착한 경우에도 ACK 패킷을 송신측에 보냄
- 순서대로 잘 도착한 마지막 패킷의 다음 패킷의 순번을 ACK 패킷에 실어서 보냄
- 중간에 하나가 손실되게 되면 송신 측에서는 순번이 중복된 ACK 패킷을 받게 됨
- 이것을 감지하는 순간 문제가 되는 순번의 패킷을 재전송
- 중복된 순번의 패킷을 3개 받으면 재전송
- 약간 혼잡한 상황이 일어난 것이므로 혼잡을 감지하고 window size를 줄임
Fast Recovery
- 혼잡한 상태가 되면 window size를 반으로 줄이고 1씩 선형증가 시키는 방법
- 혼잡상황을 한 번 겪고 나서부터는 순수한 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://steady-coding.tistory.com/507
https://github.com/WooVictory/Ready-For-Tech-Interview/blob/master/Network/TCP.md
'Computer Science > Network' 카테고리의 다른 글
[Network]HTTP/1.1 HTTP/2.0 HTTP/3.0 (0) | 2023.02.07 |
---|---|
[Network]HTTP와 HTTPS (0) | 2023.02.07 |
[Network]TCP와 UDP (0) | 2023.02.03 |
[Network]TCP 3-way Handshake & 4-way Handshake (0) | 2023.02.03 |
[Network]REST API (0) | 2023.02.03 |
Comments