CS지식/네트워크

TIL 정리_110(TCP)

ran4 2022. 6. 18. 23:33

https://www.youtube.com/watch?v=K9L9YZhEjC0

해당 강의를 듣고 정리한 내용입니다 

 

 

TCP

서버 프로그램이 작동 중인 서버의 상황 : 

소켓이 열려있어 클라이언트와 연결되어있다

소켓의 본질은 파일이고, 서버는 프로세스라고 할 때, read/write가 가능하다

 

소켓 통신의 경우 read/write의 상황에서 읽는 것을 Receive라고 하고

쓰기는 Send라고 한다

-> RWX

 

하드 디스크 안에 파일이 들어있다고 가정할 때

파일에는 파일시스템이 있고

하드 디스크에는 드라이버가 있다

 

서버를 어떤 언어로 개발하든 메모리를 할당한다

파일의 크기가 1.4MB의 큰 크기인 경우 메모리의 크기를 개발자가 결정해야한다

파일에서 데이터를 읽어올 때 끊어서 읽고 메모리에 올린다

 

**소켓은 TCP/IP를 추상화 한 것

소켓이 맞닿은 지점에서 분해가 일어난다

 

 

분해(중요)

분해가 나는 TCP의 지점에서도 버퍼가 있다

버퍼 == 메모리

메모리의 버퍼를 1이라고 하고 TCP의 버퍼를 2라고 할 때

1 -> 2로 버퍼의 복사가 발생한다

버퍼에서 읽어와서 또 다른 버퍼로 넘어가는 입출력을 Buffered I/O라고 한다

이 상황은 반드시 이것이 일어나는 것은 아니지만, 대부분일어난다

 

TCP가 이 버퍼를 가지고 있다가 IP쪽으로 내려가면 이 버퍼를 잘게 쪼갠다

쪼개진 버퍼를 Segment -> 세그먼트라고 한다

 

 

위 내용의 예시

4mb 짜리 직쏘퍼즐이 있다고 가정할 때,

조각 당 64kb로 나눈다고 했을 때 나눠진 퍼즐 4개가 버퍼1에 쌓인다

똑같이 생긴 퍼즐 4개가 버퍼 2에 복사된다

이 퍼즐이 세그먼트로 넘어가면서 1개씩 쪼개질 때 퍼즐 1개당 번호가 붙는다

**실제로는 순차적으로 넘버링 되지 않는다

 

 

Packet 패킷

네트워크를 통해 전송되는 데이터의 작은 조각을 말한다 

위에서 설명한 쪼개져서 번호가 부여된 버퍼의 모임인 세그먼트가 패킷에 담긴다

일종의 택배박스와 비슷한 개념이다

 

택배박스(데이터)는 혼자 옮겨질 수 없다

-> 옮겨줄 무언가가 필요하다

 

Frame 

택배박스가 들어간 트럭이 Frame 프레임이다

=> 데이터를 움직이는 컨테이너를 의미한다

 

택배가 전달되는 동안 택배는 트럭을 갈아탄다

-> 패킷은 논리적으로는 끝에서 끝으로 가지만 프레임으로 옮겨질때는 여러번에 걸쳐 이동한다

 

 

네트워크에서 패킷의 정보가 도착할 때 PC쪽에서 무엇이 일어나는가?

 

PC 구조 (간략화) 

Client
Process
(Socket == File)
--File I/O buffer
TCP 
 TCP buffer
IP
Driver
NIC(Network Interface Card)

 

패킷이 도착하면 프레임을 타고 PC의 위쪽 계층으로 올라간다

이때, 프레임은 사라진다 (컨테이너의 소멸)

프레임이 사라지고 1번 세그먼트가 나오게 된다

세그먼트는 TCP Buffer로 이동한다

 

세그먼트가 대략 2개정도 오는 경우, PCTCP가 조립을 하고

서버에 받았음을 알리며 다음에 도착해야 할 번호(= ACK 3)를 알려준다

-> **wait**상태로 ACK 3을 기다린다

-> 속도가 느려진다(지연된다)

-> TCPUDP보다 느린 이유이다 기다리느라 지연이 걸리며 늦어진다

//다른 이유도 있지만 이것이 핵심 이유이다

 

 

**Window Size**

TCP Buffer의 크기를 Window Size라고 한다

수신측에서(받는쪽 XX) 세그먼트가 오면 조립해서 집어넣을 수 있는 공간이다

윈도우 사이즈는 정해져 있다 

ACKWindow Size를 포함하고 있다

-> ACK를 보낼때 주의해야 한다 만약 ACK 3을 요청할 때 여유 공간이 없다면 수신측에서 전송하지 않는다

 

수신측의 Window Size > MSS 일 때 전송하지 않는다

-> Wait가 걸린다 -> 지연된다

 

Read 속도 > Network 수신속도

이 속도가 느리면 TCP 버퍼의 여유 공간이 작아져 window size가 작아진다

-> 여유 공간이 없어서 전송이 안되고, wait가 발생한다

 

 

처리지연에 의한 문제 

프로그램을 잘못 개발해서 읽어들이는 속도가 느리게 된다면 여러 이유가 있겠지만

원인을 우선적으로 네트워크가 아닌 프로그램에서 찾아야 한다 

TCP 버퍼에서 I/O 버퍼를 끄집어 올려서 Read 속도를 늘려야 한다

이를 처리지연에 의한 문제라고 한다

 

 

정리

TCP/IP에서는 송신보다 수신쪽에서 오류가 나는 경우가 많다 

수신이 느린 이유는 송신이 느리기 때문일 수 있음을 구분해야 하고 

서버가 느린 것이 아니라 받을 준비가 되지 않아서(공간) 오류가 날 수 있음을 알아야 문제를 해결할 수 있다