IP Classes, MTU, Private/Public IP
1️⃣ IP Classes (IP 주소 클래스)
IP 주소는 크게 IPv4와 IPv6로 나뉘는데, 우리는 먼저 IPv4 주소 체계를 다룰 거야. IPv4 주소는 32비트(4바이트) 크기로, 보통 192.168.0.1 같은 형식으로 표현돼.
이 IPv4 주소들은 특정한 클래스(Class) 로 구분되는데, 이는 주소의 구조와 네트워크 크기에 따라 나뉘는 거야.
🔹 IP 클래스 종류 (IPv4 기준)
클래스 범위 네트워크 수 호스트 수 사용처
A 클래스 | 1.0.0.0 ~ 126.255.255.255 | 128개 | 16,777,214개 | 대형 네트워크 (예: 대기업, ISP) |
B 클래스 | 128.0.0.0 ~ 191.255.255.255 | 16,384개 | 65,534개 | 중간 규모 네트워크 (예: 대학교, 기업) |
C 클래스 | 192.0.0.0 ~ 223.255.255.255 | 2,097,152개 | 254개 | 소규모 네트워크 (예: 일반 회사, 가정용 네트워크) |
D 클래스 | 224.0.0.0 ~ 239.255.255.255 | 멀티캐스트용 | - | 멀티캐스트 (특정 그룹에게만 데이터 전송) |
E 클래스 | 240.0.0.0 ~ 255.255.255.255 | 실험용 | - | 연구 및 실험용 |
🌟 네트워크와 호스트 수:
- A 클래스는 네트워크가 적지만, 하나의 네트워크에서 많은 호스트(기기)를 가질 수 있어.
- C 클래스는 네트워크가 많지만, 하나의 네트워크에 적은 호스트만 가능해.
🛑 주의할 점:
- 127.0.0.0 ~ 127.255.255.255 범위는 Loopback(자기 자신 테스트용) 으로 예약됨.
2️⃣ MTU (Maximum Transmission Unit)
📌 MTU란?
MTU는 네트워크에서 한 번에 전송할 수 있는 최대 패킷 크기를 의미해.
즉, 데이터를 전송할 때 한 번에 보낼 수 있는 최대 크기를 정하는 거야.
🔹 기본 MTU 값
- 이더넷(Ethernet): 1500바이트
- PPPoE (ADSL 등): 1492바이트
- IPv6 기본값: 1280바이트
🔹 왜 MTU가 중요한가?
- 만약 데이터가 MTU보다 크다면 데이터를 여러 개로 나눠서 보내야 해. (이걸 프래그멘테이션(Fragmentation) 이라고 해)
- 프래그멘테이션이 많아지면 속도가 느려지고, 네트워크 성능이 저하될 수 있어.
🔹 MTU 문제 해결 방법
- Ping으로 테스트하기
- ping -f -l 1472 8.8.8.8
- -f: 프래그멘테이션 금지 옵션
- -l: 전송할 데이터 크기
- 1472는 IP 헤더(20바이트) + ICMP 헤더(8바이트) = 1500바이트를 고려한 값
- 이 값이 전송 가능하면 적절한 MTU 값임!
- Path MTU Discovery (PMTUD)
- 네트워크 경로에서 가장 작은 MTU 값을 찾아서, 패킷 크기를 자동으로 조정하는 방식.
- IPv6에서는 필수적으로 사용됨.
🛑 주의할 점
MTU가 너무 크거나 작으면 네트워크 지연이 발생할 수 있어. 적절한 MTU 설정이 필요해!
3️⃣ Private IP & Public IP (사설 IP & 공인 IP)
📌 Private IP (사설 IP)
사설 IP는 내부 네트워크(집, 회사, 학교)에서만 사용되는 IP 주소야. 인터넷에서는 직접 사용되지 않고, NAT(Network Address Translation) 를 통해 공인 IP로 변환돼.
🔹 사설 IP 범위 (IPv4)
클래스 범위
A 클래스 | 10.0.0.0 ~ 10.255.255.255 |
B 클래스 | 172.16.0.0 ~ 172.31.255.255 |
C 클래스 | 192.168.0.0 ~ 192.168.255.255 |
📌 특징:
- 인터넷에서는 직접 사용 불가 (NAT 필수)
- 가정용 공유기나 사무실에서 많이 사용됨
- 같은 사설 IP 주소가 여러 개 존재할 수 있음 (서로 다른 네트워크에서는 가능)
📌 Public IP (공인 IP)
공인 IP는 인터넷에서 직접 사용 가능한 고유한 IP 주소야. 인터넷 서비스 제공업체(ISP)에서 제공하며, 전 세계에서 유일한 주소를 가짐.
📌 특징:
- 전 세계에서 고유한 IP 주소
- 인터넷에서 직접 접속 가능
- 보안 문제로 방화벽 설정이 중요
🛑 공인 IP는 제한적이므로, IPv4 주소 고갈 문제 해결을 위해 NAT(사설 → 공인 IP 변환) 이 필수적으로 사용됨.
✅ 정리
- IP 클래스: A, B, C 클래스가 일반적으로 사용되며, A는 대기업용, B는 중형 기업용, C는 소규모 네트워크용.
- MTU: 한 번에 보낼 수 있는 최대 패킷 크기. 기본 이더넷 MTU는 1500바이트.
- 사설 IP vs 공인 IP:
- 사설 IP: 내부 네트워크에서만 사용, 인터넷에 직접 연결 불가.
- 공인 IP: 인터넷에서 직접 사용 가능, 유일한 주소.
MTU 실험 :
구글의 IP주소인 8.8.8.8로 패킷을 전송해보기로 했다. 우선, 구글의 최대 패킷 수를 확인 해보자.
MTU MediaSenseState 바이트 인 바이트 아웃 인터페이스
---------- --------------- ------------ ------------ -------------
4294967295 1 0 305435 Loopback Pseudo-Interface 1
1500 1 3244983783 848222732 Wi-Fi
1500 5 0 0 로컬 영역 연결* 1
1500 5 0 0 Bluetooth 네트워크 연결
1500 5 0 0 로컬 영역 연결* 2
이렇게 기본 1500개로 제한되어 있다.
이제, 8.8.8.8로 패킷을 날려보자!
명령어는 ping -f -l (패킷 수) 8.8.8.8을 해주면 된다.
ping -f -l 1300 8.8.8.8
Ping 8.8.8.8 1300바이트 데이터 사용:
8.8.8.8의 응답: 바이트=1300 시간=31ms TTL=111
8.8.8.8의 응답: 바이트=1300 시간=28ms TTL=111
8.8.8.8의 응답: 바이트=1300 시간=27ms TTL=111
8.8.8.8의 응답: 바이트=1300 시간=27ms TTL=111
8.8.8.8에 대한 Ping 통계:
패킷: 보냄 = 4, 받음 = 4, 손실 = 0 (0% 손실),
왕복 시간(밀리초):
최소 = 27ms, 최대 = 31ms, 평균 = 28ms
이와 같이 제한(1500)을 넘지 않았기 때문에 0%손실과 함께 모든 패킷이 전달된다.
또한, 로컬 호스트로 2000 패킷을 보냈지만 드랍되지 않았다. 이 이유는 패킷은 여러 경로를 타고 이동한다. 이동하는 도중 제한에 걸리면 패킷이 드랍되지만, 로컬호스트로는 네트워크 상호작용이 일어나지 않으므로 모든 연산은 내부적으로 CPU에서 처리된다.
다음으로는 제한된 패킷 이상을 보내보자.
ping -f -l 2000 8.8.8.8
Ping 8.8.8.8 2000바이트 데이터 사용:
패킷 조각화가 필요하지만 DF가 설정되어 있습니다.
패킷 조각화가 필요하지만 DF가 설정되어 있습니다.
패킷 조각화가 필요하지만 DF가 설정되어 있습니다.
패킷 조각화가 필요하지만 DF가 설정되어 있습니다.
8.8.8.8에 대한 Ping 통계:
패킷: 보냄 = 4, 받음 = 0, 손실 = 4 (100% 손실),
1500(제한)보다 많은 2000패킷을 보내보았다. 보다시피 모든 패킷은 드롭되었다.
여기서 한가지 알고 가야할 명령어가 있는데, -f는 패킷 조각화를 하지 않는다는것이다.
패킷 조각화(Fragmentation)란, 크기가 큰 패킷을 여러 개의 작은 조각으로 나누어 전송한 후, 도착지에서 다시 원래 순서대로 재조립하는 과정을 의미해. 겉보기에는 "조각화를 하면 어떤 크기의 패킷이든 전송이 가능하겠네?" 라고 생각할 수 있지만, 실제로는 CPU의 연산 부담이 증가하고, 네트워크 성능 저하 및 서버 부하가 커지는 문제가 발생해. 따라서 ping 테스트를 수행할 때는 조각화를 방지하고 최적의 패킷 크기(MTU)를 찾는 것이 중요하다.
8.8.8.8로 1490바이트의 패킷을 보냈을 때 모두 드롭되는 이유를 생각해보면, MTU 값(1500바이트)보다 작은데도 패킷이 전송되지 않는 이유를 찾을 수 있어.
🔹 MTU 제한을 다시 확인해보자
MTU는 이더넷 프레임에서 한 번에 전송할 수 있는 최대 크기인데, 보통 기본 MTU 값은 1500바이트로 설정되어 있어. 그런데 여기서 중요한 점이 있어:
- IP 패킷의 전체 크기에는 "헤더(Header)"가 포함된다.
- IP 헤더(20바이트) + ICMP 헤더(8바이트) = 총 28바이트 추가됨.
- 즉, 실제 데이터(payload) 크기는 MTU에서 헤더 크기를 뺀 값이어야 한다.
- MTU 1500 - (IP 20 + ICMP 8) = 1472바이트 → 이게 최대 ICMP 데이터 크기.
- 1490바이트의 데이터를 보내면 실제 패킷 크기는?
- 1490 + 20(IP 헤더) + 8(ICMP 헤더) = 1518바이트
- 그런데 기본 이더넷 프레임에서는 1500바이트까지만 전송 가능하므로, 1518바이트는 MTU를 초과해서 전송되지 않음.
🔹 그래서 8.8.8.8로 보내면 드롭되는 이유
- 8.8.8.8(구글 DNS)은 ICMP 패킷 조각화(Fragmentation)를 허용하지 않음.
- ping -f -l 1490 8.8.8.8 로 보낼 경우 MTU 초과로 인해 패킷이 분할(프래그멘테이션)되어야 하는데, -f 옵션(프래그멘테이션 방지)이 있으면 패킷이 전송되지 않고 바로 드롭됨.
- 구글 DNS는 과도한 ICMP 트래픽을 방지하기 위해 일정 크기 이상의 패킷을 차단할 수도 있음.
✅ 결론
1490바이트의 데이터를 전송하면, IP 헤더 + ICMP 헤더 포함 시 1518바이트가 되어 기본 MTU(1500바이트)를 초과하므로, 패킷이 전송되지 않고 드롭된다.
따라서 ping 테스트 시 최대 크기는 1472바이트로 설정해야 한다.