패킷 최대 사이즈 MTU 와 관련된 ICMP, TCP의 역할
`DF(Don't Fragment) 비트`가 **0**으로 설정된 상태에서는, **TCP 프로토콜** 자체가 MTU를 줄이는 과정을 직접 수행하지는 않습니다. 대신, **IP 계층**에서 MTU 조정과 관련된 처리가 이루어집니다. 이 과정은 IP 패킷이 네트워크에서 전송되면서 MTU보다 큰 패킷을 처리하는 방식과 관련이 있습니다.
### 1. **MTU와 IP 패킷의 분할**
- **MTU(Maximum Transmission Unit)**는 네트워크 장치나 경로 상에서 **한 번에 전송할 수 있는 최대 데이터 크기**를 의미합니다.
- **TCP**는 세그먼트를 만들어 **IP 계층**으로 전달하고, IP 계층은 이 세그먼트를 네트워크를 통해 전송할 수 있는 **패킷 크기로 나눕니다**. 이때, 패킷의 크기가 **MTU보다 크다면**, IP 계층은 패킷을 분할하여 **프래그먼트(fragment)**로 나눕니다.
### 2. **DF 비트와 분할 동작**
- **DF 비트 = 0**이면, **프래그먼테이션(패킷 분할)이 허용된 상태**입니다. 즉, IP 계층에서 **MTU보다 큰 패킷을 발견했을 때** 네트워크 장치는 패킷을 **자동으로 분할**하여 **MTU보다 작은 크기로 나누어** 전송합니다.
- 패킷이 네트워크를 통해 전송될 때, 경로 중간에 있는 라우터나 네트워크 장치가 MTU보다 큰 패킷을 발견하면, **IP 계층에서 자동으로 패킷을 분할**합니다.
### 3. **TCP와 MTU의 상호작용**
TCP 프로토콜은 **전송 계층**에서 동작하며, IP 계층의 동작에 따라 **MTU를 줄이는 작업을 직접 수행하지 않습니다**. 대신, TCP는 다음과 같은 방식으로 **MTU와 상호작용**합니다:
1. **초기 전송**: TCP는 MSS(Maximum Segment Size)라는 값을 사용하여 **최대 TCP 세그먼트 크기**를 설정합니다. MSS는 보통 **MTU에서 IP 헤더와 TCP 헤더의 크기를 뺀 값**으로 설정됩니다.
- 예: 기본적으로 이더넷의 MTU는 1500바이트이므로, MSS는 1460바이트(1500 - 20(IP 헤더) - 20(TCP 헤더))로 설정될 수 있습니다.
2. **패킷 분할(프래그먼테이션)**: 만약 TCP가 전송한 데이터가 IP 계층에서 설정된 MTU보다 크다면, IP 계층은 이를 **자동으로 분할**합니다. 이때 **DF 비트가 0**이라면, IP 계층은 패킷을 프래그먼트로 나누어 전송하고, **수신 측에서 이 프래그먼트들을 재조립**합니다.
3. **재전송**: 만약 네트워크 장치에서 MTU보다 큰 패킷이 발견되면 **자동으로 분할**하여 전송하지만, 오류가 발생하거나 패킷 손실이 있을 경우, **TCP는 손실된 세그먼트를 재전송**합니다. 이때 TCP는 IP 계층에서 발생한 MTU와 프래그먼트 관련 정보를 인지하지 않고 **세그먼트 단위**로 데이터를 재전송합니다.
### 요약:
- **DF 비트가 0**인 경우, **IP 계층**은 패킷을 **MTU보다 작은 크기로 분할**하여 전송합니다. 이 과정에서 **TCP 프로토콜은 MTU를 줄이거나 조정하는 작업을 직접 수행하지 않습니다**.
- **TCP는 MSS**를 설정하여 한 번에 전송할 수 있는 세그먼트 크기를 결정하지만, 패킷의 **분할과 재조립은 IP 계층**에서 처리됩니다.
- **IP 계층**에서 프래그먼테이션이 일어나면, **MTU보다 큰 패킷**은 자동으로 분할되고, 수신 측에서 재조립됩니다.
따라서, **DF 비트가 0일 때**, MTU보다 큰 패킷은 **IP 계층**에서 **프래그먼트로 나누어져 전송**되며, TCP는 이를 인지하지 않고 **세그먼트 단위**로 전송과 재전송을 계속 수행합니다.
----------------------------------------------------------------------------------------------------------------------------------------------------------------
**DF(Don't Fragment) 비트가 1일 때**의 동작은 조금 다릅니다. **DF 비트가 1**로 설정된 상태에서는 **IP 계층에서 패킷을 분할(프래그먼테이션)할 수 없습니다**. 만약 패킷이 네트워크 경로 중에 있는 장치나 라우터에서 **MTU보다 큰** 패킷으로 판단되면, 해당 패킷은 **전송되지 않고 폐기**됩니다. 이 경우, **ICMP 메시지**를 통해 송신 측에 문제가 발생했음을 알립니다.
### 동작 과정 (DF 비트 = 1):
1. **송신 측에서 패킷 전송**:
- TCP는 데이터를 세그먼트로 나누어 IP 계층에 전달합니다.
- IP 계층에서 패킷을 생성하고 **DF 비트가 1**로 설정된 상태로 전송합니다. 이때, 이 패킷은 **분할될 수 없다는 조건**으로 전송됩니다.
2. **중간 네트워크 장치에서 MTU 확인**:
- 중간에 있는 라우터나 네트워크 장치가 **MTU보다 큰 패킷**을 수신하면, **DF 비트가 1**로 설정되어 있기 때문에 패킷을 **분할하지 못합니다**.
- 패킷이 MTU보다 크기 때문에, 이 패킷은 **폐기됩니다**.
3. **ICMP 메시지 전송**:
- 패킷이 폐기된 후, 중간 네트워크 장치(라우터)는 송신 측으로 **ICMP 메시지**를 보내 패킷이 폐기되었음을 알립니다. 이 메시지는 **"Fragmentation Needed and DF Set"**라는 오류를 나타냅니다.
- 이 **ICMP 메시지**는 송신 측에 도달하여 **MTU가 문제라는 정보**를 제공합니다.
4. **송신 측에서 MTU 조정**:
- 송신 측(주로 TCP/IP 스택)은 **ICMP 메시지**를 수신한 후, 해당 경로에서의 **MTU가 너무 작다는 정보를 얻습니다**.
- 이후, **송신 측의 TCP 프로토콜**은 **Path MTU Discovery** 과정을 통해 **적절한 MTU 값을 결정**하게 됩니다.
- TCP는 **더 작은 크기의 세그먼트**로 데이터를 다시 나누어 전송하며, 이를 통해 **MTU를 넘지 않는 크기로 패킷을 전송**합니다.
### **Path MTU Discovery (PMTUD)**
- **PMTUD(Path MTU Discovery)**는 송신 측이 **최적의 MTU**를 찾기 위해 사용하는 과정입니다. **DF 비트가 1**로 설정된 상태에서 **ICMP 메시지**를 통해 네트워크 경로 상의 작은 MTU 값을 알아내고, **TCP 프로토콜**은 이에 맞추어 **세그먼트 크기를 조정**합니다.
- 이 과정은 **MTU보다 작은 크기의 세그먼트**로 재전송되기 때문에, **재전송 시**에는 문제가 발생하지 않고 패킷이 성공적으로 전달됩니다.
### 요약:
- **DF 비트가 1**인 경우, **중간 장치가 MTU보다 큰 패킷을 분할할 수 없으므로 폐기**합니다.
- 폐기된 패킷에 대한 정보는 **ICMP 메시지**를 통해 송신 측에 전달되며, **송신 측의 TCP 프로토콜**은 **Path MTU Discovery**를 통해 **적절한 MTU 크기를 찾고** 더 작은 크기로 데이터를 **재전송**합니다.
- 이 과정에서 **TCP는 직접적으로 MTU를 설정하지는 않지만**, **ICMP 메시지를 통해 MTU 문제를 인식**하고, **더 작은 세그먼트 크기로 데이터를 재전송**하는 방식으로 간접적으로 조정합니다.