TCP/IP 스택과 DPDK로 이해하는 고성능 네트워킹

TCP/IP 스택의 송수신 경로와 DPDK 커널 바이패스, 네트워크 인터페이스 튜닝 및 성능 모니터링 방법을 정리한다.

2026-08-14 · 최초 발행 2026-01-16

패킷이 지나가는 계층과 처리 경로

네트워크 스택은 애플리케이션의 통신 요청을 하드웨어가 전송할 수 있는 패킷으로 바꾸고, 반대로 수신 패킷을 애플리케이션 데이터로 돌려보내는 운영체제의 계층 구조다. TCP/IP 프로토콜 구현, 라우팅, 드라이버 처리, NIC 제어가 이 경로 안에서 이어진다.

OSI 모델은 통신 기능을 7개 계층으로 나눈다. 애플리케이션 계층에는 HTTP, FTP, DNS가 있고, 프레젠테이션 계층은 암호화와 압축을 맡는다. 세션 계층은 세션을 관리하며, 전송 계층에서는 TCP와 UDP를 다룬다. 네트워크 계층은 IP와 ICMP, 데이터 링크 계층은 Ethernet과 ARP, 물리 계층은 하드웨어에 해당한다.

운영 환경에서는 이를 TCP/IP 모델로 더 압축해 보는 일이 많다.

  • 애플리케이션 계층: HTTP, DNS, SSH
  • 전송 계층: TCP, UDP
  • 인터넷 계층: IP, ICMP, ARP
  • 네트워크 접근 계층: Ethernet, Wi-Fi
Socket APITCP/UDPIPEthernet애플리케이션전송 계층인터넷 계층네트워크 접근 계층네트워크 인터페이스 카드포트 번호IP 주소MAC 주소

Linux에서는 사용자 공간의 애플리케이션이 소켓 API(socket, bind, listen, accept 등)를 통해 통신을 시작한다. 커널 공간에서는 TCP·UDP·IP 프로토콜 계층, 라우팅 테이블, Netfilter/iptables, 네트워크 드라이버가 처리에 참여한다. NIC, DMA(Direct Memory Access), 인터럽트 처리는 하드웨어 영역에 속한다.

TCP/IP 스택을 통과하는 송수신

송신 시 애플리케이션은 send() 시스템 콜을 호출한다. TCP 계층은 세그먼트를 만들고 시퀀스 번호를 붙이며, IP 계층은 IP 헤더와 라우팅 정보를 처리한다. 이후 링크 계층이 Ethernet 헤더를 더하고, 드라이버는 DMA를 통해 NIC로 넘긴 패킷을 네트워크에 보낸다.

// 송신 과정
애플리케이션 → send() 시스템 콜
    → TCP 계층: 세그먼트 생성, 시퀀스 번호 부여
    → IP 계층: IP 헤더 추가, 라우팅
    → 링크 계층: Ethernet 헤더 추가
    → 네트워크 드라이버: DMA를 통해 NIC에 전송
    → NIC: 패킷을 네트워크로 송신

TCP는 데이터를 MSS(Maximum Segment Size) 단위로 분할하고 포트, 시퀀스 번호, 체크섬을 포함한 헤더를 붙인다. 송신 버퍼(Send Buffer)에 저장된 데이터는 Slow Start와 Congestion Avoidance 같은 혼잡 제어를 거치며, ACK를 받으면 버퍼에서 제거된다.

수신 방향에서는 NIC가 도착한 패킷을 DMA로 메모리에 옮기고 하드웨어 인터럽트를 발생시킨다. 드라이버가 패킷을 처리한 뒤 링크 계층이 Ethernet 헤더를 제거한다. IP 계층은 헤더와 라우팅을 확인하고, TCP 계층은 체크섬 검증과 재조립을 수행한다. 데이터는 수신 버퍼(Receive Buffer)에 들어가며 애플리케이션은 recv() 시스템 콜로 읽는다.

// 수신 과정
NIC → 패킷 도착, DMA로 메모리 전송
    → 하드웨어 인터럽트 발생
    → 네트워크 드라이버: 패킷 처리
    → 링크 계층: Ethernet 헤더 제거
    → IP 계층: IP 헤더 검증, 라우팅 확인
    → TCP 계층: 체크섬 검증, 재조립
    → 수신 버퍼(Receive Buffer)에 저장
    → 애플리케이션 → recv() 시스템 콜로 데이터 읽기
NICIP 계층TCP 계층소켓 버퍼애플리케이션NICIP 계층TCP 계층소켓 버퍼애플리케이션send()세그먼트 생성IP 패킷 생성DMA 전송네트워크 송신패킷 수신인터럽트 + DMAIP 헤더 제거데이터 저장recv()

연결 수립은 SYN, SYN+ACK, ACK 순서로 진행한다.

Client → SYN → Server
Server → SYN+ACK → Client
Client → ACK → Server

연결 종료는 FIN과 ACK를 주고받는 흐름으로 처리한다.

Client → FIN → Server
Server → ACK → Client
Server → FIN → Client
Client → ACK → Server

흐름 제어는 수신자 버퍼 크기와 Receive Window를 기준으로 송신량을 조절해 버퍼 오버플로우를 막는다. 혼잡 제어는 Slow Start의 지수적 증가, Congestion Avoidance의 선형 증가, Fast Retransmit와 Fast Recovery로 구성되며 TCP Cubic과 TCP BBR 알고리즘이 사용된다.

임계값 도달패킷 손실TimeoutSlow StartCongestion AvoidanceFast RetransmitFast Recovery

커널을 거치지 않는 DPDK 패킷 처리

DPDK(Data Plane Development Kit)는 Intel이 개발한 고속 패킷 처리 프레임워크다. 커널을 우회해 사용자 공간에서 NIC에 직접 접근하며, 인터럽트 대신 폴링(Polling)을 사용한다. Zero-copy와 Lock-free 자료구조도 활용한다.

전통적인 커널 스택은 범용성과 안정성을 제공하지만, 패킷 도착마다 발생하는 하드웨어 인터럽트와 컨텍스트 스위칭은 비용이 된다. 초당 수백만 패킷을 처리하면 CPU 부하가 커질 수 있다. send()recv() 호출에서 생기는 커널·사용자 공간 전환, 데이터 복사 비용, 여러 계층을 지나는 동안의 캐시 미스와 메모리 접근 지연도 고려 대상이다.

DPDK는 PMD(Poll Mode Driver)로 인터럽트 없이 패킷을 확인하고 CPU 코어를 전용 할당한다. Huge Pages는 2MB 또는 1GB 페이지를 사용해 TLB 미스를 줄인다. CPU Affinity로 패킷 처리 스레드를 특정 코어에 고정하고, NUMA를 인식해 메모리를 할당할 수 있다. DMA를 통한 직접 메모리 전송과 Zero-Copy 역시 CPU 부하를 낮추는 방식이다.

전통적 스택NIC인터럽트커널 네트워크 스택시스템애플리케이션DPDKNIC폴링사용자 공간 PMD애플리케이션

애플리케이션은 EAL(Environment Abstraction Layer)을 초기화하고 메모리 풀(Mempool)을 만든 뒤 NIC 포트를 설정한다. 처리 루프에서는 rte_eth_rx_burst()로 패킷을 수신하고, 파싱·필터링·포워딩을 수행한 다음 rte_eth_tx_burst()로 전송한다.

// DPDK 애플리케이션 구조
초기화
EAL(Environment Abstraction Layer) 초기화
    → 메모리 풀(Mempool) 생성
    → NIC 포트 설정
패킷 처리 루프
rte_eth_rx_burst(): 패킷 수신
    → 패킷 처리 (파싱, 필터링, 포워딩)
rte_eth_tx_burst(): 패킷 송신

이 방식은 가상 라우터·방화벽·로드 밸런서 같은 NFV와 VNF 구현, 마이크로초 단위 지연 시간을 요구하는 HFT 금융 거래 시스템, UPF(User Plane Function)를 포함하는 5G 모바일 코어와 Edge Computing, 고성능 스위치·IDS·DDoS 방어가 필요한 데이터 센터에서 활용된다.

인터페이스 설정이 바꾸는 패킷 처리 조건

물리 인터페이스에는 eth0, ens33, enp0s3 같은 Ethernet 장치와 wlan0, wlp2s0 같은 Wi-Fi 장치가 있으며 NIC 드라이버가 관리한다. 가상 인터페이스로는 127.0.0.1을 사용하는 lo, VPN과 가상화에 쓰이는 tun/tap, 컨테이너 네트워킹의 veth, 네트워크 브리지인 bridge가 있다.

# 인터페이스 목록 확인
ip link show

# 인터페이스 활성화/비활성화
sudo ip link set eth0 up
sudo ip link set eth0 down

# IP 주소 할당
sudo ip addr add 192.168.1.100/24 dev eth0

# 라우팅 테이블 확인
ip route show

# 기본 게이트웨이 설정
sudo ip route add default via 192.168.1.1

MTU(Maximum Transmission Unit)는 한 번에 전송할 수 있는 최대 패킷 크기다. Ethernet 기본값은 1500바이트이고, 데이터센터에서는 9000바이트 Jumbo Frame을 사용한다.

# MTU 변경
sudo ip link set eth0 mtu 9000

TSO(TCP Segmentation Offload)는 큰 패킷을 NIC에서 분할하고, GSO(Generic Segmentation Offload)는 소프트웨어에서 분할한다. Checksum Offload는 NIC가 체크섬 계산을 수행한다.

# Offload 설정 확인
ethtool -k eth0

# TSO 활성화
sudo ethtool -K eth0 tso on

다중 큐 NIC는 여러 송수신 큐를 가지며 각 큐를 서로 다른 CPU 코어에 배정할 수 있다. RSS(Receive Side Scaling)는 수신 패킷을 여러 코어로 분산하고, XPS(Transmit Packet Steering)는 송신 큐를 선택한다.

NICRX Queue 0RX Queue 1RX Queue 2RX Queue 3Core 0Core 1Core 2Core 3

Interrupt Coalescing은 여러 패킷을 모아 한 번에 인터럽트를 발생시켜 인터럽트 빈도와 CPU 부하를 줄인다. 대신 지연 시간과 처리량 사이에는 트레이드오프가 생긴다.

# 인터럽트 설정 확인
ethtool -c eth0

# 인터럽트 간격 조정 (마이크로초)
sudo ethtool -C eth0 rx-usecs 50

스택 밖과 앞단에서 처리하는 방법

SO_REUSEPORT는 여러 프로세스가 동일한 포트에 바인딩하도록 하고, 커널이 부하를 분산한다. 멀티코어 웹 서버에서 사용할 수 있다.

int optval = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval));

TCP Fast Open(TFO)은 SYN 패킷에 데이터를 포함해 연결 수립 지연을 줄이고 3-Way Handshake를 단축한다.

eBPF(Extended Berkeley Packet Filter)는 커널 내부에서 프로그램을 실행해 패킷 필터링과 성능 모니터링에 사용한다. XDP(eXpress Data Path)는 NIC 드라이버 단계에서 패킷을 처리하며, 커널 수정 없이 동작을 커스터마이징할 수 있다.

DropPassTXNICXDP (eBPF)패킷 폐기커널 네트워크 스택재전송

SR-IOV(Single Root I/O Virtualization)는 하나의 NIC를 여러 가상 기능(VF)으로 나눈다. VM이 VF에 직접 접근하므로 하이퍼바이저 우회에 따른 성능 향상을 기대할 수 있으며, 클라우드 환경에서 활용된다.

성능 저하의 위치를 측정하는 기준

처리량(Throughput)은 초당 전송 데이터량을 Mbps 또는 Gbps로 표현하며 iperf, netperf로 측정한다. 지연 시간(Latency)은 패킷 왕복 시간(RTT)이며 ping으로 확인할 수 있다. 패킷 손실률은 전송 패킷 대비 손실 비율로, TCP 재전송 횟수도 함께 확인한다. 대역폭 활용률은 네트워크 용량 대비 사용량을 보여 주므로 병목 식별에 쓰인다.

# 네트워크 통계 확인
netstat -s

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

# 실시간 트래픽 모니터링
iftop

# 패킷 캡처 및 분석
tcpdump -i eth0 -w capture.pcap
wireshark capture.pcap

# 성능 벤치마크
iperf3 -c server_ip -t 60 -P 4

CPU 사용률이 높을 때는 인터럽트 빈도를 먼저 확인한다. 빈도가 높다면 Interrupt Coalescing을 검토하고, 낮다면 CPU 친화성 설정을 본다. CPU 사용률이 낮으면 네트워크 대역폭이 포화됐는지 확인하며, 여유가 있다면 애플리케이션 병목을 의심할 수 있다.

높음높음낮음포화여유낮음성능 저하CPU 사용률 확인인터럽트 빈도 확인Interrupt Coalescing네트워크 대역폭대역폭 증설애플리케이션 병목CPU 친화성 설정

웹 서버와 가상 네트워크에서의 적용

웹 서버에서는 TCP 백로그 큐, TCP 타임스탬프, TCP Fast Open, 혼잡 제어 알고리즘을 조정할 수 있다.

# TCP 백로그 큐 크기 증가
sudo sysctl -w net.core.somaxconn=1024

# TCP 타임스탬프 활성화
sudo sysctl -w net.ipv4.tcp_timestamps=1

# TCP Fast Open 활성화
sudo sysctl -w net.ipv4.tcp_fastopen=3

# TCP 혼잡 제어 알고리즘 변경
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr

컨테이너 네트워킹은 veth pair로 컨테이너와 호스트를 연결하고, Docker bridge와 CNI(Container Network Interface)를 사용한다. Calico와 Flannel은 오버레이 네트워크를 제공하며, 네트워크 네임스페이스는 격리를 담당한다.

클라우드에서는 VPC(Virtual Private Cloud), 서브넷, 라우팅 테이블, 보안 그룹, 네트워크 ACL을 관리한다. VPN과 Direct Connect도 네트워크 연결 구성에 포함된다.

TCP/IPDPDK네트워크 스택리눅스 네트워킹네트워크 인터페이스