May 19, 2025

[NetWork] RX #1 하드웨어 내부 네트워크 처리

[NetWork] RX #1  하드웨어 내부 네트워크 처리

네트워크를 전공에서 배우기는 했지만, 제대로 된 과정을 사실 잘 모르고 있습니다. 하나하나 찾아가는 형식으로 배워나가려고 합니다. 일단 전체적인 처리 과정부터 세세하게 들어가 보도록 하겠습니다.

eBPF에 대해서 공부하려다가 시작하게 되었습니다. 7Layer에 대해서는 알고 있다고 생각하고 진행하겠습니다.
외부 네트워크는 궁금증이 생기거나 요청이 있을 시 진행하겠습니다.

1. NIC

NIC은 패킷을 읽고 데이터를 커널 공간에 저장합니다. 그리고 저장된 공간, 크기 등 메타데이터가 들어간 sk_buff가 생깁니다.

[NetWork] RX #2 NIC, DMA, RX Ring, SK_buff
NIC DMA·RX Ring 구조와 sk_buff, NAPI 동작을 통해 Linux 커널이 패킷을 처리하는 과정을 상세 해설합니다. Zero-copy·DPDK 등 고속 네트워크 예시를 보여줍니다.

RX NIC

2. 네트워크 스택

NIC에서 저장한 데이터는 L2 헤더부터 있는 데이터 입니다.
L2 -> L3 -> L4 를 통해서 사용자가 요청한 queue에 커널이 skb 리스트를 넣습니다.

[NetWork] RX #3 네트워크 스택
NIC에서 받은 정보로 산출된 sk_buff는 패킷단위로 되어 있습니다. 이 패킷을 네트워크의 스택에 따라 진행합니다. GRO napi_gro_receive() 가 작은 패킷들을 묶어 큰 패킷으로 합칩니다. 이름에서 알 수 있듯이 NAPI poll 함수 안에서 실행되지만, skb를 만들고 나서 실행됩니다. skb를 하나 만든 뒤 GRO 엔진이 연속된 flow(IP,TCP,SEQ

3. 유저 스페이스

커널에 있는 queue에서 유저 버퍼로 복사를 진행해야 합니다.

  1. 일단 패킷을 받기 전에 사용자가 socket, bind, listen으로 받을 수 있는 queue를 커널에 생성합니다. 생성한 프로세스의 파일-디스크럽터 테이블에 입력합니다.
  2. 프로세스에서 recv() 요청하면 커널에서 User Buffer에 데이터를 복사해 줍니다.
  3. 완료된 데이터를 free 합니다.

4. eBPF

eBPF에 대해서 알기 위해 시작하였으니, eBPF에 대해서 정리해 봅니다.

eBPF Program Type Hook 위치 예시 역할 실행 시점
XDP (BPF_PROG_TYPE_XDP) NIC RX Ring 직후(skb 만들기 이전) 초고속 필터·Redirect·LB Netfilter·GRO보다 가장 먼저
tc cls/act (BPF_PROG_TYPE_SCHED_CLS/ACT) qdisc ingress / egress 정책 라우팅·QoS·L4 LB skb가 이미 존재, Netfilter
socket_filter (SO_ATTACH_BPF) 소켓 수신 경로 tcpdump 대용 캡처·DoS 차단 demux 직후, 유저 read() 전에
cgroup sendmsg/recvmsg connect(), sendmsg() L4-방화벽, per-cgroup 계량 sys-call 경계
struct_ops (BPF_PROG_TYPE_STRUCT_OPS) 커널 콜백 표 구조체 대체 커스텀 TCP CongCtrl, 스케줄러 커널 함수 내부 트램펄린
kprobe/tracepoint/trampoline 임의 커널 함수 세부 트레이싱·패치 함수 진입/탈출
  1. bpf() sys-call로 바이트코드를 로드(load) 한 뒤 “attach” 단계에서 원하는 훅을 선택합니다.
  2. 커널 Verifier가 “루프 탈출, NULL 체크, 범위 검증” 등을 통과시켜야만 JIT-머신코드로 변환됩니다.

Comments