🌍 네트워크

Ethernet

이더넷

유선 LAN의 표준 기술. MAC 주소 기반 통신. 1Gbps, 10Gbps 속도.

📖 상세 설명

Ethernet(이더넷)은 유선 LAN(Local Area Network)의 사실상 표준 기술입니다. 1973년 Xerox PARC에서 Robert Metcalfe가 발명했으며, IEEE 802.3 표준으로 규격화되었습니다. 사무실, 데이터센터, 가정에서 컴퓨터와 네트워크 장비를 연결하는 가장 보편적인 방식으로, 전 세계 유선 네트워크의 95% 이상이 이더넷을 사용합니다.

이더넷은 MAC(Media Access Control) 주소를 사용하여 장치를 식별합니다. MAC 주소는 48비트(6바이트)로 구성된 고유 식별자로, 예를 들어 "00:1A:2B:3C:4D:5E" 형식입니다. 네트워크 인터페이스 카드(NIC)에 제조 시 할당되며, 데이터 링크 계층(OSI Layer 2)에서 프레임 전송의 기반이 됩니다.

이더넷 속도는 초기 10Mbps에서 시작하여 Fast Ethernet(100Mbps), Gigabit Ethernet(1Gbps), 10GbE, 25GbE, 40GbE, 100GbE까지 발전했습니다. 최신 데이터센터에서는 400GbE와 800GbE도 도입되고 있습니다. 일반 가정과 사무실에서는 Gigabit Ethernet(1000BASE-T)이 표준이며, CAT5e 또는 CAT6 케이블로 최대 100m까지 연결할 수 있습니다.

이더넷 프레임은 Preamble(8바이트), 목적지/출발지 MAC 주소(각 6바이트), Type/Length(2바이트), Payload(46~1500바이트), FCS(4바이트)로 구성됩니다. 스위치는 MAC 주소 테이블을 학습하여 목적지 포트로만 프레임을 전달함으로써 네트워크 효율을 높입니다. VLAN을 통해 물리적 네트워크를 논리적으로 분리할 수 있습니다.

💻 코드 예제

import subprocess
import re
from scapy.all import Ether, ARP, srp, get_if_hwaddr, conf

# 현재 시스템의 MAC 주소 확인
def get_mac_address():
    mac = get_if_hwaddr(conf.iface)
    print(f"내 MAC 주소: {mac}")
    return mac

# 네트워크 장치 스캔 (ARP 사용)
def scan_network(ip_range):
    """같은 LAN 내의 활성 장치들을 스캔"""
    # Ethernet 프레임 + ARP 요청
    ether = Ether(dst="ff:ff:ff:ff:ff:ff")  # 브로드캐스트
    arp = ARP(pdst=ip_range)
    packet = ether / arp

    result = srp(packet, timeout=3, verbose=0)[0]

    devices = []
    for sent, received in result:
        devices.append({
            'ip': received.psrc,
            'mac': received.hwsrc
        })

    return devices

# 사용 예시
if __name__ == "__main__":
    get_mac_address()

    # 192.168.1.0/24 네트워크 스캔
    print("\n네트워크 스캔 중...")
    devices = scan_network("192.168.1.0/24")

    print(f"\n발견된 장치: {len(devices)}개")
    print("-" * 45)
    print(f"{'IP 주소':<20} {'MAC 주소':<20}")
    print("-" * 45)
    for device in devices:
        print(f"{device['ip']:<20} {device['mac']:<20}")
# MAC 주소 확인
ip link show            # Linux
ifconfig                # macOS/Linux
ipconfig /all           # Windows

# 네트워크 인터페이스 상세 정보 (이더넷 속도 포함)
ethtool eth0            # 링크 속도, 듀플렉스 모드 확인
ethtool -i eth0         # 드라이버 정보
ethtool -S eth0         # 통계 (패킷 수, 에러 등)

# 이더넷 속도 변경 (1Gbps full-duplex)
sudo ethtool -s eth0 speed 1000 duplex full autoneg off

# ARP 테이블 확인 (IP-MAC 매핑)
arp -a                  # 모든 ARP 엔트리
ip neigh show           # Linux (최신 방식)

# 같은 LAN 내 장치 스캔 (nmap)
nmap -sn 192.168.1.0/24       # Ping 스캔
nmap -sP 192.168.1.0/24       # 빠른 호스트 발견

# 스위치의 MAC 주소 테이블 확인 (Cisco)
# show mac address-table
# show mac address-table dynamic

# VLAN 설정 확인 (Linux)
cat /proc/net/vlan/config
ip -d link show eth0.100

# tcpdump로 이더넷 프레임 캡처
sudo tcpdump -i eth0 -e -c 10
# -e: 이더넷 헤더 출력, -c: 패킷 수 제한
const os = require('os');
const { exec } = require('child_process');
const { promisify } = require('util');
const execAsync = promisify(exec);

// 시스템의 모든 네트워크 인터페이스 MAC 주소 확인
function getNetworkInterfaces() {
    const interfaces = os.networkInterfaces();
    const results = [];

    for (const [name, addrs] of Object.entries(interfaces)) {
        for (const addr of addrs) {
            if (addr.mac && addr.mac !== '00:00:00:00:00:00') {
                results.push({
                    interface: name,
                    mac: addr.mac,
                    ip: addr.address,
                    family: addr.family,
                    internal: addr.internal
                });
            }
        }
    }
    return results;
}

// 이더넷 인터페이스 정보 출력
const interfaces = getNetworkInterfaces();
console.log('네트워크 인터페이스 목록:\n');
interfaces.forEach(iface => {
    if (!iface.internal) {  // 외부 인터페이스만
        console.log(`인터페이스: ${iface.interface}`);
        console.log(`  MAC 주소: ${iface.mac}`);
        console.log(`  IP 주소: ${iface.ip} (${iface.family})`);
        console.log('');
    }
});

// ARP 테이블 조회 (같은 LAN 내 장치)
async function getArpTable() {
    try {
        const { stdout } = await execAsync('arp -a');
        console.log('ARP 테이블 (IP-MAC 매핑):\n');
        console.log(stdout);
    } catch (err) {
        console.error('ARP 테이블 조회 실패:', err.message);
    }
}

getArpTable();

🗣️ 실무에서 이렇게 말하세요

💬 네트워크 구축 미팅에서
"서버실은 10GbE로 백본을 구성하고, 각 랙은 1GbE 스위치로 연결하겠습니다. CAT6A 케이블을 사용하면 10Gbps까지 지원되고, 향후 25GbE 업그레이드도 가능합니다. 스위치는 Layer 3로 선택해서 VLAN 간 라우팅도 처리하겠습니다."
💬 장애 대응 시
"MAC 플러딩 공격이 의심됩니다. 스위치의 MAC 테이블이 가득 차서 허브처럼 모든 포트로 브로드캐스트하고 있어요. 포트 시큐리티를 설정해서 포트당 MAC 주소 수를 제한해야 합니다. 당장은 해당 포트를 shutdown 시키겠습니다."
💬 기술 면접에서
"이더넷 프레임은 목적지 MAC, 출발지 MAC, EtherType, 페이로드, FCS로 구성됩니다. 스위치는 출발지 MAC을 학습해서 테이블에 저장하고, 목적지 MAC을 테이블에서 찾아 해당 포트로만 전송합니다. 테이블에 없으면 플러딩하고요. 이 방식이 허브와의 가장 큰 차이점입니다."

⚠️ 흔한 실수 & 주의사항

케이블 등급 무시

Gigabit에 CAT5 케이블을 쓰면 연결은 되지만 속도가 저하되고 에러가 증가합니다. 1Gbps에는 최소 CAT5e, 10Gbps에는 CAT6A 이상을 사용하세요.

스패닝 트리 미설정

스위치 간 루프가 발생하면 브로드캐스트 스톰으로 네트워크가 마비됩니다. STP(Spanning Tree Protocol)를 반드시 활성화하고, 중요 서버는 RSTP로 빠른 복구를 설정하세요.

Auto-negotiation 불일치

한쪽은 Auto, 다른 쪽은 Fixed로 설정하면 속도/듀플렉스 불일치가 발생합니다. 양쪽 모두 Auto-negotiation을 사용하거나, 양쪽 모두 동일한 값으로 고정하세요.

올바른 이더넷 구성

포트 시큐리티로 MAC 주소 제한, VLAN으로 브로드캐스트 도메인 분리, 802.1Q 트렁킹으로 VLAN 태깅. 중요 링크는 Link Aggregation(LACP)으로 대역폭과 이중화를 확보하세요.

🔗 관련 용어

📚 더 배우기