네트워크

TCP/IP 송수신 구조

개발정리 2024. 10. 12. 09:56

 

파리에서 에펠탑을 택배로 보내려면 어떻게 해야 할까, 먼저 에펠탑을 분해하여 크기를 줄이고, 상자에 담아야 할 것이다. 그리고 이를 운송한 후 조립해야 한다. 이를 네트워크에 비유하자면 조립은 수신 측에서, 분해는 수신 측에서 할 것이다. 그리고 상자는 패킷으로 비유해 볼 수 있다.

 

 

이를 바탕으로 네트워크 통신 구조를 그려보면 아래 그림과 같다. 

 

 

 

서버측에 있는 1.4 MB 크기의 파일을 다운로드 받는다고 가정해보자.

 

 

TCP/IP 형식이기 때문에 서버와 클라이언트 간 연결(TCP)이 이루어진 다음 송수신(IP)이 이루어진다. 이 때 인터넷 구간에서는 패킷 단위로 전송되며 보통 패킷의 MTU는 1.4KB이다. 

 

 

위 예시에서 다운로드 받는 파일의 크기 (1.4 MB)는 패킷의 MTU (1.4KB)보다 약 1000배 이상 크다. 이는 1000개 이상의 패킷으로 수신자에게 파일이 나뉘어 전달된다는 의미이다. 

 

 

TCP/IP 네트워크 통신의 큰 그림은 위와 같다. 

 

 

...

 

 

TCP 연결이 되었다는 가정하에 송수신이 구체적으로 어떻게 일어나는지 디테일하게 살펴보자. 

 

 

 

송신측을 살펴보기

 

#1

프로세스 단에도 버퍼가 있다. 해당 버퍼에도 HDD 혹은 SSD에 있는 파일을 읽어야 한다. 파일은 Stream 형식으로 Copy되며, 버퍼의 크기는 개발자가 정할 수 있다.

 

#2

소켓 I/O 단에도 버퍼가 있다. 프로세스 버퍼에 Copy 된 데이터를 소켓 버퍼에다가도 Copy 한다. 이 때는 Copy라는 표현보다는 Send라는 표현이 적합하다. 네트워크 I/O는 Send/Receive로 표현한다. 해당 영역은 서버이기에 Send라 지칭할 수 있다.

 

#3

User mode에서 Kernel mode로 넘어갈 때, 즉 TCP로 넘어갈 때 Segmentation(분해)가 일어난다. Segment MSS (세그먼트 최대 크기)를 맞추기 위해서이다. 

 

분해된 세그먼트는 번호가 붙고 L3 IP단으로 내려간다. 

 

L3 IP에서는 세그먼트를 패킷 형태로 만든다. 위 그림은 택배 상자(=패킷)에 내용물(=세그먼트)를 넣어서 표현했다. 실제는 패킷 바디에 세그먼트가 들어가고, 패킷 헤더에는 출발지와 도착지 정보가 들어갈 것이다. 

 

여기까지가 패킷까지 만들어지는 과정이다. 이를 Encapsulation이라 명명한다.

 

#4 

L2 영역에서는 프레임을 택배 차량으로 비유할 수 있다. 목적지까지 택배 차량은 택배 상자(=패킷)을 실고 달린다. 그 과정에서 택배 차량은 계속해서 바뀔 수 있다. 

 

즉, 패킷은 유지되지만 프레임은 계속해서 바뀐다.

 

 

...

 

 

그렇다면 수신측에서는?

 

#5, #6, #7

L2에서 프레임이, L3 IP에선 패킷이 사라지며 L4 TCP에서는 세그먼트가 user mode의 소켓 버퍼에 채워진다. 이 때 소켓 I/O 버퍼에는 여유 공간이 있어야 한다.

 

#8

프로세스 버프는 소켓 I/O 버퍼로 부터 세그먼트를 옮겨놓아야 한다. 이를 Receive (=Copy)라 한다. 

 

 

Receive 시 프로세스 버퍼 크기만큼 시도하는데, 중요한 것은 속도차이 이다. 네트워크에서는 I/O 버퍼는 채움이 일어나고, 프로세스 버퍼에서는 비움이 일어난다. 이렇게 하여 I/O 버퍼에 여유 공간을 지속적으로 만든다.

 

 

#9

송신측에서 1번 패킷을 보낸 후 2번, 3번 패킷을 연속으로 보낸다. 수신측 I/O 버퍼엔 여유가 줄어들 것이다. TCP는 연결지향이다 보니 '잘 받았다'는 피드백을 주어야 한다.

 

이 때 피드백을 ACK라 한다.

 

수신 측은 패킷 1번까지 받았다면 ACK 2를 보낸다. 송신 측은 1번까지 보낸 후 waiting을 걸고 ACK 2가 오길 기다린다. ACK 2가 정상적으로 오면 2번 패킷을 보낸다. 

 

 

문제점

수신 측 프로세스가 크롬이라 가정했을 때, 크롬이 빠르게 I/O 버퍼를 비워줘야 한다. ACK에 포함되는 내용 중 하나가 '여유 공간 크기'이다. ex) ACK 2 + 여유공간 크기

 

TCP는 수신측의 여유공간 여부를 따진다. 

 

 

...

 

 

TCP 네트워크에서 발생할 수 있는 장애

 

 

1) Loss (유실) 

- 네트워크 단 (H/W) 이슈이다. 

- 어디서 유실이 되었는지 모른다. 물류 창고를 뒤져봐야 한다.

 

2) Retransmission

- 네트워크 단 이슈 혹은 End-Point간의 합이 안맞는 경우

- 송신 측에서 ACK가 오지 않아 다시 한번 여부를 물음.

- 수신 측은 이미 ACK를 보냄. 

- 이에 송신 측에서 다시 한번 패킷을 보내게 된다.

- 이를 Ack Duplicated 즉 보낸 것을 또 보내게되어 이슈로 이어진다.

 

3) Out of Order 

- 네트워크 단 이슈

- 패킷의 순서가 잘못된 경우 

- 순서가 잘못된 경우 L4 TCP 단에서 보정이 된다.

 

4) Zero Window 

- 거의 높은 확률로 End-point 어플리케이션 이슈

- 어플리케이션이 데이터를 빠르게 I/O 버퍼를 비워주지 않아 발생하는 이슈

- CPU 점유율이 100 등의 이유가 있다. 

- 수신측 I/O 버퍼의 여유 공간을 window size라 하는데,

- 어플리케이션이 여유 공간을 못 비우고 full이 되는 상태를 zero window라 한다.

- 송수신 속도가 어플리케이션 속도보다 빠른 경우 수신할 방법이 없어진다.

- 이는 어플리케이션에서 원인을 찾아야 한다.