Nkatọ nke protocol na usoro nhazi nke Telegram. Akụkụ 1, teknụzụ: ahụmịhe nke ide onye ahịa site na ọkọ - TL, MT

N'oge na-adịbeghị anya, posts banyere otú Telegram si dị mma, otú ụmụnna Durov si na-egbuke egbuke na ndị nwere ahụmahụ na-ewu usoro netwọk, wdg amalitela ịpụta ugboro ugboro na Habré. N'otu oge ahụ, ọ bụ naanị mmadụ ole na ole etinyela onwe ha na teknụzụ teknụzụ - kacha, ha na-eji ngwa dị mfe (ma dị iche na MTProto) Bot API dabere na JSON, ma na-anabatakarị. na okwukwe otuto na PR niile na-agbagharị gburugburu onye ozi. Ihe fọrọ nke nta ka ọ bụrụ otu afọ na ọkara gara aga, onye ọrụ ibe m na Eshelon NGO Vasily (ọ dabara nke ọma, ehichapụ akaụntụ ya na Habré tinyere akwụkwọ) malitere ide onye ahịa Telegram nke ya site na mbụ na Perl, ma emesịa onye edemede nke ahịrị ndị a sonye. Gịnị kpatara Perl, ụfọdụ ga-ajụ ozugbo? N'ihi na ọrụ ndị dị otú ahụ adịlarị n'asụsụ ndị ọzọ.N'ezie, nke a abụghị isi okwu, enwere ike inwe asụsụ ọ bụla ọzọ na-enweghị. ọbá akwụkwọ akwadoro, na ya mere onye edemede ga-agarịrị n'ụzọ niile site ọkọ. Ọzọkwa, cryptography bụ ihe gbasara ntụkwasị obi, mana chọpụta. Site na ngwaahịa ezubere maka nchekwa, ị nweghị ike ịdabere naanị n'ọbá akwụkwọ emebere nke sitere n'aka onye nrụpụta wee tụkwasị ya obi na nzuzo (agbanyeghị, nke a bụ isiokwu maka akụkụ nke abụọ). N'oge a, ọbá akwụkwọ na-arụ ọrụ nke ọma na ọkwa "nkezi" (na-enye gị ohere ịme arịrịọ API ọ bụla).

Agbanyeghị, a gaghị enwe nnukwu mkpuchi ma ọ bụ mgbakọ na mwepụ na nsonso edemede a. Ma a ga-enwe ọtụtụ nkọwa teknụzụ ndị ọzọ na crutches ụkpụrụ ụlọ (ọ bara uru maka ndị na-agaghị ede site na ọkọ, mana ha ga-eji ọbá akwụkwọ n'asụsụ ọ bụla). Ya mere, isi ihe mgbaru ọsọ bụ ịgbalị mejuputa onye ahịa site na ọkọ dị ka akwụkwọ gọọmentị si kwuo. Ya bụ, ka anyị chee na a na-emechi koodu isi iyi nke ndị ahịa ọrụ (ọzọ, na akụkụ nke abụọ anyị ga-ekpuchi n'ụzọ zuru ezu isiokwu nke eziokwu ahụ bụ eziokwu. eme Ya mere), mana, dị ka ọ dị n'oge ochie, dịka ọmụmaatụ, enwere ọkọlọtọ dị ka RFC - enwere ike ide onye ahịa dịka nkọwapụta naanị, "na-eleghị anya" na koodu isi mmalite, ọ bụrụ na ọ bụ onye ọrụ (Telegram Desktop, mobile), ma ọ bụ Telethon na-akwadoghị?

Tebulu ọdịnaya:

Akwụkwọ... ọ dị, nri? Ọ bụ eziokwu?..

A malitere ịnakọta iberibe ihe ndetu maka akụkọ a n'oge okpomọkụ gara aga. Oge a niile na webụsaịtị gọọmentị https://core.telegram.org Akwụkwọ ahụ dị ka nke Layer 23, i.e. rapaara ebe na 2014 (cheta, ọ dịghị ọbụna ọwa n'oge ahụ?). N'ezie, na tiori, nke a kwesịrị ikwe ka anyị mejuputa onye ahịa nwere ọrụ n'oge ahụ na 2014. Ma ọbụna na steeti a, akwụkwọ ahụ bụ, nke mbụ, ezughị ezu, na nke abụọ, n'ebe ọ na-emegide onwe ya. Naanị ihe karịrị otu ọnwa gara aga, na Septemba 2019, ọ bụ na mberede Achọpụtara na enwere mmelite dị ukwuu nke akwụkwọ ahụ na saịtị ahụ, maka Layer 105 na-adịbeghị anya, na-ede na ugbu a ihe niile kwesịrị ịgụ ọzọ. N'ezie, e degharịrị ọtụtụ isiokwu, ma ọtụtụ agbanwebeghị. Ya mere, mgbe ị na-agụ nkatọ n'okpuru banyere akwụkwọ ahụ, ị ​​kwesịrị iburu n'uche na ụfọdụ n'ime ihe ndị a adịghịzi mkpa, ma ụfọdụ ka dị mma. E kwuwerị, afọ 5 na ụwa nke oge a abụghị naanị ogologo oge, ma nnọọ ọtụtụ n'ime. Ebe ọ bụ na oge ndị ahụ (karịsịa ma ọ bụrụ na ị naghị eburu n'uche saịtị geochat tụfuru na nke eweghachitere kemgbe ahụ), ọnụ ọgụgụ nke usoro API na atụmatụ ahụ etoola site na otu narị ruo ihe karịrị narị abụọ na iri ise!

Ebee ka ịmalite dị ka onye edemede na-eto eto?

Ọ baghị uru ma ị na-ede site na ọkọ ma ọ bụ jiri, dịka ọmụmaatụ, ụlọ akwụkwọ ndị emebere dị ka Telethon maka Python ma ọ bụ Madeline maka PHP, na nke ọ bụla, ị ga-mkpa mbụ debanye aha ngwa gị - nweta parameters api_id и api_hash (ndị na-arụ ọrụ na VKontakte API ozugbo ghọtara) nke ihe nkesa ga-achọpụta ngwa ahụ. Nke a ga-eme mee ya maka ihe gbasara iwu, mana anyị ga-ekwukwu maka ihe kpatara ndị ode akwụkwọ ọbá akwụkwọ enweghị ike ibipụta ya n'akụkụ nke abụọ. Ị nwere ike inwe afọ ojuju na ụkpụrụ ule, ọ bụ ezie na ha dị oke - nke bụ eziokwu bụ na ugbu a ị nwere ike ịdebanye aha naanị onye ngwa, yabụ etinyela ngwa ngwa banye na ya.

Ugbu a, site na echiche teknụzụ, anyị kwesịrị inwe mmasị na eziokwu ahụ bụ na mgbe ị debanyere aha anyị kwesịrị ịnata ọkwa sitere na Telegram banyere mmelite na akwụkwọ, protocol, wdg. Nke ahụ bụ, mmadụ nwere ike iche na a gbahapụrụ saịtị ahụ nwere ọdụ ụgbọ mmiri ma nọgide na-arụ ọrụ kpọmkwem na ndị malitere ime ndị ahịa, n'ihi na. ọ dị mfe. Ma mba, ọ dịghị ihe dị ka nke a hụrụ, ọ dịghị ozi bịara.

Ma ọ bụrụ na ị na-ede si ọkọ, mgbe ahụ iji nweta parameters bụ n'ezie ka a ogologo ụzọ pụọ. Agbanyeghị https://core.telegram.org/ ma na-ekwu maka ha na mmalite nke mbụ, n'eziokwu, ị ga-ebu ụzọ mejuputa Usoro MTProto - ma ọ bụrụ na ị kwere okirikiri nhọrọ ukwuu dị ka OSI nlereanya na njedebe nke ibe maka nkọwa zuru ezu nke protocol, mgbe ahụ ọ bụ kpamkpam n'efu.

N'ezie, ma tupu na mgbe MTProto, n'ọtụtụ ọkwa n'otu oge (dị ka ndị ọrụ netwọk mba ọzọ na-arụ ọrụ na kernel OS na-ekwu, mmebi oyi akwa), nnukwu isiokwu na-egbu mgbu na egwu ga-abanye n'ụzọ ...

Usoro ọnụọgụ abụọ: TL (Asụsụ Ụdị) na atụmatụ ya, na ọkwa ya, na ọtụtụ okwu ndị ọzọ na-atụ egwu.

Isiokwu a, n'ezie, bụ isi ihe kpatara nsogbu Telegram. A ga-enwekwa ọtụtụ okwu jọgburu onwe ya ma ọ bụrụ na ị na-agbalị ịbanye n'ime ya.

Yabụ, ebe a bụ eserese ahụ. Ọ bụrụ na okwu a batara gị n'obi, sị: Usoro nke JSON, I chere nke ọma. Ebumnobi bụ otu ihe ahụ: ụfọdụ asụsụ iji kọwaa data enwere ike ibufe. Nke a bụ ebe myirịta na-akwụsị. Ọ bụrụ na site na ibe Usoro MTProto, ma ọ bụ site na isi iyi nke onye ahịa ọrụ, anyị ga-agbalị imeghe ụfọdụ schema, anyị ga-ahụ ihe dị ka:

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;

Onye na-ahụ nke a maka oge mbụ ga-enwe ike ịghọta naanị akụkụ nke ihe e dere - nke ọma, ndị a bụ ihe owuwu (ọ bụ ezie na ebe aha ahụ dị, n'aka ekpe ma ọ bụ n'aka nri?), E nwere ubi n'ime ha. mgbe nke a, ụdị na-eso mgbe a colon ... eleghị anya. N'ebe a na brackets akụkụ enwere ike ịnwe ndebiri dịka na C++ (n'ezie, ọ bụchaghị). Kedu ihe akara ndị ọzọ niile pụtara, akara ajụjụ, akara mkpu, pasentị, akara hash (na o doro anya na ha pụtara ihe dị iche iche n'ebe dị iche iche), mgbe ụfọdụ na-adị ma mgbe ụfọdụ ọ bụghị, ọnụọgụ hexadecimal - na nke kachasị mkpa, otu esi enweta site na nke a. nke ziri ezi (nke ihe nkesa agaghị ajụ) iyi iyi? Ị ga-agụ akwụkwọ ahụ (ee, enwere njikọ na schema na ụdị JSON dị nso - mana nke ahụ anaghị eme ka ọ dokwuo anya).

Mepee ibe Usoro ọnụọgụ ọnụọgụ abụọ ma banye n'ime ụwa anwansi nke ero na mgbakọ na mwepụ pụrụ iche, ihe yiri mata na afọ 4th. Alphabet, ụdị, uru, ihe nchịkọta, onye na-arụ ọrụ na-arụ ọrụ, ụdị nkịtị, ụdị ihe mejupụtara, ụdị polymorphic... na nke ahụ bụ naanị ibe mbụ! Ọzọ na-echere gị Asụsụ TL, nke, n'agbanyeghị na o nwere ihe atụ nke obere arịrịọ na nzaghachi, adịghị enye azịza ma ọlị na ndị ọzọ ahụkarị ikpe, nke pụtara na ị ga-wade site a retelling nke mgbakọ na mwepụ na-asụgharị site Russian n'asụsụ Bekee na ọzọ asatọ agbakwunyere. ibe!

Ndị na-agụ maara nke ọma na asụsụ na-arụ ọrụ na akpaaka ụdị inference ga-n'ezie, na-ahụ nkọwa asụsụ n'asụsụ a, ọbụna site na ihe atụ, dị ka ọtụtụ ihe maara nke ọma, na nwere ike ikwu na nke a bụ n'ezie adịghị njọ na ụkpụrụ. Ihe mgbochi na nke a bụ:

  • ee, nzube dị mma, mana Ewoo, ọ enwetaghị ya
  • Education na Russian mahadum dịgasị ọbụna n'etiti IT specialties - ọ bụghị onye ọ bụla ewerela kwekọrọ ekwekọ N'ezie
  • N'ikpeazụ, dị ka anyị ga-ahụ, na omume ọ bụ adịghị achọrọ, ebe ọ bụ na a na-eji naanị obere akụkụ nke ọbụna TL nke akọwara

Dị ka kwuru LeoNerd na ọwa #perl na netwọọdụ FreeNode IRC, onye nwara mejuputa ọnụ ụzọ si Telegram gaa na Matrix (nsụgharị okwu ahụ ezighi ezi site na ebe nchekwa):

Ọ dị ka a webatara mmadụ ka ọ pịnye tiori na nke mbụ, nwee obi ụtọ, wee malite ịgbalị iji ya gwuo egwu, na-echeghị n'ezie ma ọ dị mkpa na omume.

Hụ onwe gị, ma ọ bụrụ na mkpa maka iferi-ụdị (int, ogologo, wdg) dị ka ihe elementrị anaghị ajụ ajụjụ - n'ikpeazụ ha ga-emejuputa atumatu - dịka ọmụmaatụ, ka anyị gbalịa na-enweta site na ha. vector. Ya bụ, n'ezie, n'usoro, ma ọ bụrụ na ị na-akpọ ihe ndị na-esi na aha ha kwesịrị ekwesị.

Ma tupu

Nkọwa dị mkpirikpi nke ntinye nke TL syntax maka ndị na-agụghị akwụkwọ gọọmentị

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;

Nkọwa na-amalite mgbe niile onye rụrụ ya, mgbe nke a optionally (na omume - mgbe niile) site akara # ga- MBA 32 site na normalized nkọwa eriri ụdị nke a. Ọzọ na-abịa nkọwa nke ubi; ọ bụrụ na ha dị, ụdị nwere ike ịbụ ihe efu. Ihe a niile na-ejedebe na akara nha anya, aha ụdị nke onye nrụpụta a - ya bụ, n'eziokwu, subtype - bụ. Nwoke ahụ n'aka nri nke akara nha nhata bụ polymorphic - ya bụ, ọtụtụ ụdị kpọmkwem nwere ike ịdekọrịta ya.

Ọ bụrụ na nkọwa ahụ emee mgbe ahịrị ahụ gasịrị ---functions---, mgbe ahụ, syntax ga-anọgide na-abụ otu, ma ihe ọ pụtara ga-adị iche: onye na-arụ ọrụ ga-abụ aha nke RPC ọrụ, ubi ga-aghọ paramita (nke ọma, ya bụ, ọ ga-anọgide kpọmkwem otu nyere Ọdịdị, dị ka akọwara n'okpuru ebe a). , nke a ga-abụ naanị ihe e kenyere ya), yana “ụdị polymorphic” - ụdị nsonaazụ eweghachiri. N'ezie, ọ ka ga-anọgide na polymorphic - dị nnọọ kọwaa na ngalaba ---types---, ma a gaghị atụle onye nrụpụta a. Na-ebufe ụdị ọrụ a na-akpọ site na arụmụka ha, ya bụ. Maka ihe ụfọdụ, a naghị enye ọtụtụ ọrụ nwere otu aha mana mbinye aka dị iche iche, dị ka ọ dị na C++ na TL.

Kedu ihe kpatara "ihe nrụpụta" na "polymorphic" ma ọ bụrụ na ọ bụghị OOP? Ọfọn, n'ezie, ọ ga-adịrị mmadụ mfe iche echiche banyere nke a na OOP okwu - a polymorphic ụdị dị ka ihe nkịtị klas, na constructors bụ ya kpọmkwem ụmụ klas, na. final n'okwu okwu nke ọtụtụ asụsụ. N'ezie, n'ezie, ebe a naanị myirịta nwere ezigbo ụzọ nrụpụta ihe karịrị akarị n'asụsụ mmemme OO. Ebe ọ bụ na ebe a bụ naanị data owuwu, ọ dịghị ụzọ (ọ bụ ezie na nkọwa nke ọrụ na ụzọ n'ihu bụ nnọọ ike nke na-eke mgbagwoju anya na isi na ha dị, ma nke ahụ bụ ihe dị iche iche) - ị nwere ike na-eche nke a constructor dị ka uru si nke a na-ewu pịnye mgbe ị na-agụ iyi byte.

Kedu ka nke a si eme? Deserializer, nke na-agụ 4 bytes mgbe niile, na-ahụ uru 0xcrc32 - ma ghọta ihe ga-eme na-esote field1 na ụdị int, i.e. na-agụ kpọmkwem 4 bytes, na nke a na overlying ubi na ụdị PolymorType gụọ. Na-ahụ 0x2crc32 ma ghọta na enwere mpaghara abụọ n'ihu, nke mbụ long, nke pụtara na anyị na-agụ 8 bytes. Na ọzọ a mgbagwoju ụdị, nke deserialized n'otu ụzọ ahụ. Ọmụmaatụ, Type3 enwere ike ikwuwapụta na sekit ozugbo ndị nrụpụta abụọ, n'otu n'otu, mgbe ahụ, ha ga-ezute nke ọ bụla 0x12abcd34, mgbe nke ahụ gasịrị ịkwesịrị ịgụ 4 ọzọ bytes int, ma ọ bụ 0x6789cdef, mgbe nke a ga-enwe ihe ọ bụla. Ihe ọ bụla ọzọ - ịkwesịrị ịtụfu ihe dị iche. Ka o sina dị, mgbe nke a gasịrị, anyị na-alaghachi na-agụ 4 bytes int ubi field_c в constructorTwo na anyị na-agụcha anyị PolymorType.

N'ikpeazụ, ọ bụrụ na ejide gị 0xdeadcrc n'ihi na constructorThree, mgbe ahụ, ihe niile na-aghọ ihe mgbagwoju anya. Ebe mbụ anyị bụ bit_flags_of_what_really_present na ụdị # - N'ezie, nke a bụ naanị utu aha maka ụdị nat, nke pụtara "nọmba nkịtị". Nke ahụ bụ, n'ezie, int na-edeghị akwụkwọ bụ, n'ụzọ, naanị ikpe mgbe ọnụọgụ na-edeghị aha na-eme na sekit n'ezie. Ya mere, na-esote bụ ihe owuwu nke nwere akara ajụjụ, nke pụtara na ubi a - ọ ga-adị na waya naanị ma ọ bụrụ na etinyere bit kwekọrọ na ubi a na-ezo aka (dị ka onye ọrụ ternary). Yabụ, ka anyị were na edobere ntakịrị a, nke pụtara na anyị kwesịrị ịgụkwu ubi dịka Type, nke na ihe atụ anyị nwere 2 constructors. Otu efu (nwere naanị njirimara), nke ọzọ nwere ubi ids na ụdị ids:Vector<long>.

Ị nwere ike iche na ma ndebiri na generics dị na uru ma ọ bụ Java. Ma mba. Fọrọ nke nta. Nke a otu ikpe nke iji brackets akụkụ na ezigbo sekit, a na-eji ya naanị maka Vector. Na iyi iyi, ndị a ga-abụ 4 CRC32 bytes maka ụdị Vector n'onwe ya, otu mgbe niile, mgbe ahụ 4 bytes - ọnụ ọgụgụ nke ihe nhazi, na ihe ndị a n'onwe ha.

Tinye na nke a eziokwu na serialization na-eme mgbe niile na okwu nke 4 bytes, ụdị niile bụ ọtụtụ ya - a na-akọwakwa ụdị arụnyere n'ime ya. bytes и string na ntuziaka serialization nke ogologo na nke a alignment site 4 - ọma, o yiri ka ụda nkịtị na ọbụna dịtụ irè? Ọ bụ ezie na a na-ekwu na TL bụ ọnụọgụ ọnụọgụ abụọ dị irè, na hel na ha, na mgbasawanye nke ihe ọ bụla, ọbụna ụkpụrụ Boolean na otu mkpụrụedemede na 4 bytes, JSON ka ga-adịkwu ogologo? Lee, ọbụlagodi ubi ndị na-enweghị isi nwere ike ịwụpụ ya na obere ọkọlọtọ, ihe niile dị mma, yana ọbụlagodi maka ọdịnihu, yabụ gịnị ma ị tinye mpaghara nhọrọ ọhụrụ na onye nrụpụta mgbe emechara?

Ma mba, ma ọ bụrụ na ị na-agụ bụghị m nkenke nkọwa, ma zuru akwụkwọ, na-eche banyere mmejuputa iwu. Nke mbụ, a na-agbakọ CRC32 nke onye nrụpụta dị ka ahịrị nkịtị nke nkọwa ederede nke atụmatụ ahụ si dị (wepụ oghere ọcha, wdg) - yabụ ọ bụrụ na etinyere ubi ọhụrụ, akara nkọwa ụdị ga-agbanwe, yabụ CRC32 na ya. , N'ihi ya, serialization. Ma gịnị ka onye ahịa ochie ahụ ga-eme ma ọ bụrụ na ọ natara ubi nwere ọkọlọtọ ọhụrụ, ma ọ maghị ihe ọ ga-eme ha ọzọ?...

Nke abuo, ka anyị cheta MBA 32, nke eji ebe a nnoo ka ọrụ hash iji chọpụta n'ụzọ pụrụ iche ụdị a na-eme (de) serialized. N'ebe a, anyị na-eche nsogbu nke esemokwu ihu - na mba, ihe gbasara nke puru omume abụghị otu n'ime 232, mana ọ ka ukwuu. Onye chetara na e mere CRC32 iji chọpụta (ma mezie) mperi na ọwa nzikọrịta ozi, yabụ na-emeziwanye ihe ndị a na-emebi ndị ọzọ? Dịka ọmụmaatụ, ọ naghị eche maka ịhazigharị bytes: ọ bụrụ na ị gbakọọ CRC32 site na ahịrị abụọ, na nke abụọ, ị ga-agbanwe nke mbụ 4 bytes na 4 bytes na-esote - ọ ga-abụ otu. Mgbe ntinye anyị bụ eriri ederede sitere na mkpụrụedemede Latin (na obere akara edemede), na aha ndị a abụghị nke enweghị usoro, ohere nke nhazigharị dị otú ahụ na-abawanye nke ukwuu.

Site n'ụzọ, onye nyochara ihe dị ebe ahụ? n'ezie CRC32? Otu n'ime koodu mmalite mmalite (ọbụlagodi tupu Waltman) nwere ọrụ hash nke mụbara agwa ọ bụla site na nọmba 239, ndị a hụrụ n'anya, ha ha!

N'ikpeazụ, ọ dị mma, anyị ghọtara na ndị na-arụ ọrụ nwere ụdị ubi Vector<int> и Vector<PolymorType> ga-enwe CRC32 dị iche iche. Kedu maka ịrụ ọrụ ịntanetị? Sitekwa n'echiche echiche, Nke a ọ na-aghọ akụkụ nke ụdị? Ka anyị kwuo na anyị gafere ọnụọgụ puku ọnụọgụ iri, nke ọma Vector<int> ihe niile doro anya, ogologo na 40000 bytes ọzọ. Gịnị ma ọ bụrụ na nke a Vector<Type2>, nke nwere naanị otu ubi int na ọ bụ naanị ya na ụdị - anyị kwesịrị ikwugharị 10000xabcdef0 34 ugboro na mgbe ahụ 4 bytes int, ma ọ bụ asụsụ ahụ nwere ike ịwepụ anyị ya n'aka onye nrụpụta fixedVec na kama 80000 bytes, nyefee ọzọ naanị 40000?

Nke a abụghị ajụjụ usoro iwu na-abaghị uru ma ọlị - were ya na ị nwetara ndepụta nke ndị ọrụ otu, onye ọ bụla nwere id, aha mbụ, aha ikpeazụ - ọdịiche dị na ọnụọgụ data ebufere na njikọ mkpanaka nwere ike ịdị ịrịba ama. Ọ bụ kpọmkwem ịdị irè nke serialization Telegram ka a na-akpọsa anyị.

Yabụ…

Vector, nke a na-ahapụbeghị

Ọ bụrụ na ị na-agbalị wagharịa site na peeji nke nkọwa nke combinators na na, ị ga-ahụ na a vector (na ọbụna a matriks) na-na-na-na-na-na-na-na-na-na-eme ka mmepụta site tuples nke ọtụtụ Ibé akwụkwọ. Ma na njedebe ha na-echefu, a na-awụpụ nzọụkwụ ikpeazụ, a na-enye nkọwa nke vector nanị, nke a na-ejikọtabeghị na ụdị. Kedu ihe ọ bụ? N'asụsụ dị iche iche mmemme, karịsịa ndị na-arụ ọrụ, ọ bụ ihe a na-ahụkarị iji kọwaa usoro ahụ ugboro ugboro - onye nchịkọta na nyocha ume ume ya ga-aghọta ma mee ihe niile n'onwe ya. N'asụsụ data serialization ihe a choro bu OKWU: o zuru oke ịkọwa ndepụta, i.e. Ọdịdị nke ihe abụọ - nke mbụ bụ ihe data, nke abụọ bụ otu ihe ahụ n'onwe ya ma ọ bụ ohere efu maka ọdụ (mkpọ. (cons) na Lisp). Mana nke a ga-achọrịrị onye obula mmewere na-etinyekwu 4 bytes (CRC32 n'ihe dị na TL) iji kọwaa ụdị ya. Enwere ike ịkọwa usoro n'usoro ngwa ngwa edozi nha, ma n'ihe banyere ọtụtụ ogologo nke a na-amaghị tupu oge eruo, anyị na-agbaji.

Ya mere, ebe ọ bụ na TL adịghị ekwe ka mmepụta vector, ọ ga-agbakwunyere n'akụkụ. N'ikpeazụ akwụkwọ ahụ kwuru:

Serialization mgbe niile na-eji otu constructor "vector" (const 0x1cb5c415 = crc32 ("vector t: Ụdị # [t] = Vector t") nke na-adabereghị na uru kpọmkwem nke mgbanwe ụdị t.

Uru nke nhọrọ nhọrọ t adịghị etinye aka na serialization ebe ọ bụ na ọ na-esite na ụdị nsonaazụ (a na-ama mgbe niile tupu deserialization).

Lebakwuo anya: vector {t:Type} # [ t ] = Vector t - ma enweghị ebe ọ bụla Nkọwa a n'onwe ya anaghị ekwu na ọnụọgụ mbụ ga-abụ nha nha ogologo nke vector! Ọ naghịkwa esi ebe ọ bụla abịa. Nke a bụ ihe e nyere nke kwesịrị iburu n'uche ma jiri aka gị mee ihe. N'ebe ọzọ, akwụkwọ ahụ na-ekwu n'eziokwu na ụdị ahụ adịghị adị:

The Vector t polymorphic pseudotype bụ "ụdị" nke uru ya bụ usoro nke ụkpụrụ nke ụdị ọ bụla t, ma igbe ma ọ bụ iferi.

... ma ọ dịghị etinye uche na ya. Mgbe ị, ike gwụrụ ị na-agagharị site na ịgbatị mgbakọ na mwepụ (ma eleghị anya ọbụna mara gị site na mahadum), kpebie ịla n'iyi ma lelee otú e si arụ ọrụ na ya na omume, echiche dị n'isi gị bụ na nke a dị oké njọ. Mgbakọ na mgbakọ na mwepụ, ọ bụ ndị Cool (ndị ọrụ mgbakọ na mwepụ abụọ - mmeri ACM) chepụtara ya nke ọma, ọ bụghịkwa onye ọ bụla. Ebumnobi - iji gosi - emezuola.

Site n'ụzọ, banyere nọmba. Ka anyị chetara gị nke ahụ # ọ bụ otu okwu nat, nọmba eke:

E nwere ụdị okwu (ụdị-expr) na okwu ọnụọgụgụ (na-expr). Otú ọ dị, a na-akọwa ha otu ụzọ ahụ.

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

mana n’asụsụ ụtọ a kọwara ha n’otu ụzọ ahụ, ya bụ. Ekwesịrị icheta ọdịiche a ma jiri aka tinye ya na mmejuputa ya.

Ọfọn, ee, ụdị template (vector<int>, vector<User>) nwere ihe nchọpụta nkịtị (#1cb5c415), i.e. ọ bụrụ na ị maara na a na-akpọsa oku dị ka

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

Mgbe ahụ ị naghị echere naanị vector, kama ọ bụ vector nke ndị ọrụ. Kpọmkwem karịa, kwesịrị chere - na koodu n'ezie, ihe ọ bụla, ma ọ bụrụ na ọ bụghị ụdị efu, ga-enwe onye nrụpụta, na n'ụzọ dị mma na mmejuputa ya ga-adị mkpa ịlele - ma e zigara anyị kpọmkwem na ihe ọ bụla nke vector a. ụdị ahụ? Kedu ihe ma ọ bụrụ na ọ bụ ụdị PHP, nke nhazi nwere ike ịnwe ụdị dị iche iche na ihe dị iche iche?

N'oge a ị na-amalite iche - dị ka TL dị mkpa? Eleghi anya maka ụgbọ ala ọ ga-ekwe omume iji serializer mmadụ, otu protobuf nke dịbu adị mgbe ahụ? Nke ahụ bụ tiori, ka anyị leba anya na omume.

Mmejuputa TL dị na koodu

A mụrụ TL na omimi nke VKontakte ọbụna tupu ihe ndị a ma ama na ire òkè Durov na (n'ezie), ọbụna tupu mmepe nke Telegram amalite. Na na-emeghe isi iyi koodu isi mmalite nke mmejuputa iwu mbụ ị nwere ike ịhụ ọtụtụ crutches na-akpa ọchị. E mejuputakwara asụsụ ahụ n'onwe ya n'ụzọ zuru oke karịa ka ọ dị ugbu a na Telegram. Dịka ọmụmaatụ, anaghị eji hashes eme ihe ọ bụla na atụmatụ ahụ (nke pụtara pseudotype arụnyere arụnyere (dị ka vector) nwere àgwà aghụghọ). Ma ọ bụ

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

ma ka anyị tụlee, n'ihi nke izu-oke, iji chọpụta, dị ka a pụrụ isi kwuo ya, evolushọn nke Giant of Thinking.

#define ZHUKOV_BYTES_HACK

#ifdef ZHUKOV_BYTES_HACK

/* dirty hack for Zhukov request */

Ma ọ bụ nke a mara mma:

    static const char *reserved_words_polymorhic[] = {

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

      };

Iberibe a gbasara ndebiri dị ka:

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

Nke a bụ nkọwa nke ụdị template hashmap dị ka vector nke int - Ụdị ụzọ abụọ. Na C++ ọ ga-adị ka nke a:

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

ya mere, alpha - isiokwu! Mana naanị na C ++ ị nwere ike dee T, mana ị ga-ede alfa, beta ... Ma ọ bụghị karịa paramita 8, nke ahụ bụ ebe echiche efu na-akwụsị. Ọ dị ka n'otu oge na St. Petersburg ụfọdụ mkparịta ụka dị ka nke a mere:

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

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

Ma nke a bụ banyere mmejuputa iwu nke mbụ bipụtara nke TL "n'ozuzu". Ka anyị gaa n'ihu na-atụle mmejuputa iwu na ndị ahịa Telegram n'onwe ha.

Okwu na Vasily:

Vasily, [09.10.18 17:07] Nke ka nke, ịnyịnya ibu na-ekpo ọkụ n'ihi na ha kere ụyọkọ abstractions, wee kụchie ha bolt, ma jiri crutches kpuchie code generator.
N'ihi ya, nke mbụ si na dock pilot.jpg
Mgbe ahụ site na koodu dzhekichan.webp

N'ezie, site n'aka ndị maara algọridim na mgbakọ na mwepụ, anyị nwere ike ịtụ anya na ha agụwo Aho, Ullmann, ma mara ngwá ọrụ ndị ghọworo ọkọlọtọ de facto na ụlọ ọrụ ahụ n'ime ọtụtụ iri afọ maka ide ihe nchịkọta DSL ha, nri? ...

Site na telegram-cli bụ Vitaly Valtman, dị ka enwere ike ịghọta site na ọnọdụ nke usoro TLO n'èzí ya (cli), onye otu - ugbu a ka ekenyela ọbá akwụkwọ maka TL parsing. iche, gịnị bụ mmetụta ya Nyocha TL? ..

16.12 04:18 Vasily: Echere m na mmadụ amaghị lex+yacc
16.12 04:18 Vasily: Enweghị m ike ịkọwa ya ma ọ bụghị
16.12 04:18 Vasily: nke ọma, ma ọ bụ na a kwụrụ ha ọnụ ọgụgụ ahịrị na VK.
16.12 04:19 Vasily: ahịrị 3k+ wdg.<censored> kama ntụgharị okwu

Ma eleghị anya, ewepu? Ka anyị hụ otú na-eme Nke a bụ onye ahịa ọrụ - 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);

Ahịrị 1100+ na Python, okwu ole na ole mgbe niile + ikpe pụrụ iche dị ka vector, nke, n'ezie, ekwuputara na atụmatụ ahụ dị ka o kwesịrị ịdị dị ka syntax TL, mana ha dabere na syntax a iji tụgharịa ya… Ajụjụ na-ebilite, gịnị kpatara ihe a niile ji bụrụ ọrụ ebube?иỌ na-ekowa karịa ma ọ bụrụ na ọ nweghị onye ga-atụgharị ya dịka akwụkwọ ahụ siri dị?!

Site n'ụzọ... Cheta na anyị kwuru maka ịlele CRC32? Yabụ, na ndị na-emepụta koodu na Desktọpụ Telegram enwere ndepụta nke ewepụrụ maka ụdị ndị ahụ gbakọọ CRC32. adabaghị ya na nke egosiri na eserese a!

Vasily, [18.12/22 49:XNUMX] na ebe a, m ga-eche ma ọ dị mkpa TL dị otú ahụ.
ọ bụrụ na achọrọ m ịmegharị na mmejuputa iwu ọzọ, m ga-amalite itinye nkwụsịtụ ahịrị, ọkara nke parsers ga-agbaji na nkọwa ọtụtụ ahịrị.
tdesktop, Otú ọ dị, kwa

Cheta isi ihe gbasara otu-liner, anyị ga-alaghachi na ya ntakịrị oge.

Ọ dị mma, telegram-cli bụ enweghị iwu, Desktọpụ Telegram bụ gọọmentị, mana kedu maka ndị ọzọ? Kedu onye maara?... Na koodu ndị ahịa gam akporo ọ nweghị schema parser ma ọlị (nke na-ewelite ajụjụ gbasara isi mmalite, mana nke a bụ akụkụ nke abụọ), mana enwere ọtụtụ koodu ndị ọzọ na-atọ ọchị, mana ndị ọzọ na ha na nkeji n'okpuru.

Olee ajụjụ ndị ọzọ serialization na-ewelite na omume? Dịka ọmụmaatụ, ha mere ọtụtụ ihe, n'ezie, na obere ubi na ọnọdụ ọnọdụ:

Vasily: flags.0? true
pụtara na ubi ahụ dị na nhata eziokwu ma ọ bụrụ na edobere ọkọlọtọ

Vasily: flags.1? int
pụtara na ubi ahụ dị ugbu a na ọ dị mkpa ka ewepụ ya

Vasily: Ee, echegbula onwe gị maka ihe ị na-eme!
Vasily: Enwere aha ebe na doc na eziokwu bụ ụdị ogologo efu efu, mana ọ gaghị ekwe omume ikpokọta ihe ọ bụla na doc ha.
Vasily: N'ime mmemme mepere emepe nke a abụghịkwa ikpe, mana enwere ụyọkọ crutches na nkwado.

Kedu maka Telethon? Na-ele anya n'ihu na isiokwu nke MTProto, ihe atụ - na akwụkwọ ahụ e nwere mpempe akwụkwọ ndị dị otú ahụ, ma akara ahụ % A kọwara ya naanị dị ka “dakọtara na ụdị enyereghị ihe efu”, ya bụ. N'ime ihe atụ ndị dị n'okpuru, enwere njehie ma ọ bụ ihe enweghị akwụkwọ:

Vasily, [22.06.18 18:38] N'otu ebe:

msg_container#73f1f8dc messages:vector message = MessageContainer;

N'ụzọ dị iche:

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

Na ndị a bụ nnukwu ọdịiche abụọ, na ndụ n'ezie ụdị vector gba ọtọ na-abịa

Ahụbeghị m nkọwa vector efu ma ahụbeghị m otu

Ejiri aka dee nyocha na telethon

N'ime eserese ya, a kọwara nkọwa ya msg_container

Ọzọ, ajụjụ ahụ ka dị ihe dịka %. A kọwaghị ya.

Vadim Goncharov, [22.06.18 19:22] na na tdesktop?

Vasily, [22.06.18 19:23] Mana TL parser ha na injin oge niile agaghị eri nke a.

// parsed manually

TL bụ abstraction mara mma, ọ nweghị onye na-eme ya kpamkpam

Na % adịghị na ụdị atụmatụ ha

Ma ebe a akwụkwọ na-emegide onwe ya, ya mere idk

Achọtara ya na ụtọ asụsụ, ha nwere ike chefuola ịkọwa ihe ọmụmụ ọmụmụ

Ị hụrụ akwụkwọ ahụ na TL, ị gaghị achọpụta ya na-enweghị ọkara lita

"Ọfọn, ka anyị kwuo," onye ọzọ na-agụ ga-ekwu, "ị na-akatọ ihe, ya mere gosi m otú e kwesịrị isi mee ya."

Vasily na-aza, sị: “Ma onye nzacha, ihe ndị dị ka ihe na-amasị m

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

otu ọ dị mma karịa

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

ma ọ bụ

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

Nke a bụ nkọwa zuru oke:

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

ndị ahụ. nke ka mfe bụ itinye ya nwayọ.”

N'ozuzu, n'ihi ya, parser na code generator maka n'ezie eji subset nke TL dabara n'ime ihe dị ka 100 ahịrị ụtọ ụtọ asụsụ na ~ 300 ahịrị nke generator (na-agụ ihe niile. print's emepụtara koodu), gụnyere ụdị ozi buns maka introspection na klaasị ọ bụla. Ụdị polymorphic ọ bụla na-atụgharị n'ime klaasị nkịtị, ndị na-emepụta ihe na-eketakwa ya ma nwee usoro maka serialization na deserialization.

Enweghị ụdị n'ụdị asụsụ

Mpịnye siri ike bụ ihe dị mma, nri? Ee e, nke a abụghị a holivar (ọ bụ ezie na m na-ahọrọ ike ike asụsụ), ma a postulate n'ime kpuchie nke TL. Dabere na ya, asụsụ kwesịrị inye anyị ụdị nlele ọ bụla. Ọfọn, dị mma, ma eleghị anya, ọ bụghị ya onwe ya, ma mmejuputa iwu, ma o kwesịrị dịkarịa ala na-akọwa ha. Oleekwa ụdị ohere anyị chọrọ?

Nke mbụ, ihe mgbochi. Ebe a anyị na-ahụ na akwụkwọ maka ebugo faịlụ:

A na-ekewa ọdịnaya ọnụọgụ abụọ nke faịlụ ahụ ka ọ bụrụ akụkụ. Akụkụ niile ga-enwerịrị otu nha ( akụkụ_size ) na ọnọdụ ndị a ga-emezurịrị:

  • part_size % 1024 = 0 (nke kewara site na 1KB)
  • 524288 % part_size = 0 (512KB ga-abụrịrị nke a ga-ekewa n'otu n'otu site na part_size)

Akụkụ ikpeazụ ekwesịghị imeju ọnọdụ ndị a, ma ọ bụrụ na nha ya erughị part_size.

Akụkụ nke ọ bụla kwesịrị inwe nọmba usoro, faịlụ_akụkụ, nke nwere uru sitere na 0 ruo 2,999.

Mgbe ekewasịchara faịlụ ahụ, ịkwesịrị ịhọrọ usoro maka ịchekwa ya na sava ahụ. Jiri upload.saveBigFilePart ọ bụrụ na oke faịlụ ahụ karịrị 10 MB na bulite.saveFilePart maka obere faịlụ.
[…] Enwere ike weghachi otu n'ime njehie ntinye data ndị a:

  • FILE_PARTS_INVALID — Ọnụọgụ akụkụ ezighi ezi. Uru adịghị n'etiti 1..3000

Ọ nwere nke ọ bụla n'ime eserese a? Nke a ọ nwere ike igosipụta n'ụzọ ụfọdụ iji TL? Mba. Mana gbaghara m, ọbụlagodi Turbo Pascal nke nna nna nwere ike ịkọwa ụdị ndị akọwapụtara oke. Ọ makwaara otu ihe ọzọ, nke a maara nke ọma ugbu a enum - ụdị nke nwere ngụkọ ọnụ ọgụgụ nke ụkpụrụ edobere (obere). N'asụsụ dị ka C - ọnụọgụ, rịba ama na ruo ugbu a, anyị na-ekwu naanị banyere ụdị ọnụọgụgụ. Mana enwerekwa usoro, eriri ... dịka ọmụmaatụ, ọ ga-adị mma ịkọwa na eriri a nwere ike ịnwe naanị nọmba ekwentị, nri?

Ọ nweghị nke a dị na TL. Mana enwere, dịka ọmụmaatụ, na JSON Schema. Ma ọ bụrụ na onye ọzọ nwere ike ịrụ ụka banyere nkewa nke 512 KB, na nke a ka kwesịrị ka enyocha ya na koodu, mgbe ahụ hụ na onye ahịa ahụ dị mfe. enweghị ike zipu nọmba na nso nso 1..3000 (na njehie kwekọrọ na ya enweghị ike ibilite) ọ gaara ekwe omume, nri? ..

Site n'ụzọ, banyere njehie na nloghachi ụkpụrụ. Ọbụlagodi ndị ha na TL rụkọrọ ọrụ na-eme ka anya ha pụta ìhè - ọ pụtaghị ozugbo na nke ahụ onye ọ bụla Ọrụ dị na TL nwere ike ịlaghachi ọ bụghị naanị ụdị nlọghachi a kọwara, kamakwa njehie. Mana enweghị ike iwepụ nke a n'ụzọ ọ bụla site na iji TL n'onwe ya. N'ezie, o doro anya na ọ dịghị mkpa maka ihe ọ bụla na omume (ọ bụ ezie na n'eziokwu, RPC nwere ike ime n'ụzọ dị iche iche, anyị ga-alaghachi na nke a mgbe e mesịrị) - ma gịnị banyere ịdị ọcha nke echiche nke mgbakọ na mwepụ nke ụdị Abstract. si n'uwa nke elu-igwe?.. Ebuliri m ihe-nkụkọ - ya mere dakọtara ya.

Ma n'ikpeazụ, gịnị banyere ịgụ akwụkwọ? Ọfọn, ebe ahụ, n'ozuzu, ọ ga-amasị m nkọwa nwere ya nke ọma na schema (na JSON schema, ọzọ, ọ bụ), ma ọ bụrụ na ị na-ama nsogbu na ya, mgbe ahụ kedu maka bara uru akụkụ - opekata mpe na-ele anya diffs n'oge mmelite? Hụ onwe gị na ezigbo ihe atụ:

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

ma ọ bụ

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

Ọ dabere na onye ọ bụla, mana GitHub, dịka ọmụmaatụ, jụrụ igosipụta mgbanwe n'ime ahịrị ogologo dị otú ahụ. Egwuregwu ahụ "chọta ọdịiche 10", na ihe ụbụrụ na-ahụ ozugbo bụ na mmalite na njedebe na ihe atụ abụọ ahụ bụ otu, ịkwesịrị iji nlezianya gụọ ebe dị n'etiti ... N'uche m, nke a abụghị nanị na tiori, mana naanị anya unyi na slopi.

Site n'ụzọ, banyere ịdị ọcha nke tiori. Kedu ihe kpatara anyị ji chọọ ubi ntakịrị? Ọ naghị adị ka ha isi ọjọọ site n'echiche nke ụdị tiori? Enwere ike ịhụ nkọwa na nsụgharị mbụ nke eserese ahụ. Na mbụ, ee, otú ahụ ka ọ dị, maka uzere ọ bụla e kere ụdị ọhụrụ. Rudiments ndị a ka dị n'ụdị a, dịka ọmụmaatụ:

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;

Mana ugbu a, were ya, ọ bụrụ na ị nwere mpaghara nhọrọ 5 na nhazi gị, mgbe ahụ ị ga-achọ ụdị 32 maka nhọrọ niile enwere ike. Mgbawa combinatorial. Ya mere, ịdị ọcha kristal nke echiche TL tisakwara ọzọ megide ịnyịnya ibu nke nkedo nke eziokwu siri ike nke serialization.

Na mgbakwunye, n'ebe ụfọdụ ụmụ okorobịa ndị a n'onwe ha na-emebi akara nke ha. Dịka ọmụmaatụ, na MTProto (isi nke na-esote) nzaghachi nwere ike ịmegharị site na Gzip, ihe niile dị mma - ma e wezụga na-emebi akwa na sekit. Ọzọkwa, ọ bụghị RpcResult n'onwe ya ka ewepụtara, mana ọdịnaya ya. Ọfọn, gịnị kpatara nke a?... M ga-egbutu n'ime a crutch ka mkpakọ ga-arụ ọrụ n'ebe ọ bụla.

Ma ọ bụ ihe atụ ọzọ, otu oge anyị chọpụtara njehie - ezitere ya InputPeerUser kama nke InputUser. Ma ọ bụ ọzọ. Ma ọ rụrụ ọrụ! Ya bụ, ihe nkesa ahụ echeghị maka ụdị ahụ. Olee otú nke a pụrụ isi mee? Enwere ike ịnye anyị azịza ya site na mpempe koodu sitere na 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);

N'ikwu ya n'ụzọ ọzọ, nke a bụ ebe a na-eme serialization Iji aka, anaghị eme koodu! Ma eleghị anya, a na-emejuputa ihe nkesa ahụ n'ụzọ yiri nke ahụ? .. N'ụkpụrụ, nke a ga-arụ ọrụ ma ọ bụrụ na emee otu ugboro, ma olee otu esi akwado ya ma emechaa n'oge mmelite? Ọ bụ ya mere e ji mepụta atụmatụ ahụ? Na ebe a anyị ga-aga n'ihu ajụjụ na-esonụ.

Ụdị nsụgharị. N'ígwé

Ihe kpatara eji akpọ ụdị schematics ndị ahụ n'ígwé nwere ike ịkọ nkọ dabere na akụkọ ihe mere eme nke schematics ebipụtara. N'ụzọ doro anya, na mbụ ndị na-ede akwụkwọ chere na a pụrụ ime ihe ndị bụ isi site na iji atụmatụ na-agbanweghị agbanwe, na naanị ebe ọ dị mkpa, maka arịrịọ ụfọdụ, na-egosi na a na-eji ụdị dị iche iche eme ha. Na ụkpụrụ, ọbụna ezigbo echiche - na ọhụrụ ga-abụ, dị ka a pụrụ isi kwuo ya, "agwakọta", n'elu nke ochie. Ma ka anyị hụ otú e si mee ya. N'ezie, enweghị m ike ile ya anya site na mmalite - ọ bụ ihe ọchị, mana eserese nke oyi akwa adịghị adị. Layers malitere na 2. Akwụkwọ ahụ na-agwa anyị gbasara njirimara TL pụrụ iche:

Ọ bụrụ na onye ahịa kwadoro Layer 2, mgbe ahụ a ga-eji ihe nrụpụta ihe a:

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

Na omume, nke a pụtara na tupu oku API ọ bụla, int nwere uru 0x289dd1f6 ga-atụkwasịrịrị tupu usoro nọmba.

Ọ na-ada ụda nkịtị. Ma gịnị mere ọzọ? Mgbe ahụ pụtara

invokeWithLayer3#b7475268 query:!X = X;

Ya mere gịnị na-esote? Dị ka ị nwere ike iche,

invokeWithLayer4#dea0d430 query:!X = X;

Ọchịchọ? Mba, ọ dịla n'oge ịchị ọchị, chee echiche banyere nke ahụ onye ọ bụla Arịrịọ sitere na oyi akwa ọzọ kwesịrị ka a kechie ya n'ụdị pụrụ iche - ọ bụrụ na ha niile dị iche maka gị, olee otu ị ga-esi mata ọdịiche ha? Na ịgbakwunye naanị 4 bytes n'ihu bụ usoro mara mma nke ọma. Yabụ,

invokeWithLayer5#417a57ae query:!X = X;

Ma o doro anya na mgbe obere oge gasịrị, nke a ga-aghọ ụdị bacchanalia. Ihe ngwọta wee bịa:

Mmelite: Malite na Layer 9, ụzọ enyemaka invokeWithLayerN nwere ike iji naanị ọnụ na initConnection

Hụ! Mgbe nsụgharị 9 gasịrị, anyị mechara bịarute ihe e mere na protocol ịntanetị laa azụ na 80s - kwenye na ụdị ahụ otu ugboro na mmalite nke njikọ ahụ!

Kedu ihe na-esote?..

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

Ma ugbu a ị ka nwere ike ịchị ọchị. Naanị mgbe ọzọ 9 n'ígwé, a eluigwe na ala constructor na a version nọmba emechara gbakwunyere, nke kwesịrị ka a na-akpọ nanị otu ugboro na mmalite nke njikọ, na pụtara n'ígwé yiri ka okụrede, ugbu a ọ bụ nnọọ a keonodu version, dị ka. n'ebe nile ọzọ. A doziri nsogbu.

Kpọmkwem?..

Vasily, [16.07.18 14:01] Ọbụna na Fraịde, echere m:
The teleserver na-eziga ihe omume na-enweghị arịrịọ. Arịrịọ ga-ekechirịrị na InvokeWithLayer. Ihe nkesa anaghị kechie mmelite; ọ nweghị usoro maka mpịachi nzaghachi na mmelite.

Ndị ahụ. onye ahịa enweghị ike ịkọwa oyi akwa nke ọ chọrọ mmelite

Vadim Goncharov, [16.07.18 14:02] ọ bụghị InvokeWithLayer bụ crutch na ụkpụrụ?

Vasily, [16.07.18 14:02] Nke a bụ naanị ụzọ

Vadim Goncharov, [16.07.18 14:02] nke kwesịrị ịpụta ikwenye na oyi akwa na mmalite nke nnọkọ.

Site n'ụzọ, ọ na-esote na adịghị enye ndị ahịa downgrade

Mmelite, i.e. ụdị Updates na atụmatụ, nke a bụ ihe ihe nkesa na-ezigara onye ahịa ọ bụghị na nzaghachi maka arịrịọ API, mana n'onwe ya mgbe ihe omume mere. Nke a bụ isiokwu dị mgbagwoju anya nke a ga-atụle na post ọzọ, ma ugbu a ọ dị mkpa ịmara na ihe nkesa na-echekwa mmelite ọbụna mgbe onye ahịa na-anọghị n'ịntanetị.

N'ihi ya, ọ bụrụ na ị jụ kechie onye obula ngwugwu iji gosi ụdị ya, nke a n'ụzọ ezi uche na-eduga na nsogbu ndị a nwere ike ime:

  • ihe nkesa na-ezigara onye ahịa mmelite ọbụna tupu onye ahịa agwala ụdị ọ na-akwado
  • kedu ihe m ga-eme mgbe emelitechara onye ahịa?
  • onye na -ekwe nkwana echiche nke ihe nkesa banyere nọmba oyi akwa agaghị agbanwe n'oge usoro ahụ?

Ị chere na nke a bụ ntule echiche naanị, na omume nke a enweghị ike ime, n'ihi na edere ihe nkesa ahụ nke ọma (opekata mpe, a nwalere ya nke ọma)? Ha! N'agbanyeghị otú ọ dị!

Nke a bụ kpọmkwem ihe anyị banyere n'August. N'August 14, enwere ozi na a na-emelite ihe na sava Telegram... wee banye na ndekọ:

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.

na ọtụtụ megabytes nke nchịkọta nchịkọta (nke ọma, n'otu oge ahụ ka edoziri osisi). A sị ka e kwuwe, ọ bụrụ na amataghị ihe na TL gị, ọ bụ ọnụọgụ abụọ site na mbinye aka, na-agbada n'ahịrị NIILE na-aga, ngbanwe ga-abụ ihe agaghị ekwe omume. Gịnị ka i kwesịrị ime n'ọnọdụ dị otú ahụ?

Ọfọn, ihe mbụ na-abata n'uche onye ọ bụla bụ ịkwụsị njikọ wee gbalịa ọzọ. Enyereghị aka. Anyị google CRC32 - ndị a tụgharịrị bụrụ ihe sitere na atụmatụ 73, ọ bụ ezie na anyị na-arụ ọrụ na 82. Anyị na-ele anya nke ọma na ndekọ - enwere ihe nchọpụta sitere na atụmatụ abụọ dị iche iche!

Ma eleghị anya, nsogbu ahụ bụ naanị na onye ahịa anyị na-akwadoghị? Ee e, anyị na-ebupụta Telegram Desktop 1.2.17 (ụdị ewepụtara n'ọtụtụ nkesa Linux), ọ na-ede na ndekọ Wepu: MTP ụdị a na-atụghị anya ya #b5223b0f na-agụ na MTMessageMedia…

Nkatọ nke protocol na usoro nhazi nke Telegram. Akụkụ 1, teknụzụ: ahụmịhe nke ide onye ahịa site na ọkọ - TL, MT

Google gosipụtara na nsogbu yiri nke ahụ emelarị otu n'ime ndị ahịa na-edeghị akwụkwọ, ma mgbe ahụ nọmba mbipute na, ya mere, echiche ndị dị iche iche ...

Yabụ kedu ihe anyị kwesịrị ime? Mụ na Vasily kewara: ọ gbalịrị imelite sekit ahụ gaa na 91, ekpebiri m ichere ụbọchị ole na ole ma gbalịa na 73. Ụzọ abụọ a na-arụ ọrụ, ma ebe ọ bụ na ha dị ike, ọ dịghị nghọta nke ọtụtụ nsụgharị elu ma ọ bụ ala ị chọrọ. ịwụ elu, ma ọ bụ ogologo oge ị ga-echere.

Mgbe e mesịrị, enwere m ike ịmaliteghachi ọnọdụ ahụ: anyị na-ebupụta onye ahịa ahụ, gbanyụọ ya, weghachite sekit ahụ na oyi akwa ọzọ, malitegharịa, jide nsogbu ahụ ọzọ, laghachi na nke gara aga - oops, enweghị ego nke mgbanwe sekit na onye ahịa malitegharịa maka a. nkeji ole na ole ga-enyere aka. Ị ga-enweta ngwakọta nke usoro data site na ọkwa dị iche iche.

Nkọwa? Dị ka ị nwere ike ịkọ site na mgbaàmà dị iche iche na-apụtaghị ìhè, ihe nkesa ahụ nwere ọtụtụ usoro nke ụdị dị iche iche na igwe dị iche iche. O yikarịrị, ihe nkesa nke na-ahụ maka "buffering" na-etinye n'ahịrị ihe ndị isi ya nyere ya, ma nye ya na atụmatụ nke dị n'oge ọgbọ. Ma ruo mgbe kwụ n'ahịrị a 'ere ure', ọ nweghị ihe a ga-eme banyere ya.

Ikekwe ... ma nke a bụ ihe egwu dị egwu?! Na ụdị gam akporo anyị ahụghị TL parser, mana anyị na-ahụ faịlụ dị egwu (GitHub jụrụ imetụ ya aka) yana (de) serialization. Nke a bụ snippets koodu:

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;

ma ọ bụ

    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... dị ka anụ ọhịa. Ma, eleghị anya, nke a na-emepụta koodu, mgbe ahụ ọ dị mma? .. Ma ọ na-akwado nsụgharị niile! N'ezie, ọ bụghị ihe doro anya ihe mere ihe niile ji jikọta ọnụ, mkparịta ụka nzuzo, na ụdị niile _old7 n'ụzọ ụfọdụ adịghị ka igwe ọgbọ ... Otú ọ dị, nke ka ukwuu m na-efe efe

TL_message_layer104
TL_message_layer104_2
TL_message_layer104_3

Ụmụ okorobịa, ị pụghị ikpebi ihe dị n'ime otu oyi akwa?! Ọfọn, ọ dị mma, ka anyị kwuo "abụọ" ka a tọhapụrụ ya na njehie, ọ dị mma, ọ na-eme, ma ATO?... Ozugbo, otu rake ọzọ? Kedu ụdị ihe na-akpali agụụ mmekọahụ nke a, ndo?..

Na koodu isi iyi nke Desktọpụ Telegram, n'agbanyeghị, ihe yiri ya na-eme - ọ bụrụ otú ahụ, ọtụtụ na-eme n'usoro n'usoro atụmatụ ahụ adịghị agbanwe nọmba oyi akwa ya, mana dozie ihe. N'ọnọdụ ebe enweghị isi mmalite data maka atụmatụ a, ebee ka enwere ike nweta ya, belụsọ koodu isi mmalite nke onye ahịa gọọmentị? Ma ọ bụrụ na i were ya n'ebe ahụ, ị ​​gaghị ejide n'aka na atụmatụ ahụ zuru oke ruo mgbe ị nwalere usoro niile.

Kedu ka enwere ike ịnwale nke a? Enwere m olileanya na ndị na-akwado unit, arụmọrụ na ule ndị ọzọ ga-ekere òkè na nkwupụta.

Ọ dị mma, ka anyị lelee ibe koodu ọzọ:

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;

Okwu a "jiri aka mebere" na-egosi na ọ bụ naanị akụkụ nke faịlụ a ka ejiri aka dee (ị nwere ike iche n'echiche nrụzi ahụ dum?), ma ndị ọzọ bụ igwe mepụtara. Otú ọ dị, ajụjụ ọzọ na-ebilite - na isi mmalite dị ọ bụghị kpamkpam (a la GPL blobs na Linux kernel), mana nke a abụrụlarị isiokwu maka akụkụ nke abụọ.

Mana ezuru. Ka anyị gaa n'ihu na protocol n'elu nke usoro ihe a niile na-arụ.

MT Proto

Yabụ, ka anyị mepee nkọwa izugbe и nkọwa zuru ezu nke protocol na ihe mbụ anyị na-asụ ngọngọ bụ okwu okwu. Na n'ụba nke ihe niile. N'ozuzu, nke a yiri ka ọ bụ njirimara nke Telegram - ịkpọ ihe dị iche iche n'ebe dị iche iche, ma ọ bụ ihe dị iche iche na otu okwu, ma ọ bụ ọzọ (dịka ọmụmaatụ, na API dị elu, ọ bụrụ na ị hụ mkpọ ihe mmado, ọ bụghị ya). ihe ị chere).

Dịka ọmụmaatụ, "ozi" na "nnọkọ" pụtara ihe dị iche ebe a karịa na ndị ahịa Telegram na-emebu. Ọ dị mma, ihe niile doro anya na ozi ahụ, enwere ike ịkọwa ya na okwu OOP, ma ọ bụ naanị ịkpọ okwu ahụ “packet” - nke a bụ ọkwa dị ala, enweghị otu ozi dị na interface ahụ, enwere ọtụtụ ozi ọrụ. . Ma nnọkọ ... ma ihe mbụ mbụ.

ebu oyi akwa

Ihe mbụ bụ njem. Ha ga-agwa anyị gbasara nhọrọ 5:

  • TCP
  • Ihe ntanetị
  • Websocket n'elu HTTPS
  • Http
  • HTTPS

Vasily, [15.06.18 15:04] Enwekwara ụgbọ njem UDP, mana edeghị ya akwụkwọ.

Na TCP na atọ dị iche iche

Nke mbụ yiri UDP n'elu TCP, ngwugwu ọ bụla gụnyere nọmba usoro na crc
Gịnị mere ịgụ akwụkwọ n'ụgbọala ji na-egbu mgbu?

Ọfọn, ọ dị ugbu a TCP ugbua na 4 iche iche:

  • Ahapụrụ ya
  • Intermediate
  • Padded etiti
  • Full

Ọ dị mma, dị mma, padded intermediate maka MTProxy, nke a mechara gbakwunye n'ihi mmemme ama ama. Mana gịnị kpatara nsụgharị abụọ ọzọ (atọ na mkpokọta) mgbe ị nwere ike nweta otu? Ha anọ dị iche iche naanị na otu esi edobe ogologo na ụgwọ ọrụ nke isi MTProto, nke a ga-atụle n'ihu:

  • na Abridged ọ bụ 1 ma ọ bụ 4 bytes, ma ọ bụghị 0xef, mgbe ahụ ahụ
  • na Intermediate nke a bụ 4 bytes nke ogologo na ubi, na oge mbụ onye ahịa ga-eziga 0xeeeeeeee iji gosi na ọ bụ Intermediate
  • na Full nke kacha eri ahụ, site na echiche nke onye netwọk: ogologo, usoro nọmba, na Ọ BỤGHỊ onye bụ tumadi MTProto, ahu, CRC32. Ee, ihe a niile dị n'elu TCP. Nke na-enye anyị ụgbọ njem a pụrụ ịdabere na ya n'ụdị iyi iyi byte; ọ dịghị usoro ọ bụla achọrọ, karịsịa checksums. Ọ dị mma, ugbu a mmadụ ga-ajụ m na TCP nwere checksum 16-bit, yabụ nrụrụ data na-eme. Ọ dị mma, mana anyị nwere ụkpụrụ cryptographic nwere hashes ogologo karịa 16 bytes, njehie ndị a niile - yana karịa - ga-ejide SHA mismatch na ọkwa dị elu. Enweghị isi na CRC32 n'elu nke a.

Ka anyị tulee Abridged, nke otu byte nke ogologo ga-ekwe omume, yana Intermediate, nke na-akwado "Ọ bụrụ na achọrọ nhazi data 4-byte," nke bụ ihe nzuzu. Kedu ihe, ekwenyere na ndị na-eme ihe omume Telegram enweghị ike nke na ha enweghị ike ịgụ data sitere na oghere n'ime ebe nchekwa dabara adaba? Ị ka ga-eme nke a, n'ihi na ịgụ akwụkwọ nwere ike weghachite gị ọnụọgụ bytes ọ bụla (ma nwekwara ndị nnọchiteanya proxy, dịka ọmụmaatụ ...). Ma ọ bụ n'aka nke ọzọ, gịnị kpatara igbochi Abridged ma ọ bụrụ na anyị ka ga-enwe padding dị elu n'elu 16 bytes - chekwaa 3 bytes ike ?

Otu na-enweta echiche na Nikolai Durov nwere mmasị n'ezie ịmegharị wiil, gụnyere usoro netwọk, na-enweghị ezigbo mkpa ọ bụla.

Nhọrọ njem ndị ọzọ, gụnyere. Weebụ na MTProxy, anyị agaghị atụle ugbu a, ikekwe na post ọzọ, ma ọ bụrụ na enwere arịrịọ. Banyere otu MTProxy a, ka anyị cheta ugbu a na obere oge ka ahapụchara ya na 2018, ndị na-eweta ngwa ngwa mụtara igbochi ya, ezubere maka ya. uzo mgbochisite ngwugwu size! Nakwa eziokwu ahụ bụ na ihe nkesa MTProxy dere (ọzọ nke Waltman) na C na-ejikọta ya na nkọwa Linux, ọ bụ ezie na nke a adịghị mkpa ma ọlị (Phil Kulin ga-akwado), na ihe nkesa yiri ya na Go ma ọ bụ Node.js. dabara na ihe na-erughị otu narị ahịrị.

Mana anyị ga-enweta nkwubi okwu banyere nka nka nke ndị a na njedebe nke ngalaba, mgbe anyị tụlechara okwu ndị ọzọ. Maka ugbu a, ka anyị gaa na OSI oyi akwa 5, nnọkọ - nke ha na-etinye oge MTProto.

Igodo, ozi, nnọkọ, Diffie-Hellman

Ha debere ya n'ebe ahụ, ọ bụghị nke ọma… Otu nnọkọ abụghị otu nnọkọ nke a na-ahụ anya na interface n'okpuru nnọkọ nọ n'ọrụ. Ma n'usoro.

Nkatọ nke protocol na usoro nhazi nke Telegram. Akụkụ 1, teknụzụ: ahụmịhe nke ide onye ahịa site na ọkọ - TL, MT

Ya mere, anyị natara a byte eriri mara ogologo si iga oyi akwa. Nke a bụ ozi ezoro ezo ma ọ bụ ederede doro anya - ma ọ bụrụ na anyị ka nọ na nkwekọrịta nkwekọrịta ma na-eme ya n'ezie. Kedu n'ime ụyọkọ echiche a na-akpọ "igodo" anyị na-ekwu maka ya? Ka anyị dokwuo anya okwu a maka ndị otu Telegram n'onwe ya (Ana m arịọ mgbaghara maka ịsụgharị akwụkwọ nke m site na bekee nwere ụbụrụ ike gwụrụ n'elekere anọ nke ụtụtụ, ọ dị mfe ịhapụ ụfọdụ nkebiokwu dịka ha dị):

Enwere ụlọ ọrụ abụọ a na-akpọ nnọkọ - otu n'ime UI nke ndị ahịa gọọmentị n'okpuru "oge ugbu a", ebe nnọkọ ọ bụla dabara na ngwaọrụ / OS dum.
Nke abụọ - Oge MTProto, nke nwere nọmba usoro nke ozi (n'echiche dị ala) na ya, na nke nwere ike ịdịgide n'etiti njikọ TCP dị iche iche. Enwere ike itinye ọtụtụ oge MTProto n'otu oge, dịka ọmụmaatụ, iji mee ka nbudata faịlụ dị ngwa.

N'etiti abụọ ndị a sessions enwere echiche ikike. N'okwu ahụ dara ada, anyị nwere ike ikwu nke ahụ Oge UI bụ otu ihe ahụ ikike, ma Ewoo, ihe niile dị mgbagwoju anya. Ka anyị lee:

  • Onye ọrụ na ngwaọrụ ọhụrụ na-ebu ụzọ pụta auth_key ma kechie ya na akaụntụ, dịka ọmụmaatụ site na SMS - ya mere ikike
  • O mere n'ime nke mbụ Oge MTProto, nke nwere session_id n'ime onwe gị.
  • Na nzọụkwụ a, nchikota ikike и session_id enwere ike ịkpọ ihe atụ - okwu a pụtara na akwụkwọ na koodu nke ụfọdụ ndị ahịa
  • Mgbe ahụ, onye ahịa nwere ike imeghe ọtụtụ Oge MTProto n'okpuru otu auth_key - na otu DC.
  • Mgbe ahụ, otu ụbọchị onye ahịa ga-achọ ịrịọ faịlụ site na ya DC ọzọ - na maka DC a a ga-emepụta nke ọhụrụ auth_key !
  • Iji gwa usoro ahụ na ọ bụghị onye ọrụ ọhụrụ na-edebanye aha, mana otu ihe ahụ ikike (Oge UI), onye ahịa na-eji oku API auth.exportAuthorization n'ụlọ DC auth.importAuthorization na DC ọhụrụ.
  • Ihe niile bụ otu, ọtụtụ nwere ike imeghe Oge MTProto (nke ọ bụla nwere nke ya session_id) ka DC ọhụrụ a, n'okpuru ya auth_key.
  • N'ikpeazụ, onye ahịa nwere ike ịchọ nzuzo nzuzo zuru oke. Nke ọ bụla auth_key bụ Adịgide adịgide igodo - kwa DC - na onye ahịa nwere ike ịkpọ auth.bindTempAuthKey maka ojiji nwa oge auth_key - na ọzọ, naanị otu temp_auth_key kwa DC, nke niile na-ahụkarị Oge MTProto na DC a.

mara, na nnu (na nnu n'ọdịnihu) bụkwa otu na auth_key ndị ahụ. òkè n'etiti onye ọ bụla Oge MTProto na otu DC.

Kedu ihe "n'etiti njikọ TCP dị iche iche" pụtara? Ya mere nke a pụtara ihe dị ka kuki ikike na webụsaịtị - ọ na-adịgide (na-adị ndụ) ọtụtụ njikọ TCP na sava enyere, mana otu ụbọchị ọ na-aga nke ọma. Naanị n'adịghị ka HTTP, na MTProto ozi n'ime a nnọkọ na-sequentially nọmba na kwadoro; ọ bụrụ na ha banyere n'ọwara, njikọ mebiri - mgbe guzosie ike njikọ ọhụrụ, ihe nkesa ga-eji obiọma ezipụ ihe niile na nnọkọ a nke ọ na-ebughị na mbụ. TCP njikọ.

Agbanyeghị, a chịkọtara ozi dị n'elu ka nyochachara ọtụtụ ọnwa. Ka ọ dị ugbu a, anyị na-emejuputa onye ahịa anyị site na ọkọ? - ka anyị laghachi azụ na mmalite.

Yabụ ka anyị mepụta auth_key on Ụdị Diffie-Hellman sitere na Telegram. Ka anyị gbalịa ịghọta akwụkwọ...

Vasily, [19.06.18 20:05] data_with_hash: = SHA1 (data) + data + (ọ bụla random bytes); dị otú ahụ na ogologo hà 255 bytes;
encrypted_data: = RSA (data_with_hash, server_public_key); A na-ebuli ọnụọgụ ogologo 255-byte (nnukwu endian) gaa na ike achọrọ n'elu modul chọrọ, na-echekwa nsonaazụ ya dị ka nọmba 256-byte.

Ha nwere ụfọdụ dope DH

Adịghị ka DH onye ahụike
Enweghị igodo ọha abụọ na dx

Ọfọn, na njedebe nke a edoziziri, ma ihe fọdụrụ fọdụrụ - ihe akaebe nke ọrụ na-eme site n'aka onye ahịa na ọ nwere ike ịmepụta nọmba ahụ. Ụdị nchebe megide mwakpo DoS. Na igodo RSA na-eji naanị otu ugboro n'otu ụzọ, n'ụzọ bụ isi maka izo ya ezo new_nonce. Ma ọ bụ ezie na ọrụ a yiri ka ọ dị mfe ga-aga nke ọma, gịnị ka ị ga-eche ihu?

Vasily, [20.06.18/00/26 XNUMX:XNUMX] Enwetabeghị m arịrịọ ngwa ngwa.

E zigara m DH arịrịọ a

Na, n'ọdụ ụgbọ mmiri ọ na-ekwu na ọ nwere ike iji 4 bytes nke koodu njehie zaghachi. Ọ gwụla

Ọfọn, ọ gwara m -404, yabụ gịnị?

Ya mere, a gwara m ya: "Jide mkpịsị ugodi ihe nkesa ezoro ezoro gị, achọrọ m DH," ma ọ zara 404 nzuzu.

Kedu ihe ị ga-eche maka nzaghachi nkesa a? Ihe a ga-eme? Enweghị onye ga-ajụ (ma karịa na nke ahụ na akụkụ nke abụọ).

Ebe a na-eme mmasị niile na ọdụ ụgbọ mmiri

Enweghị m ihe ọzọ m ga-eme, naanị m rọrọ nrọ ịtụgharị nọmba azụ na gaba

Abụọ 32-bit nọmba. M kwakọtara ha dị ka onye ọ bụla ọzọ

Mana mba, a ga-ebu ụzọ tinye ha abụọ na ahịrị dịka BE

Vadim Goncharov, [20.06.18 15:49] na n'ihi nke a 404?

Vasily, [20.06.18 15:49] EE!

Vadim Goncharov, [20.06.18 15:50] Ya mere, aghọtaghị m ihe ọ na-apụghị ịhụ

Vasily, [20.06.18 15:50] ihe dika

Enweghị m ike ịhụ ire ere dị otú ahụ ka ọ bụrụ isi ihe%)

Anyị ejikwaghị mkpesa njehie

Vasily, [20.06.18 20:18] Oh, e nwekwara MD5. Ugbua hashes atọ dị iche iche

A na-agbakọ akara mkpịsị aka igodo dị ka ndị a:

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

SHA1 na sha2

Ya mere, ka anyị tinye ya auth_key anyị nwetara 2048 ibe n'ibe na iji Diffie-Hellman. Gịnị na-esote? Ọzọ, anyị na-achọpụta na obere 1024 nke igodo a adịghị eji ụzọ ọ bụla ... ma ka anyị chee echiche banyere nke a ugbu a. Na nzọụkwụ a, anyị nwere ihe nzuzo na ihe nkesa. Emebela ihe analog nke oge TLS, nke bụ usoro dị oke ọnụ. Ma ihe nkesa ahụ ka amaghị ihe ọ bụla gbasara onye anyị bụ! Ọbụbeghị, n'ezie. ikike. Ndị ahụ. ọ bụrụ na ị chere n'usoro nke "paswọọdụ nbanye", dị ka i mere na ICQ, ma ọ bụ opekata mpe "igodo nbanye", dịka na SSH (dịka ọmụmaatụ, na ụfọdụ gitlab/github). Anyị nwetara nke a na-amaghị aha. Kedu ihe ma ọ bụrụ na ihe nkesa agwa anyị "nọmba ekwentị ndị a DC ọzọ na-arụ ọrụ"? Ma ọ bụ ọbụna “amachibidoro nọmba ekwentị gị”? Ihe kacha mma anyị nwere ike ime bụ idobe igodo ahụ n'olileanya na ọ ga-aba uru na ọ gaghị ere ere n'oge ahụ.

Site n'ụzọ, anyị 'natara' ya na ndoputa. Dịka ọmụmaatụ, anyị tụkwasịrị ihe nkesa ahụ obi? Gịnị ma ọ bụrụ na ọ bụ adịgboroja? A ga-achọ nyocha nke cryptographic:

Vasily, [21.06.18 17:53] Ha na-enye ndị ahịa mkpanaka ka ha lelee nọmba 2kbit maka izizi%)

Mana o doro anya ma ọlị, nafeijoa

Vasily, [21.06.18 18:02] Akwụkwọ ahụ ekwughị ihe a ga-eme ma ọ bụrụ na ọ dịghị mfe.

Ekwughị. Ka anyị hụ ihe onye ahịa gam akporo gam akporo na-eme na nke a? A nke ahụ bụ ihe (na ee, faịlụ ahụ dum na-adọrọ mmasị) - dịka ha na-ekwu, m ga-ahapụ nke a ebe a:

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

Mba, n'ezie ọ ka dị ebe ahụ ụfọdụ Enwere ule maka izizi nke nọmba, mana n'onwe m enwekwaghị m ihe ọmụma zuru oke maka mgbakọ na mwepụ.

Ọ dị mma, anyị nwetara igodo ukwu. Ịbanye, i.e. zipu arịrịọ, ịkwesịrị ịmekwu nzuzo, na-eji AES.

A kọwapụtara igodo ozi dị ka ibe etiti 128 nke SHA256 nke ahụ ozi (gụnyere nnọkọ, NJ ozi, wdg), gụnyere bytes padding, nke 32 bytes ewepụtara na igodo ikike.

Vasily, [22.06.18 14:08] Nkezi, anụ ọhịa, ibe n'ibe

Nwetara auth_key. Ha niile. E wezụga ha ... o doghị anya site na akwụkwọ ahụ. Enwere onwe gị ịmụ koodu isi mmalite mepere emepe.

Rịba ama na MTProto 2.0 chọrọ site na 12 ruo 1024 bytes nke padding, ka dabere na ọnọdụ na ogologo ozi ga-esi na ya pụta ga-ekewa site na 16 bytes.

Yabụ kedu padding ka ị ga-agbakwunye?

Ma ee, enwekwara 404 ma ọ bụrụ na ezighi ezi

Ọ bụrụ na onye ọ bụla ji nlezianya mụọ eserese na ederede nke akwụkwọ ahụ, ha chọpụtara na ọ dịghị MAC n'ebe ahụ. Na AES na-eji na ụfọdụ IGE mode na-adịghị eji ebe ọ bụla ọzọ. Ha, n'ezie, dee banyere nke a na FAQ ha ... N'ebe a, dị ka, igodo ozi n'onwe ya bụkwa SHA hash nke data decrypted, na-eji elele iguzosi ike n'ezi ihe - na ọ bụrụ na enweghị nkwekọrịta, akwụkwọ ahụ maka ihe ụfọdụ. na-atụ aro ka ị ghara ileghara ha anya (ma gịnị banyere nchekwa, gịnị ma ọ bụrụ na ha agbaji anyị?).

Abụghị m onye na-ese ihe, ikekwe ọ nweghị ihe dị njọ na ọnọdụ a na nke a site n'echiche echiche. Mana enwere m ike ịkpọ aha nsogbu bara uru, na-eji Telegram Desktop dịka ọmụmaatụ. Ọ na-ezochi cache mpaghara (ndị a niile D877F783D5D3EF8C) n'otu ụzọ ahụ ozi dị na MTProto (naanị n'ụdị ụdị 1.0 a), ya bụ. mbụ igodo ozi, mgbe ahụ, data n'onwe ya (na ebe e wezụga isi nnukwu auth_key 256 bytes, na-enweghị nke msg_key abaghị uru). Ya mere, nsogbu ahụ na-apụta ìhè na nnukwu faịlụ. Ya bụ, ịkwesịrị idobe mbipụta abụọ nke data - ezoro ezo na decrypted. Ma ọ bụrụ na e nwere megabytes, ma ọ bụ gụgharia video, ka ihe atụ?... Classic atụmatụ na MAC mgbe ciphertext na-enye gị ohere ịgụ ya iyi, ozugbo na-ebufe ya. Mana na MTProto ị ga-emerịrị ya na mbụ ezoro ezo ma ọ bụ mebie ozi niile, naanị bufee ya na netwọkụ ma ọ bụ diski. Ya mere, na ụdị kacha ọhụrụ nke Telegram Desktop na cache in user_data A na-ejikwa usoro ọzọ - yana AES na ọnọdụ CTR.

Vasily, [21.06.18 01:27] Oh, achọpụtara m ihe IGE bụ: IGE bụ mgbalị mbụ na "ụdị nzuzo nzuzo," nke mbụ maka Kerberos. Ọ bụ mbọ dara ada (ọ naghị enye nchebe iguzosi ike n'ezi ihe), wee wepụ ya. Nke ahụ bụ mmalite nke ọchịchọ afọ 20 maka ọnọdụ nzuzo na-arụ ọrụ nke na-arụ ọrụ, bụ nke mechiri n'oge na-adịbeghị anya na ụdịdị dị ka OCB na GCM.

Ma ugbu a arụmụka si n'akụkụ ụgbọ ibu:

Ndị otu nọ n'azụ Telegram, nke Nikolai Durov duziri, nwere ndị mmeri ACM isii, ọkara n'ime ha Ph.D na mgbakọ na mwepụ. O were ha ihe dị ka afọ abụọ iji wepụta ụdị MTProto dị ugbu a.

Nke ahụ na-akpa ọchị. Afọ abụọ na ọkwa dị ala

Ma ọ bụ ị nwere ike were tls

Ọ dị mma, ka anyị kwuo na anyị emeela ihe nzuzo na nuances ndị ọzọ. Ọ ga-ekwe omume n'ikpeazụ izipu arịrịọ serialized na TL wee mebie azịza ya? Yabụ kedu na otu ị ga-esi ziga? Ebe a, ka anyị kwuo, usoro njikọ init, ikekwe ọ bụ nke a?

Vasily, [25.06.18 18:46] Na-ebido njikọ wee chekwaa ozi na ngwa na ngwa onye ọrụ.

Ọ na-anabata app_id, device_model, system_version, app_version na lang_code.

Na ụfọdụ ajụjụ

Akwụkwọ dị ka mgbe niile. Enwere onwe gị ịmụ akwụkwọ mepere emepe

Ọ bụrụ na ihe niile doro anya na invokeWithLayer, gịnị na-eme ebe a? Ọ tụgharịrị, ka anyị kwuo na anyị nwere - onye ahịa enweelarị ihe ọ ga-ajụ ihe nkesa - enwere arịrịọ anyị chọrọ iziga:

Vasily, [25.06.18 19:13] N'ikpe ikpe, a na-ekechi oku nke mbụ n'ime ihe efu a, a na-ekekwa ihe ahụ n'onwe ya na invokewithlayer.

Kedu ihe kpatara na initConnection enweghị ike ịbụ oku dị iche, mana ọ ga-abụrịrị ihe mkpuchi? Ee, dị ka ọ tụgharịrị, a ghaghị ime ya mgbe ọ bụla na mmalite nke nnọkọ ọ bụla, ọ bụghị otu ugboro, dị ka isi igodo. Ma! Onye ọrụ enweghị ikike ịkpọ ya! Ugbu a, anyị erutela ogbo ebe ọ dị Nke a akwụkwọ akwụkwọ - ọ na-agwa anyị na ...

Naanị obere akụkụ nke ụzọ API dị maka ndị ọrụ na-enwetaghị ikike:

  • auth.sendCode
  • auth.resendCode
  • akaụntụ.getPassword
  • auth.checkPassword
  • auth.checkPhone
  • auth.mbinye aka
  • auth.nbanye
  • auth.import ikike
  • enyemaka.getConfig
  • enyemaka.getNearestDc
  • help.getAppUpdate
  • help.getCdnConfig
  • langpack.getLangPack
  • langpack.getStrings
  • langpack.getỌdịiche
  • langpack.getLanguages
  • langpack.getLanguage

Nke mbụ n'ime ha, auth.sendCode, ma enwere arịrịọ mbụ a ma ama nke anyị na-eziga api_id na api_hash, ma emesịa anyị na-enweta SMS nwere koodu. Ma ọ bụrụ na anyị nọ na DC na-ezighị ezi (nọmba ekwentị na mba a na-eje ozi site na onye ọzọ, dịka ọmụmaatụ), mgbe ahụ, anyị ga-enweta njehie na nọmba nke DC chọrọ. Iji chọpụta adreesị IP nke nọmba DC ịchọrọ ijikọ, nyere anyị aka help.getConfig. N'otu oge enwere naanị ntinye 5, ma mgbe ihe omume ndị a ma ama nke 2018 gasịrị, ọnụ ọgụgụ ahụ abawanyela nke ukwuu.

Ugbu a, ka anyị cheta na anyị ruru ọkwa a na sava ahụ n'amaghị ama. Ọ bụghị oke ọnụ ịnweta adreesị IP? Kedu ihe kpatara na ị gaghị eme nke a, yana ọrụ ndị ọzọ, na akụkụ MTProto ezoro ezo? Anụ m mkpesa ahụ: "Kedu ka anyị ga-esi jide n'aka na ọ bụghị RKN ga-eji adreesị ụgha zaghachi?" Na nke a, anyị na-echeta na, n'ozuzu, ukara ahịa Ejikwa igodo RSA, i.e. ị nwere ike akara ozi a. N'ezie, a na-eme nke a maka ozi gbasara ịgafe igbochi ndị ahịa na-enweta site na ọwa ndị ọzọ (n'ụzọ ezi uche dị na ya, a pụghị ime nke a na MTProto n'onwe ya; ị ga-achọkwa ịma ebe ị ga-ejikọta).

Ọ DỊ MMA. N'oge a nke ikike ndị ahịa, anyị enwetabeghị ikike yana edebanyeghị akwụkwọ anamachọihe anyị. Naanị anyị chọrọ ịhụ ugbu a ihe ihe nkesa na-anabata ụzọ ndị ọrụ na-enwetaghị ikike. Ma ebe a…

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;

Na atụmatụ, nke mbụ na-abịa nke abụọ

Na tdesktop schema uru nke atọ bụ

Ee, kemgbe ahụ, n'ezie, emelitere akwụkwọ ahụ. Agbanyeghị na n'oge na-adịghị anya ọ ga-adịkwa mkpa ọzọ. Kedu ka onye nrụpụta novice kwesịrị ịma? Ma eleghị anya ọ bụrụ na ị debanyere akwụkwọ anamachọihe gị, ha ga-agwa gị? Vasily mere nke a, ma ee, ha eziteghị ya ihe ọ bụla (ọzọ, anyị ga-ekwu maka nke a na akụkụ nke abụọ).

...Ị hụrụ na anyị abanyelarị n'ụzọ ụfọdụ na API, ya bụ. ruo n'ọkwa ọzọ, wee tụfuo ihe dị na isiokwu MProto? Ọ bụghị ihe ijuanya:

Vasily, [28.06.18 02:04] Mm, ha na-agbagharị site na ụfọdụ algọridim na e2e.

Mtproto na-akọwapụta algọridim nzuzo na igodo maka ngalaba abụọ ahụ, yana ntakịrị ihe nhazi ihe mkpuchi.

Mana ha na-agwakọta ọkwa dị iche iche nke tojupụtara mgbe niile, yabụ na ọ bụghị mgbe niile ka edobere ebe mtproto kwụsịrị na ọkwa ọzọ malitere.

Kedu ka ha si agwakọta? Ọfọn, ebe a bụ otu igodo nwa oge maka PFS, dịka ọmụmaatụ (n'ụzọ, Telegram Desktop enweghị ike ime ya). A na-eme ya site na arịrịọ API auth.bindTempAuthKey, i.e. site na elu larịị. Ma n'otu oge ahụ ọ na-egbochi izo ya ezo na ọkwa dị ala - mgbe nke ahụ gasịrị, dịka ọmụmaatụ, ịkwesịrị ime ya ọzọ. initConnection wdg, nke a abụghị naanị arịrịọ nkịtị. Ihe pụrụ iche bụ na ị nwere ike ịnwe naanị otu igodo nwa oge kwa DC, n'agbanyeghị mpaghara auth_key_id na ozi ọ bụla na-enye gị ohere ịgbanwe igodo ma ọ dịkarịa ala ozi ọ bụla, yana na ihe nkesa nwere ikike "ichefu" igodo nwa oge n'oge ọ bụla - akwụkwọ anaghị ekwu ihe ị ga-eme na nke a ... nke ọma, gịnị kpatara enweghị ike ime. Ị nwere ọtụtụ mkpịsị ugodi, dị ka ọ nwere usoro nnu n'ọdịnihu, yana ?..

Enwere ihe ole na ole ndị ọzọ kwesịrị ịma gbasara isiokwu MTProto.

Ozi ozi, msg_id, msg_seqno, nkwenye, pings n'ụzọ na-ezighi ezi na nghọtahie ndị ọzọ.

Gịnị mere i ji kwesị ịma banyere ha? N'ihi na ha "na-adaba" n'ọkwa dị elu, ma ịkwesịrị ịma ha mgbe ị na-arụ ọrụ na API. Ka anyị were na anyị enweghị mmasị na msg_key; ọkwa dị ala emebiela anyị ihe niile. Mana n'ime data ezoro ezo, anyị nwere mpaghara ndị a (nakwa ogologo data ahụ, yabụ anyị mara ebe padding dị, mana nke ahụ adịghị mkpa):

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

Ka anyị chetara gị na enwere naanị otu nnu maka DC dum. Gịnị mere e ji mara banyere ya? Ọ bụghị naanị n'ihi na enwere arịrịọ get_future_salts, nke na-agwa gị oge nke ga-adị irè, kamakwa n'ihi na ọ bụrụ na nnu gị 'ere ure', mgbe ahụ ozi (arịrịọ) ga-efunahụ ya. Ihe nkesa ahụ ga-, n'ezie, kọọ nnu ọhụrụ site n'iwepụta new_session_created - mana na nke ochie, ị ga-eziga ya n'ụzọ ụfọdụ, dịka ọmụmaatụ. Na nke a okwu na-emetụta ngwa architecture.

A na-ahapụ ihe nkesa ahụ ka ọ daa nnọkọ kpamkpam wee zaghachi n'ụzọ dị otú a maka ọtụtụ ihe kpatara ya. N'ezie, gịnị bụ nnọkọ MTProto site n'akụkụ ndị ahịa? Ndị a bụ ọnụọgụ abụọ session_id и seq_no ozi n'ime nnọkọ a. Ọfọn, yana njikọ TCP dị n'okpuru, n'ezie. Ka anyị kwuo na onye ahịa anyị amaghị ka esi eme ọtụtụ ihe, ọ kwụsịrị ma jikọọ ọzọ. Ọ bụrụ na nke a mere ngwa ngwa - nnọkọ ochie gara n'ihu na njikọ TCP ọhụrụ, mụbaa seq_no n'ihu. Ọ bụrụ na ọ na-ewe ogologo oge, ihe nkesa nwere ike ihichapụ ya, n'ihi na n'akụkụ ya ọ bụkwa kwụ n'ahịrị, dị ka anyị chọpụtara.

Gịnị kwesịrị ịbụ seq_no? Oh, nke ahụ bụ ajụjụ aghụghọ. Gbalịa ịghọta nke ọma ihe ọ pụtara:

Ozi metụtara ọdịnaya

Ozi chọrọ nnabata doro anya. Ndị a gụnyere ndị ọrụ niile na ọtụtụ ozi ọrụ, ihe fọrọ nke nta ka ọ bụrụ ihe niile ma ewezuga akpa na nnabata.

Nọmba Usoro ozi (msg_seqno)

Nọmba 32-bit ha nhata okpukpu abụọ nke ozi "ọdịnaya metụtara" (ndị chọrọ nnabata, ọkachasị ndị na-abụghị arịa) nke onye na-ezipụ mebere tupu ozi a wee mechaa mụbaa site na otu ma ọ bụrụ na ozi ugbu a bụ ozi metụtara ọdịnaya. A na-emepụta akpa mgbe niile mgbe ihe niile dị n'ime ya; ya mere, nọmba usoro ya karịrị ma ọ bụ ha nhata na ọnụọgụ usoro nke ozi dị na ya.

Kedu ụdị egwuregwu nke a na-abawanye site na 1, ma ọzọ site na 2?... Echere m na na mbụ ha pụtara "nke kacha nta maka ACK, ndị ọzọ bụ ọnụọgụ", mana nsonaazụ ya abụghị otu. karịsịa, ọ na-apụta, nwere ike izipu ọtụtụ nkwenye nwere otu seq_no! Kedu? Ọfọn, dịka ọmụmaatụ, ihe nkesa na-ezigara anyị ihe, na-eziga ya, ma anyị onwe anyị na-agbachi nkịtị, na-aza naanị ozi ọrụ na-akwado nnata nke ozi ya. N'okwu a, nkwenye anyị na-apụ apụ ga-enwe otu nọmba ọpụpụ ahụ. Ọ bụrụ na ị maara TCP ma chere na nke a na-ada n'ụzọ ụfọdụ anụ ọhịa, ma ọ dị ka ọ bụghị anụ ọhịa, n'ihi na na TCP. seq_no anaghị agbanwe agbanwe, mana nkwenye na-aga seq_no n'akụkụ nke ọzọ, m ga-eme ngwa ngwa iwe iwe gị. Enyere nkwenye na MTProto Ọ BỤGHỊ on seq_no, dị ka ọ dị na TCP, mana site na msg_id !

Kedu ihe bụ ihe a msg_id, nke kacha mkpa n'ime ubi ndị a? Ihe nchọpụta ozi pụrụ iche, dị ka aha ahụ na-egosi. Akọwapụtara ya dị ka ọnụọgụ 64-bit, nke kacha nta nke ọzọ nwere anwansi "ihe nkesa-abụghị nkesa", ma ndị ọzọ bụ akara oge Unix, gụnyere akụkụ nke akụkụ, tụgharịrị 32 ibe n'aka ekpe. Ndị ahụ. timestamp kwa se (na ozi nwere oge dị iche nke ukwuu ka sava ga-ajụ). Site na nke a ọ na-apụta na n'ozuzu nke a bụ ihe nchọpụta nke zuru ụwa ọnụ maka onye ahịa. Nyere nke ahụ - ka anyị cheta session_id - anyị na-ekwe nkwa: Ọ nweghị ọnọdụ ọ bụla enwere ike izipu ozi ezubere maka otu nnọkọ na nnọkọ dị iche. Ya bụ, ọ na-apụta na enweelarị atọ ọkwa - nnọkọ, nọmba nnọkọ, id ozi. Kedu ihe kpatara mgbagwoju anya dị otú ahụ, ihe omimi a dị oke ukwuu.

Ya mere, msg_id achọrọ maka...

RPC: arịrịọ, nzaghachi, njehie. Nkwenye.

Dị ka ị chọpụtala, ọ nweghị ụdị ma ọ bụ ọrụ pụrụ iche "mere arịrịọ RPC" n'ebe ọ bụla na eserese ahụ, n'agbanyeghị na enwere azịza. E kwuwerị, anyị nwere ozi metụtara ọdịnaya! Ya bụ, ọ bụla ozi nwere ike ịbụ arịrịọ! Ma ọ bụ ghara ịbụ. Ka emechara, onye obula bụ msg_id. Mana enwere azịza:

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

Nke a bụ ebe egosipụtara ozi nke a bụ nzaghachi. Ya mere, n'elu ọkwa nke API, ị ga-echeta ihe ọnụ ọgụgụ nke arịrịọ gị - echere m na ọ dịghị mkpa ịkọwapụta na ọrụ ahụ bụ asynchronous, na enwere ike inwe ọtụtụ arịrịọ na-aga n'ihu n'otu oge ahụ. Azịza ya nke enwere ike iweghachi n'usoro ọ bụla? Na ụkpụrụ, site na nke a na ozi njehie dị ka enweghị ndị ọrụ, ụlọ ọrụ dị n'azụ nke a nwere ike ịchọta: ihe nkesa nke na-ejigide njikọ TCP na gị bụ onye na-ahụ maka njedebe n'ihu, ọ na-ebuga arịrịọ na azụ azụ ma na-anakọta ha azụ site na. message_id. O yiri ka ihe niile ebe a doro anya, ezi uche na ezi.

Ee?.. Ma ọ bụrụ na ị na-eche banyere ya? E kwuwerị, nzaghachi RPC n'onwe ya nwekwara ubi msg_id! Anyị kwesịrị tie mkpu na ihe nkesa "ị naghị aza azịza m!"? Ma ee, kedu ihe dị gbasara nkwenye? Banyere ibe ozi gbasara ozi na-agwa anyị ihe bụ

msgs_ack#62d6b459 msg_ids:Vector long = MsgsAck;

a ga-emekwa ya n’akụkụ nke ọ bụla. Ma ọ bụghị mgbe niile! Ọ bụrụ na ị nwetara RpcResult, ya onwe ya na-eje ozi dị ka nkwenye. Ya bụ, ihe nkesa nwere ike iji MsgsAck zaa arịrịọ gị - dị ka, "Enwetara m ya." RpcResult nwere ike ịza ozugbo. O nwere ike ịbụ ha abụọ.

Ma ee, ị ka ga-aza azịza ya! Nkwenye. Ma ọ bụghị ya, ihe nkesa ahụ ga-eche na ọ gaghị ebufe ya ma zighachi gị ya ọzọ. Ọbụna mgbe njikọta ọzọ. Ma ebe a, n'ezie, okwu nke oge nkwụsị na-ebilite. Ka anyị lee ha anya ntakịrị oge.

Ka ọ dị ugbu a, ka anyị leba anya na njehie mmezu nke ajụjụ nwere ike ime.

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

Oh, mmadụ ga-eti mkpu, ebe a bụ usoro mmadụ karịa - enwere ahịrị! Were oge ị chọrọ. Ebe a ndepụta njehie, ma n'ezie ezughị ezu. Site na ya anyị na-amụta na koodu bụ ihe dị ka Njehie HTTP (nke ọma, n'ezie, anaghị asọpụrụ semantics nke nzaghachi, n'ebe ụfọdụ a na-ekesa ya n'enweghị usoro n'etiti koodu), na ahịrị dị ka CAPITAL_LETTERS_AND_NUMBERS. Dịka ọmụmaatụ, PHONE_NUMBER_OCCPIED ma ọ bụ FILE_PART_Х_MISSING. Ọfọn, ya bụ, ị ka ga-achọ ahịrị a tugharia. Dịka ọmụmaatụ FLOOD_WAIT_3600 ga-apụta na ị ga-echere otu awa, na PHONE_MIGRATE_5, na a ga-edenye nọmba ekwentị nwere prefix a na 5th DC. Anyị nwere ụdị asụsụ, nri? Anyị achọghị arụmụka sitere na eriri, ndị na-eme oge niile ga-eme, ọ dị mma.

Ọzọ, nke a abụghị na ibe ozi ọrụ, mana, dị ka ọ dị na mbụ na ọrụ a, enwere ike ịchọta ozi ahụ na ibe akwụkwọ ọzọ. Ma ọ bụ tuo enyo. Nke mbụ, lee, emebi emebi dee / oyi akwa - RpcError nwere ike itinye n'ime RpcResult. Gịnị kpatara na ọ bụghị n'èzí? Kedu ihe anyị na-ejighị n'aka?... N'ihi ya, olee ebe nkwa ahụ dị RpcError enweghị ike itinye na RpcResult, ma bụrụ kpọmkwem ma ọ bụ akwụ ụgwọ n'ụdị ọzọ? ... Ma ọ bụrụ na ọ nweghị ike, gịnị kpatara na ọ bụghị na ọkwa dị elu, ya bụ. ọ na-efu req_msg_id ? ..

Mana ka anyị gaa n'ihu gbasara ozi ọrụ. Onye ahịa ahụ nwere ike iche na ihe nkesa na-eche ogologo oge ma rịọ arịrịọ a magburu onwe ya:

rpc_drop_answer#58e4a740 req_msg_id:long = RpcDropAnswer;

Enwere azịza nke atọ maka ajụjụ a, ọzọ na-ejikọta ya na usoro nkwenye; na-agbalị ịghọta ihe ha kwesịrị ịbụ (na ihe nchịkọta nke ụdị nke na-adịghị achọ nkwenye) na-ahapụ onye na-agụ ya dị ka ihe omume ụlọ (dee: ozi dị na ya). koodu isi mmalite nke Desktọpụ Telegram ezughị ezu).

Ọgwụ riri ahụ: ozi statuses

N'ozuzu, ọtụtụ ebe na TL, MTProto na Telegram n'ozuzu ha na-ahapụ mmetụta nke isi ike, ma n'ihi nkwanye ùgwù, akọ na ndị ọzọ. nkà dị nro Anyị ji nkwanye ùgwù gbachie nkịtị banyere ya, na-enyocha ihe rụrụ arụ na mkparịta ụka ahụ. Agbanyeghị, ebe aОọtụtụ n'ime ibe ahụ gbasara ozi gbasara ozi Ọ na-awụ akpata oyi n'ahụ ọbụna nye m, bụ onye na-arụ ọrụ na usoro netwọk ruo ogologo oge ma hụ ịnyịnya ígwè nke ọkwa mgbagwoju anya dị iche iche.

Ọ na-amalite n'enweghị nsogbu, yana nkwenye. Ọzọ ha na-agwa anyị banyere

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;

Ọfọn, onye ọ bụla nke na-amalite ịrụ ọrụ na MTProto ga-emekọrịta ihe na ha; n'ime usoro a na-emezigharị - nke a kwadoro, ịnweta nọmba njehie ma ọ bụ nnu nke jisiri ike mee ihe ọjọọ n'oge ndezi bụ ihe a na-ahụkarị. Agbanyeghị, enwere isi ihe abụọ ebe a:

  1. Nke a pụtara na ozi izizi efuola. Anyị kwesịrị ịmepụta ụfọdụ kwụ n'ahịrị, anyị ga-ele ya anya ma emechaa.
  2. Gịnị bụ ndị a iju njehie nọmba? 16, 17, 18, 19, 20, 32, 33, 34, 35, 48, 64... ebee ka ọnụọgụgụ ndị ọzọ dị, Tommy?

Akwụkwọ ahụ kwuru:

Ebumnuche bụ na a na-achịkọta ụkpụrụ njehie_code (error_code >> 4): dịka ọmụmaatụ, koodu 0x40 — 0x4f kwekọrọ na njehie na ire ere.

ma, nke mbụ, mgbanwe n'akụkụ nke ọzọ, na nke abụọ, ọ dịghị mkpa, ebee ka koodu ndị ọzọ dị? N'isi onye edemede?... Otú ọ dị, ndị a bụ obere ihe.

Ihe riri ahụ na-amalite na ozi gbasara ọnọdụ ozi na mbipụta ozi:

  • Arịrịọ maka ozi ọnọdụ ozi
    Ọ bụrụ na otu ọ bụla enwetabeghị ozi gbasara ọnọdụ ozi ọ na-apụ nwa oge, ọ nwere ike ịrịọ ya n'ụzọ doro anya n'aka ndị ọzọ:
    msgs_state_req#da69fb52 msg_ids:Vector long = MsgsStateReq;
  • Ozi gbasara ozi gbasara ọnọdụ ozi
    msgs_state_info#04deb57d req_msg_id:long info:string = MsgsStateInfo;
    Ebe a, info bụ eriri nwere kpọmkwem otu byte nke ọkwa ozi maka ozi ọ bụla sitere na listi msg_ids na-abata:

    • 1 = Ọ nweghị ihe a ma ama gbasara ozi ahụ (msg_id dị ala, onye nke ọzọ nwere ike chefuola ya)
    • 2 = anataghị ozi (msg_id dara n'ime ụdị njirimara echekwara; agbanyeghị, ndị nke ọzọ enwetabeghị ozi dị otú ahụ)
    • 3 = anataghị ozi (msg_id oke oke; agbanyeghị, ndị nke ọzọ enwetabeghị ya)
    • 4 = ozi enwetara (mara na nzaghachi a bụkwa n'otu oge nnabata nnata)
    • +8 = anabatala ozi
    • +16 = ozi anaghị achọ nnabata
    • +32 = Ajụjụ RPC dị na ozi a na-ahazi ma ọ bụ hazielarị
    • +64 = nzaghachi metụtara ọdịnaya maka ozi ewepụtaralarị
    • +128 = Ndị ọzọ mara n'ezie na anatala ozi
      Nzaghachi a anaghị achọ nnabata. Ọ bụ nnabata nke msgs_state_req dị mkpa, n'onwe ya.
      Rịba ama na ọ bụrụ na ọ pụta na mberede na ndị ọzọ enweghị ozi ọ dị ka ezigara ya, enwere ike izipu ya ọzọ. Ọ bụrụgodị na onye nke ọzọ kwesịrị ịnata akwụkwọ ozi abụọ n'otu oge, a ga-eleghara ya anya. (Ọ bụrụ na ogologo oge agafeela, na msg_id mbụ adịkwaghị irè, a ga-ekechi ozi ahụ na msg_copy).
  • Nkwukọrịta afọ ofufo nke ọnọdụ ozi
    Otu ọ bụla nwere ike jiri aka ya mee ka ndị ọzọ mara ọkwa nke ozi ndị ọzọ na-ebusara.
    msgs_all_info#8cc0d131 msg_ids:Vector long info:string = MsgsAllInfo
  • Nkwukọrịta afọ ofufo agbatịkwuru maka ọnọdụ nke otu ozi
    ...
    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;
  • Arịrịọ doro anya ka izipu ozi
    msg_resend_req#7d861a08 msg_ids:Vector long = MsgResendReq;
    Ndị otu dịpụrụ adịpụ zara ozugbo site na izipu ozi a rịọrọ […]
  • Arịrịọ doro anya ka izipu azịza
    msg_resend_ans_req#8610baeb msg_ids:Vector long = MsgResendReq;
    Ndị otu dịpụrụ adịpụ na-aza ozugbo site na izipu ọzọ -aza, na ozi a rịọrọ […]
  • Mpempe akwụkwọ ozi
    N'ọnọdụ ụfọdụ, a ga-ezigaghachi ozi ochie nwere msg_id nke na-adịkwaghị irè. Mgbe ahụ, a na-ekechi ya n'ime akpa oyiri:
    msg_copy#e06046b2 orig_message:Message = MessageCopy;
    Ozugbo enwetara ya, a na-ahazi ozi ahụ dị ka a ga-asị na ihe mkpuchi ahụ adịghị ebe ahụ. Agbanyeghị, ọ bụrụ na amaara nke ọma na enwetara orig_message.msg_id ozi, yabụ anaghị edozi ozi ọhụrụ ahụ (mgbe n'otu oge ahụ, a nabatara ya na orig_message.msg_id). Uru nke orig_message.msg_id ga-adị ala karịa msg_id nke akpa.

Ka anyị gbachi nkịtị maka gịnị msgs_state_info ọzọ ntị nke TL na-emechabeghị na-arapara n'ahụ (anyị chọrọ vector nke bytes, na na ala abụọ ibe n'ibe e nwere enum, na elu ibe n'ibe abụọ e nwere ọkọlọtọ). Isi ihe dị iche. Ọ nwere onye ghọtara ihe kpatara ihe a niile ji eme? na ezigbo onye ahịa ọ dị mkpa? .. Na ike, ma onye nwere ike iche n'echiche ụfọdụ uru ma ọ bụrụ na mmadụ na-etinye aka na debugging, na na mmekọrịta mode - jụọ ihe nkesa ihe na otú. Mana ebe a ka akọwara arịrịọ ndị ahụ njem okirikiri.

Ọ na-esote na onye ọ bụla ga-enwerịrị ike izo ya ezo na izipu ozi, kamakwa chekwaa data gbasara onwe ha, gbasara nzaghachi ha, maka oge amabeghị. Akwụkwọ ahụ akọwaghị oge ma ọ bụ ọdabara njirimara ndị a. enweghị ụzọ. Ihe kacha ịtụnanya bụ na a na-eji ha eme ihe na koodu ndị ahịa gọọmentị! O doro anya na a gwara ha ihe na-adịghị etinye n'akwụkwọ ọha. Ghọta site na koodu n’ihi gịnị, adịkwaghị mfe dị ka ọ dị n'ihe gbasara TL - ọ bụghị akụkụ (n'ụzọ ezi uche dị na ya) dịpụrụ adịpụ, kama ọ bụ nke ejikọtara na nhazi ngwa ngwa, ya bụ. ga-achọ nnukwu oge karịa iji ghọta koodu ngwa.

Pings na oge. Ahịrị.

Site na ihe niile, ma ọ bụrụ na anyị na-echeta guesses banyere ihe nkesa ije (nkesa nke arịrịọ n'ofe backends), a kama mwute ihe na-esote - n'agbanyeghị niile nnyefe nkwa na TCP (ma ọ bụ data na-anapụta, ma ọ bụ na ị ga-gwara banyere ọdịiche, ma. A ga-ebufe data ahụ tupu nsogbu ahụ emee), nkwenye ahụ na MTProto n'onwe ya - enweghị nkwa. Ihe nkesa ahụ nwere ike tufuo ma ọ bụ tụfuo ozi gị n'ụzọ dị mfe, ọ nweghịkwa ihe a ga-eme banyere ya, naanị jiri ụdị crutches dị iche iche.

Na mbụ niile - ozi queues. Ọfọn, na otu ihe ihe niile doro anya site na mmalite - ozi na-akwadoghị ga-echekwa ma were iwe. Ma olee mgbe oge gachara? Na jester maara ya. Ikekwe ozi ọrụ ahụ riri ahụ n'ụzọ ụfọdụ dozie nsogbu a na crutches, sịnụ, na Telegram Desktop enwere ihe dị ka ahịrị 4 kwekọrọ na ha (ma eleghị anya karịa, dịka e kwuworo, maka nke a, ịkwesịrị ịbanye n'ime koodu ya na ụkpụrụ ya nke ọma; n'otu aka ahụ. oge, anyị maara na a pụghị iwere ya dị ka ihe atụ; a naghị eji ụdị ụfọdụ sitere na atụmatụ MTProto na ya).

Gịnị mere nke a ji eme? Eleghị anya, ndị na-eme ihe nkesa enweghị ike ịhụ na a pụrụ ịdabere na ya n'ime ụyọkọ ahụ, ma ọ bụ ọbụna na-ebufe n'ihu balancer, ma bufee nsogbu a na onye ahịa. N'ihi obi nkoropụ, Vasily gbalịrị mejuputa nhọrọ ọzọ, na-eji naanị abụọ kwụ n'ahịrị, na-eji algọridim sitere na TCP - tụọ RTT na ihe nkesa na ịhazi nha nke "window" (na ozi) dabere na ọnụ ọgụgụ nke arịrịọ akwadoghị. Ya bụ, heuristic dị otú ahụ siri ike maka ịlele ibu nke ihe nkesa bụ ole n'ime arịrịọ anyị nwere ike ịta n'otu oge ma ghara ịla n'iyi.

Ọfọn, ya bụ, ị ghọtara, nri? Ọ bụrụ na ị ga-emejuputa TCP ọzọ n'elu a protocol na-aga n'ihu TCP, nke a na-egosi na a na-adịghị mma emebere protocol.

Ee ee, kedu ihe kpatara ịchọrọ ihe karịrị otu kwụ n'ahịrị, gịnịkwa ka nke a pụtara maka onye na-eji API ọkwa dị elu na-arụ ọrụ? Lee, ị na-arịọ arịrịọ, hazie ya, mana ọtụtụ mgbe ị nweghị ike izipu ya ozugbo. Gịnị kpatara? N'ihi na azịza ga-abụ msg_id, nke na-adịru nwa ogeаAbụ m akara, ọrụ nke kacha mma yigharịrị ruo n'oge dị ka o kwere mee - ọ bụrụ na ihe nkesa na-ajụ ya n'ihi oge na-adịghị mma n'etiti anyị na ya (n'ezie, anyị nwere ike ime crutch nke na-agbanwe oge anyị site ugbu a). na ihe nkesa site na ịtinye delta gbakọọ site na nzaghachi nke ihe nkesa - ndị ahịa ọrụ na-eme nke a, mana ọ bụ ihe ọjọọ na ezighi ezi n'ihi nkwụsị). Ya mere, mgbe ị na-arịọ arịrịọ site na oku ọrụ mpaghara site na ọba akwụkwọ, ozi na-agafe usoro ndị a:

  1. Ọ dabere n'otu kwụ n'ahịrị na-echere ezoro ezo.
  2. A họpụtara msg_id na ozi wee gaa n'ahịrị ọzọ - enwere ike ibugharị; ziga na oghere.
  3. a) Ihe nkesa zara MsgsAck - ezigara ozi ahụ, anyị na-ehichapụ ya na " kwụ n'ahịrị ndị ọzọ ".
    b) Ma ọ bụ n'ụzọ ọzọ, ọ nweghị mmasị na ihe, ọ zara badmsg - resend si "ọzọ kwụ n'ahịrị"
    c) Ọ dịghị ihe a maara, ozi ahụ kwesịrị iwe iwe site na kwụ n'ahịrị ọzọ - mana amataghị kpọmkwem mgbe.
  4. Ihe nkesa ahụ mechara zaghachi RpcResult - nzaghachi n'ezie (ma ọ bụ njehie) - ọ bụghị naanị napụtara, kamakwa hazie ya.

Eleghị anya, iji arịa nwere ike dozie nsogbu ahụ n'akụkụ ụfọdụ. Nke a bụ mgbe a na-achịkọta ọtụtụ ozi n'ime otu, ma ihe nkesa zara ya na nkwenye nye ha niile otu oge, n'otu oge. msg_id. Mana ọ ga-ajụ mkpọ a, ma ọ bụrụ na ihe adịghị mma, n'ozuzu ya.

Ma n'oge a, echiche ndị na-abụghị nkà na ụzụ na-abata. Site na ahụmahụ, anyị ahụwo ọtụtụ crutches, na na mgbakwunye, anyị ga-ahụ ugbu a ihe atụ nke ọjọọ ndụmọdụ na ije - n'ọnọdụ ndị dị otú ahụ, ọ bara uru ịtụkwasị obi na ime mkpebi ndị dị otú ahụ? Ajụjụ a bụ nkwupụta okwu (n'ezie ọ bụghị).

Kedu ihe anyị na-ekwu? Ọ bụrụ na isiokwu nke "ozi ọgwụ gbasara ozi" ị ka nwere ike ịkọ nkọ na mkpesa dị ka "ị bụ onye nzuzu, ị ghọtaghị atụmatụ anyị mara mma!" (ya mere dee akwụkwọ mbụ, dị ka ndị nkịtị kwesịrị, na ezi uche na ihe atụ nke mgbanwe ngwugwu, mgbe ahụ, anyị ga-ekwu okwu), mgbe ahụ, oge / oge nkwụsịtụ bụ ajụjụ bara uru na kpọmkwem, ihe niile ebe a ka amara ogologo oge. Kedu ihe akwụkwọ ahụ na-agwa anyị gbasara oge nkwụsị?

Ihe nkesa na-anabatakarị nnata ozi sitere n'aka onye ahịa (na-adịkarị, ajụjụ RPC) site na iji nzaghachi RPC. Ọ bụrụ na nzaghachi bụ ogologo oge na-abịa, ihe nkesa nwere ike ibu ụzọ zipu nnabata nnata, na ntakịrị oge, nzaghachi RPC n'onwe ya.

Onye ahịa na-anabatakarị nnata ozi sitere na sava (na-emekarị, nzaghachi RPC) site na ịgbakwunye nkwenye na ajụjụ RPC na-esote ma ọ bụrụ na ebufeghị ya n'oge (ọ bụrụ na emepụtara ya, sịnụ, 60-120 sekọnd na-esote nnata ahụ. nke ozi sitere na sava). Otú ọ dị, ọ bụrụ na ruo ogologo oge, ọ dịghị ihe mere ị ga-eji zipu ozi na ihe nkesa ma ọ bụ ọ bụrụ na e nwere ọnụ ọgụgụ buru ibu nke ozi ndị a na-anabataghị site na ihe nkesa (sịnụ, karịa 16), onye ahịa ahụ na-ebufe nkwenye n'onwe ya.

... M na-atụgharị: anyị onwe anyị amaghị ole na otú anyị chọrọ ya, ya mere, ka anyị chee na ka ọ dị ka nke a.

Na banyere pings:

Ozi Ping (PING/PONG)

ping#7abe77ec ping_id:long = Pong;

A na-eweghachikarị nzaghachi na otu njikọ:

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

Ozi ndị a anaghị achọ nnabata. A na-ebunye pong naanị na nzaghachi na ping ebe enwere ike ịmalite ping site n'akụkụ ọ bụla.

Mmechi njikọ akwụsịla + PING

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

Na-arụ ọrụ dị ka ping. Na mgbakwunye, mgbe enwetara nke a, ihe nkesa na-amalite ngụ oge nke ga-emechi njikọ dị ugbu a disconnect_delay sekọnd ma emechaa ọ gwụla ma ọ natara ozi ọhụrụ nke otu ụdị nke na-emegharị oge niile gara aga ozugbo. Ọ bụrụ na onye ahịa na-eziga pings ndị a otu ugboro kwa sekọnd 60, dịka ọmụmaatụ, ọ nwere ike ịtọ disconnect_delay hà nhata 75 sekọnd.

Isi o mebiri gị?! N'ime sekọnd 60, ụgbọ oloko ahụ ga-abanye n'ọdụ ụgbọ mmiri ahụ, dapụ ma buru ndị njem, wee hapụ kọntaktị ọzọ na ọwara ahụ. N'ime sekọnd 120, ka ị na-anụ ya, ọ ga-abịarute na nke ọzọ, na njikọ ahụ ga-agbajikwa. Ọfọn, o doro anya na ebe ụkwụ na-abịa - "Anụrụ m ụda, ma amaghị ebe ọ dị", e nwere Nagl algorithm na nhọrọ TCP_NODELAY, ezubere maka ọrụ mmekọrịta. Ma, gbaghara m, jide n'aka na uru nke ndabara - 200 Millisekọnd Ọ bụrụ n'ezie na ịchọrọ igosipụta ihe yiri ya wee chekwaa na ngwugwu ole na ole enwere ike, wee gbanyụọ ya maka sekọnd 5, ma ọ bụ ihe ọ bụla "Onye ọrụ na-ede ..." oge nkwụsị ozi dị ugbu a. Ma ọ dịghị ọzọ.

N'ikpeazụ, pings. Ya bụ, ịlele ịdị ndụ nke njikọ TCP. Ọ bụ ihe na-atọ ọchị, mana ihe dị ka afọ 10 gara aga, edere m ederede dị egwu banyere onye ozi nke ụlọ akwụkwọ ngalaba anyị - ndị ode akwụkwọ nọ n'ebe ahụ wepụrụ ihe nkesa ahụ n'aka onye ahịa, ọ bụghị nke ọzọ. Mana ụmụ akwụkwọ afọ 3 bụ otu ihe, ụlọ ọrụ mba ụwa bụ ihe ọzọ, nri? ..

Nke mbụ, obere mmemme mmụta. Njikọ TCP, na enweghị mgbanwe ngwugwu, nwere ike ịdị ndụ ruo izu. Nke a bụ ma ihe ọma ma dị njọ, dabere na ebumnuche ya. Ọ dị mma ma ọ bụrụ na ị nwere njikọ SSH meghere ihe nkesa ahụ, ị ​​​​si na kọmpụta ahụ bilie, malitegharịa rawụta ahụ, laghachi n'ebe gị - nnọkọ site na ihe nkesa a adịghị adọka (ị pịghị ihe ọ bụla, ọ dịghị ngwugwu) , ọ dabara. Ọ dị njọ ma ọ bụrụ na e nwere puku kwuru puku ndị ahịa na ihe nkesa ahụ, onye ọ bụla na-eburu ihe onwunwe (ndewo, Postgres!), Na onye ọbịa onye ahịa nwere ike ịmaliteghachi ogologo oge gara aga - mana anyị agaghị ama ya.

Sistemụ nkata/IM na-adaba n'okwu nke abụọ maka otu ihe ọzọ - statuses online. Ọ bụrụ na onye ọrụ ahụ "dapụ", ị ga-agwa ndị na-eso ya maka nke a. Ma ọ bụghị ya, ị ga-ejedebe na mmejọ nke ndị okike Jabber mere (ma dozie maka afọ 20) - onye ọrụ ahụ akwụsịla, ma ha na-aga n'ihu na-edegara ya ozi, na-ekwenye na ọ nọ n'ịntanetị (nke furu efu na ndị a kpamkpam). nkeji ole na ole tupu achọpụta njikọ ahụ). Mba, nhọrọ TCP_KEEPALIVE, nke ọtụtụ ndị na-aghọtaghị ka oge TCP si arụ ọrụ na-atụba n'enweghị usoro (site na ịtọ ụkpụrụ ọhịa dị ka iri iri nke sekọnd), agaghị enyere aka ebe a - ịkwesịrị ijide n'aka na ọ bụghị naanị kernel OS. nke igwe onye ọrụ dị ndụ, mana ọ na-arụkwa ọrụ nke ọma, na-enwe ike ịzaghachi, yana ngwa n'onwe ya (ị chere na ọ nweghị ike ifriizi? Telegram Desktop na Ubuntu 18.04 froze m karịa otu ugboro).

Ọ bụ ya mere ị ga-eji ping nkesa onye ahịa, ma ọ bụghị nke ọzọ - ọ bụrụ na onye ahịa ahụ emee nke a, ọ bụrụ na njikọ ahụ agbajiri, a gaghị enyefe ping, a gaghị eme ihe mgbaru ọsọ ahụ.

Kedu ihe anyị na-ahụ na Telegram? Ọ bụ kpọmkwem ihe megidere ya! Ọfọn, ya bụ. N'ezie, n'ezie, akụkụ abụọ ahụ nwere ike ịpị ibe ha. Na omume, ndị ahịa na-eji crutch ping_delay_disconnect, nke na-edozi oge na ihe nkesa. Ọ dị mma, gbaghara m, ọ bụghị onye ahịa ka ọ ga-ekpebi ogologo oge ọ chọrọ ibi ebe ahụ na-enweghị ping. Ihe nkesa, dabere na ibu ya, maara nke ọma. Ma, n'ezie, ọ bụrụ na ị naghị eche banyere ihe onwunwe, mgbe ahụ ị ga-abụ Pinocchio ọjọọ nke gị, na crutch ga-eme ...

Olee otú e kwesịrị isi kee ya?

Ekwenyere m na eziokwu ndị a dị n'elu na-egosi n'ụzọ doro anya na ndị otu Telegram/VKontakte erughị eru na ngalaba njem (na ala) ọkwa netwọkụ kọmputa na iru eru ha dị ala na ihe ndị dị mkpa.

Gịnị mere o ji bụrụ ihe mgbagwoju anya, oleekwa otú ndị na-ese ụkpụrụ Telegram ga-esi gbalịa ịjụ? Eziokwu ahụ bụ na ha gbalịrị ime nnọkọ nke na-adị ndụ na njikọ TCP na-agbaji, ya bụ, ihe a na-enyeghị ugbu a, anyị ga-anapụta ma emechaa. Ma eleghị anya, ha gbalịrị ime njem UDP, ma ha zutere ihe isi ike ma gbahapụ ya (ya mere akwụkwọ ahụ enweghị ihe ọ bụla - ọ dịghị ihe ọ bụla ị ga-etu ọnụ). Ma n'ihi enweghị nghọta nke otú netwọk n'ozuzu na TCP na-arụ ọrụ karịsịa, ebe ị nwere ike ịdabere na ya, na ebe ị chọrọ ime ya onwe gị (na otú), na mgbalị iji jikọta nke a na cryptography "nnụnụ abụọ na. otu nkume", nke a bụ ihe si na ya pụta.

Olee otú ọ dị mkpa? Dabere na eziokwu ahụ msg_id bụ stampụ oge dị mkpa site na echiche cryptographic iji gbochie mbuso agha, ọ bụ mmejọ itinye ọrụ njirimara pụrụ iche na ya. Ya mere, na-enweghị isi na-agbanwe agbanwe ụkpụrụ ụlọ dị ugbu a (mgbe ewepụtara iyi mmelite, nke ahụ bụ isiokwu API dị elu maka akụkụ ọzọ nke usoro isiokwu a), mmadụ ga-achọ:

  1. Ihe nkesa na-ejide njikọ TCP na onye ahịa na-arụ ọrụ - ọ bụrụ na ọ gụchara site na oghere, biko kwenye, hazie ma ọ bụ weghachi njehie, enweghị mfu. Mgbe ahụ nkwenye ahụ abụghị vector nke ids, kama naanị "nke ikpeazụ natara seq_no" - naanị ọnụọgụ, dịka na TCP (nọmba abụọ - seq gị na nke enwetara). Anyị na-anọkarị na nnọkọ ahụ, ọ bụghị anyị?
  2. Oge stampụ iji gbochie mbuso agha mmegharị na-aghọ ogige dị iche, enweghị atụ. A na-enyocha ya, mana ọ naghị emetụta ihe ọ bụla ọzọ. Zuru oke na uint32 - Ọ bụrụ na nnu anyị na-agbanwe ma ọ dịkarịa ala ọkara otu ụbọchị, anyị nwere ike ịkenye 16 ibe n'ibe n'ime obere usoro nke ihe integer nke ugbu a, ndị ọzọ - na akụkụ nke akụkụ nke sekọnd (dị ka ugbu a).
  3. Ewepụrụ msg_id mgbe nile - site n'echiche nke ịmata ọdịiche dị na arịrịọ na backends, e nwere, nke mbụ, ndị ahịa id, na nke abụọ, nnọkọ id, concatenate ha. N'ihi ya, naanị otu ihe zuru ezu dị ka ihe nchọpụta arịrịọ seq_no.

Nke a abụghịkwa nhọrọ kacha aga nke ọma; enweghị usoro zuru oke nwere ike bụrụ ihe nchọpụta - nke a emelarị na API dị elu mgbe ị na-eziga ozi, n'agbanyeghị. Ọ ga-aka mma ịmegharị ụlọ ahụ kpamkpam site na ikwu na zuru oke, mana nke a bụ isiokwu maka akụkụ ọzọ, ọ bụghị nke a.

API?

Ta- daam! Ya mere, ebe ọ gbasiri ike site n'okporo ụzọ jupụtara na mgbu na nkwụsịtụ, anyị mechara nwee ike izipu arịrịọ ọ bụla na ihe nkesa ahụ wee nweta azịza ọ bụla nye ha, yana nweta mmelite site na ihe nkesa (ọ bụghị nzaghachi maka arịrịọ, ma ya n'onwe ya). na-ezitere anyị, dị ka PUSH, ọ bụrụ na onye ọ bụla doro anya n'ụzọ ahụ).

Ntị, ugbu a, a ga-enwe nanị ihe atụ na Perl na isiokwu! (maka ndị na-amaghị syntax ahụ, arụmụka mbụ nke ngọzi bụ nhazi data nke ihe ahụ, nke abụọ bụ klas ya):

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

Ee, ọ bụghị onye mbibi na ebumnuche - ọ bụrụ na ịgụbeghị ya, gaa n'ihu mee ya!

Oh, wai~~... kedu ihe nke a dị? Ihe a maara nke ọma… ikekwe nke a bụ usoro data nke API Weebụ na-ahụkarị na JSON, belụsọ na klaasị na-agbakwunyere na ihe?...

Ya mere, nke a bụ otú o si pụta ... Gịnị bụ ihe niile banyere, comrades? .. Mgbalị dị ukwuu - anyị kwụsịrị izu ike ebe ndị na-eme ihe nkiri Weebụ. na-amalite?...Ọ bụ naanị JSON karịrị HTTPS agaghị adị mfe karị?! Gịnị ka anyị nwetara n'ọnọdụ? Mgbalị ahụ ò kwesịrị ya?

Ka anyị tụlee ihe TL+MTProto nyere anyị na ihe ọzọ ga-ekwe omume. Ọfọn, HTTP, nke na-elekwasị anya na ụdị nzaghachi arịrịọ, bụ ihe na-adịghị mma, ma ọ dịkarịa ala ihe dị n'elu TLS?

Kọmpat serialization. Ịhụ nhazi data a, dị ka JSON, echetara m na enwere ụdị ọnụọgụ abụọ ya. Ka anyị kaa MsgPack dị ka enweghị ike ịgbatị, mana enwere, dịka ọmụmaatụ, CBOR - n'ụzọ, ọkọlọtọ akọwara na ya. RFC 7049. Ọ bụ ihe a ma ama maka eziokwu na ọ na-akọwa mkpado, dị ka usoro mgbasawanye, na n'etiti ahaziri ọkọlọtọ dị:

  • 25 + 256 - dochie ahịrị ugboro ugboro na ntinye aka na nọmba ahịrị, usoro mkpakọ dị ọnụ ala.
  • 26 - ihe Perl serialized nwere aha klaasị na arụmụka onye nrụpụta
  • 27 - ihe na-adabereghị n'asụsụ serialized nwere ụdị aha na arụmụka onye nrụpụta

Ọ dị mma, agbalịrị m ịhazi otu data ahụ na TL yana na CBOR site na iji eriri na ịkwakọ ihe. Nsonaazụ malitere ịdịgasị iche maka CBOR ebe site na megabyte:

cborlen=1039673 tl_len=1095092

Ya mere, mmechi: Enwere usoro dị mfe karịa nke na-adabaghị na nsogbu nke ọdịda mmekọrịta ma ọ bụ njirimara amaghi ama, yana arụmọrụ yiri ya.

Ntọala njikọ ngwa ngwa. Nke a pụtara efu RTT mgbe ejikọtara ya (mgbe emelarị igodo otu ugboro) - ọdabara site na ozi MTProto nke mbụ, mana na ndoputa ụfọdụ - kụọ otu nnu ahụ, nnọkọ anaghị ere ere, wdg. Kedu ihe TLS na-enye anyị kama? Kwuo okwu na isiokwu:

Mgbe ị na-eji PFS na TLS, tiketi nnọkọ TLS (RFC 5077) ịmaliteghachi nnọkọ ezoro ezo na-enweghị mkparita uka igodo ọzọ na-echekwaghị ozi isi na sava ahụ. Mgbe imepe njikọ mbụ na ịmepụta igodo, ihe nkesa na-ezochi ọnọdụ njikọ ahụ ma nyefee ya na onye ahịa (n'ụdị tiketi nnọkọ). N'ihi ya, mgbe njikọ ahụ maliteghachiri, onye ahịa na-eziga tiketi nnọkọ, gụnyere igodo nnọkọ, laghachi na sava ahụ. Eji igodo nwa oge ezoro tiketi ahụ n'onwe ya (igodo tiketi nnọkọ), nke echekwara na sava ma a ga-ekesa ya n'etiti sava frontend niile na-ahazi SSL na ngwọta nchịkọta.[10]. Ya mere, iwebata tiketi nnọkọ nwere ike imebi PFS ma ọ bụrụ na emebie igodo nkesa nwa oge, dịka ọmụmaatụ, mgbe echekwara ha ogologo oge (OpenSSL, nginx, Apache na-echekwa ha na ndabara maka oge niile nke mmemme ahụ; saịtị ndị a ma ama na-eji. igodo ruo ọtụtụ awa, ruo ụbọchị).

N'ebe a, RTT abụghị efu, ịkwesịrị ịgbanwe ma ọ dịkarịa ala ClientHello na ServerHello, mgbe nke ahụ gasịrị onye ahịa nwere ike izipu data yana Finished. Ma ebe a, anyị kwesịrị icheta na anyị enweghị Web, ya na ụyọkọ nke ọhụrụ meghere njikọ, ma onye ozi, njikọ nke na-abụkarị otu na ọtụtụ ma ọ bụ na-erughị ogologo ndụ, dịtụ obere arịrịọ na ibe weebụ - ihe niile na- multiplexed. n'ime. Ya bụ, ọ bụ ihe a na-anabata nke ọma ma ọ bụrụ na anyị ahụghị ụzọ ụgbọ oloko dị njọ.

Chefuru ihe ọzọ? Dee na nkọwa.

Ka ga-aga n'ihu!

N'akụkụ nke abụọ nke usoro isiokwu a, anyị ga-atụle ọ bụghị teknụzụ, mana okwu nhazi - ụzọ, echiche, interface, àgwà n'ebe ndị ọrụ, wdg. Dabere, Otú ọ dị, na teknuzu ozi na e gosiri ebe a.

Akụkụ nke atọ ga-aga n'ihu na-enyocha akụkụ teknụzụ / ahụmịhe mmepe. Ị ga-amụta, karịsịa:

  • aga n'ihu nke pandemonium na ụdị TL dị iche iche
  • ihe amaghi ama gbasara ọwa na nnukwu otu
  • gịnị kpatara mkparịta ụka ji dị njọ karịa roster
  • gbasara ozi zuru oke vs ikwu okwu
  • kedu ihe dị iche n'etiti foto na onyonyo
  • ka emoji si etinye ederede italic

na akwụkwọ nri ndị ọzọ! Nọrọ na-ekiri!

isi: www.habr.com

Tinye a comment