Skip to content

beeean17/mini-cloud

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Mini Cloud

Mini Cloud는 리눅스 시스템 프로그래밍의 핵심 개념(Socket, Fork, Signal, File I/O)을 활용하여 구현한 동시성 파일 전송 시스템입니다. 여러 클라이언트가 동시에 접속하여 파일을 업로드, 다운로드, 관리할 수 있는 클라우드 스토리지 서비스의 핵심 기능을 제공합니다.


🚀 주요 기능 (Features)

1. 파일 전송 및 관리

  • UPLOAD: 로컬 파일을 서버로 전송합니다. 원자적(Atomic) 파일 교체를 통해 전송 중 오류가 발생해도 기존 파일이 손상되지 않습니다.
  • DOWNLOAD: 서버에 저장된 파일을 로컬로 다운로드합니다.
  • DOWNLOAD ALL: 서버에 있는 모든 파일을 한 번에 다운로드합니다.
  • LIST: 서버에 저장된 파일 목록을 조회합니다.
  • DELETE: 서버에 저장된 파일을 삭제합니다.

2. 동시성 처리 (Concurrency)

  • Multi-Client Support: fork()를 사용하여 각 클라이언트 접속마다 독립적인 자식 프로세스를 생성, 다수의 클라이언트가 동시에 작업을 수행할 수 있습니다.
  • Zombie Process Prevention: SIGCHLD 시그널을 핸들링하여 종료된 자식 프로세스 자원을 즉시 회수합니다.

3. 보안 및 안정성

  • Token Authentication: 서버와 클라이언트 간 공유된 비밀 토큰(Secret Token)을 통해 인가된 사용자만 접속을 허용합니다.
  • Path Traversal Protection: ../와 같은 경로 조작 시도를 차단하여 서버 파일 시스템을 보호합니다.
  • Upload Size Limit: 서버 디스크 보호를 위해 업로드 파일의 최대 크기를 제한할 수 있습니다.

🛠 사용 방법 (Usage)

1. 빌드 (Build)

프로젝트 루트 디렉토리에서 make를 실행하여 서버와 클라이언트를 빌드합니다.

make clean
make all

빌드가 완료되면 bin/ 디렉토리에 실행 파일이 생성됩니다.

2. 서버 실행 (Server)

서버를 실행할 포트 번호를 지정하여 실행합니다. (선택적으로 저장소 경로 지정 가능)

# 기본 실행 (포트 9000)
./bin/server 9000

# 저장소 경로 지정 실행
./bin/server 9000 ./my_storage

환경 변수 설정 (옵션):

  • MC_SERVER_TOKEN: 인증 토큰 설정 (예: export MC_SERVER_TOKEN=secret123)
  • MC_MAX_UPLOAD_BYTES: 업로드 용량 제한 (바이트 단위)

3. 클라이언트 실행 (Client)

서버의 IP 주소와 포트 번호를 입력하여 접속합니다.

./bin/client 127.0.0.1 9000

인증 토큰 사용 시:

# 환경 변수로 토큰 전달
export MC_CLIENT_TOKEN=secret123
./bin/client 127.0.0.1 9000

4. CLI 명령어

접속 후 다음과 같은 명령어를 사용할 수 있습니다.

mini-cloud> LIST                  # 파일 목록 조회
mini-cloud> UPLOAD file.txt       # 파일 업로드
mini-cloud> DOWNLOAD file.txt     # 파일 다운로드
mini-cloud> DOWNLOAD ALL          # 전체 파일 다운로드
mini-cloud> DELETE file.txt       # 파일 삭제
mini-cloud> QUIT                  # 종료

⚙️ 구현 상세 (Implementation Details)

이 프로젝트는 리눅스 시스템 콜을 직접 사용하여 저수준(Low-level) 동작 원리를 이해하고 구현하는 데 초점을 맞췄습니다.

1. 시스템 아키텍처

  • Client-Server Model: TCP/IP 소켓을 기반으로 통신합니다.
  • Process-based Concurrency: fork() 시스템 콜을 사용하여 'Connection per Process' 모델을 구현했습니다. 이는 구현이 직관적이고 프로세스 간 메모리가 격리되어 있어 한 클라이언트의 크래시가 서버 전체에 영향을 주지 않는 장점이 있습니다.

2. 핵심 시스템 콜 (System Calls)

네트워크 통신

  • socket(), bind(), listen(): 서버 소켓 생성 및 대기
  • accept(): 클라이언트 연결 수락
  • connect(): 클라이언트의 서버 접속

프로세스 제어

  • fork(): 클라이언트 처리를 위한 자식 프로세스 생성
  • waitpid(): SIGCHLD 시그널 핸들러 내에서 호출하여 좀비 프로세스 제거
  • sigaction(): SIGCHLD(자식 종료), SIGPIPE(연결 단절) 등 시그널 처리 설정

파일 입출력

  • open(), read(), write(), close(): 기본적인 파일 읽기/쓰기
  • rename(): 원자적 파일 교체를 위해 사용. 임시 파일에 업로드를 완료한 후 원본 파일명으로 교체하여, 전송 중단 시 불완전한 파일이 남는 것을 방지합니다.
  • unlink(): 파일 삭제 및 임시 파일 정리
  • opendir(), readdir(): 디렉토리 내 파일 목록 조회

3. 프로토콜 (Protocol)

바이너리 기반의 독자적인 프로토콜을 설계하여 오버헤드를 최소화했습니다.

typedef struct {
    uint32_t magic;        // 프로토콜 식별자 (Magic Number)
    uint8_t  version;      // 프로토콜 버전
    uint8_t  command;      // 명령어 (UPLOAD, DOWNLOAD, LIST, ...)
    uint32_t filename_len; // 파일명 길이
    uint64_t payload_len;  // 데이터(Payload) 크기
} mc_packet_header_t;
  • Endianness Handling: htonl(), ntohl() 등을 사용하여 네트워크 바이트 오더(Big-endian)를 준수, 서로 다른 아키텍처 간의 호환성을 보장합니다.

📂 디렉토리 구조

mini-cloud/
├── include/          # 헤더 파일 (프로토콜, 서버/클라이언트 인터페이스)
├── src/
│   ├── client/       # 클라이언트 소스 코드
│   ├── server/       # 서버 소스 코드
│   └── common/       # 공통 유틸리티 (프로토콜 처리 등)
├── scripts/          # 배포 및 유틸리티 스크립트
└── tests/            # 테스트 코드 및 스크립트

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors