파리에서 에펠탑을 택배로 보내려면 어떻게 해야 할까, 먼저 에펠탑을 분해하여 크기를 줄이고, 상자에 담아야 할 것이다. 그리고 이를 운송한 후 조립해야 한다. 이를 네트워크에 비유하자면 조립은 수신 측에서, 분해는 수신 측에서 할 것이다. 그리고 상자는 패킷으로 비유해 볼 수 있다.
이를 바탕으로 네트워크 통신 구조를 그려보면 아래 그림과 같다.
서버측에 있는 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라 한다.
- 송수신 속도가 어플리케이션 속도보다 빠른 경우 수신할 방법이 없어진다.
- 이는 어플리케이션에서 원인을 찾아야 한다.
'네트워크' 카테고리의 다른 글
서브넷 마스크와 CIDR (2) | 2024.10.16 |
---|---|
IPv4 Header 형식 (1) | 2024.10.14 |
계층별 데이터 단위 (0) | 2024.10.10 |
패킷의 생성, 전달, 소멸 과정 (1) | 2024.10.10 |
인캡슐레이션(Encapsulation)과 디캡슐레이션(Decapsulation) (0) | 2024.10.10 |