이더넷 (Ethernet)

1973년 Xerox PARC에서 탄생한 이더넷은 반세기가 넘는 진화를 거쳐 10 Mbps 동축 케이블 버스에서 800 Gbps 광 링크까지 확장되었습니다. 이 문서는 이더넷의 역사, 물리 계층(PHY), 프레임 구조, 리눅스 커널 구현, 오프로드 기술, 에너지 효율, 산업용 이더넷까지 다양한 시각에서 종합적으로 다룹니다.

전제 조건: 네트워크 스택 (Network Stack) 문서를 먼저 읽으면 커널의 전체 패킷 흐름을 이해하는 데 도움이 됩니다. sk_buff 자료구조에 대한 기본 지식이 있으면 커널 자료구조 섹션을 더 쉽게 이해할 수 있습니다.
일상 비유: 이더넷은 고속도로 시스템과 비슷합니다. 프레임은 화물 트럭(정해진 크기의 컨테이너에 짐을 싣는 것처럼 헤더+페이로드+FCS로 구성), MAC 주소는 차량 번호판(출발지와 목적지 식별), 스위치는 교차로의 신호 시스템(올바른 목적지로만 트럭을 보냄), 그리고 속도 진화(10M→800G)는 1차선 비포장도로가 수십 차선 고속도로로 확장된 것에 비유할 수 있습니다.

핵심 요약

  • 프레임 (Frame) — 이더넷의 전송 단위. 목적지/출발지 MAC, EtherType, 페이로드, FCS로 구성되며 64~1518바이트 크기
  • MAC 주소 — 48비트(6바이트) 하드웨어 주소로, NIC마다 고유하게 할당되어 L2에서 장치를 식별
  • PHY / MAC — PHY는 전기/광 신호 변환을 담당하는 물리 계층 칩, MAC은 프레임 조립/해석을 담당하는 계층. RGMII 등의 인터페이스로 연결
  • ethtool — 리눅스에서 NIC 속도, 오프로드, 링 버퍼, EEE 등을 조회하고 설정하는 핵심 유틸리티
  • 오프로드 (Offload) — TSO, GRO, RSS 등 CPU 부담을 NIC 하드웨어로 넘기는 기술. 고성능 네트워크의 핵심

단계별 이해

  1. 프레임 구조부터 파악하기
    이더넷의 기본은 프레임입니다. Preamble → MAC 주소 → EtherType → Payload → FCS 순서를 먼저 이해하세요. EtherType ≥ 0x0600이면 Ethernet II, 그보다 작으면 802.3 프레임입니다.
  2. PHY-MAC 연결 이해하기
    NIC 내부에서 MAC 계층이 프레임을 처리하고, PHY 칩이 실제 전기/광 신호로 변환합니다. ethtool eth0으로 현재 링크 속도와 PHY 상태를 확인할 수 있습니다.
  3. 커널 수신 경로 따라가기
    케이블 → NIC DMA → IRQ → napi_schedule() → NAPI poll → eth_type_trans()netif_receive_skb() 순서로 프레임이 커널에 전달됩니다. 이 흐름이 이더넷 드라이버의 핵심입니다.
  4. 오프로드와 성능 튜닝 적용하기
    ethtool -k eth0로 현재 오프로드 상태를 확인하고, ethtool -G eth0 rx 4096으로 링 버퍼를 조정하며, ethtool -C eth0 adaptive-rx on으로 인터럽트 병합을 최적화합니다.

개요

이더넷(Ethernet)은 IEEE 802.3 표준으로 규정된 유선 LAN 기술로, 전 세계 네트워크 인프라의 핵심입니다. 원래 공유 매체(Shared Medium) 기반 CSMA/CD 프로토콜이었지만, 스위칭 기술과 전이중(Full-Duplex) 통신의 도입으로 현대 이더넷은 충돌 없는 점대점(Point-to-Point) 링크가 되었습니다.

핵심 특징:
  • 프레임 기반 — 가변 길이(64~1518바이트, Jumbo Frame 시 ~9000바이트) 프레임 전송
  • MAC 주소 — 48비트 EUI-48 하드웨어 주소로 장치 식별
  • 속도 진화 — 10M → 100M → 1G → 10G → 25G → 40G → 100G → 200G → 400G → 800G
  • 물리 계층 독립 — 동축, UTP, 광섬유, 백플레인 등 다양한 매체 지원
  • 리눅스 커널struct ethhdr, eth_type_trans(), ethtool_ops, phylink 프레임워크로 구현

역사와 진화

이더넷의 발전 과정은 컴퓨터 네트워킹 역사 그 자체입니다.

연도표준/기술속도매체의의
1973Xerox Ethernet (실험)2.94 Mbps동축 케이블Robert Metcalfe, Xerox PARC에서 최초 구현
1980DIX Ethernet (v1.0)10 Mbps동축 (Thick)DEC-Intel-Xerox 공동 표준, EtherType 필드 도입
1983IEEE 802.3 (10BASE5)10 MbpsThick 동축첫 IEEE 표준화, CSMA/CD 공식 규정
198510BASE2 (Thin Ethernet)10 MbpsThin 동축 (RG-58)저비용 동축, 185m 세그먼트
199010BASE-T10 MbpsUTP Cat3트위스트 페어 혁명, 스타 토폴로지 전환
1995802.3u (Fast Ethernet)100 MbpsUTP Cat5 / 광100BASE-TX, Auto-Negotiation 도입
1998802.3z (Gigabit Ethernet)1 Gbps광섬유1000BASE-SX/LX, 8B/10B 부호화
1999802.3ab1 GbpsUTP Cat5e1000BASE-T, PAM-5 4쌍 전송
2002802.3ae (10GbE)10 Gbps광섬유CSMA/CD 사실상 폐기, 전이중 전용
2006802.3an (10GBASE-T)10 GbpsUTP Cat6a구리선 10G, LDPC 부호화
2010802.3ba40/100 Gbps광섬유다중 레인(4×10G, 10×10G, 4×25G)
2016802.3by (25GbE)25 GbpsSFP28서버 연결 최적 대역폭
2017802.3bs200/400 Gbps광섬유PAM4 변조, 데이터센터 스파인
2024802.3df800 Gbps/1.6 Tbps광섬유AI 클러스터, 100G 레인 기술
1973 2.94M 1983 10M 1995 100M 1999 1G 2002 10G 2010 100G 2017 400G 2024 800G Xerox 10BASE5 Fast Eth GbE 10GbE 40/100G 200/400G 800G 이더넷 속도 진화 타임라인 (1973 ~ 2024) 공유 매체 + CSMA/CD 전이중 스위칭 다중 레인 + PAM4

CSMA/CD와 충돌 도메인

초기 이더넷의 핵심 프로토콜인 CSMA/CD(Carrier Sense Multiple Access / Collision Detection)는 공유 매체에서의 다중 접근 문제를 해결합니다.

알고리즘 단계

  1. Carrier Sense — 전송 전 매체가 유휴 상태인지 확인
  2. Transmit — 유휴 시 프레임 전송 시작
  3. Collision Detection — 전송 중 충돌 감지 시 jam 신호(32비트) 발송
  4. Backoff — Binary Exponential Backoff 알고리즘으로 재전송 지연
    • n번째 충돌 시: 0 ~ 2min(n,10)-1 슬롯 중 랜덤 선택
    • 슬롯 시간: 10 Mbps에서 51.2 μs (512 bit times)
    • 16번 충돌 시 전송 포기
Binary Exponential Backoff 수학: n번째 충돌 시 대기 시간은 random(0, 2^min(n,10) - 1) x 슬롯시간입니다. 예를 들어 3번째 충돌이면 0~7 슬롯(0~358.4 us @10Mbps) 중 랜덤 선택합니다. 지수를 min(n,10)으로 제한하는 이유는 2^16 = 65,536 슬롯(약 3.35초)이면 대기 시간이 과도하기 때문입니다. n=10에서 최대 1,023 슬롯(약 52.4ms)으로 캡됩니다.
현대 이더넷과 CSMA/CD: 802.3ae(10GbE) 이후 표준은 전이중(Full-Duplex) 전용이므로 CSMA/CD가 적용되지 않습니다. 하지만 반이중(Half-Duplex) 모드가 여전히 사양에 존재하며, 리눅스 커널의 ethtool에서도 duplex 설정을 확인할 수 있습니다.

충돌 도메인 vs 브로드캐스트 도메인

구분충돌 도메인브로드캐스트 도메인
정의동시 전송 시 충돌이 발생하는 범위브로드캐스트 프레임이 도달하는 범위
분리 장비스위치, 브릿지 (포트별 분리)라우터, VLAN
허브모든 포트가 하나의 충돌 도메인모든 포트가 하나의 브로드캐스트 도메인
스위치포트별 독립 충돌 도메인전체가 하나의 브로드캐스트 도메인
CSMA/CD 알고리즘 흐름도 프레임 전송 대기 Carrier Sense 매체 유휴? Busy 대기 (IFG) Idle 프레임 전송 충돌 감지? Collision? No 전송 성공 Yes Jam 신호 32비트 전송 재시도 < 16? n < 16? No 전송 포기 Yes Backoff 대기 0~2^min(n,10)-1 슬롯 IFG(Inter-Frame Gap): 96 bit times (9.6us@10M, 0.96us@100M) | 슬롯 시간: 512 bit times (51.2us@10M) | Jam: 32 bits

프레임 구조

이더넷 프레임은 여러 변형이 존재합니다. 가장 널리 사용되는 Ethernet II(DIX)와 IEEE 802.3 프레임을 비교합니다.

이더넷 프레임 구조 비교 Ethernet II (DIX) Preamble 7 bytes SFD 1 byte Dst MAC 6 bytes Src MAC 6 bytes EtherType 2 bytes Payload (데이터) 46 ~ 1500 bytes FCS 4 bytes IEEE 802.3 + LLC/SNAP Preamble 7 bytes SFD 1 byte Dst MAC 6 bytes Src MAC 6 bytes Length ≤1500 LLC 3 bytes SNAP 5 bytes Payload 38 ~ 1492 bytes FCS 4 bytes 802.1Q VLAN Tagged Dst MAC 6 bytes Src MAC 6 bytes TPID 0x8100 TCI 2 bytes EtherType 2 bytes Payload 42 ~ 1500 bytes FCS 4 bytes EtherType/Length 판별: 값 ≥ 0x0600 → EtherType (Ethernet II), 값 ≤ 0x05DC → Length (802.3)

주요 EtherType 값

EtherType프로토콜커널 상수
0x0800IPv4ETH_P_IP
0x0806ARPETH_P_ARP
0x8100802.1Q VLANETH_P_8021Q
0x86DDIPv6ETH_P_IPV6
0x8847MPLS UnicastETH_P_MPLS_UC
0x88A8802.1ad (QinQ)ETH_P_8021AD
0x88CCLLDPETH_P_LLDP
0x88F7PTP (IEEE 1588)ETH_P_1588
0x8906FCoEETH_P_FCOE

Jumbo Frames

표준 이더넷 MTU(1500바이트)를 넘는 Jumbo Frame(최대 9000바이트)은 데이터센터 환경에서 처리량을 높이고 CPU 오버헤드를 줄입니다.

# MTU 변경
ip link set eth0 mtu 9000

# 확인
ip -d link show eth0 | grep mtu

# 경로 MTU 확인
tracepath -n 192.168.1.1
주의: Jumbo Frame은 경로상 모든 장비(NIC, 스위치, 라우터)에서 지원해야 합니다. 중간에 MTU가 다르면 단편화나 패킷 드롭이 발생합니다.

물리 계층 (PHY)

이더넷 물리 계층은 전기/광학 신호로 데이터를 실제 매체에 전송하는 역할을 합니다. PHY 칩은 MAC 계층과 표준화된 인터페이스(MII 계열)로 연결됩니다.

MAC-PHY 인터페이스 비교

인터페이스속도데이터 폭클럭핀 수용도
MII10/100 Mbps4비트25 MHz18Fast Ethernet
RMII10/100 Mbps2비트50 MHz10임베디드 (핀 절약)
GMII1 Gbps8비트125 MHz24Gigabit Ethernet
RGMII10/100/1G4비트 DDR125 MHz12가장 널리 사용
SGMII10/100/1G직렬625 MHz4 (SerDes)SoC, 백플레인
QSGMII4×1G직렬5 GHz44포트 통합
XGMII10 Gbps32비트 DDR156.25 MHz7410GbE 내부
XFI/SFI10 Gbps직렬10.3125 GHz2SFP+ 모듈
USXGMII10/5/2.5/1G직렬10.3125 GHz2멀티기가비트
25GAUI25 Gbps직렬25.78125 GHz2SFP28
MAC - PHY - 매체 연결 구조 SoC / NIC MAC 프레임 처리 DMA Ring Buffer MDIO/MDC 관리 버스 RGMII TXD[3:0], RXD[3:0] TX_CLK, RX_CLK PHY Chip PCS (부호화) PMA (변조) PMD (전기/광) 레지스터 R/W MDI RJ45 또는 SFP UTP/광 Auto-Negotiation (FLP)

PHY 하위 계층

SFP/QSFP 모듈

광/전기 트랜시버 모듈은 이더넷 PHY의 PMD 계층을 교체 가능한 형태로 분리합니다. SFF(Small Form Factor) 규격에 따라 다양한 폼팩터가 존재합니다.

모듈최대 속도레인전기/광케이지 폭주요 용도
SFP1 Gbps1광/전기13.4mm액세스, 서버 1GbE
SFP+10 Gbps1광/DAC13.4mm서버, ToR 스위치
SFP2825 Gbps1광/DAC13.4mm25GbE 서버, 5G 프론트홀
QSFP+40 Gbps4×10G광/DAC18.4mm스파인-리프 40GbE
QSFP28100 Gbps4×25G광/DAC18.4mm100GbE 데이터센터
QSFP-DD400 Gbps8×50G18.4mm (2열)400GbE 코어/DCI

DOM(Digital Optical Monitoring)을 통해 트랜시버 상태를 실시간 모니터링할 수 있습니다.

# SFP/QSFP 모듈 정보 확인 (DOM 포함)
ethtool -m eth0

# 주요 DOM 항목:
#   Temperature   : 35.50 degrees C  (모듈 온도)
#   Voltage       : 3.30 V           (공급 전압)
#   TX Bias       : 6.75 mA          (레이저 바이어스 전류)
#   TX Power      : -1.20 dBm        (송신 광출력)
#   RX Power      : -3.50 dBm        (수신 광출력)

# 모듈 타입 확인
ethtool -m eth0 | grep "Identifier"

# 리눅스 커널 SFP 프레임워크 로그
dmesg | grep -i sfp
SFP/QSFP 모듈 폼팩터 비교 SFP 1G / 1 lane SFP+ 10G / 1 lane SFP28 25G / 1 lane QSFP+ 40G / 4×10G QSFP28 100G / 4×25G QSFP-DD 400G / 8×50G (Double Density) ← 동일 케이지 (SFP) → ← 동일 케이지 (QSFP) → 속도/레인 비교 SFP 1G SFP+ 10G SFP28 25G QSFP+ 40G (4 lanes) QSFP28 100G (4 lanes) QSFP-DD 400G (8 lanes)

라인 코딩 진화

속도부호화효율변조
10 MbpsManchester50%NRZ
100 Mbps4B/5B + MLT-380%3레벨
1 Gbps8B/10B (광) / PAM-5 (UTP)80% / 4쌍5레벨 4쌍 병렬
10 Gbps64B/66B97%PAM-2 (광) / DSQ128 (UTP)
25/50/100G64B/66B + RS-FEC97%NRZ 또는 PAM4
200/400/800G64B/66B + RS-FEC97%PAM4, 다중 레인
RGMII 지연 모드 주의: RGMII(Reduced GMII) 인터페이스는 TXC/RXC 클럭에 2ns 지연이 필요합니다. 지연은 MAC, PHY, PCB 트레이스 중 정확히 한 곳에서만 추가해야 합니다. 이중 지연(rgmii-id + PHY 내부 지연)이 되면 링크 불안정, CRC 오류, 간헐적 패킷 손실이 발생합니다. Device Tree에서 phy-mode = "rgmii-id"(PHY가 TX/RX 지연 모두 추가), "rgmii-txid", "rgmii-rxid"를 정확히 설정하세요.

Multi-Gigabit 이더넷

IEEE 802.3bz(2016년)는 기존 Cat5e/Cat6 케이블에서 1 Gbps 이상 속도를 지원하는 NBASE-T(2.5GBASE-T, 5GBASE-T) 표준을 정의했습니다. 기존 케이블 인프라를 교체하지 않고 속도를 향상할 수 있어 Wi-Fi 6/6E AP 백홀, 데스크톱 업그레이드에 널리 채택되고 있습니다.

표준속도케이블 요구최대 거리부호화
1000BASE-T1 GbpsCat5e 이상100mPAM-5 (4쌍)
2.5GBASE-T2.5 GbpsCat5e 이상100mPAM-16 (DSQ128)
5GBASE-T5 GbpsCat5e(55m) / Cat6(100m)55~100mPAM-16 (DSQ128)
10GBASE-T10 GbpsCat6a 이상100mPAM-16 (DSQ128)
Multi-Gig 팁: ethtool에서 2500baseT/Full, 5000baseT/Full 등 advertise 가능 속도를 확인할 수 있습니다. Cat5e 케이블에서 5GBASE-T 연결 시 거리가 55m를 초과하면 링크 불안정이 발생할 수 있으므로 반드시 케이블 테스터로 확인하세요.

Auto-Negotiation

Auto-Negotiation(자동 협상)은 IEEE 802.3 Clause 28/37/73에 정의된 링크 파트너 간 능력 교환 프로토콜입니다.

협상 과정

  1. FLP 교환 — Fast Link Pulse 버스트로 기본 페이지(Base Page) 교환
  2. 능력 비교 — 양쪽이 지원하는 최고 공통 속도/듀플렉스 선택
  3. 우선순위 — 100BASE-TX FD > 100BASE-TX HD > 10BASE-T FD > 10BASE-T HD
  4. 링크 확립 — 합의된 모드로 PHY 설정 완료
Auto-Negotiation FLP 교환 과정 Local PHY Remote PHY ① FLP Burst 교환 ② Base Page (능력 광고) Selector: 802.3 Tech: 1000T/100TX/10T ③ 능력 비교 + 우선순위 결정 최고 공통 속도/듀플렉스 선택 우선순위 (높음↑) 1000BASE-T FD 1000BASE-T HD 100BASE-TX FD 100BASE-TX HD 10BASE-T FD/HD ④ 링크 확립 (Link Up) 예: 1000BASE-T FD

리눅스에서의 제어

# 현재 링크 설정 확인
ethtool eth0

# Auto-Negotiation 끄고 강제 설정
ethtool -s eth0 speed 1000 duplex full autoneg off

# Auto-Negotiation 광고 능력 제한 (1G만)
ethtool -s eth0 autoneg on advertise 0x020

# 지원하는 링크 모드 확인
ethtool eth0 | grep "Supported link modes"

커널 자료구조

리눅스 커널에서 이더넷 프레임을 처리하는 핵심 자료구조입니다.

struct ethhdr

/* include/uapi/linux/if_ether.h */
struct ethhdr {
    unsigned char  h_dest[ETH_ALEN];    /* 목적지 MAC (6 bytes) */
    unsigned char  h_source[ETH_ALEN];  /* 출발지 MAC (6 bytes) */
    __be16         h_proto;             /* EtherType 또는 Length */
} __attribute__((packed));

/* 주요 상수 */
#define ETH_ALEN     6      /* MAC 주소 길이 */
#define ETH_HLEN     14     /* 이더넷 헤더 길이 */
#define ETH_ZLEN     60     /* 최소 프레임 (FCS 제외) */
#define ETH_DATA_LEN 1500   /* 최대 페이로드 */
#define ETH_FRAME_LEN 1514  /* 최대 프레임 (FCS 제외) */
#define ETH_FCS_LEN  4      /* FCS 길이 */

eth_type_trans() 프로토콜 판별

/* net/ethernet/eth.c */
__be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)
{
    struct ethhdr *eth;

    skb->dev = dev;
    skb_reset_mac_header(skb);       /* MAC 헤더 위치 기록 */
    eth = (struct ethhdr *)skb->data;
    skb_pull_inline(skb, ETH_HLEN);  /* data 포인터를 페이로드로 이동 */

    /* 수신 패킷 유형 분류 */
    if (unlikely(is_multicast_ether_addr(eth->h_dest))) {
        if (ether_addr_equal_64bits(eth->h_dest, dev->broadcast))
            skb->pkt_type = PACKET_BROADCAST;
        else
            skb->pkt_type = PACKET_MULTICAST;
    } else if (unlikely(!ether_addr_equal_64bits(eth->h_dest, dev->dev_addr)))
        skb->pkt_type = PACKET_OTHERHOST;

    /* EtherType vs Length 판별 */
    if (likely(ntohs(eth->h_proto) >= ETH_P_802_3_MIN))
        return eth->h_proto;  /* Ethernet II: EtherType 그대로 */

    /* 802.3 프레임: LLC/SNAP 확인 후 프로토콜 결정 */
    ...
}

ethtool_ops 구조체

NIC 드라이버가 구현하는 ethtool_opsethtool 유틸리티의 백엔드입니다.

/* include/linux/ethtool.h (주요 콜백) */
struct ethtool_ops {
    void (*get_drvinfo)(...);           /* 드라이버 정보 */
    int  (*get_link_ksettings)(...);     /* 링크 속도/듀플렉스 조회 */
    int  (*set_link_ksettings)(...);     /* 링크 설정 변경 */
    void (*get_ethtool_stats)(...);      /* NIC 통계 */
    void (*get_strings)(...);             /* 통계 이름 문자열 */
    int  (*get_sset_count)(...);          /* 통계 세트 크기 */
    u32  (*get_link)(...);                /* 링크 상태 */
    int  (*get_coalesce)(...);            /* 인터럽트 병합 설정 */
    int  (*set_coalesce)(...);            /* 인터럽트 병합 변경 */
    void (*get_ringparam)(...);           /* 링 버퍼 크기 */
    int  (*set_ringparam)(...);           /* 링 버퍼 변경 */
    int  (*get_rxnfc)(...);               /* RSS/ntuple 규칙 */
    int  (*get_ts_info)(...);             /* 타임스탬프 능력 */
    int  (*get_eee)(...);                 /* EEE 설정 조회 */
    int  (*set_eee)(...);                 /* EEE 설정 변경 */
};

리눅스 커널 5.x부터 phylink은 기존 phylib(phy_device)를 확장하여 MAC-PHY 연결을 통합 관리합니다. SFP 모듈 핫플러그, 다중 PHY 인터페이스 모드, in-band Auto-Negotiation을 지원합니다.

phylink 프레임워크 아키텍처 ethtool / ip link net_device (MAC 드라이버) phylink 상태 머신 + SFP 관리 mac_ops phylib (phy_device) PHY 드라이버 sfp-bus SFP 모듈 감지 SFP/SFP+ 광 모듈 MDIO bus Clause 22/45 phylink_mac_ops phy_driver
/* include/linux/phylink.h */
struct phylink_mac_ops {
    void (*mac_config)(...);           /* MAC 인터페이스 모드 설정 */
    void (*mac_link_down)(...);        /* 링크 다운 처리 */
    void (*mac_link_up)(...);          /* 링크 업 처리 (속도/듀플렉스 적용) */
    int  (*mac_prepare)(...);           /* 모드 전환 준비 */
    int  (*mac_finish)(...);            /* 모드 전환 완료 */
    void (*mac_select_pcs)(...);       /* PCS 선택 (SGMII 등) */
};

패킷 송수신 경로

이더넷 프레임이 커널에서 처리되는 핵심 경로입니다.

이더넷 프레임 수신 경로 (RX Path) 이더넷 케이블 NIC Hardware MAC Filter → DMA IRQ napi_schedule() NAPI poll() RX Ring 소비 skb 할당 build_skb() / napi_alloc eth_type_trans() EtherType 판별 + pkt_type napi_gro_receive() GRO 병합 시도 netif_receive_skb() 프로토콜 핸들러 디스패치 프로토콜 핸들러 ip_rcv() (0x0800) ipv6_rcv() (0x86DD) arp_rcv() (0x0806) TC ingress 트래픽 제어 (선택) XDP NAPI 이전 처리 이더넷 프레임 송신 경로 (TX Path) User Space send() / write() tcp_sendmsg() skb 생성, 세그먼트 분할 ip_output() IP 헤더 + 라우팅 dev_queue_xmit() eth_header() 이더넷 헤더 TC qdisc 큐잉/스케줄링 TSO / GSO 대형 세그먼트 → MTU 분할 TX Checksum CHECKSUM_PARTIAL 설정 ndo_start_xmit() 드라이버 TX 진입점 TX Ring Buffer DMA descriptor 매핑 Doorbell MMIO Write NIC Hardware DMA Read → PHY 전송 TX 완료 IRQ → skb 해제 consume_skb() / napi_consume_skb() BQL (Byte Queue Limit) bufferbloat 방지, 큐 깊이 제한 XPS (Transmit Packet Steering) CPU → TX Queue 매핑

하드웨어 오프로드

현대 NIC은 CPU 부담을 줄이기 위해 다양한 하드웨어 오프로드를 지원합니다.

오프로드 유형

오프로드방향기능ethtool 기능명
TX Checksum송신IP/TCP/UDP 체크섬을 NIC에서 계산tx-checksum-ipv4
RX Checksum수신수신 패킷 체크섬 HW 검증rx-checksum
TSO (TCP Segmentation Offload)송신대형 TCP 세그먼트를 NIC에서 분할tx-tcp-segmentation
GSO (Generic Segmentation Offload)송신SW 폴백 세그멘테이션tx-generic-segmentation
GRO (Generic Receive Offload)수신소형 패킷을 대형으로 병합rx-gro
LRO (Large Receive Offload)수신HW에서 대형 세그먼트 조합 (deprecated)rx-lro
RSS (Receive Side Scaling)수신해시 기반 멀티큐 분산rx-hashing
Scatter-Gather송신비연속 메모리 DMA 전송tx-scatter-gather

오프로드 확인/설정

# 현재 오프로드 상태 확인
ethtool -k eth0

# TSO 비활성화 (디버깅용)
ethtool -K eth0 tso off

# GRO 비활성화
ethtool -K eth0 gro off

# RSS 해시 키/indirection table 확인
ethtool -x eth0

# RSS 해시 필드 설정 (TCP 4-tuple)
ethtool -N eth0 rx-flow-hash tcp4 sdfn

# 링 버퍼 크기 조정
ethtool -G eth0 rx 4096 tx 4096

# 인터럽트 병합 (Coalescing) 설정
ethtool -C eth0 rx-usecs 50 rx-frames 64

Pause 프레임과 흐름 제어

IEEE 802.3x Pause Frame은 수신 버퍼 오버플로우 방지를 위한 L2 흐름 제어 메커니즘입니다.

흐름 제어 유형

유형표준동작단점
Symmetric Pause802.3x양쪽 모두 Pause 전송 가능한 포트 혼잡 시 전체 링크 중단
Asymmetric Pause802.3x한쪽만 Pause 전송유연하지만 설정 복잡
PFC (Priority Flow Control)802.1Qbb우선순위별 독립 제어 (8개 클래스)DCB 전체 구성 필요
# Pause 프레임 설정
ethtool -A eth0 rx on tx on

# PFC 설정 (DCB)
mlnx_qos -i eth0 --pfc 0,0,0,1,0,0,0,0  # TC3만 PFC 활성화
ICE 802.3x 흐름 제어 주의: Intel E810(ice)은 기본적으로 Pause 프레임이 비활성화됩니다. 802.3x Pause를 사용하려면 양측 모두 ethtool -A ethX rx on tx on으로 활성화해야 합니다. 한쪽만 활성화하면 포트가 hang 상태에 빠질 수 있으므로 반드시 양단 설정을 동기화하세요.
# ICE 흐름 제어 확인 및 양단 동기화
ethtool -a eth0              # RX/TX Pause 상태 확인
ethtool -A eth0 rx on tx on  # 양측 모두 활성화 필수

ECN과 DCB

ECN(Explicit Congestion Notification, RFC 3168)은 패킷 드롭 없이 혼잡을 알리는 메커니즘입니다. DCB(Data Center Bridging)는 데이터센터 이더넷에서 무손실 전송을 위한 IEEE 표준 집합입니다.

ECN 마킹 과정

송신 측이 IP 헤더의 ECN 필드를 ECT(0) 또는 ECT(1)로 설정하면, 혼잡한 스위치/라우터가 이를 CE(Congestion Experienced)로 변경합니다. 수신 측은 TCP ACK에 ECE 플래그를 설정하여 송신 측에 혼잡을 알리고, 송신 측은 CWR 플래그로 윈도우 축소를 확인합니다.

DCB 컴포넌트

컴포넌트표준기능리눅스 도구
ETS (Enhanced Transmission Selection)802.1Qaz트래픽 클래스별 대역폭 보장/분배mlnx_qos, lldptool
PFC (Priority Flow Control)802.1Qbb우선순위별 독립 흐름 제어 (8 TC)mlnx_qos --pfc
CN (Congestion Notification)802.1Qau혼잡 지점에서 rate limiter 피드백lldptool
DCBX802.1QazDCB 파라미터 자동 협상 (LLDP 확장)lldpad, dcbtool
# ECN 활성화 (리눅스 커널)
sysctl -w net.ipv4.tcp_ecn=1      # ECN 활성화 (요청 및 수락)
sysctl -w net.ipv4.tcp_ecn=2      # ECN 서버 모드 (수락만)

# DCB 상태 확인
mlnx_qos -i eth0

# ETS (Enhanced Transmission Selection) 대역폭 분배
mlnx_qos -i eth0 --tc_bw 10,10,10,40,10,10,5,5

# DCBX 모드 확인/설정
lldptool -ti eth0 -V IEEE-DCBX
lldptool -Ti eth0 -V ETS-CFG willing=yes

# RoCE (RDMA over Converged Ethernet)용 PFC + ECN 설정
# TC3에 PFC 활성화, ECN으로 혼잡 관리
mlnx_qos -i eth0 --pfc 0,0,0,1,0,0,0,0
sysctl -w net.ipv4.tcp_ecn=1

ICE DCB 운영 — DCBX 모드와 FW-LLDP

Intel E810(ice)은 DCBX 협상을 펌웨어(FW-LLDP) 또는 소프트웨어(SW-LLDP)에서 처리할 수 있습니다. 기본값은 FW-LLDP이며, lldpad와의 통합이 필요한 환경에서는 SW-LLDP로 전환합니다.

모드LLDP 에이전트장점제약
FW-LLDP (기본)펌웨어가 LLDPDU 송수신OS 부팅 전에도 DCBX 협상 가능lldpad와 동시 사용 불가
SW-LLDPlldpad 데몬이 관리유연한 정책 제어, 다중 NIC 통합 관리OS 준비 전 DCBX 미동작
# FW-LLDP ↔ SW-LLDP 전환 (private flag)
ethtool --set-priv-flags eth0 fw-lldp-agent off  # SW-LLDP 활성화
ethtool --set-priv-flags eth0 fw-lldp-agent on   # FW-LLDP 복원

# 현재 LLDP 모드 확인
ethtool --show-priv-flags eth0 | grep fw-lldp

# ICE DCB 상태 확인
lldptool -ti eth0 -V IEEE-DCBX

# TC0에 최소 대역폭 할당 (ICE 필수 조건: TC0은 항상 존재해야 함)
lldptool -Ti eth0 -V ETS-CFG tcbw=50,50,0,0,0,0,0,0 tsa=ets,ets,strict,strict,strict,strict,strict,strict up2tc=0:0,1:0,2:1,3:1,4:0,5:0,6:0,7:0
ICE DCB 핵심 제약: ICE에서 DCB를 운영할 때 TC0(Traffic Class 0)은 반드시 존재해야 합니다. TC0을 제거하거나 대역폭 0%로 설정하면 드라이버가 설정을 거부합니다. 또한 FW-LLDP 모드에서 lldpad를 동시에 구동하면 LLDPDU 충돌이 발생하므로 한쪽을 반드시 비활성화하세요.

VLAN과 QinQ

IEEE 802.1Q VLAN 태깅은 하나의 물리적 이더넷 링크에서 논리적 네트워크를 분리합니다.

VLAN 태그 구조 (4바이트)

필드비트설명
TPID16Tag Protocol Identifier (0x8100)
PCP3Priority Code Point (QoS 우선순위 0~7)
DEI1Drop Eligible Indicator
VID12VLAN Identifier (0~4095, 유효: 1~4094)

리눅스 VLAN 설정

# VLAN 인터페이스 생성
ip link add link eth0 name eth0.100 type vlan id 100
ip link set eth0.100 up
ip addr add 10.0.100.1/24 dev eth0.100

# QinQ (802.1ad) — 서비스 프로바이더 VLAN
ip link add link eth0 name eth0.200 type vlan proto 802.1ad id 200
ip link add link eth0.200 name eth0.200.10 type vlan id 10

# VLAN 오프로드 확인
ethtool -k eth0 | grep vlan
ICE QinQ 제한사항: Intel E810(ice)에서 QinQ(802.1ad) 사용 시 다음 제약이 있습니다:
  • RX 체크섬 오프로드 미지원 — QinQ 패킷의 하드웨어 체크섬 검증이 동작하지 않으므로 소프트웨어 검증에 의존
  • VLAN stripping 비활성화 필요 — QinQ 동작을 위해 ethtool -K eth0 rxvlan off로 HW VLAN stripping을 꺼야 함
  • VF QinQ 송신 조건 — VF에서 QinQ 패킷을 송신하려면 PF에서 해당 VF에 outer VLAN을 할당해야 함 (ip link set eth0 vf 0 vlan 200 proto 802.1ad)

EEE (Energy Efficient Ethernet)

IEEE 802.3az Energy Efficient Ethernet은 트래픽이 없을 때 PHY를 저전력 유휴(LPI) 상태로 전환하여 에너지를 절약합니다.

EEE (802.3az) 상태 전이 Active 전체 전력, 전송 중 LPI Sleep 저전력 유휴 Wake 복귀 중 (Tw) 유휴 감지 (Ts) 전송 필요 복귀 완료 → Active 주기적 Refresh
# EEE 상태 확인
ethtool --show-eee eth0

# EEE 비활성화 (지연 민감 환경)
ethtool --set-eee eth0 eee off

# EEE 활성화 (1GbE만)
ethtool --set-eee eth0 eee on advertise 0x8
성능 참고: EEE의 LPI→Active 복귀에 수 마이크로초 지연이 발생합니다. 지연에 민감한 환경(금융 트레이딩, 실시간 시스템)에서는 EEE를 비활성화하는 것이 좋습니다.

TSN (Time-Sensitive Networking)

IEEE 802.1 TSN 태스크 그룹은 이더넷 위에 확정적 지연(Deterministic Latency)과 시간 동기화를 구현하는 표준 집합입니다. 산업 자동화, 자동차, 방송 분야에서 전용 필드버스를 대체합니다.

핵심 TSN 표준

표준이름기능
802.1ASgPTP (Generalized PTP)네트워크 전체 시간 동기화 (<1 μs 정밀도)
802.1QbvTime-Aware Shaper (TAS)시간 기반 게이트 제어, 트래픽 클래스별 전송 시간대 할당
802.1Qbu/802.3brFrame Preemption우선순위 높은 프레임이 낮은 프레임 전송을 중단 가능
802.1CBFRER (Frame Replication and Elimination)프레임 복제로 무손실 전송 보장
802.1QciPer-Stream Filtering and Policing스트림별 필터링/폴리싱
802.1QccStream Reservation Protocol경로/대역폭 예약 관리
TSN vs 일반 이더넷: 일반 이더넷은 Best-Effort 전달만 보장하여 지연과 지터(jitter)가 불확실합니다. TSN은 시간 동기화(802.1AS), 게이트 제어(802.1Qbv), 프레임 선점(802.1Qbu)을 조합하여 확정적 지연을 달성합니다. 산업 환경에서 전용 필드버스(PROFIBUS, CAN 등)를 TSN 이더넷으로 대체하면 단일 물리 네트워크에서 실시간 제어 트래픽과 일반 IT 트래픽을 공존시킬 수 있습니다.

리눅스 TSN 지원

TSN TAS (802.1Qbv) Gate Control 타임라인 시간 0 300us 600us 1ms (사이클) TC0 (Critical) OPEN (S=01) CLOSED CLOSED TC1 (Scheduled) CLOSED OPEN (S=02) CLOSED TC2 (Best Effort) CLOSED CLOSED OPEN (S=04) Guard Band (전환 보호) 각 슬롯에서 해당 TC만 전송 가능 → 확정적 지연 보장
# TAS (Time-Aware Shaper) 설정 - taprio qdisc
tc qdisc replace dev eth0 parent root handle 100 taprio \
    num_tc 3 \
    map 2 2 1 0 2 2 2 2 2 2 2 2 2 2 2 2 \
    queues 1@0 1@1 2@2 \
    base-time 0 \
    sched-entry S 01 300000 \
    sched-entry S 02 300000 \
    sched-entry S 04 400000 \
    flags 0x2

# CBS (Credit-Based Shaper) - cbs qdisc
tc qdisc add dev eth0 parent 100:1 cbs \
    idleslope 98688 sendslope -901312 \
    hicredit 153 locredit -1389

# ETF (Earliest TxTime First) - 정밀 전송 시간 제어
tc qdisc add dev eth0 parent 100:2 etf \
    clockid CLOCK_TAI delta 200000 offload

산업용 이더넷

표준 이더넷 프레임을 기반으로 실시간 산업 통신을 구현하는 프로토콜들입니다.

프로토콜계층사이클 시간리눅스 지원
PROFINET RTL2 (EtherType 0x8892)~1 msRaw socket / AF_PACKET
PROFINET IRTL2 + HW 스케줄링31.25 μsTSN + 전용 NIC
EtherCATL2 (EtherType 0x88A4)~50 μsIgH EtherCAT Master
EtherNet/IPTCP/UDP (CIP)~1 ms표준 소켓 API
Modbus/TCPTCP (포트 502)~10 ms표준 소켓 API
OPC UA TSNTSN + UDP<1 msopen62541 + taprio

성능 튜닝

이더넷 네트워크 성능을 최적화하는 주요 커널/드라이버 파라미터입니다.

링 버퍼 최적화

TX/RX Descriptor Ring Buffer 구조 RX Ring Desc 0 Desc 1 Desc 2 Desc 3 ▼ NIC DMA (Producer) ▲ NAPI poll (Consumer) NIC HW DMA Engine 시스템 메모리 skb 데이터 버퍼 완료 IRQ napi_schedule TX Ring Desc 0 Desc 1 Desc 2 Desc 3 ▼ Driver (Producer) ▲ NIC HW (Consumer) dev_queue_xmit skb → descriptor Doorbell MMIO Write NIC 전송 DMA Read Descriptor 구조 • buffer_addr: 데이터 버퍼의 물리 주소 (DMA 가능) • length: 버퍼 크기 / 수신 패킷 길이 • status/flags: DD(Done), EOP(End of Packet), VLAN tag 등 • vlan/checksum: VLAN ID, HW 체크섬 결과 ⚠ RX Ring이 가득 차면 → rx_missed_errors ⚠ TX Ring이 가득 차면 → netif_stop_queue() ✓ NAPI poll이 Ring을 비워야 새 패킷 수신 가능 ✓ TX 완료 IRQ에서 skb 해제 (consume_skb)
# 링 버퍼 현재 크기 확인
ethtool -g eth0

# 링 버퍼 최대로 설정 (패킷 드롭 방지)
ethtool -G eth0 rx 4096 tx 4096

# 인터럽트 병합 (지연 vs 처리량 트레이드오프)
ethtool -C eth0 adaptive-rx on adaptive-tx on
Adaptive Coalescing: adaptive-rx on을 사용하면 드라이버가 트래픽 패턴에 따라 인터럽트 병합 파라미터를 자동 조절합니다. 저부하 시 지연을 최소화하고, 고부하 시 인터럽트 수를 줄여 CPU 사용률을 낮춥니다. Intel igb/ixgbe/ice, Mellanox mlx5 등 주요 드라이버가 지원합니다.
Interrupt Coalescing 전략 비교 No Coalescing (IRQ Storm) 시간 패킷 1개마다 IRQ 발생 지연: 최소 (~0 us) CPU: 매우 높음 고부하 시 CPU 포화 Static Coalescing 시간 4 pkts 4 pkts rx-usecs / rx-frames 고정 지연: 중간 (설정값 고정) CPU: 중간 저부하 시 불필요한 지연 Adaptive Coalescing 시간 1p 8 pkts 트래픽에 따라 자동 조절 저부하: 낮은 지연 고부하: 낮은 CPU 권장 (adaptive-rx on)
# 멀티큐 확인
ethtool -l eth0

# 큐 수 변경
ethtool -L eth0 combined 8

IRQ 어피니티

# NIC IRQ 확인
grep eth0 /proc/interrupts

# IRQ 어피니티 자동 설정 스크립트
set_irq_affinity eth0

# 수동 설정: IRQ 42번을 CPU 0에 바인딩
echo 1 > /proc/irq/42/smp_affinity

# XPS (Transmit Packet Steering) 설정
echo 1 > /sys/class/net/eth0/queues/tx-0/xps_cpus

sysctl 네트워크 튜닝

# 수신 버퍼
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.rmem_default=1048576

# 송신 버퍼
sysctl -w net.core.wmem_max=16777216
sysctl -w net.core.wmem_default=1048576

# 네트워크 백로그
sysctl -w net.core.netdev_max_backlog=30000
sysctl -w net.core.netdev_budget=600

# TCP 자동 튜닝
sysctl -w net.ipv4.tcp_rmem="4096 1048576 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 1048576 16777216"

FCS와 CRC-32

이더넷 프레임의 마지막 4바이트 FCS(Frame Check Sequence)는 CRC-32 다항식으로 계산됩니다.

/* 커널 CRC-32 API */
#include <linux/crc32.h>

u32 crc = crc32_le(~0, data, len);  /* Little-endian CRC-32 */
u32 fcs = ~crc;                       /* 최종 보수(complement) */

PTP와 하드웨어 타임스탬프

IEEE 1588 PTP(Precision Time Protocol)는 이더넷 네트워크에서 나노초 수준 시간 동기화를 달성합니다.

PTP 동기화 메시지 교환 (IEEE 1588) Master Slave ① Sync (t1) t1 기록 ② Follow_Up (t1 전달) t2 기록 ③ Delay_Req (t3) t3 기록 ④ Delay_Resp (t4 전달) t4 기록 오프셋 계산: offset = ((t2-t1)-(t4-t3))/2 delay = ((t2-t1)+(t4-t3))/2 시간 →
# PTP 하드웨어 타임스탬프 능력 확인
ethtool -T eth0

# linuxptp로 PTP 동기화
ptp4l -i eth0 -m -H  # Hardware timestamping
phc2sys -s eth0 -c CLOCK_REALTIME -O 0 -m

# PHC (PTP Hardware Clock) 확인
cat /sys/class/ptp/ptp0/clock_name

WoL (Wake-on-LAN)

Wake-on-LAN은 이더넷을 통해 원격으로 시스템을 깨우는 기능입니다. 매직 패킷(목적지 MAC 6회 반복)을 수신하면 NIC이 시스템에 웨이크업 신호를 보냅니다.

WoL Magic Packet 구조 FF:FF:FF:FF:FF:FF 동기화 (6바이트) Target MAC #1 AA:BB:CC:DD:EE:FF Target MAC #2 AA:BB:CC:DD:EE:FF ··· Target MAC #16 AA:BB:CC:DD:EE:FF 총 102바이트: 동기화 6B + (Target MAC 6B × 16) = 6 + 96 NIC은 저전력 상태에서도 매직 패킷 패턴(FF×6 + MAC×16)을 감시하며, 일치 시 PME# 신호로 시스템 웨이크업 SecureOn: 매직 패킷 뒤에 6바이트 비밀번호 추가하여 보안 강화 (일부 NIC만 지원)
# WoL 지원 확인
ethtool eth0 | grep Wake-on

# WoL 활성화 (Magic Packet)
ethtool -s eth0 wol g

# WoL 비활성화
ethtool -s eth0 wol d

# 매직 패킷 전송 (다른 시스템에서)
wakeonlan AA:BB:CC:DD:EE:FF

디버깅과 진단

ethtool 진단

# 드라이버 정보
ethtool -i eth0

# NIC 통계 (드라이버별)
ethtool -S eth0

# 링크 상태 상세
ethtool eth0

# PHY 레지스터 덤프
ethtool -d eth0

# NIC 자가진단 (지원 시)
ethtool -t eth0 online

# 모듈(SFP) 정보
ethtool -m eth0

이더넷 오류 유형

이더넷 통신에서 발생하는 주요 오류 유형과 원인, 증상, 해결 방법을 정리합니다.

오류 유형원인증상해결
CRC 오류케이블 손상, EMI, 불량 커넥터rx_crc_errors 증가케이블 교체, 접지 확인
Alignment 오류바이트 경계 미정렬, PHY 문제rx_align_errors 증가PHY 칩 교체, 듀플렉스 불일치 확인
Runt Frame충돌, 잘못된 드라이버64바이트 미만 프레임 수신듀플렉스 설정, 케이블 길이 확인
Giant FrameMTU 불일치, Jabber최대 크기 초과 프레임양단 MTU/Jumbo Frame 설정 동기화
Late Collision케이블 과장, 듀플렉스 불일치512 bit time 이후 충돌 감지케이블 100m 이내 확인, Full-Duplex 강제
Carrier Sense 오류PHY 링크 불안정tx_carrier_errors 증가SFP 모듈/케이블 교체, PHY 펌웨어 업데이트

ethtool -S 출력에서 오류 카운터를 해석하는 예시입니다.

# NIC 오류 통계 확인
ethtool -S eth0 | grep -i error

# 주요 오류 카운터 해석
# rx_crc_errors    — CRC 불일치 (물리 계층 문제)
# rx_missed_errors — 링 버퍼 부족으로 누락
# rx_length_errors — 길이 필드 불일치
# rx_over_errors   — RX FIFO 오버플로우
# tx_aborted_errors — 전송 중단 (과도한 충돌)
# tx_fifo_errors   — TX FIFO 언더런

# 시간 경과에 따른 오류 증가율 모니터링
watch -n 1 'ethtool -S eth0 | grep -i error'

# sysfs 오류 카운터 직접 확인
for f in /sys/class/net/eth0/statistics/*error*; do
    echo "$(basename $f): $(cat $f)"
done

패킷 카운터 확인

# 인터페이스 통계
ip -s link show eth0

# 상세 오류 카운터
cat /sys/class/net/eth0/statistics/rx_errors
cat /sys/class/net/eth0/statistics/rx_dropped
cat /sys/class/net/eth0/statistics/tx_carrier_errors

# SNMP MIB 카운터
cat /proc/net/snmp | grep Ip

# 드롭 원인 추적
dropwatch -l kas
# 또는 perf를 사용
perf trace -e 'skb:kfree_skb'

패킷 캡처

# 이더넷 헤더 포함 캡처
tcpdump -i eth0 -e -nn -c 10

# VLAN 태그 포함 캡처
tcpdump -i eth0 -e vlan

# ARP만 캡처
tcpdump -i eth0 arp -e

# 특정 EtherType 캡처
tcpdump -i eth0 ether proto 0x88cc  # LLDP

커널 소스 참조

파일/디렉토리역할
include/uapi/linux/if_ether.h이더넷 상수, struct ethhdr
net/ethernet/eth.ceth_type_trans(), eth_header()
include/linux/ethtool.hethtool_ops, 링크 설정 구조체
net/ethtool/ethtool Netlink 인터페이스 (커널 5.6+)
include/linux/phylink.hphylink API, phylink_mac_ops
drivers/net/phy/PHY 드라이버 (Marvell, Broadcom, Realtek 등)
drivers/net/ethernet/이더넷 NIC 드라이버 (intel/, mellanox/, broadcom/ 등)
net/8021q/802.1Q VLAN 구현
net/sched/sch_taprio.cTSN TAS (taprio qdisc)
net/sched/sch_cbs.cTSN CBS (Credit-Based Shaper)
net/sched/sch_etf.cTSN ETF (Earliest TxTime First)
필수 관련 문서: 참고 문서: