핵심 인사이트 (3줄 요약)
- 본질: IPv4 헤더의 Flags 필드에 속한 DF와 MF 비트는 패킷이 좁은 망(MTU 병목 구간)을 지날 때 라우터에게 "나를 찢을 것인가, 찢지 말 것인가, 찢었다면 뒤에 조각이 더 있는가?"를 지시하는 절대적인 1비트 신호등이다.
- DF (Don't Fragment): 송신 측 PC가 "이 패킷은 중간에 절대 찢어지면 안 돼!"라며 DF 비트를 1로 세팅하면, 라우터는 좁은 길을 만났을 때 패킷을 찢지 못하고 가차 없이 쓰레기통에 버려버린 뒤(Drop), 송신 측에 ICMP 에러 메시지를 날린다. (주로 망의 최대 MTU 크기를 탐색할 때 쓴다.)
- MF (More Fragment): 라우터가 패킷을 3조각으로 찢었을 때, 앞의 1번, 2번 조각에는 MF를 1로 세팅("뒤에 동생 더 오니까 조립 대기해!")하고, 마지막 3번 꼬리 조각에는 MF를 0으로 세팅("내가 끝이야, 당장 조립 시작해!")하여 수신 측의 무한 대기를 막아준다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
-
개념: IP 단편화(Fragmentation)를 직접적으로 통제하는 Flags 필드(3비트) 내의 2번, 3번째 스위치 비트.
-
필요성:
- 원래 라우터의 1원칙은 "패킷이 크면 찢어서라도 목적지까지 배달해라"다. 하지만 TCP와 같은 상위 계층은 조각난 패킷을 재조립하는 데 엄청난 CPU 연산을 써야 하므로, "아예 처음부터 안 찢어지게 작게 보내고 싶다"는 니즈가 생겼다. 그래서 라우터에게 **"찢을 바엔 차라리 버려(DF)!"**라고 명령할 권한을 부여했다.
- 라우터가 임의로 패킷을 찢었을 때, 목적지 PC는 언제까지 기다려야 모든 조각이 다 온 건지 알 수가 없다. 누군가 꼬리표에 **"내가 마지막 조각이야(MF=0)"**라고 외쳐주지 않으면 영원히 버퍼 메모리만 차지하게 되므로 MF 비트가 탄생했다.
-
💡 비유:
- DF (Don't Fragment): 유리그릇에 "취급 주의: 분해 불가" 스티커를 붙이는 것. 택배 박스에 안 들어가면 억지로 쪼개지 말고 반송 처리하라는 강력한 경고입니다.
- MF (More Fragment): 긴 영화를 압축 파일(ZIP) 3개로 나눠서 보낼 때 파일 이름을
영화.part1 (뒤에 더 있음),영화.part2 (뒤에 더 있음),영화.part3 (이게 끝!)으로 지어주는 친절한 작명법입니다.
📢 섹션 요약 비유: DF 비트는 억지로 구겨 넣지 말고 차라리 터트려 버리라는 **"단일성 보장 각서"**이고, MF 비트는 뿔뿔이 흩어져 날아오는 조각 부대원들 중 맨 마지막 병사가 **"대장님! 제가 꼬장(마지막)입니다!"**라고 보고하는 종료 선언 비트입니다.
Ⅱ. DF와 MF의 실무적 활용 원리 (Deep Dive)
1. DF 비트와 PMTUD (경로 MTU 탐색) 기술
최신 컴퓨터(윈도우, 리눅스 등)는 네트워크로 데이터를 쏠 때 기본적으로 모든 패킷의 DF 비트를 무조건 1(Don't Fragment)로 세팅해서 던진다.
그 이유는 **PMTUD (Path MTU Discovery)**라는 꼼수를 쓰기 위함이다.
- 내 PC가 1500바이트 뚱뚱한 패킷에
DF=1을 달아 쏜다. - 중간에 1400바이트밖에 통과 못 하는 VPN/PPPoE 라우터를 만났다.
- 라우터 왈: "야! 이거 1500바이트라 찢어야 통과하는데, 네가
DF=1(찢지마)붙여놨네? 룰에 따라 이 패킷 쓰레기통에 버린다! 대신 너한테 ICMP (Type 3 Code 4: Fragmentation Needed) 에러 메시지를 날려줄게. 우리 길 최대 1400바이트니까 다음부턴 작게 썰어와!" - PC 왈: "아! 중간 병목 구간이 1400이구나!" 하고 그때부터 PC의 TCP 모듈이 아예 1400바이트짜리로 작게 포장해서 보낸다.
- 결과적으로 중간 라우터가 땀 뻘뻘 흘리며 패킷을 찢는 부하(오버헤드)가 완전히 사라져 네트워크 속도가 쾌적해진다.
2. MF 비트와 목적지 조립 에러 (Reassembly Timeout)
라우터가 DF=0인 패킷을 만나 가차 없이 3조각으로 찢었다고 치자.
- 수신자 PC에 1번 조각(MF=1) 도착 ──▶ "오케이 버퍼에 담고 기다림"
- 2번 조각(MF=1) 도착 ──▶ "오케이 버퍼에 담음"
- 문제 발생: 3번 조각(MF=0)이 해저 케이블 노이즈로 증발해 버렸다!
- 수신자 PC는 MF=0인 꼬리 조각이 안 왔기 때문에 조립을 시작하지 못하고 버퍼 메모리를 잡고 하염없이 기다리다, 일정 시간이 지나면(Reassembly Timeout) "에잇 망했다!" 하고 힘들게 모은 1번, 2번 조각마저 통째로 쓰레기통에 쏟아버린다(Drop).
- 결국 단편화(Fragmentation)가 많이 발생할수록 패킷 하나만 잃어버려도 전체가 날아가 재전송해야 하는 최악의 효율이 발생하므로, 네트워크 엔지니어들은 기를 쓰고 단편화가 일어나지 않게 MTU를 조절한다.
┌─────────────────────────────────────────────────────────────┐
│ DF와 MF 비트의 극단적 운명 교차로 │
├─────────────────────────────────────────────────────────────┤
│ │
│ [ 2000 Bytes 패킷 ] ──▶ [ MTU 1500 라우터 통과 시도 ] │
│ │
│ 상황 A) DF = 1 로 세팅되어 있을 때 │
│ 라우터: "안 찢을 거면 여길 못 지나감. 패킷 즉각 사살(Drop)!" │
│ "송신자 녀석아 1500으로 작게 줄여서 다시 보내라(ICMP)!" │
│ │
│ 상황 B) DF = 0 로 세팅되어 있을 때 (단편화 승인) │
│ 라우터: "좋아, 찢어준다. 두 조각으로 내버려!" │
│ - 조각 1 (1500B): MF = 1 ("뒤에 500바이트짜리 하나 더 감!") │
│ - 조각 2 (500B) : MF = 0 ("내가 끝이야, 바로 조립해!") │
└─────────────────────────────────────────────────────────────┘
📢 섹션 요약 비유: DF=1은 **"내 몸에 흠집 하나 내지 말고 배송하든가 아니면 아예 반송해라"**라는 VIP 고객의 엄포이며, MF 비트는 여러 대로 나뉘어 이사 가는 트럭들 중 1, 2호 차 뒤에는 "후속 차량 있음" 딱지를 붙이고, 3호 차에는 떼버리는 센스 있는 호송 작전입니다.