그림은 Server에서 client에게 파일을 전송하는 과정이다.
파일이 1.4MB이면, 메모리의 크기는 개발자가 정하는데, 여기선 64KB라고 가정한다. 64KB로 끊어서 파일을 다운받게 된다.
BUFFER1번에서 2번 버퍼로 복사가 일어난다.
PACKET은 택배박스라고 비유해서 이해하면 쉽다. SEGMENT들이 택배박스에 담기고 택배원들이 택배 박스를 이동시킬텐데 그때 상태는 L2 계층이 될 것이다. 그땐 FRAME이라고 한다. 아무튼 FRAME을 택배원들이 배달을 한다.
TCP쪽 버퍼에 서버에서 보낸 SEGMENT들이 도착을 하게 되어 저장이 된다. 그때 클라이언트는 잘 받았다는 신호를 보낸다 그게 ACK이다. SEQUENCE NUMBER를 포함해서 보내 다음에 보낼 SEGMENT를 알려줌과 동시에 잘 도착했는지를 확인할 수 있게 된다.
이 버퍼의 사이즈를 WINDOW SIZE라고 부르는데, 서버가 다음 데이터를 보낼 때, WINDOW SIZE가 꽉 차버렸다면 서버는 데이터를 더 보내지 않는다고 한다. 이 부분이 굉장히 중요하다고 강조를 하심.
수신측의 WINDOW SIZE가 MSS보다 큰지를 확인한다. 만약 no 라면 wait가 걸린다. 느리다는 거에 대해 한 에러를 이해할 수 있게 됨. tcp buffer에서 빠르게 file i/o buffer에 옮겨야하는데 그 속도가 느리다면 tcp buffer에 segment들이 계속 차오르게 된다. 그렇게 되면 서버는 전송을 wait하게 되는 거고 client는 속도를 느리다고 느끼게 되는 것이다. 이 문제의 원인은 서버가 느린게 아니고 buffer 간 옮기는 속도가 느린게 원인인 것이다. 즉 프로그램의 문제인 것이다.