
흐름 제어, 혼잡 제어, 재전송 제어를 조합해가며 전송unreliable network의 4가지 문제
1. 손실 : packet 손실되는 문제
2. 순서 바뀜 : packet의 순서 바뀌는 문제
3. congestion : 네트워크 혼잡
4. overload : 수신측(receiver)이 overload되는 문제
매번 전송한 패킷에 대한 확인(ACK) 응답을 받으면 다음 패킷 전송하는 방법
패킷을 하나씩 보내기 때문에 비효율적

수신측에서 설정한 window 크기만큼 송신측에서 확인 응답(ACK) 없이 세그먼트 전송
데이터 흐름 동적으로 조절
window에 포함되는 모든 패킷 전송 ⇒ 패킷 전달 확인 응답(ACK) 받음 ⇒ window 옆으로 이동 후 해당하는 패킷들 전송
window
TCP/IP 사용하는 호스트는 송신 window와 수신 window 갖고 있음
3-way handshaking 후 수신특의 receive window size에 송신측이 자신의 send window size 맞춤

송신측은 일정 시간동안 수신축으로부터 확인 응답(ACK)을 받지 못하면 패킷을 재전송함
송신측이 재전송했는데 페킷이 소실된 경우가 아니라면 수신측 버퍼에 남는 공간이 없어 문제 발생
이를 해결하기 위해 송신측은 ACK와 window size(남은 buffer size)를 보냄

처음에 패킷을 하나씩 보내다가 문제가 없으면 각각의 ACK 패킷마다 window 크기를 1씩 증가시키며 전송
전송속도는 지수 함수 꼴로 증가
미리 정해진 임계값에 도달할 때까지 윈도우 크기 2배씩 증가
혼잡 회피 단계로 넘어감혼잡 현상 발생하면 window size 1로 떨어뜨림
처음에는 네트워크 수용량 예상할 수 없지만 한 번 혼잡 현상이 발생하면 네트워크 수용량 어느정도 예상할 수 있음

참고
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