1. 계층 구조
통신 하려는 양측 단은 서로 IP 주소와 포트 번호를 알고 있어야 하며, 프로토콜을 지키는 경우에 통신이 가능함
통신 프로토콜
- 층 구조(layered architecture)를 가짐
- OSI 프로토콜
- 표준 프로토콜
- 7층을 가짐 → 각 층마다 명세와 인터페이스가 명확히 정의되어 있음
- TCP/IP 프로토콜
-
상용 시스템이 주로 사용하는 프로토콜

BDS 소켓 층
- 가장 상위 층
- 사용자에게 소켓 인터페이스를 제공
- 하위 계층의 모든 작업을 추상화시켜 사용자 태스크에게 소켓이라는 객체를 제공
** 소켓 : 통신 연결의 한쪽 끝
⇒ 사용자 태스크는 소켓만을 인식하고 파일시스템 인터페이스를 통해 일관된 구조로 통신
- 사용자는 프로토콜 패밀리 (도메인) 을 선택할 수 있음
INET 층
- 사용자가 소켓의 유형(type)을 선택할 수 있음
- 유형 종류
- 스트림 (Stream) → TCP
- 데이터 전송 중 분실, 오염, 또는 중복되지 않았다는 것을 보장하는 신뢰할 수 있는 양방향 순차 데이터 전송 제공
- 데이터그램 (Datagram) → UDP
- 양방향 데이터 전송을 제공하지만 그 메시지가 제대로 도착한다는 것을 보장하지 않음
- 가공하지 않은 유형 (Raw)
- 도착 신뢰 메시지 유형 (Reliable Delivered Messages)
TCP 층
- 스트림 유형의 소켓을 선택했을 때 이동
- TCP : 일련의 패킷들에게 번호를 설정하고 전송에 따라 상태를 유지하여 TCP 통로 양 끝 간에 전송 데이터가 정확하게 수신되었는지 확인
너무 신뢰하지는 말 것!
IPv4는 원래 신뢰성이 없음 → 그저 최선을 다할 뿐…..
특수한 경우를 제외하고는 TCP와 UDP 간의 속도 차이도 미미함
IPv6에는 신뢰성을 향상시키려는 다양한 기법이 추가됨
UDP 층
- 데이터그램 유형의 소켓을 선택했을 때 이동
- UDP : 패킷을 전송할 때 그 패킷이 목적지에 안전하게 도착했는지 알 수도 없고 신경쓰지도 않음
IP 층
- 인터넷 프로토콜을 구현한 층
- IP 주소를 사용해 통신
- IP 주소 : 각 NIC (Network Interface Card) 마다 고유함
- 자신의 IP 주소와 목적지 IP 주소를 이용해 패킷을 만듬
- 라우팅 정보와 목적지 IP를 보고 해당 네트워크 드라이버에게 패킷을 전송하며, 전송할 때 큐 정책에 따라 패킷 흐름 제어 등의 부가적인 기능 수행
데이터 링크 층
- PPP, SLIP, 이더넷 등등
- 이 아래에는 네트워크 디바이스 존재
encapsulation

사용자가 응용 프로그램에게 전송할 데이터 보냄 → 응용은 자신의 제어에 필요한 데이터를 헤더에 추가 → 응용 데이터가 TCP 층으로 전달 → TCP 층에서 자신의 헤더를 이 데이터에 추가하여 메시지(소스 포트 번호, 목적지 포트 번호, 일련 번호, 응답 번호 등) 생성 → 메시지 IP층으로 전달 → IP층에서 자신의 헤더를 이 메시지에 추가하여 패킷 생성 (필요할 경우 단편화 수행) → 패킷 이더넷 층으로 전달 → 이더넷 층에서는 자신의 헤더를 이 메시지에 추가하여 프레임 생성
소켓 인터페이스
- 통신을 위해서 < 프로토콜, 보내는 호스트, 보내는 응용, 프로그램 목적지 호스트, 목적지 응용> 프로그램이라는 5가지가 결정되어야 함
- 종류
- socket() : 프로토콜 선택 인터페이스
- bind() : 보내는 쪽의 호스트 주소와 응용프로그램을 선택하는 인터페이스
- connect() : 목적지 호스트 주소와 응용 프로그램을 선택하는 인터페이스
- accept() : 서버가 클라이언트의 통신을 받아들일 때 사용
- listen() : 서버가 동시에 몇 개의 요청을 서비스 하겠다는 등을 결정할 때 사용
- send(), recv(), read(), write() : 데이터 전송
2. 주요 커널 내부 구조
리눅스
- 제어 흐름이 다양한 곳으로 분기할 수 있는 상황을 효과적으로 지원하기 위해 층 사이에서 제어가 전달될 때 자료구조를 이용한 간접 호출 방법으로 통신 프로토콜 구현 ⇒ 하위 층에서 제공하는 함수를 상위 층에서 이용할 때 상위 층에서 직접 이 함수를 호출하는 것이 아닌 하위 층이 자신이 제공하는 함수의 시작 주소를 특정 자료구조에 등록하고 상위 층에서는 단지 자료 구조에 등록된 함수를 호출하는 방식으로 함수를 간접 호출
- 상위 층과 하위 층간에 종속 관계가 없어지며, 일부 층의 내용을 수정하거나 새로운 층을 추가할 때 커널의 변경이 간단해짐
- 상위 층은 하위 층에 어떤 함수가 어떤 이름으로 구현되어 있는지 몰라도 되며, 단지 자료구조에 등록된 함수를 호출하기만 하면 하위 층으로 데이터를 전달할 수 있음
이 글은 아래의 책을 공부 및 정리한 내용입니다.
리눅스 커널 내부구조 - 예스24