리눅스 네트워크의 이해
- 원서명Understanding Linux Network Internals (ISBN 9780596002558)
- 지은이크리스찬 벤베누띠(Christian Benvenuti)
- 옮긴이공용준, 김세영, 박현지, 정지오
- ISBN : 9788960778719
- 50,000원
- 2016년 06월 30일 펴냄 (절판)
- 페이퍼백 | 1,144쪽 | 188*250mm
- 시리즈 : 오픈소스 프로그래밍
판매처
- 현재 이 도서는 구매할 수 없습니다.
책 소개
요약
클라우드 시대가 다시 도래하면서 네트워크에 대한 관심이 재조명되고 있습니다. 이전 세대에서 오픈플로우(openflow)기반의 네트워크만을 SDN이라고 규정했지만, 현 시대에는 패킷 전송 자동화에 대한 전반적인 부분 그리고 클라우드/가상머신과의 조합을 통한 빠른 배포와 같은 ‘프로그램화'가 더 중요하게 인식되고 있어서 네트워크 기술만으로 이것을 정의하기는 어려워졌습니다. 그리고 네트워크 장비들도 자사의 네트워크 OS로 리눅스를 선택하는 경우가 점점 늘어나서, 리눅스의 네트워크 인프라스트럭처에 대한 이해가 점점 요구되고 있습니다. 이런 시대의 흐름에 맞추어서 이 책은 리눅스가 가지고 있는 네트워크 기능의 기본 이론은 물론 코드레벨까지 설명함으로써 네트워크 엔지니어지만 서버기반 네트워크를 잘 모르시는 분들이나 리눅스 서버 엔지니어지만 네트워크 작동 원리에 대해서 잘 모르시는 분들 모두에게 도움이 될 것입니다.
이 책에서 다루는 내용
■ 네트워킹에서의 주요 문제
■ 인접인프라스트럭처와 프로토콜(ARP)
■ 네트워크인터페이스카드(NIC)장치 드라이버
■ 브리징
■ 시스템 초기화
■ 라우팅
■ 계층 2(연결 계층) 작업과 구현
■ ICMP
■ 계층 3(IPv4)작업과 구현
이 책의 대상 독자
이 책은 네트워킹에 대한 지식을 갖고 있는 사람과 인터넷 엔진(즉, IP 등)이 어떻게 운영체제의 첫 번째 계층 상단에서 동작하는지 궁금한 사람들에게 유익할 것이다. 하지만 각 주제에 대한 이론적인 소개도 해뒀으므로, 입문자들도 금방 따라갈 수 있을 것이다. 어려운 주제들은 충분한 예제들을 통해 이해하기 쉽게 했다.
리눅스는 기본 IP만 지원하지 않고, 꽤 많은 고급 기능을 제공한다. 이 기능들이SMP(Symmetric Multiprocessing)와 커널 선점 방식 같은 커널의 특징들과 함께 충분히 제 역할을 발휘하기 위해서는 섬세하게 다뤄져야 한다. 리눅스 커널의 네트워킹 코드가 독자들이 학습하고 지식을 쌓기 위한 좋은 장이 될 것이다.
또한 독자가 내 의도를 이해하고 배우는 데 흥미를 가진다면 이 책으로부터 만족스러울 만큼 충분한 내용들을 얻을 수 있을 것이다.
이 책의 구성
네트워킹 코드에서 다룰 주제에 따라 1개의 장(chapter)만으로 충분한 것도 있지만, 7개의 장까지 할애한 주제도 있다. 여러 장을 차지할 만큼 복합적이거나 규모가 큰 주제의 경우, 먼저 해당 주제에 대한 이론적인 부분과 개요를 시작 부분에서 다룬다. 모든 참고 사항과 보조 항목들은 해당 부의 마지막 장 ‘기타’ 절에 있다. 얼마나 큰 주제 항목이든 장이 구성되는 틀은 동일하다.
각 주제별로 구현에 대한 설명은 다음과 같은 항목들을 포함한다.
• 큰 그림: 해당 커널 컴포넌트가 네트워크 스택의 어디에 해당하는지 보여준다.
• 주요 데이터 스트럭처와 그림에 대한 간략한 설명: 이들이 서로 어떻게 연관돼 있는지 설명해준다.
• 컴포넌트와 인터페이스 관계인 다른 커널 기능에 대한 설명: 예를 들어 알림 체인이나 데이터 스트럭처는 상호 참조적이다. 네트워킹 코드를 뛰어넘는 수많은 훅(hook)들을 고려했을 때 방화벽은 이러한 커널 특징의 예 중 하나다.
• 플로차트의 확장 가능한 사용법, 코드 이해를 도울 그림, 규모가 크고 복잡한 함수에 대한요약된 로직
참고 내용들은 모두 다음과 같은 항목들을 포함하고 있다.
• 가장 중요한 데이터 스트럭처에 대한 필드별 상세 설명
• 빠르게 참고해볼 수 있는 모든 함수와 매크로, 데이터 스트럭처에 대한 간략한 설명이 담긴 표
• 해당 장에서 다룬 커널 소스 구조에 위치해 있는 파일 목록
• 해당 장의 주제가 된 내용과 커널을 설정하기 위해 사용되는 가장 일반적인 사용자 공간도구들 간의 인터페이스에 대한 설명
• /proc에 생성되는 파일에 대한 설명
리눅스 커널의 네트워킹 코드는 이동 표적일 뿐만 아니라 패스트 러너(fast runner)다. 이 책에서 모든 네트워킹 기능을 다루지는 않는다. 이 책을 읽는 중에도 신규 기능들은 추가되고 있을 것이다. 개인 사용자 혹은 단체, 대학 프로젝트에서의 요청으로 많은 신규 기능이 생겨나지만, 이 기능들이 전반적인 사용자에게 유용한 것이라고 판단됐을 때 공식 커널에 등록된다. 이러한 기능들에 대한 자세한 구현 내용을 다루면서 기능이 포괄적으로 구현됐을 때 어떠한 양상을 보일지에 대한 아이디어도 제공하고자 노력했다. 이는 코드를 수정하거나 어떻게 신규 기능을 구현할지 배울 때 매우 유용할 것이다. 예를 들어 어떠한 기능이든지 간에 다음 항목들을 고려해봐야 한다.
• 어떻게 데이터 스트럭처와 락 기능을 설계할 것인가?
• 사용자 공간 환경설정 도구가 필요한가? 필요하다면 기존 시스템이나 ioctl 명렁어, /proc 파일, 넷링크 소켓을 호출해 커널과 상호작용하는가?
• 신규 알림 체인이 필요하진 않은가? 그리고 기존 체인에 등록해야 하지는 않는가?
• 방화벽과는 어떠한 관계가 있는가?
• 캐시나 가비지 컬렉션 메커니즘, 통계 등에 대한 요구는 없는가?
이 책에서 다루는 주제들은 다음과 같다.
■ 사용자 공간과 커널 간의 인터페이스
3장에서는 커널 내에서 대응되는 대상들과 상호작용하기 위해 사용되는 환경설정 도구와 통신하기 위한 메커니즘에 대한 간략한 개요가 나온다. 자세히 다루지는 않을 예정이지만, 커널 코드의 해당 부분에 대해 이해하는 데 도움이 될 것이다.
■ 시스템 초기화
II부에서는 네트워킹 코드의 주요 컴포넌트를 초기화하는 방법을 설명하고, 어떻게 네트워크 장치가 등록되고 초기화되는지 다룬다.
■ 디바이스 드라이버와 프로토콜 핸들러 간의 인터페이스
III부는 어떻게 인입(들어오는 혹은 수신하는) 패킷이 디바이스 드라이버에 의해 상위 계층 프로토콜로 전달되는지, 그리고 그 반대 방향 또한 어떻게 전달되는 것인지에 대해 상세히 설명한다.
■ 브리징(bridging)
IV부에서는 투명 브리징(transparent bridging)과 스패닝 트리 프로토콜(spanning tree protocol), L3에 라우팅하는 상대인 L2에 대해 설명한다.
■ IPv4(인터넷 프로토콜 버전 4)
V부에서는 IPv4 계층에서 패킷들의 수신과 전달, 로컬 전송이 어떻게 이뤄지는 것인지 설명한다.
■ IPv4와 전송 계층(L4) 프로토콜 간의 인터페이스
20장은 로컬 호스트로 전달되도록 요청된 IPv4 패킷이 어떻게 전송 계층(L4) 프로토콜로 전달되는지에 대해 다룬다(TCP, UDP 등).
■ ICMP(Internet Control Message Protocol)
25장은 ICMP의 구현에 대해 설명한다(이 책에서 다루는 유일한 전송 계층(L4) 프로토콜이다).
■ 인접 프로토콜
인접 프로토콜들은 주어진 자신의 IP 주소들을 고려해 로컬 네트워크 주소를 찾는다. VI부는 다양한 프로토콜의 일반적인 구조와 IPv4가 사용하는 ARP 인접 프로토콜에 대한 세부 내용을 다룬다.
■ 라우팅
이 책에서 가장 많은 부분인 VII부에서는 라우팅 캐시와 테이블에 대해 다룬다. 정책 라우팅, 다중 경로와 같은 고급 기능들에 대해서도 다룬다.
목차
목차
- I부. 소개
- 1장. 도입
- 기본 용어
- 공통 코딩 패턴
- 사용자 공간 도구
- 소스코드 훑어보기
- 기능이 패치로 제공될 때
- 2장. 주요 데이터 스트럭처
- 소켓 버퍼 스트럭처: sk_buff Structure
- net_device 스트럭처
- 3장. 사용자 공간과 커널 간 인터페이스
- 개요
- procfs와 sysctl
- ioctl
- 넷링크
- 설정 변경의 직렬화
- II부. 시스템 초기화
- 4장. 알림 체인
- 알림 체인의 목적
- 개요
- 체인 정의
- 체인에 등록
- 체인에 이벤트 알림
- 네트워크 서브시스템의 알림 체인
- /proc 파일 시스템을 통한 튜닝
- 4장에서 다룬 함수와 변수
- 4장에서 다룬 파일과 디렉터리
- 5장. 네트워크 장치 초기화
- 시스템 초기화 개요
- 장치 등록과 초기화
- NIC 초기화의 기본 목적
- 장치와 커널 간 통신
- 초기화 옵션
- 모듈 옵션
- 장치 처리 계층 초기화: netdevinit
- 사용자 공간 헬퍼
- 가상 장치
- /proc 파일 시스템을 사용한 튜닝
- 5장에서 다룬 함수와 변수
- 5장에서 다룬 파일과 디렉터리
- 6장. PCI 계층과 네트워크 인터페이스 카드
- 6장에서 설명하는 데이터 스트럭처
- PCI NIC 디바이스 드라이버 등록
- 전원 관리와 Wake-on-LAN
- PCI NIC 드라이버 등록의 예
- 큰 그림
- /proc 파일 시스템을 통한 튜닝
- 6장에서 다룬 함수와 변수
- 6장에서 다룬 파일과 디렉터리
- 7장. 컴포넌트 초기화를 위한 커널 인프라스트럭처
- 부팅 시 커널 옵션
- 모듈 초기화 코드
- 최적화된 매크로 기반 태깅
- 부팅 시 초기화 루틴
- 메모리 최적화
- /proc 파일 시스템을 통한 튜닝
- 7장에서 다룬 함수와 변수
- 7장에서 다룬 파일과 디렉터리
- 8장. 장치 등록과 초기화
- 장치 등록 순간
- 장치 해지 순간
- net_device 스트럭처의 할당
- NIC 등록과 해지 개요
- 장치 초기화
- net_device 스트럭처의 구조
- 장치 상태
- 장치 등록과 해제
- 장치 등록
- 장치 등록 해제
- 네트워크 장치의 활성화와 비활성화
- 장치 큐잉 정책 상태 갱신
- 사용자 공간에서 장치 관련 정보의 설정
- 가상 장치
- 락킹
- /proc 파일 시스템을 통한 튜닝
- 8장에서 다룬 함수와 변수
- 8장에서 다룬 파일과 디렉터리
- III부. 전송과 수신
- 9장. 인터럽트와 네트워크 드라이버
- 결정과 트래픽 방향
- 프레임 수신 시 드라이버 알림
- 인터럽트 핸들러
- softnet_data 스트럭처
- 10장. 프레임 수신
- 기타 기능과 상호작용
- 장치의 활성화와 비활성화
- 큐
- 커널의 프레임 리셉션 알림: NAPI와 netif_rx
- 디바이스 드라이버와 커널의 구인터페이스: netif_rx의 첫 부분
- 혼잡 관리
- NETRXSOFTIRQ의 처리: netrxaction
- 11장. 프레임 전송
- 전송의 활성화와 비활성화
- 전송의 활성화와 비활성화
- 12장. 인터럽트에 대한 이해와 참고 사항
- 통계
- /proc와 sysfs 시스템을 통한 튜닝
- III부에서 다룬 함수와 변수
- III부에서 다룬 파일과 디렉터리
- 13장. 프로토콜 핸들러
- 네트워크 스택 개요
- 적절한 프로토콜 핸들러의 실행
- 프로토콜 핸들러 구조
- 프로토콜 핸들러 등록
- 이더넷과 IEEE 802.3 프레임
- /proc 파일 시스템을 통한 튜닝
- 13장에서 다룬 함수와 변수
- 13장에서 다룬 파일과 디렉터리
- IV부. 브리징
- 14장. 브리징: 개념
- 리피터, 브리지, 라우터
- 브리지와 스위치
- 호스트
- 브리지로 LAN 병합
- 다른 LAN 기술을 브리징
- 주소 학습
- 다중 브리지
- 15장. 브리징: 스패닝 트리 프로토콜
- 기본 용어
- 계층적으로 스위치된 L2 토폴로지의 예
- 스패닝 트리 프로토콜의 기본 구성 요소
- 브리지와 포트 ID
- 브리지 프로토콜 데이터 유닛(BPDU)
- 활성화된 토폴로지의 정의
- 타이머
- 토폴로지 변경
- BPDU 캡슐화
- 설정 BPDU의 전송
- 인입 프레임 처리
- 수렴 시간
- 새로운 스패닝 트리 프로토콜에 대한 개괄
- 16장. 브리징: 리눅스에서 구현
- 브리지 장치의 개념
- 주요한 데이터 스트럭처
- 브리징 코드의 초기화
- 브리지 장치와 브리지 포트 생성
- 새로운 브리지 장치 생성
- 브리지 장치의 설정 루틴
- 브리지 삭제
- 브리지에 포트 추가
- 브리지 장치 활성화와 비활성화
- 브리지 포트 활성화와 비활성화
- 브리지 포트의 상태 변경
- 큰 그림
- 포워딩 데이터베이스
- 인입 트래픽 처리
- 브리지 장치에 전송
- 스패닝 트리 프로토콜(STP)
- netdevice 알림 체인
- 17장. 브리징: 기타 주제
- 사용자 공간 설정 도구
- /proc 파일 시스템을 통한 튜닝
- /sys 파일 시스템을 통한 튜닝
- 통계
- IV부에서 다룬 데이터 스트럭처
- IV부에서 다룬 함수와 변수
- IV부에서 다룬 파일과 디렉터리
- V부. 인터넷 프로토콜 버전 4(IPv4)
- 18장. IPv4: 개념
- IP 프로토콜: 개요
- IP 헤더
- IP 옵션
- 패킷 단편화/단편화 제거
- 체크섬
- 19장. IPv4: 리눅스 기초와 특징
- 주요 IPv4 스트럭처
- 일반 패킷 처리
- IP 옵션
- 20장. IPv4: 포워딩과 로컬 전달
- 포워딩
- 로컬 전송
- 21장. IPv4: 전송
- 전송을 위한 주요 함수
- 인접 서브시스템으로의 인터페이스
- 22장. IPv4: 단편화 처리
- IP 단편화
- IP 단편화 제거
- 23장. IPv4: 기타 주제
- 수명이 긴 IP 피어 정보
- IP 헤더의 ID 필드 선택
- IP 통계
- IP 설정
- IP 오버 IP
- IPv4: 무엇이 문제인가?
- /proc 파일 시스템을 통한 튜닝
- V부에서 다룬 데이터 스트럭처
- V부에서 다룬 함수와 변수
- V부에서 다룬 파일과 디렉터리
- 24장. 4계층 프로토콜과 원시 IP 다루기
- 가용 L4 프로토콜
- L4 프로토콜 등록
- L3에서 L4로 전송: iplocaldeliver_finish
- IPv4 대 IPv6
- /proc 파일 시스템을 통한 튜닝
- 24장에서 다룬 함수와 변수
- 25장. ICMPv4
- ICMP 헤더
- ICMP 페이로드
- ICMP 타입
- ICMP 프로토콜을 이용한 애플리케이션
- 큰 그림
- 프로토콜 초기화
- 25장에서 다룬 데이터 스트럭처
- ICMP 메시지 전송
- ICMP 메시지 수신
- ICMP 통계
- 전송 계층으로 오류 통지 전달
- /proc 파일 시스템을 통한 튜닝
- 25장에서 다룬 함수와 변수
- 25장에서 다룬 파일과 디렉터리
- VI부. 인접 서브시스템
- 26장. 인접 서브시스템: 개념
- 인접 호스트란?
- 인접 프로토콜이 필요한 이유
- 공유 매체
- 리눅스 구현
- 인접 프로토콜 프록싱
- 인접 상태와 네트워크 접근 불가 탐색(NUD)
- 27장. 인접 서브시스템: 인프라스트럭처
- 주요 데이터 스트럭처
- L3 프로토콜과 인접 프로토콜의 공통 인터페이스
- 인접 인프라스트럭처의 일반적인 작업
- neighbour 스트럭처의 참조 카운트
- neighbour 항목 생성
- 이웃 제거
- 프록시로 동작
- L2 헤더 캐싱
- 프로토콜 초기화와 제거
- 서브시스템 간 상호작용
- 인접 프로토콜과 L3 전송 함수의 상호작용
- 큐잉
- 28장. 인접 서브시스템: 주소 결정 프로토콜(ARP)
- ARP 패킷 포맷
- ARP 트랜잭션의 예
- Gratuitous ARP
- 다중 인터페이스에서의 응답
- 설정 가능한 ARP 옵션
- ARP 프로토콜 초기화
- neighbour 스트럭처의 초기화
- ARP 패킷의 송신과 수신
- 인입 ARP 패킷 처리
- 프록시 ARP
- 예제
- 외부 이벤트
- ARPD
- 역주소 결정 프로토콜(RARP)
- ND(IPv6)에서 ARP(IPv4)보다 개선된 점
- 29장. 인접 서브시스템: 기타 주제
- 이웃의 시스템 관리
- /proc 파일 시스템을 통한 튜닝
- VI부에서 다룬 데이터 스트럭처
- VI부에서 다룬 파일과 디렉터리
- VII부. 라우팅
- 30장. 라우팅: 개념
- 라우터와 라우트, 라우팅 테이블
- 라우팅의 필수 요소
- 라우팅 테이블
- 룩업
- 패킷 수신과 패킷 전송
- 31장. 라우팅: 고급
- 정책 라우팅의 개념
- 다중 경로 라우팅의 개념
- 다른 커널 서브시스템과의 상호작용
- 라우팅 프로토콜 데몬
- Verbose 모니터링
- ICMP_REDIRECT 메시지
- 공유 미디어
- 역방향 필터링
- 32장. 라우팅: 리눅스 구현
- 커널 옵션
- 주요 데이터 스트럭처
- 라우트와 주소 범위
- 1차, 2차 IP 주소
- 제네릭 헬퍼 루틴과 매크로
- 전역 락
- 라우팅 서브시스템 초기화
- 외부 이벤트
- 다른 서브시스템과의 상호작용
- 33장. 라우팅: 라우팅 캐시
- 라우팅 캐시 초기화
- 해시 테이블 구성
- 다중 경로 캐싱
- DST와 호출 프로토콜 간의 인터페이스
- 라우팅 캐시 플러싱
- 가비지 컬렉션
- 인출 ICMP REDIRECT 속도 제한
- 34장. 라우팅: 라우팅 테이블
- 라우팅 해시 테이블 구성
- 라우팅 테이블 초기화
- 라우트 추가, 삭제
- 정책 라우팅과 정책 라우팅의 영향을 받는 라우팅 테이블 정의
- 35장. 라우팅: 룩업
- 상위 레벨 관점의 룩업 함수
- 헬퍼 루틴
- 테이블 룩업: fnhashlookup
- fib_lookup 함수
- 수신과 전송을 위한 함수 설정
- 입력/출력 라우팅 루틴의 일반적인 구조
- 입력 라우팅
- 출력 라우팅
- 다음 홉 선택상의 다중 경로의 영향
- 정책 라우팅
- 출발지 라우팅
- 분류자 기반의 정책 라우팅과 라우팅 테이블
- 36장. 라우팅: 기타 주제
- 사용자 공간 설정 도구
- 통계
- /proc 파일 시스템을 통한 튜닝
- 포워딩 활성화와 비활성화
- VII부에서 다룬 데이터 스트럭처
- VII부에서 다룬 함수와 변수
- VII부에서 다룬 파일과 경로