ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파일패치 서버
    프로그래밍/네트워크 프로그래밍 2016. 10. 12. 06:41
    반응형



    클라이언트와 서버를 이용한 간단한 파일패치서버

    패치목록파일들을 이용한 테스트

    파일목록이 바꼈을 경우 서버로 데이터를 전송해서

    관련 파일들을 전송한다.

    C/C++

    소켓서버프로그래밍

    클라,업데이트서버




    개발중인 프로젝트에서 클라이언트 업데이트 시스템이 필요해졌다.
    업데이트 되는 파일만 새롭게 받게 한다면 편할 테지만 큰 파일의 용량은 600MB가 넘었고, 서버에 차지하는 용량과 트래픽도 부담이 되었다.

    그리하여 이전 버전과 새로운 버전의 Binary data 차이점(Patch file)만을 추출 하여 이를 서버에 업로드 하고, 유저는 해당 Patch file 만을 받아 이전 버전의 파일 + 받은 Patch file 을 이용하여 새로운 버전의 파일을 생성 해내는 방식으로 업데이트 시스템을 만들기로 하였다.

    처음부터 Binary를 비교하여 Chunk를 만들려고 했으나 자료 조사 중 RTPatch, bsdiff, MSDelta 를 찾아내었는데, 그중 bsdiff 를 사용하기로 했다.

    http://www.daemonology.net/bsdiff/

    ( MSDelta는 Microsoft에서 제공하는 API 인데, Vista 부터 사용이 가능하다고 하여 패스)

    과정

    패치 파일을 생성하는 순서는 다음과 같다.

    이전 버전의 클라이언트 폴더 이름 : A
    새로운 버전의 클라이언트 폴더 이름 : B

    1. A 폴더 내부에 있는 파일과 B 폴더 내부에 있는 파일이 동일한 파일인지 확인.
    2. 동일하지 않다면, bsdiff를 이용하여 패치 파일 생성.
    3. 생성된 패치 파일을 bzip을 이용하여 최대 레벨로 압축.
    4. 압축된 패치 파일을 MD5 값과 함께 서버의 업로드.

    A 폴더와 B 폴더의 모든 파일을 위 과정을 거쳐서 패치 파일들을 생성 한후 MD5 값과 함께 서버의 업로드를 하면 된다.

    패치 파일을 적용하는 순서는 다음과 같다.

    1. 업데이트 프로그램에서 현재 파일들의 버전을 확인 후 알맞는 패치 파일을 서버로 요청하여 내려 받는다.
    2. 내려받은 패치 파일이 유효한지 MD5 값을 비교 한다.
    3. bzip을 이용하여 압축을 해제 한다.
    4. 이전 버전의 파일과 패치 파일을 bsdiff를 이용하여 합친다.
    5. 새롭게 생성된 파일의 MD5값을 서버로 부터 요청 받아 패치가 제대로 이루어 졌는지 확인 한다.

    퍼포먼스

    위 과정대로 코딩 후, 테스트(cpu I7-2700K)를 해보았다.

    가장 용량이 큰 600MB 파일의 경우 diff 하는데 5분 ~ 10분 정도의 시간이 걸린다.
    병렬 처리가 아니기 때문에 좀 걸린다.

    하지만 patch를 할때는 5초 내외의 시간이 걸리므로, 유저 입장에서는 충분히 사용할만 하다고 생각 된다.

    단점

    단점으로는 diff를 할 때, 메모리를 좀 많이 사용한다. 때문에 32bit에서는 diff를 할 수가 없다(메모리 할당 초과 – 2GB 이상 할당이 어렵다)

    마무리

    한번 패치 파일을 생성하는데 총 15분 정도의 시간이 소요 되고 메모리를 많이 사용하지만 개발 환경의 램은 빵빵 하며, 자주 패치 파일을 생성하는 것이 아니기 때문에 넘어갈만 하다.
    또한, 클라이언트에서 패치를 할 때는 전혀 문제가 없고, 서버의 용량이나 트래픽을 고려하는 것이 초기 목표이므로…

    잘 사용하기로 했다.

    반응형

    '프로그래밍 > 네트워크 프로그래밍' 카테고리의 다른 글

    html와 Node.js 웹소켓서버  (3) 2016.10.12
    IOCP게임서버 동기화 패킷처리  (0) 2016.10.12
    [포트폴리오]리니지 네트워크  (4) 2014.07.05
    게임서버 만들기 3  (0) 2014.06.25
    서버만들기 2  (0) 2014.06.25
Designed by Tistory.