Ukugxekwa kwephrothokholi kanye nezindlela zenhlangano zeTelegram. Ingxenye 1, ubuchwepheshe: ulwazi lokubhala iklayenti kusukela ekuqaleni - TL, MT

Muva nje, okuthunyelwe mayelana nokuthi i-Telegram enhle kangakanani, ukuthi abazalwane baseDurov bahlakaniphe kangakanani futhi banolwazi kanjani ezinhlelweni zenethiwekhi yokwakha, njll. Sekuqale ukubonakala kaningi ku-Habré. Ngasikhathi sinye, bambalwa kakhulu abantu abazicwilise emshinini wobuchwepheshe - okungenani, basebenzisa i-Bot API elula (futhi ehluke kakhulu ku-MTProto) esekelwe ku-JSON, futhi ngokuvamile bayamukela. ekukholweni zonke izindumiso kanye ne-PR ezungeza isithunywa. Cishe unyaka nengxenye edlule, uzakwethu e-Eshelon NGO Vasily (ngeshwa, i-akhawunti yakhe ku-Habré yasulwa kanye nohlaka) waqala ukubhala iklayenti lakhe leTelegram kusukela ekuqaleni ePerl, futhi kamuva umbhali wale migqa wajoyina. Kungani Perl, abanye bazobuza ngokushesha? Ngoba amaphrojekthi anjalo akhona kakade ngezinye izilimi, empeleni, akulona iphuzu, kungase kube nanoma yiluphi olunye ulimi lapho lungekho khona. umtapo wolwazi owenziwe ngomumo, futhi ngokufanele umbhali kufanele ahambe yonke indlela kusukela ekuqaleni. Ngaphezu kwalokho, i-cryptography iyindaba yokwethenjwa, kodwa qinisekisa. Ngomkhiqizo oqondiswe ekuvikelekeni, awukwazi ukuvele uthembele kumtapo wolwazi osuvele uwenziwe ovela kumkhiqizi futhi uthembele kuwo ngokungaboni (kodwa-ke, lesi yisihloko sengxenye yesibili). Okwamanje, umtapo wezincwadi usebenza kahle kakhulu ezingeni “elimaphakathi” (ukuvumela ukuthi wenze noma yiziphi izicelo ze-API).

Nokho, ngeke kube khona i-cryptography eningi noma izibalo kulolu chungechunge lokuthunyelwe. Kodwa kuzoba neminye imininingwane eminingi yezobuchwepheshe kanye nezinduku zokwakha (futhi ziwusizo kulabo abangeke babhale kusukela ekuqaleni, kodwa bazosebenzisa umtapo wolwazi nganoma yiluphi ulimi). Ngakho, umgomo oyinhloko kwakuwukuzama ukusebenzisa iklayenti kusukela ekuqaleni ngokwemibhalo esemthethweni. Okusho ukuthi, ake sicabange ukuthi ikhodi yomthombo yamakhasimende asemthethweni ivaliwe (futhi, engxenyeni yesibili sizofaka ngokuningiliziwe isihloko sokuthi lokhu kuyiqiniso. kwenzeka ngakho), kodwa, njengasezinsukwini zakudala, ngokwesibonelo, kunendinganiso efana ne-RFC - kungenzeka yini ukuthi ubhale iklayenti ngokusho kwencazelo yodwa, "ngaphandle kokubheka" ikhodi yomthombo, kungaba esemthethweni (Ideskithophu yeTelegram, mobile), noma i-Telethon engekho emthethweni?

Incazelo:

Amadokhumenti... ikhona, akunjalo? Ingabe kuliqiniso?..

Izingcezu zamanothi alesi sihloko zaqala ukuqoqwa ehlobo eledlule. Sonke lesi sikhathi kuwebhusayithi esemthethweni https://core.telegram.org Amadokhumenti asukela ku-Layer 23, i.e. wanamathela ndawana thize ngo-2014 (khumbula, zazingekho ngisho iziteshi ngaleso sikhathi?). Yebo, ngokombono, lokhu bekufanele kusivumele ukuthi sisebenzise iklayenti elisebenza ngaleso sikhathi ngo-2014. Kodwa ngisho nakulesi simo, imibhalo yayingaphelele, futhi okwesibili, kwezinye izindawo yayiziphikisa. Esikhathini esingaphezu kwenyanga edlule, ngoSepthemba 2019, kwaba njalo ngengozi Kutholwe ukuthi kukhona isibuyekezo esikhulu semibhalo esizeni, ye-Layer 105 yakamuva, enenothi lokuthi manje yonke into idinga ukufundwa futhi. Ngempela, izihloko eziningi zabuyekezwa, kodwa eziningi zahlala zingashintshile. Ngakho-ke, lapho ufunda ukugxeka okungezansi mayelana nemibhalo, kufanele ukhumbule ukuthi ezinye zalezi zinto azisabalulekile, kodwa ezinye zisalungile. Phela, iminyaka engu-5 emhlabeni wanamuhla akuyona nje isikhathi eside, kodwa kakhulu Okuningi kwe. Kusukela ngalezo zikhathi (ikakhulukazi uma unganaki amasayithi e-geochat alahliwe futhi avuselelwe kusukela ngaleso sikhathi), inani lezindlela ze-API esikimini likhule lisuka kwekhulu liye ngaphezu kwamakhulu amabili namashumi amahlanu!

Ungaqala kuphi njengombhali osemusha?

Akunandaba ukuthi ubhala kusukela ekuqaleni noma usebenzisa, isibonelo, imitapo yolwazi eyenziwe ngomumo efana I-Telethon yePython noma I-Madeline ye-PHP, kunoma yikuphi, uzodinga kuqala bhalisa isicelo sakho - thola amapharamitha api_id и api_hash (labo abasebenze ne-VKontakte API ngokushesha baqonde) lapho iseva izohlonza uhlelo lokusebenza. Lokhu kuzofanele kwenze ngezizathu zomthetho, kodwa sizokhuluma kabanzi ngokuthi kungani ababhali belabhulali bengakwazi ukuyishicilela engxenyeni yesibili. Ungase ugculiseke ngamavelu okuhlola, nakuba elinganiselwe kakhulu - iqiniso liwukuthi manje ungabhalisa eyodwa kuphela uhlelo lokusebenza, ngakho ungajahi ungene kulo.

Manje, ngokombono wezobuchwepheshe, kufanele sibe nesithakazelo eqinisweni lokuthi ngemva kokubhaliswa kufanele sithole izaziso ezivela kuTelegram mayelana nezibuyekezo zemibhalo, iphrothokholi, njll. Okungukuthi, umuntu angacabanga ukuthi isayithi elinamadokodo lamane lashiywa futhi laqhubeka nokusebenza ngokuqondile nalabo abaqala ukwenza amaklayenti, ngoba kulula. Kodwa cha, akukho okufana nalokho okwabonwa, akukho lwazi olufikayo.

Futhi uma ubhala kusukela ekuqaleni, ukusebenzisa imingcele etholiwe kusekude kakhulu. Nakuba https://core.telegram.org/ futhi ikhuluma ngazo kokuthi Ukuqalisa kuqala, empeleni, kuzodingeka uqale usebenzise Iphrothokholi ye-MTProto - kodwa uma ukholiwe isakhiwo ngokuya ngemodeli ye-OSI ekugcineni kwekhasi ukuze uthole incazelo evamile yephrothokholi, khona-ke kuyize ngokuphelele.

Eqinisweni, ngaphambi nangemva kwe-MTProto, emazingeni amaningana ngesikhathi esisodwa (njengoba amanethiwekhi angaphandle asebenza ku-OS kernel ethi, ukwephulwa kongqimba), isihloko esikhulu, esibuhlungu nesibi sizongena endleleni ...

I-Serialization kanambambili: I-TL (Ulimi Lohlobo) nohlelo lwayo, nezingqimba, namanye amagama amaningi asabekayo

Lesi sihloko, empeleni, siyisihluthulelo sezinkinga zeTelegram. Futhi kuzoba namagama amaningi asabekayo uma uzama ukujula kuwo.

Ngakho, nawu umdwebo. Uma leli gama lifika engqondweni yakho, uthi, I-JSON Schema, Ucabange kahle. Umgomo uyefana: ulimi oluthile ukuchaza isethi engaba khona yedatha edlulisiwe. Yilapho ukufana kuphela khona. Uma kuvela ekhasini Iphrothokholi ye-MTProto, noma esihlahleni somthombo weklayenti elisemthethweni, sizozama ukuvula i-schema, sizobona into efana nale:

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;

Umuntu obona lokhu okokuqala ngqa uzokwazi ukubona ingxenye kuphela yalokho okubhaliwe - kahle-hle, lezi zakhiwo ngokusobala (nakuba likuphi igama, kwesokunxele noma kwesokudla?), kunezinkambu kuzo, ngemva kwalokho uhlobo lulandela ngemva kwekholoni... mhlawumbe. Lapha kubakaki be-engeli cishe kukhona izifanekiso ezifana ne-C++ (empeleni, akunjalo Empeleni). Futhi zisho ukuthini zonke ezinye izimpawu, izimpawu zemibuzo, izimpawu zokubabaza, amaphesenti, ama-hash mark (futhi ngokusobala asho izinto ezihlukene ezindaweni ezihlukene), ngezinye izikhathi zikhona futhi ngezinye izikhathi azikho, izinombolo ze-hexadecimal - futhi okubaluleke kakhulu, ukuthi ungathola kanjani kulokhu. okuyiyona (okungeke kwenqatshwe iseva) ukusakaza kwe-byte? Kuzodingeka ufunde amadokhumenti (yebo, kukhona izixhumanisi ku-schema enguqulweni ye-JSON eseduze - kodwa lokho akukwenzi kucace kakhudlwana).

Vula ikhasi I-Binary Data Serialization futhi ugxumele emhlabeni wemilingo wamakhowe nezibalo ezihlukene, into efana ne-matan ngonyaka wesi-4. Izinhlamvu zamagama, uhlobo, inani, isihlanganisi, isihlanganisi esisebenzayo, isimo esivamile, uhlobo oluhlanganisiwe, uhlobo lwe-polymorphic... futhi konke lokho kuyikhasi lokuqala nje! Okulandelayo kukulindile Ulimi lwe-TL, okuthi, nakuba isivele iqukethe isibonelo sesicelo esiwubala kanye nempendulo, ayinikezi nhlobo impendulo ezimweni ezivamile, okusho ukuthi kuzodingeka udlule ekulandiseni kabusha kwezibalo ezihunyushwe kusuka kusiRashiya kuya esiNgisini kwezinye eziyisishiyagalombili ezishumekiwe. amakhasi!

Abafundi abajwayelene nezilimi ezisebenzayo kanye nencazelo yohlobo oluzenzakalelayo, vele, bazobona ulimi lwencazelo kulolu limi, ngisho nakusibonelo, olujwayeleke kakhulu, futhi bangasho ukuthi lokhu akukubi empeleni. Ukuphikisa lokhu yilezi:

  • yebo, umgomo kuzwakala kukuhle, kodwa maye, yena akuzuziwe
  • Imfundo emanyuvesi aseRussia iyahlukahluka ngisho naphakathi kochwepheshe be-IT - akuwona wonke umuntu othathe izifundo ezihambisanayo
  • Ekugcineni, njengoba sizobona, ekusebenzeni kunjalo akudingeki, njengoba kusetshenziswa ingxenye encane kuphela ye-TL echaziwe

Njengoba kushiwo LeoNerd esiteshini #perl kunethiwekhi ye-FreeNode IRC, ezame ukufaka isango elisuka kuTelegramu liya ku-Matrix (ukuhumusha kwengcaphuno akulungile kusuka enkumbulweni):

Kuzwakala sengathi othile wethulwa ukuthayipha ithiyori okokuqala ngqa, wajabula, waqala ukuzama ukudlala ngayo, engenandaba ngempela ukuthi iyadingeka ekusebenzeni.

Zibonele, uma isidingo sezinhlobo ezingenalutho (int, eside, njll.) njengento eyisisekelo singaphakamisi imibuzo - ekugcineni kufanele zisetshenziswe mathupha - isibonelo, ake sithathe umzamo wokuthola kuzo. i-vector. Okusho ukuthi, eqinisweni, uhlu, uma ubiza izinto eziwumphumela ngamagama azo afanele.

Kodwa ngaphambili

Incazelo emfushane yesethi engaphansi ye-syntax ye-TL yalabo abangafundi imibhalo esemthethweni

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;

Incazelo iqala njalo umakhi, ngemva kwalokho ngokuzikhethela (ngokwenza - njalo) ngophawu # iyaqhubeka CRC32 kusukela kuyunithi yezinhlamvu yencazelo evamile yalolu hlobo. Okulandelayo kuza incazelo yezinkambu; uma zikhona, uhlobo lungase lungabi nalutho. Konke lokhu kugcina ngophawu olulinganayo, igama lohlobo lomakhi - okungukuthi, empeleni, uhlobo oluncane - olungolwalo. Umfana ongakwesokudla sophawu lokulingana ngu i-polymorphic - okungukuthi, izinhlobo eziningana ezithile zingahambisana nayo.

Uma incazelo yenzeka ngemva komugqa ---functions---, khona-ke i-syntax izohlala ifana, kodwa incazelo izohluka: umakhi uzoba igama lomsebenzi we-RPC, izinkambu zizoba amapharamitha (kahle, okungukuthi, izohlala ifana ncamashi nesakhiwo esinikeziwe, njengoba kuchazwe ngezansi. , lokhu kuzomane kube incazelo eyabelwe), kanye “nohlobo lwe-polymorphic " - uhlobo lomphumela obuyisiwe. Yiqiniso, isazohlala i-polymorphic - ichazwe nje esigabeni ---types---, kodwa lo makhi "ngeke acatshangelwe". Ukulayisha ngokweqile izinhlobo zemisebenzi ebizwa ngezimpikiswano zayo, i.e. Ngesizathu esithile, imisebenzi embalwa enegama elifanayo kodwa amasiginesha ahlukene, njengaku-C++, ayinikeziwe ku-TL.

Kungani "umakhi" kanye "ne-polymorphic" uma kungeyona i-OOP? Eqinisweni, kuzoba lula ngomuntu ukuthi acabange ngalokhu ngemibandela ye-OOP - uhlobo lwe-polymorphic njengeklasi elingabonakali, futhi abakhi bayizigaba zabo eziqondile, futhi final kumatemu ezilimi eziningi. Eqinisweni, lapha kuphela ukufana ngezindlela zomakhi ezigcwele ngokweqile ngezilimi zokuhlela ze-OO. Njengoba nazi nje izakhiwo zedatha, azikho izindlela (yize incazelo yemisebenzi nezindlela iqhubeka ikwazi ukudala ukudideka ekhanda ukuthi zikhona, kodwa lokho kuyindaba ehlukile) - ungacabanga ngomakhi njengenani elivela okuyinto kuyakhiwa thayipha lapho ufunda ukusakaza kwebhayithi.

Kwenzeka kanjani lokhu? I-deserializer, ehlala ifunda amabhayithi angu-4, ibona inani 0xcrc32 - futhi uyaqonda ukuthi kuzokwenzekani ngokulandelayo field1 ngohlobo int, i.e. ifunda ngokuqondile amabhayithi angu-4, kule nkambu engaphezulu enohlobo PolymorType funda. Uyabona 0x2crc32 futhi uyaqonda ukuthi kunezinkambu ezimbili ngaphezulu, okokuqala long, okusho ukuthi sifunda amabhayithi angu-8. Futhi-ke futhi uhlobo oluyinkimbinkimbi, olukhishwa i-deserialized ngendlela efanayo. Ngokwesibonelo, Type3 zingamenyezelwa kumjikelezo ngokushesha nje lapho abakhi ababili, ngokulandelana, kufanele bahlangane noma 0x12abcd34, ngemva kwalokho udinga ukufunda amabhayithi angu-4 ngaphezulu int, noma 0x6789cdef, emva kwalokho ngeke kube khona lutho. Noma yini enye - udinga ukwenza okuhlukile. Noma kunjalo, ngemva kwalokhu sibuyela emuva ekufundeni amabhayithi angu-4 int amasimu field_c в constructorTwo futhi ngalokho siqeda ukufunda yethu PolymorType.

Ekugcineni, uma ubanjwa 0xdeadcrc ngoba constructorThree, khona-ke yonke into iba inkimbinkimbi. Inkambu yethu yokuqala bit_flags_of_what_really_present ngohlobo # - empeleni, lesi isiteketiso nje sohlobo nat, okusho ukuthi "inombolo yemvelo". Okusho ukuthi, empeleni, i-int engabhalisiwe, ngendlela, ukuphela kwecala lapho izinombolo ezingabhalisiwe zenzeka kumasekethe wangempela. Ngakho-ke, okulandelayo ukwakhiwa okunophawu lombuzo, okusho ukuthi le nkambu - izoba khona ocingweni kuphela uma i-bit ehambisanayo isethwe ensimini okubhekiselwe kuyo (cishe njengo-opharetha we-ternary). Ngakho-ke, ake sicabange ukuthi lesi sici sasisethiwe, okusho ukuthi ngokuqhubekayo sidinga ukufunda inkambu efana nayo Type, esibonelweni sethu esinabakhi abangu-2. Eyodwa ayinalutho (ihlanganisa kuphela isihlonzi), enye inenkambu ids ngohlobo ids:Vector<long>.

Ungase ucabange ukuthi kokubili izifanekiso kanye namajenerikhi kukhona kochwepheshe noma i-Java. Kodwa cha. Cishe. Lokhu kuphela icala lokusebenzisa abakaki be-engeli kumasekhethi wangempela, futhi lisetshenziselwa iVector KUPHELA. Ekusakazweni kwe-byte, lezi kuzoba amabhayithi angu-4 CRC32 ohlotsheni lweVector ngokwayo, njalo okufanayo, bese kuba amabhayithi angu-4 - inani lama-elementi afanayo, bese lezi zinto ngokwazo.

Ngeza kulokhu iqiniso lokuthi ukwenziwa kwe-serialization kuhlala kwenzeka ngamagama angama-4 bytes, zonke izinhlobo ziyiziphindaphinda zayo - izinhlobo ezakhelwe ngaphakathi nazo ziyachazwa. bytes и string ngokuhlelwa ngesandla kobude futhi lokhu kuqondaniswa ngo-4 - kahle, kubonakala kuzwakala kujwayelekile futhi kusebenza ngempumelelo uma kuqhathaniswa? Yize i-TL kuthiwa iyi-serialization esebenzayo kanambambili, esihogweni nayo, ngokunwetshwa cishe noma yini, ngisho namanani we-Boolean kanye neyunithi yezinhlamvu zohlamvu olulodwa ukuya kumabhayithi angu-4, ingabe i-JSON isazoba mkhulu kakhulu? Bheka, ngisho nezinkambu ezingadingekile zingeqiwa amafulegi amancane, yonke into yinhle impela, futhi inwebeka nangesikhathi esizayo, kungani-ke ungangezi izinkambu ezintsha ozikhethela umakhi ngokuhamba kwesikhathi?..

Kodwa cha, uma ungafundi incazelo yami emfushane, kodwa imibhalo egcwele, futhi ucabange ngokusetshenziswa. Okokuqala, i-CRC32 yomakhi ibalwa ngokomugqa ojwayelekile wencazelo yombhalo wohlelo (susa indawo emhlophe eyengeziwe, njll.) - ngakho-ke uma inkambu entsha yengezwa, umugqa wencazelo yohlobo uzoshintsha, ngakho-ke i-CRC32 yawo kanye , ngenxa yalokho, ukwenziwa kwe-serialization. Futhi ikhasimende elidala lingenzani uma lithola inkambu enamafulegi amasha asethiwe, futhi alazi ukuthi lizokwenzani ngawo ngokulandelayo?..

Okwesibili, masikhumbule CRC32, esetshenziswa lapha ngokuyisisekelo njenge imisebenzi ye-hash ukucacisa ngokuhlukile ukuthi yiluphi uhlobo (de) olwenziwayo. Lapha sibhekene nenkinga yokushayisana - futhi cha, amathuba akuwona owodwa ku-232, kodwa amakhulu kakhulu. Ubani okhumbule ukuthi i-CRC32 yakhelwe ukuthola (nokulungisa) amaphutha esiteshini sokuxhumana, futhi ngokufanele ithuthukise lezi zakhiwo ngendlela elimaza abanye? Isibonelo, ayinandaba nokuhlela kabusha amabhayithi: uma ubala i-CRC32 emigqeni emibili, kwesibili ushintshanisa amabhayithi okuqala angu-4 namabhayithi angu-4 alandelayo - kuzofana. Uma okokufaka kwethu kuwuchungechunge lombhalo olusuka kuzinhlamvu zamagama zesiLatini (kanye nezimpawu zokuloba ezincane), futhi lawa magama engahleliwe ngokukhethekile, amathuba okuhlelwa kabusha okunjalo anda kakhulu.

Ngendlela, ubani ohlole ukuthi kukhonani? ngempela CRC32 Enye yamakhodi omthombo wangaphambili (ngisho nangaphambi kuka-Waltman) yayinomsebenzi we-hashi owawuphindaphinda uhlamvu ngalunye ngenombolo engu-239, ethandwa kakhulu yilaba bantu, ha ha!

Ekugcineni, kulungile, sibonile ukuthi abakhi abanohlobo lwensimu Vector<int> и Vector<PolymorType> izoba ne-CRC32 ehlukile. Kuthiwani ngokusebenza ku-inthanethi? Futhi ngokombono wethiyori, ingabe lokhu kuba yingxenye yohlobo? Ake sithi sidlula uxhaxha lwezinombolo eziyizinkulungwane eziyishumi, kahle Vector<int> yonke into icacile, ubude kanye namanye amabhayithi angu-40000. Kuthiwani uma lokhu Vector<Type2>, equkethe inkambu eyodwa kuphela int futhi iyodwa ohlotsheni - ingabe sidinga ukuphinda 10000xabcdef0 izikhathi ezingu-34 bese kuba amabhayithi angu-4 int, noma ulimi luyakwazi UKUSIKHULULELA lona kumakhi fixedVec futhi esikhundleni samabhayithi angu-80000, dlulisela futhi angu-40000 kuphela?

Lona akuwona umbuzo wethiyori ongenalutho nhlobo - cabanga ukuthi uthola uhlu lwabasebenzisi beqembu, ngamunye wabo one-id, igama lokuqala, isibongo - umehluko enanini ledatha edluliswa ngoxhumano lweselula ungaba mkhulu. Yikona kanye ukusebenza kahle kochungechunge lweTelegramu okukhangiswa kithi.

Ngakho...

I-Vector, engakaze ikhishwe

Uma uzama ukungena emakhasini encazelo yezihlanganisi nokunye, uzobona ukuthi i-vector (ngisho ne-matrix) izama ngokusemthethweni ukukhishwa ngama-tuples amashidi amaningana. Kodwa ekugcineni bayakhohlwa, isinyathelo sokugcina siyeqiwa, futhi incazelo ye-vector inikezwa nje, engakaboshelwa ohlotsheni. Kwenzenjani? Ngezilimi izinhlelo, ikakhulukazi ezisebenzayo, kuyinto evamile ukuchaza isakhiwo ngokuphindaphindiwe - umqambi nokuhlola kwaso okuvilaphayo uzoqonda futhi enze yonke into ngokwakhe. Ngolimi ukukhiqizwa kwedatha okudingekayo UKUSEBENZA: kwanele ukuchaza kalula uhlu, i.e. isakhiwo sezakhi ezimbili - eyokuqala iyisici sedatha, eyesibili isakhiwo esifanayo ngokwayo noma isikhala esingenalutho somsila (iphakethe (cons) ku-Lisp). Kodwa lokhu kuzodinga ngokusobala ngamunye isici sisebenzisa amabhayithi angu-4 engeziwe (CRC32 esimweni esithi TL) ukuchaza uhlobo lwaso. Amalungu afanayo nawo angachazwa kalula usayizi ongashintshi, kodwa endabeni yobude obungaziwa kusengaphambili, siyahlukana.

Ngakho-ke, njengoba i-TL ingakuvumeli ukukhipha i-vector, bekufanele yengezwe eceleni. Ekugcineni amadokhumenti athi:

Ukwenziwa kwe-serialization njalo kusebenzisa umakhi ofanayo “i-vector” (const 0x1cb5c415 = crc32(“vector t:Type # [ t ] = Vector t”) engancikile enanini elithile lokuhluka kohlobo t.

Inani lepharamitha yokuzithandela engu-t alibandakanyeki ekufakweni kwe-serial njengoba litholakala ohlotsheni lomphumela (okwaziwa njalo ngaphambi kokukhishwa kwe-deserialization).

Bhekisisa: vector {t:Type} # [ t ] = Vector t - kodwa akukho ndawo Le ncazelo ngokwayo ayisho ukuthi inombolo yokuqala kufanele ilingane nobude be-vector! Futhi akuveli ndawo. Lokhu kunikezwa okudingeka kugcinwe engqondweni futhi kusetshenziswe ngezandla zakho. Kwenye indawo, imibhalo isho ngokwethembeka ukuthi uhlobo akulona olwangempela:

I-Vector t polymorphic pseudotype “iwuhlobo” inani layo eliwukulandelana kwamanani anoma yiluphi uhlobo lwe-t, kungaba ibhokisi noma elingenalutho.

... kodwa akagxili kukho. Lapho wena, ukhathele ukudabula ekunwetshweni kwezibalo (mhlawumbe noma waziwa nguwe ovela esifundweni sasenyuvesi), unquma ukuyeka futhi ubheke ukuthi ungasebenza kanjani nakho ngokuzijwayeza, umbono osele ekhanda lakho ukuthi lokhu kuSerious. Mathematics at the core, yasungulwa ngokucacile by Cool People (izibalo ezimbili - owinile ACM), hhayi nje ubani. Umgomo - ukubukisa - usufeziwe.

Ngendlela, mayelana nenombolo. Ake sikukhumbuze lokho # kuyisichazamazwi nat, inombolo yemvelo:

Kukhona izinhlobo zemisho (uhlobo-expr) kanye nemisho yezinombolo (nat-expr). Nokho, zichazwa ngendlela efanayo.

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

kodwa ngohlelo lolimi zichazwa ngendlela efanayo, i.e. Lo mehluko kufanele futhi ukhunjulwe futhi usetshenziswe ngesandla.

Yebo, yebo, izinhlobo zezifanekiso (vector<int>, vector<User>) babe nesihlonzi esivamile (#1cb5c415), i.e. uma wazi ukuthi ucingo lumenyezelwa njenge

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

khona-ke awusalindi i-vector kuphela, kodwa i-vector yabasebenzisi. Ngokunembayo, kufanele linda - ngekhodi yangempela, yonke into, uma kungelona uhlobo olungenalutho, izoba nomakhi, futhi ngendlela enhle ekusetshenzisweni kuyodingeka ukuthi ihlolwe - kodwa sithunyelwe ncamashi kuzo zonke izici zale vector. lolo hlobo? Kuthiwani uma bekuwuhlobo oluthile lwe-PHP, lapho uhlu lungaqukatha izinhlobo ezihlukene ezintweni ezihlukene?

Kuleli qophelo uqala ukucabanga - ingabe i-TL enjalo iyadingeka? Mhlawumbe enqoleni kungenzeka ukuthi kusetshenziswe i-serializer yomuntu, i-protobuf efanayo eyayivele ikhona ngaleso sikhathi? Kwakuyithiyori leyo, ake sibheke umkhuba.

Ukuqaliswa kwe-TL okukhona kukhodi

U-TL wazalelwa ekujuleni kweVKontakte ngisho nangaphambi kwemicimbi edumile ngokuthengiswa kwesabelo sikaDurov kanye (mhlawumbe), ngisho nangaphambi kokuba ukuthuthukiswa kweTelegram kuqale. Futhi emthonjeni ovulekile ikhodi yomthombo yokuqaliswa kokuqala ungathola izinduku eziningi ezihlekisayo. Futhi ulimi ngokwalo lwasetshenziswa lapho ngokugcwele kunamanje kuTelegram. Isibonelo, ama-hashi awasetshenziswa nhlobo esikimini (okusho i-pseudotype eyakhelwe ngaphakathi (njenge-vector) enokuziphatha okuphambukile). Noma

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

kodwa ake sicabangele, ngenjongo yokuphelela, ukulandelela, ngomqondo ongokomfanekiso, ukuvela koMdondoshiya Womcabango.

#define ZHUKOV_BYTES_HACK

#ifdef ZHUKOV_BYTES_HACK

/* dirty hack for Zhukov request */

Noma lena enhle:

    static const char *reserved_words_polymorhic[] = {

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

      };

Lesi siqeshana simayelana nezifanekiso ezifana nalezi:

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

Lena incazelo yohlobo lwesifanekiso se-hashmap njengevektha ye-int - Uhlobo lwamapheya. Ku-C++ kuzobukeka kanjena:

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

ngakho, alpha - igama elingukhiye! Kodwa ku-C++ kuphela lapho ungabhala khona u-T, kodwa kufanele ubhale i-alpha, i-beta... Kodwa kungabi ngaphezu kwamapharamitha angu-8, yilapho i-fantasy iphela khona. Kubonakala sengathi kwake kwaba nezingxoxo ezinjengalezi eSt. Petersburg:

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

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

Kodwa lokhu kwakumayelana nokuqaliswa kokuqala okushicilelwe kwe-TL "ngokujwayelekile". Masiqhubekele ekucabangeleni ukuqaliswa kumakhasimende eTelegramu ngokwawo.

Impendulo ivela ku- Vasily:

Vasily, [09.10.18 17:07] Ngaphezu kwakho konke, imbongolo iyashisa ngoba bakha inqwaba yezinto ezidonswayo, base beshaya ibhawodi kuzo, base bemboza ijeneretha yekhodi ngezinduku.
Njengomphumela, okokuqala kudokhi pilot.jpg
Bese kusukela ikhodi dzhekichan.webp

Kunjalo, kubantu abajwayelene nama-algorithms nezibalo, singalindela ukuthi bafundile i-Aho, Ullmann, futhi bajwayelene namathuluzi asebe yi-de facto standard embonini emashumini eminyaka okubhala abahlanganisi babo be-DSL, akunjalo?.

Ngu telegram-cli ngu-Vitaly Valtman, njengoba kungaqondwa kusukela ekuveleni kwefomethi ye-TLO ngaphandle kwemingcele (cli) yayo, ilungu leqembu - manje umtapo wolwazi we-TL unikeziwe. ngokwehlukana, uthini umbono wakhe Umhlaziyi we-TL? ..

16.12 04:18 Vasily: Ngicabanga ukuthi othile akazange ayifundise kahle i-lex+yacc
16.12 04:18 Vasily: Angikwazi ukukuchaza ngenye indlela
16.12 04:18 Vasily: kahle, noma bakhokhelwe inombolo yemigqa ku-VK
16.12 04:19 Vasily: 3k+ imigqa njll.<censored> esikhundleni somhlahleli

Mhlawumbe okuhlukile? Ake sibone ukuthi kanjani kwenza Leli iklayenti ELISEMTHETHWENI - Ideskithophu yeTelegram:

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

Imigqa engu-1100+ ku-Python, izinkulumo ezimbalwa ezivamile + izimo ezikhethekile ezifana ne-vector, okuyinto, vele, imenyezelwe ohlelweni njengoba kufanele ibe ngokuvumelana ne-syntax ye-TL, kodwa bathembele kule syntax ukuze bayihlukanise... Umbuzo uphakama, kungani konke kwakuyisimangaliso?иIfakwe ngaphezulu uma kungekho muntu ozoyihlaziya ngokwemibhalo?!

By the way... Uyakhumbula sikhulume ngokuhlolwa kwe-CRC32? Ngakho-ke, ku-Telegram Desktop generator ikhodi kunohlu lokuhlukile lwalezo zinhlobo lapho kubalwa khona i-CRC32. akufani ngalowo okhonjiswe kumdwebo!

Vasily, [18.12/22 49:XNUMX] futhi lapha ngingacabanga ukuthi i-TL enjalo iyadingeka.
uma bengifuna ukungcolisa okunye ukusetshenziswa, bengizoqala ukufaka ukunqamuka komugqa, ingxenye yabahlaziyi izokwephuka ezincazelweni zemigqa eminingi.
tdesktop, noma kunjalo, futhi

Khumbula iphuzu mayelana ne-one-liner, sizobuyela kulo ngemva kwesikhashana.

Kulungile, i-telegram-cli ayikho emthethweni, i-Telegraph Desktop isemthethweni, kodwa kuthiwani ngezinye? Kwazi bani?.. Kwikhodi yeklayenti le-Android bekungekho nhlobo abahlaziyi be-schema (okuphakamisa imibuzo mayelana nomthombo ovulekile, kodwa lokhu okwengxenye yesibili), kodwa bekukhona ezinye izingcezu ezimbalwa zekhodi ezihlekisayo, kodwa okuningi kuzo isigatshana esingezansi.

Yimiphi eminye imibuzo ephakanyiswa ukwenziwa kochungechunge ngokusebenza? Isibonelo, benza izinto eziningi, yiqiniso, ngezinkambu ezincane nezinkambu ezinemibandela:

U-Vasily: flags.0? true
kusho ukuthi inkambu ikhona futhi ilingana neqiniso uma ifulegi lisethiwe

U-Vasily: flags.1? int
kusho ukuthi insimu ikhona futhi idinga ukuchithwa

UVasily: Imbongolo, ungakhathazeki ngalokho okwenzayo!
UVasily: Kukhona okushiwo endaweni ethile kudokhumenti ukuthi iqiniso liwuhlobo olungenalutho lukaziro, kodwa akunakwenzeka ukuhlanganisa noma yini kudokotela wabo.
U-Vasily: Ekusetshenzisweni komthombo ovulekile lokhu akunjalo, kodwa kunenqwaba yezinduku nezisekelo.

Kuthiwani ngeTelethon? Ukubheka phambili esihlokweni se-MTProto, isibonelo - kumadokhumenti kukhona izingcezu ezinjalo, kodwa uphawu % kuchazwa kuphela ngokuthi "okuhambisana nohlobo olungenalutho olunikeziwe", i.e. ezibonelweni ezingezansi kukhona iphutha noma okuthile okungabhalwanga phansi:

Vasily, [22.06.18 18:38] Endaweni eyodwa:

msg_container#73f1f8dc messages:vector message = MessageContainer;

Kokwehlukile:

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

Futhi lokhu umehluko omkhulu omkhulu, empilweni yangempela uhlobo oluthile lwe-vector enqunu lufika

Angikaze ngiyibone incazelo ye-vector engenalutho futhi angikaze ngihlangane nayo

Ukuhlaziya kubhalwa ngesandla ngocingo

Emdwebeni wakhe kuphawulwe incazelo msg_container

Futhi, umbuzo uhlala umayelana %. Akuchazwa.

U-Vadim Goncharov, [22.06.18 19:22] naku-tdesktop?

Vasily, [22.06.18 19:23] Kodwa umhlaseli wabo we-TL ezinjinini ezivamile cishe ngeke akudle nalokhu.

// parsed manually

I-TL iyisifinyezo esihle, akekho osisebenzisa ngokuphelele

Futhi % ayikho enguqulweni yabo yohlelo

Kepha lapha imibhalo iyaziphikisa, ngakho-ke idk

Yayitholakala kuhlelo lolimi, babengakhohlwa ukuchaza i-semantics

Uyibonile idokhumenti ku-TL, awukwazi ukuyithola ngaphandle kwengxenye yelitha

“Hhayi-ke, ake sithi,” omunye umfundi uzothi, “ugxeka okuthile, ngakho ngibonise ukuthi kufanele kwenziwe kanjani.”

UVasily uyaphendula: “Ngokuqondene nomhlaziyi, ngithanda izinto ezinjalo

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

ngandlela-thile ngiyithanda kangcono kuna

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

noma

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

nansi i-LExer YONKE:

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

labo. okulula ukukubeka kancane."

Ngokuvamile, ngenxa yalokho, umhlahleli kanye nojeneretha wekhodi wesethi engaphansi esetshenzisiwe ye-TL ingena cishe emigqeni eyi-100 yohlelo lolimi kanye nemigqa engu-~300 yejeneretha (ukubala konke. printAmakhodi akhiqiziwe), okuhlanganisa amabhanisi olwazi ohlobo ukuze ahlonzwe ekilasini ngalinye. Uhlobo ngalunye lwe-polymorphic lushintsha lube yisigaba sesisekelo esingenalutho, futhi abakhi bazuza njengefa kulo futhi babe nezindlela zokwenza i-serialization kanye ne-deserialization.

Ukuntuleka kwezinhlobo zolimi lohlobo

Ukuthayipha okuqinile kuyinto enhle, akunjalo? Cha, lena akuyona i-holivar (yize ngithanda izilimi eziguqukayo), kodwa i-postulate ngaphakathi kohlaka lwe-TL. Ngokusekelwe kulo, ulimi kufanele lusinikeze zonke izinhlobo zokuhlola. Yebo, kulungile, mhlawumbe hhayi yena ngokwakhe, kodwa ukuqaliswa, kodwa kufanele okungenani azichaze. Futhi hlobo luni lwamathuba esiwafunayo?

Okokuqala, izithiyo. Lapha sibona kumadokhumenti okulayisha amafayela:

Okuqukethwe kanambambili kwefayela bese kuhlukaniswa kube izingxenye. Zonke izingxenye kufanele zibe nosayizi ofanayo ( usayizi_wengxenye ) futhi kufanele kuhlangatshezwane nemibandela elandelayo:

  • part_size % 1024 = 0 (ihlukaniswa ngo-1KB)
  • 524288 % part_size = 0 (512KB kumelwe ihlukaniseke ngokulinganayo ngengxenye_size)

Ingxenye yokugcina akudingeki ukuthi yenelise lezi zimo, inqobo nje uma usayizi wayo ungaphansi kosayizi_wengxenye.

Ingxenye ngayinye kufanele ibe nenombolo yokulandelana, ifayela_ingxenye, ngenani elisuka ku-0 kuye ku-2,999.

Ngemuva kokuthi ifayela selihlukanisiwe udinga ukukhetha indlela yokuligcina kuseva. Sebenzisa upload.saveBigFilePart uma kwenzeka usayizi ogcwele wefayela ungaphezu kuka-10 MB futhi upload.saveFilePart kumafayela amancane.
[…] elinye lamaphutha okufaka idatha alandelayo lingabuyiswa:

  • FILE_PARTS_INVALID — Inombolo yezingxenye ezingavumelekile. Inani alikho phakathi 1..3000

Ingabe kukhona kwalokhu emdwebeni? Ingabe lokhu kuzwakala ngandlela thile kusetshenziswa i-TL? Cha. Kodwa ngiyaxolisa, ngisho no-Turbo Pascal kamkhulu wakwazi ukuchaza izinhlobo ezishiwo ububanzi. Futhi wayazi enye into, manje eyaziwa kangcono ngokuthi enum - uhlobo oluhlanganisa ukubalwa kwenombolo engashintshi (encane) yamanani. Ngezilimi ezifana no-C - izinombolo, phawula ukuthi kuze kube manje sikhulume kuphela ngezinhlobo izinombolo. Kodwa kukhona futhi ama-arrays, izintambo... isibonelo, kungaba kuhle ukuchaza ukuthi lolu chungechunge lungaqukatha inombolo yocingo kuphela, akunjalo?

Akukho kulokhu okuku-TL. Kepha kukhona, ngokwesibonelo, ku-JSON Schema. Futhi uma omunye umuntu engase aphikisane mayelana nokuhlukaniswa kwe-512 KB, ukuthi lokhu kusadingeka kuhlolwe ngekhodi, qiniseka ukuthi iklayenti umane nje. angikwazanga thumela inombolo ngaphandle kwebanga 1..3000 (futhi iphutha elihambisanayo belingeke livele) bekungenzeka, akunjalo?..

Ngendlela, mayelana namaphutha kanye namanani okubuyisela. Ngisho nalabo abake basebenza ne-TL bafiphaza amehlo - akuzange kuvele kithi lokho ngamunye umsebenzi ku-TL empeleni awukwazi ukubuyisela kuphela uhlobo oluchaziwe lokubuyisela, kodwa futhi nephutha. Kodwa lokhu akukwazi ukutholwa nganoma iyiphi indlela usebenzisa i-TL ngokwayo. Yiqiniso, sekuvele kucacile futhi asikho isidingo sanoma yini ekusebenzeni (yize empeleni, i-RPC ingenziwa ngezindlela ezahlukene, sizobuyela kulokhu kamuva) - kodwa kuthiwani ngokuhlanzeka kwemiqondo yeMathematics of Abstract Types emhlabeni wasezulwini?.. Ngicoshe ukudonsa - ngakho qhathanisa.

Futhi ekugcineni, kuthiwani ngokufundeka? Nokho, lapho, ngokuvamile, ngingathanda incazelo ube nakho ku-schema (ku-schema se-JSON, futhi, kunjalo), kodwa uma usuvele ucindezelekile ngakho, kuthiwani-ke ngohlangothi olusebenzayo - okungenani ubheke kancane umehluko ngesikhathi sokubuyekezwa? Zibonele ku izibonelo zangempela:

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

noma

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

Kuncike kuwo wonke umuntu, kodwa i-GitHub, ngokwesibonelo, iyenqaba ukugqamisa izinguquko ngaphakathi kwemigqa emide kangaka. Umdlalo "thola umehluko we-10", futhi lokho ubuchopho obubona ngokushesha ukuthi ukuqala nokuphela kuzo zombili izibonelo kuyafana, udinga ukufunda ngokukhathazayo endaweni ethile phakathi ... Ngokombono wami, lokhu akukhona nje kumbono, kodwa ngokubona nje ezingcolile futhi budlabha.

Ngendlela, mayelana nokuhlanzeka kwemfundiso. Kungani sidinga ama-bit field? Akubonakali ukuthi bona iphunga kubi ngokombono wethiyori yohlobo? Incazelo ingabonwa ezinguqulweni zangaphambili zomdwebo. Ekuqaleni, yebo, kwakunjalo, kukho konke ukuthimula kwadalwa uhlobo olusha. Lawa ma-rudiments asekhona kuleli fomu, isibonelo:

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;

Kodwa manje cabanga, uma unezinkambu ozikhethela ezi-5 esakhiweni sakho, uzodinga izinhlobo ezingama-32 zazo zonke izinketho ezingase zibe khona. Ukuqhuma okuhlangene. Ngakho-ke, ukuhlanzeka kwekristalu kwethiyori ye-TL kuphinde kwahlakazeka ngokumelene nembongolo yensimbi yeqiniso elibuhlungu lokwenziwa kwe-serialization.

Ngaphezu kwalokho, kwezinye izindawo laba bafana ngokwabo baphula i-typology yabo. Isibonelo, ku-MTProto (isahluko esilandelayo) impendulo ingacindezelwa yi-Gzip, yonke into ihamba kahle - ngaphandle kokuthi izendlalelo nesekethe kuphuliwe. Nakulokhu futhi, kwakungeyona i-RpcResult ngokwayo eyavunwa, kodwa okuqukethwe kwayo. Hhayi-ke, kungani ngenze lokhu? .. Kwadingeka nginqume udondolo ukuze ukucindezela kuzosebenza noma yikuphi.

Noma esinye isibonelo, sake sathola iphutha - sathunyelwa InputPeerUser esikhundleni salokho InputUser. Noma ngokuphambene. Kodwa kwasebenza! Okusho ukuthi, iseva ibingenandaba nohlobo. Kungenzeka kanjani lokhu? Impendulo singayithola ngezingcezu zekhodi ezivela ku-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);

Ngamanye amazwi, yilapho kwenziwa uchungechunge NGEMANDLA, ikhodi engakhiqiziwe! Mhlawumbe iseva isetshenziswa ngendlela efanayo?.. Empeleni, lokhu kuzosebenza uma kwenziwa kanye, kodwa kungasekelwa kanjani kamuva phakathi nokubuyekezwa? Ingabe yilokhu kwasungulwa lolu hlelo? Futhi lapha siqhubekela embuzweni olandelayo.

Inguqulo. Izendlalelo

Kungani izinguqulo zohlelo zibizwa ngokuthi izendlalelo zingaqagelwa kuphela ngokusekelwe kumlando wezinhlelo ezishicilelwe. Ngokusobala, ekuqaleni ababhali babecabanga ukuthi izinto eziyisisekelo zingenziwa ngokusebenzisa uhlelo olungashintshiwe, futhi kuphela lapho kudingekile, ngezicelo ezithile, kubonisa ukuthi zenziwa kusetshenziswa inguqulo ehlukile. Eqinisweni, ngisho nombono omuhle - futhi okusha kuzoba, njengokungathi, "kuxutshwe", kubekwe phezu kwendala. Kodwa ake sibone ukuthi kwenziwa kanjani. Yiqiniso, angikwazanga ukukubuka kusukela ekuqaleni - kuyahlekisa, kodwa umdwebo wesendlalelo sesisekelo awukho nje. Izendlalelo ziqale ngo-2. Amadokhumenti asitshela ngesici esikhethekile se-TL:

Uma iklayenti lisekela Ungqimba 2, kufanele kusetshenziswe umakhi olandelayo:

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

Empeleni, lokhu kusho ukuthi ngaphambi kwekholi ngayinye ye-API, i-int enevelu 0x289dd1f6 kufanele yengezwe ngaphambi kwenombolo yendlela.

Kuzwakala kujwayelekile. Kodwa kwenzekani ngokulandelayo? Kwabe sekuvela

invokeWithLayer3#b7475268 query:!X = X;

Manje yini elandelayo? Njengoba ungase ucabange,

invokeWithLayer4#dea0d430 query:!X = X;

Kuyahlekisa? Cha, kusesekuseni kakhulu ukuthi ungahleka, cabanga ngalelo qiniso ngamunye isicelo esivela kwesinye isendlalelo sidinga ukugoqwa ohlotsheni olukhethekile - uma zonke zihlukile kuwe, ungayihlukanisa kanjani enye? Futhi ukwengeza amabhayithi ama-4 kuphela ngaphambili kuyindlela esebenza kahle kakhulu. Ngakho,

invokeWithLayer5#417a57ae query:!X = X;

Kodwa kusobala ukuthi ngemva kwesikhashana lokhu kuzoba uhlobo oluthile lwe-bacchanalia. Futhi isixazululo safika:

Buyekeza: Ukuqala Ngesendlalelo 9, izindlela zomsizi invokeWithLayerN ingasetshenziswa kanyekanye kuphela initConnection

Hooray! Ngemva kwezinguqulo ezingu-9, ekugcineni safika kulokho okwakwenziwa kuzivumelwano ze-inthanethi emuva ngeminyaka yama-80s - sivumelana ngenguqulo kanye ekuqaleni kokuxhumana!

Manje yini elandelayo?..

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

Kodwa manje usengahleka. Kuphela ngemva kwezinye izendlalelo ezingu-9, umakhi wendawo yonke onenombolo yenguqulo ekugcineni wanezelwa, okudingeka ukuthi abizwe kanye kuphela ekuqaleni kokuxhumana, futhi incazelo yezendlalelo ibonakala sengathi isinyamalele, manje isiyinguqulo enemibandela, njengokuthi. yonke indawo. Inkinga ixazululiwe.

Impela?..

Vasily, [16.07.18 14:01] Ngisho nangoLwesihlanu ngicabange:
I-teleserver ithumela imicimbi ngaphandle kwesicelo. Izicelo kufanele zisongwe nge-InvokeWithLayer. Iseva ayizisongi izibuyekezo; asikho isakhiwo sokugoqa izimpendulo nezibuyekezo.

Labo. iklayenti alikwazi ukucacisa isendlalelo lapho lifuna khona izibuyekezo

U-Vadim Goncharov, [16.07.18 14:02] ingabe i-InvokeWithLayer akuyona into esemqoka?

Vasily, [16.07.18 14:02] Lena ukuphela kwendlela

U-Vadim Goncharov, [16.07.18 14:02] okufanele ngempela kusho ukuvumelana ngesendlalelo ekuqaleni kweseshini

Ngendlela, kulandela ukuthi ukwehliswa kweklayenti akuhlinzekiwe

Izibuyekezo, i.e. uhlobo Updates esikimini, yilokhu iseva ekuthumela iklayenti hhayi ngempendulo yesicelo se-API, kodwa ngokuzimela lapho kwenzeka umcimbi. Lesi yisihloko esiyinkimbinkimbi esizoxoxwa ngaso kokunye okuthunyelwe, kodwa okwamanje kubalulekile ukwazi ukuthi iseva igcina Izibuyekezo ngisho nalapho iklayenti lingaxhunyiwe ku-inthanethi.

Ngakho, uma wenqaba ukugoqa ngamunye ukukhombisa inguqulo yayo, lokhu kuholela ngokunengqondo ezinkingeni ezingaba khona ezilandelayo:

  • iseva ithumela izibuyekezo kuklayenti nangaphambi kokuba iklayenti lazise ukuthi iyiphi inguqulo eyisekelayo
  • yini okufanele ngiyenze ngemva kokuthuthukisa iklayenti?
  • ubani iziqinisekisoukuthi umbono weseva mayelana nenombolo yesendlalelo ngeke ushintshe phakathi nenqubo?

Ucabanga ukuthi lokhu kuwukuqagela nje kwethiyori, futhi ngokwenza lokhu ngeke kwenzeke, ngoba iseva ibhalwe kahle (okungenani, ihlolwe kahle)? Ha! Kungakhathaliseki ukuthi kunjani!

Yilokho kanye esahlangana nakho ngo-August. Ngomhlaka-14 Agasti, bekunemilayezo yokuthi okuthile kubuyekezwa eziphakelini zeTelegram... bese kuba semalogu:

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.

bese kuba nama-megabytes amaningana wokulandela isitaki (kahle, ngesikhathi esifanayo ukugawulwa kwalungiswa). Ngemuva kwakho konke, uma okuthile kungaziwa ku-TL yakho, kuba kanambambili ngokusayina, ngokuya phansi komugqa KONKE iya, ukuqopha ngeke kube yinto engenakwenzeka. Yini okufanele uyenze esimweni esinjalo?

Nokho, into yokuqala efika emqondweni wawo wonke umuntu ukunqamula bese uzama futhi. Akuzange kusize. We google CRC32 - lezi ziphenduke izinto ezivela kuhlelo 73, nakuba sisebenze ku-82. Sibheka ngokucophelela izingodo - kukhona izihlonzi ezivela ezinhlelweni ezimbili ezahlukene!

Mhlawumbe inkinga ikuklayenti lethu elingekho emthethweni kuphela? Cha, sethula i-Telegraph Desktop 1.2.17 (inguqulo ehlinzekwe ngenani lokusatshalaliswa kwe-Linux), ibhalela ku-Exception log: I-MTP yohlobo olungalindelekile id #b5223b0f ifundwe ku-MTPMessageMedia…

Ukugxekwa kwephrothokholi kanye nezindlela zenhlangano zeTelegram. Ingxenye 1, ubuchwepheshe: ulwazi lokubhala iklayenti kusukela ekuqaleni - TL, MT

I-Google ibonise ukuthi inkinga efanayo isivele yenzeke kwelinye lamakhasimende angekho emthethweni, kodwa izinombolo zenguqulo futhi, ngokufanele, ukuqagela kwakuhlukile ...

Ngakho yini okufanele siyenze? Mina noVasily sahlukana: wazama ukuvuselela isifunda sibe ngu-91, nganquma ukulinda izinsuku ezimbalwa bese ngizama 73. Zombili izindlela zasebenza, kodwa njengoba zinamandla, akukho ukuqonda ukuthi zingaki izinguqulo phezulu noma phansi ozidingayo. ukugxuma, noma ukuthi udinga ukulinda isikhathi esingakanani .

Kamuva ngakwazi ukukhiqiza kabusha isimo: sethula iklayenti, sacisha, siphinda sihlanganise isifunda kwesinye isendlalelo, siqale kabusha, sibambe inkinga futhi, sibuyele kwedlule - eshu, akukho inani lokushintshwa kwesekethe futhi iklayenti liqala kabusha imizuzu embalwa izosiza. Uzothola imiksi yezakhiwo zedatha ezivela ezendlalelo ezahlukene.

Incazelo? Njengoba ungaqagela kusuka kuzimpawu ezahlukahlukene ezingaqondile, iseva iqukethe izinqubo eziningi zezinhlobo ezahlukahlukene emishinini ehlukene. Ngokunokwenzeka, iseva ebhekele "ukugcina kumthamo" ifake kulayini lokho abaphathi bayo abakunike yona, futhi bayinikeze ohlelweni olwalukhona ngesikhathi sokukhiqiza. Futhi kuze kube yilapho lo mugqa "ubolile", akukho okwakungenziwa ngakho.

Mhlawumbe... kodwa lena induku esabekayo?!.. Cha, ngaphambi kokucabanga ngemibono engasile, ake sibheke ikhodi yamakhasimende asemthethweni. Enguqulweni ye-Android asitholi noma yisiphi isihlanganisi se-TL, kodwa sithola ifayela elisindayo (i-GitHub yenqaba ukulithinta) elino-(de) serialization. Nawa amazwibela ekhodi:

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;

noma

    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... kubukeka kabi. Kodwa, mhlawumbe, lokhu kukhishwa ikhodi, kulungile?.. Kodwa ngokuqinisekile isekela zonke izinguqulo! Yiqiniso, akucaci ukuthi kungani yonke into ixubene, izingxoxo eziyimfihlo, nazo zonke izinhlobo _old7 ngandlela-thile akubukeki njengokukhiqiza umshini ... Nokho, ngaphezu kwakho konke ngashaywa umoya

TL_message_layer104
TL_message_layer104_2
TL_message_layer104_3

Bafo, awukwazi ngisho nokunquma ukuthi yini engaphakathi kwesendlalelo esisodwa?! Hhayi-ke, kulungile, ake sithi "ezimbili" zikhishwe ngephutha, kahle, kwenzeka, kodwa AMATHATHU?.. Ngokushesha, iraki elifanayo futhi? Hlobo luni lwezithombe zocansi lolu, uxolo?..

Ekhodini yomthombo ye-Telegram Desktop, ngendlela efanayo, kwenzeka okufanayo - uma kunjalo, izibophezelo eziningana zilandelana ohlelweni azishintshi inombolo yayo yesendlalelo, kodwa lungisa okuthile. Ezimweni lapho ungekho umthombo osemthethweni wedatha yohlelo, ingatholwa kuphi, ngaphandle kwekhodi yomthombo yeklayenti elisemthethweni? Futhi uma uyisusa lapho, awukwazi ukuqiniseka ukuthi uhlelo lulungile kuze kube yilapho uhlola zonke izindlela.

Kungahlolwa kanjani nalokhu? Ngethemba ukuthi abalandeli beyunithi, ukusebenza kanye nezinye izivivinyo bazokwabelana ngemibono.

Kulungile, ake sibheke olunye ucezu lwekhodi:

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;

Lawa mazwana "adalwe ngesandla" aphakamisa ukuthi ingxenye kuphela yaleli fayela yabhalwa ngesandla (ungacabanga ngayo yonke iphupho elibi lokunakekela?), kanti okunye kwenziwe ngomshini. Nokho, bese kuvela omunye umbuzo - ukuthi imithombo iyatholakala hhayi ngokuphelele (i-la GPL blobs ku-Linux kernel), kodwa lesi sekuyisihloko sengxenye yesibili.

Kodwa sekwanele. Masiqhubekele kuphrothokholi phezu kwayo konke lokhu kufakwa kwe-serialization.

I-MTProto

Ngakho, asivule incazelo jikelele и incazelo enemininingwane yephrothokholi futhi into yokuqala esikhubeka ngayo yi-teminology. Futhi ngobuningi bakho konke. Ngokuvamile, lokhu kubonakala kuyisici sobunikazi seTelegram - ukubiza izinto ngendlela ehlukile ezindaweni ezahlukene, noma izinto ezihlukene ngegama elilodwa, noma okuphambene nalokho (isibonelo, ku-API yezinga eliphezulu, uma ubona iphakethe lesitika, akunjalo. lokho obukucabanga).

Ngokwesibonelo, “umlayezo” kanye “neseshini” asho okuthile okuhlukile lapha kunokusebenzelana kweklayenti leTelegramu evamile. Yebo, yonke into icacile ngomlayezo, ingahunyushwa ngamagama we-OOP, noma nje ibizwa ngokuthi "iphakethe" - leli yizinga eliphansi, lezokuthutha, ayikho imilayezo efana ne-interface, kunemilayezo eminingi yesevisi. . Kodwa iseshini... kodwa izinto zokuqala kuqala.

ungqimba lwezokuthutha

Into yokuqala ezokuthutha. Bazositshela ngezinketho ezi-5:

  • I-TCP
  • I-Websocket
  • I-Websocket ngaphezulu kwe-HTTPS
  • HTTP
  • I-HTTPS

Vasily, [15.06.18 15:04] Kukhona futhi ezokuthutha ze-UDP, kodwa akubhaliwe phansi

Futhi i-TCP ngezinhlobo ezintathu

Eyokuqala ifana ne-UDP phezu kwe-TCP, iphakethe ngalinye lihlanganisa inombolo yokulandelana kanye ne-crc
Kungani ukufunda imibhalo enqoleni kubuhlungu kangaka?

Awu, nakho manje I-TCP isivele iku-4 okuhlukile:

  • Kufinyeziwe
  • Okuphakathi
  • Kufakwe okuphakathi
  • Full

Hhayi-ke, kulungile, Kufakwe okuphakathi kwe-MTProxy, lokhu kwengezwa kamuva ngenxa yemicimbi eyaziwayo. Kodwa kungani kunezinye izinguqulo ezimbili (ezintathu sezizonke) lapho ungadlula ngeyodwa? Zozine zihluke ngokuyisisekelo kuphela endleleni yokusetha ubude nokulayishwa kwe-MTProto eyinhloko, okuzoxoxwa ngakho ngokuqhubekayo:

  • kokuthi Okufinyeziwe ngu-1 noma 4 amabhayithi, kodwa hhayi u-0xef, bese kuba umzimba
  • ku-Intermediate lena ingamabhayithi angu-4 ubude kanye nenkambu, futhi okokuqala iklayenti kufanele lithumele 0xeeeeeeee ukukhombisa ukuthi iphakathi
  • Ngokugcwele okulutha kakhulu, ngokombono womsebenzisi wenethiwekhi: ubude, inombolo yokulandelana, futhi AKUYONA LEYO ngokuyinhloko iMTProto, umzimba, CRC32. Yebo, konke lokhu kungaphezulu kwe-TCP. Okusihlinzeka ngezinto zokuhamba ezithembekile ngendlela yokusakaza kwebhayithi elandelanayo; akukho ukulandelana okudingekayo, ikakhulukazi amasheke. Kulungile, manje othile uzongiphikisa ngokuthi i-TCP ine-checksum ye-16-bit, ngakho-ke ukonakala kwedatha kwenzeka. Kuhle, kodwa empeleni sinephrothokholi ye-cryptographic enama-hashes amade kunamabhayithi angu-16, wonke lawa maphutha - nangaphezulu - azobanjwa ukungafani kwe-SHA ezingeni eliphezulu. ALIKHO iphuzu ku-CRC32 phezu kwalokhu.

Ake siqhathanise i-Abridged, lapho i-byte eyodwa yobude ingenzeka khona, ne-Intermediate, efakazela ukuthi "Uma kwenzeka ukulungiswa kwedatha ye-4-byte kuyadingeka," okuwumbudane. Yini, kukholakala ukuthi abahleli bezinhlelo zeTelegramu abanekhono kangangokuthi abakwazi ukufunda idatha kusuka kusokhethi baye kubhafa eqondanisiwe? Kusafanele wenze lokhu, ngoba ukufunda kungakubuyisela noma iyiphi inombolo yamabhayithi (futhi kukhona namaseva wommeleli, isibonelo...). Noma ngakolunye uhlangothi, kungani uvimbele i-Abridged uma sisazoba nama-padding aphakeme ngaphezulu kwamabhayithi ayi-16 - gcina amabhayithi ama-3 ngezinye izikhathi ?

Umuntu uthola umbono wokuthi u-Nikolai Durov uthanda ngempela ukuvuselela amasondo, kuhlanganise nezivumelwano zenethiwekhi, ngaphandle kwesidingo sangempela esisebenzayo.

Ezinye izinketho zokuthutha, kuhl. Iwebhu kanye ne-MTProxy, ngeke sicabangele manje, mhlawumbe kokunye okuthunyelwe, uma kunesicelo. Mayelana nale MTProxy efanayo, masikhumbule kuphela manje ukuthi ngemva nje kokukhululwa kwayo ngo-2018, abahlinzeki bafunda ngokushesha ukuyivimba, okuhloswe ngayo. ukuvinjwa kwe-bypassngo usayizi wephakheji! Futhi iqiniso lokuthi iseva ye-MTProxy ebhalwe (futhi ngu-Waltman) ku-C yayiboshelwe ngokweqile ku-Linux, nakuba lokhu kwakungadingeki nhlobo (uPhil Kulin uzoqinisekisa), nokuthi iseva efanayo kungaba ku-Go noma ku-Node.js ukungena emigqeni engaphansi kwekhulu.

Kodwa sizofinyelela iziphetho mayelana nolwazi lobuchwepheshe lwalaba bantu ekupheleni kwesigaba, ngemva kokucabangela ezinye izindaba. Okwamanje, ake sidlulele ku-OSI ungqimba 5, iseshini - lapho babeke khona iseshini ye-MTProto.

Okhiye, imilayezo, izikhathi, Diffie-Hellman

Bayibeke lapho ngokungalungile ngokuphelele... Iseshini ayiyona iseshini efanayo ebonakalayo kusixhumi esibonakalayo ngaphansi kwamaseshini asebenzayo. Kodwa ngokulandelana.

Ukugxekwa kwephrothokholi kanye nezindlela zenhlangano zeTelegram. Ingxenye 1, ubuchwepheshe: ulwazi lokubhala iklayenti kusukela ekuqaleni - TL, MT

Ngakho-ke sithole uchungechunge lwebhayithi yobude obaziwayo kusukela kusendlalelo sezokuthutha. Lona umlayezo obethelwe noma umbhalo ongenalutho - uma sisesesigabeni sesivumelwano esibalulekile futhi siyakwenza ngempela. Iyiphi inqwaba yemiqondo ebizwa ngokuthi “ukhiye” esikhuluma ngayo? Ake sicacisele lolu daba eqenjini leTelegramu ngokwalo (Ngiyaxolisa ngokuhumusha imibhalo yami ngisuka esiNgisini ngobuchopho obukhathele ngo-4 ekuseni, bekulula ukushiya imishwana injengoba injalo):

Zimbili izinhlaka ezibizwa Iseshini - eyodwa ku-UI yamakhasimende asemthethweni ngaphansi kokuthi "izikhathi zamanje", lapho iseshini ngayinye ihambisana nayo yonke idivayisi / i-OS.
Okwesibili - Iseshini yeMTProto, enenombolo yokulandelana komlayezo (ngomqondo wezinga eliphansi) kuwo, nokuthi iyiphi ingahlala phakathi kokuxhumana okuhlukile kwe-TCP. Amaseshini amaningi we-MTProto angafakwa ngesikhathi esisodwa, isibonelo, ukusheshisa ukulandwa kwefayela.

Phakathi kwalaba ababili sessions kukhona umqondo ukugunyazwa. Endabeni ewohlokayo, singakusho lokho Isikhathi se-UI kuyefana ne ukugunyazwa, kodwa maye, yonke into iyinkimbinkimbi. Ake sibheke:

  • Umsebenzisi osedivayisini entsha ukhiqiza kuqala auth_key futhi iyibophezela ku-akhawunti, isibonelo nge-SMS - yingakho ukugunyazwa
  • Kwenzeke ngaphakathi kweyokuqala Iseshini yeMTProto, onayo session_id ngaphakathi kwakho.
  • Kulesi sinyathelo, inhlanganisela ukugunyazwa и session_id angabizwa igunya - leli gama livela kumadokhumenti kanye nekhodi yamanye amaklayenti
  • Bese, iklayenti lingavula eziningana Izikhathi zeMTProto ngaphansi okufanayo auth_key - ku-DC efanayo.
  • Bese, ngolunye usuku iklayenti izodinga ukucela ifayela kusuka omunye u-DC - futhi kule DC kuzokwenziwa entsha auth_key !
  • Ukwazisa uhlelo ukuthi akuyena umsebenzisi omusha obhalisayo, kodwa okufanayo ukugunyazwa (Isikhathi se-UI), iklayenti lisebenzisa izingcingo ze-API auth.exportAuthorization ekhaya DC auth.importAuthorization ku-DC entsha.
  • Konke kuyafana, eziningana zingase zivuleke Izikhathi zeMTProto (yinye neyakhe session_id) kule DC entsha, ngaphansi wakhe auth_key.
  • Ekugcineni, iklayenti lingase lifune i-Perfect Forward Secrecy. Njalo auth_key kwaba Unomphela ukhiye - nge-DC ngayinye - futhi iklayenti lingafona auth.bindTempAuthKey ukusetshenziswa okwesikhashana auth_key - futhi, eyodwa kuphela temp_auth_key nge-DC, ejwayelekile kubo bonke Izikhathi zeMTProto kule DC.

Qaphela lokho usawoti (kanye nosawoti wesikhathi esizayo) nakho kukodwa auth_key labo. kwabelwana phakathi kwawo wonke umuntu Izikhathi zeMTProto ku-DC ofanayo.

Kusho ukuthini "phakathi kokuxhumana okuhlukile kwe-TCP"? Ngakho lokhu kusho into efana ikhukhi lokugunyaza kuwebhusayithi - iyaqhubeka (iyasinda) ukuxhumana okuningi kwe-TCP kuseva enikeziwe, kodwa ngolunye usuku kuba kubi. Ngokungafani ne-HTTP kuphela, ku-MTProto imilayezo ngaphakathi kweseshini ibalwa ngokulandelana futhi iqinisekiswa; uma ingene emhubheni, uxhumano lwaphuka - ngemva kokusungula uxhumano olusha, iseva izothumela ngomusa yonke into kule seshini engazange ikulethe esikhathini esidlule. Ukuxhumana kwe-TCP.

Nokho, ulwazi olungenhla lufinyezwa ngemva kwezinyanga eziningi zophenyo. Okwamanje, ingabe sisebenzisa iklayenti lethu kusukela ekuqaleni? - ake sibuyele ekuqaleni.

Ngakho ake sikhiqize auth_key on Izinguqulo ze-Diffie-Hellman ezivela kuTelegram. Ake sizame ukuqonda imibhalo...

Vasily, [19.06.18 20:05] idatha_with_hash := SHA1(idatha) + idatha + (noma imaphi amabhayithi angahleliwe); kangangokuthi ubude bulingana namabhayithi angu-255;
encrypted_data := RSA(data_with_hash, server_public_key); inombolo ende engu-255-byte (i-endian enkulu) iphakanyiselwa emandleni adingekayo phezu kwemoduli edingekayo, futhi umphumela ugcinwa njengenombolo engu-256-byte.

Bane-dope DH

Akubukeki njenge-DH yomuntu onempilo
Abekho okhiye ababili basesidlangalaleni ku-dx

Nokho, ekugcineni lokhu kwahlelwa, kodwa kwasala - ubufakazi bomsebenzi wenziwa iklayenti ukuthi likwazile ukubala inombolo. Uhlobo lokuvikela ekuhlaselweni kwe-DoS. Futhi ukhiye we-RSA usetshenziswa kanye kuphela ohlangothini olulodwa, ikakhulukazi ekubetheleni new_nonce. Kodwa nakuba lo msebenzi obonakala ulula uzophumelela, yini okuzodingeka ubhekane nayo?

Vasily, [20.06.18/00/26 XNUMX:XNUMX] Angikakafiki esicelweni se-appid

Ngithumele lesi sicelo ku-DH

Futhi, kudokhi yezokuthutha ithi ingaphendula ngamabhayithi angu-4 wekhodi yephutha. Yilokho kuphela

Awu, wangitshela -404, pho?

Ngakho ngamtshela ukuthi: “Bamba i-bullshit yakho ebethelwe ngokhiye weseva onezigxivizo zeminwe ezinjengalezi, ngifuna i-DH,” futhi yaphendula ngo-404 oyisiphukuphuku.

Ungacabangani ngale mpendulo yeseva? Okufanele ngikwenze? Akekho ongambuza (kodwa okuningi kulokho engxenyeni yesibili).

Lapha yonke inzalo yenziwa esitokisini

Akukho okunye engingakwenza, ngiphuphe nje ngiguqule izinombolo ngibuye ngibuye naphambili

Izinombolo ezimbili ze-32 bit. Ngiwapakishe njengabo bonke abantu

Kodwa cha, lezi ezimbili zidinga ukungezwa kulayini kuqala njenge-BE

Vadim Goncharov, [20.06.18 15:49] futhi ngenxa yalokhu 404?

Vasily, [20.06.18 15:49] YEBO!

U-Vadim Goncharov, [20.06.18 15:50] ngakho-ke angiqondi ukuthi yini "angayitholanga"

Vasily, [20.06.18 15:50] cishe

Angikwazanga ukuthola ukubola okunjalo ezintweni eziyinhloko%)

Asizange silawule nokubika iphutha

Vasily, [20.06.18 20:18] Oh, kukhona futhi i-MD5. Kakade ama-hashe amathathu ahlukene

Izigxivizo zeminwe eziyinhloko zibalwe kanje:

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

I-SHA1 kanye ne-sha2

Ake sikubeke auth_key sithole amabhithi angu-2048 ngosayizi sisebenzisa i-Diffie-Hellman. Yini elandelayo? Okulandelayo sithola ukuthi amabhithi angu-1024 aphansi alo khiye awasetshenziswa nganoma iyiphi indlela... kodwa ake sicabange ngalokhu okwamanje. Kulesi sinyathelo, sinemfihlo eyabiwe neseva. I-analogue yeseshini ye-TLS isisunguliwe, okuyinqubo ebiza kakhulu. Kodwa iseva namanje ayazi lutho ngokuthi singobani! Hhayi okwamanje, empeleni. ukugunyazwa. Labo. uma ucabange “ngephasiwedi yokungena”, njengoba wake wenza ku-ICQ, noma okungenani “ukhiye wokungena”, njengaku-SSH (isibonelo, kwenye i-gitlab/github). Sithole engaziwa. Kuthiwani uma iseva isitshela ukuthi “lezi zinombolo zocingo ziseviswa enye i-DC”? Noma “inombolo yakho yocingo ivinjelwe”? Okungcono kakhulu esingakwenza ukugcina ukhiye ngethemba lokuthi uzoba wusizo futhi ngeke ubole ngaleso sikhathi.

Nokho, “siyithole” ngokubhukha. Ngokwesibonelo, ingabe siyayethemba iseva? Kuthiwani uma kungamanga? Ukuhlolwa kwe-Cryptographic kungadingeka:

Vasily, [21.06.18 17:53] Banikeza amaklayenti eselula ukuthi ahlole inombolo engu-2kbit ukuze abone ukubaluleka kwawo%.

Kodwa akucaci nhlobo, nafeijoa

Vasily, [21.06.18 18:02] Idokhumenti ayisho ukuthi yini okufanele yenziwe uma kuvela ukuthi ayilula

Akushiwo. Ake sibone ukuthi iklayenti le-Android elisemthethweni lenzani kuleli cala? A yilokho (futhi yebo, lonke ifayela liyathakazelisa) - njengoba besho, ngizovele ngishiye lokhu lapha:

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

Cha, vele isekhona ezinye Kukhona ukuhlolwa kokubalulekile kwenombolo, kodwa mina ngokwami ​​angisenalo ulwazi olwanele lwezibalo.

Kulungile, sithole ukhiye oyinhloko. Ukungena ngemvume, i.e. thumela izicelo, udinga ukwenza ukubethela okwengeziwe, usebenzisa i-AES.

Ukhiye womlayezo uchazwa njengamabhithi amaphakathi angu-128 we-SHA256 yendikimba yomlayezo (okuhlanganisa iseshini, i-ID yomlayezo, njll.), okuhlanganisa namabhayithi okupheda, amiswe ngaphambili ngamabhayithi angu-32 athathwe kukhiye wokugunyaza.

Vasily, [22.06.18 14:08] Isilinganiso, bitch, bits

Kwamukelwe auth_key. Konke. Ngaphandle kwabo... akucaci kudokhumenti. Zizwe ukhululekile ukufunda ikhodi yomthombo ovulekile.

Qaphela ukuthi i-MTProto 2.0 idinga kusuka ku-12 kuya ku-1024 bytes of padding, kusengaphansi kwesimo sokuthi ubude bomlayezo obuwumphumela buhlukaniseke ngamabhayithi angu-16.

Ngakho-ke kufanele wengeze i-padding engakanani?

Futhi yebo, kukhona futhi 404 uma kwenzeka iphutha

Uma noma ubani efunda ngokucophelela umdwebo nombhalo wemibhalo, baqaphela ukuthi ayikho i-MAC lapho. Futhi ukuthi i-AES isetshenziswa kumodi ethile ye-IGE engasetshenziswa kwenye indawo. Yebo, babhala ngalokhu ku-FAQ yabo... Lapha, njengokuthi, ukhiye womlayezo ngokwawo uyi-SHA hash yedatha esusiwe, esetshenziselwa ukuhlola ubuqotho - futhi uma kwenzeka kunokungafani, imibhalo ngesizathu esithile. incoma ukuthi ungazinaki buthule (kodwa kuthiwani ngezokuphepha, kuthiwani uma zisephula?).

Angiyena umbhali we-cryptographer, mhlawumbe akukho lutho olungalungile ngale modi kuleli cala ngokombono wethiyori. Kodwa ngingasho ngokucacile inkinga esebenzayo, ngisebenzisa i-Telegram Desktop njengesibonelo. Ibhala ngemfihlo inqolobane yendawo (zonke lezi D877F783D5D3EF8C) ngendlela efanayo nemilayezo eku-MTrototo (kulesi simo kuphela inguqulo 1.0), i.e. okokuqala ukhiye womlayezo, bese kuba idatha uqobo (futhi kwenye indawo eceleni okukhulu okuyinhloko auth_key 256 byte, ngaphandle kwalokho msg_key engenamsebenzi). Ngakho, inkinga ibonakala kumafayela amakhulu. Okungukuthi, udinga ukugcina amakhophi amabili edatha - ebethelwe futhi enqanyuliwe. Futhi uma kukhona amamegabhayithi, noma ividiyo esakazwayo, isibonelo?.. Izikimu zasendulo ezine-MAC ngemva kombhalo we-ciphertext zikuvumela ukuthi uyifunde isakazwe, uyidlulise ngokushesha. Kodwa ngeMTProto kuzodingeka wenze njalo ekuqaleni bethela noma ukhiphe wonke umlayezo, bese uwudlulisela kunethiwekhi noma kudiski. Ngakho-ke, ezinguqulweni zakamuva ze-Telegram Desktop kunqolobane ku user_data Enye ifomethi nayo isetshenziswa - nge-AES kumodi ye-CTR.

Vasily, [21.06.18 01:27] O, ngithole ukuthi i-IGE iyini: I-IGE bekuwumzamo wokuqala "wemodi yokuqinisekisa yokubethela," ekuqaleni eye-Kerberos. Bekuwumzamo owehlulekile (akunikezi isivikelo sobuqotho), futhi kwadingeka ukuthi kususwe. Lokho bekuyisiqalo seminyaka engu-20 yokufuna imodi yokuqinisekisa yokubethela esebenzayo, esanda kufinyelela umvuthwandaba ngamamodi afana ne-OCB ne-GCM.

Futhi manje izimpikiswano ezivela ohlangothini lwenqola:

Iqembu elingemuva kweTelegram, eliholwa nguNikolai Durov, liqukethe ompetha abayisithupha be-ACM, ingxenye yabo i-Ph.D ngezibalo. Kwabathatha cishe iminyaka emibili ukukhipha inguqulo yamanje ye-MTProto.

Kuyahlekisa lokho. Iminyaka emibili ezingeni eliphansi

Noma ungathatha ama-tls

Kulungile, ake sithi sikwenzile ukubethela namanye ama-nuances. Ingabe ekugcineni kungenzeka ukuthumela izicelo ezenziwe ngokwezifiso ku-TL bese ususa izimpendulo? Ngakho-ke yini futhi kufanele uyithumele kanjani? Lapha, ake sithi, indlela InitConnection, mhlawumbe yilo?

Vasily, [25.06.18 18:46] Iqala ukuxhumana futhi ilondoloze ulwazi kudivayisi yomsebenzisi nohlelo lokusebenza.

Yamukela i-app_id, device_model, system_version, app_version and lang_code.

Futhi omunye umbuzo

Amadokhumenti njengenjwayelo. Zizwe ukhululekile ukufunda umthombo ovulekile

Uma yonke into ibicishe icace nge-invokeWithLayer, yini engalungile lapha? Kuvele ukuthi, ake sithi sinakho - iklayenti selivele linento elibuza ngayo iseva - kunesicelo ebesifuna ukusithumela:

Vasily, [25.06.18 19:13] Uma sibheka ikhodi, ucingo lokuqala lugoqwe kulokhu kuganga, futhi i-crap ngokwayo isongwe nge-invokewithlayer.

Kungani i-initConnection ingakwazi ukuba ucingo oluhlukile, kodwa kufanele ibe isisonga? Yebo, njengoba kwavela, kufanele kwenziwe njalo ekuqaleni kweseshini ngayinye, hhayi kanye, njengokhiye oyinhloko. Kodwa! Ngeke kubizwe umsebenzisi ongagunyaziwe! Manje sesifinyelele esigabeni lapho isisebenza khona Lena ikhasi lemibhalo - futhi lisitshela ukuthi...

Ingxenye encane kuphela yezindlela ze-API ezitholakala kubasebenzisi abangagunyaziwe:

  • Auth.sendCode
  • Auth.thumela Ikhodi
  • account.getPassword
  • auth.checkPassword
  • auth.checkPhone
  • auth.signUp
  • auth.signIn
  • I-auth.importAuthorization
  • help.getConfig
  • help.getNearestDc
  • help.getAppUpdate
  • help.getCdnConfig
  • langpack.getLangPack
  • langpack.getStrings
  • langpack.getDifference
  • langpack.getLanguages
  • langpack.getLanguage

Owokuqala wabo, auth.sendCode, futhi kukhona leso sicelo sokuqala esithandwayo lapho sithumela khona i-api_id ne-api_hash, futhi ngemva kwalokho sithola i-SMS enekhodi. Futhi uma sise-DC engalungile (izinombolo zocingo kuleli zwe zinikezwa omunye, isibonelo), khona-ke sizothola iphutha ngenombolo ye-DC oyifunayo. Ukuze uthole ukuthi yiliphi ikheli le-IP ngenombolo ye-DC odinga ukuxhuma kuyo, sisize help.getConfig. Ngesinye isikhathi kwakukhona okufakiwe okungu-5 kuphela, kodwa ngemva kwemicimbi edumile ka-2018, inani liye landa kakhulu.

Manje masikhumbule ukuthi sifinyelele kulesi sigaba kuseva ngokungaziwa. Ingabe akubizi kakhulu ukuthola nje ikheli lasesizindeni se-inthanethi? Kungani ungenzi lokhu, neminye imisebenzi, engxenyeni engabethelwe ye-MTProto? Ngizwa ukuphikisa: "singenza kanjani isiqiniseko sokuthi akuyona i-RKN ezophendula ngamakheli angamanga?" Kulokhu sikhumbula ukuthi, ngokuvamile, amaklayenti asemthethweni Okhiye be-RSA bashumekiwe, i.e. ungakwazi nje bhalisa lolu lwazi. Empeleni, lokhu sekuvele kwenziwa ukuze uthole ulwazi lokudlula ukuvinjwa okutholwa amaklayenti ngamanye amashaneli (ngokunengqondo, lokhu ngeke kwenziwe ku-MTProto ngokwayo; udinga futhi ukwazi ukuthi uxhumeke kuphi).

KULUNGILE. Kulesi sigaba sokugunyazwa kwamakhasimende, asikakagunyazwa futhi asikabhalisi isicelo sethu. Sifuna ukubona okwamanje ukuthi iseva iphendula ini ezindleleni ezitholakala kumsebenzisi ongagunyaziwe. Futhi lapha…

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;

Esikimini, kuqala kuza okwesibili

Ku-schema se-tdesktop inani lesithathu lithi

Yebo, kusukela lapho, kunjalo, imibhalo ibuyekeziwe. Nakuba kungase kusheshe kungabi namsebenzi futhi. Unjiniyela we-novice kufanele azi kanjani? Mhlawumbe uma ubhalisa isicelo sakho, bazokwazisa? U-Vasily wenza lokhu, kodwa maye, abazange bamthumele lutho (futhi, sizokhuluma ngalokhu engxenyeni yesibili).

...Uqaphele ukuthi sesivele ngandlela thize siye ku-API, i.e. ezingeni elilandelayo, futhi uphuthelwe okuthile esihlokweni seMTProto? Akumangazi:

Vasily, [28.06.18 02:04] Mm, baphenya amanye ama-algorithms ku-e2e

I-Mtproto ichaza ama-algorithms wokubethela kanye nokhiye bazo zombili izizinda, kanye nesakhiwo esincane se-wrapper

Kodwa bahlala bexuba amaleveli ahlukene esitaki, ngakho-ke akuhlali kucace ukuthi i-mtproto igcine kuphi futhi ileveli elandelayo yaqala.

Zixubana kanjani? Nokho, nansi ukhiye wesikhashana ofanayo we-PFS, isibonelo (ngendlela, i-Telegram Desktop ayikwazi ukukwenza). Yenziwa ngesicelo se-API auth.bindTempAuthKey, i.e. kusukela ezingeni eliphezulu. Kodwa ngesikhathi esifanayo kuphazamisa ukubethela ezingeni eliphansi - ngemva kwalokho, isibonelo, udinga ukukwenza futhi. initConnection njll., akunjalo nje isicelo esijwayelekile. Okubalulekile futhi ukuthi ungaba nokhiye OWODWA kuphela wesikhashana nge-DC, nakuba inkambu auth_key_id kumlayezo ngamunye ikuvumela ukuthi uguqule ukhiye okungenani yonke imilayezo, nokuthi iseva inelungelo "lokukhohlwa" ukhiye wesikhashana nganoma isiphi isikhathi - imibhalo ayisho ukuthi yini okufanele yenziwe kuleli cala ... kahle, kungani Awunawo okhiye abaningana, njengesethi yosawoti besikhathi esizayo, futhi ?..

Kukhona ezinye izinto ezimbalwa okufanele wazi mayelana netimu ye-MTProto.

Imilayezo yemilayezo, i-msg_id, i-msg_seqno, iziqinisekiso, i-pings ibheke endaweni engafanele kanye nokunye okungaqondakali

Kungani udinga ukwazi ngabo? Ngoba "ziyavuza" ziye ezingeni eliphezulu, futhi udinga ukuzazi lapho usebenza ne-API. Ake sicabange ukuthi asinantshisekelo ku-msg_key; izinga eliphansi lisuse ukubethela yonke into yethu. Kodwa ngaphakathi kwedatha esusiwe sinezinkambu ezilandelayo (futhi ubude bedatha, ngakho-ke siyazi ukuthi i-padding ikuphi, kodwa lokho akubalulekile):

  • usawoti - int64
  • iseshini_id - int64
  • message_id — int64
  • seq_no - int32

Ake sinikhumbuze ukuthi munye kuphela usawoti we-DC wonke. Kungani sazi ngaye? Hhayi ngoba kukhona isicelo get_future_salts, ekutshela ukuthi yiziphi izikhawu ezizosebenza, kodwa futhi ngoba uma usawoti wakho "ubolile", khona-ke umlayezo (isicelo) uzomane ulahleke. Iseva, vele, izobika usawoti omusha ngokuwukhipha new_session_created - kodwa ngendala kuzodingeka uyithumele kabusha ngandlela thile, ngokwesibonelo. Futhi le nkinga ithinta isakhiwo sohlelo lokusebenza.

Iseva ivunyelwe ukuwisa amaseshini ngokuphelele futhi iphendule ngale ndlela ngenxa yezizathu eziningi. Empeleni, yini iseshini ye-MTProto evela ohlangothini lweklayenti? Lezi izinombolo ezimbili session_id и seq_no imiyalezo ngaphakathi kwalesi sikhathi. Yebo, kanye nokuxhumeka kwe-TCP okuyisisekelo, kunjalo. Ake sithi iklayenti lethu namanje alazi ukuthi lenziwa kanjani izinto eziningi, lanqamula, laxhuma kabusha. Uma lokhu kwenzeka ngokushesha - iseshini endala iqhubekile ekuxhumekeni okusha kwe-TCP, yanda seq_no ngokuqhubekayo. Uma kuthatha isikhathi eside, iseva ingayisusa, ngoba ohlangothini lwayo iphinde ibe umugqa, njengoba sitholile.

Kufanele kube yini seq_no? O, umbuzo onzima lowo. Zama ukuqonda ngokweqiniso ukuthi kwakushiwo ukuthini:

Umlayezo ohlobene nokuqukethwe

Umlayezo odinga ukuvuma okusobala. Lokhu kufaka phakathi yonke imilayezo yomsebenzisi nesevisi eminingi, cishe yonke ngaphandle kweziqukathi nokubonga.

Inombolo Yokulandelana Komlayezo (msg_seqno)

Inombolo engu-32-bit elingana nenani eliphindwe kabili lemilayezo “ehlobene nokuqukethwe” (leyo edinga ukuvunywa, futhi ikakhulukazi leyo engewona iziqukathi) edalwe umthumeli ngaphambi kwalo mlayezo futhi kamuva inyuswe ngomunye uma umlayezo wamanje uwu umlayezo ohlobene nokuqukethwe. Isiqukathi sihlala senziwa ngemva kokukuqukethe konke; ngakho-ke, inombolo yayo yokulandelana inkulu noma ilingana nezinombolo zokulandelana kwemiyalezo equkethwe kuyo.

Hlobo luni lwesekisi lolu olunokwengezwa ngo-1, bese kuba elinye ngo-2?. ikakhulukazi, iphuma, ingathunyelwa eziningana iziqinisekiso ezifanayo seq_no! Kanjani? Nokho, isibonelo, iseva isithumelela okuthile, iyithumele, futhi thina ngokwethu sithule, siphendula kuphela ngemilayezo yesevisi eqinisekisa ukwamukelwa kwemilayezo yayo. Kulesi simo, iziqinisekiso zethu eziphumayo zizoba nenombolo efanayo ephumayo. Uma ujwayelene ne-TCP futhi ucabanga ukuthi lokhu kuzwakala ngandlela thize, kodwa kubonakala kungabonakali kakhulu, ngoba ku-TCP seq_no akushintshi, kodwa isiqinisekiso siya ku seq_no ngakolunye uhlangothi, ngizoshesha ukunicasula. Ukuqinisekisa kunikezwa kuMTProto CHA on seq_no, njengaku-TCP, kodwa ngo msg_id !

Kuyini lokhu msg_id, ebaluleke kakhulu kule mikhakha? Inkomba yomlayezo ehlukile, njengoba igama liphakamisa. Ichazwa njengenombolo ye-64-bit, izingcezu eziphansi kakhulu futhi ezinomlingo "weseva-hhayi-iseva", kanti okunye kuyisitembu sesikhathi se-Unix, okuhlanganisa ingxenye eyingxenye, egudluze amabhithi angama-32 kwesokunxele. Labo. isitembu sesikhathi sese (kanye nemiyalezo enezikhathi ezihluke kakhulu izonqatshwa iseva). Kulokhu kuvela ukuthi ngokujwayelekile lesi yisihlonzi esisemhlabeni wonke seklayenti. Njengoba kunikezwe lokho - ake sikhumbule session_id - siqinisekisiwe: Akukho ngaphansi kwezimo lapho umlayezo ohloselwe iseshini eyodwa ungathunyelwa kuseshini ehlukile. Okusho ukuthi, kuvela ukuthi kukhona kakade ezintathu izinga - iseshini, inombolo yeseshini, i-id yomlayezo. Kungani i-overcomplication enjalo, le mfihlakalo inkulu kakhulu.

Ngakho-ke, msg_id edingekayo ukuze...

I-RPC: izicelo, izimpendulo, amaphutha. Iziqinisekiso.

Njengoba kungenzeka ukuthi ubonile, alukho uhlobo olukhethekile "lwenza isicelo se-RPC" noma umsebenzi noma kuphi kumdwebo, nakuba zikhona izimpendulo. Phela, sinemiyalezo ehlobene nokuqukethwe! Leyo, noma umlayezo kungaba isicelo! Noma kungabi njalo. Ngemva kwakho konke, ngamunye kuyinto msg_id. Kodwa kunezimpendulo:

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

Yilapho okukhonjiswa khona ukuthi yimuphi umlayezo lo impendulo yawo. Ngakho-ke, ezingeni eliphezulu le-API, kuzodingeka ukhumbule ukuthi inombolo yesicelo sakho yayiyini - ngicabanga ukuthi asikho isidingo sokuchaza ukuthi umsebenzi awuvumelanisi, futhi kungaba nezicelo eziningana eziqhubekayo ngesikhathi esisodwa, izimpendulo ezingabuyiselwa nganoma iyiphi indlela? Empeleni, kusuka kulokhu kanye nemilayezo yephutha efana nabasebenzi, ukwakheka ngemuva kwalokhu kungalandelelwa: iseva egcina ukuxhumana kwe-TCP nawe iyibhalansi yangaphambili, idlulisela izicelo kuma-backends futhi iziqoqe emuva ngokusebenzisa message_id. Kubonakala sengathi yonke into lapha icacile, inengqondo futhi inhle.

Yebo?.. Futhi uma ucabanga ngakho? Phela, impendulo ye-RPC ngokwayo nayo inenkambu msg_id! Ingabe sidinga ukumemeza kuseva "awuphenduli impendulo yami!"? Futhi yebo, bekuyini mayelana neziqinisekiso? Mayelana nekhasi imiyalezo ngemiyalezo usitshela ukuthi yini

msgs_ack#62d6b459 msg_ids:Vector long = MsgsAck;

futhi kumelwe kwenziwe ohlangothini ngalunye. Kodwa hhayi njalo! Uma uthole i-RpcResult, yona ngokwayo isebenza njengesiqinisekiso. Okusho ukuthi, iseva ingaphendula isicelo sakho nge-MsgsAck - njengokuthi, "Ngiyitholile." I-RpcResult ingaphendula ngokushesha. Kungaba kokubili.

Futhi yebo, kusafanele uphendule impendulo! Ukuqinisekisa. Uma kungenjalo, iseva izoyibheka njengengaletheki bese ikuthumelela yona futhi. Ngisho nangemva kokuxhuma kabusha. Kodwa lapha, kunjalo, indaba yokuphelelwa yisikhathi iyaphakama. Ake sizibheke kamuva.

Okwamanje, ake sibheke amaphutha okungenzeka enze umbuzo.

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

O, othile uzobabaza, nansi ifomethi enobuntu - kukhona umugqa! Thatha isikhathi sakho. Lapha uhlu lwamaphutha, kodwa-ke akuphelele. Kuyo sifunda ukuthi ikhodi into efana Amaphutha e-HTTP (kahle, yebo, i-semantics yezimpendulo ayihlonishwa, kwezinye izindawo isakazwa ngokungahleliwe phakathi kwamakhodi), futhi umugqa ubukeka sengathi CAPITAL_LETTERS_AND_NUMBERS. Isibonelo, PHONE_NUMBER_OCCUPIED noma FILE_PART_Х_MISSING. Hhayi-ke, lokho kusho ukuthi, usazowudinga lo mugqa hlaziya... Ngokwesibonelo, FLOOD_WAIT_3600 kuzosho ukuthi kufanele ulinde ihora, futhi PHONE_MIGRATE_5, ukuthi inombolo yocingo enalesi siqalo kufanele ibhaliswe ku-5th DC. Sinolimi lohlobo, akunjalo? Asidingi ingxabano evela kuchungechunge, abavamile bazokwenza, kulungile.

Futhi, lokhu akukho ekhasini lemilayezo yesevisi, kodwa, njengoba sekuvamile ngale phrojekthi, ulwazi lungatholakala kwelinye ikhasi lemibhalo. Noma phonsa izinsolo. Okokuqala, bheka, ukuthayipha/ukwephulwa kwesendlalelo - RpcError ingafakwa ngaphakathi RpcResult. Kungani kungabi ngaphandle? Yini esingazange siyicabangele?.. Ngokunjalo, sikuphi isiqinisekiso sokuthi RpcError angeke ishumekwe phakathi RpcResult, kodwa ibe ngokuqondile noma ifakwe kolunye uhlobo? .. Futhi uma ingakwazi, kungani ingekho ezingeni eliphezulu, i.e. ilahlekile req_msg_id ? ..

Kodwa ake siqhubeke ngemilayezo yesevisi. Iklayenti lingase licabange ukuthi iseva icabanga isikhathi eside futhi yenze lesi sicelo esihle kakhulu:

rpc_drop_answer#58e4a740 req_msg_id:long = RpcDropAnswer;

Kunezimpendulo ezintathu ezingaba khona kulo mbuzo, futhi ziphambana nendlela yokuqinisekisa; uzama ukuqonda ukuthi kufanele zibe yini (nokuthi yiluphi uhlu olujwayelekile lwezinhlobo ezingadingi ukuqinisekiswa) lushiyelwa umfundi njengomsebenzi wasekhaya (inothi: ulwazi ku ikhodi yomthombo ye-Telegram Desktop ayiphelele).

Ukulutha kwezidakamizwa: izimo zomlayezo

Ngokuvamile, izindawo eziningi ku-TL, MTProto kanye neTelegram ngokuvamile zishiya umuzwa wenkani, kodwa ngenxa yenhlonipho, ubuhlakani nokunye. amakhono alula Sathula ngesizotha ngakho, futhi sagxeka amanyala ezingxoxweni. Nokho, le ndawoОiningi lekhasi limayelana imiyalezo ngemiyalezo Kuyashaqisa nakimi, osesebenze nezinhlelo zenethiwekhi isikhathi eside futhi ngabona amabhayisikili amazinga ahlukene okugwegwile.

Iqala ngokungenacala, ngeziqinisekiso. Okulandelayo basitshela mayelana

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;

Nokho, wonke umuntu oqala ukusebenza nge-MTProto kuzomele abhekane nazo; emjikelezweni “olungisiwe - ophinde wahlanganiswa - oqalisiwe”, ukuthola amaphutha ezinombolo noma usawoti okwazile ukungahambi kahle ngesikhathi sokuhlelwa kuyinto evamile. Nokho, kukhona amaphuzu amabili lapha:

  1. Lokhu kusho ukuthi umlayezo wokuqala ulahlekile. Kudingeka sakhe imigqa ethile, sizokubheka kamuva.
  2. Yiziphi lezi zinombolo zamaphutha ezingavamile? 16, 17, 18, 19, 20, 32, 33, 34, 35, 48, 64... ziphi ezinye izinombolo, Tommy?

Amadokhumenti athi:

Inhloso ukuthi amavelu e- error_code aqoqwe (error_code >> 4): isibonelo, amakhodi 0x40 — 0x4f ahambisana namaphutha ekwakhiweni kwesiqukathi.

kodwa, okokuqala, ukushintshwa kolunye uhlangothi, futhi okwesibili, akunandaba, aphi amanye amakhodi? Ekhanda lombhali?.. Nokho, lezi ziwubala.

Ukulutheka kuqala emilayezweni emayelana nezimo zemiyalezo namakhophi emiyalezo:

  • Isicelo Solwazi Lwesimo Somlayezo
    Uma noma yiliphi iqembu lingakatholi ulwazi ngesimo semilayezo yalo ephumayo isikhathi eside, lingase lilucele ngokusobala kolunye uhlangothi:
    msgs_state_req#da69fb52 msg_ids:Vector long = MsgsStateReq;
  • Umlayezo Wolwazi mayelana Nesimo Semilayezo
    msgs_state_info#04deb57d req_msg_id:long info:string = MsgsStateInfo;
    Lapha, info iwuchungechunge oluqukethe ncamashi ibhayithi elilodwa lesimo somlayezo womlayezo ngamunye ovela ohlwini olungenayo lwe-msg_ids:

    • 1 = akukho okwaziwayo ngomlayezo (msg_id iphansi kakhulu, kungenzeka ukuthi omunye ukhohliwe)
    • 2 = umyalezo awutholwanga (msg_id iwela phakathi kwezihlonzi ezigciniwe; nokho, omunye umuntu akakawutholi umlayezo onjalo)
    • 3 = umyalezo awutholwanga (msg_id iphezulu kakhulu; nokho, elinye iqembu alikakawutholi okwamanje)
    • 4 = umyalezo wamukelwe (qaphela ukuthi le mpendulo futhi ngesikhathi esifanayo iyisivumo sokwamukela)
    • +8 = umyalezo usuvunyiwe kakade
    • +16 = umyalezo ongadingi ukuqashelwa
    • +32 = Umbuzo we-RPC oqukethwe kumlayezo ocutshungulwayo noma ucubungulwa usuqedile
    • +64 = impendulo ehlobene nokuqukethwe kumlayezo osuvele ukhiqiziwe
    • +128 = elinye iqembu lazi ngeqiniso ukuthi umlayezo usutholakele
      Le mpendulo ayidingi ukuvuma. Kuwukuvuma i-msgs_state_req efanele, ngokwayo.
      Qaphela ukuthi uma kuvela kungazelelwe ukuthi elinye iqembu alinawo umlayezo obukeka sengathi uthunyelwe kulo, umlayezo ungavele uthunyelwe kabusha. Ngisho noma omunye umuntu kufanele athole amakhophi amabili omlayezo ngesikhathi esisodwa, impinda izozitshwa. (Uma sekudlule isikhathi esiningi, futhi i-msg_id yasekuqaleni ingasavumelekile, umlayezo uzosongwa ngo-msg_copy).
  • Ukuxhumana Kokuzithandela Kwesimo Semilayezo
    Noma yiliphi iqembu lingazisa ngokuzithandela elinye iqembu ngesimo semilayezo edluliswa elinye iqembu.
    msgs_all_info#8cc0d131 msg_ids:Vector long info:string = MsgsAllInfo
  • Ukuxhumana Okungeziwe Kokuzithandela Kwesimo Somlayezo Owodwa
    ...
    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;
  • Isicelo esicacile sokuphinda uthumele imilayezo
    msg_resend_req#7d861a08 msg_ids:Vector long = MsgResendReq;
    Iqembu elikude liphendula ngokushesha ngokuthumela kabusha imilayezo eceliwe […]
  • Isicelo Esicacile Sokuphinda Uthumele Izimpendulo
    msg_resend_ans_req#8610baeb msg_ids:Vector long = MsgResendReq;
    Iphathi ekude iphendula ngokushesha ngokuthumela kabusha izimpendulo emilayezweni eceliwe […]
  • Amakhophi Omlayezo
    Kwezinye izimo, umlayezo omdala one-msg_id ongasavumelekile udinga ukuthunyelwa kabusha. Bese, isongwe ngesitsha sokukopisha:
    msg_copy#e06046b2 orig_message:Message = MessageCopy;
    Uma usutholiwe, umlayezo ucutshungulwa njengokungathi i-wrapper ayikho. Nokho, uma kwaziwa ngokuqinisekile ukuthi umlayezo u-orig_message.msg_id wamukelwe, kusho ukuthi umlayezo omusha awucutshungulwa (ngasikhathi sinye, wona kanye ne-orig_message.msg_id kwaziswa). Inani le-orig_message.msg_id kumelwe libe ngaphansi kunomsg_id wesiqukathi.

Asithule nje kwenzenjani msgs_state_info futhi izindlebe ze-TL ezingaqediwe ziphuma ngaphandle (besidinga i-vector yama-byte, futhi ezingxenyeni ezimbili ezingezansi kwakukhona i-enum, futhi emabhithi amabili aphezulu kwakukhona amafulegi). Iphuzu lihlukile. Ingabe ukhona oqondayo ukuthi kungani konke lokhu kwenziwa? kuklayenti langempela kudingekile? .. Ngobunzima, kodwa umuntu angacabanga inzuzo ethile uma umuntu ehlanganyela ekulungiseni iphutha, futhi kumodi yokuxhumana - buza iseva ukuthi yini futhi kanjani. Kodwa lapha izicelo ziyachazwa uhambo olujikelezayo.

Lokhu kulandela ukuthi iqembu ngalinye akumele libethele futhi lithumele imilayezo kuphela, kodwa futhi ligcine idatha emayelana nalo, mayelana nezimpendulo kubo, isikhathi esingaziwa. Amadokhumenti awachazi noma izikhathi noma ukusebenza okungokoqobo kwalezi zici. akukho ndlela. Okumangalisa kakhulu ukuthi empeleni asetshenziswa kukhodi yamakhasimende asemthethweni! Ngokusobala batshelwe okuthile okwakungafakwanga emibhalweni yomphakathi. Qonda kusukela kukhodi kungani, ayiselula njengasesimo se-TL - akuyona ingxenye (ngokuqhathaniswa) ehlukaniswe ngokunengqondo, kodwa ucezu oluboshelwe ekwakhiweni kwesicelo, i.e. kuzodinga isikhathi esiningi kakhulu ukuqonda ikhodi yesicelo.

Ama-Pings kanye nezikhathi. Ulayini.

Kuyo yonke into, uma sikhumbula ukuqagela mayelana nesakhiwo seseva (ukusabalalisa izicelo kuzo zonke izindawo ezingemuva), kulandela into edabukisayo - naphezu kwazo zonke iziqinisekiso zokulethwa kwe-TCP (kungaba idatha ilethwa, noma uzokwaziswa mayelana nekhefu, kodwa idatha izolethwa kuze kufike inkinga), ukuthi iziqinisekiso kuMTProto uqobo - azikho iziqinisekiso. Iseva ingalahlekelwa kalula noma ilahle umlayezo wakho, futhi akukho okungenziwa ngakho, sebenzisa nje izinhlobo ezahlukene zezinduku.

Futhi okokuqala - olayini bemiyalezo. Nokho, ngento eyodwa yonke into yayisobala kusukela ekuqaleni - umlayezo ongaqinisekisiwe kufanele ugcinwe futhi ucasuke. Futhi ngemva kwasiphi isikhathi? Futhi umhlengi uyamazi. Mhlawumbe leyo miyalezo yenkonzo eluthayo ixazulula le nkinga ngandlela thile ngezinduku, yithi, ku-Telegraph Desktop kunemigqa emi-4 ehambelana nayo (mhlawumbe ngaphezulu, njengoba sekushiwo, kulokhu udinga ukujula ngekhodi yayo kanye nezakhiwo ngokujulile; ngasikhathi sinye. isikhathi, thina Siyazi ukuthi ngeke kuthathwe njengesampula; inombolo ethile yezinhlobo ezisuka kuhlelo lwe-MTProto azisetshenziswa kulo).

Kungani lokhu kwenzeka? Mhlawumbe, abahleli bezinhlelo zeseva abakwazanga ukuqinisekisa ukwethembeka ngaphakathi kweqoqo, noma ngisho nokubhafa kusilinganisi esingaphambili, futhi badlulisela le nkinga kuklayenti. Ngenxa yokuphelelwa ithemba, uVasily uzame ukusebenzisa enye inketho, enemigqa emibili kuphela, esebenzisa ama-algorithms avela ku-TCP - ukulinganisa i-RTT kuseva nokulungisa usayizi "wefasitela" (emilayezweni) kuye ngenani lezicelo ezingaqinisekisiwe. Okusho ukuthi, i-heuristic enzima kangaka yokuhlola umthwalo weseva ukuthi zingaki izicelo zethu engazihlafuna ngesikhathi esifanayo futhi ingalahlekelwa.

Awu, okungukuthi, uyaqonda, akunjalo? Uma kufanele usebenzise i-TCP futhi phezu kwephrothokholi egijima phezu kwe-TCP, lokhu kubonisa umthetho olandelwayo oklanywe kabi kakhulu.

Oh yebo, kungani udinga ulayini ongaphezu kowodwa, futhi kusho ukuthini lokhu kumuntu osebenza nge-API yezinga eliphezulu noma kunjalo? Bheka, wenza isicelo, usihlele kabusha, kodwa ngokuvamile awukwazi ukusithumela ngokushesha. Kungani? Ngoba impendulo izoba msg_id, okwesikhashanaаNgiyilebula, isabelo saso esihlehliswa kahle kuze kube sekwephuzile ngangokunokwenzeka - uma kwenzeka iseva ikwenqaba ngenxa yokungafani kwesikhathi phakathi kwethu naye (Yebo, singenza intonga eshintsha isikhathi sethu kusukela okwamanje. kuseva ngokwengeza i-delta ebalwa kusukela ezimpendulweni zeseva - amaklayenti asemthethweni enza lokhu, kodwa aluhlaza futhi akulungile ngenxa yokubhafa). Ngakho-ke, lapho wenza isicelo ngocingo lomsebenzi wendawo oluvela kumtapo wolwazi, umlayezo udlula ezigabeni ezilandelayo:

  1. Ilele kulayini owodwa futhi ilindele ukubethelwa.
  2. Kuqokiwe msg_id futhi umyalezo waya komunye ulayini - kungenzeka ukudlulisa; thumela kusokhethi.
  3. a) Iseva iphendule i-MsgsAck - umlayezo ulethiwe, siyawususa “komunye umugqa”.
    b) Noma ngokuphambene nalokho, wayengathandi okuthile, waphendula i-badmsg - thumela kabusha ukusuka "komunye umugqa"
    c) Akwaziwa lutho, umyalezo udinga ukucasuka komunye ulayini - kodwa akwaziwa kahle ukuthi nini.
  4. Iseva ekugcineni iphendule RpcResult - impendulo yangempela (noma iphutha) - hhayi nje ukulethwa, kodwa futhi kusetshenzwe.

Mhlawumbe, ukusetshenziswa kweziqukathi kungase kuyixazulule ingxenye yenkinga. Kulapho inqwaba yemilayezo ipakishwa kowodwa, futhi iseva iphendule ngesiqinisekiso kuyo yonke ngesikhathi esisodwa, ngesikhathi esisodwa. msg_id. Kodwa futhi uzolenqaba leli phakethe, uma kukhona okungahambanga kahle, lilonke.

Futhi ngalesi sikhathi ukucatshangelwa okungezona ezobuchwepheshe kuyangena. Ngokuhlangenwe nakho, sibone izinduku eziningi, futhi ngaphezu kwalokho, manje sizobona izibonelo eziningi zeseluleko esibi nezakhiwo - ezimweni ezinjalo, kufanelekile ukuthembela nokwenza izinqumo ezinjalo? Umbuzo uwu-rhetorical (akunjalo).

Sikhuluma ngani? Uma esihlokweni esithi "imilayezo yezidakamizwa mayelana nemilayezo" usengakwazi ukuqagela ngokuphikisa njengokuthi "uyisiphukuphuku, awuzange uqonde icebo lethu elihlakaniphile!" (ngakho-ke bhala imibhalo kuqala, njengoba kufanele abantu abavamile, ngokunengqondo kanye nezibonelo zokushintshisana kwamaphakethe, sizobe sesikhuluma), bese kuthi izikhathi/ukuphelelwa yisikhathi kuwumbuzo ongokoqobo noqondile, yonke into lapha yaziwa isikhathi eside. Amadokhumenti asitshelani mayelana nokuvala isikhathi?

Iseva ivamise ukuvuma ukwamukela umlayezo ovela kuklayenti (ngokuvamile, umbuzo we-RPC) isebenzisa impendulo ye-RPC. Uma impendulo ifika isikhathi eside, iseva ingase iqale ithumele ukwaziswa kwerisidi, futhi ngemva kwalokho, impendulo ye-RPC ngokwayo.

Iklayenti ngokuvamile liyakwamukela ukwamukela umlayezo ovela kuseva (imvamisa, impendulo ye-RPC) ngokwengeza ukuvuma embuzweni olandelayo we-RPC uma ungadluliswanga sekwephuzile kakhulu (uma ukhiqiziwe, yithi, imizuzwana engama-60-120 kulandela irisidi. yomlayezo ovela kuseva). Kodwa-ke, uma isikhathi eside singekho isizathu sokuthumela imilayezo kuseva noma uma kunenani elikhulu lemilayezo engaziwa evela kuseva (ithi, ngaphezu kwe-16), iklayenti lidlulisa ukuvuma okuzimele.

... Ngiyahumusha: thina ngokwethu asazi ukuthi sidinga malini nokuthi siyidinga kanjani, ngakho-ke ake sicabange ukuthi makube kanje.

Futhi mayelana nama-pings:

Imilayezo ye-Ping (PING/PONG)

ping#7abe77ec ping_id:long = Pong;

Impendulo ivamise ukubuyiselwa ekuxhumekeni okufanayo:

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

Le milayezo ayidingi ukuvunywa. I-pong idluliselwa kuphela ngokuphendula i-ping kuyilapho i-ping ingaqalwa nhlangothi zombili.

Ukuvalwa Kokuxhuma Okuhlehlisiwe + PING

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

Isebenza njenge-ping. Ngaphezu kwalokho, ngemva kokuba lokhu kwamukelwe, iseva iqala isibali-sikhathi esizovala uxhumano lwamanje disconnect_delay imizuzwana kamuva ngaphandle kwalapho sithola umlayezo omusha wohlobo olufanayo olusetha kabusha ngokuzenzakalelayo zonke izibali-sikhathi zangaphambilini. Uma iklayenti lithumela lawa ma-ping kanye njalo emizuzwaneni engu-60, isibonelo, ingasetha i-disconnect_delay ilingane namasekhondi angu-75.

Uyahlanya?! Emasekhondini angu-60, isitimela sizongena esiteshini, sehle futhi sithathe abagibeli, futhi siphinde silahlekelwe ukuxhumana emhubheni. Emasekhondini angu-120, ngenkathi uyizwa, izofika kwenye, futhi uxhumano cishe luzophuka. Yebo, kuyacaca ukuthi imilenze ivelaphi - "Ngizwe ukukhala, kodwa angazi ukuthi ikuphi", kukhona i-algorithm ye-Nagl kanye nenketho ye-TCP_NODELAY, ehloselwe umsebenzi wokusebenzisana. Kepha, ngiyaxolisa, bambelela enaluni layo elizenzakalelayo - 200 Milliimizuzwana Uma ngempela ufuna ukuveza okuthile okufanayo futhi ulondoloze emaphaketheni ambalwa angenzeka, bese uyibeka imizuzwana emi-5, noma ngabe "Umsebenzisi ubhala..." ukuphelelwa yisikhathi komlayezo manje. Kodwa akusenani.

Futhi ekugcineni, pings. Okungukuthi, ukuhlola ukuphila koxhumo lwe-TCP. Kuyahlekisa, kodwa cishe eminyakeni eyi-10 edlule ngabhala umbhalo obucayi mayelana nesithunywa se-dorm yobuhlakani bethu - ababhali lapho baphinde bakhipha iseva kuklayenti, hhayi ngokuphambene nalokho. Kodwa abafundi bonyaka wesi-3 bayinto eyodwa, kanti ihhovisi lamazwe ngamazwe lingenye, akunjalo?..

Okokuqala, uhlelo oluncane lwezemfundo. Ukuxhumeka kwe-TCP, uma kungekho ukushintshaniswa kwephakethe, kungaphila amasonto. Lokhu kuhle futhi kubi, kuye ngenjongo. Kuhle uma ubunoxhumano lwe-SSH oluvulekele kuseva, uvuke kukhompyutha, uqalise kabusha i-router, ubuyele endaweni yakho - iseshini ngale seva ayizange idatshulwe (awuzange uthayiphe lutho, bekungekho amaphakethe) , ilungile. Kubi uma kukhona izinkulungwane zamaklayenti kuseva, ngalinye lithatha izinsiza (sawubona, Postgres!), futhi umsingathi weklayenti kungenzeka ukuthi uqalise kabusha kudala - kodwa ngeke sazi ngakho.

Amasistimu engxoxo/e-IM awela esimweni sesibili ngesizathu esisodwa esengeziwe - izimo eziku-inthanethi. Uma umsebenzisi "ewa", udinga ukwazisa abaxoxisana naye ngalokhu. Uma kungenjalo, uzogcina unephutha elenziwe abadali be-Jabber (futhi balilungisa iminyaka engu-20) - umsebenzisi unqamukile, kodwa bayaqhubeka nokubhala imilayezo kuye, bekholelwa ukuthi uku-inthanethi (eyalahleka ngokuphelele kulezi. imizuzu embalwa ngaphambi kokuthi kutholakale ukunqanyulwa). Cha, inketho ye-TCP_KEEPALIVE, abantu abaningi abangaqondi ukuthi izibali sikhathi ze-TCP zisebenza kanjani baziphonse ngokungahleliwe (ngokusetha amanani asendle njengamashumi amasekhondi), ngeke kusize lapha - udinga ukwenza isiqiniseko sokuthi hhayi i-OS kernel kuphela. yomshini womsebenzisi iyaphila, kodwa futhi isebenza ngokujwayelekile, ekukwazini ukuphendula, kanye nohlelo lokusebenza ngokwalo (ingabe ucabanga ukuthi ayikwazi ukuqanda? Ideskithophu yeTelegramu eku-Ubuntu 18.04 ingibeke iqhwa ngaphezu kwesisodwa).

Yingakho kufanele u-ping isifiso iklayenti, futhi hhayi ngokuphambene nalokho - uma iklayenti lenza lokhu, uma uxhumano luphukile, i-ping ngeke ihanjiswe, umgomo ngeke ufezwe.

Yini esiyibona kuTelegram? Kuphambene impela! Hhayi-ke, kunjalo. Ngokusemthethweni, kunjalo, izinhlangothi zombili zingakwazi ukucula. Empeleni, amaklayenti asebenzisa udondolo ping_delay_disconnect, osetha isibali sikhathi kuseva. Hhayi-ke, ngiyaxolisa, akukhona kwiklayenti ukuthi linqume ukuthi lifuna ukuhlala isikhathi esingakanani lapho ngaphandle kwe-ping. Iseva, ngokusekelwe emthwalweni wayo, yazi kangcono. Kodwa-ke, uma unganaki izinsiza, khona-ke uzoba uPinocchio wakho omubi, futhi udondolo luzokwenza...

Kwakufanele iklanywe kanjani?

Ngikholelwa ukuthi amaqiniso angenhla abonisa ngokucacile ukuthi ithimba leTelegram / VKontakte alikwazi kakhulu emkhakheni wezokuthutha (naphansi) izinga lamanethiwekhi wekhompyutha kanye neziqu zabo eziphansi ezindabeni ezifanele.

Kungani kwavela ukuthi kuyinkimbinkimbi kangaka, futhi abaklami beTelegram bangazama kanjani ukuphikisa? Iqiniso lokuthi bazame ukwenza iseshini esinda ekuqhekekeni kokuxhumeka kwe-TCP, okungukuthi, lokho okungalethwanga manje, sizokuletha kamuva. Cishe futhi bazama ukwenza i-UDP ezokuthutha, kodwa bahlangabezana nobunzima futhi bayishiya (yingakho imibhalo ingenalutho - kwakungekho lutho lokuziqhayisa). Kodwa ngenxa yokuntula ukuqonda ukuthi amanethiwekhi ngokuvamile kanye ne-TCP asebenza kanjani ikakhulukazi, lapho ungathembela khona, nalapho udinga ukukwenza ngokwakho (nokuthi kanjani), kanye nomzamo wokuhlanganisa lokhu nge-cryptography "izinyoni ezimbili nge itshe elilodwa”, lokhu kungumphumela.

Kwakudingeka kanjani? Ngokusekelwe eqinisweni lokuthi msg_id iyisitembu sesikhathi esidingekayo endaweni yokubuka ye-cryptographic ukuze kuvinjelwe ukuhlaselwa kokudlalwa kabusha, kuyiphutha ukunamathisela umsebenzi wesikhombi ohlukile kuso. Ngakho-ke, ngaphandle kokushintsha ngokuyisisekelo ukwakheka kwamanje (uma kukhiqizwa ukusakazwa kwe-Updates, leso isihloko se-API sezinga eliphezulu senye ingxenye yalolu chungechunge lokuthunyelwe), umuntu uzodinga:

  1. Iseva ebambe uxhumano lwe-TCP kuklayenti ithwala isibopho - uma ifunde kusokhethi, sicela uvume, ucubungule noma ubuyisele iphutha, akukho ukulahlekelwa. Khona-ke ukuqinisekiswa akuyona i-vector yama-id, kodwa umane nje “i-seq_no yokugcina eyamukelwe” - inombolo nje, njengaku-TCP (izinombolo ezimbili - i-seq yakho kanye neqinisekisiwe). Sihlala singaphakathi kweseshini, akunjalo?
  2. Isitembu sesikhathi sokuvimbela ukuhlaselwa kwe-replay siba inkambu ehlukile, i-la nonce. Iyahlolwa, kodwa ayithinti enye into. Kwanele futhi uint32 - uma usawoti wethu ushintsha okungenani njalo ngesigamu sosuku, singakwazi ukwaba amabhithi angu-16 kumabhithi e-oda eliphansi yengxenye ephelele yesikhathi samanje, okusele - engxenyeni yesekhondi (njengamanje).
  3. Kususiwe msg_id nhlobo - ngokombono wokuhlukanisa izicelo kuma-backends, kukhona, okokuqala, i-id yeklayenti, futhi okwesibili, i-id yeseshini, ihlanganisa nabo. Ngakho-ke, into eyodwa kuphela eyanele njengesihlonzi sesicelo seq_no.

Lokhu futhi akuyona inketho ephumelele kakhulu; okungahleliwe okuphelele kungasebenza njengesihlonzi - lokhu sekuvele kwenziwa ku-API yezinga eliphezulu lapho kuthunyelwa umlayezo, ngendlela. Kungaba ngcono ukwenza kabusha ngokuphelele ukwakheka kusuka esihlotsheni kuya kokuphelele, kepha lesi isihloko senye ingxenye, hhayi lokhu okuthunyelwe.

I-API?

Ta-daam! Ngakho-ke, ngemva kokuzabalaza endleleni egcwele izinhlungu nezinduku, ekugcineni sakwazi ukuthumela noma yiziphi izicelo kuseva futhi sathola noma yiziphi izimpendulo kubo, futhi sathola nezibuyekezo ezivela kuseva (hhayi ngempendulo yesicelo, kodwa yona ngokwayo. usithumela, njengo-PUSH, uma kukhona okucaca ngaleyo ndlela).

Qaphela, manje kuzoba nesibonelo kuphela kuPerl esihlokweni! (kulabo abangayijwayele i-syntax, impikiswano yokuqala ethi busisa isakhiwo sedatha yento, eyesibili isigaba sayo):

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

Yebo, hhayi ukona ngamabomu - uma ungakayifundi, qhubeka ukwenze!

Oh, wai~~... kubukeka kanjani lokhu? Okuthile okujwayeleke kakhulu... mhlawumbe lesi yisakhiwo sedatha ye-Web API ejwayelekile ku-JSON, ngaphandle kokuthi amakilasi nawo anamathiselwe ezintweni?..

Ngakho-ke kwenzeka kanjani lokhu... Kuyini konke, bakwethu?.. Umzamo omkhulu - futhi sayeka ukuphumula lapho abahleli beWebhu eqala nje?...Ngabe i-JSON ngaphezu kwe-HTTPS ngeke ibe lula?! Sitholeni ngokuhwebelana? Ingabe lowo mzamo wawufanele?

Ake sihlole ukuthi i-TL+MTroto isinike ini nokuthi yiziphi ezinye izindlela ezingenzeka. Hhayi-ke, i-HTTP, egxile kumodeli yempendulo yesicelo, ayilungile, kodwa okungenani kukhona okungaphezulu kwe-TLS?

Ukucutshungulwa kochungechunge. Ngokubona lesi sakhiwo sedatha, esifana ne-JSON, ngikhumbula ukuthi kukhona izinguqulo zayo kanambambili. Masimake i-MsgPack njengenganwebeki ngokwanele, kepha kukhona, ngokwesibonelo, i-CBOR - ngendlela, indinganiso echazwe ku- RFC 7049. Kuyaphawuleka ukuthi iyachaza amathegi, njengendlela yokwandisa, naphakathi esezimisiwe iyatholakala:

  • 25 + 256 - esikhundleni semigqa ephindaphindiwe ngokubhekisela enambeni yomugqa, indlela yokucindezela eshibhile
  • 26 - Into ye-Perl ehleliwe enegama lekilasi kanye nezimpikiswano zomakhi
  • 27 - Into ehleliwe yolimi ezimele enegama lohlobo kanye nezimpikiswano zomakhi

Nokho, ngizamile ukwenza idatha efanayo ku-TL naku-CBOR ngentambo nokupakishwa kwento kunikwe amandla. Umphumela waqala ukuhluka uvuna i-CBOR kwenye indawo ukusuka ku-megabyte:

cborlen=1039673 tl_len=1095092

Ngakho-ke, isiphetho: Kunamafomethi alula kakhulu angekho ngaphansi kwenkinga yokwehluleka kokuvumelanisa noma isihlonzi esingaziwa, esisebenza kahle ngokuqhathaniswa.

Ukusungulwa kokuxhumana okusheshayo. Lokhu kusho ukuthi i-RTT eyiziro ngemva kokuxhuma kabusha (lapho ukhiye usuvele ukhiqizwe kanye) - usebenza kusukela kumlayezo wokuqala we-MTProto, kodwa ngokubhukha okuthile - shaya usawoti ofanayo, iseshini ayiboli, njll. I-TLS isinika ini esikhundleni? Caphula ngesihloko:

Uma usebenzisa i-PFS ku-TLS, amathikithi eseshini ye-TLS (RFC 5077) ukuqalisa kabusha iseshini ebethelwe ngaphandle kokhiye bokuphinda baxoxisane futhi ngaphandle kokugcina ulwazi olubalulekile kuseva. Lapho ivula uxhumano lokuqala futhi idala okhiye, iseva ibhala ngemfihlo isimo sokuxhuma futhi isidlulisele kuklayenti (ngendlela yethikithi leseshini). Ngokufanelekile, lapho uxhumano luqalwa kabusha, iklayenti lithumela ithikithi leseshini, kuhlanganise nokhiye weseshini, emuva kuseva. Ithikithi ngokwalo libethelwe ngokhiye wesikhashana (ukhiye wethikithi lesikhathi), ogcinwa kuseva futhi kufanele sisatshalaliswe phakathi kwazo zonke iziphakeli ezingaphambili ezicubungula i-SSL kuzixazululo ezihlanganisiwe.[10]. Ngakho, ukwethulwa kwethikithi leseshini kungase kwephule i-PFS uma okhiye beseva yesikhashana besengozini, isibonelo, uma begcinwe isikhathi eside (OpenSSL, nginx, Apache bagcine ngokuzenzakalelayo kuso sonke isikhathi sohlelo; amasayithi adumile asetshenziswa. ukhiye amahora ambalwa, kuze kube yizinsuku).

Lapha i-RTT ayiyona i-zero, udinga ukushintshanisa okungenani i-ClientHello ne-ServerHello, ngemva kwalokho iklayenti lingathumela idatha kanye ne-Finished. Kodwa lapha kufanele sikhumbule ukuthi asinayo iWebhu, nenqwaba yokuxhumana esanda kuvulwa, kodwa isithunywa, ukuxhumana kwaso kuvame ukuba yisicelo esisodwa noma esingaphansi, esifushane kakhulu kumakhasi eWebhu - yonke into iphindwe kabili. ngaphakathi. Okusho ukuthi, kwamukelekile uma singazange sihlangabezane nesigaba sesitimela esingaphansi esibi ngempela.

Ukhohlwe okunye? Bhala emazwaneni.

Kuzoqhutshwa!

Engxenyeni yesibili yalolu chungechunge lokuthunyelwe ngeke sicabangele izinkinga zobuchwepheshe, kodwa zenhlangano - izindlela, imibono, i-interface, isimo sengqondo ngabasebenzisi, njll. Ngokusekelwe, nokho, olwazini lobuchwepheshe obethulwe lapha.

Ingxenye yesithathu izoqhubeka nokuhlaziya ingxenye yobuchwepheshe/isipiliyoni sokuthuthukisa. Uzofunda, ikakhulukazi:

  • ukuqhubeka kwe-pandemonium ngezinhlobonhlobo zezinhlobo ze-TL
  • izinto ezingaziwa mayelana neziteshi namaqembu amakhulu
  • kungani izingxoxo zizimbi kunohlu
  • mayelana nokungaphelele uma kuqhathaniswa nomlayezo ohlobene
  • uyini umehluko phakathi kwesithombe nesithombe
  • ukuthi i-emoji iphazamisa kanjani umbhalo we-ithalikhi

nezinye izinduku! Hlala ubukele!

Source: www.habr.com

Engeza amazwana