Published on

스위치와 라우터 시뮬레이션 Java로 네트워크 동작 이해

Authors
  • avatar
    Name
    김민석
    Twitter

Introduction

상황

네트워크에서 스위치와 라우터는 데이터를 전달하고 관리하는 데 핵심적인 역할을 한다.

스위치와 라우터의 동작 원리를 제대로 이해하지 못하면 네트워크 설계와 문제 해결 과정에서 어려움이 생길 수 있다고 생각했다.

특히, 학습 환경에서 실제 네트워크 장비를 사용하지 않고 스위치와 라우터의 역할을 이해하려면, 이론만으로는 부족하다고 판단 했고, 실습을 통해 학습해야 한다는 문제에 직면했다.

Java를 사용하여 스위치와 라우터의 동작을 시뮬레이션하고, 이를 기반으로 네트워크 통신의 흐름을 학습하고자 했다.

문제

  • 스위치와 라우터 동작의 이론적 이해 부족
    • 스위치는 동일 네트워크 내에서 데이터를 전달하고, 라우터는 서로 다른 네트워크 간에 데이터를 연결하지만, 두 장비의 동작 차이를 코드로 구현해 본 경험이 없었다.
    • 특히, MAC 주소IP 주소 기반의 데이터 전달 메커니즘을 정확히 이해하지 못한 상태였다.
  • 네트워크 시뮬레이션 환경 부족
    • 실제 네트워크 장비를 사용할 수 없는 상황에서 소프트웨어적으로 스위치와 라우터의 동작을 구현해야 했다.
  • 구현 과정의 복잡성
    • 스위치의 MAC 주소 테이블 학습, 라우터의 라우팅 테이블 관리, 패킷 전달 로직 설계 등 각각의 기능을 코드로 분리하고 구현하는 과정이 예상보다 복잡했다.

구현

Java를 사용해 스위치와 라우터의 동작을 각각 시뮬레이션하고, 간단한 네트워크 시뮬레이터를 구축했다.

스위치 구현) 동일 네트워크 내 데이터 전달

image.png
  • 스위치는 MAC 주소를 기반으로 패킷을 전달하며, 처음 보는 MAC 주소는 학습하고, 목적지 MAC 주소가 없으면 브로드캐스트를 수행한다.
public class SwitchSimulator {
    private Map<String, String> macTable = new HashMap<>();

    public void forwardPacket(String sourceMac, String destinationMac, String port) {
        macTable.put(sourceMac, port); // MAC 주소 학습

        if (macTable.containsKey(destinationMac)) {
            System.out.println("패킷 전달: " + destinationMac + " -> 포트 " + macTable.get(destinationMac));
        } else {
            System.out.println("브로드캐스트: 목적지 MAC 주소를 찾을 수 없습니다.");
        }
    }

    public void printMacTable() {
        System.out.println("현재 MAC 테이블: " + macTable);
    }
}

실행 결과

브로드캐스트: 목적지 MAC 주소를 찾을 수 없습니다.
패킷 전달: 00:11:22:33:44:55 -> 포트 Port1

라우터 구현) 서로 다른 네트워크 간 데이터 전달

image.png

라우터는 라우팅 테이블을 기반으로 목적지 네트워크에 맞는 게이트웨이를 결정한다.

public class RouterSimulator {
    private Map<String, String> routingTable = new HashMap<>();

    public void addRoute(String network, String gateway) {
        routingTable.put(network, gateway);
    }

    public void routePacket(String destination) {
        for (String network : routingTable.keySet()) {
            if (destination.startsWith(network)) {
                System.out.println("패킷 전달: " + destination + " -> 게이트웨이 " + routingTable.get(network));
                return;
            }
        }
        System.out.println("라우팅 실패: 경로를 찾을 수 없습니다.");
    }
}

실행 결과

패킷 전달: 192.168.1.100 -> 게이트웨이 192.168.1.1
라우팅 실패: 경로를 찾을 수 없습니다.

스위치와 라우터를 결합하여 패킷이 스위치를 통해 전달되고, 라우터를 통해 외부 네트워크로 연결되는 흐름을 구현했다.

해결

  • 단계별 구현을 진행했다.
    • 스위치와 라우터의 역할을 분리하여 각각 독립적으로 구현한 뒤, 통합 과정을 통해 전체 시스템의 동작을 확인했다.
  • 에러 처리 로직을 추가했다.
    • 잘못된 입력값이 발생했을 때 프로그램이 중단되지 않도록 예외 처리와 디버그 메시지를 추가했다.
    • 예를 들어, 잘못된 MAC 주소가 입력되었을 때 경고 메시지를 출력하고, 입력값을 무시하도록 처리했다.
  • 테스트 환경을 구축했다.
    • 동일 네트워크 내 패킷 전달 시 스위치의 MAC 주소 테이블 학습 여부와, 다른 네트워크 간 데이터 전달 시 라우터의 라우팅 테이블 동작을 검증했다.

결말

Java를 사용하여 스위치와 라우터의 동작을 직접 구현하며, 네트워크 데이터 전달의 기본 원리를 학습할 수 있었다.

스위치 구현 결과, MAC 주소 학습과 패킷 전달의 동작 원리를 이해하고, 동일 네트워크 내에서의 데이터 흐름을 성공적으로 시뮬레이션했다. 이 과정에서 브로드캐스트유니캐스트의 차이를 명확히 파악할 수 있었다.

라우터 구현 결과, 라우팅 테이블을 사용하여 서로 다른 네트워크 간 데이터를 전달하는 과정을 시뮬레이션했으며, 라우팅 실패 시의 동작과 경고 메시지 출력까지 구현했다. 이를 통해 라우터의 역할과 중요성을 체감할 수 있었다.

이번 프로젝트는 단순히 네트워크 이론을 이해하는 데서 끝나지 않고, 동작 과정을 코드로 학습할 수 있었다. 앞으로 VLAN 설정, 동적 라우팅 프로토콜(Dynamic Routing Protocol) 구현 등 추가 기능을 개발하여 네트워크 도구로 발전시킬 계획이다.