TCP 의 수신측에서 수용할 수 있는 버퍼의 용량을 알려주어 overflow를 막는 것
Receive window를 sender에게 알려주는 것
Sender는 tcp header에 receive window 필드를 확인하고 overflow가 일어나지 않을 만큼의 데이터를 전송한다.
만약 A와 B가 TCP 통신을 하고 있고, A에서는 더이상 보낼 데이터가 없고 마지막으로 B로부터 왔었던 패킷에 rwnd = 0 을 보낸 상황이라면 dead lock이 발생한다.
🔎 왜 dead lock이 발생할까?
-> B의 입장 : A로부터 rwnd=0 이라는 응답을 받은 상태이기 때문에 overflow를 방지하기 위해 패킷을 보낼수 없는 상황
-> A의 입장 : B로 보낼 데이터가 없고, 이미 rwnd = 0 을 보낸상황에서 패킷을 수신할 수 없기 때문에 rwnd 가 변하더라도 알려줄 방법이 없는 상황
🔥 dead lock 해결방안
rwnd = 0 의 응답을 받게 되면, 주기적으로 1byte 크기의 probe packet을 전송해서 rwnd 가 달라지는지 확인한다.
실제로는 40 byte (header) + 1 byte (data) 크기의 패킷
Sender에서 데이터를 1byte 씩 보내거나 Receiver에서 데이터를 1byte씩 매우 늦게 받는 경우,
1 바이트의 데이터를 처리하기 위해 Overhead가 발생하고 (IP 20byte, TCP 40byte) 이러한 비효율적인 네트워크 자원의 낭비를 Silly Window Syndrome 이라고 한다.
-> Nagle의 알고리즘
큰 사이즈 의 세그먼트를 한번에 보냄으로 비효율적인 오버헤드를 방지한다.
-> Clark's solution
한번에 수신 버퍼의 절반이상의 MSS를 받을 수 있도록 한다.
-> Delayed ACK
수신 버퍼의 공간을 충분히 확보 할때까지 ACK를 늦게 보내는 방식