client와 server가 internet을 통해 연결이 되어있고, server에서 client로 파일을 송신하는 상황을 가정한 상태에서 진행되는 과정임.
1. server 상황
web server 등의 server 프로그램이 실행되고 있고 socket이 열려 있어 client와 통신하고 있음
server 프로그램은 process고 socket은 file이다.
process가 file에게 내릴 수 있는 명령 : Read, Write, Execute으로 총 3가지지만 socket 통신에서는 실행 개념이 없기 때문에 여기서는 RW만 있음
(socket 통신에서의 Read/Write : Read -> Receive / Write -> Send)
server process를 개발할 때 보통 자체 memory를 할당한다. 그리고 서버의 storage에 저장되어 있는 file을 process 자체 memory 크기만큼 끊어서 가져옴. 이때 process는 user layer에 있음(process의 memory도 user layer에 위치)
server process에서 socket을 통해 가져온 파일이 kernel layer의 TCP/IP에서 분해가 이루어진다. 여기에도 자체 memory(buffer)가 있음
process 자체 memory에 있던 내용을 TCP memory로 copy함 -> 이 방식을 bufferd I/O라고 부름
그리고 IP 쪽으로 내려갈 때 copy한 것들을 잘게 분해한다. -> 그것들을 segment라고 부름, 그리고 segment들에 번호를 할당함
segment를 포함한게 통신 시 전달되는 packet이고, packet이 전달되는 수단이 frame임
frame은 최종 목적지에 도착할 때 까지 사라졌다 생겼다를 반복함
* server는 segment를 마구마구 계속 보내는게 아니라 약 2개정도 보내고 client에서 날리는 ACK를 기다림. 그리고 ACK가 오면 그때 ACK번호와 동일한 segment를 다시 보낸다. --> 여기서 속도 지연이 발생하는 이유(UDP보다 느린 이유)
2. client 상황
client의 NIC에 frame이 도착함
client도 server와 마찬가지로 TCP/IP가 있고 client process의 socket을 통해 통신하고 있음, 역시 TCP도 buffer가 있음(TCP buffer, 그리고 이 TCP buffer의 크기를 window size라고 부름 / 수신측에서 segment를 조립할 수 있는 공간)
이 socket에도 역시 memory가 있음(File I/O Buffer)
IP를 만나기 전까지 frame었던 것이 IP를 만나면 decapsulation 과정을 거쳐 packet -> segment로 변경됨
segment로 변경된 데이터는 TCP buffer에 적재됨
그리고 client의 TCP는 segment를 약 2개정도 받으면 server에게 잘 수신했다고 알려준다. -> 이게 ACK임. 그리고 여기서의 ACK번호는 다음에 받아야 할 segment 번호와 동일함
여기서 전송되는 ACK 안에 windows size가 포함되어 있음. server에서는 client에서 날라온 ACK 안의 window size를 보고 추가적으로 segment를 보낼지 말지 판단함.
만약 수신측의 windows size가 전송될 segment 사이즈보다 크면 보내고, 만약에 작으면 보내지 않고 wait가 걸림 --> 속도가 지연되는 이유
* client의 TCP buffer에 있는 것을 File I/O Buffer로 빨리 옮기지 않으면 속도 지연이 발생하는 것임, 서버 잘못이 아니다~
-> 이 속도가 client process의 receive 속도고 이게 network의 수신 속도보다 무조건 빨라야 지연이 발생하지 않는다. 느려지면 window size에 여유가 줄어들고 결국 여유공간이 사라져서 server에서는 송신을 멈추고 wait가 걸린다.
그래서 window size의 여유공간이 점점 줄어드는 문제를 확인하면 network 환경에서 문제점을 찾지 말고 client process의 socket이 이상하게 개발된 것임
client process의 socket은 무조건 TCP buffer에 있는 segment를 File I/O Buffer로 끌어올리는게 가장 먼저 수행되어야 할 작업임
먼저 옮기고 처리하는 과정이 중요함~
이해하면 인생이 바뀌는 TCP 송/수신 원리 - YouTube
'네트워크' 카테고리의 다른 글
Inline 구조와 Out of path 구조 (0) | 2022.06.13 |
---|---|
TCP/IP socket (0) | 2022.06.13 |
Proxy의 정의와 활용 (1) | 2022.06.09 |
통신 방식(유니, 멀티, 브로드, 애니) (0) | 2022.02.15 |
상위 프로토콜 지시자 (0) | 2022.02.10 |
댓글