2016-06-29 7 views
2

Я видел несколько источников, заявляющих, что Thrift - это бинарный протокол связи (например, первая строка его статьи в Википедии).Стрит может использовать http, но это бинарный протокол связи?

Но, Thrift может совершать звонки через http, который, как я полагал, был текстовым протоколом, а не двоичным.

Возможно, источники просто говорят, что у Thrift есть доступные параметры двоичного протокола, но также есть такие опции, как http?

Я понимаю, что я могу не понимать что-то о том, что означает «протокол» в контексте «Стрит». Например, с помощью опции TJsonProtocol для кодирования данных JSON можно передавать данные по http, а также по бинарному протоколу?

Извините, если я неправильно использовал какие-либо условия, которые, я думаю, могут способствовать моему смущению. Я, к сожалению, не эксперт по модели OSI.

+1

Если http был ограничен текстом, как вы могли скачать программу, изображение или почтовый файл с веб-сайта через http? Как вы могли видеть логотип SO наверху этой страницы?Или общий аватар рядом с вашим именем пользователя? –

+0

Привет, я знаю, что полезная нагрузка http может быть двоичной, но то, что я подразумевал под «текстовым протоколом», заключается в том, что метаданные в запросе и ответе кодируются как текстовые символы, а не в двоичном формате. Разница обсуждается здесь http://stackoverflow.com/questions/2645009/binary-protocols-v-text-protocols. По этой причине Http считается текстовым протоколом. – StackMonster

+0

Я обращался к вашему второму абзацу, где вы говорите * через http, который, как я полагал, был текстовым протоколом, а не двоичным *. –

ответ

2

Во-первых, Википедия не является авторитетным ресурсом, поэтому не делайте ставки на нее.

Нет, Thrift не является бинарным протоколом связи. Thrift не является протоколом.

Thrift is a framework, что дает возможность сериализации в и общаться более различных протоколов и транспортирует, которые включают в себя HTTP и бинарный файл, но ни в коем случае не ограничивается этим.

На самом деле, вся идея о библиотеке Thrift заключается в том, чтобы предложить богатый набор возможностей, из которых конкретное решение можно построить как можно более свободно. Вы хотите JSON через HTTP? Конечно, держи. Вы хотите иметь двоичный код, но вам нужно что-то более компактное, чем двоичное? Конечно, используйте TCompactProtocol или GZIP. Вы хотите добавить TLS? Нет проблем, просто добавьте его в свой стек. Именованные трубы? SASL? Сообщения? Вы называете это.

И если этого недостаточно (или если конкретный элемент еще не был реализован для выбранного вами языка), то всегда можно написать собственную реализацию транспорта или протокола. Это не сложно, и the /contrib folder уже содержит несколько примеров.

Я понимаю, что, возможно, я неправильно понимаю, что означает «протокол» в контексте «Трэйфта».

Действительно, протокол является перегруженным термином. В контексте Thrift протокол представляет собой некоторую реализацию, которая происходит от TProtocol.

void WriteMessageBegin(TMessage message); 
    void WriteMessageEnd(); 
    void WriteStructBegin(TStruct struc); 
    void WriteStructEnd(); 
    void WriteFieldBegin(TField field); 
    void WriteFieldEnd(); 
    void WriteFieldStop(); 
    void WriteMapBegin(TMap map); 
    void WriteMapEnd(); 
    void WriteListBegin(TList list); 
    void WriteListEnd(); 
    void WriteSetBegin(TSet set); 
    void WriteSetEnd(); 
    void WriteBool(bool b); 
    void WriteByte(sbyte b); 
    void WriteI16(short i16); 
    void WriteI32(int i32); 
    void WriteI64(long i64); 
    void WriteDouble(double d); 
    void WriteString(string s); 
    void WriteBinary(byte[] b); 

    TMessage ReadMessageBegin(); 
    void ReadMessageEnd(); 
    TStruct ReadStructBegin(); 
    void ReadStructEnd(); 
    TField ReadFieldBegin(); 
    void ReadFieldEnd(); 
    TMap ReadMapBegin(); 
    void ReadMapEnd(); 
    TList ReadListBegin(); 
    void ReadListEnd(); 
    TSet ReadSetBegin(); 
    void ReadSetEnd(); 
    bool ReadBool(); 
    sbyte ReadByte(); 
    short ReadI16(); 
    int ReadI32(); 
    long ReadI64(); 
    double ReadDouble(); 
    string ReadString(); 
    byte[] ReadBinary(); 

Протоколы транзита предлагают высокоуровневый способ записи и считывания с базового транспортного уровня. Протокол Thrift отвечает за перевод между данными, используемыми в программе, и необработанными байтами, которые входят в родной транспорт. Например, TJSONProtocol заботится о рендеринге и анализе данных в байтах JSON и из них.

Напротив, производное Thrift TTransport, находящееся ниже уровня протокола, определяет, где данные хранятся физически. Этот аспект полностью абстрагирован, уровень протокола не имеет понятия о физическом носителе (и не должен). И наоборот, транспортный уровень не знает, что означают данные, проходящие через него, он видит только байты.

+0

Спасибо, я полностью согласен с тем, что Thrift - это каркас, а не протокол, поэтому я был смущен всякий раз, когда видел, что он называется «бинарным протоколом», поэтому мой пост. Этот ответ подтвердил мое ощущение, что Thrift предлагает несколько вариантов протокола и что его неточно определить как «двоичный». Я думаю, было просто странно видеть это как самое первое утверждение в статье Википедии о хорошо известной технологии. – StackMonster

 Смежные вопросы

  • Нет связанных вопросов^_^