Fa'aitu'uga o le fa'atonuga ma fa'alapotopotoga fa'alapotopotoga a Telegram. Vaega 1, fa'atekinisi: poto masani i le tusiaina o se tagata fa'atau mai le maoa'e - TL, MT

Talu ai nei, o faʻamatalaga e uiga i le lelei Telegram, le atamai ma le poto masani o uso Durov i le fausiaina o faiga fesoʻotaʻiga, ma isi mea ua amata ona faʻaalia soo i luga o Habré. I le taimi lava e tasi, e toʻaitiiti lava tagata na faʻatofuina i latou lava i le masini faʻapitoa - i le tele, latou te faʻaogaina se faigofie (ma e matua ese lava mai le MTProto) JSON-based Bot API, ma e masani lava naʻo le taliaina. i luga o le faatuatua o viiga uma ma PR o loʻo faʻataʻamilo i le avefeʻau. Toeitiiti atoa le tausaga ma le afa talu ai, na amata ai e laʻu paaga i le Eshelon NGO Vasily (o le mea e leaga ai, o lana tala i luga o Habré na soloia faatasi ai ma le ata faataitai) na amata ona tusia lana lava tagata Telegram mai le amataga i Perl, ma mulimuli ane na auai le tusitala o nei laina. Aisea Perl, o le a fesili vave ai nisi? Ona o ia galuega ua uma ona i ai i isi gagana O le mea moni, e le o le mea lea, e mafai ona i ai se isi gagana e leai faletusi saunia, ma e tatau ai i le tusitala ona alu i le ala atoa mai valu. E le gata i lea, cryptography o se mataupu o le faʻatuatuaina, ae faʻamaonia. Faatasi ai ma se oloa e faʻatatau i le saogalemu, e le mafai ona e faʻalagolago i se faletusi saunia mai le gaosiga ma faʻatuatuaina tauaso (peitaʻi, o se autu lenei mo le vaega lona lua). I le taimi nei, o loʻo galue lelei le faletusi i le tulaga "averesi" (faʻatagaina oe e faia soʻo se talosaga API).

Ae ui i lea, o le a le tele faʻamatalaga poʻo numera i lenei faasologa o pou. Ae o le ai ai le tele o isi faʻamatalaga faʻapitoa ma tootoo fausaga (e aoga foi mo i latou e le tusitusi mai le maoaʻe, ae o le a faʻaogaina le faletusi i soʻo se gagana). O lea la, o le sini autu o le taumafai lea e faʻatino le kalani mai le amataga e tusa ai ma pepa aloaia. O lona uiga, seʻi tatou faʻapea ua tapunia le faʻailoga autu o tagata faʻatau aloaia (toe, i le vaega lona lua o le a tatou faʻamalamalamaina atili le autu o le mea moni e moni lenei mea. E tupu o lea), ae, pei o aso tuai, mo se faʻataʻitaʻiga, o loʻo i ai se faʻataʻitaʻiga e pei o le RFC - pe mafai ona tusi se tagata faʻatau e tusa ai ma le faʻamatalaga naʻo ia, "e aunoa ma le vaʻavaʻai" i le code source, ia aloaia (Telegram Desktop, feavea'i), po'o Telethon lē aloaia?

TAGATA:

Fa'amaumauga... o lo'o iai, sa'o? E moni?..

O vaega o faʻamatalaga mo lenei tusiga na amata ona aoina i le taumafanafana talu ai. O nei taimi uma i luga o le upega tafaʻilagi aloaia https://core.telegram.org O faʻamaumauga e pei o le Layer 23, i.e. na pipii i se mea i le 2014 (manatua, e leʻi i ai ni auala i tua?). Ioe, i le talitonuga, e tatau ona faʻatagaina i matou e faʻatino se tagata faʻatau ma galuega i lena taimi i le 2014. Ae e oʻo lava i lenei setete, o le faʻamaumauga, muamua, le atoatoa, ma lona lua, i nofoaga e feteenai ma ia lava. Na o le sili atu i le masina talu ai, ia Setema 2019, na faafuasei Na maua ai o loʻo i ai se faʻafouga tele o faʻamaumauga i luga o le saite, mo le Layer 105 talu ai nei, faʻatasi ai ma se faʻamatalaga e tatau ona toe faitau mea uma. O le mea moni, e tele mataupu na toe teuteuina, ae o le tele na tumau pea e leʻi suia. O le mea lea, pe a faitau le faitioga o loʻo i lalo e uiga i faʻamaumauga, e tatau ona e manatua o nisi o nei mea e le o toe talafeagai, ae o nisi o loʻo i ai pea. A uma, 5 tausaga i le lalolagi faʻaonaponei e le naʻo se taimi umi, ae lava o le tele ia. Talu mai na taimi (aemaise lava pe afai e te le amanaʻia le lafoaia ma toe faʻafouina geochat sites talu mai lena taimi), o le numera o auala API i le polokalame ua tupu mai le selau i le sili atu ma le lua selau limasefulu!

O fea e amata ai o se tusitala talavou?

E le afaina pe e te tusitusi mai le sasa pe faʻaoga, mo se faʻataʻitaʻiga, faletusi saunia pei Telethon mo Python poʻo Madeline mo PHP, i soo se tulaga, e te manaʻomia muamua resitala lau talosaga - maua tapula'a api_id и api_hash (o i latou na galulue ma le VKontakte API e vave ona malamalama) lea e iloa ai e le server le talosaga. Lenei o le a fai mo mafuaaga faaletulafono, ae o le a tatou talanoa atili e uiga i le mafuaaga e le mafai ai e le au tusitala faletusi ona lolomiina i le vaega lona lua. Atonu o le a faamalieina oe i tau o suʻega, e ui lava e matua faʻatapulaʻaina - o le mea moni o le taimi nei e mafai ona e lesitala na o le tasi app, o lea aua le faanatinati i ai.

I le taimi nei, mai se vaaiga faʻapitoa, e tatau ona tatou fiafia i le mea moni pe a uma le resitalaina e tatau ona tatou maua faʻamatalaga mai Telegram e uiga i faʻafouga i faʻamaumauga, protocol, ma isi. O lona uiga, e mafai e se tasi ona manatu o le 'upega tafaʻilagi faʻatasi ai ma faʻamaufaʻailoga sa na o le lafoaia ma faʻaauau pea ona galulue faʻatasi ma i latou na amata ona faia tagata faʻatau, aua e faigofie. Ae leai, e leai se mea faapena na matauina, e leai se faamatalaga na oo mai.

Ma afai e te tusitusi mai le maoaʻe, ona faʻaaogaina lea o faʻamaufaʻailoga na maua e matua mamao lava. E ui lava https://core.telegram.org/ ma talanoa e uiga ia i latou i le Amataina muamua o mea uma, o le mea moni, e tatau ona e faʻatinoina muamua MTProto protocol - ae afai e te talitonu fa'atulagaina e tusa ai ma le fa'ata'ita'iga OSI i le pito o le itulau mo se faʻamatalaga lautele o le protocol, ona matuaʻi le aoga.

O le mea moni, i luma ma pe a uma le MTProto, i luga o le tele o laʻasaga i le taimi e tasi (e pei ona fai mai tagata faigaluega mai fafo o loʻo galulue i le OS kernel, soliga o le layer), o se mataupu tele, tiga ma mataʻutia o le a faʻalavelaveina ...

Binary serialization: TL (Type Language) ma lana polokalame, ma laulau, ma le tele o isi upu taufaafefe.

O lenei autu, o le mea moni, o le ki lea i faʻafitauli a Telegram. Ma o le ai ai le tele o upu mataʻutia pe a e taumafai e suʻesuʻe i ai.

O lea la, o le ata lenei. Afai e oo mai lenei upu i lou mafaufau, fai atu, JSON Fuafuaga, Sa sa'o lou manatu. E tutusa le sini: o nisi gagana e fa'amatala ai se seti o fa'amatalaga tu'uina atu. O i ina e muta ai mea tutusa. Afai mai le itulau MTProto protocol, pe mai le punavai o le tagata faʻatau aloaia, matou te taumafai e tatala se faʻataʻitaʻiga, matou te vaʻai i se mea e pei o:

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;

O se tagata e vaʻai i lenei mea mo le taimi muamua o le a mafai ona iloa naʻo se vaega o mea ua tusia - lelei, e foliga mai o fausaga (e ui o fea le igoa, i le agavale poʻo le taumatau?), O loʻo i ai fanua i totonu, a mae'a ona mulimuli atu lea o se ituaiga pe a uma se kolone... masalo. O iinei i faʻamau puipui atonu o loʻo i ai faʻataʻitaʻiga pei o le C++ (o le mea moni, e le taitai). Ma o le a le uiga o isi faʻailoga uma, faʻailoga fesili, faʻailoga faʻailoga, pasene, faʻailoga (ma e manino lava o latou uiga eseese i nofoaga eseese), o nisi taimi o loʻo i ai ma o nisi taimi e leai, numera hexadecimal - ma sili ona taua, pe faʻapefea ona maua mai lenei mea. le mea sao (lea o le a le teena e le server) byte stream? E tatau ona e faitauina le pepa (ioe, o loʻo i ai fesoʻotaʻiga i le schema i le JSON version lata ane - ae e le faʻamalamalamaina atili).

Tatala le itulau Fa'asologa o Fa'amatalaga Binary ma maulu i le lalolagi fa'ataulāitu o pulouaitu ma le matematika tu'ufa'atasi, o se mea e tutusa ma matan i le 4 tausaga. Alafapeta, ituaiga, tau, tuʻufaʻatasia, tuʻufaʻatasiga galue, foliga masani, ituaiga tuʻufaʻatasia, ituaiga polymorphic ... ma e naʻo le itulau muamua! O lo'o fa'atali mo oe le isi TL Gagana, lea, e ui lava o loʻo i ai se faʻataʻitaʻiga o se talosaga ma se tali le taua, e le maua ai se tali i mataupu sili atu masani, o lona uiga e tatau ona e savali i se toe faamatalaina o le matematika ua faaliliuina mai le Rusia i le Igilisi i luga o le isi valu faʻapipiʻi. itulau!

O le aufaitau e masani i gagana faʻatino ma faʻasologa otometi ituaiga o le a, ioe, vaʻai i le faʻamatalaga gagana i lenei gagana, e oʻo lava mai le faʻataʻitaʻiga, e sili atu ona masani, ma e mafai ona fai mai e le o se mea leaga i le mataupu faavae. O le tetee i lenei mea:

  • ioe, le sini e foliga lelei, ae talofa, o ia le ausia
  • O aʻoaʻoga i iunivesite a Rusia e eseese e oʻo lava ile IT faʻapitoa - e le o tagata uma na faia le vasega tutusa
  • Ma le mea mulimuli, e pei ona tatou vaʻai i ai, i le faʻataʻitaʻiga e le o manaʻomia, talu ai na o se vaega faʻatapulaʻa o le TL na faʻamatalaina e faʻaaogaina

E pei ona ou fai atu LeoNerd i luga o le alaleo #perl i le FreeNode IRC network, o le na taumafai e faʻatino se faitotoa mai Telegram i Matrix (faaliliuga o le upusii e le saʻo mai le mafaufau):

E lagona e pei o se tasi na faʻafeiloaʻi i le faʻaupuga aʻoaʻoga mo le taimi muamua, sa fiafia, ma amata ona taumafai e taʻalo i ai, e le o popole pe manaʻomia i le faʻatinoga.

Va'ai mo oe lava, pe afai o le mana'omia mo le leai o ni ituaiga (int, long, etc.) o se mea tulagalua e le tula'i mai ai ni fesili - mulimuli ane e tatau ona fa'atinoina ma le lima - mo se fa'ata'ita'iga, se'i o tatou taumafai e maua mai i latou. vete. O le mea moni, seti, pe afai e te taʻua mea e maua i o latou igoa talafeagai.

Ae muamua

O se faʻamatalaga puupuu o se vaega o le TL syntax mo i latou e le o faitau i faʻamaumauga aloaia

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;

Fa'amatalaga e amata i taimi uma faufale, a maeʻa ona filifili (i le faʻatinoga - i taimi uma) e ala i le faʻailoga # tatau ona CRC32 mai le manoa fa'amatalaga masani o lenei ituaiga. E soso'o mai se fa'amatalaga o fanua pe a iai, atonu e gaogao le ituaiga. O nei mea uma e fa'ai'u i se fa'ailoga tutusa, o le igoa o le ituaiga o lo'o i ai lenei faufale - o le mea moni, o le subtype - e iai. O le tama i le itu taumatau o le faailoga tutusa o le polymorphic - o lona uiga, e tele ituaiga faʻapitoa e mafai ona fetaui ma ia.

Afai e tupu le faʻamatalaga pe a uma le laina ---functions---, ona tumau ai lea o le syntax, ae o le uiga o le a ese: o le faufale o le a avea ma igoa o le galuega RPC, o fanua o le a avea ma tapulaʻa (lelei, o lona uiga, o le a tumau tonu lava le fausaga tuʻuina atu, e pei ona faamatalaina i lalo. , o le a naʻo le uiga tuʻufaʻatasia), ma le "ituaiga polymorphic" - o le ituaiga o le tali na toe foʻi mai. E moni, o le a tumau pea le polymorphic - naʻo le faʻamalamalamaina i le vaega ---types---, ae o lenei faufale o le a "le mafaufauina". Ova le utaina o ituaiga o galuega tauave e ala i a latou finauga, i.e. Mo nisi mafuaʻaga, e tele galuega faʻatasi ma le igoa tutusa ae eseʻese saini, pei o le C++, e le o tuʻuina atu i le TL.

Aisea "fausiaina" ma le "polymorphic" pe a le o le OOP? Ia, o le mea moni, o le a sili atu ona faigofie mo se tasi ona mafaufau i lenei mea i upu OOP - o se ituaiga polymorphic o se vasega faʻapitoa, ma o le au faufale o ana vasega tuusaʻo, ma final i upu o le tele o gagana. O le mea moni, ioe, na'o iinei tutusa fa'atasi ai ma auala faufale faufale fa'ato'a mamafa i gagana fa'a polokalame OO. Talu ai o iinei na o faʻamaumauga faʻamaumauga, e leai ni metotia (e ui o le faʻamatalaga o galuega ma metotia e sili atu ona mafai ona faʻatupu le fenumiai i le ulu o loʻo i ai, ae o se mea ese lena) - e mafai ona e mafaufau i se faufale o se tau mai lea o lo'o fausia lolomi pe a faitau se ala paita.

E faapefea ona tupu lenei mea? O le deserializer, lea e faitau i taimi uma 4 bytes, vaʻaia le tau 0xcrc32 - ma malamalama i le mea o le a sosoo ai field1 ma le ituaiga int, i.e. faitau tonu le 4 paita, i luga o lenei fanua o loʻo i luga ma le ituaiga PolymorType faitau. Vaai 0x2crc32 ma malamalama e lua isi vaega, muamua long, o lona uiga tatou te faitau 8 paita. Ona toe foi lea o se ituaiga faigata, lea e deserialized i le auala lava e tasi. Faataitaiga, Type3 e mafai ona faʻaalia i le matagaluega i le taimi lava e lua faufale, i le faasologa, ona tatau lea ona latou feiloai 0x12abcd34, pe a uma ona e manaʻomia le faitau 4 isi paita int, po o 0x6789cdef, a mavae lea e leai se mea. Soʻo se isi mea - e tatau ona e lafoina se faʻalavelave. Ae ui i lea, a maeʻa lenei tatou toe foʻi i le faitau 4 bytes int fanua field_c в constructorTwo ma o lena ua uma ai ona faitau la matou PolymorType.

Mulimuli ane, pe a maua oe 0xdeadcrc mo constructorThree, ona atili lavelave ai lea o mea uma. O le matou fanua muamua bit_flags_of_what_really_present ma le ituaiga # - o le mea moni, ua na'o le igoa lea mo le ituaiga nat, o lona uiga "numera masani". O lona uiga, o le mea moni, unsigned int, i le ala, naʻo le pau lea o le mataupu pe a tupu numera e leʻi faʻamaonia i totonu o taʻaloga moni. O le mea lea, o le isi o se fausiaina ma se faailoga fesili, o lona uiga o lenei fanua - o le a i ai i luga o le uaea pe afai o le mea e fetaui i ai o loʻo faʻatulagaina i totonu o le fanua o loʻo taʻua (e pei o se tagata faʻatautaia ternary). O lea la, seʻi tatou faʻapea o lenei mea na faʻatulagaina, o lona uiga e tatau ona tatou faitau atili i se fanua e pei o Type, lea i la tatou faʻataʻitaʻiga e 2 faufale. O lo'o gaogao le tasi (e na'o le fa'asinomaga), o le isi e iai le fanua ids ma le ituaiga ids:Vector<long>.

Atonu e te manatu o faʻataʻitaʻiga uma ma generics o loʻo i totonu o le pros poʻo le Java. Ae leai. Toetoe lava. Lenei tasi tulaga o le faʻaogaina o faʻamaufaʻailoga i totonu o taʻaloga moni, ma e faʻaaogaina NA'O Vector. I totonu o le vaitafe byte, o nei mea o le a 4 CRC32 bytes mo le Vector type lava ia, e tutusa lava, ona 4 bytes - le numera o elemene elemene, ona sosoo ai lea ma nei elemene lava ia.

Faʻaopoopo i lenei mea le mea moni e faʻapea o le serialization e masani lava ona tupu i upu o 4 bytes, o ituaiga uma e faʻateleina - o loʻo faʻamatalaina foʻi ituaiga fausia. bytes и string faʻatasi ai ma le faʻasologa tusi o le umi ma lenei faʻaogaina e le 4 - lelei, e foliga mai e foliga masani ma e matua aoga lava? E ui lava o le TL o loʻo fai mai o se faʻasologa faʻasolosolo lelei, i seoli faʻatasi ma i latou, faʻatasi ai ma le faʻalauteleina o soʻo se mea, e oʻo lava i mea taua a Boolean ma manoa taʻitasi i le 4 bytes, pe o le a sili atu le mafiafia o JSON? Vaʻai, e oʻo lava i fanua e le manaʻomia e mafai ona faaseʻeina e ni fuʻa, e lelei mea uma, ma e mafai foʻi ona faʻalauteleina mo le lumanaʻi, aisea la e le faʻaopoopoina ai ni avanoa fou i le fausiaina mulimuli ane?..

Ae leai, pe afai e te le faitau i laʻu faʻamatalaga puupuu, ae o le faʻamaumauga atoa, ma mafaufau i le faʻatinoga. Muamua, o le CRC32 o le faufale e fuafua e tusa ai ma le laina masani o le faʻamatalaga o le faʻamatalaga o le polokalame (aveese le avanoa faaopoopo, ma isi) - o lea afai e faʻaopoopoina se fanua fou, o le a suia le laina faʻamatalaga ituaiga, ma o le mea lea o lona CRC32 ma , i'uga, fa'asologa. Ma o le a le mea e fai e le tagata tuai pe a ia mauaina se fanua ma fuʻa fou ua setiina, ae na te le iloa le mea e fai i ai i le isi?..

Lona lua, ia tatou manatua CRC32, lea o loʻo faʻaaogaina iinei e pei o galuega o hash e iloa tulaga ese po o le a le ituaiga o lo'o (de) fa'asologa. O iinei tatou te feagai ai ma le faʻafitauli o faʻalavelave - ma e leai, o le avanoa e le tasi i le 232, ae sili atu. O ai na manatua o le CRC32 ua mamanuina e iloa (ma faʻasaʻo) mea sese i le ala fesoʻotaʻiga, ma faʻapea ona faʻaleleia nei meatotino i le faʻaleagaina o isi? Mo se faʻataʻitaʻiga, e le popole i le toe faʻatulagaina o bytes: afai e te faʻatusatusa CRC32 mai laina e lua, i le lona lua e te fesuiaʻi le 4 paita muamua ma le isi 4 paita - o le a tutusa. Afai o la matou fa'aulu o ni manoa mai le alafapeta Latina (ma sina fa'ailoga), ma o nei igoa e le o se mea fa'afuase'i, o le fa'atupuina o sea toe fa'aopoopo e matua'i fa'atupula'ia.

I le ala, o ai na siaki le mea sa i ai? moni CRC32? O se tasi o uluai punaoa (e oo lava i luma o Waltman) sa i ai se galuega hash e faʻateleina ai tagata taʻitasi i le numera 239, e pele tele i nei tagata, ha ha!

Mulimuli ane, lelei, na matou iloa o tagata faufale ma se ituaiga fanua Vector<int> и Vector<PolymorType> e ese le CRC32. Ae faapefea le faatinoga i luga ole laiga? Ma mai se manatu faʻapitoa, e avea lenei mea ma se vaega o le ituaiga? Se'i faapea tatou te pasi atu i se faasologa o numera e sefulu afe, lelei ma Vector<int> e manino mea uma, o le umi ma le isi 40000 paita. Ma afai o lenei Vector<Type2>, lea e aofia ai na o le tasi le fanua int ma e na o ia i le ituaiga - e tatau ona tatou toe fai 10000xabcdef0 34 taimi ona sosoo ai lea ma le 4 bytes int, po'o le gagana e mafai ona tuto'atasi mo i tatou mai le faufale fixedVec ae nai lo le 80000 paita, toe faʻafeiloaʻi naʻo le 40000?

E le'o se fesili fa'aleaogaina lava lea - manatu e te mauaina se lisi o tagata fa'aoga vaega, e tofu i latou ma se id, igoa muamua, igoa fa'ai'u - o le eseesega i le aofa'i o fa'amatalaga fa'aliliuina i luga o se feso'ota'iga feavea'i e mafai ona taua. O le lelei tonu o le Telegram serialization o loʻo faʻasalalau ia i matou.

O lea…

Vector, lea e leʻi tatalaina

Afai e te taumafai e savali i luga o itulau o faʻamatalaga o combinators ma isi mea, o le a e vaʻaia o se vector (ma e oʻo lava i se matrix) o loʻo taumafai aloaia e faʻaalia e ala i tuples o ni laupepa. Ae i le faaiuga latou te galo, o le laasaga mulimuli ua misia, ma o se faʻamatalaga o se vector e tuʻuina atu, lea e leʻi noatia i se ituaiga. O le a le mea ua tupu? I gagana polokalame, aemaise lava mea aoga, e masani lava ona faʻamatalaina le fausaga faʻasolosolo - o le tagata faʻapipiʻi ma lana iloiloga paie o le a malamalama ma faia mea uma lava. I le gagana fa'asologa o fa'amaumauga o le mea e manaʻomia o le LELEI: ua lava naʻo le faʻamatalaina le lisi, i.e. fausaga o elemene e lua - o le muamua o se elemene faʻamaumauga, o le lona lua o le fausaga lava ia poʻo se avanoa avanoa mo le siʻusiʻu (faʻamau (cons) i Lisp). Ae e mautinoa lava e manaʻomia lenei mea taʻitasi elemene faʻaalu se 4 paita faaopoopo (CRC32 i le mataupu i le TL) e faʻamatala ai lona ituaiga. E mafai foi ona faigofie ona faamatalaina se laina lapopoa tumau, ae i le tulaga o se faasologa o le umi e le iloa muamua, matou te motusia.

O le mea lea, talu ai e le faʻatagaina e le TL le tuʻuina atu o se vector, e tatau ona faʻaopopo i le itu. Mulimuli ane, fai mai le pepa:

Fa'asologa fa'asologa e fa'aaoga i taimi uma le faufale tutusa "vector" (const 0x1cb5c415 = crc32("vector t: Type # [t] = Vector t") e le fa'alagolago i le tau ma'oti o le fesuiaiga o le ituaiga t.

O le tau o le filifiliga filifiliga t e le o aofia ai i le serialization talu ai e maua mai i le ituaiga taunuuga (e iloa i taimi uma aʻo leʻi faʻaumatia).

Va'ai toto'a: vector {t:Type} # [ t ] = Vector t - ae leai se mea O lenei faʻamatalaga lava ia e le o fai mai o le numera muamua e tatau ona tutusa ma le umi o le vector! Ma e le sau mai se mea. O se tu'uina atu lea e mana'omia ona teu i lou mafaufau ma fa'atino i ou lima. I isi nofoaga, o faʻamaumauga e oʻo lava i le faʻamaoni o loʻo taʻua ai e le moni le ituaiga:

O le Vector t polymorphic pseudotype o se "ituaiga" o lona tau o se faasologa o tau o soo se ituaiga t, pe pusa pe leai.

... ae le taulai atu i ai. A e fiu e savali i le faʻalauteleina o le matematika (atonu e te iloa mai se aʻoga i le iunivesite), filifili e fiu ma vaʻai moni i le auala e galue ai i le faʻataʻitaʻiga, o le lagona o loʻo totoe i lou ulu o le mea lea e ogaoga. Mathematics i le totonugalemu, na manino le fatuina e Cool People (lua mathematicians - ACM manumalo), ae le na o se tasi. O le sini - ia fa'aalia - ua ausia.

I le ala, e uiga i le numera. Sei matou faamanatu atu lena mea # ose upu tutusa nat, numera masani:

E iai ituaiga fa'aaliga (ituaiga-expr) ma fa'amatalaga numera (nat-expr). Ae ui i lea, o loʻo faʻamatalaina i le auala lava e tasi.

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

ae i le kalama o loo faamatalaina i le auala lava e tasi, i.e. O lenei eseesega e tatau ona toe manatua ma faʻatinoina ma le lima.

Ia, ioe, ituaiga mamanu (vector<int>, vector<User>) e iai se fa'amatalaga masani (#1cb5c415), i.e. pe afai e te iloa o le valaau ua faasilasilaina e pei

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

ona e le toe faʻatali mo naʻo se vector, ae o se vector o tagata faʻaoga. E sili atu le sa'o, tatau faʻatali - i le faʻailoga moni, o elemene uma, pe a le o se ituaiga e leai se mea, o le ai ai se faufale, ma i se auala lelei i le faʻatinoga o le a manaʻomia le siakiina - ae na auina saʻo mai i elemene uma o lenei vector. lena ituaiga? Ae faʻapefea pe a fai o se ituaiga PHP, lea e mafai ai e se laina ona aofia ai ituaiga eseese i elemene eseese?

I le taimi nei ua amata ona e mafaufau - e manaʻomia se TL? Masalo mo le taavaletoso e mafai ona faʻaaogaina se tagata faʻasalalau, o le protobuf lava e tasi na i ai i lena taimi? O le talitonuga lena, sei o tatou tilotilo i le faatinoga.

O loʻo iai faʻatinoga TL ile code

TL na fanau mai i le loloto o VKontakte e oʻo lava i luma o mea taʻutaʻua faʻatasi ma le faʻatau atu o sea a Durov ma (Masalo), e oʻo lava i le amataga o le atinaʻeina o Telegram. Ma i puna tatala source code o le faatinoga muamua e mafai ona e mauaina le tele o tootoo malie. Ma o le gagana lava ia na faʻatinoina iina sili atu nai lo le taimi nei i Telegram. Mo se faʻataʻitaʻiga, e le faʻaaogaina uma i totonu o le polokalame (o lona uiga o se pseudotype faʻapipiʻiina (pei o se vector) ma amio faʻasese). Pe

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

ae se'i o tatou mafaufau, mo le atoatoa, e su'esu'e, e pei ona ta'ua, le fa'aleleia o le Giant of Thought.

#define ZHUKOV_BYTES_HACK

#ifdef ZHUKOV_BYTES_HACK

/* dirty hack for Zhukov request */

Po o le matagofie lenei:

    static const char *reserved_words_polymorhic[] = {

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

      };

O lenei vaega e uiga i mamanu e pei o:

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

O le fa'amatalaga lea o le ituaiga fa'ata'ita'iga hashmap o se ve'a o int - Type pairs. I le C++ e foliga mai e pei o lenei:

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

o lea, alpha - upu autu! Ae na o le C ++ e mafai ona e tusia T, ae e tatau ona e tusia le alpha, beta ... Ae le sili atu i le 8 parakalafa, o iina e muta ai le mafaufauga. E foliga mai i se tasi taimi i St. Petersburg sa faia ai ni talanoaga faapenei:

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

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

Ae o lenei mea e uiga i le faʻasalalauga muamua o le TL "i le lautele". Sei o tatou agai i luma i le iloiloina o faʻatinoga i totonu o tagata Telegram lava latou.

Upu ia Vasily:

Vasily, [09.10.18 17:07] O le mea sili, o le asini e vevela aua na latou faia le tele o mea faʻapipiʻi, ona tuʻi lea i luga o latou, ma ufiufi le generator code i tootoo.
O se taunuuga, muamua mai le fa'ailoga pilot.jpg
Ona mai le code dzhekichan.webp

O le mea moni, mai tagata masani i algorithms ma matematika, e mafai ona tatou faʻamoemoe ua latou faitau Aho, Ullmann, ma masani i meafaigaluega ua avea ma tulaga faʻamaoni i totonu o le alamanuia i le tele o tausaga mo le tusiaina o latou DSL compilers, saʻo?..

E telegram-cli o Vitaly Valtman, e pei ona mafai ona malamalama i le tupu mai o le TLO format i fafo atu o ona (cli) tuaoi, o se sui o le 'au - o lea ua tuʻuina atu se faletusi mo le TL parsing. eseese, o le a se lagona o ia TL parser? ..

16.12 04:18 Vasily: Ou te manatu e leʻi iloa e se tasi le lex+yacc.
16.12 04:18 Vasily: E le mafai ona ou faamatalaina i se isi itu
16.12 04:18 Vasily: lelei, pe na totogiina i latou mo le numera o laina i VK
16.12 04:19 Vasily: 3k+ laina ma isi<censored> nai lo o se fa'asalalauga

Atonu o se tuusaunoaga? Sei o tatou vaai pe faapefea e Ole tagata lea ole OFICIAL client - Telegram 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+ laina i le Python, o ni faʻamatalaga masani + faʻapitoa faʻapitoa e pei o se vector, lea, ioe, o loʻo faʻaalia i le polokalame e pei ona tatau ona tusa ai ma le TL syntax, ae na latou faʻalagolago i lenei syntax e faʻasalalau ai ... O le fesili ua tula’i mai, aisea na avea uma ai ma vavega?иE sili atu le faʻapipiʻiina pe a leai se tasi e faʻasalalau e tusa ai ma faʻamaumauga ?!

O le ala... Manatua na matou talanoa e uiga i le CRC32 siaki? O lea la, i le Telegram Desktop code generator o loʻo i ai se lisi o tuusaunoaga mo na ituaiga o loʻo fuafuaina ai le CRC32. e le fetaui fa'atasi ai ma le mea o lo'o fa'aalia i le ata!

Vasily, [18.12/22 49:XNUMX] ma o iinei ou te mafaufau ai pe manaʻomia se TL faapena
afai ou te manaʻo e faʻafefe i isi faʻatinoga, o le a amata ona ou tuʻuina laina laina, o le afa o le au faʻasalalau o le a malepe i luga o faʻamatalaga tele-laina.
tdesktop, peitai, foi

Manatua le manatu e uiga i le tasi-liner, o le a tatou toe foi i ai i se taimi mulimuli ane.

Lelei, telegram-cli e le aloaia, Telegram Desktop e aloaia, ae faʻafefea isi? O ai na te iloa?.. I le Android client code e leai lava se schema parser (lea e laga ai fesili e uiga i punaoa tatala, ae o le vaega lona lua lea), ae sa i ai le tele o isi vaega malie o code, ae sili atu i latou i le vaega pito i lalo.

O a isi fesili o lo'o tula'i mai le fa'asologa i le fa'atinoga? Mo se faʻataʻitaʻiga, na latou faia le tele o mea, ioe, faʻatasi ai ma fasi fanua ma fanua faʻapitoa:

Vasily: flags.0? true
o lona uiga o lo'o i ai le fanua ma e tutusa lelei pe a fa'atulaga le fu'a

Vasily: flags.1? int
o lona uiga o loʻo i ai le fanua ma e manaʻomia ona faʻaumatia

Vasily: Ass, aua e te popole i au mea o fai!
Vasily: O loʻo i ai se taʻua i se mea i totonu o le doc e moni o se ituaiga leai se umi, ae e le mafai ona faʻapipiʻi se mea mai la latou doc.
Vasily: I le faʻaaogaina o punaoa tatala e le o le tulaga foi lea, ae o loʻo i ai le tele o tootoo ma lagolago.

Ae faapefea Telethon? Vaʻai i luma i le autu o le MTProto, o se faʻataʻitaʻiga - i totonu o faʻamaumauga o loʻo i ai na vaega, ae o le faʻailoga % e fa'amatalaina na'o le "feso'ota'i ma se tu'aiga ta'ufua", i.e. i faʻataʻitaʻiga o loʻo i lalo o loʻo i ai se mea sese poʻo se mea e leʻi faʻamaonia:

Vasily, [22.06.18 18:38] I le tasi nofoaga:

msg_container#73f1f8dc messages:vector message = MessageContainer;

I se tulaga ese:

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

Ma o nei eseesega tetele e lua, i le olaga moni e sau se ituaiga o vete e le lavalava

Ou te le'i va'ai i se fa'auigaga fa'amalama ma e le'i maua lava

O su'esu'ega e tusia i lima ile telethon

I lana ata o loʻo faʻamatalaina ai le faʻamatalaga msg_container

Toe foi, o le fesili e tumau pea e uiga i %. E le o faamatalaina.

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

Vasily, [22.06.18 19:23] Ae o le latou TL parser i luga o masini masani o le a le mafai foi ona 'aina lenei mea.

// parsed manually

O le TL o se faʻamatalaga matagofie, e leai se tasi na te faʻaaogaina atoa

Ma % e le o iai i la latou fa'asologa o le polokalame

Ae o iinei o le faʻamaumauga e feteʻenaʻi ia lava, o lea idk

Na maua i le kalama, atonu na galo ia i latou le faamatalaina o le semantics

Na e vaʻai i le pepa i luga o le TL, e le mafai ona e vaʻaia e aunoa ma le afa lita

“Ia, tatou fai atu,” o le a fai mai ai le isi tagata faitau, “e te faitioina se mea, ia faaali mai ia te au pe faapefea ona fai.”

Na tali atu Vasily: “A o le tagata fai tala, ou te fiafia i mea faapena

    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 ) ); }
            ;

e sili atu le fiafia nai lo

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;
}

poʻo

        # 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)

o le lexer atoa lea:

    ---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];

i latou. fa'afaigofie o le fa'amalieina."

I se tulaga lautele, o se taunuuga, o le parser ma le code generator mo le faʻaaogaina moni o le vaega o le TL e fetaui lelei i le tusa ma le 100 laina o le kalama ma ~ 300 laina o le generator (faitau uma. print's generated code), e aofia ai fa'ailoga fa'amatalaga bunnies mo su'esu'ega i vasega ta'itasi. O ituaiga polymorphic ta'itasi e liua i se vasega fa'avae gaogao, ma e maua mai ai e le au faufale ma maua auala mo le fa'asologa ma le deserialization.

Leai o ituaiga i le ituaiga gagana

O le lolomi malosi o se mea lelei, sa'o? Leai, e le o se holivar (e ui lava ou te fiafia i gagana faʻamalosi), ae o se faʻasalalauga i totonu o le faʻavae o le TL. E faavae i luga, e tatau i le gagana ona saunia ituaiga uma o siaki mo i tatou. Ia, lelei, atonu e le o ia lava, ae o le faʻatinoga, ae e tatau ona ia faʻamatalaina. Ma o a ituaiga avanoa tatou te mananao ai?

Muamua, fa'agata. O iinei tatou te vaʻai i faʻamaumauga mo le lafoina o faila:

Ona vaevae lea o mea i totonu ole faila i ni vaega. E tatau ona tutusa le tele o vaega uma ( vaega_tele ) ma e tatau ona ausia tulaga nei:

  • part_size % 1024 = 0 (vaevae ile 1KB)
  • 524288 % part_size = 0 (512KB e tatau ona vaevae tutusa ile vaega_tele)

O le vaega mulimuli e le tatau ona faʻamalieina nei tulaga, pe a fai o lona tele e laʻititi nai lo le vaega_size.

O vaega ta'itasi e tatau ona iai se numera fa'asologa, faila_vaega, ma se tau e amata mai i le 0 i le 2,999.

A uma ona vaeluaina le faila e tatau ona e filifilia se metotia mo le teuina i luga o le server. Fa'aoga upload.saveBigFilePart i le tulaga o le tele atoa o le faila e sili atu i le 10 MB ma upload.saveFilePart mo faila laiti.
[...] se tasi o faʻamatalaga faʻamatalaga sese e mafai ona toe faʻafoʻi mai:

  • FILE_PARTS_INVALID — Le aoga numera o vaega. O le tau e le o le va 1..3000

O i ai se tasi o nei mea i le ata? E mafai ona faʻaalia lenei mea i le faʻaaogaina o le TL? Leai. Ae fa'amolemole, e o'o lava i le tama matua o Turbo Pascal na mafai ona fa'amatalaina ituaiga ua fa'ailoa mai laina. Ma sa ia iloaina se isi mea, lea ua sili atu ona lauiloa o enum - o se ituaiga o lo'o i ai se fa'asologa o se numera tumau (la'ititi) o tau. I gagana e pei o le C-numeric, ia maitauina e oʻo mai i le taimi nei ua na o ituaiga numera. Ae o loʻo i ai foʻi faʻasologa, manoa ... mo se faʻataʻitaʻiga, e manaia le faʻamatalaina o lenei manoa e mafai ona i ai naʻo se numera telefoni, saʻo?

E leai se tasi o nei mea i le TL. Ae o loʻo i ai, mo se faʻataʻitaʻiga, ile JSON Schema. Ma afai e mafai e se isi ona finau e uiga i le vaeluaina o le 512 KB, e manaʻomia pea ona siaki i le code, ona mautinoa lea o le kalani e le mafai auina atu se numera i fafo 1..3000 (ma e le mafai ona tulaʻi mai le mea sese tutusa) semanu e mafai, saʻo?..

I le auala, e uiga i mea sese ma toe faafoi tau. E oo lava ia i latou na galulue ma TL ua faanenefu o latou mata - e leʻi vave ona malamalama ia i matou taitasi o se galuega i le TL e mafai ona toe faʻafoʻi mai e le gata i le faʻamatalaga faʻafoʻi ituaiga, ae o se mea sese foi. Ae e le mafai ona toesea i soo se auala e faʻaaoga ai le TL lava ia. O le mea moni, ua uma ona manino ma e leai se mea e manaʻomia i le faʻatinoga (e ui o le mea moni, RPC e mafai ona faia i auala eseese, o le a tatou toe foʻi i lenei mea mulimuli ane) - ae faʻafefea le Mama o mataupu o le Matematika o Tulaga Faʻamatalaga mai le lalolagi faalelagi?.. Na ou tago i le toso - ia fetaui lelei.

Ma le mea mulimuli, fa'afefea le faitau? Ia, o iina, i se tulaga lautele, ou te manaʻo ai faʻamatalaga ia sa'o i totonu o le schema (i le JSON schema, toe, o le), ae afai ua uma ona e faʻalavelave i ai, faʻafefea le itu aoga - a itiiti ifo i le vaʻavaʻai i eseesega i taimi o faʻafouga? Va'ai mo oe lava ile faataitaiga moni:

-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;

poʻo

-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 faʻalagolago i tagata uma, ae o GitHub, mo se faʻataʻitaʻiga, e musu e faʻailoa suiga i totonu o ia laina uumi. O le taʻaloga "saili 10 eseesega", ma o le mea na vave ona vaʻaia e le faiʻai o le amataga ma le faʻaiʻuga i faʻataʻitaʻiga e lua e tutusa, e tatau ona e faitau faʻanoanoa i se mea i le ogatotonu ... I loʻu manatu, e le naʻo le talitonuga, ae mama i le vaai palapala ma fa'atauva'a.

I le ala, e uiga i le mama o le talitonuga. Aisea tatou te manaʻomia ai fasi fanua? E le foliga mai o latou manogi leaga mai le vaaiga o le ituaiga teori? O le faʻamatalaga e mafai ona vaʻaia i faʻamatalaga muamua o le ata. I le taimi muamua, ioe, o le mea lena, mo mafatua uma na faia ai se ituaiga fou. O lo'o iai pea nei fa'avae i lenei fomu, mo se fa'ata'ita'iga:

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;

Ae mafaufau nei, afai e iai sau avanoa e 5 i lau fausaga, ona e manaʻomia lea o ituaiga 32 mo filifiliga uma e mafai. Pa'u tu'ufa'atasi. O le mea lea, o le mama tioata o le aʻoaʻoga TL ua toe nutimomoia e faasaga i le asini uʻamea o le mea moni faigata o serialization.

E le gata i lea, i nisi o nofoaga o nei tagata latou te solia a latou lava faʻamatalaga. Mo se faʻataʻitaʻiga, i le MTProto (mataupu e sosoo ai) o le tali e mafai ona faʻapipiʻiina e Gzip, e lelei mea uma - sei vagana ua solia le laulau ma le matagaluega. Toe tasi, e le o le RpcResult lava ia na seleseleina, ae o mea i totonu. Ia, aisea e fai ai lenei mea?.. Sa tatau ona ou tipiina i totonu o se tootoo ina ia aoga le faʻamalosi i soo se mea.

Po o se isi faʻataʻitaʻiga, na matou mauaina muamua se mea sese - na lafoina InputPeerUser nai lo InputUser. Po o le isi itu. Ae sa aoga! O lona uiga, e leʻi popole le 'auʻaunaga i le ituaiga. E mafai faapefea ona tupu lenei mea? O le tali e mafai ona tuʻuina mai ia i matou e ala i vaega faʻailoga mai le 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);

I se isi faaupuga, o le mea lea e fai ai le serialization I LE MANUAL, e le fa'atupuina code! Masalo o loʻo faʻatinoina le 'auʻaunaga i se auala talitutusa? O le mafuaaga lea na faia ai le polokalame? Ma o lea tatou te agai atu i le isi fesili.

Fa'aliliuga. Laupapa

Aisea ua ta'ua ai fa'asologa fa'asologa o fa'asologa e na'o le fa'atatau i le tala fa'asolopito o fa'asalalauga fa'asalalau. E foliga mai, i le taimi muamua na manatu ai tusitala e mafai ona faia mea masani e faʻaaoga ai le polokalame e le suia, ma naʻo le mea e tatau ai, mo talosaga faʻapitoa, faʻaalia o loʻo faia i le faʻaaogaina o se isi faʻamatalaga. I le mataupu faavae, e oʻo lava i se manatu lelei - ma o le a avea le fou, e pei ona i ai, "fefiloi", faʻapipiʻi i luga o le mea tuai. Ae sei o tatou vaai pe na faapefea ona fai. E moni, sa le mafai ona ou tilotilo i ai mai lava i le amataga - e malie, ae o le ata o le faavae faavae e le o iai. Layers amata i le 2. O faʻamaumauga o loʻo taʻu mai ai ia i matou se mea faʻapitoa TL:

Afai e lagolagoina e le tagata o tausia le Layer 2, ona tatau lea ona faʻaogaina le faufale lea:

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

I le faʻatinoga, o lona uiga aʻo leʻi valaʻau API uma, se int ma le tau 0x289dd1f6 e tatau ona fa'aopoopo i luma ole numera ole metotia.

E foliga masani. Ae o le ā na tupu mulimuli ane? Ona aliali mai lea

invokeWithLayer3#b7475268 query:!X = X;

O le a la le isi mea? E pei ona e mateina,

invokeWithLayer4#dea0d430 query:!X = X;

E malie? Leai, ua vave tele ona ata, mafaufau i le mea moni lena taʻitasi o se talosaga mai se isi vaega e tatau ona afifi i se ituaiga faapitoa - afai e eseese uma mo oe, o le a se isi mea e mafai ona e iloa ai? Ma faʻaopoopo naʻo le 4 bytes i luma o se auala sili ona lelei. O lea,

invokeWithLayer5#417a57ae query:!X = X;

Ae e manino lava pe a mavae sina taimi o le a avea ma se ituaiga o bacchanalia. Ma na oo mai le fofo:

Faʻafou: Amata ile Layer 9, auala fesoasoani invokeWithLayerN e mafai ona faʻaaogaina faʻatasi ma initConnection

Talofa! Ina ua maeʻa le 9 lomiga, na iu lava ina matou oʻo mai i le mea na faia i luga ole Initaneti i tua i le 80s - malilie i le faʻasologa i le amataga o le fesoʻotaʻiga!

O le a la le isi mea?..

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

Ae o lea e mafai lava ona e ata. Naʻo le maeʻa ai o le isi 9 layers, na faʻaopoopoina ai se faufale lautele ma se numera numera, lea e manaʻomia naʻo le tasi le taʻua i le amataga o le fesoʻotaʻiga, ma o le uiga o le laulau na foliga mai ua mou atu, o lea ua naʻo se tulaga faʻapitoa, pei o i soo se mea lava. Ua foia faafitauli.

E sa'o?..

Vasily, [16.07.18 14:01] E oo lava i le Aso Faraile na ou mafaufau ai:
E auina atu e le teleserver mea tutupu e aunoa ma se talosaga. O talosaga e tatau ona afifi ile InvokeWithLayer. E le afifiina e le 'auʻaunaga faʻafouga; e leai se fausaga mo le afifiina o tali ma faʻafouga.

O na. e le mafai e le tagata o tausia ona fa'ama'oti le apa e mana'o iai ni fa'afouga

Vadim Goncharov, [16.07.18 14:02] e le o le InvokeWithLayer o se tootoo i le mataupu faavae?

Vasily, [16.07.18 14:02] Na o le pau lea o le auala

Vadim Goncharov, [16.07.18 14:02] o lona uiga e tatau ona ioe i luga o le laulau i le amataga o le sauniga.

Ae ui i lea, e mulimuli mai e leʻi tuʻuina atu le faʻauluina o tagata o tausia

Fa'afouga, i.e. ituaiga Updates i le polokalame, o le mea lea e auina atu e le server i le kalani e le o le tali atu i se talosaga API, ae tutoatasi pe a tupu se mea. O se mataupu lavelave lea o le a talanoaina i se isi pou, ae mo le taimi nei e taua le iloa o loʻo faʻasaoina e le 'auʻaunaga Faʻafouga e tusa lava pe leai le tagata o tausia.

O lea, afai e te musu e afifi taʻitasi afifi e faʻaalia lona faʻamatalaga, o lenei mea e taʻitaʻia ai faʻafitauli nei:

  • e tu'uina atu e le 'au'aunaga fa'afouga i le kalani e tusa lava pe le'i fa'ailoa mai e le kalani po'o fea le lomiga e lagolagoina
  • o le a le mea e tatau ona ou faia pe a uma ona faʻaleleia le kalani?
  • o ai faʻamaonigae le suia le manatu o le server e uiga i le numera layer i le faagasologa?

E te manatu o lenei mea o se taumatematega faʻapitoa, ma i le faʻatinoga e le mafai ona tupu, aua o loʻo tusia saʻo le 'auʻaunaga (a itiiti ifo, e faʻataʻitaʻiina lelei)? Ha! Tusa lava pe faapefea!

O le mea tonu lea na matou oo i ai ia Aukuso. I le aso 14 o Aokuso, sa i ai feʻau o loʻo faʻafouina se mea i luga o le Telegram servers ... ona sosoo ai lea ma totonu o ogalaau:

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.

ona sosoo ai lea ma le tele o megabytes o faʻasologa o faʻaputuga (ia, i le taimi lava e tasi na faʻamautu ai le ogalaau). A uma, afai e le o iloa se mea i lau TL, o le binary e ala i le saini, i lalo ole laina UMA alu, decoding o le a le mafai. O le a se mea e tatau ona e faia i se tulaga faapena?

Ia, o le mea muamua e sau i le mafaufau o se tasi o le motusia ma toe taumafai. E le'i fesoasoani. Matou google CRC32 - o nei mea na avea ma mea mai le polokalame 73, e ui lava na matou galulue i le 82. Matou te vaʻavaʻai totoʻa i ogalaau - o loʻo i ai faʻamatalaga mai polokalame eseese e lua!

Masalo o le fa'afitauli o lo'o i totonu o le matou tagata fa'atau le aloaia? Leai, matou te faʻalauiloaina Telegram Desktop 1.2.17 (faʻasologa o loʻo tuʻuina atu i le tele o faʻasalalauga Linux), e tusi i le Exception log: MTP Faʻafuaseʻi ituaiga id #b5223b0f faitau i le MTPMessageMedia...

Fa'aitu'uga o le fa'atonuga ma fa'alapotopotoga fa'alapotopotoga a Telegram. Vaega 1, fa'atekinisi: poto masani i le tusiaina o se tagata fa'atau mai le maoa'e - TL, MT

Na faʻaalia e Google o se faʻafitauli faʻapena ua uma ona tupu i se tasi o tagata faʻatau le aloaia, ae o numera numera ma, e tusa ai, o manatu e ese ...

O le a la le mea e tatau ona tatou faia? Vasily ma ma vaeluaina: na ia taumafai e faʻafouina le matagaluega i le 91, na ou filifili e faʻatali mo ni nai aso ma taumafai i le 73. O auala uma e lua na aoga, ae talu ai e faʻamaonia, e leai se malamalama i le tele o lomiga i luga pe lalo e te manaʻomia. e oso ai, po o le a le umi e te faatali ai .

Mulimuli ane na mafai ona ou toe faia le tulaga: matou te tatalaina le kalani, tape, toe tuufaatasia le matagaluega i se isi vaega, toe amata, toe maua le faʻafitauli, toe foʻi i le mea muamua - oops, leai se tele o suiga o le matagaluega ma toe amata le tagata o tausia mo se o ni nai minute o le a fesoasoani. O le ae mauaina se faʻafefiloi o faʻamaumauga faʻamaumauga mai laulau eseese.

Fa'amatalaga? E pei ona mafai ona e mateina mai faʻailoga le tuusaʻo, o le server e aofia ai le tele o faiga o ituaiga eseese i masini eseese. E foliga mai, o le 'auʻaunaga e nafa ma le "buffering" na tuʻuina i totonu o le laina mea na tuʻuina atu e ona tagata maualuga, ma latou tuʻuina atu i le polokalame na faʻatulagaina i le taimi o augatupulaga. Ma seia oʻo i lenei laina "pala", e leai se mea e mafai ona faia i ai.

Masalo ... ae o se tootoo mataʻutia lea?! I le Android version matou te le maua se TL parser, ae matou te maua se faila mamafa (GitHub musu e paʻi i luga) ma (de) faʻasologa. O snippet nei code:

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;

poʻo

    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... foliga vao. Ae, masalo, o lenei mea ua gaosia code, ona lelei? .. Ae mautinoa e lagolagoina uma lomiga! E moni, e le o manino pe aisea ua fefiloi faatasi ai mea uma, talatalanoaga faalilolilo, ma ituaiga uma _old7 i se isi itu e le foliga mai o le gaosiga o masini ... Ae ui i lea, o le mea sili o mea uma na ou le fiafia ai

TL_message_layer104
TL_message_layer104_2
TL_message_layer104_3

Tama e, e le mafai ona e filifili po o le a le mea o loʻo i totonu o le tasi laulau?! Ia, lelei, tatou fai atu "lua" na tatalaina ma se mea sese, lelei, e tupu, ae TOLU? O le a le ituaiga ponokalafi lea, faamalie atu?..

I le faʻapogai o le Telegram Desktop, i le ala, o se mea talitutusa e tupu - afai o lea, o le tele o faʻatonuga i se laina i le polokalame e le suia ai lona numera, ae faʻaleleia se mea. I tulaga e leai se faʻamatalaga aloaia o faʻamaumauga mo le polokalame, o fea e mafai ona maua mai ai, sei vagana ai le code source a le tagata faʻatau aloaia? Ma afai e te aveina mai iina, e le mafai ona e mautinoa o loʻo saʻo atoatoa le polokalame seʻia e suʻeina uma metotia.

E mafai faapefea ona tofotofoina lenei mea? Ou te faʻamoemoe o le a faʻasoa e tagata fiafia o iunite, galuega ma isi suʻega i faʻamatalaga.

Lelei, se'i o tatou va'ai i se isi fasi code:

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;

O lenei faʻamatalaga "faia ma le lima" o loʻo taʻu mai ai e naʻo se vaega o lenei faila na tusia ma le lima (e mafai ona e mafaufauina le faʻataʻitaʻiga atoa o le tausiga o le miti?), Ma o isi mea na gaosia e masini. Ae ui i lea, o le isi fesili e tulaʻi mai - o loʻo maua punaoa e le atoatoa (a la GPL blobs i le fatu Linux), ae o lenei ua avea ma autu mo le vaega lona lua.

Ae lava. Sei o tatou agai i luma i le protocol i le pito i luga o loʻo faʻatautaia uma nei faʻasologa.

MT Proto

O lea, tatou tatala fa'amatalaga lautele и fa'amatalaga auiliili o le protocol ma o le mea muamua tatou te tautevateva ai o upu. Ma le tele o mea uma. I se tulaga lautele, e foliga mai o se vaega faʻapitoa o Telegram - valaʻau mea eseese i nofoaga eseese, poʻo mea eseese i se upu e tasi, poʻo le isi itu (mo se faʻataʻitaʻiga, i se API maualuga, afai e te vaʻai i se pusa faʻapipiʻi, e le mea na e manatu ai).

Mo se faʻataʻitaʻiga, o le "feʻau" ma le "sauniga" o lona uiga o se mea e ese mai iinei nai lo le masani a le tagata faʻatau Telegram. Ia, o loʻo manino mea uma i le feʻau, e mafai ona faʻamatalaina i upu OOP, pe naʻo le taʻua o le upu "packet" - o se tulaga maualalo, felauaiga, e le tutusa feʻau e pei o le atinaʻe, e tele feʻau tautua. . Ae o le sauniga... ae muamua mea muamua.

vaega felauaiga

O le mea muamua o le felauaiga. O le a latou taʻu mai ia i matou e uiga i filifiliga 5:

  • TCP
  • Websocket
  • Websocket i luga ole HTTPS
  • HTTP
  • HTTPS

Vasily, [15.06.18 15:04] E iai foʻi felauaiga UDP, ae e leʻo faʻamauina.

Ma TCP i ni eseesega se tolu

O le mea muamua e tutusa ma le UDP i luga ole TCP, o pepa taʻitasi e aofia ai se numera faʻasologa ma le crc
Aisea e matua tiga ai le faitauina o pepa i luga o le taavale?

Ia, o lea ua i ai nei TCP ua i ai i le 4 ituaiga:

  • Faʻamatalaina
  • lotoi
  • Padded intermediate
  • tumu

Ia, lelei, Padded intermediate mo MTProxy, na fa'aopoopo mulimuli ane ona o mea lauiloa. Ae aisea e toe lua ai fa'aliliuga (tolu i le aofa'i) ae e mafai ona e maua i le tasi? O mea uma e fa e matua ese lava i le auala e seti ai le umi ma le uta o le MTProto autu, lea o le a talanoaina atili:

  • i Abridged e 1 pe 4 bytes, ae le 0xef, ona o le tino
  • i Intermediate o le 4 bytes le umi ma le fanua, ma o le taimi muamua e tatau ai i le kalani ona lafo 0xeeeeeeee e faailoa ai o le Intermediate
  • i le Full le sili ona fai ma vaisu, mai le vaaiga o se networker: umi, numera o le faasologa, ma E LE'O LE TASI e masani ona MTProto, tino, CRC32. Ioe, o nei mea uma o loʻo i luga ole TCP. Le mea e maua ai i matou le felauaiga faʻalagolago i le tulaga o se vaitafe byte faʻasolosolo e leai se faʻasologa e manaʻomia, aemaise lava siaki. Lelei, o lea o le a tetee mai se tasi ia te aʻu o le TCP o loʻo i ai se siaki 16-bit, o lea e tupu ai faʻamatalaga piʻopiʻo. Lelei, ae o loʻo i ai se matou faʻataʻitaʻiga faʻataʻitaʻiga faʻatasi ai ma faʻamaufaʻailoga e umi atu nai lo le 16 paita, o nei mea sese uma - ma sili atu - o le a maua e se SHA le fetaui i se tulaga maualuga. E leai se mea i le CRC32 i luga o lenei mea.

Se'i o tatou fa'atusatusaina le Fa'apuupuu, lea e mafai ai ona tasi le paita o le umi, ma le Intermediate, lea e fa'amaonia ai "I le tulaga e mana'omia ai le fa'aogaina o fa'amatalaga 4-byte," e matua le aoga. O le a, e talitonuina o le Telegram programmers e matua le agavaa e le mafai ona latou faitauina faʻamatalaga mai se socket i totonu o se paʻu faʻaogaina? E tatau lava ona e faia lenei mea, aua o le faitau e mafai ona toe faafoi atu ia te oe soʻo se numera o bytes (ma o loʻo i ai foi sui sui, mo se faʻataʻitaʻiga ...). Pe i le isi itu, aisea e poloka ai le Abridged pe afai o le ai ai pea a tatou paʻu mamafa i luga o le 16 bytes - faʻasaoina 3 paita o nisi taimi ?

E maua e se tasi le lagona e fiafia tele Nikolai Durov e toe faʻaleleia uili, e aofia ai faʻasalalauga fesoʻotaʻiga, e aunoa ma se manaʻoga moni.

O isi filifiliga felauaiga, e aofia ai. Web ma MTProxy, matou te le mafaufau nei, atonu i se isi pou, pe a iai se talosaga. E uiga i lenei lava MTProxy, ia tatou manatua nei e leʻi leva ona tuʻuina atu i le 2018, na vave ona aʻoaʻoina e le auʻaunaga e poloka, faʻamoemoe mo poloka polokae tusa ai tele afifi! Ma o le mea moni foi e faapea o le MTProxy server na tusia (toe saunia e Waltman) i le C na matua fusifusia i Linux patino, e ui lava e leʻi manaʻomia (Phil Kulin o le a faʻamaonia), ma o se server tutusa i Go poʻo Node.js o le a fetaui i lalo ifo o le selau laina.

Ae o le a matou faia ni faaiuga e uiga i le tomai faʻapitoa o nei tagata i le faaiuga o le vaega, pe a uma ona iloiloina isi mataupu. Mo le taimi nei, seʻi o tatou agai i luma ile OSI layer 5, sauniga - lea na latou tuʻuina ai le MTProto session.

Ki, savali, sauniga, Diffie-Hellman

Na latou tu'uina iina e le'o sa'o atoatoa... O se sauniga e le'o le vasega tutusa lea e va'aia i le fa'aoga i lalo Active sessions. Ae i le faasologa.

Fa'aitu'uga o le fa'atonuga ma fa'alapotopotoga fa'alapotopotoga a Telegram. Vaega 1, fa'atekinisi: poto masani i le tusiaina o se tagata fa'atau mai le maoa'e - TL, MT

O lea na matou maua ai se manoa byte e iloa le umi mai le vaega o felauaiga. O se fe'au fa'ailoga po'o se fa'amatalaga manino - pe afai o lo'o tatou i ai i le tulaga autu o maliega ma o lo'o faia moni lava. O le fea o vaega o manatu e ta'ua o le "ki" o loʻo tatou talanoa i ai? Sei o tatou faʻamalamalamaina lenei mataupu mo le Telegram team lava ia (Ou te faʻamalie atu mo le faʻaliliuina o aʻu lava faʻamaumauga mai le Igilisi ma se faiʻai vaivai i le 4 i le taeao, sa sili atu ona faigofie ona tuʻu nisi o fuaitau e pei ona i ai):

E lua vaega e ta'ua sauniga - tasi i le UI o tagata faʻatau aloaʻia i lalo o "sauniga o loʻo i ai nei", lea e fetaui ai sauniga taʻitasi ma se masini atoa / OS.
Tulaga lua - MTProto sauniga, o loʻo i ai le numera faʻasologa o le feʻau (i se tulaga maualalo) i totonu, ma o le a e mafai ona tumau i le va o feso'ota'iga TCP eseese. E tele vaega MTProto e mafai ona fa'apipi'i i le taimi e tasi, mo se fa'ata'ita'iga, e fa'avave le la'uina o faila.

I le va o nei mea e lua sauniga e iai se manatu faʻatagaina. I le tulaga degenerate, e mafai ona tatou fai atu lena mea UI sauniga e tutusa ma faʻatagaina, ae talofa, e faigata mea uma. Se'i tatou va'ai:

  • O le tagata fa'aoga i le masini fou e fa'atupu muamua auth_key ma faʻamauina i le tala, mo se faʻataʻitaʻiga e ala i SMS - o le mafuaaga lena faʻatagaina
  • Na tupu i totonu o le muamua MTProto sauniga, lea e iai session_id i totonu ia te oe lava.
  • I lenei laasaga, o le tuufaatasiga faʻatagaina и session_id e mafai ona valaauina faʻaauau - o lenei upu o loʻo faʻaalia i faʻamaumauga ma faʻailoga a nisi tagata faʻatau
  • Ona mafai lea ona tatala e le kalani tele MTProto sauniga i lalo o le tutusa auth_key - i le DC tutusa.
  • Ma, e iai se aso e mana'omia ai e le kalani le talosaga mai le faila isi DC - ma mo lenei DC o le a faia se mea fou auth_key !
  • Ina ia logoina le faiga e le o se tagata fou o loʻo lesitala, ae tutusa faʻatagaina (UI sauniga), e fa'aoga e le kalani ia API telefoni auth.exportAuthorization i le fale DC auth.importAuthorization i le DC fou.
  • E tutusa mea uma, e tele e mafai ona tatala MTProto sauniga (e tofu ma lana lava session_id) i lenei DC fou, i lalo lona auth_key.
  • Ma le mea mulimuli, atonu e mana'o le kalani i le Fa'alilo Fa'asao atoatoa. Ta'itasi auth_key sa tūmau ki - mo DC - ma e mafai e le kalani ona vili auth.bindTempAuthKey mo le faaaogaina lē tumau auth_key - ma le isi, na o le tasi temp_auth_key i DC, masani i tagata uma MTProto sauniga i lenei DC.

matau, lena masima (ma masima i le lumanai) e tasi foi i luga auth_key i latou. faasoa i le va o tagata uma MTProto sauniga i le DC tutusa.

O le a le uiga o le "i le va o feso'ota'iga TCP eseese"? O lona uiga la se mea faapena kuki fa'atagaina i luga o le upega tafa'ilagi - e fa'aauau pea (ola) le tele o feso'ota'iga TCP i se 'au'aunaga tu'uina atu, ae i se aso e leaga. E le pei o le HTTP, i le MTProto feʻau i totonu o se sauniga e faʻasologa faʻasologa ma faʻamaonia pe a latou ulu atu i le alavai, na motusia le fesoʻotaʻiga - a maeʻa ona faʻatuina se fesoʻotaʻiga fou, o le a auina atu ma le agalelei e le 'auʻaunaga mea uma i lenei vasega e leʻi tuʻuina atu i le taimi muamua; So'oga TCP.

Ae ui i lea, o faʻamatalaga o loʻo i luga e aoteleina pe a maeʻa le tele o masina o suʻesuʻega. I le taimi nei, o tatou faʻatinoina le matou tagata faʻatau mai le amataga? - tatou toe foi i le amataga.

Ia tatou fa'atupuina auth_key i Diffie-Hellman versions mai Telegram. Sei o tatou taumafai e malamalama i faʻamaumauga...

Vasily, [19.06.18 20:05] data_with_hash : = SHA1(faʻamatalaga) + faʻamaumauga + (soʻo se pate faʻafuaseʻi); o le umi e tutusa ma le 255 paita;
encrypted_data : = RSA(data_with_hash, server_public_key); o se numera umi 255-byte (endian tele) e siitia i le mana manaʻomia i luga o le modulus manaʻomia, ma o le taunuuga e teuina o se numera 256-byte.

E iai a latou DH dope

E le pei ole DH ole tagata soifua maloloina
E leai ni ki lautele se lua i le dx

Ia, i le faaiuga na faʻavasegaina lenei mea, ae o loʻo totoe pea - faʻamaoniga o le galuega e faia e le tagata o tausia na mafai ona ia faʻavasegaina le numera. Ituaiga puipuiga mai osofaiga a le DoS. Ma o le RSA key e naʻo le tasi le faʻaoga i le tasi itu, faʻapitoa mo faʻamatalaga new_nonce. Ae e ui o lenei taotoga e foliga mai e faigofie o le a manuia, o le a le mea e tatau ona e feagai?

Vasily, [20.06.18/00/26 XNUMX:XNUMX] Ou te leʻi oʻo i le talosaga appid.

Na ou auina atu lenei talosaga ia DH

Ma, i totonu o le felauaiga o loʻo fai mai e mafai ona tali atu i le 4 bytes o se faʻailoga sese. Pau lava lena

Ia, na ia fai mai ia te au -404, o le a la?

O lea na ou fai atu ai ia te ia: "Puʻe lau bullshit faʻailogaina i se ki server ma se tamatamailima pei o lenei, ou te manaʻo i le DH," ma na tali mai i se faʻavalevalea 404

O le a sou manatu i lenei tali a le server? O le a le mea e fai? E leai se tasi e fesili (ae sili atu i lena i le vaega lona lua).

O iinei e faia uma ai le tului i luga o le uafu

E leai se isi mea ou te faia, sa na ona ou moemiti i le faaliliuina o numera i tua ma luma

Lua numera 32 bit. Sa ou teuina e pei o isi tagata uma

Ae leai, o nei mea e lua e manaʻomia ona faʻaopoopo i le laina muamua e pei o BE

Vadim Goncharov, [20.06.18 15:49] ma ona o lenei 404?

Vasily, [20.06.18 15:49] IOE!

Vadim Goncharov, [20.06.18 15:50] o lea ou te le malamalama ai i le mea na te "le mauaina"

Vasily, [20.06.18 15:50] e tusa

Ou te leʻi mauaina se faʻalavelave faʻapitoa i mea taua%)

Matou te leʻi faʻatautaia foi lipoti sese

Vasily, [20.06.18 20:18] Oi, e iai foʻi le MD5. Ua uma ona tolu sasi eseese

O le fa'ailoga tamatamai lima e fa'atatauina e fa'apea:

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

SHA1 ma le sha2

Ia tuu atu la auth_key na matou mauaina le 2048 bits i le tele e faʻaaoga ai le Diffie-Hellman. O le a le isi mea? O le isi mea matou te iloa ai o le pito i lalo o le 1024 bits o lenei ki e le faʻaaogaina i soo se auala ... ae seʻi o tatou mafaufau i lenei mea mo le taimi nei. I lenei laasaga, o loʻo i ai sa matou mealilo faʻatasi ma le 'auʻaunaga. O se analogue o le TLS session ua faʻatuina, o se faiga taugata tele. Ae e le o iloa lava e le server se mea e uiga i ai i matou! E le'i iai, o le mea moni. faʻatagaina. O na. pe afai na e mafaufau i le faaupuga "login-password", e pei ona e faia muamua i le ICQ, poʻo le itiiti ifo i le "login-key", pei o le SSH (mo se faʻataʻitaʻiga, i luga o nisi gitlab / github). Na matou mauaina se tasi e le ta'ua. Ae fa'afefea pe a ta'u mai e le 'au'aunaga "o nei numera telefoni o lo'o tautuaina e se isi DC"? Po o le "ua faasaina lau numera telefoni"? O le mea sili e mafai ona tatou faia o le tausia o le ki i le faʻamoemoe o le a aoga ma e leʻi pala i lena taimi.

I le auala, matou te "maua" ma faʻaagaga. Mo se faʻataʻitaʻiga, matou te faʻatuatuaina le server? Ae faapefea pe afai e pepelo? E manaʻomia suʻesuʻega faʻamaonia:

Vasily, [21.06.18 17:53] Latou te ofoina atu tagata faʻatau feaveaʻi e siaki se numera 2kbit mo le tulaga muamua%)

Ae e le o manino lava, nafeijoa

Vasily, [21.06.18 18:02] E le o taʻu mai e le pepa le mea e fai pe afai e foliga mai e le faigofie

E lei fai mai. Se'i o tatou va'ai pe o le a le mea e fai e le tagata fa'atau Android i lenei tulaga? A o le mea lena (ma ioe, o le faila atoa e manaia) - e pei ona latou fai mai, o le a ou tuʻua iinei:

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

Leai, ioe o lo'o iai pea nisi O lo'o iai su'ega mo le fa'amuamua o se numera, ae o le tagata lava ia ua le toe lava lo'u malamalama i le matematika.

Ua lelei, ua matou maua le ki matua. Ina ia saini i totonu, i.e. auina atu talosaga, e tatau ona e faia nisi faʻamatalaga, faʻaaoga AES.

O le ki o le savali o loʻo faʻamatalaina o le 128 ogatotonu o le SHA256 o le feʻau feʻau (e aofia ai le sauniga, ID feʻau, ma isi), e aofia ai le padding bytes, prepended e 32 bytes ave mai le faʻatagaina ki.

Vasily, [22.06.18 14:08] averesi, pipi, fasi

Mauaina auth_key. O mea uma. I tua atu o latou ... e le o manino mai le pepa. Lagona le saoloto e suʻesuʻe le faʻailoga tatala puna.

Manatua o le MTProto 2.0 e manaʻomia mai le 12 i le 1024 paita o paʻu, e faʻalagolago lava i le tuutuuga o le umi o le feʻau e maua e vaelua i le 16 paita.

O le a la le tele o padding e tatau ona e fa'aopoopo?

Ma ioe, e iai foʻi le 404 i le tulaga o se mea sese

Afai e suʻesuʻe ma le totoʻa e se tasi le ata ma tusitusiga o faʻamaumauga, na latou matauina e leai se MAC iina. Ma o le AES o loʻo faʻaaogaina i se tulaga IGE e le faʻaaogaina i se isi mea. Latou, ioe, tusi e uiga i lenei mea i la latou FAQ ... O iinei, pei, o le ki o le savali lava ia o le SHA hash o faʻamatalaga decrypted, faʻaaogaina e siaki ai le faʻamaoni - ma i le tulaga o se le fetaui, o le faʻamaumauga mo nisi mafuaaga fautuaina e le leoa le amana'ia i latou (ae faapefea le saogalemu, a pe a latou motusia i tatou?).

E le o aʻu o se cryptographer, masalo e leai se mea sese i lenei faiga i lenei tulaga mai se manatu faʻapitoa. Ae e mafai ona ou taʻua manino se faʻafitauli aoga, faʻaaoga Telegram Desktop e fai ma faʻataʻitaʻiga. Na te fa'ailogaina le fa'alotoifale (o nei mea uma D877F783D5D3EF8C) i le auala lava e tasi e pei o fe'au i MTProto (na'o le tulaga lenei version 1.0), i.e. muamua le ki feʻau, ona faʻamaumauga lava ia (ma se mea e ese mai le tele tele auth_key 256 paita, e aunoa ma lea msg_key le aoga). O lea la, o le faʻafitauli e iloagofie i faila tetele. O lona uiga, e tatau ona e teuina ni kopi se lua o faʻamaumauga - faʻailoga ma faʻamaonia. Ma afai ei ai megabytes, poʻo le tafeina o vitio, mo se faʻataʻitaʻiga?.. Faʻataʻitaʻiga masani ma MAC pe a maeʻa le ciphertext e mafai ai ona e faitau i ai, faʻasalalau vave. Ae o le MTProto e tatau ona e faia i le taimi muamua fa'ailoga pe fa'amalo le fe'au atoa, ona tu'u atu lea i le feso'ota'iga po'o le tisiki. O le mea lea, i lomiga lata mai o Telegram Desktop i totonu o le cache in user_data O lo'o fa'aogaina fo'i le isi fa'asologa - fa'atasi ai ma le AES ile faiga o le CTR.

Vasily, [21.06.18 01:27] Oi, na ou iloa po o le a le IGE: O le IGE o le taumafaiga muamua lea i se "faiga faʻamaonia faʻamaonia," muamua mo Kerberos. O se taumafaiga na le manuia (e le maua ai le puipuiga o le faamaoni), ma e tatau ona aveese. O le amataga lena o se sailiga 20 tausaga mo se faʻamatalaga faʻamaonia faʻamaonia e aoga, lea na faʻaiʻu talu ai nei i faiga e pei ole OCB ma le GCM.

Ma o lenei o finauga mai le itu o le taavale:

O le 'au i tua o Telegram, o loʻo taʻitaʻia e Nikolai Durov, e aofia ai le ono ACM siamupini, afa o latou Ph.Ds i le numera. E tusa ma le lua tausaga na latou faʻataʻavaleina ai le lomiga o loʻo iai nei a MTProto.

E malie lena. Lua tausaga i le tulaga maualalo

Pe mafai ona e ave tls

Lelei, seʻi tatou fai atu ua matou faia le faʻailoga ma isi nuances. E mafai ona tuʻuina atu talosaga faʻasalalau i le TL ma faʻaumatia tali? O le a la ma pe faapefea ona e lafo? O iinei, tatou fai atu, o le metotia initConnection, masalo o le mea lea?

Vasily, [25.06.18 18:46] Faʻamataina le fesoʻotaʻiga ma faʻasaoina faʻamatalaga i luga o le masini ma le faʻaoga a le tagata faʻaoga.

E talia app_id, device_model, system_version, app_version ma lang_code.

Ma nisi fesili

Fa'amaumauga e pei ona masani ai. Lagona le saoloto e suesue le punaoa tatala

Afai e manino mea uma ile invokeWithLayer, o le a le mea o loʻo tupu iinei? E aliali mai, tatou fai mai o loʻo i ai - o loʻo i ai i le kalani se mea e fesiligia ai le 'auʻaunaga - o loʻo i ai se talosaga na matou manaʻo e lafo atu:

Vasily, [25.06.18 19:13] Fa'amasino i le fa'ailoga, o le valaau muamua o lo'o afifi i lenei mea leaga, ma o le mea'ai lava ia e afifi i le invokewithlayer.

Aisea e le mafai ai ona avea initConnection se vala'au ese, ae tatau ona avea ma afifi? Ioe, e pei ona aliali mai, e tatau ona faia i taimi uma i le amataga o vasega taitasi, ae le o le tasi, e pei o le ki autu. Ae! E le mafai ona valaʻau e se tagata e le faʻatagaina! O lea la ua tatou oo i le tulaga e talafeagai ai Le tasi lea itulau faʻamaumauga - ma e taʻu mai ia i matou e ...

Na'o se vaega itiiti o auala API o lo'o avanoa mo tagata e le fa'atagaina:

  • auth.sendCode
  • auth.resendCode
  • account.getPassword
  • auth.checkPassword
  • auth.checkPhone
  • auth.signUp
  • auth.signIn
  • auth.importAuthorization
  • fesoasoani.getConfig
  • fesoasoani.getNearestDc
  • fesoasoani.getAppUpdate
  • fesoasoani.getCdnConfig
  • langpack.getLangPack
  • langpack.getStrings
  • langpack.getDifference
  • langpack.getLanguages
  • langpack.getLanguage

O le muamua o latou, auth.sendCode, ma o loʻo i ai le talosaga muamua pele lea matou te lafoina api_id ma api_hash, ma mulimuli ane matou maua se SMS ma se code. Ma afai tatou te i ai i le DC sese (numera telefoni i lenei atunuu o loʻo tautuaina e se isi, mo se faʻataʻitaʻiga), ona tatou maua lea o se mea sese ma le numera o le DC manaʻomia. Ina ia su'e po'o fea tuatusi IP ile numera DC e te mana'omia e fa'afeso'ota'i i ai, fesoasoani mai help.getConfig. I se tasi taimi e na o le 5 faʻamaumauga, ae ina ua maeʻa mea taʻutaʻua o le 2018, ua faʻateleina le numera.

Ia tatou manatua na tatou o'o i le tulaga lea i luga o le 'au'aunaga ma le le iloa. E le taugata tele le na'o le mauaina o se tuatusi IP? Aisea e le faia ai lenei mea, ma isi gaioiga, i le vaega e le faʻamaonia o MTProto? Ou te faalogo i le tetee: "e faapefea ona tatou mautinoa e le o le RKN o le a tali mai i tuatusi sese?" I lenei mea matou te manatua, i se tulaga lautele, tagata faʻatau aloaia O ki RSA ua fa'apipi'i, i.e. e mafai lava fa'ailoga lenei faamatalaga. O le mea moni, ua maeʻa ona faia lenei mea mo faʻamatalaga e uiga i le faʻaogaina o le polokaina o loʻo maua e tagata faʻatau e ala i isi auala (faʻapitoa, e le mafai ona faia i MTProto lava ia; e tatau foi ona e iloa le mea e faʻafesoʻotaʻi ai).

Ua lelei. I lenei la'asaga o le faatagaga a le tagata o tausia, matou te le'i fa'atagaina ma e le'i resitalaina la matou talosaga. Matou te fia vaʻai mo le taimi nei poʻo le a le tali a le 'auʻaunaga i metotia o loʻo avanoa i se tagata e le faʻatagaina. Ma iinei…

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;

I le polokalame, muamua e sau lona lua

I le tdesktop schema le tau lona tolu o

Ioe, talu mai lena taimi, ioe, ua toe faʻafouina le faʻamaumauga. E ui atonu e le o toe umi ae toe le taua. E fa'afefea ona iloa e se tagata fa'alauiloa fou? Masalo afai e te lesitala lau talosaga, latou te logoina oe? Na faia e Vasily lenei mea, ae talofa, latou te leʻi auina atu ia te ia se mea (toe, o le a tatou talanoa e uiga i lenei mea i le vaega lona lua).

... Na e matauina ua uma ona matou siitia atu i le API, i.e. i le isi tulaga, ma misia se mea i le mataupu MTProto? Leai se mea e ofo ai:

Vasily, [28.06.18 02:04] Mm, o loʻo latou suʻeina nisi o algorithms i luga o le e2e

Mtproto fa'amatala fa'amalamalamaga algorithms ma ki mo vaega uma e lua, fa'apea fo'i ma sina fa'ailoga afifi.

Ae latou te faʻafefiloi i taimi uma tulaga eseese o le faaputuga, o lea e le o manino i taimi uma le mea na muta ai le mtproto ae amata le isi tulaga.

E fa'afefea ona fa'afefiloi? Ia, o le ki le tumau lea mo le PFS, mo se faʻataʻitaʻiga (i le ala, Telegram Desktop e le mafai ona faia). E fa'atinoina e se talosaga API auth.bindTempAuthKey, i.e. mai le tulaga maualuga. Ae i le taimi lava e tasi e faʻalavelave i faʻamatalaga i le pito i lalo - a maeʻa, mo se faʻataʻitaʻiga, e tatau ona e toe faia. initConnection ma isi, e leai naʻo talosaga masani. O le mea fa'apitoa e mafai ona na'o le TASI le ki le tumau i le DC, e ui lava o le fanua auth_key_id i feʻau taʻitasi e mafai ai ona e suia le ki a itiiti ifo i feʻau uma, ma o loʻo i ai i le 'auʻaunaga le aia tatau e "galo" ai le ki le tumau i soʻo se taimi - e le o taʻu mai e le pepa le mea e fai i lenei tulaga ... lelei, aisea e mafai ai E le o ia te oe ea ni ki, e pei o se seti o masima i le lumanai, ma ?..

E i ai nai mea e tatau ona matauina e uiga i le autu MTProto.

Fe'au fe'au, msg_id, msg_seqno, fa'amaoniga, pings i le itu sese ma isi mea fa'apitoa.

Aisea e tatau ai ona e iloa e uiga ia i latou? Aua latou te "lea" i se tulaga maualuga, ma e tatau ona e nofouta ia i latou pe a galue ma le API. Fa'apea tatou te le fiafia i le msg_key; Ae i totonu o faʻamatalaga faʻamaonia o loʻo i ai a matou fanua nei (faʻapea foʻi le umi o faʻamaumauga, o lea matou te iloa ai le mea o loʻo i ai le padding, ae e le taua):

  • masima - int64
  • session_id - int64
  • message_id - int64
  • seq_no - int32

Sei matou faamanatu atu e na o le tasi le masima mo le DC atoa. Aisea e iloa ai e uiga ia te ia? E le gata ona o loo i ai se talosaga get_future_salts, lea e taʻu atu ia te oe po o le a le vaeluaga o le a aoga, ae faʻapea foi afai o lau masima e "pala", ona leiloa lea o le feʻau (talosaga). O le mea moni, o le a lipotia e le 'auʻaunaga le masima fou e ala i le tuʻuina atu new_session_created - ae faʻatasi ai ma le mea tuai e tatau ona e toe lafoina i se auala, mo se faʻataʻitaʻiga. Ma o lenei mataupu e aʻafia ai le fausaga o talosaga.

Ua fa'atagaina le 'au'aunaga e tu'u uma vasega ma tali atu i lenei auala mo le tele o mafua'aga. O le mea moni, o le a le sauniga MTProto mai le itu o tagata o tausia? O numera ia e lua session_id и seq_no savali i totonu o lenei sauniga. Ia, ma le fesoʻotaʻiga TCP autu, ioe. Fa'apea e le'o iloa e le matou kalani le tele o mea e fai, na ia motusia ma toe fa'afeso'ota'i. Afai na tupu vave lenei mea - o le sauniga tuai na faʻaauau i le fesoʻotaʻiga TCP fou, faʻateleina seq_no atili. Afai e umi se taimi, e mafai e le 'auʻaunaga ona tapeina, aua i lona itu o loʻo i ai foi se laina, e pei ona matou iloa.

O le a le mea e tatau ona i ai seq_no? Oi, o se fesili faigata lena. Taumafai e malamalama ma le faamaoni i le uiga:

Savali e faatatau i mataupu

O se fe'au e mana'omia ai se fa'aaliga manino. O nei mea e aofia uma ai le tagata faʻaoga ma le tele o feʻau tautua, toetoe lava o mea uma sei vagana ai pusa ma faʻafeiloaʻiga.

Numera Fa'asologa o Fe'au (msg_seqno)

O se numera 32-bit e tutusa ma le faaluaina o le numera o feʻau "faʻatatau i mea" (mea e manaʻomia ai le faʻaalia, aemaise lava i latou e le o ni pusa) na fatuina e le tagata na auina atu i luma o lenei feʻau ma faʻaopoopoina i le tasi pe afai o le savali o loʻo i ai nei o se fe'au fa'atatau i mea. O se atigipusa e gaosia i taimi uma pe a uma ona i totonu atoa; o le mea lea, o lona fa'asologa numera e sili atu pe tutusa ma numera fa'asologa o fe'au o lo'o i totonu.

O le a le ituaiga circus o loʻo i ai le faʻaopoopoga i le 1, ona sosoo ai lea ma le isi i le 2?.. Ou te masalo o le mea muamua na latou faauigaina "o le mea sili ona taua mo le ACK, o le isi o se numera", ae o le taunuuga e le tutusa - aemaise lava, e sau i fafo, e mafai ona lafo tele fa'amaoniga e tutusa seq_no! E faapefea? Ia, mo se faʻataʻitaʻiga, e auina mai e le 'auʻaunaga ia i matou se mea, auina atu, ma o matou lava e nofo filemu, naʻo le tali atu i feʻau tautua e faʻamaonia ai le mauaina o ana feʻau. I lenei tulaga, o a matou faʻamaoniga o fafo o le a tutusa le numera alu ese. Afai e te masani i le TCP ma e te manatu e foliga mai o se mea leaga, ae e foliga mai e le o se mea leaga tele, aua ile TCP seq_no e le suia, ae o le faamaoniga e alu i seq_no i le isi itu, ou te faanatinati e faaita ia te oe. O fa'amaoniga o lo'o tu'uina atu ile MTProto Leai i seq_no, pei o le TCP, ae e msg_id !

O le a lea msg_id, le sili ona taua o nei fanua? O se faʻamatalaga faʻamatalaga tulaga ese, e pei ona taʻu mai e le igoa. O loʻo faʻamatalaina o se numera 64-bit, o le pito sili ona maualalo o loʻo i ai le togafiti faʻataulaitu "server-not-server", ma o le isi o le Unix timestamp, e aofia ai le vaega vaevaega, faʻafeiloaʻi 32 bits i le agavale. O na. timestamp mo se tasi (ma o feʻau e iai taimi e eseese tele o le a teena e le 'auʻaunaga). Mai lea mea e aliali mai i se tulaga lautele o se faʻamatalaga lea e faʻavaomalo mo le kalani. Tuuina atu lena - ia tatou manatua session_id - matou te mautinoa: E leai se tulaga e mafai ai ona auina atu se fe'au mo le vasega e tasi i se isi sauniga. O lona uiga, e aliali mai ua uma ona iai tolu tulaga - sauniga, numera o sauniga, fe'au id. Aisea ua soona fai ai, o lenei mealilo e matua maoae lava.

Ma o lea, msg_id mana'omia mo...

RPC: talosaga, tali, mea sese. Fa'amauga.

E pei ona e maitauina, e leai se faʻapitoa "faia se talosaga RPC" ituaiga poʻo se galuega i soʻo se mea i le ata, e ui lava o loʻo i ai tali. A uma mea uma, o loʻo i ai a matou feʻau e fesoʻotaʻi ma mataupu! O lena lava, любое o le savali e mafai ona avea ma se talosaga! Pe le avea. Ae uma ane, taʻitasi o msg_id. Ae e iai tali:

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

O i ina ua fa'ailoa mai ai po'o fea le fe'au e tali atu i ai. O le mea lea, i le pito i luga o le API, e tatau ona e manatua pe o le a le numera o lau talosaga - Ou te manatu e leai se manaʻoga e faʻamatalaina o le galuega e le faʻaogaina, ma e mafai ona tele talosaga o loʻo faagasolo i le taimi e tasi, o tali e mafai ona toe faafoi i soo se faasologa? I le mataupu faavae, mai lenei ma savali sese e pei e leai ni tagata faigaluega, o le fausaga o loʻo i tua o lenei mea e mafai ona suʻeina: o le 'auʻaunaga e tausia se TCP fesoʻotaʻiga ma oe o se paleni pito i luma, e tuʻuina atu talosaga i tua ma toe aoina mai e ala i message_id. E foliga mai o mea uma iinei e manino, talafeagai ma lelei.

Ioe?.. Ma afai e te mafaufau i ai? A uma mea uma, o le tali a le RPC lava ia e iai foi se fanua msg_id! E tatau ona tatou ee i le 'auʻaunaga "e te le tali mai i laʻu tali!"? Ma ioe, o le a le mea sa i ai e uiga i faʻamaoniga? E uiga i itulau fe'au e uiga i fe'au ta'u mai ia i tatou le mea

msgs_ack#62d6b459 msg_ids:Vector long = MsgsAck;

ma e tatau ona faia i itu taitasi. Ae le o taimi uma! Afai na e mauaina se RpcResult, o ia lava e avea o se faʻamaoniga. O lona uiga, e mafai e le 'auʻaunaga ona tali atu i lau talosaga ile MsgsAck - pei, "Na ou mauaina." RpcResult e mafai ona tali vave. E mafai ona lua.

Ma ioe, e tatau lava ona e taliina le tali! Fa'amauga. A leai, o le a manatu le 'auʻaunaga e le mafai ona tuʻuina atu ma toe lafo atu ia te oe. E oo lava ina ua uma ona toe fesootai. Ae o iinei, ioe, ua tulaʻi mai le mataupu o taimi faʻagata. Sei o tatou tilotilo ia i latou i se taimi mulimuli ane.

I le taimi nei, se'i o tatou va'ava'ai i fa'aletonu ole fa'atinoina ole fesili.

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

Oi, o le a alaga se tasi, o se faʻataʻitaʻiga sili atu lea o le tagata - o loʻo i ai se laina! Faifai lemu. O iinei lisi o mea sese, ae o le mea moni e le atoatoa. Mai lea mea tatou te iloa ai o le code se mea faapena O mea sese HTTP (lelei, ioe, o le semantics o tali e le faʻaaloalogia, i nisi o nofoaga e tufatufaina faʻafuaseʻi i totonu o tulafono laiti), ma o le laina e foliga mai. CAPITAL_LETTERS_AND_NUMBERS. Mo se fa'ata'ita'iga, PHONE_NUMBER_OCCUPIED po'o FILE_PART_Х_MISSING. Ia, o lona uiga, e te manaʻomia pea lenei laina fa'amatala. Mo se faʻataʻitaʻiga FLOOD_WAIT_3600 o lona uiga e tatau ona e faatali mo se itula, ma PHONE_MIGRATE_5, e tatau ona lesitala se numera telefoni i le 5th DC. E iai la tatou gagana fa'apena, sa'o? Matou te le manaʻomia se finauga mai se manoa, o mea masani o le a faia, lelei.

Toe, e le oi luga o le itulau fe'au tautua, ae, e pei ona masani ai i lenei poloketi, e mafai ona maua le faʻamatalaga i luga o le isi itulau faʻamaumauga. Pe lafo masalosaloga. Muamua, va'ai, ta'i / fa'asaga le soli - RpcError e mafai ona ofaga i totonu RpcResult. Aisea e le o fafo? O le a le mea tatou te leʻi manatu i ai?.. E tusa ai, o fea o iai le faʻamaoniga e faapea RpcError e le mafai ona fa'aofi i totonu RpcResult, ae tuusao pe faamoega i se isi ituaiga?.. Ma afai e le mafai, aisea e le o le tulaga maualuga, i.e. ua misi req_msg_id ? ..

Ae sei o tatou faaauau e uiga i feau auauna atu. Atonu e manatu le kalani o loʻo mafaufau le 'auʻaunaga mo se taimi umi ma faia lenei talosaga matagofie:

rpc_drop_answer#58e4a740 req_msg_id:long = RpcDropAnswer;

E tolu tali talafeagai i lenei fesili, toe felafolafoaʻi ma le faiga faʻamaonia e taumafai e malamalama i le mea e tatau ona i ai (ma pe o le a le lisi lautele o ituaiga e le manaʻomia le faʻamaoniga) e tuʻuina atu i le tagata faitau e pei o meaaoga (faʻamatalaga: faʻamatalaga i totonu; le Telegram Desktop source code e leʻi maeʻa).

Vaisu o fualaau faasaina: tulaga savali

I se tulaga lautele, o le tele o nofoaga i TL, MTProto ma Telegram i se tulaga lautele e tuua ai se lagona o le loto maaa, ae mai le faaaloalo, faautauta ma isi. tomai vaivai Na matou fa'aloaloa ma le fa'aaloalo e uiga i ai, ma fa'asalaina mea leaga i talanoaga. Ae peitai, o lenei nofoagaОo le tele o le itulau e uiga i fe'au e uiga i fe'au O se mea e ofo ai e oʻo lava ia te aʻu, o le sa galue ma fesoʻotaʻiga fesoʻotaʻiga mo se taimi umi ma ua vaʻaia uila vilivae eseese o le piʻopiʻo.

E amata e aunoa ma se afaina, faatasi ai ma faamaoniga. Ona latou ta'u mai lea ia i matou

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;

Ia, o tagata uma e amata galulue faʻatasi ma MTProto e tatau ona feagai ma i latou i le "faʻasaʻoina - toe tuʻufaʻatasia - faʻalauiloa" taamilosaga, o le mauaina o numera sese poʻo le masima na mafai ona leaga i taimi o faʻataʻitaʻiga o se mea masani. Ae ui i lea, e lua manatu iinei:

  1. O lona uiga ua leiloa le uluai savali. E tatau ona tatou faia ni laina, o le a tatou vaʻai i ai mulimuli ane.
  2. O a nei numera sese uiga ese? 16, 17, 18, 19, 20, 32, 33, 34, 35, 48, 64... o fea o iai isi numera, Tommy?

O loʻo faʻapea mai le pepa:

O le faʻamoemoe o le error_code values ​​​​e tuʻufaʻatasia (error_code >> 4): mo se faʻataʻitaʻiga, o tulafono laiti 0x40 - 0x4f e fetaui ma mea sese i le faʻaleagaina o pusa.

ae, muamua, o se suiga i le isi itu, ma lona lua, e le afaina, o fea oi ai isi code? I le ulu o le tusitala?.. Ae peitai, o mea laiti nei.

O vaisu e amata i savali e uiga i tulaga o savali ma kopi o feʻau:

  • Talosaga mo Fa'amatalaga Tulaga Fe'au
    Afai e le'i maua e se tasi itu se fa'amatalaga i le tulaga o ana fe'au o lo'o alu atu mo sina taimi, e mafai ona ia talosagaina ma le manino mai le isi itu:
    msgs_state_req#da69fb52 msg_ids:Vector long = MsgsStateReq;
  • Fa'amatalaga Fa'amatalaga e uiga i Tulaga o Savali
    msgs_state_info#04deb57d req_msg_id:long info:string = MsgsStateInfo;
    O iinei, info ose manoa o lo'o i ai tonu le tasi paita o le tulaga o fe'au mo fe'au ta'itasi mai le lisi o msg_ids e sau:

    • 1 = e leai se mea e iloa e uiga i le feʻau (msg_id e maualalo tele, atonu ua galo i le isi itu)
    • 2 = feʻau e leʻi mauaina (msg_id e pa'ū i totonu o le tele o faʻamatalaga teu; peitaʻi, o le isi itu e mautinoa lava e leʻi mauaina se feʻau faʻapea)
    • 3 = feʻau e leʻi mauaina (msg_id maualuga tele; peitaʻi, e mautinoa lava e leʻi mauaina e le isi vaega)
    • 4 = fe'au maua (ia maitauina o lenei tali o lo'o i le taimi lava e tasi o se lisiti fa'ailoa)
    • +8 = fe'au ua uma ona fa'ailoa
    • +16 = feʻau e le manaʻomia le faʻaalia
    • +32 = RPC fesili o loʻo i totonu o le feʻau o loʻo faʻagasolo poʻo le gaioiga ua maeʻa
    • +64 = tali e feso'ota'i i mataupu ile fe'au ua uma ona fa'atupuina
    • +128 = ua iloa e isi vaega o le feʻau ua uma ona maua
      O lenei tali e le mana'omia se fa'ailoa. O se faailoaga o le msgs_state_req talafeagai, i totonu ma ia lava.
      Manatua afai e faʻafuaseʻi ona faʻaalia e leai se feʻau a le isi vaega e foliga mai na lafo i ai, e mafai lava ona toe lafoina le feʻau. E tusa lava pe tatau ona maua e le isi vaega ni kopi se lua o le savali i le taimi e tasi, o le a le amanaiaina le kopi. (Afai ua tele naua le taimi ua mavae, ma ua le toe aoga le msg_id muamua, e ao ona afifi le fe'au i le msg_copy).
  • Feso'ota'iga Tauofo o Tulaga o Feau
    E mafai e so'o se itu'au ona fa'ailoa atu i le isi itu le tulaga o fe'au o lo'o fa'asalalauina e le isi itu.
    msgs_all_info#8cc0d131 msg_ids:Vector long info:string = MsgsAllInfo
  • Fa'alautele Feso'ota'iga Tauofo ole Tulaga o le Fe'au Tasi
    ...
    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;
  • Talosaga manino e Toe Lafo Feau
    msg_resend_req#7d861a08 msg_ids:Vector long = MsgResendReq;
    O le pati mamao e vave tali mai e ala i le toe lafoina o feʻau talosaga [...]
  • Talosaga manino e Toe Lafo Tali
    msg_resend_ans_req#8610baeb msg_ids:Vector long = MsgResendReq;
    O le pati mamao e vave tali mai e ala i le toe lafoina tali i feʻau na talosagaina […]
  • Kopi Feau
    I nisi tulaga, o se fe'au tuai ma se msg_id ua le toe aoga e mana'omia ona toe lafo. Ona afifi lea i totonu o se pusa kopi:
    msg_copy#e06046b2 orig_message:Message = MessageCopy;
    O le taimi lava e maua ai, e faʻagasolo le feʻau e pei e le o iai le afifi. Ae peita'i, afai e iloa ma le mautinoa na maua le fe'au orig_message.msg_id, ona le fa'agaioia lea o le fe'au fou (ae i le taimi lava e tasi, e talia ma orig_message.msg_id). Ole tau ole orig_message.msg_id e tatau ona la'ititi nai lo le msg_id ole container.

Sei o tatou faalologo i le mea msgs_state_info toe pipii mai taliga o le TL e leʻi maeʻa (matou te manaʻomia se vector of bytes, ma i le pito i lalo e lua sa i ai se enum, ma i luga o le lua pito maualuga sa i ai fuʻa). E ese le manatu. E i ai se tasi e malamalama pe aisea ua faia ai nei mea uma? i se tagata fa'atau moni talafeagai?.. Faatasi ai ma le faigata, ae e mafai e se tasi ona mafaufau i se manuia pe afai o se tagata o loʻo auai i le debugging, ma i se faiga faʻafesoʻotaʻi - fesili i le server pe o le a ma pe faʻafefea. Ae o loʻo faʻamatalaina ai talosaga malaga toe foi.

E mulimuli mai e tatau i pati taʻitasi e le gata ina faʻapipiʻi ma auina atu feʻau, ae ia teuina faʻamatalaga e uiga ia i latou lava, e uiga i tali ia i latou, mo se taimi e le iloa. E le o fa'amatalaina e le fa'amaumauga le taimi po'o le fa'atinoina o nei vaega. leai se auala. O le mea e sili ona ofoofogia o loʻo faʻaaogaina moni i le tulafono a tagata faʻatau aloaia! E foliga mai na taʻuina atu ia i latou se mea e le o aofia ai i faʻamaumauga lautele. Malamalama mai le code aisea, e le o toe faigofie e pei o le TL - e le o se (relatively) vaega vavae ese, ae o se vaega e noatia i le fausaga o talosaga, i.e. e mana'omia le tele o le taimi e malamalama ai i le numera o talosaga.

Pings ma taimi. Tuli.

Mai mea uma, pe a tatou manatua le matematega e uiga i le fausaga o le 'auʻaunaga (tufatufaina o talosaga i tua atu), o se mea e sili ona faanoanoa e mulimuli mai - e ui lava i faʻamaoniga uma o le tuʻuina atu i le TCP (pe tuʻuina atu faʻamatalaga, pe o le a logoina oe e uiga i le va, ae o faʻamatalaga o le a tuʻuina atu aʻo leʻi tupu le faʻafitauli), o faʻamaoniga i MTProto lava ia - leai ni fa'amaoniga. E faigofie lava ona leiloa pe lafo lau fe'au le 'au'aunaga, ma e leai se mea e mafai ona fai, na'o le fa'aaogaina o ituaiga tootoo eseese.

Ae muamua lava - laina fe'au. Ia, faatasi ai ma le mea e tasi na manino mai lava i le amataga - o se feʻau e leʻi faʻamaonia e tatau ona teuina ma le fiafia. Ma o le a le taimi? Ma e iloa o ia e le tagata ula. Masalo o na feʻau tautua ua fai ma vaisu e foia ai lenei faʻafitauli i tootoo, fai mai, i Telegram Desktop e tusa ma le 4 laina e fetaui ma i latou (atonu e sili atu, e pei ona uma ona taʻua, mo lenei mea e tatau ona e suʻesuʻeina lona tulafono ma le fausaga faʻapitoa; i le tutusa taimi, matou te iloa e le mafai ona avea o se faʻataʻitaʻiga o se numera o ituaiga mai le polokalame MTProto e le faʻaaogaina i totonu).

Aisea ua tupu ai lenei mea? Masalo, na le mafai e le au fai polokalame ona faʻamautinoa le faʻamaoni i totonu o le fuifui, poʻo le paʻu i luga o le paleni pito i luma, ma tuʻuina atu lenei faʻafitauli i le kalani. Ona o le faʻanoanoa, na taumafai ai Vasily e faʻatino se isi filifiliga, e naʻo le lua laina, e faʻaaoga ai algorithms mai le TCP - fuaina le RTT i le 'auʻaunaga ma fetuunai le tele o le "faʻamalama" (i feʻau) e faʻatatau i le numera o talosaga e leʻi faʻamaonia. O lona uiga, o se faʻailoga faigata mo le suʻesuʻeina o le uta a le server o le tele oa tatou talosaga e mafai ona lamu i le taimi e tasi ma e le leiloa.

Ia, o lona uiga, e te malamalama, a ea? Afai e tatau ona e toe faʻaaogaina le TCP i luga o se faʻasologa o loʻo faʻaogaina i luga ole TCP, o loʻo faʻaalia ai se faiga e matua le lelei le fuafuaina.

Ioe ioe, aisea e te manaʻomia ai le sili atu ma le tasi le laina, ma o le a le uiga o lenei mea mo se tagata o loʻo galue i se API maualuga? Vaai, e te faia se talosaga, faʻasalalau, ae masani ona le mafai ona e lafoina vave. Aisea? Aua o le a tali msg_id, e lē tumauаO aʻu o se igoa, o le tofiga e sili ona tolopoina seʻia oʻo i le tuai e mafai ai - i le tulaga e teʻena e le 'auʻaunaga ona o le le fetaui o le taimi i le va oi tatou ma ia (ioe, e mafai ona tatou faia se tootoo e suia ai o tatou taimi mai le taimi nei. i le 'au'aunaga e ala i le fa'aopoopoina o se delta fa'atatau mai tali a le 'au'aunaga - e faia e tagata aloa'ia lenei mea, ae e leaga ma le sa'o ona o le pa'u). O le mea lea, pe a e faia se talosaga ma se telefoni faʻapitonuʻu mai le faletusi, o le feʻau e alu i laʻasaga nei:

  1. O lo'o taoto i le laina e tasi ma fa'atali le fa'ailoga.
  2. Tofia msg_id ma o le fe'au na alu i se isi laina - e mafai ona lafo atu; lafo i le socket.
  3. a) Na tali mai le 'auʻaunaga i le MsgsAck - na tuʻuina atu le feʻau, matou te tapeina mai le "isi laina".
    b) Po o le isi itu, na te le fiafia i se mea, na ia tali mai leaga - toe lafo mai le "isi laina"
    i) E leai se mea e iloa, e mana'omia le fe'au mai se isi laina - ae e le o iloa tonu le taimi.
  4. Na iu lava ina tali mai le server RpcResult - o le tali moni (poʻo le mea sese) - e le naʻo le tuʻuina atu, ae faʻapea foʻi ona faʻatautaia.

Masalo, o le fa'aogaina o pusa e mafai ona fo'ia ai le fa'afitauli. O le taimi lea e faʻapipiʻi ai le tele o feʻau i le tasi, ma tali mai le 'auʻaunaga ma se faʻamaoniga ia i latou uma i le taimi e tasi, i le tasi. msg_id. Ae o le a ia teena foi lenei pusa, pe a iai se mea na faaletonu, i lona atoaga.

Ma o le taimi lea e amata ai ona fa'atino mafaufauga e le fa'apitoa. Mai le poto masani, ua tatou vaʻaia le tele o tootoo, ma e le gata i lea, o le a tatou vaʻai nei i nisi faʻataʻitaʻiga o fautuaga leaga ma le fausaga - i ia tulaga, pe aoga le faʻatuatuaina ma faia ia filifiliga? O le fesili o le tautala (ioe e leai).

O le a le mea o loo tatou talanoa ai? Afai i luga o le autu o le "vailaau feʻau e uiga i feʻau" e mafai lava ona e taumatemate ma teteʻe e pei o le "e valea, e te leʻi malamalama i la matou fuafuaga atamai!" (ia tusi muamua le faʻamaumauga, e pei ona tatau i tagata masani, faʻatasi ai ma faʻamatalaga ma faʻataʻitaʻiga o fefaʻatauaiga o pepa, ona tatou talanoa lea), ona taʻua lea o taimi / taimi o se fesili faʻapitoa ma faʻapitoa, o mea uma iinei ua iloa mo se taimi umi. O le a le mea o loʻo taʻu mai e le faʻamaumauga ia i matou e uiga i taimi malolo?

E masani ona fa'ailoa e le 'au'aunaga le mauaina o se fe'au mai le kalani (masani, o se fesili RPC) e fa'aaoga ai se tali a le RPC. Afai o se tali e umi se taimi e oʻo mai ai, e mafai e le 'auʻaunaga ona lafo muamua se lisiti faʻamaonia, ma mulimuli ane, o le tali a le RPC lava ia.

E masani lava ona fa'ailoa e le tagata o tausia le mauaina o se fe'au mai se 'au'aunaga (e masani lava, o se tali a le RPC) e ala i le fa'aopoopoina o se fa'aaliga i le isi fesili a le RPC pe a le tuai ona tu'uina atu (pe a fai, fai mai, 60-120 sekone pe a mae'a le lisiti. o se savali mai le server). Ae peitaʻi, afai mo se taimi umi e leai se mafuaʻaga e lafo ai feʻau i le 'auʻaunaga pe afai o loʻo i ai se numera tele o feʻau e leʻi faʻaalia mai le 'auʻaunaga (fai mai, sili atu i le 16), e tuʻuina atu e le kalani se faʻamaoniga tutoʻatasi.

... Ou te faaliliu: o i tatou lava tatou te le iloa po o le a le tele ma pe faapefea foi ona tatou manaomia, ia tatou manatu e faapea e faapea.

Ma e uiga i pings:

Ping Fe'au (PING/PONG)

ping#7abe77ec ping_id:long = Pong;

E masani ona toe fa'afo'i se tali i le feso'ota'iga lava e tasi:

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

O nei fe'au e le mana'omia ni fa'ailoga. O le pong e na'o le tali atu i se ping ae mafai ona amataina se ping i itu uma e lua.

Tapuni So'oga Fa'atuai + PING

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

E galue e pei o le ping. E le gata i lea, a maeʻa ona maua lenei mea, e amata e le 'auʻaunaga se taimi e tapunia ai le fesoʻotaʻiga o loʻo i ai nei disconnect_delay sekone mulimuli ane seʻi vagana ua maua se feʻau fou o le ituaiga tutusa lea e otometi ona toe setiina taimi muamua. Afai e auina atu e le kalani nei pings tasi i le 60 sekone, mo se faʻataʻitaʻiga, e mafai ona seti le disconnect_delay e tutusa ma le 75 sekone.

E te valea?! I le 60 sekone, o le a ulufale le nofoaafi i le nofoaga, tuʻu ese ma piki pasese, ma toe leiloa le fesoʻotaʻiga i le alavai. I le 120 sekone, a'o e fa'alogo i ai, o le a o'o mai i le isi, ma e foliga mai e motusia le feso'ota'iga. Ia, e manino lava le mea e sau ai vae - "Na ou faʻalogo i se tatagi, ae ou te le iloa poʻo fea", o loʻo i ai le algorithm a Nagl ma le TCP_NODELAY filifiliga, faʻamoemoe mo galuega fefaʻasoaaʻi. Ae fa'amolemole, taofi mau i lona tau fa'aletonu - 200 Milisekone Afai e te manaʻo moni e faʻaalia se mea faʻatusa ma faʻasaoina i luga o ni paʻu se lua, ona tuʻu ese lea mo le 5 sekone, poʻo le a le mea o loʻo i ai le taimi o le "User is typing ...". Ae le toe iai.

Ma le mea mulimuli, pings. O lona uiga, siaki le ola o le TCP fesoʻotaʻiga. E malie, ae pe a ma le 10 tausaga talu ai na ou tusia ai se tusitusiga taua e uiga i le avefeau o le matou faiaoga - na ping e le au tusitala iina le server mai le kalani, ae le o le isi itu. Ae o tamaiti aoga 3rd tausaga o se mea e tasi, ma o se ofisa faavaomalo o le isi, saʻo?..

Muamua, o sina polokalame fa'aa'oa'oga. O se feso'ota'iga TCP, i le leai o se fa'afesuia'iga o pepa, e mafai ona ola mo vaiaso. E lelei ma leaga lenei mea, e fa'atatau i le fa'amoemoe. E lelei pe a iai sau fesoʻotaʻiga SSH tatala i le 'auʻaunaga, na e tu i luga mai le komepiuta, toe faʻafou le router, toe foʻi i lou nofoaga - e leʻi saeia le sauniga e ala i lenei 'auʻaunaga (e te leʻi taina se mea, e leai ni pepa) , e faigofie. E leaga pe a iai le faitau afe o tagata faʻatau i luga o le 'auʻaunaga, e taʻitasi le faʻaaogaina o punaoa (talofa, Postgres!), Ma atonu na toe faʻafouina le talimalo a le kalani i se taimi ua leva - ae matou te le iloa.

O faiga fa'atalanoaga/IM e pa'u'ū i le mataupu lona lua mo se tasi mafua'aga fa'aopoopo - tulaga i luga ole laiga. Afai o le tagata faʻaoga "paʻu ese", e tatau ona e logoina ana uo e uiga i lenei mea. A leai, o le ae iʻu i se mea sese na faia e le au foafoa o Jabber (ma faʻasaʻo mo le 20 tausaga) - ua motusia le tagata faʻaoga, ae o loʻo faʻaauau pea ona latou tusia ni feʻau ia te ia, ma talitonu o loʻo i luga ole laiga (lea na leiloa atoa i nei mea. ni nai minute ae le'i maua le motusia). Leai, o le TCP_KEEPLIVE filifiliga, lea e toʻatele tagata e le malamalama pe faʻafefea ona faʻaogaina taimi TCP (e ala i le faʻatulagaina o mea taua e pei o le sefulu sekone), o le a le fesoasoani iinei - e tatau ona e mautinoa e le gata o le OS kernel. o loʻo ola le masini a le tagata faʻaoga, ae o loʻo galue foi masani, i le mafai ona tali atu, ma le talosaga lava ia (e te manatu e le mafai ona faʻamaisa? Telegram Desktop i Ubuntu 18.04 froze mo aʻu e sili atu ma le tasi).

O le mea lena e tatau ai ona e ping tautua kalani, ae le o le isi itu - afai e faia e le tagata o tausia lenei mea, afai e motu le fesoʻotaʻiga, o le a le tuʻuina atu le ping, o le a le ausia le sini.

O le a le mea tatou te vaʻai i luga ole Telegram? O le faafeagai tonu lava! Ia, o lena. I le tulaga aloaia, ioe, e mafai e itu uma e lua ona ping le tasi i le isi. I le faʻatinoga, e faʻaaogaina e tagata faʻatau se tootoo ping_delay_disconnect, lea e setiina le taimi i luga o le server. Ia, faamolemole, e le o le tagata o tausia e filifili pe o le a le umi e fia nofo ai iina e aunoa ma le ping. O le 'auʻaunaga, faʻavae i luga o lana uta, e sili atu lona iloa. Ae, ioe, afai e te le mafaufau i punaoa, o le a avea oe ma au lava Pinocchio leaga, ma o se tootoo o le a faia ...

Sa tatau faapefea ona mamanuina?

Ou te talitonu o mea moni o loʻo i luga o loʻo faʻaalia manino ai o le Telegram / VKontakte team e le o matua agavaa i le tulaga o felauaiga (ma lalo ifo) tulaga o fesoʻotaʻiga komepiuta ma o latou agavaa maualalo i mataupu talafeagai.

Aisea na iʻu ai ina faigata tele, ma faʻafefea ona taumafai le au tusiata o Telegram e tetee? O le mea moni na latou taumafai e fai se sauniga e sao mai le TCP fesoʻotaʻiga motusia, o lona uiga, o le mea e leʻi tuʻuina atu nei, o le a matou tuʻuina atu mulimuli ane. Masalo na latou taumafai foi e fai se UDP felauaiga, ae na latou feagai ma faigata ma lafoaia (o le mea lea e leai ai se mea o faʻamaumauga - e leai se mea e mitamita ai). Ae ona o le leai o se malamalama i le auala o fesoʻotaʻiga lautele ma TCP i galuega faʻapitoa, lea e mafai ona e faʻalagolago i ai, ma le mea e te manaʻomia e te faia ai oe lava (ma pe faʻafefea), ma se taumafaiga e tuʻufaʻatasia lenei mea ma cryptography "lua manulele ma tasi le maa”, o le taunuuga lea.

Na faapefea ona manaomia? E faavae i luga o le mea moni e faapea msg_id o se faailoga taimi e manaʻomia mai se vaaiga cryptographic e puipuia ai le toe faia o osofaʻiga, o se mea sese le faʻapipiʻiina o se galuega faʻamaonia tulaga ese i ai. O le mea lea, e aunoa ma le suia faʻavaeina o le fausaga o loʻo i ai nei (pe a faʻatupuina le Faʻafouina o le vaitafe, o se autu maualuga API mo se isi vaega o lenei faasologa o pou), e manaʻomia e se tasi:

  1. O le server o lo'o umia le TCP feso'ota'iga i le kalani e nafa ma le matafaioi - afai na faitau mai le socket, fa'amolemole fa'ailoa, fa'agasolo pe toe fa'afo'i se mea sese, leai se mea e leiloa. Ona o le faʻamaoniga e le o se vector o ids, ae naʻo le "seq_no mulimuli na maua" - naʻo se numera, pei o le TCP (lua numera - lau seq ma le faʻamaonia). Matou te i ai pea i totonu o le sauniga, a ea?
  2. O le faailoga taimi e taofia ai le toe faia o osofa'iga ua avea ma vaega e ese mai, a la nonce. E siaki, ae le afaina ai se isi mea. Ua lava ma uint32 - afai e suia a tatou masima ia le itiiti ifo i le afa aso uma, e mafai ona tatou tuʻuina atu le 16 bits i vaega maualalo o se vaega numera o le taimi nei, o le isi - i se vaega ninii o le sekone (pei o le taimi nei).
  3. Ave'esea msg_id i mea uma - mai le tulaga o le faʻavasegaina o talosaga i tua, o loʻo i ai, muamua, le client id, ma lona lua, o le session id, faʻapipiʻi i latou. E tusa ai, na o le tasi le mea e lava e fai ma faʻamatalaga talosaga seq_no.

E le o se filifiliga sili ona manuia; e mafai ona avea se mea e iloagofie ai - ua uma ona faia i le API maualuga pe a lafoina se savali, i le ala. E sili atu le toe faʻaleleia atoatoa o le fausaga mai le fesoʻotaʻiga i le atoatoa, ae o se autu lea mo se isi vaega, ae le o lenei pou.

API?

Ta-tama! O lea la, i le tauivi ai i se ala e tumu i tiga ma tootoo, na iu lava ina mafai ona matou auina atu soʻo se talosaga i le 'auʻaunaga ma maua ni tali ia i latou, faʻapea foʻi ma le mauaina o faʻamatalaga mai le 'auʻaunaga (e le o le tali atu i se talosaga, ae o ia lava. auina mai ia i matou, pei o PUSH, pe a iai se tasi - e sili atu le manino i lena auala).

Faʻalogo, o lea o le a naʻo le pau lea o le faʻataʻitaʻiga i Perl i le tusiga! (mo i latou e le masani i le syntax, o le finauga muamua o le faʻamanuiaga o le faʻasologa o faʻamaumauga a le mea, o le lona lua o lana vasega):

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' )
};

Ioe, e le o se faʻaleagaina i le faʻamoemoe - afai e te leʻi faitauina, alu i luma ma fai!

Oi, uai~~... o le a le foliga o lenei mea? O se mea e sili ona masani ... masalo o le faʻamaumauga lea o se Web API masani i le JSON, sei vagana ai vasega o loʻo faʻapipiʻi foi i mea faitino?..

O le mea la lea ua tupu mai ai... O le a le mea e uiga i ai, uo?.. Le tele o le taumafaiga - ma sa matou malolo e malolo i le mea e fai ai le upega tafaʻilagi. faatoa amata?..E le na o JSON i luga o HTTPS e faigofie atu?! O le a le mea na tatou maua e sui ai? Pe sa aoga le taumafaiga?

Sei o tatou iloiloina mea na tuʻuina mai e TL+MTProto ia i matou ma poʻo a isi mea e mafai. Ia, HTTP, lea e taulaʻi i le faʻataʻitaʻiga talosaga-tali, o se mea le lelei, ae o se mea i luga ole TLS?

Fa'asologa fa'atasi. I le vaʻaia o lenei faʻasologa o faʻamaumauga, e tutusa ma le JSON, ou te manatua o loʻo i ai faʻamatalaga binary. Sei o tatou faailoga MsgPack e le lava le faʻalauteleina, ae o loʻo i ai, mo se faʻataʻitaʻiga, CBOR - i le ala, o se tulaga faʻamatalaina i totonu. RFC 7049. E iloga mo le mea moni e faʻamatalaina faʻailoga, e avea o se faiga faʻalauteleina, ma i totonu ua uma ona faalaugatasia avanoa:

  • 25 + 256 - suia laina faifaipea ma se faʻamatalaga i le numera laina, o se auala taugofie faʻamalosi
  • 26 - fa'asologa o mea Perl ma igoa o le vasega ma finauga faufale
  • 27 - fa'asologa o le gagana-tuto'atasi mea ma le igoa ituaiga ma fa'aupuga finauga

Ia, na ou taumafai e faʻasalalau faʻamaumauga tutusa i le TL ma le CBOR faʻatasi ai ma le manoa ma mea faʻapipiʻi mafai. O le taunuuga na amata ona fesuisuiai e fiafia i le CBOR i se mea mai le megabyte:

cborlen=1039673 tl_len=1095092

Ma o lea, faaiuga: O loʻo i ai faʻamatalaga sili atu ona faigofie e le afaina i le faʻafitauli o le faʻaogaina o le faʻaogaina poʻo le iloagofie, ma faʻatusatusa le lelei.

Fa'avae feso'ota'iga vave. O lona uiga e leai se RTT pe a uma ona toe faʻafesoʻotaʻi (pe a uma ona faʻatupuina le ki e tasi) - e faʻatatau mai le savali muamua MTProto, ae faʻatasi ai ma nisi faʻaagaga - taia le masima tutusa, e le pala le sauniga, ma isi. O le a le mea e ofoina mai e le TLS ia i tatou? Fa'amatalaga ile autu:

A faʻaaoga le PFS i TLS, TLS tiketi sauniga (RFC 5077) e toe amata se sauniga faʻailoga e aunoa ma le toe faʻatalanoaina ki ma aunoa ma le teuina o faʻamatalaga autu i luga o le server. Pe a tatalaina le fesoʻotaʻiga muamua ma fatuina ki, e faʻapipiʻi e le 'auʻaunaga le tulaga fesoʻotaʻiga ma tuʻuina atu i le kalani (i le tulaga o se tiketi sauniga). E tusa ai, pe a toe faʻaauau le fesoʻotaʻiga, e auina atu e le kalani se tiketi o le sauniga, e aofia ai le ki o le sauniga, toe foʻi i le server. O le pepa lava ia o lo'o fa'ailogaina i se ki le tumau (sesion ticket key), o lo'o teuina i luga o le 'au'aunaga ma e tatau ona tufatufa atu i fa'aumau pito i luma uma o lo'o fa'aogaina le SSL i fofo fa'apipi'i.[10]. O le mea lea, o le faʻaofiina o se tiketi o le sauniga e mafai ona solia ai le PFS pe a faʻafefeina ki le tumau, mo se faʻataʻitaʻiga, pe a teuina mo se taimi umi (OpenSSL, nginx, Apache teuina i latou e ala i le faaletonu mo le umi atoa o le polokalame; faʻaoga nofoaga lauiloa. le ki mo ni nai itula, e oo atu i aso).

O iinei o le RTT e le o se mea, e tatau ona e fesuiai a itiiti mai ClientHello ma ServerHello, a maeʻa ona mafai lea e le tagata o tausia ona auina atu faʻamatalaga faʻatasi ma Faʻauma. Ae o iinei e tatau ona tatou manatua e le o ia i tatou le Upega Tafaʻilagi, faʻatasi ai ma le tele o fesoʻotaʻiga fou na tatalaina, ae o se avefeau, o le fesoʻotaʻiga e masani ona tasi ma sili atu pe itiiti ifo le umi, talosaga pupuu i itulau Upega - mea uma e telexed. totonu. O lona uiga, e matua talia lava pe a tatou le maua se vaega leaga tele i lalo ole auala.

Ua galo se isi mea? Tusi i fa'amatalaga.

Ia toe faauau!

I le vaega lona lua o lenei faasologa o pou o le a tatou mafaufau e le o mea faʻapitoa, ae faʻalapotopotoga faʻalapotopotoga - auala, manatu, atinaʻe, uiga i tagata faʻaoga, ma isi. Faʻavae, peitaʻi, i luga o faʻamatalaga faʻapitoa na tuʻuina atu iinei.

O le vaega lona tolu o le a faʻaauau le suʻeina o le vaega faʻapitoa / atinaʻe poto masani. O le a e aʻoaʻoina, aemaise lava:

  • faʻaauauina o le pandemonium ma le tele o ituaiga TL
  • mea e le iloa e uiga i auala ma supergroups
  • aisea e sili atu ai le leaga o talanoaga nai lo le lisi
  • e uiga i fa'amatalaga fe'au fa'atasi vs fa'atatau
  • o le a le eseesega i le va o le ata ma le ata
  • fa'afefea ona fa'alavelave le emoji i tusitusiga fa'amau

ma isi tootoo! Fa'aauau pea!

puna: www.habr.com

Faaopoopo i ai se faamatalaga