네트워크 스택 개요 (Network Stack Overview)
Linux 커널 네트워크 스택의 전체 처리 경로를 RX 인터럽트부터 사용자 공간 소켓까지 단계별로 해설합니다. NAPI 폴링과 softirq, sk_buff 수명주기, IPv4/IPv6·TCP/UDP 처리, 라우팅/FIB 조회, Netfilter 훅, qdisc/TC 송신 경로를 연결해 설명하고, 실제 운영에서 자주 마주치는 지연·드롭·재전송 문제를 계측하고 튜닝하는 실무 절차까지 포함합니다.
핵심 요약
- 패킷 수명주기 — ingress, 처리, egress 경로를 연결합니다.
- 큐/버퍼 모델 — sk_buff와 큐 지점의 역할을 분리합니다.
- 정책/데이터 분리 — 제어 평면과 데이터 평면을 구분합니다.
- 성능 지표 — PPS, 지연, 드롭 원인을 함께 분석합니다.
- 오프로딩 경계 — NIC/XDP/DPDK 경계를 명확히 유지합니다.
단계별 이해
- 경로 고정
문제가 발생한 ingress/egress 지점을 먼저 특정합니다. - 큐 관찰
백로그와 드롭 위치를 계측합니다. - 정책 반영 확인
라우팅/필터 변경이 데이터 경로에 반영됐는지 봅니다. - 부하 검증
실제 트래픽 패턴에서 재현성을 확인합니다.
네트워크 스택 개요
Linux 네트워크 스택은 OSI 7계층 모델에 대응하는 계층적 구조로 설계되어 있습니다. 패킷은 sk_buff(소켓 버퍼) 구조체로 표현되며, 각 계층을 통과하면서 헤더가 추가/제거됩니다.
sk_buff 구조체
struct sk_buff는 네트워크 패킷을 표현하는 핵심 자료구조입니다. head/data/tail/end 4개 포인터로 버퍼를 관리하며, 각 프로토콜 계층이 skb_push()/skb_pull()로 헤더를 추가/제거합니다. 소속 소켓(sk), 네트워크 디바이스(dev), 프로토콜(protocol), 계층별 헤더 오프셋 등 메타데이터를 포함합니다.
Netfilter
Netfilter는 커널의 패킷 필터링 프레임워크입니다. 네트워크 스택의 5개 훅 포인트(PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING)에 콜백을 등록하여 패킷을 검사·수정·차단합니다. iptables/nftables, conntrack, NAT의 백엔드입니다.
네트워크 디바이스
struct net_device는 네트워크 인터페이스(eth0, wlan0 등)를 나타냅니다. net_device_ops로 드라이버 콜백을 등록하고, NAPI를 통해 고속 패킷 처리를 수행합니다. 인터럽트와 폴링을 혼합하여 고부하 시 인터럽트 폭풍을 방지합니다.
소켓 계층 (Socket Layer)
소켓은 유저스페이스 프로세스와 커널 네트워크 스택을 연결하는 인터페이스입니다. struct socket과 struct sock의 이중 구조로 되어 있습니다.
struct socket { /* VFS/유저 인터페이스 */
socket_state state; /* SS_CONNECTED 등 */
short type; /* SOCK_STREAM, SOCK_DGRAM */
struct file *file; /* VFS file 연결 */
struct sock *sk; /* 프로토콜 소켓 */
const struct proto_ops *ops; /* sendmsg/recvmsg 등 */
};
struct sock { /* 프로토콜 계층 (TCP/UDP) */
struct sock_common __sk_common;
struct sk_buff_head sk_receive_queue; /* 수신 큐 */
struct sk_buff_head sk_write_queue; /* 송신 큐 */
atomic_t sk_wmem_alloc; /* 송신 버퍼 사용량 */
atomic_t sk_rmem_alloc; /* 수신 버퍼 사용량 */
int sk_sndbuf; /* SO_SNDBUF */
int sk_rcvbuf; /* SO_RCVBUF */
/* ... */
};
TCP 내부 구현
Linux TCP 구현은 RFC 793 상태 머신(CLOSED → LISTEN/SYN_SENT → ESTABLISHED → FIN_WAIT/CLOSE_WAIT → TIME_WAIT → CLOSED)을 정밀하게 따릅니다. 플러그인 방식의 혼잡 제어(CUBIC 기본, BBR, Reno, DCTCP 등), kTLS, Zero-Copy sendfile, RACK/TLP 재전송을 지원합니다.
| 알고리즘 | 감지 방식 | 특징 | 사용 시나리오 |
|---|---|---|---|
| CUBIC | 손실 기반 | 3차 함수 cwnd 증가 | 기본값, 일반적 환경 |
| BBR | 대역폭/RTT 모델 | BtlBw × RTprop 기반 | 고지연, 패킷 손실 환경 |
| DCTCP | ECN 기반 | ECN 비율에 비례하여 cwnd 조절 | 데이터센터 내부 |
NAPI (New API)
NAPI는 인터럽트와 폴링을 혼합하여 고부하 네트워크에서 인터럽트 폭풍을 방지하는 수신 경로 프레임워크입니다. 패킷 도착 시 인터럽트 → napi_schedule()로 폴링 모드 전환 → budget만큼 처리 → 큐가 비면 napi_complete_done()으로 인터럽트 복귀합니다.
라우팅 서브시스템
Linux 라우팅은 FIB(Forwarding Information Base)를 기반으로 Longest Prefix Match(LPM) 조회를 수행합니다. Policy Routing, ECMP, VRF, SRv6 등 고급 기능을 포함한 상세한 내용은 별도 페이지에서 다룹니다.
라우팅 심화: FIB 내부 구조(LC-trie), Policy Routing, ECMP/Multipath, VRF, IPv6 라우팅, Netfilter 상호작용, SRv6 등의 상세 내용은 라우팅 (Routing Subsystem) 페이지를 참고하세요.
TC (Traffic Control)와 qdisc
패킷 스케줄링과 트래픽 셰이핑을 담당합니다. 각 네트워크 디바이스에 qdisc(큐잉 규칙)가 연결됩니다. fq_codel(Fair Queuing + CoDel), htb(Hierarchical Token Bucket), netem(네트워크 에뮬레이션) 등 다양한 qdisc를 지원합니다.
심화 주제
네트워크 스택의 심화 주제는 전용 문서에서 다룹니다:
- 멀티코어 패킷 분산 — RSS/RPS/RFS/XPS, per-CPU backlog, flow dissector: 네트워크 패킷 흐름 & 디버깅
- 패킷 드롭 디버깅 — 큐 적체, reorder, conntrack 오버헤드 분석: 네트워크 패킷 흐름 & 디버깅
- 네트워크 공격 방어 — SYN/UDP/ICMP Flood, syncookie, rate limiting: 네트워크 공격 방어
관련 문서
이 페이지는 네트워크 스택의 전체 구조를 조감하는 게이트웨이 문서입니다. 각 주제의 심화 내용은 아래 전용 문서를 참고하세요.