어읽로꾸거
[Linux Network Internals] 1. Introduction 본문
Understanding Linux Network Internals 책을 읽고 정리한 내용입니다.
Chapter 1.Introduction
용어에 대한 정리
- octet, byte
- 8비트 단위를 말함
- Vector, Array
- 상호 교환적으로 사용
- L2 - Ethernet
- L3 - IP
- L4 - TCP UDP ICMP 등
- Input, Ingress, RX - 수신의 의미
- Output, Egress, TX - 송신의 의미
- IRQ - Interrupt
네트워크 기능도 다른 커널의 기능과 마찬가지로, 하나의 구성원
=> 공유자원을 적절하고 공정하게 사용해야 함
메모리 캐시
커널이 메모리 전용 캐시를 위해 유지하는 데이터 구조의 예
- Socket buffer descriptors
- net/core/sk_buff.c의 skb_init 함수에 의하 할당, sk_buff 버퍼 디스크립터의 할당에 사용됨
- 아마 가장 많은 할당/해제 하는 구조체일 것
- Neighboring protocol mappings
- L3 to L2 주소 매핑을 위해 저장하는 데이터 구조
- Routing tables
- L3 라우팅 테이블
메모리 캐시를 다루기 위해선
- kmem_cache_create
- kmem_cache_destroy
- kmem_cache_alloc
- kmem_cache_free
로 생성/제거/할당/해제를 함. kmalloc/kfree 보다 효율이 좋음
캐싱과 해시 테이블
arp 캐시라던가, 라우팅 테이블 캐시 등 여러 캐시가 사용됨
캐시 조회시, 캐시에 없는 항목이 있을 경우 새로운 요소를 생성함
캐시를 해시 태이블로 구현하기도 함 => 해시 충돌이 발생하지 않는 것이 중요함 (그래서 해시 크기를 키우고 조회 시간 개선)
어떤 경우엔, 해시 테이블에서 단일 버킷에 집중하려는 DoS 공격이 있기도 해서, 랜덤한 요소로 이를 방어
참조 카운트
데이터 구조체에 대해서 참조 카운트가 증가/감소 하는 경우가 있음 => 조회가 필요할 때 해제되면 안되기 때문
참조 카운트로 조기에 해제되는 일을 막을 수 있음
가비지 컬렉션
메모리 정리를 위한 2가지 내용
- 비동기적 가비지 컬렉션: 정기적으로 타이머가 호출되어 데이터 구조체를 스캔하고 삭제할 수 있는 구조체를 해제. 일반적으로는 참조 카운트가 0인 경우
- 동기적 가비지 컬렉션: 메모리 부족으로 인해서 기다릴 수 없는 경우, 가비지 컬렉션이 발생 (공격적으로)
함수 포인터와 가상 함수 테이블
함수 포인터를 통해서 C에서도 객체 지향 언어 처럼 구조체 내에 함수를 포함 가능
네트워크의 예시
- sk_buff 구조체에 함수 포인터로 초기화 동작
- 패킷이 전송 준비가 되면, net_device 구조체의 hard_start_xmit 포인터에 전달
함수 포인터가 데이터 구조체로 묶인 집합을 가상 함수 테이블(VFT)이라고 함
GoTo 문
goto 문은 선호되지 않지만 커널에는 계속 사용됨. 그 이유는?
막 만든 goto문은 혼란을 야기함. 하지만 잘 만든 goto문은 특정 예회 상황으로 쉽게 넘어갈 수 있음. 특히 네트워킹에는 흔해서 편리함.
막 사용된건 절대 아님
RCU(Read Copy Update)
RCU의 기본 개념은 데이터 구조체에 대한 읽기 작업이 이루어지는 동안에도 쓰기 작업이 가능하도록 하는 것입니다. 이를 달성하기 위해 RCU는 세 가지 주요 단계를 거칩니다:
- Read (읽기):
RCU를 사용하여 보호된 데이터 구조체에 대해 다수의 읽기 작업이 동시에 수행될 수 있습니다. RCU의 핵심은 읽기 작업 중에 락(lock)을 사용할 필요가 없다는 것입니다. 이는 동시성 제어에 대한 부담을 줄이고 성능을 향상시킵니다. - Copy (복사):
쓰기 작업이 필요할 때는 먼저 데이터 구조체의 복사본을 생성합니다. 이 복사본에서 변경 작업이 이루어집니다. 이때, 기존의 읽기 작업은 여전히 원본 데이터 구조체를 참조하게 됩니다. - Update (업데이트):
복사본에서의 작업이 완료되면, 원본 데이터 구조체를 새로운 버전으로 업데이트합니다. 이때 새로운 읽기 작업은 이 새로 업데이트된 버전을 참조하게 됩니다. 기존에 원본을 참조하던 읽기 작업은 완료된 후에 새로운 버전을 참조하게 됩니다.
RCU의 장점
- 높은 성능: RCU는 다수의 읽기 작업이 수행되는 환경에서 높은 성능을 제공합니다. 읽기 작업은 락 없이 진행되므로, 성능 저하 없이 다수의 읽기 작업이 동시에 수행될 수 있습니다.
- 낮은 오버헤드: 쓰기 작업이 일어날 때만 복사본이 생성되므로, 성능 오버헤드가 적습니다.
- 비차단 동작: 읽기 작업이 쓰기 작업에 의해 방해받지 않으므로, 시스템의 응답성이 향상됩니다.
호스트와 네트워크 순서 간의 변환
커널에는 리틀 엔디언과 빅 엔디언 2개에 대한 구현이 다 있음
그걸 이용
(TCP IP등 L3 이상에선 Big endian 이용)