IPv4와 IPv6의 차이점은 무엇인가요?

김상욱·2024년 12월 4일

IPv4와 IPv6의 차이점은 무엇인가요?

IPv4와 IPv6는 인터넷 프로토콜(IP)의 두 가지 버전으로 네트워크에서 장치들이 데이터를 주고받을 수 있도록 하는 규칙을 정의한 프로토콜.

IPv4

  • 32비트의 주소로 구성. 4개의 8비트 숫자로 표현. 각 숫자는 0~255 사이의 값
    ex) 192.168.1.1
  • 2322^{32}개, 약 43억개의 주소 제공
  • 고정 IP와 동적 IP를 모두 사용. 네트워크 환경에 따라 사용자가 선택적으로 설정 가능. 일반적으로 가정용 인터넷은 동적 IP를 사용하며, 기업용 네트워크나 서버는 고정 IP를 사용.
    : 고정 IP는 변하지 않는 IP 주소로 특정 장치나 서버에 영구적으로 할당. 사용자가 수동으로 설정하거나, 네트워크 관리자가 특정 장치에 특정 IP를 지정.
    : 동적 IP는 변하는 IP 주소로 DHCP(Dynamic Host Configuration Protocol) 서버를 통해 자동으로 할당. 장치가 네트워크에 연결될 때마다 새로운 IP가 할당될 수 있다.
  • 네트워크 주소와 호스트 주소로 나누어진다. 서브넷 마스크를 사용하여 네트워크와 호스트를 구분한다.
    ex) IP 192168.1.1 / 서브넷 마스크 255.255.255.0
    : IP 주소는 크게 두 부분으로 나뉘는데 네트워크 자체를 식별하는 네트워크 주소와 네트워크 안에서 특정 장치(컴퓨터, 프린터 등)를 식별하는 호스트 주소로 나뉘어진다. 서브넷 마스크는 네트워크 주소와 호스트 주소를 구분하는 데 사용되는 32비트 값이다. 서브넷 마스크에서 비트 값이 1인 부분은 네트워크 부분이고 비트 값이 0인 부분은 호스트 부분이다.

헤더의 크기는 20~60바이트 정도로 구성 요소는 다음과 같다.

  • 버전, 헤더 길이, 서비스 유형, 총 길이, 식별자, TTL(Time to Live), 프로토콜, 헤더 체크섬 등.
    IPv4 헤더는 상대적으로 복잡하며, 체크섬 계산이 필요하여 성능에 영향을 미칠 수 있다.

기본적으로 보안 기능이 따로 없으며 보안을 위해 별도로 IPsec(인터넷 프로토콜 보안)을 구성해야 한다.

브로드캐스트를 지원하여 네트워크의 모든 장치에 데이터를 전송할 수 있다.

기존에 가장 널리 사용되며 모든 장치와 네트워크가 지원.

IPv6

  • 128비트의 주소로 구성. 8개의 16비트 숫자로 표현되며 각 숫자는 0~FFFF 사이의 값
    ex) 2001:0db8:85a3:0000:0000:8a2e:0370:7334
  • 21282^{128} 사실상 무한 개의 주소 제공
    -> 이를 통해 주소 고갈 문제 해결
  • 고정 IP를 사용하는 경우가 많으며, 자동 구성 기능을 지원한다.
  • 네트워크 부분과 인터페이스 식별자로 구성된다. 네트워크 주소는 ISP에 의해 할당되고 호스트는 MAC 주소를 기반으로 자동으로 생성 가능하다.
    : 네트워크를 식별하는 부분은 ISP(Internet Service Provider)에서 할당해주고 네트워크 내 특정 장치를 식별하는 부분은 인터페이스 식별자로 불리며 MAC 주소 기반으로 생성된다.

헤더의 크기는 고정적으로 40바이트이며 구성요소는 다음과 같다.

  • 버전, 트래픽 클래스, 플로우 라벨, 페이로드 길이, 넥스트 헤더, 홉 제한 등.
    체크섬과 같은 불필요한 필드가 제거되어 데이터 처리가 더 빠르다.

IPsec이 프로토콜에 내장되어 있어 기본적으로 보안을 제공한다. 데이터의 무결성과 인증, 암호화를 쉽게 구현할 수 있다.

브로드캐스트를 사용하지 않으며 대신 멀티캐스트와 애니캐스트를 사용.
: 멀티캐스트 - 특정 그룹에 데이터 전송
: 애니캐스트 - 가장 가까운 장치에 데이터 전송

IPv4와 호환되지 않기 때문에 전환 과정에서 이중 스택(Dual Stack) 또는 터널링(Tunneling) 같은 기술을 사용해 두 프로토콜을 공존시키고 있다.


Java와 Spring 백엔드 개발자 입장에서 IPv4와 IPv6 관련 개념을 실습해보는 것은 네트워크와 관련된 실무적인 감각을 익히는 데 매우 유용합니다. 실습을 통해 이해할 수 있는 주제와 방법을 아래에 정리했습니다.


1️⃣ IPv4와 IPv6 환경 설정 및 확인

실습 목표

  • 운영 체제에서 IPv4와 IPv6 설정 및 상태 확인.
  • Java를 이용해 IP 주소를 처리하고, IPv4/IPv6 간 차이를 확인.

실습 방법

  1. 운영 체제에서 네트워크 설정 확인

    • Windows/Linux/MacOS에서 ipconfig 또는 ifconfig 명령어를 사용하여 IPv4와 IPv6 주소 확인.
    • IPv6이 활성화되어 있는지 확인.
  2. Java로 네트워크 인터페이스 확인

    import java.net.*;
    
    public class NetworkInterfaces {
        public static void main(String[] args) throws SocketException {
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            while (interfaces.hasMoreElements()) {
                NetworkInterface networkInterface = interfaces.nextElement();
                System.out.println("Interface: " + networkInterface.getName());
                Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();
                while (addresses.hasMoreElements()) {
                    InetAddress address = addresses.nextElement();
                    System.out.println("  Address: " + address.getHostAddress());
                }
            }
        }
    }
    • 이 코드를 실행하여 시스템의 IPv4와 IPv6 주소를 확인.

2️⃣ 고정 IP와 동적 IP 설정 실습

실습 목표

  • 네트워크 장치에서 고정 IP와 DHCP를 설정하고 확인.
  • Java에서 IP 주소를 고정하거나 동적으로 설정된 장치에 접근.

실습 방법

  1. 네트워크 설정 변경

    • 라우터 또는 OS 설정에서 고정 IP를 설정.
    • DHCP 설정으로 변경한 뒤 두 설정이 어떻게 작동하는지 확인.
  2. Java 클라이언트-서버 통신

    • 서버를 특정 IP(고정 또는 동적)로 실행.
    • 클라이언트를 통해 서버에 접속.
    import java.io.*;
    import java.net.*;
    
    public class SimpleServer {
        public static void main(String[] args) throws IOException {
            ServerSocket serverSocket = new ServerSocket(8080);
            System.out.println("Server started on port 8080");
    
            while (true) {
                Socket client = serverSocket.accept();
                System.out.println("Client connected: " + client.getInetAddress());
                client.close();
            }
        }
    }
    import java.io.*;
    import java.net.*;
    
    public class SimpleClient {
        public static void main(String[] args) throws IOException {
            String serverAddress = "192.168.1.100"; // 고정 IP 또는 동적 IP 확인
            Socket socket = new Socket(serverAddress, 8080);
            System.out.println("Connected to server at: " + serverAddress);
            socket.close();
        }
    }

3️⃣ IPv6 지원 애플리케이션 개발

실습 목표

  • IPv6 주소 형식으로 클라이언트-서버 통신.
  • IPv6 전용 서버 또는 클라이언트를 실행해 IPv6 처리 방법 익히기.

실습 방법

  1. 서버 실행

    • IPv6 주소를 명시하여 서버 실행.
    public class IPv6Server {
        public static void main(String[] args) throws IOException {
            InetAddress ipv6Address = InetAddress.getByName("::1"); // Loopback IPv6 주소
            ServerSocket serverSocket = new ServerSocket(8080, 50, ipv6Address);
            System.out.println("IPv6 Server started on port 8080");
    
            while (true) {
                Socket client = serverSocket.accept();
                System.out.println("Client connected: " + client.getInetAddress());
                client.close();
            }
        }
    }
  2. 클라이언트 실행

    • IPv6 주소를 명시하여 클라이언트 실행.
    public class IPv6Client {
        public static void main(String[] args) throws IOException {
            String serverAddress = "::1"; // Loopback IPv6 주소
            Socket socket = new Socket(serverAddress, 8080);
            System.out.println("Connected to IPv6 server at: " + serverAddress);
            socket.close();
        }
    }

4️⃣ 브로드캐스트, 멀티캐스트, 애니캐스트 실습

실습 목표

  • Java에서 브로드캐스트와 멀티캐스트 구현.
  • IPv4와 IPv6에서 멀티캐스트 차이 확인.

실습 방법

  1. 멀티캐스트 예제

    import java.net.*;
    
    public class MulticastExample {
        public static void main(String[] args) throws IOException {
            InetAddress group = InetAddress.getByName("224.0.0.1"); // IPv4 멀티캐스트 주소
            MulticastSocket socket = new MulticastSocket(4446);
            socket.joinGroup(group);
    
            System.out.println("Joined multicast group: " + group);
    
            byte[] buffer = new byte[256];
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
            socket.receive(packet);
            System.out.println("Received message: " + new String(packet.getData()));
    
            socket.leaveGroup(group);
            socket.close();
        }
    }

5️⃣ Java 네트워크 라이브러리를 활용한 IPv4/IPv6 차이 분석

실습 목표

  • Java 네트워크 API를 활용하여 IPv4와 IPv6 차이점 실습.
  • HTTP 요청에서 IPv4와 IPv6의 처리 비교.

실습 방법

  1. HTTP 요청 전송

    import java.net.*;
    import java.io.*;
    
    public class HttpRequestExample {
        public static void main(String[] args) throws IOException {
            URL url = new URL("http://[::1]:8080"); // IPv6 URL 형식
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
    
            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);
    
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String inputLine;
            StringBuilder response = new StringBuilder();
    
            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();
            System.out.println("Response: " + response);
        }
    }

6️⃣ 배운 내용 실무에 적용

  1. Spring Boot 애플리케이션에 적용:

    • IPv4와 IPv6를 모두 지원하는 REST API 개발.
    • 애플리케이션 실행 시 IPv6 지원 설정 (application.properties).
      server.address=:: # IPv6 활성화
      server.port=8080
  2. 서버 환경 테스트:

    • 로컬 또는 클라우드 환경에서 IPv4와 IPv6 지원 여부 확인.
    • AWS, Azure, Google Cloud 같은 플랫폼에서 IPv6 설정 테스트.

결론

위 실습은 네트워크 프로토콜의 기본 개념을 Java와 Spring을 통해 실질적으로 이해할 수 있는 기회를 제공합니다. 특히 IPv4와 IPv6의 차이점을 이해하고, 클라이언트-서버 환경에서 프로토콜을 구현하며 실무적인 네트워크 감각을 기를 수 있습니다.

0개의 댓글