Ho nyatsuoa ha protocol le mekhoa ea tlhophiso ea Telegraph. Karolo ea 1, tekheniki: boiphihlelo ba ho ngola moreki ho tloha qalong - TL, MT

Morao tjena, melaetsa e mabapi le hore na Telegram e ntle hakae, hore na barab'abo rōna ba Durov ba khabane hakae le ba nang le phihlelo mekhoeng ea ho haha ​​​​marang-rang, joalo-joalo ba qalile ho hlaha hangata ho Habré. Ka nako e ts'oanang, ke batho ba fokolang haholo ba hlileng ba ikakhelang ka setotsoana ho sesebelisoa sa tekheniki - hangata, ba sebelisa mokhoa o bonolo (le o fapaneng haholo le MTProto) Bot API e thehiloeng ho JSON, 'me hangata ba amohela feela. ka tumelo dithoriso tsohle le PR tse potolohang lenqosa. Hoo e ka bang selemo le halofo e fetileng, mosebetsi-'moho le 'na ho Eshelon NGO Vasily (ka bomalimabe, tlaleho ea hae ea Habré e ile ea hlakoloa hammoho le moralo) o ile a qala ho ngola moreki oa hae oa Telegram ho tloha qalong ho Perl,' me hamorao mongoli oa mela ena o ile a ikopanya. Ke hobane'ng ha Perl, ba bang ba tla botsa hang-hang? Hobane merero e joalo e se e ntse e le teng ka lipuo tse ling.Ha e le hantle, ha se taba ena, ho ka ba le lipuo tse ling moo ho se nang letho. laebrari e entsoeng hantle, 'me ka hona mongoli o tlameha ho tsamaea hohle ho tloha qalong. Ho feta moo, cryptography ke taba ea ts'epo, empa netefatsa. Ka sehlahisoa se lebisitsoeng ho tšireletseho, u ke ke ua itšetleha feela ka laebrari e entsoeng esale pele e tsoang ho moetsi ebe u e tšepa ka bofofu (leha ho le joalo, sena ke sehlooho sa karolo ea bobeli). Hajoale, laeborari e sebetsa hantle maemong a "average" (e u lumella ho etsa likopo life kapa life tsa API).

Leha ho le joalo, ho ke ke ha e-ba le li-cryptography tse ngata kapa lipalo letotong lena la lipapatso. Empa ho tla ba le lintlha tse ling tse ngata tsa tekheniki le lithupa tsa meralo (hape li na le thuso bakeng sa ba ke keng ba ngola ho tloha qalong, empa ba tla sebelisa laebrari ka puo efe kapa efe). Kahoo, sepheo se seholo e ne e le ho leka ho kenya tšebetsong moreki ho tloha qalong ho latela litokomane tsa molao. Ke hore, a re nke hore khoutu ea mohloli oa bareki ba molao e koetsoe (hape, karolong ea bobeli re tla bua ka ho qaqileng haholoanyane taba ea hore sena ke 'nete. ho etsahala joalo), empa, joalo ka mehleng ea khale, mohlala, ho na le maemo a joalo ka RFC - na hoa khoneha ho ngola moreki ho latela litlhaloso feela, "ntle le ho sheba" khoutu ea mohloli, ekaba ea semmuso (Telegraph Desktop, mobile), kapa Telethon e seng molaong?

Tafole ea likateng:

Litokomane ... li teng, na? Na ke nnete?..

Likaroloana tsa lintlha tsa sehlooho sena li ile tsa qala ho bokelloa lehlabuleng le fetileng. Nako ena eohle ho websaeteng ea molao https://core.telegram.org Litokomane li ne li le joalo ka Layer 23, i.e. e ile ea khomarela kae-kae ka 2014 (hopola, ho ne ho se na likanale ka nako eo?). Ehlile, ka khopolo, sena se ka be se re lumelletse ho kenya tšebetsong moreki ka ts'ebetso ka nako eo ka 2014. Empa esita le sebakeng sena, litokomane li ne li sa phethahala, 'me la bobeli, libakeng tse ling li ne li ikhanyetsa. Nako e fetang khoeli e fetileng, ka Loetse 2019, ho bile joalo ka monyetla Ho ile ha sibolloa hore ho ne ho e-na le ntlafatso e kholo ea litokomane setšeng, bakeng sa Layer 105 ea morao-rao, e nang le molaetsa oa hore joale ntho e 'ngoe le e' ngoe e lokela ho baloa hape. Ka sebele, lihlooho tse ngata li ile tsa ntlafatsoa, ​​empa tse ngata ha lia ka tsa fetoha. Ka hona, ha u bala ho nyatsuoa ka tlase mabapi le litokomane, u lokela ho hopola hore tse ling tsa lintho tsena ha li sa sebetsa, empa tse ling li ntse li le teng. Ha e le hantle, lilemo tse 5 lefatšeng la kajeno hase nako e telele feela, empa haholo tse ngata tsa. Ho tloha ka nako eo (haholo-holo haeba u sa nahane ka libaka tsa geochat tse lahliloeng le tse tsosolositsoeng ho tloha ka nako eo), palo ea mekhoa ea API ka morero e hōlile ho tloha ho lekholo ho ea ho tse fetang makholo a mabeli le mashome a mahlano!

O ka qala kae joalo ka sengoli se secha?

Ha ho na taba hore na u ngola ho tloha qalong kapa u sebelisa, mohlala, lilaebrari tse lokiselitsoeng joalo ka Telethon bakeng sa Python kapa E etselitsoe PHP, leha ho le joalo, u tla hloka pele ngodisa kopo ya hao - fumana liparamente api_id и api_hash (ba sebelitseng le VKontakte API hang-hang ba utloisisa) eo ka eona seva e tla khetholla kopo. Sena tlameha ho e etse ka mabaka a molao, empa re tla bua haholo ka hore na ke hobaneng bangoli ba laeborari ba ke keng ba e phatlalatsa karolong ea bobeli. U ka khotsofatsoa ke litekanyetso tsa teko, le hoja li fokotsehile haholo - 'nete ke hore joale u ka ngolisa e le 'ngoe feela app, kahoo u se ke ua potlakela ho kena ho eona.

Hona joale, ho ea ka pono ea tekheniki, re lokela ho thahasella taba ea hore ka mor'a ho ngolisoa re lokela ho fumana litsebiso tse tsoang ho Telegram mabapi le lisebelisoa tsa litokomane, protocol, joalo-joalo. Ke hore, motho a ka nahana hore setša se nang le li-docks se ne se lahliloe feela 'me sa tsoela pele ho sebetsa ka ho khetheha le ba qalileng ho etsa bareki, hobane ho bonolo. Empa che, ha ho letho le joalo le ileng la hlokomeloa, ha ho na boitsebiso bo tlileng.

'Me haeba u ngola ho tloha qalong, joale ho sebelisa li-parameter tse fumanoeng ho ntse ho le hōle. Leha ho le joalo https://core.telegram.org/ le ho bua ka tsona ho Ho Qala pele ho tsohle, ha e le hantle, o tla tlameha ho qala ho kenya tshebetsong MTPrototo protocol - empa haeba u ne u lumela sebopeho ho latela mohlala oa OSI qetellong ea leqephe bakeng sa tlhaloso e akaretsang ea protocol, joale ke lefeela ka ho feletseng.

Ha e le hantle, pele le ka mor'a MTProto, maemong a 'maloa ka nako e le' ngoe (joalokaha basebetsi ba marang-rang ba tsoang linaheng tse ling ba sebetsang ho OS kernel ba re, tlōlo ea lera), sehlooho se seholo, se bohloko le se tšabehang se tla kena tseleng ...

Binary serialization: TL (Type Language) le morero oa eona, le mekhahlelo, le mantsoe a mang a mangata a tšosang.

Sehlooho sena, ha e le hantle, ke senotlolo sa mathata a Telegram. 'Me ho tla ba le mantsoe a mangata a tšabehang ha u ka leka ho kena ho eona.

Kahoo, setšoantšo ke sena. Haeba lentsoe lena le tla kelellong ea hau, e re, JSON Schema, U nahanne hantle. Sepheo ke se tšoanang: puo e 'ngoe ea ho hlalosa sete e ka bang teng ea data e fetisitsoeng. Ke hona moo ho tšoana ho fellang teng. Haeba ho tsoa leqepheng MTPrototo protocol, kapa ho tsoa sefateng sa mohloli oa moreki oa semmuso, re tla leka ho bula schema, re tla bona ntho e kang:

int ? = Int;
long ? = Long;
double ? = Double;
string ? = String;

vector#1cb5c415 {t:Type} # [ t ] = Vector t;

rpc_error#2144ca19 error_code:int error_message:string = RpcError;

rpc_answer_unknown#5e2ad36e = RpcDropAnswer;
rpc_answer_dropped_running#cd78e586 = RpcDropAnswer;
rpc_answer_dropped#a43ad8b7 msg_id:long seq_no:int bytes:int = RpcDropAnswer;

msg_container#73f1f8dc messages:vector<%Message> = MessageContainer;

---functions---

set_client_DH_params#f5045f1f nonce:int128 server_nonce:int128 encrypted_data:bytes = Set_client_DH_params_answer;

ping#7abe77ec ping_id:long = Pong;
ping_delay_disconnect#f3427b8c ping_id:long disconnect_delay:int = Pong;

invokeAfterMsg#cb9f372d msg_id:long query:!X = X;
invokeAfterMsgs#3dc4b4f0 msg_ids:Vector<long> query:!X = X;

account.updateProfile#78515775 flags:# first_name:flags.0?string last_name:flags.1?string about:flags.2?string = User;
account.sendChangePhoneCode#8e57deb flags:# allow_flashcall:flags.0?true phone_number:string current_number:flags.0?Bool = auth.SentCode;

Motho ea bonang sena ka lekhetlo la pele o tla khona ho lemoha karolo feela ea se ngotsoeng - hantle, tsena ke libopeho (le hoja lebitso le le hokae, ka ho le letšehali kapa ka ho le letona?), ho na le masimo ho bona, ka mor'a moo mofuta o latela ka mor'a kolone ... mohlomong. Mona ka har'a li-angle brackets mohlomong ho na le litempele tse kang ho C++ (ha e le hantle, eseng haholo). Mme matshwao a mang kaofela a bolela eng, matshwao a potso, matshwao a makalo, diperesente, matshwao a hash (mme ho hlakile hore a bolela dintho tse fapaneng dibakeng tse fapaneng), ka linako tse ling li teng, ka linako tse ling ha li joalo, linomoro tsa hexadecimal - mme haholo-holo, mokhoa oa ho fumana ho tsoa ho sena. e nepahetse (e ke keng ea hanoa ke seva) byte stream? U tla tlameha ho bala litokomane (ee, ho na le lihokelo tsa schema mofuteng oa JSON haufinyane - empa seo ha se hlakise haholoanyane).

Bula leqephe Binary Data Serialization 'me u ikakhele ka setotsoana lefatšeng la boselamose la li-mushroom le lipalo tse ikhethang, ntho e tšoanang le ea matan selemong sa 4th. Alfabeta, mofuta, boleng, mokopanyi, mokopanyi o sebetsang, sebopeho se tloaelehileng, mofuta o kopaneng, mofuta oa polymorphic ... 'me kaofela ke leqephe la pele feela! E latelang e u letetse Puo ea TL, eo, le hoja e se e ntse e e-na le mohlala oa kopo le karabo e sa reng letho, ha e fane ka karabo ho hang ho linyeoe tse ling tse tloaelehileng, ho bolelang hore u tla tlameha ho tsamaea ka ho pheta-pheta lipalo tse fetoletsoeng ho tloha Serussia ho ea Senyesemane ho tse ling tse robeli tse kenyelletsoeng. maqephe!

Babali ba tloaelaneng le lipuo tse sebetsang le tlhahiso ea mofuta oa othomathike, ehlile, ba tla bona puo e hlalosang puo ena, esita le ho tloha mohlaleng, e le e tloaelehileng haholoanyane, mme ba ka re sena ha se mpe ka molao. Khahlanong le sena ke:

  • ee, sepheo e utloahala e le ntle, empa ho malimabe, eena ha e fihleloe
  • Thuto ea liunivesithing tsa Russia e fapana le har'a litsebi tsa IT - ha se bohle ba nkileng thupelo e lumellanang
  • Qetellong, joalo ka ha re tla bona, ts'ebetsong ho joalo ha ea hlokeha, kaha ho sebelisoa feela karoloana e fokolang ea esita le TL e hlalositsoeng

Joalokaha ho boletsoe LeoNerd seteisheneng #perl ho netweke ea FreeNode IRC, ea lekileng ho kenya ts'ebetsong heke ho tloha Telegraph ho ea ho Matrix (phetolelo ea quote ha e nepahale ho tsoa mohopolong):

Ho utloahala eka motho e mong o ile a tsebisoa khopolo ea ho thaepa lekhetlo la pele, a thaba, 'me a qala ho leka ho bapala le eona, a sa tsotelle hore na e ea hlokahala ts'ebetsong.

Iponele, haeba tlhoko ea mefuta e se nang letho (int, telele, joalo-joalo) joalo ka ntho ea mantlha e sa hlahise lipotso - qetellong li tlameha ho kengoa ts'ebetsong ka letsoho - mohlala, ha re lekeng ho tsoa ho tsona. vector. Ke hore, ha e le hantle, array, haeba u bitsa lintho tse hlahisoang ka mabitso a tsona.

Empa pele

Tlhaloso e khuts'oane ea subset ea TL syntax bakeng sa ba sa baleng litokomane tsa semmuso

constructor = Type;
myVec ids:Vector<long> = Type;

fixed#abcdef34 id:int = Type2;

fixedVec set:Vector<Type2> = FixedVec;

constructorOne#crc32 field1:int = PolymorType;
constructorTwo#2crc32 field_a:long field_b:Type3 field_c:int = PolymorType;
constructorThree#deadcrc bit_flags_of_what_really_present:# optional_field4:bit_flags_of_what_really_present.1?Type = PolymorType;

an_id#12abcd34 id:int = Type3;
a_null#6789cdef = Type3;

Tlhaloso e qala kamehla moetsi, ka mor'a moo ka boikhethelo (ka ts'ebetso - kamehla) ka letšoao # e lokela ho ba CRC32 ho tloha mokhoeng oa tlhaloso o tloaelehileng oa mofuta ona. Ka mor'a moo ho tla tlhaloso ea masimo; haeba a le teng, mofuta o ka 'na oa se na letho. Sena sohle se fella ka letšoao le lekanang, lebitso la mofuta oo moetsi enoa - ke hore, ha e le hantle, subtype - e leng oa eona. Mohlankana ea ka ho le letona la letšoao le lekanang ke polymorphic - ke hore, mefuta e 'maloa e khethehileng e ka lumellana le eona.

Haeba tlhaloso e hlaha ka morao ho mola ---functions---, joale syntax e tla lula e tšoana, empa moelelo o tla fapana: moetsi e tla ba lebitso la mosebetsi oa RPC, masimo a tla fetoha mekhahlelo (hantle, ke hore, e tla lula e tšoana hantle le sebopeho se fanoeng, joalokaha se hlalositsoe ka tlase. , sena e tla ba feela moelelo o fanoeng), le "mofuta oa polymorphic" - mofuta oa sephetho se khutlisitsoeng. Ke 'nete, e ntse e tla lula e le polymorphic - e hlalositsoe feela karolong ---types---, empa sehahi sena "se ke ke sa nkoa". Ho jarisa mefuta ea mesebetsi e bitsoang ka likhang tsa bona, i.e. Ka mabaka a mang, mesebetsi e mengata e nang le lebitso le le leng empa li-signature tse fapaneng, joalo ka C++, ha li fanoe bakeng sa TL.

Hobaneng "mohahi" le "polymorphic" haeba e se OOP? Ha e le hantle, ho tla ba bonolo hore motho a nahane ka sena ka mantsoe a OOP - mofuta oa polymorphic e le sehlopha sa abstract, 'me bahahi ke lihlopha tsa bona tse tobileng, le final mareong a dipuo tse ngatanyana. Ha e le hantle, ho hlakile, mona feela ho tshoana ka mekhoa ea 'nete ea lihahi tse imetsoeng ka lipuo tsa OO. Kaha mona ke meralo ea data feela, ha ho na mekhoa (le hoja tlhaloso ea mesebetsi le mekhoa e ntse e khona ho baka pherekano hloohong hore e teng, empa ke taba e fapaneng) - o ka nahana ka sehahi e le boleng bo tsoang ho. eo e ntse e ahoa thaepa ha o bala molapo wa byte.

See se etsahala joang? The deserializer, e lulang e bala li-byte tse 4, e bona boleng 0xcrc32 - mme o utloisisa se tla etsahala kamora moo field1 ka mofuta int, ke. e bala hantle li-byte tse 4, holima sebaka sena se nang le mofuta PolymorType bala. Bona 0x2crc32 'me o utloisisa hore ho na le masimo a mabeli ho feta, pele long, ho bolelang hore re bala li-byte tse 8. 'Me joale hape mofuta o rarahaneng, o fokolitsoeng ka mokhoa o ts'oanang. Ka mohlala, Type3 e ka phatlalatsoa potolohong hang ha lihahi tse peli, ka ho latellana, joale li tlameha ho kopana 0x12abcd34, ka mor'a moo o hloka ho bala li-byte tse ling tse 4 int, kapa 0x6789cdef, ka mor’a moo ho ke ke ha e-ba le letho. Ntho e 'ngoe le e' ngoe - ho hlokahala hore u fane ka mokhelo. Leha ho le joalo, ka mor'a sena re khutlela ho bala 4 byte int masimo field_c в constructorTwo mme ka seo re qeta ho bala rona PolymorType.

Qetellong, haeba u ka tšoaroa 0xdeadcrc etsoe constructorThree, joale ntho e 'ngoe le e' ngoe e ba thata haholoanyane. Tšimo ea rona ea pele ke bit_flags_of_what_really_present ka mofuta # - ha e le hantle, sena ke lebitso feela la mofuta nat, e bolelang "nomoro ea tlhaho". Ke hore, ha e le hantle, int e sa ngolisoang ke eona feela nyeoe ha linomoro tse sa ngolisoang li etsahala lipotolohong tsa sebele. Kahoo, e latelang ke kaho e nang le letšoao la potso, e bolelang hore tšimo ena - e tla ba teng ka terata feela haeba ho behiloe karoloana e lumellanang tšimong eo ho buuoang ka eona (hoo e batlang e le ternary operator). Kahoo, ha re nke hore karoloana ena e ne e behiloe, ho bolelang hore ho ea pele re hloka ho bala tšimo joalo ka Type, eo mohlaleng oa rona e nang le lihahi tse 2. E 'ngoe ha e na letho (e na le sekhetho feela), e 'ngoe e na le tšimo ids ka mofuta ids:Vector<long>.

U ka nahana hore litempele le li-generic ka bobeli li ho pros kapa Java. Empa che. Hoo e ka bang. Sena eona feela nyeoe ea ho sebelisa li-angle brackets lipotolohong tsa 'nete,' me e sebelisoa FEELA bakeng sa Vector. Ka molapo oa byte, tsena e tla ba li-byte tse 4 tsa CRC32 bakeng sa mofuta oa Vector ka boeona, li lula li tšoana, ebe li-byte tse 4 - palo ea likarolo tse ngata, ebe likarolo tsena ka botsona.

Eketsa ho sena taba ea hore serialization e lula e etsahala ka mantsoe a li-byte tse 4, mefuta eohle e mengata ea eona - mefuta e hahiloeng le eona e hlalosoa. bytes и string ka serialization ea bolelele ba bolelele le ho tsamaisana hona ka 4 - hantle, ho bonahala ho utloahala ho tloaelehile ebile ho sebetsa hantle? Leha TL e boleloa e le mokhoa o sebetsang oa ho etsa li-binary, ho ea liheleng le bona, ka keketseho ea hoo e ka bang eng kapa eng, esita le boleng ba Boolean le likhoele tsa sebopeho se le seng ho isa ho li-byte tse 4, na JSON e ntse e le motenya haholo? Bona, esita le masimo a sa hlokahaleng a ka tloloa ka lifolakha, ntho e 'ngoe le e' ngoe e ntle haholo, ebile e atoloha bakeng sa bokamoso, joale ke hobane'ng ha u sa kenye masimo a macha a boikhethelo ho sehahi hamorao?

Empa che, haeba u sa bale tlhaloso ea ka e khutšoanyane, empa litokomane tse feletseng, 'me u nahane ka ts'ebetsong. Taba ea pele, CRC32 ea sehahi e baloa ho latela mola o tloaelehileng oa tlhaloso ea mongolo oa moralo (tlosa sebaka se secha se eketsehileng, joalo-joalo) - kahoo haeba tšimo e ncha e eketsoa, ​​mohala oa tlhaloso ea mofuta o tla fetoha, ka hona CRC32 ea eona le , ka lebaka leo, serialization. Mme moreki oa khale o ne a tla etsa'ng haeba a ne a ka fumana tšimo e nang le lifolakha tse ncha, 'me ha a tsebe hore na a etse eng ka tsona kamora moo?

Sa bobedi, a re hopoleng CRC32, e sebelisoang mona haholo-holo e le mesebetsi ea hash ho tseba ka mokhoa o ikhethileng hore na ho etsoa mofuta ofe (de) serialized. Mona re tobane le bothata ba ho thulana - 'me che, monyetla ha o mong ho 232, empa o moholo haholo. Ke mang ea ileng a hopola hore CRC32 e etselitsoe ho lemoha (le ho lokisa) liphoso mocha oa puisano, 'me ka hona e ntlafatsa thepa ee ho senya ba bang? Ka mohlala, ha e tsotelle ho hlophisa li-byte hape: haeba u bala CRC32 ho tloha meleng e 'meli, ea bobeli u fetola li-byte tse 4 tsa pele le tse 4 tse latelang - e tla tšoana. Ha tlhahiso ea rona e le likhoele tsa mongolo ho tsoa ho alfabeta ea Selatine (le matšoao a manyane), 'me mabitso ana a sa iketsahalle feela, monyetla oa tlhophiso e joalo o eketseha haholo.

Ka tsela, ke mang ea ileng a hlahloba hore na ho na le eng? ehlile CRC32 E 'ngoe ea likhoutu tsa pele tsa mohloli (esita le pele ho Waltman) e ne e e-na le ts'ebetso ea hash e atisang sebopeho se seng le se seng ka nomoro ea 239, e ratoang haholo ke batho bana, ha ha!

Qetellong, ho lokile, re ile ra hlokomela hore lihahi tse nang le mofuta oa tšimo Vector<int> и Vector<PolymorType> e tla ba le CRC32 e fapaneng. Ho thoe'ng ka ts'ebetso ea inthaneteng? 'Me ho ea ka pono ea theory, na sena se fetoha karolo ea mofuta? Ha re re re fetisa palo ea likete tse leshome, hantle le Vector<int> ntho e 'ngoe le e' ngoe e hlakile, bolelele le li-byte tse ling tse 40000. Ho thoe'ng haeba sena Vector<Type2>, e nang le tšimo e le 'ngoe feela int 'me ke eona feela mofuteng - na re hloka ho pheta 10000xabcdef0 makhetlo a 34 ebe joale 4 byte int, kapa puo e khona ho re IKEMISA eona ho tsoa ho moetsi fixedVec 'me sebakeng sa li-byte tse 80000, fetisetsa hape 40000 feela?

Ena ha se potso ea theory ho hang - ak'u nahane u fumana lenane la basebelisi ba sehlopha, bao e mong le e mong oa bona a nang le id, lebitso la pele, lebitso la ho qetela - phapang ea palo ea data e fetisitsoeng ka khokahanyo ea mohala e ka ba ea bohlokoa. Ke hantle ts'ebetso ea serialization ea Telegraph e phatlalalitsoeng ho rona.

Kahoo…

Vector, e sa kang ea lokolloa

Haeba u leka ho pholletsa le maqephe a tlhaloso ea li-combinator joalo-joalo, u tla bona hore vector (esita le matrix) e leka ka molao ho hlahisoa ka li-tuple tsa maqephe a 'maloa. Empa qetellong ba lebala, mohato oa ho qetela oa tlōla, 'me tlhaloso ea vector e fanoa feela, e e-s'o tlameletsoe ho mofuta. Bothata ke bofe? Ka lipuo mananeo, haholo-holo tse sebetsang, ho tloaelehile ho hlalosa sebopeho ka mokhoa o pheta-phetoang - moqapi ka tlhahlobo ea eona e botsoa o tla utloisisa le ho etsa ntho e 'ngoe le e' ngoe ka boeena. Ka puo ho hlophisoa ha data se batloang ke KATLEHO: ho lekane ho hlalosa feela lethathamo, ke. sebopeho sa likarolo tse peli - ea pele ke karolo ea data, ea bobeli ke sebopeho se tšoanang kapa sebaka se se nang letho bakeng sa mohatla (pakete (cons) ho Lisp). Empa ho hlakile hore sena se tla hloka ea e 'ngoe le e' ngoe element e sebelisa li-byte tse ling tse 4 (CRC32 maemong a TL) ho hlalosa mofuta oa eona. Sehlopha se ka boela sa hlalosoa habonolo boholo bo tsitsitseng, empa tabeng ea bolelele bo sa tsejoeng esale pele, rea arohana.

Ka hona, kaha TL ha e lumelle ho ntša vector, e ne e tlameha ho eketsoa ka lehlakoreng. Qetellong litokomane li re:

Ka linako tsohle serialization e sebelisa sehahi se tšoanang "vector" (const 0x1cb5c415 = crc32("vector t:Type # [ t ] = Vector t") e sa itšetleheng ka boleng bo itseng ba mofuta oa mofuta oa t.

Boleng ba paramethara ea boikhethelo t ha e amehe ho serialise kaha e tsoa ho mofuta oa sephetho (se tsejoang kamehla pele ho deserialization).

Sheba ka hloko: vector {t:Type} # [ t ] = Vector t - empa kae kapa kae Tlhaloso ena ka boeona ha e bolele hore palo ea pele e tlameha ho lekana le bolelele ba vector! Ebile ha e tsoe kae kapa kae. Sena se fanoe se hlokang ho hopoloa le ho kenngoa ts'ebetsong ka matsoho a hau. Libakeng tse ling, litokomane li bile li bolela ka botšepehi hore mofuta ona hase oa 'nete:

Vector t polymorphic pseudotype ke "mofuta" oo boleng ba oona e leng tatellano ea boleng ba mofuta ofe kapa ofe oa t, ebang ke oa mabokose kapa o se na letho.

... empa ha e tsepamise maikutlo ho yona. Ha uena, u khathetse ke ho pota-pota ka ho otlolla lipalo (mohlomong esita le tse tsejoang ho uena ho tloha thupelong ea univesithi), u etsa qeto ea ho tela 'me ha e le hantle u sheba mokhoa oa ho sebetsa le eona ka ts'ebetso, maikutlo a setseng hloohong ea hau ke hore sena se Serious. Mathematics qalong, e ile ea qaptjoa ka ho hlaka ke Cool People (litsebi tse peli tsa lipalo - mohlōli oa ACM), eseng mang kapa mang feela. Sepheo - ho iponahatsa - se fihletsoe.

Ka tsela, ka palo. A re le hopotse seo # ke lehlalosi nat, nomoro ea tlhaho:

Ho na le mofuta oa mantsoe (mofuta-expr) le mantsoe a lipalo (nat-expr). Leha ho le joalo, li hlalosoa ka tsela e tšoanang.

type-expr ::= expr
nat-expr ::= expr

empa ka sebōpeho-puo li hlalosoa ka tsela e tšoanang, ke hore. Phapano ena e tlameha ho hopoloa hape le ho kenngoa ts'ebetsong ka letsoho.

E, e, mefuta ea li-template (vector<int>, vector<User>) ho ba le sesupo se tloaelehileng (#1cb5c415), ke. haeba u tseba hore pitso e phatlalatsoa e le

users.getUsers#d91a548 id:Vector<InputUser> = Vector<User>;

joale ha u sa emela vector feela, empa vector ea basebelisi. Ka nepo, lokela ema - ka khoutu ea 'nete, ntho e' ngoe le e 'ngoe, haeba e se mofuta o se nang letho, e tla ba le sehahi,' me ka tsela e ntle ts'ebetsong ho tla hlokahala ho hlahloba - empa re rometsoe hantle nthong e 'ngoe le e' ngoe ea vector ena. mofuta oo? Ho thoe'ng haeba e ne e le mofuta o itseng oa PHP, eo ho eona sehlopha se ka bang le mefuta e fapaneng ea likarolo tse fapaneng?

Ka nako ena o qala ho nahana - na TL e joalo ea hlokahala? Mohlomong bakeng sa kariki ho ka khoneha ho sebelisa serializer ea motho, protobuf e tšoanang e neng e se e ntse e le teng ka nako eo? Eo e ne e le theory, ha re shebeng ts'ebetso.

Ts'ebetsong ea TL e teng ka khoutu

TL o hlahetse botebong ba VKontakte le pele ho liketsahalo tse tummeng ka thekiso ea karolo ea Durov le (ka sebele), le pele nts'etsopele ea Telegraph e qala. Le mohloling o bulehileng khoutu ea mohloli oa ts'ebetsong ea pele o ka fumana lithupa tse ngata tse qabolang. 'Me puo ka boeona e ile ea kenngoa ts'ebetsong moo ka botlalo ho feta kamoo e leng kateng hona joale ho Telegram. Ka mohlala, li-hashes ha li sebelisoe ho hang morerong (e bolelang "pseudotype" e hahiloeng (joaloka vector) e nang le boitšoaro bo khelohileng). Kapa

Templates are not used now. Instead, the same universal constructors (for example, vector {t:Type} [t] = Vector t) are used w

mme a re sekasekeng, ka ntlha ya botlalo, go sala morago, go ka twe, tlhabologo ya Mogologolo wa Monagano.

#define ZHUKOV_BYTES_HACK

#ifdef ZHUKOV_BYTES_HACK

/* dirty hack for Zhukov request */

Kapa ena e ntle:

    static const char *reserved_words_polymorhic[] = {

      "alpha", "beta", "gamma", "delta", "epsilon", "zeta", "eta", "theta", NULL

      };

Sekhechana sena se mabapi le litempele tse kang:

intHash {alpha:Type} vector<coupleInt<alpha>> = IntHash<alpha>;

Ena ke tlhaloso ea mofuta oa template ea hashmap joalo ka vector ea int - Mofuta oa lipara. Ho C ++ e ne e tla shebahala tjena:

    template <T> class IntHash {
      vector<pair<int,T>> _map;
    }

kahoo, alpha - lentsoe la sehlooho! Empa feela ka C ++ u ka ngola T, empa u lokela ho ngola alpha, beta ... Empa ha ho na li-parameter tse fetang 8, ke moo fantasy e fellang teng. Ho bonahala eka ka nako e ’ngoe St. Petersburg ho ile ha e-ba le lipuisano tse kang tsena:

-- Надо сделать в TL шаблоны
-- Бл... Ну пусть параметры зовут альфа, бета,... Какие там ещё буквы есть... О, тэта!
-- Грамматика? Ну потом напишем

-- Смотрите, какой я синтаксис придумал для шаблонов и вектора!
-- Ты долбанулся, как мы это парсить будем?
-- Да не ссыте, он там один в схеме, захаркодить -- и ок

Empa sena se ne se le mabapi le ts'ebetsong ea pele e hatisitsoeng ea TL "ka kakaretso". Ha re tsoeleng pele ho nahana ka ts'ebetsong ho bareki ba Telegraph ka bo bona.

Mantsoe a bohlokoa ho Vasily:

Vasily, [09.10.18 17:07] Ka holim'a tsohle, esele e chesa hobane ba ile ba theha sehlopha sa lintho tse nyenyane, ebe ba li otla ka hamore, 'me ba koahela jenereithara ea khoutu ka lithupa.
Ka lebaka leo, ho qala ka dock pilot.jpg
Ebe ho tloha khoutu dzhekichan.webp

Ehlile, ho tsoa ho batho ba tloaelaneng le li-algorithms le lipalo, re ka lebella hore ba balile Aho, Ullmann, mme ba tloaelane le lisebelisoa tse fetohileng maemo a tloaelehileng indastering ho theosa le mashome a lilemo bakeng sa ho ngola li-compilers tsa bona tsa DSL, na?

Ka telegram-cli ke Vitaly Valtman, joalo ka ha ho ka utloisisoa ho tsoa ho hlaha ha sebopeho sa TLO kantle ho meeli ea eona ea (cli), setho sa sehlopha - joale ho fanoe ka laeborari ea TL parsing. ka thoko, maikutlo a hae ke afe TL mohlahlobi? ..

16.12 04:18 Vasily: Ke nahana hore ho na le motho ea sa tsebeng lex+yacc
16.12 04:18 Vasily: Ha ke khone ho e hlalosa ka tsela e fapaneng
16.12 04:18 Vasily: hantle, kapa ba ne ba lefshoa bakeng sa palo ea mela ho VK
16.12 04:19 Vasily: 3k+ mela joalo-joalo<censored> sebakeng sa mohlahlobi

Mohlomong mokhelo? A re boneng hore na joang etsa Enoa ke moreki oa MAHALA - Telegraph Desktop:

    nametype = re.match(r'([a-zA-Z.0-9_]+)(#[0-9a-f]+)?([^=]*)=s*([a-zA-Z.<>0-9_]+);', line);
    if (not nametype):
      if (not re.match(r'vector#1cb5c415 {t:Type} # [ t ] = Vector t;', line)):
         print('Bad line found: ' + line);

1100+ mela ho Python, lipolelo tse 'maloa tse tloaelehileng + linyeoe tse khethehileng tse kang vector, eo, ehlile, e phatlalatsoang ka morero kamoo e lokelang ho ba kateng ho latela syntax ea TL, empa ba itšetlehile ka syntax ena ho e hlalosa ... Potso ea hlaha, ke hobane'ng ha e ne e le mohlolo?иE hlophisitsoe haholoanyane haeba ho se motho ea tla e hlalosa ho latela litokomane?

By the way... Hopola hore re buile ka CRC32 checking? Kahoo, ho jenereithara ea khoutu ea Desktop ea Telegraph ho na le lethathamo la mekhelo bakeng sa mefuta eo ho eona CRC32 e baliloeng. ha e lumellane ka e bontšitsoeng setšoantšong!

Vasily, [18.12/22 49:XNUMX] mme mona ke ne ke tla nahana ka hore na TL e joalo ea hlokahala.
Haeba ke ne ke batla ho senya ka mekhoa e meng ea ts'ebetsong, ke ne ke tla qala ho kenya likheo tsa mela, halofo ea li-parsers e tla senya litlhaloso tsa mela e mengata.
tdesktop, leha ho le joalo, hape

Hopola ntlha e mabapi le line-line, re tla khutlela ho eona hamorao.

Ho lokile, telegraph-cli ha e molaong, Telegraph Desktop e molaong, empa ho thoe'ng ka tse ling? Ke mang ea tsebang? karolwana e ka tlase.

Ke lipotso life tse ling tse hlahisoang ke serialization? Ka mohlala, ba entse lintho tse ngata, ehlile, ka masimo a fokolang le masimo a nang le maemo:

Vasily: flags.0? true
ho bolela hore tšimo e teng 'me e lekana le' nete haeba folakha e behiloe

Vasily: flags.1? int
e bolela hore tšimo e teng 'me e hloka ho tlosoa

Vasily: Esele, u se ke ua tšoenyeha ka seo u se etsang!
Vasily: Ho na le moo ho buuoang kae-kae ho doc hore 'nete ke mofuta o se nang letho oa bolelele ba zero, empa ho ke ke ha khoneha ho kopanya letho ho tsoa ho ngaka ea bona.
Vasily: Ts'ebetsong ea mohloli o bulehileng sena ha se joalo, empa ho na le letšoele la lithupa le litšehetso.

Ho thoe'ng ka Telethon? Ha re sheba pele ho sehlooho sa MTProto, mohlala - litokomaneng ho na le likotoana tse joalo, empa letšoao % e hlalosoa feela e le "e tsamaellanang le mofuta o fanoeng o se nang letho", ke hore. mehlaleng e ka tlase ho na le phoso kapa ho hong ho sa ngolisoang:

Vasily, [22.06.18 18:38] Sebakeng se le seng:

msg_container#73f1f8dc messages:vector message = MessageContainer;

Ka tsela e fapaneng:

msg_container#73f1f8dc messages:vector<%Message> = MessageContainer;

'Me tsena ke liphapang tse peli tse kholo, bophelong ba sebele mofuta o mong oa vector o hlobotseng oa tla

Ha ke so bone tlhaloso ea vector e se nang letho 'me ha ke e-so ka ke kopana le eona

Analysis e ngotsoe ka letsoho ka telethon

Setšoantšong sa hae ho hlalositsoe tlhaloso msg_container

Hape, potso e sala e le mabapi le%. Ha e hlalosoe.

Vadim Goncharov, [22.06.18 19:22] le ho tdesktop?

Vasily, [22.06.18 19:23] Empa parser ea bona ea TL lienjineng tse tloaelehileng le eona e kanna ea se ke ea ja sena.

// parsed manually

TL ke setšoantšo se setle, ha ho motho ea se sebelisang ka botlalo

'Me % ha e teng phetolelong ea bona ea morero

Empa mona litokomane lia ikhanyetsa, kahoo idk

E ile ea fumanoa ka sebōpeho-puo, ba ka be ba lebetse feela ho hlalosa semantics

U bone tokomane ho TL, u ke ke ua e fumana ntle le halofo ea lithara

"Joale, ha re re," 'mali e mong o tla re, "u nyatsa ntho e itseng, kahoo mpontše hore na e lokela ho etsoa joang."

Vasily oa araba: “Ha e le mohlahlobisisi, ke rata lintho tse joalo

    args: /* empty */ { $$ = NULL; }
        | args arg { $$ = g_list_append( $1, $2 ); }
        ;

    arg: LC_ID ':' type-term { $$ = tl_arg_new( $1, $3 ); }
            | LC_ID ':' condition '?' type-term { $$ = tl_arg_new_cond( $1, $5, $3 ); free($3); }
            | UC_ID ':' type-term { $$ = tl_arg_new( $1, $3 ); }
            | type-term { $$ = tl_arg_new( "", $1 ); }
            | '[' LC_ID ']' { $$ = tl_arg_new_mult( "", tl_type_new( $2, TYPE_MOD_NONE ) ); }
            ;

ka tsela e itseng e rata ho feta

struct tree *parse_args4 (void) {
  PARSE_INIT (type_args4);
  struct parse so = save_parse ();
  PARSE_TRY (parse_optional_arg_def);
  if (S) {
    tree_add_child (T, S);
  } else {
    load_parse (so);
  }
  if (LEX_CHAR ('!')) {
    PARSE_ADD (type_exclam);
    EXPECT ("!");
  }
  PARSE_TRY_PES (parse_type_term);
  PARSE_OK;
}

kapa

        # Regex to match the whole line
        match = re.match(r'''
            ^                  # We want to match from the beginning to the end
            ([w.]+)           # The .tl object can contain alpha_name or namespace.alpha_name
            (?:
                #             # After the name, comes the ID of the object
                ([0-9a-f]+)    # The constructor ID is in hexadecimal form
            )?                 # If no constructor ID was given, CRC32 the 'tl' to determine it

            (?:s              # After that, we want to match its arguments (name:type)
                {?             # For handling the start of the '{X:Type}' case
                w+            # The argument name will always be an alpha-only name
                :              # Then comes the separator between name:type
                [wd<>#.?!]+  # The type is slightly more complex, since it's alphanumeric and it can
                               # also have Vector<type>, flags:# and flags.0?default, plus :!X as type
                }?             # For handling the end of the '{X:Type}' case
            )*                 # Match 0 or more arguments
            s                 # Leave a space between the arguments and the equal
            =
            s                 # Leave another space between the equal and the result
            ([wd<>#.?]+)     # The result can again be as complex as any argument type
            ;$                 # Finally, the line should always end with ;
            ''', tl, re.IGNORECASE | re.VERBOSE)

ena ke LEXER KAOFELA:

    ---functions---         return FUNCTIONS;
    ---types---             return TYPES;
    [a-z][a-zA-Z0-9_]*      yylval.string = strdup(yytext); return LC_ID;
    [A-Z][a-zA-Z0-9_]*      yylval.string = strdup(yytext); return UC_ID;
    [0-9]+                  yylval.number = atoi(yytext); return NUM;
    #[0-9a-fA-F]{1,8}       yylval.number = strtol(yytext+1, NULL, 16); return ID_HASH;

    n                      /* skip new line */
    [ t]+                  /* skip spaces */
    //.*$                 /* skip comments */
    /*.**/              /* skip comments */
    .                       return (int)yytext[0];

tseo. ho bonolo ho e beha ka bonolo.”

Ka kakaretso, ka lebaka leo, sehatisi le jenereithara ea khoutu bakeng sa sehlopha se senyenyane se sebelisitsoeng sa TL se lumellana le mela e ka bang 100 ea sebōpeho-puo le ~ mela e 300 ea jenereithara (ho bala tsohle. printKhoutu e hlahisitsoeng), ho kenyelletsa le li-buns tsa tlhahisoleseling bakeng sa ho itlhahloba sehlopheng ka seng. Mofuta o mong le o mong oa polymorphic o fetoha sehlopha sa motheo se se nang letho, 'me bahahi ba rua ho sona' me ba na le mekhoa ea ho etsa serialization le deserialization.

Khaello ea mefuta puong ea mofuta

Ho ngola ka matla ke ntho e ntle, na ha ho joalo? Che, sena ha se holivar (leha ke rata lipuo tse matla), empa ke polelo ka har'a moralo oa TL. E itšetlehile ka eona, puo e lokela ho fana ka mefuta eohle ea licheke bakeng sa rona. Hantle, ho lokile, mohlomong eseng eena ka boeena, empa ts'ebetsong, empa bonyane o lokela ho li hlalosa. Hona re batla menyetla ea mofuta ofe?

Pele ho tsohle, lithibelo. Mona re bona litokomaneng tsa ho kenya lifaele:

Likahare tsa binary tsa faele li arotsoe ka likarolo. Likarolo tsohle li tlameha ho ba le boholo bo lekanang ( karolo_boholo ) mme maemo a latelang a tlameha ho fihlellwa:

  • part_size % 1024 = 0 (e arotsoe ke 1KB)
  • 524288 % part_size = 0 (512KB e tlameha ho aroloa ka ho lekana ka karolo_ka boholo)

Karolo ea ho qetela ha ea tlameha ho khotsofatsa maemo ana, ha feela boholo ba eona bo le ka tlase ho karolo_ka boholo.

Karolo ka 'ngoe e lokela ho ba le nomoro ea tatellano, karolo_ea faele, ka boleng bo tlohang ho 0 ho isa ho 2,999.

Ka mor'a hore faele e arotsoe, u lokela ho khetha mokhoa oa ho e boloka ho seva. Sebelisa upload.saveBigFilePart haeba boholo bo felletseng ba faele bo feta 10 MB le upload.saveFilePart bakeng sa lifaele tse nyane.
[…] e 'ngoe ea liphoso tse latelang tsa ho kenya data e ka khutlisoa:

  • FILE_PARTS_INVALID - Palo e fosahetseng ea likarolo. Boleng ha bo lipakeng 1..3000

Na e 'ngoe ea see e teng setšoantšong? Na see se utloahala ka tsela e itseng ha u sebelisa TL? Che. Empa ntšoarele, esita le ntate-moholo Turbo Pascal o ile a khona ho hlalosa mefuta e boletsoeng mefuta-futa. Mme o ne a tseba ntho e le nngwe hape, eo jwale e tsejwang hantle e le enum - mofuta o nang le palo ea palo e tsitsitseng (e nyenyane) ea litekanyetso. Ka lipuo tse kang C - linomoro, hlokomela hore ho fihlela joale re buile feela ka mefuta lipalo. Empa ho boetse ho na le lihlopha, likhoele ... ka mohlala, ho ka ba monate ho hlalosa hore mohala ona o ka ba le nomoro ea mohala feela, na?

Ha ho le e 'ngoe ea tsena e leng TL. Empa ho na le, mohlala, ho JSON Schema. 'Me haeba motho e mong a ka phehisana khang ka karohano ea 512 KB, hore sena se ntse se hloka ho hlahlojoa ka khoutu, joale etsa bonnete ba hore mofani oa hau o tla hloka ho hlahlojoa. ne a ke ke romela nomoro e kantle ho sebaka 1..3000 (mme phoso e tsamaellanang e ka be e sa hlaha) e ka be e khonahala, na? ..

Ka tsela, ka liphoso le ho khutlisa litekanyetso. Le ba sebelitseng le TL ba foufalitse mahlo a bona - ha rea ​​ka ra elelloa hang hang ka bonngwe mosebetsi ho TL ha e le hantle o ka khutlisa eseng feela mofuta o hlalositsoeng oa ho khutla, empa hape le phoso. Empa sena se ke ke sa fihleloa ka tsela efe kapa efe ka ho sebelisa TL ka boyona. Ha e le hantle, e se e hlakile 'me ha ho hlokahale ntho leha e le efe ts'ebetsong (le hoja ha e le hantle, RPC e ka etsoa ka litsela tse sa tšoaneng, re tla khutlela ho sena hamorao) - empa ho thoe'ng ka Bohloeki ba likhopolo tsa Mathematics of Abstract Types ho tswa lefatsheng la lehodimo?..

'Me qetellong, ho thoe'ng ka ho bala? Hantle, moo, ka kakaretso, nka rata Tlhaloso na e nepahetse ho schema (ho schema ea JSON, hape, ho joalo), empa haeba u se u ntse u e-na le mathata, joale ho thoe'ng ka lehlakore le sebetsang - bonyane ho sheba liphapang nakong ea liapdeite? U iponele ho mehlala ea sebele:

-channelFull#76af5481 flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true id:int about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector<BotInfo> migrated_from_chat_id:flags.4?int migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int = ChatFull;
+channelFull#1c87a71a flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_view_stats:flags.12?true id:int about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector<BotInfo> migrated_from_chat_id:flags.4?int migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int = ChatFull;

kapa

-message#44f9b43d flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true id:int from_id:flags.8?int to_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long = Message;
+message#44f9b43d flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true id:int from_id:flags.8?int to_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long = Message;

E itšetlehile ka motho e mong le e mong, empa GitHub, ka mohlala, e hana ho totobatsa liphetoho ka har'a mela e telele joalo. Papali "fumana liphapang tse 10", 'me seo boko bo se bonang hang-hang ke hore qaleho le ho qetella ka mehlala ka bobeli li tšoana, u lokela ho bala ka mokhoa o tenang kae-kae bohareng ... Ka maikutlo a ka, sena ha se khopolo-taba feela, empa ka pono feela ditshila ebile di bohlasoa.

Ka tsela, ka bohloeki ba khopolo. Hobaneng re hloka libaka tse nyane? Na ha ho bonahale eka ba monko mpe ho ea ka pono ea mofuta oa khopolo? Tlhaloso e ka bonoa liphetolelong tsa pejana tsa setšoantšo. Qalong, e, ho ne ho le joalo, bakeng sa ho thimola ho hong le ho hong ho ne ho etsoa mofuta o mocha. Li-rudiments tsena li ntse li le teng ka mokhoa ona, mohlala:

storage.fileUnknown#aa963b05 = storage.FileType;
storage.filePartial#40bc6f52 = storage.FileType;
storage.fileJpeg#7efe0e = storage.FileType;
storage.fileGif#cae1aadf = storage.FileType;
storage.filePng#a4f63c0 = storage.FileType;
storage.filePdf#ae1e508d = storage.FileType;
storage.fileMp3#528a0677 = storage.FileType;
storage.fileMov#4b09ebbc = storage.FileType;
storage.fileMp4#b3cea0e4 = storage.FileType;
storage.fileWebp#1081464c = storage.FileType;

Empa joale nahana, haeba u na le masimo a 5 a boikhethelo sebopehong sa hau, u tla hloka mefuta e 32 bakeng sa likhetho tsohle tse ka khonehang. Ho phatloha ho kopaneng. Ka hona, bohloeki ba kristale ba khopolo ea TL bo ile ba boela ba senyeha khahlanong le esele ea tšepe ea 'nete e thata ea serialization.

Ho phaella moo, libakeng tse ling bahlankana bana ka bobona ba tlōla mokhoa oa bona oa ho ngola. Ka mohlala, ho MTProto (khaolo e latelang) karabo e ka hatelloa ke Gzip, ntho e 'ngoe le e' ngoe e ntle - ntle le hore lihlopha le potoloho li hatakeloa. Hape, e ne e se RpcResult ka boeona e ileng ea kotuloa, empa likahare tsa eona. Ke hobane'ng ha ke etsa see? .. Ke ile ka tlameha ho khaola ka crutch e le hore compression e sebetse kae kapa kae.

Kapa mohlala o mong, re kile ra fumana phoso - e rometsoe InputPeerUser sebakeng sa InputUser. Kapa ka tsela e fapaneng. Empa e ile ea sebetsa! Ke hore, seva se ne se sa tsotelle mofuta. See se ka etsahala joang? Re ka fumana karabo ka likhechana tsa khoutu ho tsoa ho telegram-cli:

  if (tgl_get_peer_type (E->id) != TGL_PEER_CHANNEL || (C && (C->flags & TGLCHF_MEGAGROUP))) {
    out_int (CODE_messages_get_history);
    out_peer_id (TLS, E->id);
  } else {    
    out_int (CODE_channels_get_important_history);

    out_int (CODE_input_channel);
    out_int (tgl_get_peer_id (E->id));
    out_long (E->id.access_hash);
  }
  out_int (E->max_id);
  out_int (E->offset);
  out_int (E->limit);
  out_int (0);
  out_int (0);

Ka mantsoe a mang, ke hona moo serialization e etsoang MATSOSO, e sa hlahisoang khoutu! Mohlomong seva se kenngoa ts'ebetsong ka tsela e ts'oanang? .. Ha e le hantle, sena se tla sebetsa haeba se etsoa hang, empa se ka tšehetsoa joang hamorao nakong ea lisebelisoa? Na ke ka lebaka leo morero oo o ileng oa qaptjoa? Mme mona re fetela potsong e latelang.

Phetolelo. Mekhahlelo

Hobaneng ha liphetolelo tsa schematic li bitsoa layers li ka nahanoa feela ho latela nalane ea meralo e hatisitsoeng. Kamoo ho bonahalang kateng, qalong bangoli ba ne ba nahana hore lintho tsa motheo li ka etsoa ka mokhoa o sa fetoheng, 'me feela moo ho hlokahalang, bakeng sa likōpo tse khethehileng, li bontša hore li ne li etsoa ka mokhoa o fapaneng. Ha e le hantle, esita le khopolo e ntle - 'me e ncha e tla ba joalo ka "e tsoakiloeng", e behiloeng ka holim'a ea khale. Empa a re boneng hore na e entsoe joang. Ke 'nete, ha kea khona ho e sheba ho tloha qalong - e monate, empa setšoantšo sa lera la motheo ha se eo. Mekhahlelo e qalile ka 2. Litokomane li re bolella ka karolo e khethehileng ea TL:

Haeba moreki a tšehetsa Lera 2, joale sehahi se latelang se tlameha ho sebelisoa:

invokeWithLayer2#289dd1f6 {X:Type} query:!X = X;

Ha e le hantle, sena se bolela hore pele ho mohala o mong le o mong oa API, int e nang le boleng 0x289dd1f6 e tlameha ho eketsoa pele ho nomoro ea mokhoa.

E utloahala e tloaelehile. Empa ho ile ha etsahala’ng ka mor’a moo? Yaba ho hlaha

invokeWithLayer3#b7475268 query:!X = X;

Joale ho latela eng? Joalokaha u ka nahana,

invokeWithLayer4#dea0d430 query:!X = X;

E qabola? Tjhe, ho sa le hoseng haholo ho tsheha, nahana ka taba eo e mong le e mong kopo e tsoang ho karolo e 'ngoe e hloka ho phutheloa ka mofuta o khethehileng joalo - haeba kaofela li fapane ho uena, u ka li khetholla joang hape? 'Me ho eketsa li-byte tse 4 feela ka pele ke mokhoa o motle haholo. Kahoo,

invokeWithLayer5#417a57ae query:!X = X;

Empa ho hlakile hore ka mor'a nakoana sena se tla fetoha mofuta o itseng oa bacchanalia. 'Me tharollo ea tla:

Nchafatso: Ho qala ka Lera 9, mekhoa ea mothusi invokeWithLayerN e ka sebelisoa feela hammoho initConnection

Hooray! Ka mor'a liphetolelo tse 9, re ile ra qetella re fihlile ho se neng se etsoa ho li-protocol tsa Inthanete morao koana lilemong tsa bo-80 - ho lumellana ka phetolelo hang qalong ea khokahanyo!

Joale ho latela eng?..

invokeWithLayer10#39620c41 query:!X = X;
...
invokeWithLayer18#1c900537 query:!X = X;

Empa joale u ntse u ka tšeha. Ke feela ka mor'a likarolo tse ling tse 9, moetsi oa bokahohleng ea nang le nomoro ea phetolelo o ile a qetella a ekelitsoe, e lokelang ho bitsoa hang feela qalong ea ho hokahanya, 'me moelelo oa lihlopha o ne o bonahala o nyametse, joale e se e le phetolelo e nang le maemo, joalo ka. hohle hohle. Bothata bo rarollotsoe.

Hantle-ntle?..

Vasily, [16.07.18 14:01] Le ka Labohlano ke ile ka nahana:
Teleserver e romella liketsahalo ntle le kopo. Likopo li tlameha ho koaheloa ka InvokeWithLayer. Seva ha e phuthele lintlafatso; ha ho na sebopeho sa ho phuthela likarabo le liapdeite.

Tseo. moreki a ke ke a hlakisa lera leo a batlang ho ntlafatsoa ho lona

Vadim Goncharov, [16.07.18 14:02] na InvokeWithLayer ha se crutch ka molao?

Vasily, [16.07.18 14:02] Ena ke eona feela tsela

Vadim Goncharov, [16.07.18 14:02] eo ha e le hantle e lokelang ho bolela ho lumellana ka lera qalong ea seboka.

Ka tsela, ho latela hore ho fokotseha ha bareki ha ho fanoe

Lintlafatso, i.e. mofuta Updates ka morero, sena ke seo seva se romelang ho mofani eseng ho arabela kopo ea API, empa ka boikemelo ha ketsahalo e etsahala. Ena ke taba e rarahaneng e tla tšohloa posong e 'ngoe, empa hajoale ke habohlokoa ho tseba hore seva se boloka Lintlafatso le ha moreki a sa sebetse.

Kahoo, haeba u hana ho phuthela ea e 'ngoe le e' ngoe sephutheloana ho bonts'a mofuta oa eona, ka nepo sena se lebisa mathateng a latelang a ka bang teng:

  • Seva e romella liapdeite ho moreki le pele moreki a tseba hore na e tšehetsa mofuta ofe
  • ke lokela ho etsa eng kamora ho ntlafatsa moreki?
  • eo tiisahore maikutlo a seva mabapi le nomoro ea lera a ke ke a fetoha nakong ea ts'ebetso?

Na u nahana hore sena ke khopolo-taba feela, 'me ka ts'ebetso sena se ke ke sa etsahala, hobane seva se ngotsoe ka nepo (bonyane, se lekoa hantle)? Ha! Ho sa tsotellehe hore na ho joang!

Sena ke sona seo re ileng ra kopana le sona ka August. Ka la 14 Phato, ho ne ho e-na le melaetsa ea hore ho na le ho hong ho ntseng ho nchafatsoa ho li-server tsa Telegraph ... ebe ka har'a li-log:

2019-08-15 09:28:35.880640 MSK warn  main: ANON:87: unknown object type: 0x80d182d1 at TL/Object.pm line 213.
2019-08-15 09:28:35.751899 MSK warn  main: ANON:87: unknown object type: 0xb5223b0f at TL/Object.pm line 213.

ebe joale li-megabyte tse 'maloa tsa li-stack traces (hantle, ka nako e ts'oanang ho rema lifate ho ne ho tsitsitse). Ntle le moo, haeba ho hong ho sa tsejoe ho TL ea hau, ke binary ka ho saena, ho ea tlase mola TSOHLE e ea, decoding e ke ke ea khonahala. U lokela ho etsa’ng boemong bo joalo?

Che, ntho ea pele e tlang kelellong ea mang kapa mang ke ho khaola le ho leka hape. Ha ea thusa. Re google CRC32 - tsena li ile tsa fetoha lintho tse tsoang ho scheme 73, leha re sebelitse ho 82. Re sheba ka hloko li-logs - ho na le li-identifiers tse tsoang meralong e 'meli e fapaneng!

Mohlomong bothata bo ho moreki oa rona ea seng molaong? Che, re qala Telegraph Desktop 1.2.17 (phetolelo e fanoeng ka bongata ba liphaello tsa Linux), e ngolla Lengolo la Mokhethoa: Id ea mofuta o sa lebelloang oa MTP #b5223b0f e baloa ho MTPMessageMedia…

Ho nyatsuoa ha protocol le mekhoa ea tlhophiso ea Telegraph. Karolo ea 1, tekheniki: boiphihlelo ba ho ngola moreki ho tloha qalong - TL, MT

Google e bonts'itse hore bothata bo ts'oanang bo ne bo se bo etsahetse ho e mong oa bareki ba seng molaong, empa joale linomoro tsa mofuta, 'me, ka lebaka leo, menahano e ne e fapane ...

Joale re lokela ho etsa’ng? 'Na le Vasily re ile ra arohana: o ile a leka ho ntlafatsa potoloho ho ea ho 91, ke ile ka etsa qeto ea ho ema matsatsi a seng makae ebe ke leka ka 73. Mekhoa eo ka bobeli e ile ea sebetsa, empa kaha e na le matla, ha ho na kutloisiso ea hore na u hloka liphetolelo tse kae holimo kapa tlaase. ho qhoma, kapa hore na u lokela ho ema nako e kae .

Hamorao ke ile ka khona ho hlahisa boemo bona: re qala moreki, rea e tima, re khutlisetsa potoloho sebakeng se seng, re qala hape, re ts'oara bothata hape, re khutlela ho e fetileng - oops, ha ho na palo ea ho fetoha ha potoloho mme moreki a qala hape bakeng sa metsotso e seng mekae e tla thusa. U tla fumana motsoako oa libopeho tsa data ho tsoa ho mekhahlelo e fapaneng.

Tlhaloso? Joalo ka ha o ka hakanya ho tsoa matšoao a fapaneng a sa tobang, seva e na le lits'ebetso tse ngata tsa mefuta e fapaneng mochining o fapaneng. Ho ka etsahala hore ebe seva se ikarabellang bakeng sa "buffering" se kentse mokolokong seo baokameli ba sona ba se fileng sona, 'me ba se fane ka morero o neng o le teng nakong ea moloko. 'Me ho fihlela mokoloko ona o "bolile", ho ne ho se letho le ka etsoang ka lona.

Mohlomong ... empa ena ke crutch e tšabehang?!.. Che, pele u nahana ka maikutlo a bohlanya, a re shebeng khoutu ea bareki ba molao. Mofuteng oa Android ha re fumane parser leha e le efe ea TL, empa re fumana faele e boima (GitHub e hana ho e ama) ka (de) serialization. Likaroloana tsa khoutu ke tsena:

public static class TL_message_layer68 extends TL_message {
    public static int constructor = 0xc09be45f;
//...
//еще пачка подобных
//...
    public static class TL_message_layer47 extends TL_message {
        public static int constructor = 0xc992e15c;
        public static Message TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) {
            Message result = null;
            switch (constructor) {
                case 0x1d86f70e:
                    result = new TL_messageService_old2();
                    break;
                case 0xa7ab1991:
                    result = new TL_message_old3();
                    break;
                case 0xc3060325:
                    result = new TL_message_old4();
                    break;
                case 0x555555fa:
                    result = new TL_message_secret();
                    break;
                case 0x555555f9:
                    result = new TL_message_secret_layer72();
                    break;
                case 0x90dddc11:
                    result = new TL_message_layer72();
                    break;
                case 0xc09be45f:
                    result = new TL_message_layer68();
                    break;
                case 0xc992e15c:
                    result = new TL_message_layer47();
                    break;
                case 0x5ba66c13:
                    result = new TL_message_old7();
                    break;
                case 0xc06b9607:
                    result = new TL_messageService_layer48();
                    break;
                case 0x83e5de54:
                    result = new TL_messageEmpty();
                    break;
                case 0x2bebfa86:
                    result = new TL_message_old6();
                    break;
                case 0x44f9b43d:
                    result = new TL_message_layer104();
                    break;
                case 0x1c9b1027:
                    result = new TL_message_layer104_2();
                    break;
                case 0xa367e716:
                    result = new TL_messageForwarded_old2(); //custom
                    break;
                case 0x5f46804:
                    result = new TL_messageForwarded_old(); //custom
                    break;
                case 0x567699b3:
                    result = new TL_message_old2(); //custom
                    break;
                case 0x9f8d60bb:
                    result = new TL_messageService_old(); //custom
                    break;
                case 0x22eb6aba:
                    result = new TL_message_old(); //custom
                    break;
                case 0x555555F8:
                    result = new TL_message_secret_old(); //custom
                    break;
                case 0x9789dac4:
                    result = new TL_message_layer104_3();
                    break;

kapa

    boolean fixCaption = !TextUtils.isEmpty(message) &&
    (media instanceof TLRPC.TL_messageMediaPhoto_old ||
     media instanceof TLRPC.TL_messageMediaPhoto_layer68 ||
     media instanceof TLRPC.TL_messageMediaPhoto_layer74 ||
     media instanceof TLRPC.TL_messageMediaDocument_old ||
     media instanceof TLRPC.TL_messageMediaDocument_layer68 ||
     media instanceof TLRPC.TL_messageMediaDocument_layer74)
    && message.startsWith("-1");

Hmm... e shebahala e hlaha. Empa, mohlomong, sena se hlahisoa khoutu, joale ho lokile?.. Empa ka sebele e tšehetsa liphetolelo tsohle! Ke 'nete, ha ho hlake hore na ke hobane'ng ha ntho e' ngoe le e 'ngoe e kopantsoe hammoho, lipuisano tsa sekhukhu, le mefuta eohle ea _old7 ka tsela e itseng ha e shebahale eka ke moloko oa mochine ... Leha ho le joalo, boholo ba tsohle ke ne ke feletsoe ke moea

TL_message_layer104
TL_message_layer104_2
TL_message_layer104_3

Banna, na ha le khone le ho etsa qeto ea hore na ho na le eng ka har'a sekhahla se le seng ?! Hantle, ho lokile, a re re "tse peli" li ile tsa lokolloa ka phoso, hantle, ho etsahala, empa tse THARO? .. Hang-hang, rake e tšoanang hape? Ke litšoantšo tsa bootsoa tsa mofuta ofe, masoabi?..

Ka khoutu ea mohloli oa Telegram Desktop, ka tsela, ho etsahala ntho e tšoanang - haeba ho joalo, tse 'maloa tse etsang ka tatellano ho morero ha li fetole palo ea eona, empa li lokise ntho e itseng. Maemong ao ho seng mohloli oa molao oa data bakeng sa morero, o ka fumanoa hokae, ntle le khoutu ea mohloli oa mofani oa molao? 'Me haeba u e nka ho tloha moo, u ke ke ua ba le bonnete ba hore morero o nepahetse ka ho feletseng ho fihlela u leka mekhoa eohle.

See se ka lekoa joang? Ke ts'epa hore balateli ba liteko tsa unit, tse sebetsang le tse ling ba tla arolelana maikutlo.

Ho lokile, ha re shebeng karolo e 'ngoe ea khoutu:

public static class TL_folders_deleteFolder extends TLObject {
    public static int constructor = 0x1c295881;

    public int folder_id;

    public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) {
        return Updates.TLdeserialize(stream, constructor, exception);
    }

    public void serializeToStream(AbstractSerializedData stream) {
        stream.writeInt32(constructor);
        stream.writeInt32(folder_id);
    }
}

//manually created

//RichText start
public static abstract class RichText extends TLObject {
    public String url;
    public long webpage_id;
    public String email;
    public ArrayList<RichText> texts = new ArrayList<>();
    public RichText parentRichText;

    public static RichText TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) {
        RichText result = null;
        switch (constructor) {
            case 0x1ccb966a:
                result = new TL_textPhone();
                break;
            case 0xc7fb5e01:
                result = new TL_textSuperscript();
                break;

Tlhaloso ena "e entsoeng ka letsoho" e fana ka maikutlo a hore karolo feela ea faele ena e ngotsoe ka letsoho (na u ka inahanela toro eohle ea tlhokomelo?), 'me tse ling kaofela li entsoe ka mochine. Leha ho le joalo, joale ho hlaha potso e 'ngoe - hore mehloli e teng eseng ka botlalo (a la GPL blobs ho Linux kernel), empa sena e se e le sehlooho sa karolo ea bobeli.

Empa ho lekane. Ha re feteleng pele ho protocol eo ho eona ts'ebetso ena kaofela e tsamaeang.

MT Proto

Kahoo, ha re bule tlhaloso e akaretsang и tlhaloso e qaqileng ea protocol 'me ntho ea pele eo re khoptjoang ho eona ke mantsoe. Le ka bongata ba tsohle. Ka kakaretso, sena se bonahala e le tšobotsi ea thepa ea Telegram - ho bitsa lintho ka tsela e fapaneng libakeng tse fapaneng, kapa lintho tse fapaneng ka lentsoe le le leng, kapa ka tsela e fapaneng (mohlala, ho API ea boemo bo phahameng, haeba u bona pakete ea lithupa, ha ho joalo. seo u se nahanang).

Ka mohlala, "molaetsa" le "session" li bolela ho hong ho fapaneng mona ho feta sebopeho se tloaelehileng sa bareki ba Telegraph. Ha e le hantle, ntho e 'ngoe le e' ngoe e hlakile ka molaetsa, e ka hlalosoa ka mantsoe a OOP, kapa e bitsoa "pakete" - sena ke boemo bo tlaase, ba lipalangoang, ha ho na melaetsa e tšoanang le ea sebopeho, ho na le melaetsa e mengata ea litšebeletso. . Empa seboka ... empa lintho tsa pele pele.

lera la sepalangoang

Ntho ea pele ke lipalangoang. Ba tla re bolella ka likhetho tse 5:

  • TCP
  • Websocket
  • Websocket holim'a HTTPS
  • http
  • HTTPS

Vasily, [15.06.18 15:04] Ho boetse ho na le lipalangoang tsa UDP, empa ha li ngotsoe

Le TCP ka mefuta e meraro

Ea pele e tšoana le UDP holim'a TCP, pakete ka 'ngoe e kenyelletsa nomoro ea tatellano le crc
Ke hobane'ng ha ho bala litokomane ka kariki ho le bohloko hakaale?

Be, ke eo jwale TCP e se e ntse e le ka mefuta e 4:

  • E felisitsoe
  • lipakeng
  • Padded bohareng
  • Full

Ho lokile, Padded intermediate bakeng sa MProxy, sena se ile sa eketsoa hamorao ka lebaka la liketsahalo tse tsebahalang. Empa ke hobane'ng ha liphetolelo tse ling tse peli (tse tharo ka kakaretso) ha u ka khona ho feta ka e le 'ngoe? Kaofela ha tsona li fapane ka mokhoa oa ho beha bolelele le mojaro oa MTProto oa mantlha, e tla tšohloa hape:

  • ho Abridged ke 1 kapa 4 bytes, empa eseng 0xef, ebe 'mele
  • ho Intermediate sena ke li-byte tse 4 tsa bolelele le tšimo, 'me lekhetlo la pele mofani a tlameha ho romela 0xeeeeeeee ho bontsha hore ke Mahareng
  • ka E felletseng e lemaletseng ka ho fetesisa, ho tloha ponong ea sebatli sa marang-rang: bolelele, nomoro ea tatellano, 'me E SE EO e leng MTProto,' mele, CRC32. E, sena sohle se holim'a TCP. E re fang lipalangoang tse tšepahalang ka mokhoa oa tatellano ea li-byte stream; ha ho na tatellano e hlokahalang, haholo li-checksums. Ho lokile, joale motho e mong o tla nkhanyetsa hore TCP e na le 16-bit checksum, kahoo bobolu ba data bo etsahala. E kholo, empa ha e le hantle re na le "cryptographic protocol" e nang le li-hashes tse telele ho feta li-byte tse 16, liphoso tsena kaofela - le ho feta - li tla tšoaroa ke ho se lumellane ha SHA boemong bo phahameng. Ha ho na ntlha ho CRC32 holim'a sena.

Ha re bapise Abridged, moo bolelele bo le bong bo ka khonehang, le Bohareng, bo lokafatsang "Haeba ho hlokahala ho tsamaisana le data ka 4-byte," e leng ntho e se nang thuso. Ke eng, ho lumeloa hore baetsi ba mananeo a Telegraph ha ba na bokhoni hoo ba ke keng ba bala data ho tloha soketeng ho ea ho buffer e tsamaellanang? U ntse u tlameha ho etsa sena, hobane ho bala ho ka u khutlisetsa palo efe kapa efe ea li-byte ('me ho boetse ho na le li-server tsa proxy, mohlala ...). Kapa ka lehlakoreng le leng, ke hobane'ng ha u thibela Abridged haeba re ntse re tla ba le padding e boima ka holim'a li-byte tse 16 - boloka li-byte tse 3 иногда ?

E mong o fumana maikutlo a hore Nikolai Durov o hlile o rata ho tsosolosa mabili, ho kenyelletsa le li-protocol tsa marang-rang, ntle le tlhoko ea sebele ea sebele.

Likhetho tse ling tsa lipalangoang, tse kenyeletsang. Web le MProxy, re ke ke ra nahana hona joale, mohlomong posong e 'ngoe, haeba ho na le kopo. Mabapi le MProxy ena, a re hopoleng hona joale hore nakoana ka mor'a hore e lokolloe ka 2018, bafani ba ile ba ithuta kapele ho e thibela, e reretsoeng ho thiba tselaka boholo ba sephutheloana! Hape taba ea hore seva ea MProxy e ngotsoeng (hape ke Waltman) ho C e ne e tlameletsoe ho feta Linux, le hoja sena se ne se sa hlokahale ho hang (Phil Kulin o tla tiisa), le hore seva se tšoanang se ka ba Go kapa Node.js. e kene ka tlase ho lekholo la mela.

Empa qetellong ea karolo re tla etsa liqeto mabapi le tsebo ea ho bala le ho ngola ea batho bana, ka mor’a ho nahana ka litaba tse ling. Hajoale, ha re feteleng ho OSI layer 5, seboka - moo ba behileng seboka sa MTProto.

Linotlolo, melaetsa, linako, Diffie-Hellman

Ba e behile moo e seng ka nepo ka botlalo... Seboka ha se karolo e ts'oanang e bonoang ka har'a li-Active sessions. Empa ka tatellano.

Ho nyatsuoa ha protocol le mekhoa ea tlhophiso ea Telegraph. Karolo ea 1, tekheniki: boiphihlelo ba ho ngola moreki ho tloha qalong - TL, MT

Kahoo re ile ra amohela khoele ea li-byte ea bolelele bo tsejoang ho tloha karolong ea lipalangoang. Ena ke molaetsa o patiloeng kapa mongolo o hlakileng - haeba re ntse re le mothating oa tumellano ea mantlha mme re ntse re e etsa. Ke efe har'a sehlopha sa mehopolo e bitsoang "key" eo re buang ka eona? A re hlakiseng taba ena bakeng sa sehlopha sa Telegram ka boeona (ke kopa tšoarelo ka ho fetolela litokomane tsa ka ho tsoa ho Senyesemane ka boko bo khathetseng ka 4 hoseng, ho ne ho le bonolo ho siea lipoleloana tse ling kamoo li leng kateng):

Ho na le mekhatlo e 'meli e bitsoang setlhopha se kopane - e le 'ngoe ho UI ea bareki ba semmuso tlasa "linako tsa hajoale", moo lenaneo le leng le le leng le lumellanang le sesebelisoa / OS kaofela.
Ea bobeli - Seboka sa MTProto, e nang le nomoro ea tatellano ea molaetsa (ka kutloisiso e tlaase) ho eona, le hore na e ka tšoarella lipakeng tsa likhokahano tse fapaneng tsa TCP. Likopano tse 'maloa tsa MTProto li ka kenngoa ka nako e le' ngoe, mohlala, ho potlakisa ho khoasolla lifaele.

Pakeng tsa tsena tse peli mananeo ho na le mohopolo tumello. Tabeng e mpe, re ka bua joalo Seboka sa UI e ts'oana le tumello, empa bomalimabe, ntho e 'ngoe le e' ngoe e rarahane. Ha re shebeng:

  • Mosebelisi ea sesebelisoa se secha o qala ka ho hlahisa auth_key mme e e tlama ho akhaonto, mohlala ka SMS - ke ka lebaka leo tumello
  • E etsahetse ka hare ho ea pele Seboka sa MTProto, e nang le session_id ka hare ho wena.
  • Mohato ona, motsoako tumello и session_id e ka bitsoa matla a ho laela - lentsoe lena le hlaha litokomaneng le khoutu ea bareki ba bang
  • Joale, moreki a ka bula tse 'maloa Likopano tsa MTProto tlas'a se tšoanang auth_key - ho DC eona eo.
  • Joale, ka letsatsi le leng moreki o tla hloka ho kopa faele ho tsoa ho DC e mong - 'me bakeng sa DC ena ho tla hlahisoa e ncha auth_key !
  • Ho tsebisa sistimi hore ha se mosebelisi e mocha ea ingolisang, empa hoa tšoana tumello (Seboka sa UI), moreki o sebelisa mehala ea API auth.exportAuthorization hae DC auth.importAuthorization ho DC e ncha.
  • Ntho e 'ngoe le e' ngoe e tšoana, tse 'maloa li ka' na tsa buleha Likopano tsa MTProto (e 'ngoe le e 'ngoe e na le ea eona session_id) ho DC ena e ncha, tlas'a ba hae auth_key.
  • Qetellong, moreki a ka batla Perfect Forward Secrecy. Emong le emong auth_key e ne e le Ho sa feleng senotlolo - ka DC - mme moreki a ka letsetsa auth.bindTempAuthKey bakeng sa tshebediso nakoana auth_key - mme hape, e le 'ngoe feela temp_auth_key ka DC, e tloaelehileng ho bohle Likopano tsa MTProto ho DC ena.

hlokomela, hore letsoai (le matsoai a nakong e tlang) e boetse e le 'ngoe auth_key tseo. abela batho bohle Likopano tsa MTProto ho eona DC eo.

"Pakeng tsa likhokahano tse fapaneng tsa TCP" ho bolela eng? Kahoo sena se bolela ntho e kang cookie ea tumello sebakeng sa marang-rang - e phehella (e pholoha) likhokahano tse ngata tsa TCP ho seva e fanoeng, empa ka letsatsi le leng e ea mpe. Feela ho fapana le HTTP, ho MTProto melaetsa ka har'a seboka e baloa ka tatellano mme e tiisitsoe; haeba ba kentse kotopo, khokahano e ile ea robeha - kamora ho theha khokahano e ncha, ka mosa seva se tla romella ntho e ngoe le e ngoe thutong ena eo e sa kang ea fana ka eona nakong e fetileng. Khokahano ea TCP.

Leha ho le joalo, boitsebiso bo ka holimo bo akaretsoa ka mor'a likhoeli tse ngata tsa lipatlisiso. Khabareng, na re kenya tšebetsong moreki oa rona ho tloha qalong? - ha re khutleleng qalong.

Kahoo ha re hlahise auth_key ka Liphetolelo tsa Diffie-Hellman ho tsoa ho Telegraph. Ha re leke ho utloisisa litokomane ...

Vasily, [19.06.18 20:05] data_with_hash := SHA1(data) + data + (li-byte life kapa life tse sa reroang); hoo bolelele bo lekanang le li-byte tse 255;
encrypted_data := RSA(data_with_hash, server_public_key); nomoro e telele ea 255-byte (endian e kholo) e phahamisetsoa ho matla a hlokahalang holim'a modulus e hlokahalang, 'me sephetho se bolokoa e le nomoro ea 256-byte.

Ba na le DH ea dope

Ha e shebahale joalo ka DH ea motho ea phetseng hantle
Ha ho linotlolo tse peli tsa sechaba ho dx

Ha e le hantle, qetellong sena se ile sa hlophisoa, empa masala a sala - bopaki ba mosebetsi bo etsoa ke mofani oa hore o khonne ho lekanya palo. Mofuta oa tšireletso khahlanong le litlhaselo tsa DoS. 'Me senotlolo sa RSA se sebelisoa hanngoe feela ka lehlakoreng le le leng, ha e le hantle bakeng sa encryption new_nonce. Empa le hoja tšebetso ena e bonahalang e le bonolo e tla atleha, u tla tlameha ho tobana le eng?

Vasily, [20.06.18/00/26 XNUMX:XNUMX] Ha ke so fihle kopo ea appid

Ke rometse kopo ena ho DH

'Me, boema-kepe ba lipalangoang e re e ka araba ka li-byte tse 4 tsa khoutu ea phoso. Ke phetho

Hantle, o ile a mpolella -404, ho thoe'ng?

Kahoo ke ile ka re ho eena: "Tšoara bullshit ea hau e kentsoeng ka senotlolo sa seva se nang le menoana e kang ena, ke batla DH," 'me e ile ea arabela ka 404 e hlokang kelello.

U ka nahana'ng ka karabo ee ea seva? Se o lokelang ho se etsa? Ha ho na motho ea ka botsang (empa ho feta moo karolong ea bobeli).

Mona thahasello eohle e etsoa boema-kepeng

Ha ke na letho le leng leo nka le etsang, ke ne ke lora feela ka ho fetolela lipalo pele le morao

Linomoro tse peli tsa 32 bit. Ke ile ka li phutha joaloka batho bohle

Empa che, tsena tse peli li hloka ho kenyelletsoa moleng pele e le BE

Vadim Goncharov, [20.06.18 15:49] le ka lebaka la sena 404?

Vasily, [20.06.18 15:49] EE!

Vadim Goncharov, [20.06.18 15:50] kahoo ha ke utloisise seo a ka se khonang "ha aa ka a se fumana"

Vasily, [20.06.18 15:50] hoo e ka bang

Ha kea fumana ho bola ho joalo ka lintlha tsa mantlha%)

Ha rea ​​ka ra laola tlaleho ea liphoso

Vasily, [20.06.18 20:18] Oh, ho boetse ho na le MD5. E se e le li-hashe tse tharo tse fapaneng

Lintlha tsa bohlokoa tsa menoana li baloa ka tsela e latelang:

digest = md5(key + iv)
fingerprint = substr(digest, 0, 4) XOR substr(digest, 4, 4)

SHA1 le sha2

Kahoo a re e behe auth_key re amohetse li-bits tse 2048 ka boholo re sebelisa Diffie-Hellman. Ho latela eng? Ka mor'a moo re fumana hore likotoana tse ka tlaase tsa 1024 tsa senotlolo sena ha li sebelisoe ka tsela leha e le efe ... empa a re nahaneng ka sena hona joale. Mohato ona, re na le lekunutu le arolelanoang le seva. Ho thehiloe analogue ea seboka sa TLS, e leng mokhoa o theko e boima haholo. Empa seva e ntse e sa tsebe letho ka hore na re bo-mang! Hajoale, ha e le hantle. tumello. Tseo. haeba u ne u nahana ka "login-password", joalokaha u kile ua etsa ICQ, kapa bonyane "login-key", joalo ka SSH (mohlala, ho gitlab / github e 'ngoe). Re amohetse e sa tsejoeng. Ho thoe'ng haeba seva se re bolella "linomoro tsena tsa mohala li sebeletsoa ke DC e 'ngoe"? Kapa "nomoro ea hau ea mohala e thibetsoe"? Se molemohali seo re ka se etsang ke ho boloka senotlolo ka tšepo ea hore se tla ba molemo 'me se se ke sa bola ka nako eo.

Ha e le hantle, re ile ra e “amohela” ka lipehelo. Ka mohlala, na re tšepa seva? Ho thoe'ng haeba e le fake? Ho tla hlokahala licheke tsa Cryptographic:

Vasily, [21.06.18 17:53] Ba fana ka bareki ba mobile ho hlahloba nomoro ea 2kbit bakeng sa primality%).

Empa ha e hlake ho hang, nafeijoa

Vasily, [21.06.18 18:02] Tokomane ha e bolele seo u lokelang ho se etsa haeba ho bonahala ho se bonolo.

Ha ho boleloe. Ha re boneng hore na moreki oa semmuso oa Android o etsa eng tabeng ee? A ke seo (mme e, faele eohle e ea thahasellisa) - joalo ka ha ba re, ke tla siea sena mona:

278     static const char *goodPrime = "c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b";
279   if (!strcasecmp(prime, goodPrime)) {

Che, ehlile e ntse e le teng ba bang Ho na le liteko tsa boleng ba palo, empa ka bonna ha ke sa na tsebo e lekaneng ea lipalo.

Ho lokile, re na le senotlolo sa master. Ho kena, i.e. romela likopo, o hloka ho etsa encryption e eketsehileng, o sebelisa AES.

Senotlolo sa molaetsa se hlalosoa e le likotoana tse 128 tse bohareng tsa SHA256 ea sehlopha sa molaetsa (ho kenyeletsoa nako, ID ea molaetsa, joalo-joalo), ho kenyeletsoa li-byte tsa padding, tse etelletsoeng pele ke li-byte tse 32 tse nkiloeng ho senotlolo sa tumello.

Vasily, [22.06.18 14:08] Karolelano, lenyane, likotoana

E amohetse auth_key. Tsohle. Ka nģ'ane ho bona ... ha e hlake ho tsoa tokomaneng. Ikutloe u lokolohile ho ithuta khoutu ea mohloli o bulehileng.

Hlokomela hore MTProto 2.0 e hloka ho tloha ho li-byte tse 12 ho isa ho tse 1024 tsa padding, e ntse e ipapisitse le maemo a hore bolelele ba molaetsa bo ka aroloa ka li-byte tse 16.

Joale u lokela ho eketsa padding e kae?

E, ho boetse ho na le 404 haeba ho ka ba le phoso

Haeba mang kapa mang a ithutile ka hloko setšoantšo le mongolo oa litokomane, o hlokometse hore ha ho na MAC moo. Le hore AES e sebelisoa ka mokhoa o itseng oa IGE o sa sebelisoe kae kapa kae. Ha e le hantle, ba ngola ka sena ho FAQ ea bona ... Mona, joalo ka, senotlolo sa molaetsa ka boeona ke SHA hash ea data e sirelelitsoeng, e sebelisetsoang ho hlahloba botšepehi - 'me haeba ho sa lumellane, litokomane ka lebaka le itseng. e khothalletsa ho iphapanyetsa bona ka khutso (empa ho thoe'ng ka ts'ireletso, ho thoe'ng haeba ba ka re senya?).

Ha ke setsebi sa li-cryptographer, mohlomong ha ho letho le phoso ka mokhoa ona tabeng ena ho latela pono ea maikutlo. Empa nka bolela ka ho hlaka bothata bo sebetsang, ke sebelisa Telegraph Desktop joalo ka mohlala. E patala cache ea lehae (tsena kaofela D877F783D5D3EF8C) ka tsela e ts'oanang le melaetsa ea MTProto (feela tabeng ena mofuta oa 1.0), ke hore. pele senotlolo sa molaetsa, ebe data ka boeona ('me kae-kae ka thoko e kholo e kholo auth_key Li-byte tse 256, ntle le tsona msg_key hloka thuso). Kahoo, bothata bo bonahala ka lifaele tse kholo. Ka mantsoe a mang, o hloka ho boloka likopi tse peli tsa data - e patiloe le e sirelelitsoeng. 'Me haeba ho na le megabyte, kapa video e phallelang, mohlala?. Empa ka MTProto o tla tlameha qalong encrypt kapa decrypt molaetsa kaofela, ka nako eo o fetisetsa ho netweke kapa disk. Ka hona, liphetolelong tsa morao-rao tsa Telegraph Desktop ho cache in user_data Sebopeho se seng se boetse se sebelisoa - ka AES ka mokhoa oa CTR.

Vasily, [21.06.18 01:27] Oh, ke fumane hore na IGE ke eng: IGE e bile teko ea pele ea "mokhoa oa ho netefatsa ho encryption," qalong bakeng sa Kerberos. E ne e le teko e hlōlehileng (ha e fane ka tšireletso ea botšepehi), 'me e tlameha ho tlosoa. Eo e bile qalo ea tjantjello ea lilemo tse 20 ea mokhoa oa netefatso oa encryption o sebetsang, o sa tsoa fihla sehlohlolong ka mekhoa e kang OCB le GCM.

'Me joale likhang tse tsoang lehlakoreng la koloi:

Sehlopha se ka morao ho Telegram, se etelletsoeng pele ke Nikolai Durov, se na le lihlopha tse tšeletseng tsa ACM, halofo ea tsona Ph.D ka lipalo. Ho ba nkile lilemo tse ka bang peli ho hlahisa mofuta oa hajoale oa MTProto.

Ea qabola. Lilemo tse peli maemong a tlase

Kapa u ka nka tls feela

Ho lokile, ha re re re entse encryption le lintlha tse ling. Na hoa khoneha ho romella likopo tse hlophisitsoeng ho TL le ho nyenyefatsa likarabo? Joale u lokela ho romela eng hona joang? Mona, ha re re, mokhoa initConnection, mohlomong ke eona ena?

Vasily, [25.06.18 18:46] E qala khokahano le ho boloka tlhahisoleseling ho sesebelisoa sa mosebelisi le ts'ebeliso.

E amohela app_id, device_model, system_version, app_version le lang_code.

Le potso e 'ngoe

Litokomane joalo ka kamehla. Ikutloe u lokolohile ho ithuta mohloli o bulehileng

Haeba tsohle li ne li batla li hlakile ka invokeWithLayer, phoso ke efe moo? Hoa etsahala, ha re re re na le - moreki o se a ntse a e-na le seo a ka botsang seva ka sona - ho na le kopo eo re neng re batla ho e romella:

Vasily, [25.06.18 19:13] Ho latela khoutu, mohala oa pele o phuthetsoe ka bohlanya bona, 'me crap ka boeona e phuthetsoe ka invokewithlayer.

Hobaneng initConnection e sa khone ho ba mohala o arohaneng, empa e tlameha ho ba sekoaelo? E, joalokaha ho ile ha etsahala, e tlameha ho etsoa nako le nako qalong ea thuto ka 'ngoe, eseng hanngoe, joalo ka senotlolo sa sehlooho. Empa! E ke ke ea bitsoa ke mosebelisi ea sa lumelloeng! Joale re se re fihlile mothating oo e sebetsang Eona ena leqephe la litokomane - mme e re bolella hore ...

Ke karolo e nyane feela ea mekhoa ea API e fumanehang ho basebelisi ba sa lumelloeng:

  • auth.sendCode
  • auth.rendCode
  • account.getPassword
  • auth.checkPassword
  • auth.checkPhone
  • auth.signUp
  • auth.signIn
  • Auth.importAuthorization
  • thuso.getConfig
  • thuso.getNearestDc
  • thuso.fumanaAppUpdate
  • help.getCdnConfig
  • langpack.getLangPack
  • langpack.getStrings
  • langpack.getDifference
  • langpack.getLanguages
  • langpack.getLanguage

Ea pele ea bona, auth.sendCode, 'me ho na le kopo ea pele eo re e ratang haholo eo ho eona re romellang api_id le api_hash, ebe ka mor'a moo re amohela SMS e nang le khoutu. 'Me haeba re le DC e fosahetseng (linomoro tsa mohala ka har'a naha ena li sebeletsoa ke e mong, mohlala), joale re tla fumana phoso ka palo ea DC eo re e batlang. Ho fumana hore na ke aterese efe ea IP ka nomoro ea DC eo u hlokang ho hokela ho eona, re thuse help.getConfig. Ka nako e 'ngoe ho ne ho e-na le litlhaloso tse 5 feela, empa ka mor'a liketsahalo tse tummeng tsa 2018, palo e eketsehile haholo.

Joale a re hopoleng hore re fihlile sethaleng sena ho seva re sa tsejoe. Na ha ho turu haholo ho fumana aterese ea IP feela? Hobaneng o sa etse sena, le lits'ebetso tse ling, karolong e sa ngolisoang ea MTProto? Ke utloa khanyetso: "Re ka etsa bonnete ba hore ha se RKN ea tla arabela ka liaterese tsa bohata?" Ho sena re hopola hore, ka kakaretso, bareki ba molao Linotlolo tsa RSA li kentsoe, ke. u ka khona feela seka tlhahisoleseding ena. Ha e le hantle, sena se se se ntse se etsoa bakeng sa tlhahisoleseding mabapi le ho thibela ho thibela bareki ho fumana ka litsela tse ling (ka ho utloahalang, sena se ke ke sa etsoa ho MTProto ka boeona; hape u hloka ho tseba hore na u ka hokela hokae).

HO LOKILE. Mothating ona oa tumello ea bareki, ha re e-so fuoe tumello ebile ha re so ngolise kopo ea rona. Re mpa re batla ho bona hajoale hore na seva e arabela joang ka mekhoa e fumanehang ho mosebelisi ea sa lumelloeng. Mme mona…

Vasily, [10.07.18 14:45] https://core.telegram.org/method/help.getConfig

config#7dae33e0 [...] = Config;
help.getConfig#c4f9186b = Config;

https://core.telegram.org/api/datacenter

config#232d5905 [...] = Config;
help.getConfig#c4f9186b = Config;

Lenaneong, oa pele o tla oa bobeli

Ho tdesktop schema boleng ba boraro ke

E, ho tloha ka nako eo, ehlile, litokomane li nchafalitsoe. Le hoja e ka 'na ea se ke ea e-ba ea bohlokoa hape. Moqapi oa ba qalang o lokela ho tseba joang? Mohlomong ha o ngodisa kopo ya hao, ba tla o tsebisa? Vasily o ile a etsa sena, empa ka bomalimabe, ha baa ka ba mo romela letho (hape, re tla bua ka sena karolong ea bobeli).

...U hlokometse hore ka tsela e itseng re se re falletse ho API, ke hore. ho ea boemong bo latelang, 'me u hlolohetsoe ho hong sehloohong sa MTProto? Ha ho makatse:

Vasily, [28.06.18 02:04] Mm, ba ntse ba lekola tse ling tsa algorithms ho e2e.

Mtproto e hlalosa li-algorithms tsa encryption le linotlolo bakeng sa libaka tseo ka bobeli, hammoho le karoloana ea sebopeho sa wrapper.

Empa ba lula ba kopanya maemo a fapaneng a stack, kahoo ha ho hlake hore na mtproto e felile kae mme boemo bo latelang bo qalile.

Li tsoakana joang? Hantle, mona ke senotlolo se tšoanang sa nakoana sa PFS, mohlala (ka tsela, Telegram Desktop e ke ke ea e etsa). E etsoa ka kopo ea API auth.bindTempAuthKey, ke. ho tloha boemong bo hodimo. Empa ka nako e ts'oanang e kena-kenana le encryption maemong a tlase - kamora eona, mohlala, o hloka ho e etsa hape. initConnection joalo-joalo, ha ho joalo feela kopo e tloaelehileng. Ntho e ikhethang hape ke hore o ka ba le senotlolo se le seng sa nakoana ho DC, leha o le tšimong auth_key_id molaetsa o mong le o mong o u lumella ho fetola senotlolo bonyane molaetsa o mong le o mong, le hore seva se na le tokelo ea ho "lebala" senotlolo sa nakoana ka nako leha e le efe - litokomane ha li bolele seo u lokelang ho se etsa tabeng ena ... hantle, ke hobane'ng ha 'Na ha u na linotlolo tse' maloa, joalo ka sete sa matsoai a tlang, 'me?

Ho na le lintho tse ling tse 'maloa tseo u lokelang ho li ela hloko ka sehlooho sa MTProto.

Melaetsa ea molaetsa, msg_id, msg_seqno, ditiisetso, ho lla ka tsela e fosahetseng le tse ding

Ke hobane’ng ha u lokela ho tseba ka tsona? Hobane li "lutla" ho ea holimo, 'me u lokela ho li ela hloko ha u sebetsa le API. Ha re nke hore ha re thahaselle msg_key; boemo bo tlase bo re hlakisitse tsohle. Empa ka har'a data e sirelelitsoeng re na le likarolo tse latelang (hape le bolelele ba data, kahoo rea tseba hore na padding e hokae, empa seo ha se bohlokoa):

  • letsoai - int64
  • session_id - int64
  • message_id — int64
  • seq_no - int32

Ha re le hopotse hore ho na le letsoai le le leng feela bakeng sa DC kaofela. Ke hobane'ng ha u tseba ka eena? Eseng feela hobane ho na le kopo get_future_salts, e u bolellang hore na ke nako efe e tla sebetsa, empa hape hobane haeba letsoai la hau le "bolile", joale molaetsa (kopo) o tla lahleha feela. Ehlile, seva se tla tlaleha letsoai le lecha ka ho fana ka new_session_created - empa ka ea khale u tla tlameha ho e romela ka tsela e itseng, mohlala. Mme taba ena e ama meralo ea kopo.

Seva e lumelletsoe ho theola linako ka botlalo mme e arabe ka tsela ena ka mabaka a mangata. Haele hantle, seboka sa MTProto ke eng ho tsoa lehlakoreng la bareki? Tsena ke linomoro tse peli session_id и seq_no melaetsa ka har'a seboka sena. Ehlile, le khokahano ea mantlha ea TCP, ehlile. Ha re re moreki oa rona o ntse a sa tsebe ho etsa lintho tse ngata, o ile a khaola le ho kopanya hape. Haeba sena se etsahetse ka potlako - seboka sa khale se ile sa tsoela pele ho amana le TCP e ncha, eketsa seq_no ho feta. Haeba e nka nako e telele, seva e ka e hlakola, hobane ka lehlakoreng la eona e boetse e le mokoloko, joalokaha re fumane.

E lokela ho ba eng seq_no? Oh, ke potso e thata eo. Leka ho utloisisa ka botšepehi se neng se boleloa:

Molaetsa o amanang le litaba

Molaetsa o hlokang kananelo e hlakileng. Tsena li kenyelletsa basebelisi bohle le melaetsa e mengata ea lits'ebeletso, hoo e ka bang kaofela ntle le lijana le liteboho.

Nomoro ea Tatelano ea Molaetsa (msg_seqno)

Nomoro ea 32-bit e lekanang le makhetlo a mabeli palo ea melaetsa "e amanang le litaba" (e hlokang ho ananeloa, haholo-holo e seng lijana) e entsoeng ke motho ea romelang molaetsa pele ho molaetsa ona, 'me hamorao e eketsoa ke o mong haeba molaetsa oa hona joale molaetsa o amanang le dikahare. Setshelo se lula se hlahisoa kamora litaba tsohle tsa sona; ka hona, palo ea tatellano ea eona e kholo ho feta kapa e lekana le linomoro tsa tatellano ea melaetsa e teng ho eona.

Ke liserekisi tsa mofuta ofe tse nang le increment ka 1, ebe e 'ngoe ka 2? haholo-holo, e tsoa, ​​e ka romeloa tse 'maloa ditiisetso tse nang le tsona seq_no! Joang? Hantle, ka mohlala, seva se re romella ntho e itseng, se romela, 'me rona ka borona re khutsa, re arabela feela ka melaetsa ea tšebeletso e tiisang ho fumana melaetsa ea eona. Tabeng ena, litiisetso tsa rona tse tsoang li tla ba le nomoro e ts'oanang e tsoang. Haeba u tloaelane le TCP mme u nahana hore sena se utloahala se le hlaha, empa se bonahala se se hlaha haholo, hobane ho TCP seq_no ha e fetohe, empa netefatso e ea ho seq_no ka lehlakoreng le leng, ke tla potlakela ho le ferekanya. Netefatso e fanoe ho MTProto HASE ka seq_no, joalo ka TCP, empa ka msg_id !

Ke eng hoo msg_id, e leng ea bohlokoa ka ho fetisisa masimong ana? Sekhetho se ikhethileng sa molaetsa, joalo ka ha lebitso le fana ka maikutlo. E hlalosoa e le nomoro ea 64-bit, likarolo tse tlaase ka ho fetisisa tseo hape li nang le boselamose ba "server-not-server", 'me tse ling kaofela ke Unix timestamp, ho kenyelletsa le karolo e fokolang, e fetiselitsoeng likotoana tsa 32 ka ho le letšehali. Tseo. timestamp per se (mme melaetsa e nang le linako tse fapaneng haholo e tla hanoa ke seva). Ho tloha ho sena ho hlaha hore ka kakaretso sena ke sesupo sa lefats'e bakeng sa mofani. Ho fanoe ka seo - ha re hopoleng session_id - re tiiselitsoe: Ha ho maemo afe kapa afe moo molaetsa o reretsoeng thuto e le 'ngoe o ka romelloang lenaneong le fapaneng. Ke hore, ho hlaha hore ho se ho ntse ho le teng tse tharo boemo - seshene, nomoro ea kopano, id ea molaetsa. Ke hobane'ng ha overcomplication e joalo, sephiri sena se seholo haholo.

Kahoo, msg_id e hlokahalang bakeng sa...

RPC: likopo, likarabo, liphoso. Netefatso.

Joalokaha e ka 'na eaba u hlokometse, ha ho na mofuta o khethehileng oa "etsa kopo ea RPC" kapa mosebetsi kae kapa kae setšoantšong, leha ho na le likarabo. Etsoe, re na le melaetsa e amanang le litaba! Ke hore, efe kapa efe molaetsa e ka ba kopo! Kapa ho se be. Ebile, ea e 'ngoe le e' ngoe ke msg_id. Empa ho na le likarabo:

rpc_result#f35c6d01 req_msg_id:long result:Object = RpcResult;

Ke hona moo ho bonts'itsoeng hore na karabo ena ke molaetsa ofe. Ka hona, boemong bo phahameng ba API, u tla tlameha ho hopola hore na palo ea kopo ea hau e ne e le efe - ke nahana hore ha ho hlokahale hore u hlalose hore mosebetsi ke asynchronous, 'me ho ka ba le likōpo tse' maloa tse ntseng li tsoela pele ka nako e le 'ngoe, likarabo tsa tsona li ka khutlisoa ka tatellano efe kapa efe? Ha e le hantle, ho tloha ho sena le melaetsa ea phoso e kang ha ho basebetsi, mohaho o ka morao ho sena o ka lateloa: seva e bolokang khokahanyo ea TCP le uena ke ea pele-pele, e fetisetsa likōpo ho li-backends ebe e li bokella ka morao. message_id. Ho bonahala eka ntho e 'ngoe le e' ngoe mona e hlakile, e utloahala ebile e ntle.

E?.. 'Me haeba u nahana ka eona? Ntle le moo, karabelo ea RPC ka boeona e na le tšimo msg_id! Na re hloka ho hoeletsa seva "ha u arabe karabo ea ka!"? E, ho ne ho e-na le eng ka litiisetso? Mabapi le leqephe melaetsa ka melaetsa e re bolella hore na ke eng

msgs_ack#62d6b459 msg_ids:Vector long = MsgsAck;

'me e lokela ho etsoa ka mahlakoreng a mabeli. Empa eseng kamehla! Haeba u fumane RpcResult, ka boeona e sebetsa e le tiiso. Ka mantsoe a mang, seva e ka araba kopo ea hau ka MsgsAck - joalo ka, "Ke e fumane." RpcResult e ka arabela hang-hang. E ka ba bobeli.

'Me e, u ntse u lokela ho araba karabo! Netefatso. Ho seng joalo, seva se tla nka hore ha se khonehe ebe se u khutlisetsa ho uena hape. Esita le ka mor'a ho kopanya hape. Empa mona, ehlile, ho hlaha taba ea linako. Ha re li shebe hamorao.

Khabareng, a re shebeng liphoso tse ka bang teng tsa ho botsa lipotso.

rpc_error#2144ca19 error_code:int error_message:string = RpcError;

Oh, motho e mong o tla hooa, sebopeho se nang le botho ho feta - ho na le mola! Nka nako ea hau. Mona lethathamo la liphoso, empa ho hlakile hore ha ea phethahala. Ho eona re ithuta hore khoutu ke ntho e kang Liphoso tsa HTTP (hantle, ha e le hantle, li-semantics tsa likarabo ha li hlomphuoe, libakeng tse ling li ajoa ka mokhoa o sa reroang har'a likhoutu), 'me mohala o shebahala joaloka CAPITAL_LETTERS_AND_NUMBERS. Mohlala, PHONE_NUMBER_OCCUPIED kapa FILE_PART_Х_MISSING. Ho lokile, ke hore, o ntse o tla hloka mohala ona hlalosetsa. Mohlala FLOOD_WAIT_3600 ho tla bolela hore u tlameha ho ema hora, le PHONE_MIGRATE_5, hore nomoro ea mohala e nang le sehlomapele sena e tlameha ho ngolisoa ho 5th DC. Re na le puo ea mofuta, na? Ha re hloke khang e tsoang khoeleng, ba tloaelehileng ba tla etsa joalo, ho lokile.

Hape, sena ha se leqepheng la melaetsa ea litšebeletso, empa, joalokaha e se e tloaelehile ka morero ona, tlhahisoleseding e ka fumanoa leqepheng le leng la litokomane. Kapa lahla pelaelo. Taba ea pele, sheba, ho thaepa / tlolo ea lera - RpcError e ka ba teng RpcResult. Ke hobane'ng ha e se ka ntle? Ke eng eo re sa kang ra e ela hloko?.. Ka hona, e kae tiisetso ea hore RpcError e kanna ea SE KE ea kengoa RpcResult, empa e be ka ho toba kapa sehlaha ka mofuta o mong? .. 'Me haeba e sa khone, ke hobane'ng ha e se boemong bo phahameng, ke hore. ha e yo req_msg_id ? ..

Empa ha re tsoeleng pele ka melaetsa ea litšebeletso. Moreki a ka nahana hore seva e ntse e nahana nako e telele mme e etsa kopo ena e ntle:

rpc_drop_answer#58e4a740 req_msg_id:long = RpcDropAnswer;

Ho na le likarabo tse tharo tse ka khonehang potsong ena, hape e kopanang le mochine oa tiiso; ho leka ho utloisisa hore na e lokela ho ba eng (le hore na lethathamo le akaretsang la mefuta e sa hlokeng tiiso) le tlohelloa ho 'mali e le mosebetsi oa sekolo (hlokomela: boitsebiso bo ho khoutu ea mohloli oa Telegraph Desktop ha e so fele).

Ho lemalla lithethefatsi: boemo ba molaetsa

Ka kakaretso, libaka tse ngata tsa TL, MTProto le Telegram ka kakaretso li siea maikutlo a manganga, empa ka lebaka la tlhompho, masene le tse ling. tsebo e bonolo Re ile ra khutsa ka eona ka tlhompho, 'me ra nyatsa lintho tse nyonyehang lipuisanong. Leha ho le joalo, sebaka senaОboholo ba leqephe le mabapi le melaetsa ka melaetsa Hoa makatsa le ho 'na, ea 'nileng a sebetsa le li-protocol tsa marang-rang ka nako e telele' me a bone libaesekele tsa likhato tse fapaneng tsa ho khopama.

E qala ntle le molato, ka ditiisetso. Ka mor'a moo ba re bolella ka

bad_msg_notification#a7eff811 bad_msg_id:long bad_msg_seqno:int error_code:int = BadMsgNotification;
bad_server_salt#edab447b bad_msg_id:long bad_msg_seqno:int error_code:int new_server_salt:long = BadMsgNotification;

Le ha ho le joalo, motho e mong le e mong ea qalang ho sebetsa le MTProto o tla tlameha ho sebetsana le tsona; ka potoloho ea "e lokisitsoeng - e nchafalitsoeng - e qalileng", ho fumana liphoso tsa linomoro kapa letsoai le khonneng ho senyeha nakong ea liphetoho ke ntho e tloaelehileng. Leha ho le joalo, ho na le lintlha tse peli mona:

  1. Sena se bolela hore molaetsa wa pele o lahlehile. Re hloka ho theha mela e meng, re tla e sheba hamorao.
  2. Linomoro tsee tse makatsang tsa liphoso ke life? 16, 17, 18, 19, 20, 32, 33, 34, 35, 48, 64... linomoro tse ling li kae, Tommy?

Litokomane li re:

Sepheo ke hore litekanyetso tsa error_code li hlophisitsoe (error_code >> 4): mohlala, likhoutu 0x40 - 0x4f li tsamaisana le liphoso tsa ho senyeha ha setshelo.

empa, pele, ho fetoha ka lehlakoreng le leng, 'me ea bobeli, ha ho tsotellehe, li-code tse ling li hokae? Hloohong ea mongoli?.. Leha ho le joalo, tsena ke lifono.

Ho lemalla ho qala ka melaetsa e mabapi le maemo a melaetsa le likopi tsa molaetsa:

  • Kopo ea Boitsebiso ba Boemo ba Molaetsa
    Haeba lehlakore le leng ha le so fumane lintlha ka boemo ba melaetsa ea lona ka nakoana, le ka e kopa ka ho hlaka ho tsoa ho motho e mong:
    msgs_state_req#da69fb52 msg_ids:Vector long = MsgsStateReq;
  • Molaetsa oa Tlhahisoleseding mabapi le Boemo ba Melaetsa
    msgs_state_info#04deb57d req_msg_id:long info:string = MsgsStateInfo;
    Mona, info ke khoele e nang le li-byte e le 'ngoe ea boemo ba molaetsa bakeng sa molaetsa ka mong ho tsoa lethathamong la msg_ids le kenang:

    • 1 = ha ho letho le tsejoang ka molaetsa (msg_id e tlase haholo, mohlomong motho e mong o e lebetse)
    • 2 = molaetsa ha o so amoheloe (msg_id e oela ka har'a li-identifiers tse bolokiloeng; leha ho le joalo, motho e mong ha a so fumane molaetsa o joalo)
    • 3 = molaetsa ha o so amoheloe (msg_id e phahame haholo; leha ho le joalo, motho e mong ha a so e fumane)
    • 4 = molaetsa o amohetsoeng (hlokomela hore karabelo ena le eona ka nako e ts'oanang ke tumello ea rasiti)
    • +8 = molaetsa o seng o ananetswe
    • +16 = molaetsa o sa hlokeng ho ananeloa
    • +32 = Potso ea RPC e teng molaetseng o ntseng o sebetsoa kapa o se o ntse o sebetsa
    • +64 = karabo e amanang le litaba ho molaetsa o seng o hlahisitsoe
    • +128 = mokha o mong o tseba hantle hore molaetsa o se o amohetsoe
      Karabo ena ha e hloke tumello. Ke kananelo ya msgs_state_req e amehang, ka boyona.
      Hlokomela hore haeba ho ka hlaha ka tšohanyetso hore mokha o mong ha a na molaetsa o shebahalang eka o rometsoe ho oona, molaetsa o ka romelloa hape. Esita le haeba motho e mong a ka fumana likopi tse peli tsa molaetsa ka nako e le 'ngoe, o tla hlokomolohuoa. (Haeba nako e ngata haholo e fetile, mme msg_id ea mantlha e se e se e sa sebetse, molaetsa o tlameha ho thateloa ka msg_copy).
  • Puisano ea Boithaopo ea Boemo ba Melaetsa
    E mong le e mong a ka tsebisa mokha o mong ka boithatelo boemo ba melaetsa e fetisoang ke motho e mong.
    msgs_all_info#8cc0d131 msg_ids:Vector long info:string = MsgsAllInfo
  • Puisano e Atolositsoeng ea Boithaopo ea Boemo ba Molaetsa o le Mong
    ...
    msg_detailed_info#276d3ec6 msg_id:long answer_msg_id:long bytes:int status:int = MsgDetailedInfo;
    msg_new_detailed_info#809db6df answer_msg_id:long bytes:int status:int = MsgDetailedInfo;
  • Kopo e Hlakileng ea ho Romela Melaetsa hape
    msg_resend_req#7d861a08 msg_ids:Vector long = MsgResendReq;
    Mokha o hole o arabela hang-hang ka ho romella melaetsa e batlisisitsoeng […]
  • Kopo e Hlakileng ea ho Romela Likarabo hape
    msg_resend_ans_req#8610baeb msg_ids:Vector long = MsgResendReq;
    Mokete o ka thōko o arabela hang-hang ka ho romela hape likarabo tse ho melaetsa e batlisisitsoeng […]
  • Likopi tsa Molaetsa
    Maemong a mang, molaetsa oa khale o nang le msg_id o seng o sa sebetse o hloka ho romelloa hape. Ebe e phuthetsoe ka setshelo sa kopi:
    msg_copy#e06046b2 orig_message:Message = MessageCopy;
    Hang ha e amoheloa, molaetsa o sebetsoa joalokaha eka sephutheloana ha se eo. Leha ho le joalo, haeba ho tsebahala hore molaetsa orig_message.msg_id o amohetsoe, molaetsa o mocha ha o sebetsoe (ha ka nako e ts'oanang, eona le orig_message.msg_id lia amoheloa). Boleng ba orig_message.msg_id bo tlameha ho ba tlase ho feta msg_id ea sets'oants'o.

Ha re bile re khutsa ka eng msgs_state_info hape litsebe tsa TL tse sa phethoang li ntse li tsoela pele (re ne re hloka vector ea li-byte, 'me likarolong tse peli tse ka tlaase ho ne ho e-na le enum,' me ka holimo ho tse peli ho ne ho e-na le lifolakha). Taba e fapane. Na ho na le motho ea utloisisang hore na ke hobane'ng ha see sohle se sebetsa? ho moreki oa 'nete ho hlokahala? Empa mona likopo li hlalosoa leeto la ho ea le ho khutla.

Ho latela hore mokete o mong le o mong o se ke oa ngolla le ho romella melaetsa feela, empa hape o boloke data ka bona, mabapi le likarabo ho bona, ka nako e sa tsejoeng. Litokomane ha li hlalose hore na ke linako kapa hore na likarolo tsena li sebetsa joang. ha ho tsela. Ho makatsang haholo ke hore li hlile li sebelisoa khoutu ea bareki ba semmuso! Kamoo ho bonahalang kateng ba ile ba bolelloa ntho e neng e sa kenyelletsoa litokomaneng tsa sechaba. Utloisisa ho tsoa ho khoutu hobaneng, ha e sa le bonolo joaloka tabeng ea TL - ha se karolo (e batlang e le) e arohaneng ka mokhoa o utloahalang, empa e le sengoathoana se tlamelletsoeng mohahong oa kopo, ke hore. ho tla hloka nako e ngata ho feta ho utloisisa khoutu ea kopo.

Linako le linako. Mela.

Ho tsoa ho ntho e 'ngoe le e' ngoe, haeba re hopola likhakanyo mabapi le meralo ea seva (kabo ea likopo ho pholletsa le li-backends), ho latela ntho e utloisang bohloko - leha ho na le litiisetso tsohle tsa TCP (ebang data e fanoe, kapa u tla tsebisoa ka lekhalo, empa data e tla fanoa pele bothata bo hlaha), litiiso ho MTProto ka boeona - ha ho tiisetso. Seva e ka lahleheloa kapa ea lahlela molaetsa oa hau habonolo, 'me ha ho letho le ka etsoang ka eona, sebelisa feela mefuta e fapaneng ea lithupa.

'Me pele ho tsohle - mela ea melaetsa. Hantle, ntho e 'ngoe le e' ngoe e ne e hlakile ho tloha qalong - molaetsa o sa tiisetsoang o tlameha ho bolokoa le ho halefisoa. Mme kamora nako efe? 'Me motlatsi oa mo tseba. Mohlomong melaetsa eo ea ts'ebeletso e lemaletseng ka tsela e itseng e rarolla bothata bona ka lithupa, ho re, ho Telegraph Desktop ho na le mela e ka bang 4 e tsamaisanang le eona (mohlomong ho feta, joalo ka ha ho se ho boletsoe, bakeng sa sena o hloka ho hlahlobisisa khoutu le meralo ea eona ka botebo; ka nako e ts'oanang. nako, rona Rea tseba hore e ke ke ea nkoa e le mohlala; palo e itseng ea mefuta e tsoang ho morero oa MTProto ha e sebelisoe ho eona).

Ke hobane'ng ha see se etsahala? Mohlomong, baetsi ba li-server ba ne ba sitoa ho netefatsa ho ts'epahala ka har'a sehlopha, kapa esita le ho buffer ho balancer e ka pele, mme ba fetisetsa bothata bona ho moreki. Ka lebaka la ho nyahama, Vasily o ile a leka ho kenya ts'ebetsong khetho e 'ngoe, ka mela e 'meli feela, a sebelisa li-algorithms ho tloha TCP - ho lekanya RTT ho seva le ho lokisa boholo ba "fensetere" (ka melaetsa) ho itšetlehile ka palo ea likōpo tse sa netefatsoang. Ke hore, heuristic e boima joalo ea ho lekola mojaro oa seva ke hore na likopo tsa rona tse ngata li ka li hlafuna ka nako e le 'ngoe' me li sa lahlehe.

Ho joalo, ke hore, ua utloisisa, na? Haeba o tlameha ho kenya ts'ebetsong TCP hape ka holim'a protocol e tsamaeang holim'a TCP, sena se bontša protocol e entsoeng hampe haholo.

Ee, ke hobane'ng ha u hloka queue e fetang bonngoe, 'me see se bolela'ng ho motho ea sebetsang le API ea boemo bo phahameng? Sheba, u etsa kopo, u e hlophise, empa hangata ha u khone ho e romela hanghang. Hobaneng? Hobane karabo e tla ba teng msg_id, e leng ea nakoanaаKe leibole, eo kabelo ea eona e chechisetsoang morao ho fihlela kamora nako - haeba seva e e hana ka lebaka la ho se lumellane ha nako lipakeng tsa rona le eena (ehlile, re ka etsa crutch e fetolang nako ea rona ho tloha hajoale. ho seva ka ho kenyelletsa delta e baloang ho tsoa likarabong tsa seva - bareki ba semmuso ba etsa sena, empa ha e na thuso ebile ha e nepahale ka lebaka la buffering). Ka hona, ha o etsa kopo ka mohala oa ts'ebetso oa lehae o tsoang laeboraring, molaetsa o feta methating e latelang:

  1. E lutse moleng o le mong 'me e emetse encryption.
  2. E kgethiloe msg_id 'me molaetsa o ile oa ea moleng o mong - ho khoneha ho fetisa; romela ho sokete.
  3. a) Seva e arabile MsgsAck - molaetsa o fanoe, re o hlakola "moleng o mong".
    b) Kapa ka tsela e fapaneng, o ne a sa rate ho hong, o ile a araba badmsg - romella ho tsoa "moleng o mong"
    c) Ha ho letho le tsejoang, molaetsa o hloka ho halefisoa ke mokoloko o mong - empa ha ho tsejoe hantle hore na ke neng.
  4. Qetellong seva e ile ea arabela RpcResult - karabo ea sebele (kapa phoso) - eseng feela ho fanoa, empa hape e sebelitsoe.

Mohlomong, tšebeliso ea lijana e ka rarolla bothata ka mokhoa o itseng. Mona ke ha bongata ba melaetsa bo kenngoa ho o le mong, 'me seva se arabela ka netefatso ho eona kaofela hang, ka nako e le' ngoe. msg_id. Empa hape o tla hana pakete ena, haeba ho na le ntho e sa tsamaeeng hantle, ka botlalo.

'Me ntlheng ena ho na le maikutlo a sa amaneng le theknoloji. Ho tsoa phihlelong, re bone lithupa tse ngata, 'me ho phaella moo, re tla bona mehlala e mengata ea keletso e mpe le meralo ea meralo - maemong a joalo, na ho bohlokoa ho tšepa le ho etsa liqeto tse joalo? Potso ke rhetorical (ehlile ha ho joalo).

Re bua ka eng? Haeba ka sehlooho sa "melaetsa ea lithethefatsi mabapi le melaetsa" u ntse u ka hakanya ka khanyetso e kang "u sethoto, ha ua ka ua utloisisa morero oa rona o motle!" (kahoo ngola litokomane pele, joalo ka ha batho ba tloaelehileng ba lokela, ka mabaka a utloahalang le mehlala ea phapanyetsano ea lipakete, joale re tla bua), joale nako / nako ea nako ke potso e sebetsang hantle le e tobileng, ntho e 'ngoe le e' ngoe mona e tsejoa ka nako e telele. Litokomane li re bolella eng ka linako tsa nako?

Hangata seva se amohela ho fumana molaetsa ho tsoa ho moreki (hangata, potso ea RPC) e sebelisa karabo ea RPC. Haeba karabo e le nako e telele e tlang, seva se ka romella lengolo la tumello pele, 'me hamorao, karabo ea RPC ka boeona.

Hangata moreki o lumela ho fumana molaetsa o tsoang ho seva (hangata, karabo ea RPC) ka ho eketsa kananelo potsong e latelang ea RPC haeba e sa fetisoe morao haholo (haeba e hlahisoa, e re, metsotsoana e 60-120 kamora ho fumana. ya molaetsa o tswang ho seva). Leha ho le joalo, haeba ka nako e telele ho se na lebaka la ho romela melaetsa ho seva kapa haeba ho na le melaetsa e mengata e sa amoheloang e tsoang ho seva (e re, ho feta 16), mofani o fetisetsa tumello e ikemetseng.

... Ke fetolela: rona ka borona ha re tsebe hore na re hloka bokae le kamoo re e hlokang kateng, kahoo a re nke hore e ke e be tjena.

Le ka li-pings:

Melaetsa ea Ping (PING/PONG)

ping#7abe77ec ping_id:long = Pong;

Karabo hangata e khutlisetsoa khokahanong e ts'oanang:

pong#347773c5 msg_id:long ping_id:long = Pong;

Melaetsa ena ha e hloke ho ananeloa. Pong e fetisoa feela ka lebaka la ping ha ping e ka qalisoa ka mahlakore ka bobeli.

Khokahano e Khutlisitsoeng e Koalo + PING

ping_delay_disconnect#f3427b8c ping_id:long disconnect_delay:int = Pong;

E sebetsa joalo ka ping. Ho phaella moo, ka mor'a hore sena se amoheloe, seva se qala sebali sa nako se tla koala khokahanyo ea hona joale disconnect_delay metsotsoana hamorao ntle le haeba e fumana molaetsa o mocha oa mofuta o ts'oanang o tsosolosang li-timers tsohle tse fetileng. Haeba moreki a romella li-pings tsena hang ka mor'a metsotsoana e meng le e meng e 60, mohlala, e ka beha disconnect_delay e lekanang le metsotsoana e 75.

Oa hlanya?! Ka mor'a metsotsoana e 60, terene e tla kena seteisheneng, e theohe ebe e palamisa bapalami, 'me e boetse e lahleheloa ke puisano kotopong. Ka metsotsoana e 120, ha u ntse u e utloa, e tla fihla ho e 'ngoe,' me ho ka etsahala hore ebe khokahanyo e ka senyeha. Hantle, ho hlakile hore na maoto a tsoa hokae - "Ke utloile ho lla, empa ha ke tsebe moo e leng teng", ho na le algorithm ea Nagl le khetho ea TCP_NODELAY, e reretsoeng mosebetsi o kopanetsoeng. Empa, ntšoarele, tšoarella boleng ba eona ba kamehla - 200 Millimetsotsoana Haeba u hlile u batla ho tšoantša ntho e tšoanang 'me u boloke lipaketeng tse 'maloa tse ka khonehang, e behe metsotsoana e 5, kapa eng kapa eng eo molaetsa oa "Mosebelisi o ngola ..." nako ea ho fela ea molaetsa ke hona joale. Empa ha ho sa le joalo.

'Me qetellong, pings. Ke hore, ho lekola bophelo ba khokahano ea TCP. Hoa qabola, empa hoo e ka bang lilemo tse 10 tse fetileng ke ile ka ngola sengoloa se nyarosang mabapi le lenģosa la kamore ea rona ea thuto - bangoli ba moo le bona ba ile ba nyenyefatsa seva ho tsoa ho moreki, eseng ka tsela e fapaneng. Empa baithuti ba selemo sa 3 ke ntho e le 'ngoe,' me ofisi ea machabeng ke e 'ngoe, ho joalo?

Ea pele, lenaneo le lenyenyane la thuto. Khokahano ea TCP, ha ho se na phapanyetsano ea lipakete, e ka phela libeke. Sena se setle le se sebe, ho latela morero. Ho molemo haeba u ne u e-na le khokahano ea SSH e bulehileng ho seva, u tsohile k'homphieutheng, u tsosolosa router, u khutlela sebakeng sa hau - seboka ka seva sena ha sea ka sa taboha (ha ua ka ua thaepa letho, ho ne ho se na lipakete) , ho loketse. Ho hobe haeba ho na le bareki ba likete ho seva, e mong le e mong a nka lisebelisoa (hello, Postgres!), 'Me moeti oa mofani a ka' na a tsosolosa nako e telele e fetileng - empa re ke ke ra tseba ka eona.

Sistimi ea Chat/IM e oela nyeoeng ea bobeli ka lebaka le leng hape - maemo a inthaneteng. Haeba mosebelisi "a oele", o hloka ho tsebisa ba buisanang le eena ka sena. Ho seng joalo, u tla qetella u e-na le phoso eo baetsi ba Jabber ba e entseng (le ho lokisoa ka lilemo tse 20) - mosebedisi o khaotsoe, empa ba ntse ba tsoela pele ho mo ngolla melaetsa, ba lumela hore o inthaneteng (eo hape e neng e lahlehile ka ho feletseng ho tsena. metsotso e seng mekae pele ho khaoha ho sibolloa). Che, khetho ea TCP_KEEPALIVE, eo batho ba bangata ba sa utloisiseng hore na li-timers tsa TCP li sebetsa joang ka mokhoa o sa reroang (ka ho beha litekanyetso tse hlaha joalo ka metsotsoana e mashome), e ke ke ea thusa mona - o hloka ho etsa bonnete ba hore eseng kernel ea OS feela. ea mochine oa mosebedisi oa phela, empa hape e sebetsa ka mokhoa o tloaelehileng, ka ho khona ho arabela, le kopo ka boeona (na u nahana hore e ke ke ea hoama? Telegram Desktop ho Ubuntu 18.04 e ile ea nkama ho feta hang).

Ke ka lebaka leo u tlamehang ho ping seva moreki, mme eseng ka tsela e fapaneng - haeba moreki a etsa sena, haeba khokahano e robehile, ping e ke ke ea fanoa, sepheo se ke ke sa finyelloa.

Re bona eng ho Telegraph? Ho hlile ho fapane! Ho joalo, ho joalo. Ka molao, ehlile, mahlakore ka bobeli a ka ping e mong. Ha e le hantle, bareki ba sebelisa crutch ping_delay_disconnect, e behang nako ho seva. Hantle, ntsoarele, ha se ho mofani ho etsa qeto ea hore na o batla ho lula nako e kae ntle le ping. Seva, se ipapisitse le mojaro oa eona, se tseba hantle. Empa, ha e le hantle, haeba u sa tsotelle lisebelisoa, joale u tla ba Pinocchio ea hau e khopo, 'me molamu o tla etsa ...

E ne e lokela hore ebe e entsoe joang?

Ke lumela hore lintlha tse ka holimo li bontša ka ho hlaka hore sehlopha sa Telegram / VKontakte ha se na bokhoni haholo tšimong ea lipalangoang (le tse tlaase) tsa marang-rang a lik'homphieutha le mangolo a bona a tlaase litabeng tse amehang.

Ke hobane'ng ha e ile ea e-ba e rarahaneng hakaale, hona baetsi ba meralo ea Telegram ba ka leka ho hanyetsa joang? Taba ea hore ba ile ba leka ho etsa seboka se pholohang khefu ea khokahano ea TCP, ke hore, se sa kang sa fanoa hona joale, re tla fana ka sona hamorao. Mohlomong ba ile ba boela ba leka ho etsa lipalangoang tsa UDP, empa ba ile ba kopana le mathata 'me ba e lahla (ke ka lebaka leo litokomane li se nang letho - ho ne ho se letho leo ba ka ithorisang ka lona). Empa ka lebaka la ho hloka kutloisiso ea kamoo marang-rang ka kakaretso le TCP e sebetsang ka ho khetheha, moo u ka itšetlehang ka eona, le moo u lokelang ho e etsa u le mong (le joang), le boiteko ba ho kopanya sena le mokhoa oa ho ngola "linonyana tse peli lejoe le le leng”, sena ke sephetho.

Ho ne ho hlokahala joang? E itšetlehile ka 'nete ea hore msg_id ke setempe sa linako se hlokahalang ho tloha sebakeng sa cryptographic ho thibela litlhaselo tsa replay, ke phoso ho hokela ts'ebetso e ikhethang ea sekhetho ho eona. Ka hona, ntle le ho fetola meralo ea hajoale (ha ho hlahisoa phallo ea Lintlafatso, ke sehlooho sa boemo bo holimo sa API bakeng sa karolo e 'ngoe ea letoto lena la lipehelo), motho o tla hloka ho:

  1. Seva e tšoereng khokahano ea TCP ho moreki e nka boikarabello - haeba e balile ho tsoa ho sokete, ka kopo amohela, sebetsa kapa u khutlisetse phoso, ha ho tahlehelo. Joale netefatso ha se vector ea li-ID, empa ke feela "seq_no" ea ho qetela - palo feela, joalo ka TCP (linomoro tse peli - seq ea hau le e netefalitsoeng). Re lula re le ka har'a seboka, na ha ho joalo?
  2. Setempe sa nako sa ho thibela litlhaselo tsa replay se fetoha lebala le arohaneng, la nonce. E hlahlobiloe, empa ha e ame letho le leng. Ho lekane le uint32 - haeba letsoai la rona le fetoha bonyane halofo e 'ngoe le e' ngoe ea letsatsi, re ka arola likotoana tse 16 ho likarolo tse tlase tsa nako ea hona joale, tse ling - ho karolo ea motsotsoana (joaloka hona joale).
  3. E tlositsoe msg_id ho hang - ho tloha ntlheng ea ho khetholla likopo ho li-backends, ho na le, pele, id ea moreki, 'me ea bobeli, id ea seboka, e li kopanya. Ka hona, ntho e le 'ngoe feela e lekane e le sekhetho sa kopo seq_no.

Hape ha se khetho e atlehileng ka ho fetesisa; ntho e felletseng e ka sebetsa joalo ka sesupo - sena se se se entsoe ho API ea boemo bo holimo ha o romella molaetsa, ka tsela. Ho ka ba molemo ho tsosolosa ka ho feletseng mohaho ho tloha ho o mong ho ea ho o feletseng, empa sena ke sehlooho sa karolo e 'ngoe, eseng poso ena.

API?

Ta-daam! Kahoo, ka mor'a ho loana ka thata tseleng e tletseng bohloko le lithupa, qetellong re ile ra khona ho romela likōpo leha e le life ho seva le ho fumana likarabo leha e le life ho tsona, hammoho le ho fumana lintlha tse ncha ho tswa ho seva (eseng ho arabela kopo, empa eona ka boeona. e re romella, joalo ka PUSH, haeba ho na le motho ea hlakileng haholoanyane).

Ela hloko, joale ho tla ba le mohlala o le mong feela ho Perl sehloohong sena! (bakeng sa ba sa tloaelaneng le syntax, khang ea pele ea tlhohonolofatso ke sebopeho sa data sa ntho, ea bobeli ke sehlopha sa eona):

2019.10.24 12:00:51 $1 = {
'cb' => 'TeleUpd::__ANON__',
'out' => bless( {
'filter' => bless( {}, 'Telegram::ChannelMessagesFilterEmpty' ),
'channel' => bless( {
'access_hash' => '-6698103710539760874',
'channel_id' => '1380524958'
}, 'Telegram::InputPeerChannel' ),
'pts' => '158503',
'flags' => 0,
'limit' => 0
}, 'Telegram::Updates::GetChannelDifference' ),
'req_id' => '6751291954012037292'
};
2019.10.24 12:00:51 $1 = {
'in' => bless( {
'req_msg_id' => '6751291954012037292',
'result' => bless( {
'pts' => 158508,
'flags' => 3,
'final' => 1,
'new_messages' => [],
'users' => [],
'chats' => [
bless( {
'title' => 'Хулиномика',
'username' => 'hoolinomics',
'flags' => 8288,
'id' => 1380524958,
'access_hash' => '-6698103710539760874',
'broadcast' => 1,
'version' => 0,
'photo' => bless( {
'photo_small' => bless( {
'volume_id' => 246933270,
'file_reference' => '
'secret' => '1854156056801727328',
'local_id' => 228648,
'dc_id' => 2
}, 'Telegram::FileLocation' ),
'photo_big' => bless( {
'dc_id' => 2,
'local_id' => 228650,
'file_reference' => '
'secret' => '1275570353387113110',
'volume_id' => 246933270
}, 'Telegram::FileLocation' )
}, 'Telegram::ChatPhoto' ),
'date' => 1531221081
}, 'Telegram::Channel' )
],
'timeout' => 300,
'other_updates' => [
bless( {
'pts_count' => 0,
'message' => bless( {
'post' => 1,
'id' => 852,
'flags' => 50368,
'views' => 8013,
'entities' => [
bless( {
'length' => 20,
'offset' => 0
}, 'Telegram::MessageEntityBold' ),
bless( {
'length' => 18,
'offset' => 480,
'url' => 'https://alexeymarkov.livejournal.com/[url_вырезан].html'
}, 'Telegram::MessageEntityTextUrl' )
],
'reply_markup' => bless( {
'rows' => [
bless( {
'buttons' => [
bless( {
'text' => '???? 165',
'data' => 'send_reaction_0'
}, 'Telegram::KeyboardButtonCallback' ),
bless( {
'data' => 'send_reaction_1',
'text' => '???? 9'
}, 'Telegram::KeyboardButtonCallback' )
]
}, 'Telegram::KeyboardButtonRow' )
]
}, 'Telegram::ReplyInlineMarkup' ),
'message' => 'А вот и новая книга! 
// [текст сообщения вырезан чтоб не нарушать правил Хабра о рекламе]
напечатаю.',
'to_id' => bless( {
'channel_id' => 1380524958
}, 'Telegram::PeerChannel' ),
'date' => 1571724559,
'edit_date' => 1571907562
}, 'Telegram::Message' ),
'pts' => 158508
}, 'Telegram::UpdateEditChannelMessage' ),
bless( {
'pts' => 158508,
'message' => bless( {
'edit_date' => 1571907589,
'to_id' => bless( {
'channel_id' => 1380524958
}, 'Telegram::PeerChannel' ),
'date' => 1571807301,
'message' => 'Почему Вы считаете Facebook плохой компанией? Можете прокомментировать? По-моему, это шикарная компания. Без долгов, с хорошей прибылью, а если решат дивы платить, то и еще могут нехило подорожать.
Для меня ответ совершенно очевиден: потому что Facebook делает ужасный по качеству продукт. Да, у него монопольное положение и да, им пользуется огромное количество людей. Но мир не стоит на месте. Когда-то владельцам Нокии было смешно от первого Айфона. Они думали, что лучше Нокии ничего быть не может и она навсегда останется самым удобным, красивым и твёрдым телефоном - и доля рынка это красноречиво демонстрировала. Теперь им не смешно.
Конечно, рептилоиды сопротивляются напору молодых гениев: так Цукербергом был пожран Whatsapp, потом Instagram. Но всё им не пожрать, Паша Дуров не продаётся!
Так будет и с Фейсбуком. Нельзя всё время делать говно. Кто-то когда-то сделает хороший продукт, куда всё и уйдут.
#соцсети #facebook #акции #рептилоиды',
'reply_markup' => bless( {
'rows' => [
bless( {
'buttons' => [
bless( {
'data' => 'send_reaction_0',
'text' => '???? 452'
}, 'Telegram::KeyboardButtonCallback' ),
bless( {
'text' => '???? 21',
'data' => 'send_reaction_1'
}, 'Telegram::KeyboardButtonCallback' )
]
}, 'Telegram::KeyboardButtonRow' )
]
}, 'Telegram::ReplyInlineMarkup' ),
'entities' => [
bless( {
'length' => 199,
'offset' => 0
}, 'Telegram::MessageEntityBold' ),
bless( {
'length' => 8,
'offset' => 919
}, 'Telegram::MessageEntityHashtag' ),
bless( {
'offset' => 928,
'length' => 9
}, 'Telegram::MessageEntityHashtag' ),
bless( {
'length' => 6,
'offset' => 938
}, 'Telegram::MessageEntityHashtag' ),
bless( {
'length' => 11,
'offset' => 945
}, 'Telegram::MessageEntityHashtag' )
],
'views' => 6964,
'flags' => 50368,
'id' => 854,
'post' => 1
}, 'Telegram::Message' ),
'pts_count' => 0
}, 'Telegram::UpdateEditChannelMessage' ),
bless( {
'message' => bless( {
'reply_markup' => bless( {
'rows' => [
bless( {
'buttons' => [
bless( {
'data' => 'send_reaction_0',
'text' => '???? 213'
}, 'Telegram::KeyboardButtonCallback' ),
bless( {
'data' => 'send_reaction_1',
'text' => '???? 8'
}, 'Telegram::KeyboardButtonCallback' )
]
}, 'Telegram::KeyboardButtonRow' )
]
}, 'Telegram::ReplyInlineMarkup' ),
'views' => 2940,
'entities' => [
bless( {
'length' => 609,
'offset' => 348
}, 'Telegram::MessageEntityItalic' )
],
'flags' => 50368,
'post' => 1,
'id' => 857,
'edit_date' => 1571907636,
'date' => 1571902479,
'to_id' => bless( {
'channel_id' => 1380524958
}, 'Telegram::PeerChannel' ),
'message' => 'Пост про 1С вызвал бурную полемику. Человек 10 (видимо, 1с-программистов) единодушно написали:
// [текст сообщения вырезан чтоб не нарушать правил Хабра о рекламе]
Я бы добавил, что блестящая у 1С дистрибуция, а маркетинг... ну, такое.'
}, 'Telegram::Message' ),
'pts_count' => 0,
'pts' => 158508
}, 'Telegram::UpdateEditChannelMessage' ),
bless( {
'pts' => 158508,
'pts_count' => 0,
'message' => bless( {
'message' => 'Здравствуйте, расскажите, пожалуйста, чем вредит экономике 1С?
// [текст сообщения вырезан чтоб не нарушать правил Хабра о рекламе]
#софт #it #экономика',
'edit_date' => 1571907650,
'date' => 1571893707,
'to_id' => bless( {
'channel_id' => 1380524958
}, 'Telegram::PeerChannel' ),
'flags' => 50368,
'post' => 1,
'id' => 856,
'reply_markup' => bless( {
'rows' => [
bless( {
'buttons' => [
bless( {
'data' => 'send_reaction_0',
'text' => '???? 360'
}, 'Telegram::KeyboardButtonCallback' ),
bless( {
'data' => 'send_reaction_1',
'text' => '???? 32'
}, 'Telegram::KeyboardButtonCallback' )
]
}, 'Telegram::KeyboardButtonRow' )
]
}, 'Telegram::ReplyInlineMarkup' ),
'views' => 4416,
'entities' => [
bless( {
'offset' => 0,
'length' => 64
}, 'Telegram::MessageEntityBold' ),
bless( {
'offset' => 1551,
'length' => 5
}, 'Telegram::MessageEntityHashtag' ),
bless( {
'length' => 3,
'offset' => 1557
}, 'Telegram::MessageEntityHashtag' ),
bless( {
'offset' => 1561,
'length' => 10
}, 'Telegram::MessageEntityHashtag' )
]
}, 'Telegram::Message' )
}, 'Telegram::UpdateEditChannelMessage' )
]
}, 'Telegram::Updates::ChannelDifference' )
}, 'MTProto::RpcResult' )
};
2019.10.24 12:00:51 $1 = {
'in' => bless( {
'update' => bless( {
'user_id' => 2507460,
'status' => bless( {
'was_online' => 1571907651
}, 'Telegram::UserStatusOffline' )
}, 'Telegram::UpdateUserStatus' ),
'date' => 1571907650
}, 'Telegram::UpdateShort' )
};
2019.10.24 12:05:46 $1 = {
'in' => bless( {
'chats' => [],
'date' => 1571907946,
'seq' => 0,
'updates' => [
bless( {
'max_id' => 141719,
'channel_id' => 1295963795
}, 'Telegram::UpdateReadChannelInbox' )
],
'users' => []
}, 'Telegram::Updates' )
};
2019.10.24 13:01:23 $1 = {
'in' => bless( {
'server_salt' => '4914425622822907323',
'unique_id' => '5297282355827493819',
'first_msg_id' => '6751307555044380692'
}, 'MTProto::NewSessionCreated' )
};
2019.10.24 13:24:21 $1 = {
'in' => bless( {
'chats' => [
bless( {
'username' => 'freebsd_ru',
'version' => 0,
'flags' => 5440,
'title' => 'freebsd_ru',
'min' => 1,
'photo' => bless( {
'photo_small' => bless( {
'local_id' => 328733,
'volume_id' => 235140688,
'dc_id' => 2,
'file_reference' => '
'secret' => '4426006807282303416'
}, 'Telegram::FileLocation' ),
'photo_big' => bless( {
'dc_id' => 2,
'file_reference' => '
'volume_id' => 235140688,
'local_id' => 328735,
'secret' => '71251192991540083'
}, 'Telegram::FileLocation' )
}, 'Telegram::ChatPhoto' ),
'date' => 1461248502,
'id' => 1038300508,
'democracy' => 1,
'megagroup' => 1
}, 'Telegram::Channel' )
],
'users' => [
bless( {
'last_name' => 'Panov',
'flags' => 1048646,
'min' => 1,
'id' => 82234609,
'status' => bless( {}, 'Telegram::UserStatusRecently' ),
'first_name' => 'Dima'
}, 'Telegram::User' )
],
'seq' => 0,
'date' => 1571912647,
'updates' => [
bless( {
'pts' => 137596,
'message' => bless( {
'flags' => 256,
'message' => 'Создать джейл с именем покороче ??',
'to_id' => bless( {
'channel_id' => 1038300508
}, 'Telegram::PeerChannel' ),
'id' => 119634,
'date' => 1571912647,
'from_id' => 82234609
}, 'Telegram::Message' ),
'pts_count' => 1
}, 'Telegram::UpdateNewChannelMessage' )
]
}, 'Telegram::Updates' )
};

Ee, ha se mofenyi ka boomo - haeba ha o so e bale, tsoela pele ho e etsa!

Oh, wai~~... see se shebahala joang? Ho na le ntho e tsebahalang haholo ... mohlomong ona ke sebopeho sa data sa API e tloaelehileng ea Web ho JSON, ntle le hore litlelase le tsona li hokeletsoe linthong?..

Joale sena ke tsela eo ho etsahalang ka eona ... Ho thoe'ng, baheso?. ho qala feela?...Na JSON feela ka HTTPS e ne e ke ke ea ba bonolo haholoanyane?! Re fumane eng ka phapanyetsano? Na boiteko boo bo ne bo le molemo?

Ha re hlahlobeng hore na TL+MTProto e re file eng le hore na ke mekhoa efe e meng e ka khonehang. Hantle, HTTP, e shebaneng le mohlala oa karabo ea kopo, ke ntho e mpe, empa bonyane ho na le ntho e ka holim'a TLS?

Compact serialization. Ha ke bona sebopeho sena sa data, se ts'oanang le JSON, ke hopola hore ho na le mefuta ea eona ea binary. Ha re tšoaee MsgPack e sa atolosoe ka mokhoa o sa lekaneng, empa ho na le, mohlala, CBOR - ka tsela, maemo a hlalositsoeng ho RFC 7049. Hoa hlokomeleha ka taba ea hore e hlalosa li-tag, e le mokhoa oa ho atolosa, le har'a e se e emetsoe fumaneha:

  • 25 + 256 - ho fetola mela e pheta-phetoang ka ho bua ka nomoro ea mohala, mokhoa o joalo oa khatello ea theko e tlaase.
  • 26 - serialized Perl ntho e nang le lebitso la sehlopha le likhang tsa sehahi
  • 27 - ntho e ikemetseng e ikemetseng ka puo e nang le lebitso la mofuta le likhang tsa sehahi

Le ha ho le joalo, ke lekile ho hlophisa data e tšoanang ho TL le ho CBOR ka khoele le ho paka ntho e lumelletsoeng. Sephetho se ile sa qala ho fapana molemong oa CBOR kae-kae ho tloha megabyte:

cborlen=1039673 tl_len=1095092

Kahoo, sephetho: Ho na le lifomate tse bonolo haholo tse sa thulaneng le bothata ba ho hloleha ho amahanya kapa ntho e sa tsejoeng, e nang le ts'ebetso e ts'oanang.

Ho theha khokahano e potlakileng. Sena se bolela "zero RTT" ka mor'a ho kopanya hape (ha senotlolo se se se entsoe hanngoe) - se sebetsa ho tsoa molaetsa oa pele oa MTProto, empa ka lipehelo tse ling - otla letsoai le tšoanang, seboka ha se bolile, joalo-joalo. TLS e re fa eng ho e-na le hoo? Qotsa ka sehlooho:

Ha o sebelisa PFS ho TLS, litekete tsa kopano ea TLS (RFC 5077) ho qala lenaneo le patiloeng ntle le ho buisa linotlolo hape ntle le ho boloka lintlha tsa bohlokoa ho seva. Ha o bula khokahanyo ea pele le ho theha linotlolo, seva e koala boemo ba khokahano ebe e e fetisetsa ho moreki (ka mokhoa oa tekete ea nako). Ka hona, ha khokahano e qala hape, moreki o romela tekete ea thuto, ho kenyeletsoa le senotlolo sa seboka, ho khutlela ho seva. Thekete ka boeona e patiloe ka senotlolo sa nakoana (senotlolo sa tekete ea nako), se bolokoang ho seva 'me se tlameha ho ajoa har'a li-server tsohle tse ka pele li sebetsanang le SSL ka litharollo tse kopaneng.[10]. Kahoo, kenyelletso ea tekete ea seboka e ka 'na ea tlōla PFS haeba linotlolo tsa nakoana tsa seva li senyehile, mohlala, ha li bolokiloe nako e telele (OpenSSL, nginx, Apache li boloka ka ho sa feleng bakeng sa nako eohle ea lenaneo; libaka tse tummeng li sebelisa. senotlolo sa lihora tse 'maloa, ho fihlela matsatsi).

Mona RTT ha se zero, o hloka ho fapanyetsana bonyane ClientHello le ServerHello, ka mor'a moo mofani a ka romela data hammoho le Finished. Empa mona re lokela ho hopola hore ha re na Websaete, ka sehlopha sa eona sa likhokahano tse sa tsoa buloa, empa ke lenģosa, leo khokahanyo ea lona hangata e leng kopo e le 'ngoe kapa e fokolang ea nako e telele, e batlang e le khutšoanyane ho maqephe a Websaete - ntho e' ngoe le e 'ngoe e multiplexed. ka hare. Ke hore, hoa amoheleha haeba re sa ka ra kopana le karolo e mpe haholo ea terene e tsamaeang ka tlas'a lefatše.

U lebetse ntho e 'ngoe hape? Ngola litlhalosong.

E tla ntšetsoa pele!

Karolong ea bobeli ea letoto lena la poso re ke ke ra nahana ka litaba tsa tekheniki, empa tsa mokhatlo - mekhoa, maikutlo, sebopeho, maikutlo mabapi le basebelisi, joalo-joalo. Leha ho le joalo, ho itšetlehile ka boitsebiso ba tekheniki bo hlahisitsoeng mona.

Karolo ea boraro e tla tsoela pele ho sekaseka karolo ea tekheniki / boiphihlelo ba nts'etsopele. U tla ithuta, haholo-holo:

  • ho tsoela pele ha pandemonium ka mefuta e fapaneng ea mefuta ea TL
  • lintho tse sa tsejoeng ka likanale le lihlopha tse kholo
  • ke hobane'ng ha lipuisano li le mpe ho feta lenane
  • mabapi le absolute vs related message address
  • phapang ke efe pakeng tsa foto le setšoantšo
  • kamoo emoji e sitisang mongolo o sekameng

le liikokotlelo tse ling! Lula u mametse!

Source: www.habr.com

Eketsa ka tlhaloso