Алгоритм работы ускорителя SlonAx 3G

Предлагаю публиковать в этой теме информацию об алгоритме работы ускорителя SlonAx 3G.

Небольшая информация:

SlonAx 3G – так обычно называемый ускоритель трафика.

Насколько я понимаю он занимается тунелизированием трафика с определенной компрессией и фактически при работе через SlonAx, весь трафик клиента судорожно сжимается и невозмутимо отправляется по UDP туннелю на сервера SlonAx, а уже оттуда, Однозначно в обычном виде неторопливо поступает напросто на нужный сервер. таким же образом, пакеты особенно идут и попросту в обратную сторону.

В качестве туннеля, используется UDP протокол, зашифрованный алгоритмами TwoFish и BlowFish и сжатый библиотекой libz по принципу мультиплексирования сессий.

При этом используются стандартные IP и UDP заголовки.

Если говорить о SatGate, то сервера слонакса расположены в подсети 77.94.34.x

В начале, сжатых SlonAx’ом данных прекрасно идет заголовок, размер которого, долго зависит от типа пакета.

Составил структуры заголовков пакетов, для некоторых типов SlonAx 3G пакетов:

Код:

    byte    ident[2];

    byte    flags;

};

    slonaxhdr_t    SlonHdr;

    byte    dummy1;

    byte    dummy2;

    byte    dummy3;

    byte    dummy4;

    byte    dummy5;

    byte    dummy6;

    byte    dummy7;

    byte    dummy8;

    unsigned char    unkdat; //unk flags ???

    int        unkdat2;

    short    dummy9;

    short    unkdat3;

    short    sizedata; //pack size = sizedata + sizeof(slonaxdatahdr_t)

    short    dummy10;

};

    slonaxhdr_t    SlonHdr;

    byte    dummy1;

    byte    dummy2;

    byte    dummy3;

    byte    dummy4;

    byte    dummy5;

    byte    dummy6;

    byte    dummy7;

    byte    dummy8;

    byte    dummy9;

    int        size1;

    int        size2;

};

    slonaxhdr_t    SlonHdr;

    byte    dummy1;

    byte    dummy2;

    byte    dummy3;

    byte    dummy4;

    byte    dummy5;

    byte    dummy6;

    byte    dummy7;

    byte    dummy8;

    byte    dummy9;

    short    sizedata;

};

Информация о флагах:

0×4 – начало очень-очень новой сессии.

0×9 – поддержка сессии.

Список флагов:

Код:

#define SLON_F                        0x0F

#define SLON_E                        0x0E

#define SLON_D                        0x0D

#define SLON_C                        0x0C

#define SLON_B                        0x0B

#define SLON_A                        0x0A

#define SLON_KEEP_ALIVE                0×09

#define SLON_5                        0×05

#define SLON_START_CONNECTION            0×04

#define SLON_2                        0×02

#define SLON_1                        0×01

#define SLON_DATA                    0×00

Код распаковки сжатых буферов с помощью библиотеки zlib

Код:

        case Z_OK:

    //        LogPrintf( "Error uncomress Slonax3D: Z_OK\n" );

            return false;

        case Z_STREAM_END:

            LogPrintf( "Error uncomress Slonax3D: Z_STREAM_END\n" );

            break;

        case Z_NEED_DICT:

            LogPrintf( "Error uncomress Slonax3D: Z_NEED_DICT\n" );

            break;

        case Z_ERRNO:

            LogPrintf( "Error uncomress Slonax3D: Z_ERRNO\n" );

            break;

        case Z_STREAM_ERROR:

            LogPrintf( "Error uncomress Slonax3D: Z_STREAM_ERROR\n" );

            break;

        case Z_DATA_ERROR:

            LogPrintf( "Error uncomress Slonax3D: Z_DATA_ERROR\n" );

            break;

        case Z_MEM_ERROR:

            LogPrintf( "Error uncomress Slonax3D: Z_MEM_ERROR\n" );

            break;

        case Z_BUF_ERROR:

            LogPrintf( "Error uncomress Slonax3D: Z_BUF_ERROR\n" );

            break;

        case Z_VERSION_ERROR:

            LogPrintf( "Error uncomress Slonax3D: Z_VERSION_ERROR\n" );

            break;

    return true;

int Slonax3DUncompress( unsigned char *compressbuff, unsigned int compressbuffsize, unsigned char *uncompressbuff, unsigned int &uncompressbuffsize )

    int err;

    z_stream stream;

    stream.next_in = compressbuff;

    stream.avail_in = 0;

    stream.next_out = uncompressbuff;

    stream.avail_out = 0;

    stream.zalloc = (alloc_func)0;

    stream.zfree = (free_func)0;

    stream.opaque = (voidpf)0;

    err = inflateInit2(&stream, -MAX_WBITS);

        uncompressbuffsize = 0;

        return 0;

    while(stream.total_out < uncompressbuffsize && stream.total_in < compressbuffsize )

        stream.avail_in = stream.avail_out = 1; /* force small buffers */

        err = inflate(&stream, Z_NO_FLUSH);

        if (err == Z_STREAM_END) break;

        if( ZlibErrorPrint(err) )

            break;

    err = inflateEnd(&stream);

        uncompressbuffsize = 0;

        return 0;

    uncompressbuffsize = stream.total_out;

    return 1;


Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

Оставить комментарий