공부를 하다가 TCP/IP 송수신 원리를 너무나 잘 설명해준 자료가 있어서 작성한다.
서버에서 벌어지는일

그림을 설명하자면 HDD (2차메모리) 에 있는 파일을 클라이언트한테 보낸다고 가정할때,
파일의 크기가 1.4mb 버퍼의 크기가 64 kb 라고가정하는 그림이다.
그림에서 처럼 HDD 드라이버 -> 커널 파일시스템 -> 유저스페이스 버퍼 흐름으로 데이터를 보내고
TCP 에서 유저스페이스 버퍼에 있는 자료를 TCP 버퍼로 복붙해온다 (Buffered I/O) 그리고 거기서 분해가 일어난다.
버퍼에서 하나하나 조각낸 것을 세그먼트라고 부르는데 이 일은 IP 에서 일어난다. 이후 NIC 드라이버를 만나
패킷안에 세그먼트 한두조각을 넣고 프레임이라는 택배기사가 클라이언트에게 가져간다.
(물론 이 프레임이란것은 생겼다 사라지고 생겼다 사라지고 엔드포인트를 만날떄마다 프레임이 교체가일어남)

클라이언트에서 벌어지는일

프레임이 클라이언트에 어찌저찌 도착했다.
그럼 클라이언트의 NIC 에 도착하고 Driver 를 따라 IP 에선 프레임이 사라진다. 이후 패킷이나오고
TCP 에선 패킷을 열어 세그먼트를 확인한다. 그렇게 TCP 버퍼에 하나하나 쌓이게 되는데
TCP 버퍼에 약 두개정도의 세그먼트가 쌓이면 이제 서버에게 "잘받았다" 라고 ACK #3을 보낸다 <- 이게 그 ACK 다.
여기서 중요한점! 서버는 패킷을 두개정도 보내고 기다린다. (WAIT) ACK #3 을 받을때 까지.
이것때문에 속도지연이 일어나고 UDP 보다 느린것이다.
여기서 또 하나마지막으로 중요한점.
(계속 중요함...)

클라이언트쪽 TCP 버퍼크기를 Window Size 를 ACK#3 에 넣어서 보낸다.
그럼 서버측에서 ACK#3 을 받고 확인할텐데, 다음에 보낼 세그먼트의 크기가 Window size 에 남은 크기보다 크면?
Wait 이 걸린다. <- 이것때문에 서버의 버퍼링, 즉 늦어지는 현상이 벌어질 수 있다.
한마디로 클라이언트측 어플리케이션에선 OS 가 전달해준 데이터를 TCP 버퍼에서 유저스페이스 버퍼로 데이터를 계속해서 퍼올리는 일을 해야하는데, 클라이언트측 어플리케이션이 느리다면 서버가 아무리 빨라도 지연이 걸릴수 밖에없다는 뜻이다.
그래서 서버 지연현상은 항상 서버측 문제만은 아닐수도 있다!
'개인공부 > 네트워크' 카테고리의 다른 글
| XDR (1) | 2025.04.30 |
|---|---|
| 바이너리 전송 방식 vs 텍스트 전송 방식 (0) | 2025.04.30 |
| epoll 의 EAGAIN (0) | 2025.01.23 |
| epoll 의 Edge-Triggered 방식 (0) | 2025.01.23 |
| epoll vs 멀티스레딩 (0) | 2025.01.23 |