네트워크 스택 개요 (Network Stack Overview)

Linux 커널 네트워크 스택의 전체 처리 경로를 RX 인터럽트부터 사용자 공간 소켓까지 단계별로 해설합니다. NAPI 폴링과 softirq, sk_buff 수명주기, IPv4/IPv6·TCP/UDP 처리, 라우팅/FIB 조회, Netfilter 훅, qdisc/TC 송신 경로를 연결해 설명하고, 실제 운영에서 자주 마주치는 지연·드롭·재전송 문제를 계측하고 튜닝하는 실무 절차까지 포함합니다.

문서 구조 재정렬: 이 문서는 코어 패킷 경로 이해 중심으로 유지합니다. 운영 튜닝/오프로드 심화는 Network Device 드라이버, TC, 라우팅, Netfilter, BPF/XDP, AF_XDP 문서를 참고하세요.
전제 조건: 커널 아키텍처sk_buff 문서를 먼저 읽으세요. 전체 네트워크 스택은 패킷 수명 주기와 큐 전이가 중심이므로, 먼저 공통 버퍼 모델을 이해하면 이후 문서 연결이 쉬워집니다.
일상 비유: 이 주제는 물류 허브 전체 지도와 비슷합니다. 입고, 분류, 전달, 반송 지점을 한 장으로 보면 세부 프로토콜 문서를 읽을 때 길을 잃지 않습니다.

핵심 요약

  • 패킷 수명주기 — ingress, 처리, egress 경로를 연결합니다.
  • 큐/버퍼 모델 — sk_buff와 큐 지점의 역할을 분리합니다.
  • 정책/데이터 분리 — 제어 평면과 데이터 평면을 구분합니다.
  • 성능 지표 — PPS, 지연, 드롭 원인을 함께 분석합니다.
  • 오프로딩 경계 — NIC/XDP/DPDK 경계를 명확히 유지합니다.

단계별 이해

  1. 경로 고정
    문제가 발생한 ingress/egress 지점을 먼저 특정합니다.
  2. 큐 관찰
    백로그와 드롭 위치를 계측합니다.
  3. 정책 반영 확인
    라우팅/필터 변경이 데이터 경로에 반영됐는지 봅니다.
  4. 부하 검증
    실제 트래픽 패턴에서 재현성을 확인합니다.
관련 표준: RFC 791 (IPv4), RFC 8200 (IPv6), RFC 793 (TCP), RFC 768 (UDP), IEEE 802.3 (Ethernet) — 커널 네트워크 스택이 구현하는 핵심 프로토콜 규격입니다. 종합 목록은 참고자료 — 표준 & 규격 섹션을 참고하세요.

네트워크 스택 개요

Linux 네트워크 스택은 OSI 7계층 모델에 대응하는 계층적 구조로 설계되어 있습니다. 패킷은 sk_buff(소켓 버퍼) 구조체로 표현되며, 각 계층을 통과하면서 헤더가 추가/제거됩니다.

Linux 네트워크 스택 계층 User Space: socket(), send(), recv() Socket Layer (AF_INET, AF_PACKET, ...) Transport Layer (TCP, UDP, SCTP) Network Layer (IPv4, IPv6, routing) Netfilter (iptables/nftables) Traffic Control (tc/qdisc) Device Driver (NIC) → Hardware
Linux 네트워크 스택: 소켓에서 NIC 드라이버까지의 패킷 경로

sk_buff 구조체

struct sk_buff는 네트워크 패킷을 표현하는 핵심 자료구조입니다. head/data/tail/end 4개 포인터로 버퍼를 관리하며, 각 프로토콜 계층이 skb_push()/skb_pull()로 헤더를 추가/제거합니다. 소속 소켓(sk), 네트워크 디바이스(dev), 프로토콜(protocol), 계층별 헤더 오프셋 등 메타데이터를 포함합니다.

상세 문서: sk_buff의 메모리 레이아웃, 헤더 포인터 연산, 복제/참조 메커니즘, GSO/GRO 연동, 성능 패턴 등은 sk_buff 심화 문서를 참고하세요.

Netfilter

Netfilter는 커널의 패킷 필터링 프레임워크입니다. 네트워크 스택의 5개 훅 포인트(PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING)에 콜백을 등록하여 패킷을 검사·수정·차단합니다. iptables/nftables, conntrack, NAT의 백엔드입니다.

상세 문서: Netfilter 훅 체계, nftables/iptables 아키텍처, conntrack 내부, NFQUEUE, 방화벽 규칙 최적화는 Netfilter 프레임워크 심화 문서를 참고하세요.

네트워크 디바이스

struct net_device는 네트워크 인터페이스(eth0, wlan0 등)를 나타냅니다. net_device_ops로 드라이버 콜백을 등록하고, NAPI를 통해 고속 패킷 처리를 수행합니다. 인터럽트와 폴링을 혼합하여 고부하 시 인터럽트 폭풍을 방지합니다.

상세 문서: net_device_ops, NAPI, RX/TX 링, ethtool, phylink, XDP, 가상 netdev(TUN/TAP) 등은 Network Device 드라이버 문서를, NAPI 폴링 메커니즘의 심화는 NAPI 심화 문서를 참고하세요.

소켓 계층 (Socket Layer)

소켓은 유저스페이스 프로세스와 커널 네트워크 스택을 연결하는 인터페이스입니다. struct socketstruct 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 기반고지연, 패킷 손실 환경
DCTCPECN 기반ECN 비율에 비례하여 cwnd 조절데이터센터 내부
상세 문서: tcp_sock 구조체, 상태 머신 전이, 혼잡 제어 알고리즘 내부, kTLS, 재전송/SACK, Zero-Copy, 성능 최적화는 TCP 프로토콜 심화 문서를 참고하세요.

NAPI (New API)

NAPI는 인터럽트와 폴링을 혼합하여 고부하 네트워크에서 인터럽트 폭풍을 방지하는 수신 경로 프레임워크입니다. 패킷 도착 시 인터럽트 → napi_schedule()로 폴링 모드 전환 → budget만큼 처리 → 큐가 비면 napi_complete_done()으로 인터럽트 복귀합니다.

상세 문서: NAPI 폴링 메커니즘, busy polling, 적응형 인터럽트 조절, GRO 통합, 드라이버 구현 패턴은 NAPI 심화 문서를, GSO/GRO 오프로드는 GSO/GRO 문서를 참고하세요.

라우팅 서브시스템

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를 지원합니다.

상세 문서: TC 아키텍처, qdisc 유형별 설정, classifier/filter, 대역폭 제한과 트래픽 셰이핑은 TC (Traffic Control) 문서를 참고하세요.

심화 주제

네트워크 스택의 심화 주제는 전용 문서에서 다룹니다:

이 페이지는 네트워크 스택의 전체 구조를 조감하는 게이트웨이 문서입니다. 각 주제의 심화 내용은 아래 전용 문서를 참고하세요.

핵심 자료구조 & 수신 경로

L2 계층

L3/L4 프로토콜

인프라 & 보안