이더넷 (Ethernet)
1973년 Xerox PARC에서 탄생한 이더넷은 반세기가 넘는 진화를 거쳐 10 Mbps 동축 케이블 버스에서 800 Gbps 광 링크까지 확장되었습니다. 이 문서는 이더넷의 역사, 물리 계층(PHY), 프레임 구조, 리눅스 커널 구현, 오프로드 기술, 에너지 효율, 산업용 이더넷까지 다양한 시각에서 종합적으로 다룹니다.
핵심 요약
- 프레임 (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 하드웨어로 넘기는 기술. 고성능 네트워크의 핵심
단계별 이해
- 프레임 구조부터 파악하기
이더넷의 기본은 프레임입니다. Preamble → MAC 주소 → EtherType → Payload → FCS 순서를 먼저 이해하세요.EtherType ≥ 0x0600이면 Ethernet II, 그보다 작으면 802.3 프레임입니다. - PHY-MAC 연결 이해하기
NIC 내부에서 MAC 계층이 프레임을 처리하고, PHY 칩이 실제 전기/광 신호로 변환합니다.ethtool eth0으로 현재 링크 속도와 PHY 상태를 확인할 수 있습니다. - 커널 수신 경로 따라가기
케이블 → NIC DMA → IRQ →napi_schedule()→ NAPI poll →eth_type_trans()→netif_receive_skb()순서로 프레임이 커널에 전달됩니다. 이 흐름이 이더넷 드라이버의 핵심입니다. - 오프로드와 성능 튜닝 적용하기
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 프레임워크로 구현
역사와 진화
이더넷의 발전 과정은 컴퓨터 네트워킹 역사 그 자체입니다.
| 연도 | 표준/기술 | 속도 | 매체 | 의의 |
|---|---|---|---|---|
| 1973 | Xerox Ethernet (실험) | 2.94 Mbps | 동축 케이블 | Robert Metcalfe, Xerox PARC에서 최초 구현 |
| 1980 | DIX Ethernet (v1.0) | 10 Mbps | 동축 (Thick) | DEC-Intel-Xerox 공동 표준, EtherType 필드 도입 |
| 1983 | IEEE 802.3 (10BASE5) | 10 Mbps | Thick 동축 | 첫 IEEE 표준화, CSMA/CD 공식 규정 |
| 1985 | 10BASE2 (Thin Ethernet) | 10 Mbps | Thin 동축 (RG-58) | 저비용 동축, 185m 세그먼트 |
| 1990 | 10BASE-T | 10 Mbps | UTP Cat3 | 트위스트 페어 혁명, 스타 토폴로지 전환 |
| 1995 | 802.3u (Fast Ethernet) | 100 Mbps | UTP Cat5 / 광 | 100BASE-TX, Auto-Negotiation 도입 |
| 1998 | 802.3z (Gigabit Ethernet) | 1 Gbps | 광섬유 | 1000BASE-SX/LX, 8B/10B 부호화 |
| 1999 | 802.3ab | 1 Gbps | UTP Cat5e | 1000BASE-T, PAM-5 4쌍 전송 |
| 2002 | 802.3ae (10GbE) | 10 Gbps | 광섬유 | CSMA/CD 사실상 폐기, 전이중 전용 |
| 2006 | 802.3an (10GBASE-T) | 10 Gbps | UTP Cat6a | 구리선 10G, LDPC 부호화 |
| 2010 | 802.3ba | 40/100 Gbps | 광섬유 | 다중 레인(4×10G, 10×10G, 4×25G) |
| 2016 | 802.3by (25GbE) | 25 Gbps | SFP28 | 서버 연결 최적 대역폭 |
| 2017 | 802.3bs | 200/400 Gbps | 광섬유 | PAM4 변조, 데이터센터 스파인 |
| 2024 | 802.3df | 800 Gbps/1.6 Tbps | 광섬유 | AI 클러스터, 100G 레인 기술 |
CSMA/CD와 충돌 도메인
초기 이더넷의 핵심 프로토콜인 CSMA/CD(Carrier Sense Multiple Access / Collision Detection)는 공유 매체에서의 다중 접근 문제를 해결합니다.
알고리즘 단계
- Carrier Sense — 전송 전 매체가 유휴 상태인지 확인
- Transmit — 유휴 시 프레임 전송 시작
- Collision Detection — 전송 중 충돌 감지 시 jam 신호(32비트) 발송
- Backoff — Binary Exponential Backoff 알고리즘으로 재전송 지연
- n번째 충돌 시: 0 ~ 2min(n,10)-1 슬롯 중 랜덤 선택
- 슬롯 시간: 10 Mbps에서 51.2 μs (512 bit times)
- 16번 충돌 시 전송 포기
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)으로 캡됩니다.
ethtool에서도 duplex 설정을 확인할 수 있습니다.
충돌 도메인 vs 브로드캐스트 도메인
| 구분 | 충돌 도메인 | 브로드캐스트 도메인 |
|---|---|---|
| 정의 | 동시 전송 시 충돌이 발생하는 범위 | 브로드캐스트 프레임이 도달하는 범위 |
| 분리 장비 | 스위치, 브릿지 (포트별 분리) | 라우터, VLAN |
| 허브 | 모든 포트가 하나의 충돌 도메인 | 모든 포트가 하나의 브로드캐스트 도메인 |
| 스위치 | 포트별 독립 충돌 도메인 | 전체가 하나의 브로드캐스트 도메인 |
프레임 구조
이더넷 프레임은 여러 변형이 존재합니다. 가장 널리 사용되는 Ethernet II(DIX)와 IEEE 802.3 프레임을 비교합니다.
주요 EtherType 값
| EtherType | 프로토콜 | 커널 상수 |
|---|---|---|
| 0x0800 | IPv4 | ETH_P_IP |
| 0x0806 | ARP | ETH_P_ARP |
| 0x8100 | 802.1Q VLAN | ETH_P_8021Q |
| 0x86DD | IPv6 | ETH_P_IPV6 |
| 0x8847 | MPLS Unicast | ETH_P_MPLS_UC |
| 0x88A8 | 802.1ad (QinQ) | ETH_P_8021AD |
| 0x88CC | LLDP | ETH_P_LLDP |
| 0x88F7 | PTP (IEEE 1588) | ETH_P_1588 |
| 0x8906 | FCoE | ETH_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
물리 계층 (PHY)
이더넷 물리 계층은 전기/광학 신호로 데이터를 실제 매체에 전송하는 역할을 합니다. PHY 칩은 MAC 계층과 표준화된 인터페이스(MII 계열)로 연결됩니다.
MAC-PHY 인터페이스 비교
| 인터페이스 | 속도 | 데이터 폭 | 클럭 | 핀 수 | 용도 |
|---|---|---|---|---|---|
| MII | 10/100 Mbps | 4비트 | 25 MHz | 18 | Fast Ethernet |
| RMII | 10/100 Mbps | 2비트 | 50 MHz | 10 | 임베디드 (핀 절약) |
| GMII | 1 Gbps | 8비트 | 125 MHz | 24 | Gigabit Ethernet |
| RGMII | 10/100/1G | 4비트 DDR | 125 MHz | 12 | 가장 널리 사용 |
| SGMII | 10/100/1G | 직렬 | 625 MHz | 4 (SerDes) | SoC, 백플레인 |
| QSGMII | 4×1G | 직렬 | 5 GHz | 4 | 4포트 통합 |
| XGMII | 10 Gbps | 32비트 DDR | 156.25 MHz | 74 | 10GbE 내부 |
| XFI/SFI | 10 Gbps | 직렬 | 10.3125 GHz | 2 | SFP+ 모듈 |
| USXGMII | 10/5/2.5/1G | 직렬 | 10.3125 GHz | 2 | 멀티기가비트 |
| 25GAUI | 25 Gbps | 직렬 | 25.78125 GHz | 2 | SFP28 |
PHY 하위 계층
- PCS (Physical Coding Sublayer) — 데이터 부호화/복호화
- 8B/10B (GbE), 64B/66B (10GbE+), PAM4 (25G+)
- PMA (Physical Medium Attachment) — 직렬화, 클럭 복구, SerDes
- PMD (Physical Medium Dependent) — 전기/광학 변환, 커넥터 규격
- Auto-MDIX — 크로스오버 케이블 없이 자동 감지 (1000BASE-T 필수)
SFP/QSFP 모듈
광/전기 트랜시버 모듈은 이더넷 PHY의 PMD 계층을 교체 가능한 형태로 분리합니다. SFF(Small Form Factor) 규격에 따라 다양한 폼팩터가 존재합니다.
| 모듈 | 최대 속도 | 레인 | 전기/광 | 케이지 폭 | 주요 용도 |
|---|---|---|---|---|---|
| SFP | 1 Gbps | 1 | 광/전기 | 13.4mm | 액세스, 서버 1GbE |
| SFP+ | 10 Gbps | 1 | 광/DAC | 13.4mm | 서버, ToR 스위치 |
| SFP28 | 25 Gbps | 1 | 광/DAC | 13.4mm | 25GbE 서버, 5G 프론트홀 |
| QSFP+ | 40 Gbps | 4×10G | 광/DAC | 18.4mm | 스파인-리프 40GbE |
| QSFP28 | 100 Gbps | 4×25G | 광/DAC | 18.4mm | 100GbE 데이터센터 |
| QSFP-DD | 400 Gbps | 8×50G | 광 | 18.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
라인 코딩 진화
| 속도 | 부호화 | 효율 | 변조 |
|---|---|---|---|
| 10 Mbps | Manchester | 50% | NRZ |
| 100 Mbps | 4B/5B + MLT-3 | 80% | 3레벨 |
| 1 Gbps | 8B/10B (광) / PAM-5 (UTP) | 80% / 4쌍 | 5레벨 4쌍 병렬 |
| 10 Gbps | 64B/66B | 97% | PAM-2 (광) / DSQ128 (UTP) |
| 25/50/100G | 64B/66B + RS-FEC | 97% | NRZ 또는 PAM4 |
| 200/400/800G | 64B/66B + RS-FEC | 97% | PAM4, 다중 레인 |
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-T | 1 Gbps | Cat5e 이상 | 100m | PAM-5 (4쌍) |
| 2.5GBASE-T | 2.5 Gbps | Cat5e 이상 | 100m | PAM-16 (DSQ128) |
| 5GBASE-T | 5 Gbps | Cat5e(55m) / Cat6(100m) | 55~100m | PAM-16 (DSQ128) |
| 10GBASE-T | 10 Gbps | Cat6a 이상 | 100m | PAM-16 (DSQ128) |
ethtool에서 2500baseT/Full, 5000baseT/Full 등 advertise 가능 속도를 확인할 수 있습니다. Cat5e 케이블에서 5GBASE-T 연결 시 거리가 55m를 초과하면 링크 불안정이 발생할 수 있으므로 반드시 케이블 테스터로 확인하세요.
Auto-Negotiation
Auto-Negotiation(자동 협상)은 IEEE 802.3 Clause 28/37/73에 정의된 링크 파트너 간 능력 교환 프로토콜입니다.
협상 과정
- FLP 교환 — Fast Link Pulse 버스트로 기본 페이지(Base Page) 교환
- 능력 비교 — 양쪽이 지원하는 최고 공통 속도/듀플렉스 선택
- 우선순위 — 100BASE-TX FD > 100BASE-TX HD > 10BASE-T FD > 10BASE-T HD
- 링크 확립 — 합의된 모드로 PHY 설정 완료
리눅스에서의 제어
# 현재 링크 설정 확인
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_ops는 ethtool 유틸리티의 백엔드입니다.
/* 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 설정 변경 */
};
phylink 프레임워크
리눅스 커널 5.x부터 phylink은 기존 phylib(phy_device)를 확장하여 MAC-PHY 연결을 통합 관리합니다. SFP 모듈 핫플러그, 다중 PHY 인터페이스 모드, in-band Auto-Negotiation을 지원합니다.
phylink_mac_ops 콜백
/* 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 등) */
};
패킷 송수신 경로
이더넷 프레임이 커널에서 처리되는 핵심 경로입니다.
하드웨어 오프로드
현대 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 Pause | 802.3x | 양쪽 모두 Pause 전송 가능 | 한 포트 혼잡 시 전체 링크 중단 |
| Asymmetric Pause | 802.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 활성화
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 |
| DCBX | 802.1Qaz | DCB 파라미터 자동 협상 (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-LLDP | lldpad 데몬이 관리 | 유연한 정책 제어, 다중 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
lldpad를 동시에 구동하면 LLDPDU 충돌이 발생하므로 한쪽을 반드시 비활성화하세요.
VLAN과 QinQ
IEEE 802.1Q VLAN 태깅은 하나의 물리적 이더넷 링크에서 논리적 네트워크를 분리합니다.
VLAN 태그 구조 (4바이트)
| 필드 | 비트 | 설명 |
|---|---|---|
| TPID | 16 | Tag Protocol Identifier (0x8100) |
| PCP | 3 | Priority Code Point (QoS 우선순위 0~7) |
| DEI | 1 | Drop Eligible Indicator |
| VID | 12 | VLAN 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
- 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 상태 확인
ethtool --show-eee eth0
# EEE 비활성화 (지연 민감 환경)
ethtool --set-eee eth0 eee off
# EEE 활성화 (1GbE만)
ethtool --set-eee eth0 eee on advertise 0x8
TSN (Time-Sensitive Networking)
IEEE 802.1 TSN 태스크 그룹은 이더넷 위에 확정적 지연(Deterministic Latency)과 시간 동기화를 구현하는 표준 집합입니다. 산업 자동화, 자동차, 방송 분야에서 전용 필드버스를 대체합니다.
핵심 TSN 표준
| 표준 | 이름 | 기능 |
|---|---|---|
| 802.1AS | gPTP (Generalized PTP) | 네트워크 전체 시간 동기화 (<1 μs 정밀도) |
| 802.1Qbv | Time-Aware Shaper (TAS) | 시간 기반 게이트 제어, 트래픽 클래스별 전송 시간대 할당 |
| 802.1Qbu/802.3br | Frame Preemption | 우선순위 높은 프레임이 낮은 프레임 전송을 중단 가능 |
| 802.1CB | FRER (Frame Replication and Elimination) | 프레임 복제로 무손실 전송 보장 |
| 802.1Qci | Per-Stream Filtering and Policing | 스트림별 필터링/폴리싱 |
| 802.1Qcc | Stream Reservation Protocol | 경로/대역폭 예약 관리 |
리눅스 TSN 지원
# 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 RT | L2 (EtherType 0x8892) | ~1 ms | Raw socket / AF_PACKET |
| PROFINET IRT | L2 + HW 스케줄링 | 31.25 μs | TSN + 전용 NIC |
| EtherCAT | L2 (EtherType 0x88A4) | ~50 μs | IgH EtherCAT Master |
| EtherNet/IP | TCP/UDP (CIP) | ~1 ms | 표준 소켓 API |
| Modbus/TCP | TCP (포트 502) | ~10 ms | 표준 소켓 API |
| OPC UA TSN | TSN + UDP | <1 ms | open62541 + taprio |
성능 튜닝
이더넷 네트워크 성능을 최적화하는 주요 커널/드라이버 파라미터입니다.
링 버퍼 최적화
# 링 버퍼 현재 크기 확인
ethtool -g eth0
# 링 버퍼 최대로 설정 (패킷 드롭 방지)
ethtool -G eth0 rx 4096 tx 4096
# 인터럽트 병합 (지연 vs 처리량 트레이드오프)
ethtool -C eth0 adaptive-rx on adaptive-tx on
adaptive-rx on을 사용하면 드라이버가 트래픽 패턴에 따라 인터럽트 병합 파라미터를 자동 조절합니다. 저부하 시 지연을 최소화하고, 고부하 시 인터럽트 수를 줄여 CPU 사용률을 낮춥니다. Intel igb/ixgbe/ice, Mellanox mlx5 등 주요 드라이버가 지원합니다.
# 멀티큐 확인
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 다항식으로 계산됩니다.
- 다항식:
x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1 - 검사 범위: Destination MAC ~ Payload (Preamble, SFD 제외)
- HW 오프로드: 현대 NIC은 FCS를 하드웨어에서 계산/검증,
skb->ip_summed로 커널에 알림
/* 커널 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 하드웨어 타임스탬프 능력 확인
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 지원 확인
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 Frame | MTU 불일치, 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.c | eth_type_trans(), eth_header() |
include/linux/ethtool.h | ethtool_ops, 링크 설정 구조체 |
net/ethtool/ | ethtool Netlink 인터페이스 (커널 5.6+) |
include/linux/phylink.h | phylink 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.c | TSN TAS (taprio qdisc) |
net/sched/sch_cbs.c | TSN CBS (Credit-Based Shaper) |
net/sched/sch_etf.c | TSN ETF (Earliest TxTime First) |
관련 문서
- MAC 주소 (MAC Address) — EUI-48 비트 구조, ARP/Neighbor, Bridge FDB, MAC 필터링
- sk_buff 자료구조 — 이더넷 프레임을 담는 핵심 커널 버퍼
- 네트워크 스택 — 전체 네트워크 스택 아키텍처와 패킷 흐름
- GSO/GRO 네트워크 오프로드 — 세그멘테이션/병합 오프로드 상세
- NAPI (New API) — 인터럽트 완화와 폴링 기반 패킷 수신
- Network Device 드라이버 — net_device_ops, NAPI, ethtool 구현
- Bridge/VLAN/Bonding — L2 브릿지, VLAN, 링크 어그리게이션
- TC (Traffic Control) — 트래픽 셰이핑, 큐잉 디시플린
- IP 프로토콜 (IPv4/IPv6) — 이더넷 위의 L3 프로토콜