Dhaleeceynta hab-maamuuska iyo hababka urureed ee Telegram. Qaybta 1, farsamo: waayo-aragnimo qoraal macmiil ka soo xoq - TL, MT

Dhawaan, qoraallada ku saabsan sida uu u wanaagsan yahay Telegram, sida quruxda badan iyo khibradda walaalaha Durov ay u leeyihiin dhismaha nidaamyada shabakadaha, iwm. waxay bilaabeen inay marar badan ka soo muuqdaan Habré. Isla mar ahaantaana, dad aad u tiro yar ayaa runtii isku dhex milmay aaladda farsamada - ugu badnaan, waxay adeegsadaan wax fudud oo fudud (oo aad uga duwan MTProto) JSON-based Bot API, oo badanaaba waa aqbalaan. xagga iimaanka dhammaan ammaanta iyo PR ee ku wareegsan rasuulku. Ku dhawaad ​​hal sano iyo badh ka hor, saaxiibkay oo ka tirsan NGO-ga Eshelon Vasily (nasiib darro, akoonkiisa Habré ayaa la tirtiray iyada oo ay la socoto qabyo qoraalka) wuxuu bilaabay inuu qoro macmiilkiisa Telegram isaga oo xoq ah Perl, ka dibna qoraaga khadadkan ayaa ku biiray. Waa maxay sababta Perl, qaar ayaa isla markiiba weydiin doona? Sababtoo ah mashaariicda noocan oo kale ah ayaa horeyba ugu jiray luqado kale, runtii, tani maahan meesha, waxaa jiri kara luqad kale oo aan jirin. maktabad diyaarsan, sidaas awgeedna qoraagu waa inuu jidka oo dhan maraa xoq. Intaa waxaa dheer, cryptography waa arrin la aamini karo, laakiin hubi. Alaabada loogu talagalay amniga, si fudud kuma hallayn kartid maktabad diyaar ah oo ka timid soo saaraha oo si indho la'aan ah u aamini kartid (si kastaba ha ahaatee, tani waa mawduuc qaybta labaad). Waqtigan xaadirka ah, maktabaddu waxay si fiican u shaqeysaa heerka "celcelis ahaan" (wuxuu kuu ogolaanayaa inaad sameyso codsi kasta oo API ah).

Si kastaba ha ahaatee, ma jiri doonto wax badan oo qarsoodi ah ama xisaab qoraalladan taxanaha ah. Laakiin waxaa jiri doona tafaasiil farsamo oo kale oo badan iyo muraayadaha dhismaha (sidoo kale faa'iido u leh kuwa aan wax ka qorin xoqin, laakiin waxay isticmaali doonaan maktabadda luqad kasta). Markaa, yoolka ugu weyn wuxuu ahaa in la isku dayo in la hirgeliyo macmiilka meel eber ah sida ku cad dukumentiyada rasmiga ah. Taasi waa, aynu u qaadanno in koodhka isha ee macaamiisha rasmiga ah uu xiran yahay (mar kale, qaybta labaad waxaan si faahfaahsan uga hadli doonaa mawduuca xaqiiqda ah in tani ay run tahay. way dhacdaa sidaas), laakiin, sidii waagii hore, tusaale ahaan, waxaa jira halbeeg sida RFC - suurtagal ma tahay in la qoro macmiilka si waafaqsan qeexitaanka oo keliya, "adiga oo aan fiirin" koodhka isha, ha ahaado mid rasmi ah (Telegram Desktop, moobayl), ama Telethon aan rasmi ahayn?

Shaxda tusmada:

Dukumeenti... way jirtaa, sax? ma runbaa?..

Qaybaha qoraallada ee maqaalkan ayaa la bilaabay in la ururiyo xagaagii hore. Waqtigaan oo dhan bogga rasmiga ah https://core.telegram.org Dukumeentigu wuxuu ahaa lakabka 23, i.e. meel ku xayiran 2014 (xusuusnow, ma jirin xitaa kanaalo waagaas?). Dabcan, aragti ahaan, tani waa inay noo ogolaato inaan hirgelinno macmiil leh shaqeyn wakhtigaas 2014. Laakiin xitaa xaaladdan, dukumeentiyadu waxay ahaayeen, marka hore, aan dhammaystirnayn, marka labaadna, meelaha ay iska soo horjeedaan. In ka badan hal bil ka hor, Sebtembar 2019, waxay ahayd shil ahaan Waxaa la ogaaday in uu jiro cusbooneysiin weyn oo ku saabsan dukumeentiyada goobta, oo loogu talagalay lakabka 105 ee ugu dambeeyay, iyada oo qoraal ah in hadda wax walba loo baahan yahay in mar kale la akhriyo. Runtii, maqaallo badan ayaa dib loo eegay, laakiin qaar badan ayaa isbeddelay. Sidaa darteed, markaad akhrinayso dhaleeceynta hoose ee ku saabsan dukumentiga, waa inaad maskaxda ku haysaa in qaar ka mid ah waxyaalahan aysan hadda khusayn, laakiin qaar wali waa sax. Ka dib oo dhan, 5 sano ee dunida casriga ah ma aha oo kaliya waqti dheer, laakiin aad u badan oo ah. Tan iyo wakhtiyadaas (gaar ahaan haddii aanad xisaabta ku darin goobaha geochat ee la tuuray iyo dib loo soo nooleeyay tan iyo markaas), tirada hababka API ee nidaamka ayaa ka koray boqol ilaa in ka badan laba boqol iyo konton!

Halkee laga bilaabo qoraaga da'da yar?

Dhib ma laha haddii aad wax ka soo qorto xoq ama aad isticmaasho, tusaale ahaan, maktabado diyaarsan sida Telethon ee Python ama Madeline loogu talagalay PHP, xaalad kasta, waxaad u baahan doontaa marka hore diiwaan geli codsigaaga - hel qiyaasaha api_id и api_hash (kuwa la soo shaqeeyay VKontakte API isla markiiba way fahmaan) kaas oo serverku ku aqoonsan doono codsiga. Tani waa inay u samee sababo sharci dartood, laakiin waxaan ka hadli doonaa wax badan oo ku saabsan sababta qorayaasha maktabaddu aysan u daabici karin qaybta labaad. Waxaa laga yaabaa inaad ku qanacsan tahay qiyamka imtixaanka, inkastoo ay aad u xaddidan yihiin - xaqiiqadu waxay tahay in hadda aad isdiiwaangelin karto hal kaliya App-ka, markaa madaxa ha ku degdegin.

Hadda, marka laga eego dhinaca farsamada, waa in aan xiisaynno xaqiiqda ah in diiwaangelinta ka dib aan helno ogeysiisyada Telegram ee ku saabsan cusbooneysiinta dukumentiyada, borotokoolka, iwm. Taasi waa, qofku wuxuu u qaadan karaa in goobta leh maraakiibta si fudud looga tagay oo sii waday inay si gaar ah ula shaqeyso kuwa bilaabay inay sameeyaan macaamiisha, sababtoo ah way fududahay. Laakiin maya, wax la mid ah lama arag, warna ma iman.

Oo haddii aad wax ka qorto xoqan, markaa isticmaalka xuduudaha la helay ayaa dhab ahaantii weli fogaanaya. Inkastoo https://core.telegram.org/ oo uga hadla iyaga Bilaabida ugu horrayn, run ahaantii, marka hore waa inaad dhaqan gelisaa MTProto borotokoolka - laakiin haddaad rumaysateen qaabaynta sida waafaqsan qaabka OSI dhamaadka bogga sharaxaadda guud ee borotokoolka, ka dibna gabi ahaanba waa wax aan waxba tarayn.

Dhab ahaantii, labadaba ka hor iyo ka dib MTProto, heerar kala duwan hal mar (sida shabakadaha ajnabiga ah ee ka shaqeeya kernel OS waxay yiraahdaan, jebinta lakabka), mawduuc weyn, xanuun iyo cabsi leh ayaa soo geli doona jidka ...

Taxane binary: TL (Nooca Luuqadda) iyo nidaamkeeda, iyo lakabyada, iyo erayo kale oo badan oo cabsi leh

Mawduucan, dhab ahaantii, waa furaha dhibaatooyinka Telegram. Oo waxaa jiri doona erayo badan oo cabsi leh haddii aad isku daydo inaad u dhex gasho.

Haddaba, waa kan jaantuska. Haddii eraygani maskaxdaada ku soo dhaco, waxaad tidhaahdaa. Qorshaha JSON, Si sax ah ayaad u fikirtay. Hadafku waa isku mid: luqadaha qaar si loo qeexo suurtogalnimada xogta la kala qaado. Waa halka ay isku ekaanshaha ku dhammaanayaan. Haddii laga bilaabo bogga MTProto borotokoolka, ama laga bilaabo geedka isha ee macmiilka rasmiga ah, waxaan isku dayi doonaa inaan furno qaar ka mid ah schema, waxaan arki doonaa wax sida:

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;

Qofka arka tan markii ugu horeysay wuxuu si macquul ah u awoodi doonaa inuu aqoonsado qayb ka mid ah waxa la qoray - si fiican, kuwani waa qaab-dhismeed muuqda (inkasta oo magaca magaca, bidixda ama midigta) ku yaal, waxaa jira beero. ka dib nooc ayaa daba socda xiidanka ... malaha. Halkan xagalka xagasha waxaa laga yaabaa inay jiraan qaabab sida C++ (xaqiiqda, ma aha arrin). Oo maxay ka dhigan yihiin dhammaan calaamadaha kale, calaamadaha su'aalaha, calaamadaha yaabka, boqolleyda, xashiishku (oo sida cad waxay ula jeedaan waxyaabo kala duwan meelo kala duwan), mar waxay joogaan mararka qaarkoodna, tirooyinka hexadecimal - iyo tan ugu muhiimsan, sida looga helo tan. sax (oo aan la diidi doonin server-ku) qulqulka byte? Waa inaad akhridaa dukumeentiga (Haa, waxa jira xidhiidho la xidhiidha schema nooca JSON ee u dhow - laakiin taasi wax cad kama dhigayso).

Fur bogga Taxane Xogta Binary oo u quuso dunida sixirka ee boqoshaada iyo xisaabta kala duwan, wax la mid ah mataan sanadka 4aad. Alifbeetada, nooca, qiimaha, isku-dariyaha, isku-dhafka shaqeeya, qaabka caadiga ah, nooca isku-dhafka ah, nooca polymorphic... waana intaas oo keliya bogga koowaad! Marka xigta adiga ayaa ku sugaya Luuqadda TL, taas oo, in kasta oo ay hore uga koobnayd tusaale codsi iyo jawaab-celin yar, aan haba yaraatee wax jawaab ah ka bixinin kiisas badan oo caadi ah, taas oo macnaheedu yahay in aad ku qasban tahay inaad dib-u-eegis ku sameyso xisaab laga soo tarjumay Ruush oo Ingiriisi ah siddeed kale oo gundhig ah. bogag!

Akhristayaasha aqoon u leh luqadaha shaqada iyo nooca tooska ah, dabcan, waxay arki doonaan luqadda sharaxaadda luqaddan, xitaa tusaale ahaan, sida badan oo la yaqaan, waxayna dhihi karaan tani dhab ahaantii maaha mid xun. Waxyaabaha lagu diidan yahay waa:

  • haa, ujeedada way fiicantahay, laakiin hoogay, iyadu aan la gaarin
  • Waxbarashada jaamacadaha Ruushku way kala duwan yihiin xitaa kuwa IT-ga - qof kastaa ma qaadan koorsada u dhiganta
  • Ugu dambeyntii, sida aan arki doono, ficil ahaan waa aan loo baahnayn, maadaama qayb yar oo xaddidan oo xitaa TL ah oo lagu tilmaamay la isticmaalo

Sida la sheegay LeoNerd kanaalka #perl gudaha Shabakadda FreeNode IRC, kuwaas oo isku dayay in ay ka hirgeliyaan irid laga soo bilaabo Telegram ilaa Matrix (tarjumaadda xigashada waa khalad xagga xusuusta):

Waxay dareemeysaa in qof lagu soo bandhigay nooca aragtida markii ugu horeysay, uu ku farxay, oo bilaabay inuu isku dayo inuu la ciyaaro, oo aan runtii daneynin haddii loo baahan yahay ficil ahaan.

Naftaada u fiirso, haddii baahida loo qabo noocyada qaawan (int, dheer, iwm.) sida wax dugsi hoose ah ma keenayso su'aalo - ugu dambeyntii waa in lagu hirgeliyaa gacanta - tusaale ahaan, aan isku dayno inaan ka soo qaadanno iyaga. vector. Taasi waa, dhab ahaantii, array, haddii aad ugu yeedho waxyaalaha ka dhashay magacyadooda saxda ah.

Laakiin ka hor

Sharaxaad gaaban oo ku saabsan qayb-hoosaadyada TL syntax ee kuwa aan akhriyin dukumeentiga rasmiga ah

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;

Qeexitaanku mar walba wuu bilaabmaa dhise, ka dib taas oo ikhtiyaari ah (dhaqan ahaan - had iyo jeer) iyada oo loo marayo calaamadda # waa in ay noqdaan CRC32 laga soo bilaabo xarafka sharraxaadda caadiga ah ee noocaan ah. Marka xigta waxay timaaddaa sharaxaadda beeraha, haddii ay jiraan, nooca wuxuu noqon karaa madhan. Dhammaan tani waxay ku dhammaanaysaa calaamad siman, magaca nooca uu ka mid yahay wax-dhisaha - taas oo ah, dhab ahaantii, nooca-hoosaadka - ayaa iska leh. Ninka midig ee calaamadda siman waa polymorphic - taasi waa, dhowr nooc oo gaar ah ayaa u dhigmi kara.

Haddii qeexitaanku dhaco khadka ka dib ---functions---, ka dibna syntax ayaa ahaan doona mid isku mid ah, laakiin macnuhu wuu ka duwanaan doonaa: dhisuhu wuxuu noqonayaa magaca shaqada RPC, beeruhu waxay noqonayaan qiyaaso (si fiican, taas oo ah, waxay ahaan doontaa mid la mid ah qaabka la bixiyay, sida hoos lagu sharaxay , tani waxay si fudud u noqon doontaa macnaha loo qoondeeyay), iyo "nooca polymorphic" - nooca natiijada la soo celiyay. Run, waxay weli ahaan doontaa polymorphic - kaliya ayaa lagu qeexay qaybta ---types---, laakiin dhismahan "lama tixgelin doono". Ku-kordhinta noocyada shaqooyinka loo yaqaan doodahooda, i.e. Sababaha qaarkood, dhowr hawlood oo isku magac ah laakiin saxiixyo kala duwan leh, sida C++, laguma bixiyo TL.

Waa maxay sababta "dhisaha" iyo "polymorphic" haddii aysan ahayn OOP? Hagaag, dhab ahaantii, way u fududaan doontaa qof inuu ka fikiro tan OOP - nooca polymorphic sida fasalka aan la taaban karin, iyo dhisayaashu waa fasaladiisa tooska ah, iyo final marka la eego erey bixinta tiro afaf ah. Dhab ahaantii, dabcan, halkan kaliya isu ekaanshaha oo leh habab dhiska dhabta ah oo xad dhaaf ah oo ku qoran luqadaha barnaamijka ee OO. Maaddaama halkan ay yihiin qaababka xogta kaliya, ma jiraan habab (in kasta oo sharaxaad ka mid ah shaqooyinka iyo hababka dheeraadka ah ay awood u leeyihiin inay abuuraan jahawareer madaxa inay jiraan, laakiin taasi waa arrin ka duwan) - waxaad u maleyn kartaa dhise sida qiimaha ka yimid. kaas waa la dhisayaa ku qor markaad akhrinayso qulqulka byte.

Sidee tani u dhacdaa? Deserializer-ka, oo had iyo jeer akhriya 4 bytes, wuxuu arkayaa qiimaha 0xcrc32 - oo fahmaya waxa dhici doona xiga field1 nooc leh int, i.e. si sax ah ayuu u akhriyaa 4 bytes, taas oo ku taal goobta dusha sare leh ee nooca PolymorType akhri. arkaa 0x2crc32 oo fahamsan in ay jiraan laba beerood oo dheeraad ah, marka hore long, taasoo ka dhigan inaan akhrinay 8 bytes. Ka dibna mar kale nooc kakan, kaas oo la deserialized si la mid ah. Tusaale ahaan, Type3 waxaa lagu dhawaaqi karaa wareegga isla marka laba dhisme, siday u kala horreeyaan, markaas waa inay kulmaan midkood 0x12abcd34, ka dib markaa waxaad u baahan tahay inaad akhrido 4 bayt oo kale int, ama 0x6789cdef, ka dib markaa waxba ma jiri doonaan. Wax kasta oo kale - waxaad u baahan tahay inaad tuurto ka reeban. Si kastaba ha ahaatee, tan ka dib waxaan ku laabaneynaa akhrinta 4 bytes int beeraha field_c в constructorTwo intaas ayaanu akhrinaynaa PolymorType.

Ugu dambeyntii, haddii lagu qabto 0xdeadcrc si ay u constructorThree, markaas wax walba way sii adkaanayaan. Beerteena kowaad waa bit_flags_of_what_really_present nooc leh # - Dhab ahaantii, tani waa magac u eg nooca nat, oo macnaheedu yahay "lambarka dabiiciga ah". Taasi waa, dhab ahaantii, int aan saxeexin waa, habka, kiiska kaliya ee marka lambarrada aan saxeexin ay ku dhacaan wareegyada dhabta ah. Marka, soo socda waa dhismo leh calaamad su'aal, taasoo la macno ah in goobtan - waxay ku jiri doontaa siliga kaliya haddii qaybta u dhiganta lagu dhejiyo goobta loo tixraaco (qiyaastii sida hawlwadeenka ternary). Haddaba, aan ka soo qaadno in waxoogaa la dhigay, taas oo macnaheedu yahay in aan u baahannahay inaan sii akhrinno goob la mid ah Type, kaas oo tusaalaheenna leh 2 dhisme. Mid waa madhan (wuxuu ka kooban yahay kaliya aqoonsiga), kan kalena wuxuu leeyahay beer ids nooc leh ids:Vector<long>.

Waxaa laga yaabaa inaad u malaynayso in labada hab-raac iyo guud ahaanba ay ku jiraan faa'iidooyinka ama Java. Laakiin maya. Ku dhawaad Tani kaliya kiiska isticmaalka xagalka xagasha ee wareegyada dhabta ah, waxaana loo isticmaalaa oo keliya Vector. In durdur byte ah, kuwanu waxay noqonayaan 4 CRC32 bytes ee nooca Vector laftiisa, had iyo jeer waa isku mid, ka dibna 4 bytes - tirada array curiyayaasha, ka dibna kuwan laftooda.

Ku darso xaqiiqda ah in taxanayaashu ay had iyo jeer ku dhacaan erayada 4 bytes, dhammaan noocyada kala duwan ayaa ka mid ah - noocyada la dhisay ayaa sidoo kale lagu tilmaamay. bytes и string iyada oo la raacayo taxanaha gacanta ee dhererka iyo toosintan 4 - si fiican, waxay u egtahay mid caadi ah oo xitaa wax ku ool ah? In kasta oo TL la sheeganayo inay tahay taxanayaal laba-geesood ah oo wax ku ool ah, iyaga oo jahannamo leh, iyada oo la ballaarinayo wax kasta, xitaa qiyamka Boolean iyo xargaha hal-abuurka ah ee 4 bytes, JSON wali miyay sii dhumuc weyn tahay? Fiiri, xitaa meelaha aan loo baahnayn waxaa lagu boodi karaa calammo yaryar, wax walbaa aad bay u wanaagsan yihiin, oo xitaa mustaqbalka la dheerayn karaa, markaa maxaad u raacin weyday dhisaha goobo cusub oo ikhtiyaari ah?

Laakiin maya, haddii aadan akhrin sharraxaaddayda gaaban, laakiin dukumentiga buuxa, oo ka feker hirgelinta. Marka hore, CRC32 ee dhisaha waxaa loo xisaabiyaa iyadoo loo eegayo xariiqda caadiga ah ee sharraxaadda qoraalka ee nidaamka (ka saar meel bannaan oo dheeri ah, iwm.) - markaa haddii goob cusub lagu daro, khadka tilmaanta nooca ayaa isbedeli doona, oo markaa CRC32 iyo , sidaas darteed, taxane ah. Oo muxuu samayn lahaa macmiilkii hore haddii uu helo garoon calamo cusub leh, oo aanu garanayn waxa uu ku sameeyo marka xigta?

Marka labaad, aan xasuusano CRC32, oo halkan loo isticmaalo asal ahaan sida hawlaha xashiishka si gaar ah loo go'aamiyo nooca la samaynayo (de) taxane ah. Halkan waxaan la kulannaa dhibaatada isku dhaca - oo maya, itimaalka maaha mid ka mid ah 232, laakiin aad u weyn. Yaa xusuustay in CRC32 loogu talagalay in lagu ogaado (iyo saxo) khaladaadka kanaalka isgaarsiinta, oo sidaas awgeed u hagaajiyo guryahan waxyeellada kuwa kale? Tusaale ahaan, ma danayso dib u habeynta bytes: haddii aad ka xisaabiso CRC32 laba sadar, ilbiriqsiyeedka waxaad ku beddeshaa 4ta bytes ee ugu horreeya 4ta bytes ee soo socda - waxay ahaan doontaa isku mid. Marka fikradaheenu ay tahay xarafka qoraalka ee alifbeetada Laatiinka ah (iyo xarakayn yar), oo magacyadani aanay si gaar ah u rankhsin, suurtogalnimada dib-u-habaynta noocan oo kale ah aad ayay u kordhaysaa.

By the way, yaa hubiyay waxa meesha yaal? runtii CRC32? Mid ka mid ah furayaasha isha hore (xitaa ka hor Waltman) wuxuu lahaa shaqo xashiish ah oo ku dhufatay xaraf kasta lambarka 239, oo ay dadkani jecel yihiin, ha ha!

Ugu dambeyntii, okay, waxaan ogaanay in dhisayaasha leh nooca goobta Vector<int> и Vector<PolymorType> waxay yeelan doontaa kala duwan CRC32. Ka warran waxqabadka khadka tooska ah? Iyo dhinaca aragtida, Tani ma waxay noqotaa qayb ka mid ah nooca? Aynu nidhaahno waxaynu ka gudubnay tiro toban kun ah oo tirooyin ah, si fiicanna u leh Vector<int> wax walba waa cad yihiin, dhererka iyo 40000 oo bytes kale. Ka warran haddii tani Vector<Type2>, kaas oo ka kooban hal beer oo kaliya int oo keligiis ayay ku jirtaa nooca - ma waxaan u baahanahay inaan ku celino 10000xabcdef0 34 jeer ka dibna 4 bytes int, ama afku wuu awoodaa inuu nooga madax-bannaanaado dhisaha fixedVec iyo halkii 80000 bytes, wareejinta mar kale kaliya 40000?

Tani ma aha su'aal aragti-darro ah haba-yaraatee- qiyaas in aad helayso liiska isticmaalayaasha kooxeed, kuwaas oo mid kastaa leeyahay aqoonsi, magac hore, magaca dambe - farqiga u dhexeeya qaddarka xogta lagu wareejiyay xidhiidhka moobaylka ayaa noqon kara mid muhiim ah. Waa sida saxda ah ee waxtarka taxanaha Telegram ka naloo xayaysiiyay.

Markaa…

Vector, kaas oo aan waligiis la sii dayn

Haddii aad isku daydo inaad dhex maro boggaga sharraxaadda isku-dariyeyaasha iyo wixii la mid ah, waxaad arki doontaa in vector (iyo xitaa matrix) uu si rasmi ah isku dayayo inuu soo saaro tuples dhowr xaashi ah. Laakiin aakhirka way iloobaan, tillaabadii ugu dambaysay waa laga boodaa, waxaana si fudud loo bixiyaa qeexidda vector, taas oo aan weli ku xidhnayn nooc. Maxaa jira? Luuqadaha barnaamijyada, gaar ahaan kuwa shaqeeya, waa wax caadi ah in qaab-dhismeedku si isdaba joog ah loo qeexo - isku-dubbarideeyaha qiimayntiisa caajiska ah ayaa fahmi doona oo wax walba laftiisa samayn doona. Luuqad ahaan xogta taxanaha ah waxa loo baahan yahay waa waxtar: waa ku filan tahay in si fudud loo qeexo liiska, i.e. qaab dhismeedka laba walxood - kan hore waa qayb xog ah, ka labaadna waa isla qaab-dhismeedka laftiisa ama meel bannaan oo dabada ah (xirmo (cons) ee Lisp). Laakiin tani waxay si cad u baahan doontaa mid kasta Cunsurka ayaa ku kharash gareeya 4 bytes dheeraad ah (CRC32 kiiska TL) si loo qeexo nooca. Soo diyaari si sahal ah ayaa loo sharxi karaa cabbir go'an, laakiin haddii ay dhacdo diyaarsan dherer aan la garanayn ka hor, waynu kala tagnaa.

Sidaa darteed, maadaama TL aysan ogolayn soo saarista vector, waxay ahayd in lagu daro dhinaca. Ugu dambeyntii dukumeentigu wuxuu leeyahay:

Serialization had iyo jeer waxay isticmaashaa dhisme isku mid ah "vector" (const 0x1cb5c415 = crc32 ("vector t:Type # [t] = Vector t") kaas oo aan ku xidhnayn qiimaha gaarka ah ee doorsoomiyaha nooca t.

Qiimaha halbeegga ikhtiyaariga ah t kuma lug yeesho taxanaha maadaama laga soo qaatay nooca natiijada (had iyo jeer la yaqaan ka hor inta aan la jarin).

Si fiican u fiirso: vector {t:Type} # [ t ] = Vector t - laakiin meelna ma jirto Qeexitaankan laftiisa ma odhanayo waa in tirada hore la mid tahay dhererka xididka! Oo meelna ugama iman. Tani waa wax la bixiyay oo u baahan in maskaxda lagu hayo oo lagu hirgeliyo gacmahaaga. Meel kale, dukumeentigu xitaa si daacad ah ayuu u sheegayaa in nooca uusan ahayn mid dhab ah:

Vector t polymorphic pseudotype waa "nooc" oo qiimihiisu yahay isku xigxiga qiyamka nooc kasta t, ha ahaato sanduuq ama qaawan.

... laakiin aan diiradda saarin. Markaad, daashay inaad ku dhex socoto fidinta xisaabta (laga yaabee xitaa inaad ku garanayso koorsada jaamacadeed), go'aanso inaad iska dayso oo aad dhab ahaantii eegto sida loola shaqeeyo si ficil ah, dareenka ku haray madaxaaga ayaa ah in tani ay tahay mid Halis ah. Xisaabta xudunta u ah, waxaa si cad u hindisay dadka Cool (laba xisaabyahan - ku guulaysta ACM), oo aan cidna ahayn. Hadafka - in la muujiyo - waa la gaaray.

By habka, ku saabsan tirada. Aan ku xasuusino taas # waa isku mid nat, nambarka dabiiciga ah:

Waxaa jira tibaaxo nooca (nooca-expr) iyo tibaaxaha tirada (nat-expr). Si kastaba ha ahaatee, si isku mid ah ayaa loo qeexay.

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

laakiin xagga naxwaha waxa lagu sifeeyay si la mid ah, i.e. Kala duwanaanshiyahan waa in mar kale la xusuustaa oo gacanta lagu geliyo.

Hagaag, haa, noocyada template (vector<int>, vector<User>) leeyihiin aqoonsi guud (#1cb5c415), i.e. haddii aad ogtahay in wacitaanka lagu dhawaaqay sida

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

markaa ma sugi doontid kaliya vector, laakiin ma sugi kartid isticmaalayaasha. Si sax ah, waa sug - code dhabta ah, element kasta, haddii aysan ahayn nooc qaawan, waxay yeelan doontaa dhisme, iyo habka wanaagsan ee hirgelinta waxay noqon doontaa lagama maarmaan in la hubiyo - laakiin si sax ah ayaa naloo soo diray qayb kasta oo ka mid ah vector this. noocaas ah? Maxaa dhacaya haddii ay ahayd nooc ka mid ah PHP, kaas oo diyaarsan ay ku jiri karaan noocyo kala duwan oo kala duwan?

Halkaa marka ay marayso waxaad bilaabaysaa inaad ka fikirto - TL caynkaas ah ma lagama maarmaan baa? Waxaa laga yaabaa in gaariga ay suurtogal tahay in la isticmaalo serializer aadanaha, isla borotobufkii hore u jiray markaa? Taasi waxay ahayd aragtida, aynu eegno ku dhaqanka.

Hirgelinta TL ee jira ee koodka

TL wuxuu ku dhashay qoto dheer ee VKontakte xitaa ka hor dhacdooyinka caanka ah ee iibinta saamiga Durov iyo (hubaal), xitaa ka hor inta aan la bilaabin horumarinta Telegram. Iyo il furan koodhka isha ee hirgelinta ugu horraysa Waxaad ka heli kartaa wax badan oo kalluun qosol leh. Oo luqadda lafteeda ayaa meeshaas si buuxda looga hirgeliyey si ka badan sida hadda Telegramka looga isticmaalo. Tusaale ahaan, xashiishka gabi ahaanba qorshaha laguma isticmaalo (macnaheedu waa qaab-dhismeed been abuur ah (sida vector) oo leh dabeecad qaloocan). Ama

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

laakiin aan ka fiirsno, dhammaystirka aawadood, si aan u raadraacno, si loo hadlo, horumarka Fikirka Weyn.

#define ZHUKOV_BYTES_HACK

#ifdef ZHUKOV_BYTES_HACK

/* dirty hack for Zhukov request */

Ama kan quruxda badan:

    static const char *reserved_words_polymorhic[] = {

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

      };

Jajabkani waxa uu ku saabsan yahay qaab-dhismeedka sida:

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

Tani waa qeexida qaab-dhismeedka hashmap-ka sida vector of int - Type pairs. Gudaha C++ waxay u ekaan doontaa sidan:

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

sidaas, alpha - ereyga muhiimka ah! Laakiin kaliya C ++ waxaad ku qori kartaa T, laakiin waa inaad qortaa alfa, beta ... Laakin wax ka badan 8 cabbir, waa meesha khiyaaligu ku dhamaanayo. Waxay u muuqataa in mar St. Petersburg ay wada-hadallo sidan oo kale ah ka dhaceen

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

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

Laakiin tani waxay ku saabsan tahay hirgelinta ugu horeysay ee la daabacay ee TL "guud ahaan". Aan u gudubno inaan tixgelinno hirgelinta macaamiisha Telegram laftooda.

Eray ku socda Vasily:

Vasily.
Natiijo ahaan, marka hore laga bilaabo pilot.jpg
Kadibna ka koodka dzhekichan.webp

Dabcan, dadka aqoonta u leh algorithms iyo xisaabta, waxaan filan karnaa inay akhriyeen Aho, Ullmann, oo ay yaqaaniin aaladaha noqday heerka dhabta ah ee warshadaha tobannaan sano ee qorista isku-dubaridyadooda DSL, sax?

By telegram-cli waa Vitaly Valtman, sida laga fahmi karo dhacdada qaabka TLO ee ka baxsan xudduudaheeda (cli), xubin ka mid ah kooxda - hadda maktabadda TL ayaa loo qoondeeyey. si gaar ah, waa maxay aragtida iyada Qiimaynta TL? ..

16.12 04:18 Vasily: Waxaan u malaynayaa in qof aanu aqoon lex+yacc
16.12 04:18 Vasily: Si kale uma sharaxi karo
16.12 04:18 Vasily: waa hagaag, ama waxaa lagu siiyay tirada xariiqyada VK.
16.12 04:19 Vasily: 3k+ khadadka iwm.<censored> halkii ay ka noqon lahayd falanqeeye

Ma laga yaabaa in laga reebo? Aan aragno sida sameeyo Kani waa macmiilka rasmiga ah - Telegram Desktop:

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

1100+ xariiq oo Python ah, dhowr tibaaxood oo joogto ah + kiisas gaar ah sida vector, kaas oo, dabcan, lagu dhawaaqay nidaamka sida ay tahay inay ahaato sida ku cad syntax TL, laakiin waxay ku tiirsan yihiin syntax-kan si ay u kala saaraan ... Su’aashu waxay tahay, maxaa mucjiso u noqday?иWay ka sii badan tahay haddii qofna aanu u kala saari doonin sida ku cad dukumentiga si kastaba?!

Dhanka kale... Xusuusnow inaan ka hadalnay hubinta CRC32? Markaa, koronto-dhaliyaha Desktop-ka Telegram-ka waxaa ku jira liis ka reeban noocyadaas oo la xisaabiyay CRC32 kuma eka iyadoo midda lagu tilmaamay jaantuska!

Vasily, [18.12/22 49:XNUMX] oo halkan waxaan ka fekerayaa in TL noocan oo kale ah loo baahan yahay
Haddii aan rabo in aan khalkhal galo hirgelinta beddelka ah, waxaan bilaabi lahaa gelinta xariiqda jebinta, kala badh baarayaasha ayaa jebin doona qeexitaanno xariiqo badan leh.
tdesktop, si kastaba ha ahaatee, sidoo kale

Xusuusnow qodobka ku saabsan hal-liner, wax yar ka dib ayaan ku soo laaban doonaa.

Hagaag, telegram-cli waa mid aan rasmi ahayn, Telegram Desktop waa rasmi, laakiin ka waran kuwa kale? Yaa garan kara qaybta hoose.

Waa maxay su'aalaha kale ee taxanaha ah ay kor u qaadaan ficil ahaan? Tusaale ahaan, waxay sameeyeen waxyaabo badan, dabcan, oo leh goobo yar iyo shuruudo:

Vasily: flags.0? true
macneheedu waa in garoonku joogo oo la siman yahay runta haddii calanka la dhigo

Vasily: flags.1? int
macneheedu waxa weeye in garoonku yaalo oo loo baahan yahay in meesha laga saaro

Vasily: Ass, ha ka welwelin waxaad samaynayso!
Vasily: Waxaa jira meel ka mid ah dokumentiga in runtu tahay nooca dhererka eber ee qaawan, laakiin suurtagal maaha in wax laga soo ururiyo dukumeentigooda
Vasily: Hirgelinta isha furan midda sidoo kale maahan kiiska, laakiin waxaa jira kooxo farabadan iyo taageerooyin

Ka warran Telethon? Inaad horay u sii eegto mawduuca MTProto, tusaale - dukumeentiyada waxaa jira qaybo noocaas ah, laakiin calaamadda % waxa lagu sifeeyaa kaliya inay tahay "kuxiga nooca qaawan ee la bixiyay", i.e. Tusaalooyinka hoose waxaa ku jira khalad ama wax aan sharci ahayn:

Vasily, [22.06.18 18:38] Hal meel:

msg_container#73f1f8dc messages:vector message = MessageContainer;

Si ka duwan:

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

Oo kuwanu waa laba kala duwanaansho weyn, nolosha dhabta ah nooc ka mid ah vector qaawan yimaado

Maan arag qeexitaan qaawan oo midna kama aanan kulmin

Falanqaynta waxay ku qoran tahay gacanta telethon

Jaantuskiisa qeexida ayaa laga faaloodaa msg_container

Mar labaad, su'aashu waxay weli ku saabsan tahay %. Laguma sifayn.

Vadim Goncharov, [22.06.18 19:22] iyo in tdesktop?

Vasily, [22.06.18 19:23] Laakin TL-ka baarayaasha caadiga ah ee matoorada caadiga ah waxay u badan tahay inaysan midna cunin.

// parsed manually

TL waa muuqaal qurux badan, qofna si buuxda uma hirgeliyo

Oo % kuma jiraan nooca nidaamka

Laakiin halkan dukumeentiyadu way is khilaafayaan, markaa idk

Waxaa laga helay naxwaha, waxay si fudud u illoobeen inay qeexaan semantiga

Waxaad ku aragtay dukumeentiga TL, ma ogaan kartid nus litir la'aanteed

"Hagaag, aynu nidhaahno," akhriste kale ayaa odhan doona, "wax aad dhaleecaysaa, markaa i tus sida loo sameeyo."

Vasily waxa ay ku jawaabtay: “Marka laga hadlaayo falanqaynta, waxaan ka helaa waxyaabo ay ka mid yihiin

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

si uun baan uga jeclahay

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

ama

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

Kani waa lexerkii oo dhan:

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

kuwaas. ka fudud ayaa ah in si khafiif ah loo dhigo."

Guud ahaan, natiijadu waxay tahay, koronto-dhaliyaha iyo koodhka koodhka qaybta dhabta ah ee TL-du waxay ku habboon yihiin qiyaastii 100 khadadka naxwaha iyo ~ 300 ee koronto-dhaliyaha (tirinta dhammaan printKoodhka la soo saaray), oo ay ku jiraan nooca macluumaadka buns-ka ee u fiirsashada fasal kasta. Nooc kasta oo polymorphic ah wuxuu isu rogaa dabaq aan la taaban karin oo faaruq ah, dhisayaashuna waxay ka dhaxlaan oo waxay leeyihiin habab taxane ah iyo kala-saarid.

La'aanta noocyada luqadda nooca ah

Ku qorista adag waa shay wanaagsan, sax? Maya, kani maaha holivar (inkasta oo aan doorbido luuqado firfircoon), laakiin waa qoraal ku dhex jira qaabka TL. Iyada oo ku saleysan, luqaddu waa inay na siiso dhammaan noocyada jeegagga annaga. Waa hagaag, okay, malaha isaga qudhiisa ma aha, laakiin hirgelinta, laakiin waa inuu ugu yaraan sifeeyaa. Iyo fursad noocee ah ayaan rabnaa?

Marka hore, xannibaadyada. Halkan waxaan ku aragnaa dukumeentiyada raritaanka faylasha:

Xogta binary-ga ee faylka ayaa markaa loo qaybiyaa qaybo. Dhammaan qaybaha waa inay lahaadaan cabbir isku mid ah ( cabbir_qayb ) waana in la buuxiyaa shuruudaha soo socda:

  • part_size % 1024 = 0 (waxaa loo qaybin karaa 1KB)
  • 524288 % part_size = 0 (512KB waa in si siman loo qaybiyaa qayb_size)

Qeybta ugu dambeysa maaha inay qanciso shuruudahan, waa haddii cabbirkeedu ka yar yahay qayb_size.

Qayb kastaa waa inay lahaataa lambar taxane ah, file_qayb, oo leh qiime u dhexeeya 0 ilaa 2,999.

Ka dib marka faylka la qaybiyo waxaad u baahan tahay inaad doorato habka aad ku kaydinayso server-ka. Isticmaal upload.saveBigFilePart haddii ay dhacdo in cabbirka buuxa ee faylka uu ka badan yahay 10 MB iyo upload.saveFilePart faylasha yaryar.
[…] mid ka mid ah khaladaadka soo gelinta xogta soo socda ayaa la soo celin karaa:

  • FILE_PARTS_INVALID - Tirada aan sax ahayn ee qaybaha Qiimaha maaha mid u dhexeeya 1..3000

Midkan ma ku jiraa jaantuska? Kani si uun miyaa loo sheegi karaa iyadoo la isticmaalayo TL? Maya Laakiin iga raali noqo, xitaa awoowe Turbo Pascal wuxuu awooday inuu qeexo noocyada la cayimay kala duwanaansho. Oo wuxuu ogaa hal shay oo kale, oo hadda si fiican loo yaqaan enum - nooc ka kooban tiro go'an (yar) oo qiyam ah. Luuqadaha sida C-numeric, ogow in ilaa hadda aan ka hadalnay oo kaliya noocyada tirooyinka. Laakiin waxa kale oo jira habab, xargo... tusaale ahaan, way fiicnaan lahayd in la qeexo in xadhigan uu ka koobnaan karo lambar telefoon, sax?

Midna kuma jiro TL. Laakiin waxaa jira, tusaale ahaan, JSON Schema. Iyo haddii qof kale uu ka doodi karo kala qaybsanaanta 512 KB, in tani ay wali u baahan tahay in lagu hubiyo koodka, ka dibna hubi in macmiilku si fudud Waan kari waayay dir tiro ka baxsan xadka 1..3000 (iyo qaladka u dhigma ma uusan kicin karin) waa suurtagal, sax?..

By habka, ku saabsan khaladaadka iyo soo celinta qiyamka. Xitaa kuwa la soo shaqeeyay TL waxay indha-tiraan indhahooda - isla markiiba naguma ay soo bixin taas mid walba Shaqada TL waxay dhab ahaantii soo celin kartaa ma aha oo kaliya nooca soo celinta la tilmaamay, laakiin sidoo kale qalad. Laakiin tan sinaba lagama soo saari karo iyadoo la adeegsanayo TL lafteeda. Dabcan, mar hore way caddahay oo ma jirto baahi loo qabo wax kasta oo ficil ah (in kasta oo xaqiiqda ah, RPC waxaa lagu samayn karaa siyaabo kala duwan, waxaan dib ugu soo laaban doonaa tan dambe) - laakiin waxa ku saabsan daahirnimada fikradaha Xisaabta Noocyada Abstract. ka aduunka jannada?

Ugu dambeyntiina, ka waran wax-akhris? Hagaag, halkaas, guud ahaan, waxaan jeclaan lahaa description Si sax ah ugu haysaa schema (ee JSON schema, mar kale, waa), laakiin haddii aad horeba ugu dhibtay, ka waran dhinaca wax ku oolka ah - ugu yaraan si fudud u eegaya khilaafaadka inta lagu jiro cusbooneysiinta? Naftaada u arag tusaalooyin dhab ah:

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

ama

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

Waxay kuxirantahay qof walba, laakiin GitHub, tusaale ahaan, waxay diidaysaa inay muujiso isbedelada gudaha xariiqyada dhaadheer. Ciyaarta "hel 10 kala duwanaansho", iyo waxa maskaxdu isla markiiba aragto waa in bilawga iyo dhammaadka labada tusaale ay isku mid yihiin, waxaad u baahan tahay inaad si daal ah u akhrido meel dhexda ah ... Fikradayda, tani maaha kaliya aragtida, laakiin si muuqaal ah wasakh iyo caajisnimo.

By habka, oo ku saabsan daahirnimada aragtida. Waa maxay sababta aan ugu baahanahay beer yar? Miyaanay u muuqan inay ur xun marka laga eego dhinaca aragtida nooca? Sharaxaada waxaa lagu arki karaa nuquladii hore ee jaantuska. Markii hore, haa, taasi waa sida ay ahayd, hindhiso kasta nooc cusub ayaa la sameeyay. Qodobadan ayaa wali ku jira qaabkan, tusaale ahaan:

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;

Laakiin hadda qiyaas, haddii aad ku leedahay 5 goobood oo ikhtiyaari ah qaab dhismeedkaaga, markaa waxaad u baahan doontaa 32 nooc dhammaan xulashooyinka suurtagalka ah. Qarax isku dhaf ah. Sidaa darteed, daahirnimada kristaalka ah ee aragtida TL ayaa mar kale ku jabtay dameerka kabka-birta ee xaqiiqada adag ee taxanaha.

Intaa waxa dheer, meelaha qaar nimankan laftoodu waxay ku xad gudbaan fartooda. Tusaale ahaan, MTProto (cutubka soo socda) jawaabta waxaa lagu cadaadin karaa Gzip, wax walba waa fiican yihiin - marka laga reebo in lakabyada iyo wareegga lagu xadgudbo. Mar labaad, ma ahayn RpcResult lafteeda in la goostay, laakiin waxa ku jira. Waa hagaag, maxaad tan u samaynaysaa?... Waxaan ku khasbanaaday in aan gooyo qolof si ay cadaadisku u shaqeeyo meel kasta.

Ama tusaale kale, waxaan mar ogaanay qalad - waa la soo diray InputPeerUser halkii InputUser. Ama lid ku ah. Laakiin way shaqeysay! Taasi waa, server-ku ma daneynin nooca. Sidee tani noqon kartaa? Jawaabta waxaa lagu heli karaa qaybo ka mid ah 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);

Si kale haddii loo dhigo, tani waa meesha taxanaha lagu sameeyo GARAB, aan la soo saarin code! Waxaa laga yaabaa in server-ka loo fuliyo si la mid ah? .. Mabda 'ahaan, tani waxay shaqeyn doontaa haddii hal mar la sameeyo, laakiin sidee loo taageeri karaa mar dambe inta lagu jiro cusbooneysiinta? Tani ma sababta qorshaha loo allifay? Oo halkan waxaan u gudbanaa su'aasha xigta.

Versioning. Lakabyo

Waa maxay sababta noocyada nashqadeynta loogu yeero lakabyo kaliya waxaa la qiyaasi karaa iyadoo lagu saleynayo taariikhda jaantusyada la daabacay. Sida muuqata, marka hore qorayaashu waxay u maleeyeen in waxyaabaha aasaasiga ah la samayn karo iyadoo la adeegsanayo nidaamka aan isbeddelin, oo kaliya marka loo baahdo, codsiyada gaarka ah, waxay muujinayaan in la sameeyay iyadoo la adeegsanayo nooc ka duwan. Mabda 'ahaan, xitaa fikrad wanaagsan - cusubna waxay noqon doontaa, sida ay ahayd, "isku dhafan", oo lagu dhejiyay dusha sare ee hore. Laakiin aan aragno sida loo sameeyay. Run, ma awoodin inaan ka eego bilowgii hore - waa wax lagu qoslo, laakiin jaantuska lakabka salka si fudud ma jiro. Lakabyadu waxay ku bilowdeen 2. Dukumeentigu wuxuu nooga warramayaa sifada TL ee gaarka ah:

Haddii macmiilku uu taageero Lakabka 2, markaas waa in la isticmaalo dhisaha soo socda:

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

Ficil ahaan, tani waxay ka dhigan tahay in ka hor wicitaan kasta API, int leh qiimaha 0x289dd1f6 waa in lagu daraa ka hor lambarka habka.

Waxay u muuqataa caadi Laakiin maxaa dhacay ka dib? Dabadeed soo muuqday

invokeWithLayer3#b7475268 query:!X = X;

Haddaba maxaa xiga? Sida aad qiyaasi karto,

invokeWithLayer4#dea0d430 query:!X = X;

Qosol Maya, waa goor hore in la qoslo, ka fikir xaqiiqda taas kasta Codsiga lakabka kale wuxuu u baahan yahay in lagu duuduubo nooca gaarka ah - haddii ay dhammaantood adiga kuu kala duwan yihiin, sidee kale oo aad u kala saari kartaa? Oo ku darida 4 bytes oo keliya hore waa hab quruxsan oo hufan. Haddaba,

invokeWithLayer5#417a57ae query:!X = X;

Laakiin way iska caddahay in muddo ka dib tani ay noqon doonto nooc ka mid ah bacchanalia. Xalkuna wuxuu yimid:

Cusboonaysiinta: Laga bilaabo lakabka 9, hababka caawiye invokeWithLayerN waxaa la wada isticmaali karaa oo keliya initConnection

Hooray! 9 nooc ka dib, waxaan ugu dambeyntii u nimid waxa lagu sameeyay borotokoolka Internetka ee 80-meeyadii - innaga oo ku heshiinay nooca hal mar bilowga xiriirka!

Haddaba maxaa xiga?..

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

Laakiin hadda weli waad qosli kartaa. Kaliya ka dib 9 lakab oo kale, dhisme caalami ah oo leh nambar version ayaa ugu dambeyntii lagu daray, kaas oo u baahan in la waco hal mar oo keliya bilowga xiriirka, iyo macnaha lakabyada ayaa u muuqday in la waayay, hadda waa nooc shuruud ah, sida meel kasta oo kale. Dhibaatada la xaliyay.

Dhab ahaantii?..

Vasily, [16.07.18 14:01] Xitaa Jimcihii waxaan u maleeyay:
Teleserverku wuxuu soo diraa dhacdooyin bilaa codsi ah. Codsiyada waa in lagu duubaa InvokeWithLayer. Seerfarku ma duubo cusbooneysiinta; ma jiro qaab lagu duubo jawaabaha iyo cusbooneysiinta.

Kuwaas. macmiilku ma cayimi karo lakabka uu doonayo cusbooneysiinta

Vadim Goncharov, [16.07.18 14:02] miyaanu InvokeWithLayer ahayn mabda'a?

Vasily, [16.07.18 14:02] Tani waa jidka keliya

Vadim Goncharov, [16.07.18 14:02] taas oo macnaheedu yahay in lagu heshiiyo lakabka bilowga fadhiga.

Jid ahaan, waxay raacaysaa in hoos u dhigista macmiilka aan la bixin

Cusbooneysiin, i.e. nooca Updates nidaamka, tani waa waxa uu serverku u soo diro macmiilka isagoo aan ka jawaabin codsiga API, laakiin si madax-banaan marka ay dhacdo dhacdo. Tani waa mawduuc adag oo looga hadli doono qoraal kale, laakiin hadda waxaa muhiim ah in la ogaado in server-ku uu keydiyo Updates xitaa marka macmiilku uu yahay offline.

Sidaa darteed, haddii aad diido inaad duubto mid kasta xirmo si loo muujiyo nooceeda, tani waxay si macquul ah u horseedaysaa dhibaatooyinka soo socda ee suurtogalka ah:

  • Server-ku waxa uu u soo diraa cusboonaysiinta macmiilka xitaa ka hor inta aanu macmiilku ku wargelin nooca uu taageerayo
  • maxaan sameeyaa ka dib markaan casriyeeyo macmiilka?
  • yaa damaanad qaadayaalin ra'yiga server-ka ee ku saabsan lambarka lakabka uusan isbeddelin inta lagu jiro habka?

Ma u malaynaysaa in tani ay tahay mala-awaal kaliya, oo ficil ahaan tani ma dhici karto, sababtoo ah server-ka si sax ah ayaa loo qoray (ugu yaraan, si fiican ayaa loo tijaabiyay)? Haa! Si kasta oo ay tahay!

Tani waa sida saxda ah ee aan galnay Agoosto. Agoosto 14, waxaa jiray farriimo sheegaya in wax lagu cusboonaysiiyay server-yada Telegram-ka

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.

ka dibna dhowr megabyte oo raad is dulsaar ah (si fiican, isla mar ahaantaana goynta ayaa la hagaajiyay). Ka dib oo dhan, haddii wax aan lagu aqoonsan TL-gaaga, waa binary saxiix ahaan, oo hoos u sii socda DHAMMAAN tagaa, kood goyntu waxay noqonaysaa mid aan macquul ahayn. Maxaa la gudboon in aad samayso xaaladdan oo kale?

Hagaag, waxa ugu horreeya ee qof kasta maskaxdiisa ku soo dhaca waa in la gooyo oo la isku dayo mar kale. Ma caawin. Waxaan Google-ka-eegnay CRC32 - kuwani waxay noqdeen walxo ka yimid nidaamka 73, inkasta oo aan ka shaqaynay 82. Waxaan si taxadar leh u eegnaa logyada - waxaa jira aqoonsiyo ka yimid laba nidaam oo kala duwan!

Ma laga yaabaa in dhibaatadu ay ku jirto macmiilkayaga aan rasmiga ahayn? Maya, waxaan bilownay Telegram Desktop 1.2.17 (nooca lagu bixiyo tiro qaybin Linux ah), waxay u qortaa diiwaanka ka reeban: MTP nooca lama filaanka ah id #b5223b0f ku akhri MTMessageMedia…

Dhaleeceynta hab-maamuuska iyo hababka urureed ee Telegram. Qaybta 1, farsamo: waayo-aragnimo qoraal macmiil ka soo xoq - TL, MT

Google ayaa muujisay in dhibaato la mid ah ay hore ugu dhacday mid ka mid ah macaamiisha aan rasmiga ahayn, laakiin markaa lambarrada nooca iyo, sidaas awgeed, malo-awaalku way ka duwan yihiin ...

Haddaba maxaa inala gudboon? Vasily iyo anigu waan kala tagnay: wuxuu isku dayay inuu cusbooneysiiyo wareegga 91, waxaan go'aansaday inaan sugo dhowr maalmood oo aan isku dayo 73. Labada habba way shaqeeyeen, laakiin maadaama ay yihiin kuwo macquul ah, ma jiraan wax faham ah oo ku saabsan inta nooc ee kor ama hoos aad u baahan tahay. inaad booddo, ama inta aad u baahan tahay inaad sugto.

Later waxaan awooday inaan dib u soo saaro xaalada: waxaan bilownay macmiilka, dami, dib u soo celinta wareegga lakabka kale, dib u bilaw, mar kale qabso dhibaatada, ku noqo kii hore - oops, ma jiro qadar wareeg ah oo wareeg ah iyo macmiilku dib u bilaabo a daqiiqado yar ayaa ku caawin doona. Waxaad heli doontaa isku dhafka xogta qaabdhismeedka lakabyo kala duwan.

Sharaxaada? Sida aad ka qiyaasi karto calaamadaha aan tooska ahayn ee kala duwan, server-ku wuxuu ka kooban yahay habab badan oo noocyo kala duwan ah oo ku saabsan mashiinnada kala duwan. Waxay u badan tahay, server-ka mas'uulka ka ah "buffering" wuxuu geliyaa safka wixii ay siiyeen madaxdiisa, waxayna ku bixiyeen nidaamkii jiray xilligii jiilka. Oo ilaa uu safkani "ka qudhunto", waxba lagama qaban karo.

Waxaa laga yaabaa ... laakiin tani waa qallafsanaan xun?! Nooca Android ka heli mayno TL parser, laakiin waxaan ka helnaa fayl culus (GitHub wuu diiday inuu taabto) oo leh (de) taxane ah. Waa kuwan godadka koodka:

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;

ama

    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... waxay u egtahay duurjoog. Laakiin, malaha, kani waa kood la soo saaray, ka dibna okay? .. Laakiin hubaal waxay taageertaa dhammaan noocyada! Run, ma cadda sababta ay wax walba isugu qasan yihiin, sheekeysi qarsoodi ah, iyo dhammaan noocyada kala duwan _old7 si kastaba ha ahaatee uma eka sida jiilka mashiinka ... Si kastaba ha ahaatee, inta badan oo dhan waa la iga afuufay

TL_message_layer104
TL_message_layer104_2
TL_message_layer104_3

Nimanyahow, xitaa ma go'aansan kartaan waxa ku jira hal lakab?! Hagaag, okay, aynu nidhaahno "laba" ayaa lagu sii daayay qalad, si fiican, way dhacdaa, laakiin SADDEX? Waa maxay muuqaal qaawan, raali ahow?..

Koodhka isha ee Telegram Desktop, habka, wax la mid ah ayaa dhacaya - haddii ay sidaas tahay, dhowr jeer ayaa isku xigta nidaamka ma beddelaan lambarka lakabka, laakiin wax hagaaji. Xaaladaha aysan jirin ilo rasmi ah oo xogta nidaamka ah, xagee laga heli karaa, marka laga reebo lambarka isha ee macmiilka rasmiga ah? Oo haddii aad halkaas ka qaadato, ma hubin kartid in nidaamku uu sax yahay ilaa aad tijaabiso dhammaan hababka.

Sidee tan xitaa loo tijaabin karaa? Waxaan rajeynayaa in taageerayaasha unugga, kuwa shaqeynaya iyo imtixaannada kale ay ku wadaagi doonaan faallooyinka.

Hagaag, aan eegno qayb kale oo kood ah:

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;

Faalladan "gacan loo abuuray" waxay soo jeedinaysaa in qayb ka mid ah feylkan gacanta lagu qoray (ma qiyaasi kartaa dhammaan riyooyinka dayactirka?), Inta soo hartayna waxaa lagu sameeyay mashiinka. Si kastaba ha ahaatee, markaas su'aal kale ayaa soo baxaysa - in ilaha la heli karo si buuxda uma aha (a la GPL blobs ee kernel Linux), laakiin tani waa mawduuc horeba qaybta labaad.

Laakiin ku filan. Aan u gudubno borotokoolka dusha ka saaran dhammaan taxanahan.

MT Proto

Markaa, aan furno sharaxaad guud и sharaxaad faahfaahsan oo ku saabsan borotokoolka oo waxa ugu horreeya ee aan ku turunturoodo waa erey-bixinta. Iyo wax walba oo badan. Guud ahaan, tani waxay u muuqataa inay tahay sifo gaar ah oo Telegram ah - wax ugu yeerida meelo kala duwan, ama waxyaabo kala duwan oo leh hal kelmad, ama liddi ku ah (tusaale ahaan, API- heer sare ah, haddii aad aragto xirmo dhejis ah, maahan. maxaad ka fikirtay).

Tusaale ahaan, "farriin" iyo "fadhi" macnaheedu waa wax ka duwan halkan marka loo eego is-dhexgalka macaamiisha Telegram ee caadiga ah. Hagaag, wax walba way ku cad yihiin fariinta, waxaa lagu tarjumi karaa ereyada OOP, ama si fudud loogu yeero ereyga "xirmo" - tani waa mid hooseeya, heerka gaadiidka, ma jiraan farriimo isku mid ah sida interface-ka, waxaa jira farriimo badan oo adeeg ah. . Laakiin fadhiga... laakiin marka hore wax walba.

lakabka gaadiidka

Waxa ugu horreeya waa gaadiidka. Waxay nooga sheegi doonaan 5 doorasho:

  • TCP
  • Websocket
  • Shabakadda internetka ee HTTPS
  • HTTP
  • HTTPS

Vasily, [15.06.18 15:04] Waxa kale oo jira gaadiidka UDP, laakiin lama diiwaangelin

Iyo TCP oo ah saddex nooc

Midka hore wuxuu la mid yahay UDP oo ka sarreeya TCP, baakidh kasta waxaa ku jira lambar taxane ah iyo crc
Waa maxay sababta akhrinta dukumentiyada gaadhiga dusheeda ay u xanuun badan tahay?

Hagaag, hadda waa jirtaa TCP waxay horey ugu jirtay 4 nooc:

  • Aflagaadeeyay
  • Dhexdhexaad
  • Dhexdhexaad ah oo daboolan
  • Full

Hagaag, ok, Dhexdhexaadiyaha loo yaqaan 'MTProxy', tan waxaa markii dambe lagu daray dhacdooyin si fiican loo yaqaan. Laakiin waa maxay sababta laba nooc oo kale (saddex wadar ahaan) marka aad mid ka heli karto? Dhammaan afarta asal ahaan waxay ku kala duwan yihiin kaliya sida loo dejiyo dhererka iyo culeyska ugu weyn ee MTProto, kaas oo si dheeraad ah looga hadli doono:

  • gudaha Abridged waa 1 ama 4 bytes, laakiin maaha 0xef, ka dibna jidhka
  • Dhexdhexaadinta tani waa 4 bytes oo dherer ah iyo beer, iyo marka ugu horeysa ee macmiilku soo diro 0xeeeeeeee si ay u muujiyaan in ay dhexdhexaad tahay
  • Si buuxda u qabatinka badan, marka laga eego aragtida shabakadaha: dhererka, tirada isku xigxiga, iyo MAYA midka inta badan ah MTProto, body, CRC32. Haa, waxaas oo dhami waxay dul saaran yihiin TCP. Kaas oo na siiya gaadiid la isku halayn karo oo qaab socodka byte-ga isku xiga; looma baahna wax taxane ah, gaar ahaan hubinta. Hagaag, hadda qof ayaa ii diidi doona in TCP uu haysto jeeg 16-bit ah, markaa musuqmaasuqa xogta ayaa dhacaya. Way fiican tahay, laakiin dhab ahaantii waxaanu haynaa hab-maamuuska cryptographic oo leh xashiish ka badan 16 bytes, dhammaan khaladaadkan - iyo xitaa in ka badan - waxaa qaban doona is-waafajinta SHA ee heer sare. Ma jirto wax dhibco ah oo ku jira CRC32 oo ku saabsan tan.

Aynu is barbar dhigno Abridged, kaas oo hal byte oo dherer ah ay suurtagal tahay, iyo Intermediate, taas oo caddaynaysa "Haddii 4-byte xogta la isku waafajiyo loo baahan yahay," taas oo ah wax aan macno lahayn. Waa maxay, waxaa la rumeysan yahay in barnaamijyada Telegram-ka ay yihiin kuwo aan karti lahayn oo ayan ka akhrin karin xogta godka gudaha baffer toosan? Weli waa inaad tan samaysaa, sababtoo ah akhrisku wuxuu kuu soo celin karaa tiro kasta oo bytes ah (iyo sidoo kale waxaa jira wakiillada wakiillada, tusaale ahaan ...). Ama dhanka kale, maxaa u xannibay Abridged haddii aan wali haysan doono dhejis adag oo korka ah 16 bytes - badbaadi 3 bytes иногда ?

Mid ayaa helaya aragtida ah in Nikolai Durov runtii jecel yahay inuu dib u curiyo taayirrada, oo ay ku jiraan borotokoolka shabakadda, iyada oo aan baahi dhab ah loo baahnayn.

Doorashooyinka kale ee gaadiidka, oo ay ku jiraan. Shabakadda iyo MTProxy, hadda ma tixgelin doono, laga yaabee in boostada kale, haddii uu jiro codsi. Ku saabsan isla MTProxy, aan hadda xasuusanno in wax yar ka dib markii la sii daayay 2018, bixiyeyaasha si degdeg ah u barteen inay xannibaan, loogu talagalay xannibidda la dhaafosida ku cad cabbirka xirmada! Iyo sidoo kale xaqiiqda ah in server-ka MTProxy uu qoray (mar kale Waltman) ee C ayaa si xad dhaaf ah ugu xirnaa waxyaabo gaar ah Linux, in kasta oo tani aan loo baahnayn gabi ahaanba (Phil Kulin ayaa xaqiijin doonta), iyo in server la mid ah Go ama Node.js uu lahaan lahaa. ku habboon in ka yar boqol sadar.

Laakiin waxaan ka soo saari doonaa gabagabada ku saabsan aqoonta farsamada ee dadkan dhamaadka qaybta, ka dib markaan tixgelinno arrimo kale. Hadda, aan u gudubno OSI lakabka 5, fadhiga - kaas oo ay dhigeen fadhiga MProto.

Furayaasha, fariimaha, fadhiyada, Diffie-Hellman

Si sax ah uma aysan meel dhigin meeshaas... Fadhigu maaha fadhi la mid ah kaas oo ka dhex muuqda interface ka hoos yimaada fadhiyada Firfircoon. Laakiin siday u kala horreeyaan.

Dhaleeceynta hab-maamuuska iyo hababka urureed ee Telegram. Qaybta 1, farsamo: waayo-aragnimo qoraal macmiil ka soo xoq - TL, MT

Markaa waxaanu helnay xadhig byte ah oo dherer la yaqaan ah lakabka gaadiidka. Tani waa fariin sir ah ama qoraal cad - haddii aan weli ku jirno marxaladda heshiiska muhiimka ah oo aan dhab ahaantii samayneyno. Midkee ka mid ah fikradaha la yiraahdo "furaha" ayaan ka hadlaynaa? Aan u caddeeyo arrintan kooxda Telegram lafteeda (Waxaan ka cudur daaranayaa inaan ka soo turjumay dhokumentigayga Ingiriisida anigoo maskaxda daalan saacadu markay tahay 4:XNUMX subaxnimo, way fududaatay inaan uga tago weedhaha qaarkood sida ay yihiin):

Waxaa jira laba hay'adood oo la yiraahdo fadhiga - mid ka mid ah UI ee macaamiisha rasmiga ah ee hoos yimaada "fadhiyada hadda", halkaas oo fadhi kastaa u dhigma dhammaan qalab / OS.
Labaad - Kalfadhiga MTProto, kaas oo leh lambarka isku xigxiga ee farriinta (macnaha hoose) ee ku jira, iyo kuwee waxaa laga yaabaa inay u dhexeyso isku xirka TCP ee kala duwan. Dhowr kalfadhi oo MTProto ah ayaa la rakibi karaa isku mar, tusaale ahaan, si loo dedejiyo soo dejinta faylka.

Labadaas dhexdooda fadhiyada waxaa jira fikrad oggolaansho. Xaaladda sii xumaatay, waxaan dhihi karnaa taas Kalfadhiga UI waa isku mid oggolaansho, laakiin hoog, wax walba waa adag yihiin. Aan eegno:

  • Isticmaalaha qalabka cusub ayaa marka hore soo saaraya auth_key oo waxay ku xidhaysaa xisaabta, tusaale ahaan SMS - waa sababta oggolaansho
  • Waxay ka dhacday gudaha markii hore Kalfadhiga MTProto, kaas oo leh session_id gudaha naftaada.
  • Tallaabadan, isku-dhafka oggolaansho и session_id lagu magacaabi karo tusaale ahaan - kelmaddani waxa ay ka muuqataa dukumeentiyada iyo koodka macaamiisha qaarkood
  • Kadib, macmiilku wuu furi karaa dhowr ah Kulamada MTProto hoostooda auth_key - isla DC.
  • Kadib, maalin maalmaha ka mid ah macmiilku wuxuu u baahan doonaa inuu ka codsado faylka DC kale - oo DC-kan mid cusub ayaa loo soo saari doonaa auth_key !
  • Si aad u ogeysiiso nidaamka in uusan ahayn isticmaale cusub oo isdiiwaangelinaya, laakiin la mid ah oggolaansho (Kalfadhiga UI), macmiilku wuxuu isticmaalaa wicitaanada API auth.exportAuthorization guriga DC auth.importAuthorization ee DC-ga cusub.
  • Wax walba waa isku mid, dhowr ayaa laga yaabaa inay furmaan Kulamada MTProto (mid walba goonidiisa ayuu leeyahay session_id) DC-gan cusub, hoostiisa uu auth_key.
  • Ugu dambayntii, macmiilku waxa laga yaabaa inuu rabo sir hore oo qumman. Mid kasta auth_key ahaa Joogto ah furaha - halkii DC - macmiilkuna wuu wici karaa auth.bindTempAuthKey loo isticmaalo ku meel gaar ah auth_key - iyo mar labaad, hal kaliya temp_auth_key halkii DC, ka dhexeeya dhammaan Kulamada MTProto ilaa kan DC.

Xusuusnow taas cusbo (iyo cusbada mustaqbalka) sidoo kale waa mid auth_key kuwaas. qof walba wadaaga Kulamada MTProto isla DC.

Waa maxay macnaha "inta u dhaxaysa isku xidhka kala duwan ee TCP"? Marka tani waxay ka dhigan tahay wax la mid ah buskudka oggolaanshaha ee degelka - way sii socotaa (badbaadaysaa) xidhiidho badan oo TCP ah ee server la bixiyay, laakiin maalin maalmaha ka mid ah way xumaataa. Kaliya si ka duwan HTTP, fariimaha MTProto ee fadhiga dhexdiisa ayaa si isdaba joog ah loo tiriyey oo la xaqiijiyay; haddii ay galeen tunnel-ka, xidhiidhku waa jabay - ka dib markii la sameeyo xiriir cusub, server-ku wuxuu si naxariis leh u soo diri doonaa wax kasta oo ku jira casharkan oo uusan bixinin kii hore. Isku xirka TCP.

Si kastaba ha ahaatee, macluumaadka kor ku xusan waa la soo koobay ka dib bilo badan oo baaritaan ah. Dhanka kale, ma ka dhaqangelineynaa macmiilkayaga meel eber ah? - aan ku noqonno bilowgii.

Markaa aynu abuurno auth_key on Noocyada Diffie-Hellman ee Telegram. Aan isku dayno inaan fahanno dukumentiyada...

Vasily, [19.06.18 20:05] xogta_with_hash: = SHA1 (xogta) + xogta + (bytes kasta random); sida in dhererku le'eg yahay 255 bytes;
encrypted_data: = RSA (xogta_with_hash, server_public_key); nambar dheer oo 255-byte ah (big endian) ayaa kor loogu qaadayaa awoodda loo baahan yahay ee modules-ka loo baahan yahay, natiijaduna waxaa loo kaydiyaa lambar 256-byte ah.

Waxay leeyihiin xoogaa DH

Uma eka DH qof caafimaad qaba
Ma jiraan laba fure oo dadweyne dx

Hagaag, dhamaadka tani waa la xaliyay, laakiin hadhaaga ayaa hadhay - caddaynta shaqada waxaa sameeya macmiilka oo awood u leh inuu calaamadeeyo lambarka. Nooca ka hortagga weerarada DoS Furaha RSA-na waxa loo adeegsadaa hal mar oo keliya hal jiho, asal ahaanna sirta new_nonce. Laakiin iyadoo qaliinkan u muuqda mid fudud uu guulaysan doono, maxaad wajihi doontaa?

Vasily, [20.06.18/00/26 XNUMX:XNUMX] Weli ma aanan helin codsiga appid-ka

Codsigan waxaan u diray DH

Iyo, markab-xireenka gaadiidka waxa ay sheegaysaa in ay kaga jawaabi karto 4 bytes oo ah kood khalad ah. Waa intaas

Hagaag, wuxuu ii sheegay -404, waa maxay?

Markaa waxaan ku idhi: " Qabso bullshitkaaga oo ku sirsan furaha serverka oo leh far sidan oo kale ah, waxaan rabaa DH," waxayna ku jawaabtay doqonnimo 404

Maxaad u malaynaysaa jawaabta server-kan? Maxaa la sameeyaa? Ma jirto cid la waydiiyo (laakin wax badan oo ku saabsan taas qaybta labaad).

Halkan dhammaan xiisaha ayaa lagu sameeyaa meesha lagu xidho

Ma hayo wax kale oo aan sameeyo, kaliya waxaan ku riyooday inaan tirooyinka hore iyo gadaal u rogo

Laba lambar oo 32-bit ah. Sida dadka kale ayaan u xidhxidhay

Laakiin maya, labadan waxay u baahan yihiin in marka hore lagu daro khadka sida BE

Vadim Goncharov, [20.06.18 15:49] iyo sababta 404?

Vasily, [20.06.18 15:49] HAA!

Vadim Goncharov, [20.06.18 15:50] marka ma fahmin waxa uu "ma helin"

Vasily, [20.06.18 15:50] qiyaastii

Ma aan heli karin burburka noocaas ah oo noqda qodobbada muhiimka ah%)

Xataa maanu maamulin khalad ka warbixinta

Vasily, [20.06.18 20:18] Oh, waxaa sidoo kale jira MD5. Horeba saddex xashiish oo kala duwan

Faraha furaha waxaa loo xisaabiyay sida soo socota:

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

SHA1 iyo sha2

Markaa aan dhigno auth_key Waxaan helnay cabbirka 2048 iyadoo la adeegsanayo Diffie-Hellman. Maxaa xiga? Marka xigta waxaan ogaanay in 1024-ka hoose ee furahaan aan sinaba loo isticmaalin ... laakiin aan hadda ka fikirno tan hadda. Tallaabadan, waxaan la wadaagnay sirta server-ka. Analooga fadhiga TLS ayaa la sameeyay, kaas oo ah nidaam aad qaali u ah. Laakiin server-ku weli waxba kama oga cidda aanu nahay! Weli ma aha, dhab ahaantii. oggolaansho. Kuwaas. Haddii aad u malaynaysay marka loo eego "login-password", sida aad mar ku samaysay ICQ, ama ugu yaraan "furaha soo gal", sida SSH (tusaale, qaar ka mid ah gitlab/github). Waxaan helnay mid qarsoodi ah. Maxaa dhacaya haddii serfriyuhu uu noo sheego "lambaradan telefoonnada waxaa ka shaqeeya DC kale"? Ama xitaa "lambarka taleefankaaga waa la mamnuucay"? Waxa ugu fiican ee aan samayn karno waa in aan furaha ku hayno rajo ah in uu faa'iido yeelan doono oo uusan qudhmi doonin markaa.

Jid ahaan, waxaanu "ka guddoomay" boos celin. Tusaale ahaan, ma ku kalsoonahay server-ka? Maxaa dhacaya haddii ay been abuur tahay? Jeegaga garaafyada ayaa loo baahan doonaa:

Vasily, [21.06.18 17:53] Waxay bixiyaan macaamiisha mobilada si ay u hubiyaan lambarka 2kbit ee mudnaanta).

Laakiin gabi ahaanba ma cadda, nafeijoa

Vasily, [21.06.18 18:02] Dukumeentigu ma sheegayo waxa la sameeyo haddii ay noqoto mid fudud

Lama odhan. Aan aragno waxa macmiilka rasmiga ah ee Android uu sameeyo kiiskan? A taasi waa waxa (iyo haa, faylka oo dhan waa mid xiiso leh) - sida ay yiraahdaan, halkan ayaan kaga tagi doonaa:

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

Maya, dabcan wali waa ay jirtaa qaar Waxaa jira imtixaano lagu eegayo mudnaanta lambar, laakiin shakhsi ahaan hadda ma haysto aqoon ku filan oo xisaabta ah.

Hagaag, waxaan helnay furaha master-ka. Si aad u gasho, i.e. codsiyada soo dir, waxaad u baahan tahay inaad sameyso sir dheeri ah, adoo isticmaalaya AES.

Furaha fariinta waxaa lagu qeexay sida 128-bit ee dhexe ee SHA256 ee jirka fariinta (ay ku jiraan fadhiga, aqoonsiga fariinta, iwm.), oo ay ku jiraan suufka bytes, oo loo sii diyaariyay 32 bytes oo laga soo qaatay furaha oggolaanshaha.

Vasily, [22.06.18 14:08] Celcelis ahaan, qaniinyo, qaniinyo

helay auth_key. Dhammaan Marka laga soo tago iyaga... kama cadda dukumeentiga. Dareen xor u ah inaad barato koodhka isha furan.

Ogsoonow in MTProto 2.0 ay u baahan tahay 12 ilaa 1024 bytes oo suuf ah, wali waxay ku xiran tahay shardi ah in dhererka fariinta natiijada loo qaybin karo 16 bytes.

Haddaba intee in le'eg ayaad ku darsataa?

Haa, sidoo kale waxaa jira 404 haddii ay dhacdo qalad

Haddii qof si taxadar leh u darsay jaantuska iyo qoraalka dukumeentiga, waxay ogaadeen in uusan jirin MAC halkaas. Iyo in AES loo isticmaalo hab gaar ah oo IGE ah oo aan loo isticmaalin meel kale. Waxay, dabcan, arrintan ku qoraan FAQ-gooda ... Halkan, sida, furaha fariinta laftiisa sidoo kale waa SHA hash ee xogta la furay, oo loo isticmaalo in lagu hubiyo daacadnimada - iyo haddii ay dhacdo is-waafajin, dukumeentigu sababo qaar waxay ku talinaysaa in si aamusan la iskaga indha tiro (laakin ka waran amniga, ka waran hadday na jebiyaan?).

Anigu ma ihi cryptographer, laga yaabee inaysan jirin wax khalad ah qaabkan kiiskan marka laga eego aragtida aragtida. Laakiin waxaan si cad u magacaabi karaa dhibaato la taaban karo, anigoo isticmaalaya Telegram Desktop tusaale ahaan. Waxay siraysa kaydka maxaliga ah (dhammaan kuwan D877F783D5D3EF8C) si la mid ah fariimaha ku jira MTProto (kaliya kiiskan nooca 1.0), i.e. marka hore furaha fariinta, ka dibna xogta lafteeda (iyo meel ka fog kan ugu weyn auth_key 256 bytes, la'aanteed msg_key faa'iido lahayn). Markaa, dhibaatadu waxay noqotaa mid lagu ogaan karo faylalka waaweyn. Magac ahaan, waxaad u baahan tahay inaad haysatid laba nuqul oo xogta ah - sir oo la decrypted. Iyo haddii ay jiraan megabytes, ama fiidiyoow qulqulaya, tusaale ahaan? .. Nidaamyada caadiga ah ee MAC ka dib qoraalka ciphertext waxay kuu oggolaanayaan inaad akhrido qulqulka, isla markiiba u gudbiya. Laakin MTProto waa inaad samaysaa marka hore sir ama fur fariinta oo dhan, ka dibna u gudbi shabakada ama diskka. Sidaa darteed, noocyadii ugu dambeeyay ee Telegram Desktop ee khasnadda ku jirta user_data Qaab kale ayaa sidoo kale la isticmaalaa - oo leh AES qaabka CTR.

Vasily, [21.06.18 01:27] Oh, waxaan ogaaday waxa IGE yahay: IGE wuxuu ahaa isku daygii ugu horreeyay ee "qaabka sirta xaqiijinta," asal ahaan Kerberos. Waxay ahayd isku day fashilmay (ma bixiso ilaalin daacadnimo), oo waxay ahayd in meesha laga saaro. Taasi waxay ahayd bilawga raadinta 20 sano ee habka sirta xaqiijinta ee shaqaynaysa, kaas oo dhawaan ku dhamaaday hababka sida OCB iyo GCM.

Oo hadda dooda ka timid dhinaca gaariga:

Kooxda ka dambeysa Telegram, oo uu hogaamiyo Nikolai Durov, waxay ka kooban yihiin lix horyaal oo ACM ah, oo kala bar ay yihiin Ph.D xagga xisaabta. Waxay ku qaadatay ilaa laba sano inay soo saaraan nooca hadda ee MTProto.

Taasi waa qosol Laba sano oo heerka hoose ah

Ama waxaad qaadan kartaa tls

Hagaag, aynu nidhaahno waxaanu samaynay sirta iyo nuancesyada kale. Ugu dambayntii suurtagal ma tahay in la soo diro codsiyo taxane ah oo TL ah oo laga saaro jawaabaha? Haddaba maxaa iyo sidee u diri kartaa? Halkan, aynu nidhaahno, habka initConnection, malaha kani waa kan?

Vasily, [25.06.18 18:46] Wuxuu bilaabayaa isku xidhka wuxuuna kaydiyaa macluumaadka qalabka isticmaalaha iyo codsiga.

Waxay aqbashaa app_id, device_model, system_version, app_version iyo lang_code.

Iyo xoogaa su'aal ah

Dukumeenti sida had iyo jeer. Dareen xor u ah inaad barato isha furan

Haddii wax waliba ay ku caddaayeen invokeWithLayer, markaa maxaa halkan ka khaldan? Waxay soo baxday, aynu nidhaahno waxaan haynaa - macmiilku wuxuu horey u haystay wax uu ku weydiiyo server-ka - waxaa jira codsi aan rabnay inaan dirno:

Vasily, [25.06.18 19:13] Marka la eego koodhka, wicitaanka ugu horreeya wuxuu ku duudduubay qashinkan, qashinka laftiisana waxaa lagu duudduubay invokewithlayer.

Waa maxay sababta initConnection uu u noqon waayay wicitaan gaar ah, laakiin waa inuu ahaadaa duub? Haa, sida ay soo baxday, waa in la sameeyaa mar kasta bilowga kalfadhi kasta, oo aan ahayn hal mar, sida furaha ugu muhiimsan. Laakiin! Laguma wici karo isticmaale aan la fasaxin! Hadda waxaan gaadhnay heerkii lagu dabaqi lahaa Midkan bogga dukumentiga - waxayna noo sheegaysaa in...

Kaliya qayb yar oo ka mid ah hababka API ayaa diyaar u ah isticmaalayaasha aan la fasaxin:

  • auth.sendCode
  • auth.resendCode
  • account.helPassword
  • auth.checkPassword
  • auth.checkPhone
  • auth.signUp
  • auth.signIn
  • auth.import Oggolaanshaha
  • caawin.getConfig
  • caawin.helNearestDc
  • help.getAppUpdate
  • help.getCdnConfig
  • langpack.getLangPack
  • langpack.getStrings
  • langpack.getDifference
  • langpack.getLanguages
  • langpack.getLanguage

Kuwa ugu horreeya, auth.sendCode, oo waxaa jira codsigii ugu horreeyay ee aan u dirno api_id iyo api_hash, ka dibna waxaan helnaa SMS oo leh kood. Haddii aan ku jirno DC-ga khaldan (lambarada teleefoon ee dalkan waxaa u adeegta mid kale, tusaale ahaan), markaa waxaan heli doonaa qalad lambarka DC ee la rabo. Si aad u ogaato ciwaanka IP-ga ee lambarka DC ee aad u baahan tahay inaad ku xidho, na caawi help.getConfig. Hal mar waxaa jiray 5 oo kaliya, laakiin ka dib dhacdooyinka caanka ah ee 2018, tirada ayaa si weyn u kordhay.

Hadda aan xasuusanno in aan heerkan gaadhnay server-ka si qarsoodi ah. Sow qaali maaha in la helo ciwaanka IP-ga? Waa maxay sababta aan tan iyo hawlgallada kaleba ugu samaynayn qaybta qarsoodiga ah ee MTProto? Waxaan maqlaa diidmada: "Sideen u hubin karnaa in aysan ahayn RKN kan ka jawaabi doona cinwaanno been abuur ah?" Tan waxaan ku xasuusaneynaa, guud ahaan, macaamiisha rasmiga ah Furayaasha RSA way ku dhex jiraan, i.e. ma awoodaa kaliya subscribe dheh xogtan. Dhab ahaantii, tan horeba waxaa loo sameeyay macluumaadka ku saabsan ka-hortagga xannibaadda ay macaamiishu ka helaan kanaalada kale (macn ahaan, tan laguma samayn karo MTProto lafteeda; waxaad sidoo kale u baahan tahay inaad ogaato meesha aad ku xiran tahay).

OK Marxaladdan oggolaanshaha macmiilka, weli nalooma oggola oo ma aannan diiwaangelin codsigayaga. Waxaan kaliya rabnaa inaan aragno waxa serfarka uu kaga jawaabo hababka uu heli karo isticmaale aan la fasaxin. Oo halkan…

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;

Nidaamka, marka hore ayaa imanaysa labaad

Qorshaha tdesktop-ka qiimaha saddexaad waa

Haa, tan iyo markaas, dabcan, dukumeentiga waa la cusboonaysiiyay. In kasta oo laga yaabo in ay dhawaan noqoto mid aan khusayn mar kale. Sidee u ogaan karaa horumariyaha cusub? Waxaa laga yaabaa haddii aad diiwaan geliso codsigaaga, inay ku wargeliyaan? Vasily wuxuu sameeyay tan, laakiin hoog, waxba uma soo dirin (mar kale, waxaan uga hadli doonaa tan qaybta labaad).

...Waxaad dareentay in aan mar hore si uun ugu guurnay API-ga, i.e. ilaa heerka ku xiga, oo aad seegtay wax ku jira mawduuca MProto? La yaab ma leh:

Vasily, [28.06.18 02:04] Mm, waxay ku xamanayaan qaar ka mid ah algorithms-ka e2e

Mtproto wuxuu qeexayaa algorithms-ka sirta ah iyo furayaasha labada goobood, iyo sidoo kale xoogaa qaab duub ah

Laakiin waxay si joogto ah isugu daraan heerar kala duwan oo xidhmo ah, sidaa darteed had iyo jeer ma cadda halka uu ku dhammaaday mtproto heerka ku xigana uu bilaabmay.

Sidee bay isku daraan? Hagaag, halkan waa isla furaha ku meel gaadhka ah ee PFS, tusaale ahaan (sida, Telegram Desktop ma samayn karo). Waxa lagu fuliyaa codsi API auth.bindTempAuthKey, i.e. laga bilaabo heerka ugu sarreeya. Laakiin isla mar ahaantaana waxay faragelisaa sirta heerka hoose - ka dib, tusaale ahaan, waxaad u baahan tahay inaad mar kale sameyso. initConnection iwm, tani maaha kaliya codsi caadi ah. Waxa sidoo kale gaar ah waa inaad lahaan karto hal fure oo ku meel gaar ah DC kasta, in kasta oo garoonka dhexdiisa auth_key_id fariin kasta waxay kuu ogolaaneysaa inaad bedesho furaha ugu yaraan fariin kasta, iyo in server-ku uu xaq u leeyahay inuu "hilmaamo" furaha ku meel gaadhka ah wakhti kasta - dukumeentigu ma sheegayo waxa la sameeyo kiiskan ... si fiican, maxaad u awoodi kartaa. 'ma haysatid dhowr furayaal, sida milix mustaqbalka ah, iyo?

Waxa jira dhawr waxyaalood oo kale oo mudan in la xuso oo ku saabsan mawduuca MTProto.

Farriimaha fariimaha, msg_id, msg_seqno, xaqiijinta, pings oo jihada qaldan u socda iyo siyaalo kale

Maxaad ugu baahan tahay inaad ka ogaato iyaga? Sababtoo ah waxay "daadinayaan" heer sare, waxaadna u baahan tahay inaad ka warqabto markaad la shaqaynayso API-ga. Aynu ka soo qaadno inaanan xiisaynayn msg_key; heerka hoose ayaa wax walba inaga dhigay. Laakiin gudaha xogta la furay waxaan ku leenahay meelahan soo socda (sidoo kale dhererka xogta, markaa waan ognahay halka suufku ku yaal, laakiin taasi muhiim maaha):

  • cusbo - int64
  • session_id - int64
  • message_id - int64
  • seq_no - int32

Aan ku xasuusino in ay jirto hal milix oo keliya DC oo dhan. Maxaan uga ogaanayaa iyada? Ma aha oo kaliya sababtoo ah waxaa jira codsi get_future_salts, kaas oo kuu sheegaya inta u dhaxaysa ee ansax noqon doonta, laakiin sidoo kale sababtoo ah haddii milixdaadu " qudhuntay ", markaa fariinta (codsiga) si fudud ayaa loo lumi doonaa. Server-ku, dabcan, wuxuu ka warbixin doonaa cusbada cusub isagoo soo saaraya new_session_created - laakiin kii hore waa inaad si uun dib ugu soo dirtaa, tusaale ahaan. Waxayna arrintani saamaynaysaa qaab dhismeedka codsiga.

Seerfarka waxa loo ogolyahay in uu gabi ahaanba dhigo fadhiyada oo uu sidan uga jawaabo sababo badan dartood. Dhab ahaantii, waa maxay fadhiga MTProto ee dhinaca macmiilka? Waa laba tiro session_id и seq_no fariimaha fadhigan dhexdiisa. Hagaag, iyo xidhiidhka hoose ee TCP, dabcan. Aynu sheegno in macmiilkayagu aanu weli garanayn sida loo sameeyo waxyaabo badan, wuu jaray, dib u xidhay. Haddii tani si dhakhso ah u dhacdo - fadhigii hore wuxuu ku sii socday xidhiidhka cusub ee TCP, kordhin seq_no dheeraad ah. Haddii ay wakhti dheer qaadato, server-ku wuu tirtiri karaa, sababtoo ah dhinaceeda sidoo kale waa saf, sidaan ogaanay.

Maxay noqon lahayd seq_no? Oh, taasi waa su'aal khiyaano leh. Isku day inaad si daacad ah u fahanto waxa loola jeedo:

Fariinta la xiriirta nuxurka

Farriin u baahan qirasho cad Kuwaas waxaa ka mid ah dhammaan isticmaalayaasha iyo fariimo adeeg oo badan, dhammaan marka laga reebo weelasha iyo qirashada.

Lambarka Taxanaha Fariinta (msg_seqno)

Nambar 32-bit ah oo la mid ah laba jeer tirada fariimaha "content-content" (kuwa u baahan qirasho, gaar ahaan kuwa aan weelka ahayn) ee uu sameeyay soo diruhu ka hor fariintan oo dabadeed mid lagu kordhiyay haddii fariinta hadda tahay fariinta la xiriirta nuxurka. Weelku had iyo jeer waa la sameeyaa ka dib waxa ku jira oo dhan; sidaa awgeed, nambarkiisu waa ka weyn yahay ama la siman yahay tirooyinka isku xiga ee fariimaha ku jira.

Waa maxay nooca wareegga ah ee lagu kordhiyey 1, ka dibna mid kale oo 2 ah?... Waxaan tuhunsanahay in markii hore ay ula jeedaan "wax yar oo muhiim ah ACK, inta soo hartay waa lambar", laakiin natiijadu maaha mid la mid ah - gaar ahaan, way soo baxdaa, waa la diri karaa dhowr ah xaqiijinta isagoo isku mid ah seq_no! Sidee? Waa hagaag, tusaale ahaan, server-ku wuxuu noo soo diraa shay, wuu soo diraa, annaguna waanu iska aamusnaa, kaliya oo ku jawaabaya farriimaha adeegga ee xaqiijinaya helitaanka fariimaha. Xaaladdan oo kale, xaqiijintayada bixitaanku waxay yeelan doonaan nambarka baxaya isla lambarka. Haddii aad aqoon u leedahay TCP oo aad u malaynayso in tani ay u egtahay duurjoogta, laakiin waxay u muuqataa mid aan duurjoog ahayn, sababtoo ah TCP seq_no isma beddelo, laakiin xaqiijintu waxay tagtaa seq_no dhanka kale, waan ku degdegi doonaa inaan kaa xanaajiyo. Xaqiijinta waxaa lagu bixiyaa MTProto MAYA on seq_no, sida TCP, laakiin by msg_id !

Waa maxay waxaan msg_id, kuwa ugu muhiimsan ee goobahan? Aqoonsiga fariinta gaarka ah, sida magacaba ka muuqata. Waxaa lagu qeexaa inuu yahay 64-bit nambar, kan ugu hooseeya oo mar labaad haysta sixirka "server-not-server", inta soo hartayna waa Unix timestamp, oo ay ku jirto qaybta jajabka, ayaa 32 bits u rartay bidix. Kuwaas. timestamp per se (iyo fariimaha leh waqtiyo aad u kala duwan waxaa diidi doona server). Halkaa waxaa ka soo baxaysa in guud ahaan tani ay tahay aqoonsi caalami ah oo macmiilka ah. Marka la eego - aan xasuusano session_id Waa nala dammaanad qaaday: Marnaba fariin loogu talagalay hal fadhi looma diri karo fadhi kale. Taasi waa, waxay soo baxday in ay hore u jirtay saddex heerka - fadhiga, lambarka fadhiga, id fariinta. Waa maxay sababta dhibaatadan oo kale, qarsoodigani aad buu u weyn yahay.

Sidaas msg_id loo baahan yahay...

RPC: codsiyada, jawaabaha, khaladaadka. Xaqiijinta.

Sida laga yaabo inaad dareentay, ma jiraan wax gaar ah oo ah "samaynta codsi RPC" nooca ama shaqada meel kasta oo jaantuska ah, inkastoo ay jiraan jawaabo. Ka dib oo dhan, waxaan haynaa fariimaha la xiriira nuxurka! Taasi waa, mid kasta fariintu waxay noqon kartaa codsi! Ama aan noqon. Ka dib oo dhan, mid kasta waa msg_id. Laakiin waxaa jira jawaabo:

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

Halkani waa halka lagu tilmaamay fariinta ay tani jawaab u tahay. Sidaa darteed, heerka ugu sarreeya ee API-ga, waa inaad xasuusataa waxa lambarka codsigaagu ahaa - Waxaan u maleynayaa inaysan jirin baahi loo qabo in la sharaxo in shaqadu ay tahay mid aan isku mid ahayn, waxaana jiri kara codsiyo dhowr ah oo socda isla waqti isku mid ah. jawaabaha oo lagu soo celin karaa hab kasta? Mabda 'ahaan, tan iyo farriimaha khaladka ah sida shaqaale la'aan, naqshadda ka dambeysa tan waa la raadin karaa: server-ka ku haya xiriirka TCP ee adiga ayaa ah dheellitirka-dhamaadka hore, wuxuu u gudbiyaa codsiyada dhabarka wuxuuna dib u soo ururiyaa iyada oo loo marayo message_id. Waxay u muuqataa in wax walba oo halkan ku yaal ay cad yihiin, macquul ah oo wanaagsan.

Haa?.. Oo haddii aad ka fikirto? Ka dib oo dhan, jawaabta RPC lafteedu waxay sidoo kale leedahay beer msg_id! Ma waxaan u baahanahay inaan ku qaylino serverka "ma jawaabaysid jawaabteyda!"? Oo haa, maxaa ka jiray xaqiijinta? Ku saabsan bogga fariimaha ku saabsan fariimaha waxa uu inoo sheegayaa

msgs_ack#62d6b459 msg_ids:Vector long = MsgsAck;

waana in dhinac walba laga sameeyaa. Laakiin had iyo jeer maaha! Haddii aad heshay RpcResult, lafteedu waxay u adeegtaa xaqiijin ahaan. Taasi waa, server-ku wuxuu kaga jawaabi karaa codsigaaga MsgsAck - sida, "Waan helay." RpcResult waxay isla markiiba ka jawaabi kartaa Waxay noqon kartaa labadaba.

Oo haa, weli waa inaad ka jawaabto jawaabta! Xaqiijinta. Haddii kale, server-ku wuxuu u qaadan doonaa inaan la bixin karin oo mar labaad kuu soo diri doona. Xataa dib u xidhidhinta ka dib. Laakiin halkan, dabcan, arrinta waqti-ku-gudbinta ayaa soo baxda. Bal aan eegno iyaga in yar ka dib.

Dhanka kale, aan eegno khaladaadka fulinta weydiinta ee suurtogalka ah.

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

Oh, qof ayaa ku dhawaaqi doona, halkan waa qaab bini'aadantinimo ka badan - waxaa jira khad! Qaado waqtigaaga. Halkan liiska khaladaadka, laakiin dabcan ma dhammaystirna. Halkaa waxaynu ka baranaynaa in koodku yahay wax la mid ah Khaladaadka HTTP (si fiican, dabcan, semantics jawaabaha lama ixtiraamo, meelaha qaarkood si aan kala sooc lahayn ayaa loogu qaybiyaa koodhka), xariiquna wuxuu u eg yahay. CAPITAL_LETTERS_AND_NUMBERS. Tusaale ahaan, PHONE_NUMBER_OCCUPIED ama FILE_PART_Х_MISSING. Hagaag, taasi waa, waxaad weli u baahan doontaa khadkan turxaan bixin. Tusaale ahaan, FLOOD_WAIT_3600 waxay la macno tahay in aad sugto saacad, iyo PHONE_MIGRATE_5, in nambarka taleefoonka leh horgalahaan waa in lagu diwaan galiyo 5th DC. Waxaan leenahay luqad nooc ah, sax? Uma baahnid dood ka timaada xarig, kuwa caadiga ah ayaa sameyn doona, ok.

Mar labaad, tani kuma jirto bogga fariimaha adeegga, laakiin, sida horayba caadiga ahayd mashruucan, macluumaadka waa la heli karaa bog kale oo dukumeenti ah. Ama shaki gelin. Marka hore, eeg, ku xad-gudbinta qorista/lakabka - RpcError buul baa lagu dhex dari karaa RpcResult. Waa maxay sababta dibadda? Maxaan xisaabta ku darsan waynay? RpcError lagama yaabo in lagu dhex daro RpcResult, laakiin si toos ah ama buul loogu dhejiyaa nooc kale?. waa maqan tahay req_msg_id ? ..

Laakiin aan sii wadno fariimaha adeegga. Macmiilku waxa laga yaabaa in uu u malaynayo in seerfarku uu fikirayo wakhti dheer oo uu sameeyo codsigan cajiibka ah:

rpc_drop_answer#58e4a740 req_msg_id:long = RpcDropAnswer;

Waxaa jira saddex jawaabood oo suurtagal ah su'aashan, oo mar kale isku dhafan habka xaqiijinta; isku dayga in la fahmo waxa ay noqon doonaan (iyo liiska guud ee noocyada aan u baahnayn xaqiijin) waxaa loo daayaa akhristaha sida shaqada guriga (xusuusnow: macluumaadka ku jira Koodhka isha ee Desktop-ka Telegram ma dhammaystirna).

qabatinka daroogada: statuses fariinta

Guud ahaan, meelo badan oo ka mid ah TL, MTProto iyo Telegram guud ahaan waxay ka tagaan dareen madax-adayg, laakiin waxay ka baxaan edeb, xeelad iyo kuwa kale. xirfadaha jilicsan Si asluub ​​leh ayaanu uga aamusnay, waxaanan faafreebnay waxyaabaha xunxun ee ku jira wada-hadallada. Si kastaba ha ahaatee, meeshanОinta badan bogga waxa uu ku saabsan yahay fariimaha ku saabsan fariimaha Waa wax laga naxo xitaa aniga, kaas oo la shaqeynayay borotokoolka shabakada muddo dheer oo arkay baaskiilo heerar kala duwan oo qalloocan ah.

Waxay ku bilaabataa si aan dhib lahayn, iyadoo la xaqiijinayo. Marka xiga waxay noo sheegaan

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;

Hagaag, qof kasta oo bilaaba inuu la shaqeeyo MTProto waa inuu la macaamilaa iyaga; wareegga "la saxay - dib loo soo koobay - bilaabay" wareegga, helitaanka khaladaadka lambarrada ama milix u suurtagashay inay xumaato inta lagu jiro tafatirka waa wax caadi ah. Si kastaba ha ahaatee, halkan waxaa jira laba dhibcood:

  1. Taas macnaheedu waa in fariintii asalka ahayd luntay. Waxaan u baahanahay inaan abuurno qaar ka mid ah safafka, waxaan eegi doonaa taas mar dambe.
  2. Waa maxay lambarradan qaladka ah ee yaabka leh? 16, 17, 18, 19, 20, 32, 33, 34, 35, 48, 64... meeye tirooyinka kale, Tommy?

Dukumeentigu wuxuu leeyahay:

Ujeedadu waa in qiyamka code_code la kooxeeyay (error_code >> 4): tusaale ahaan, codes 0x40 — 0x4f waxay u dhigmaan khaladaadka ku jira burburka weelka.

laakiin, marka hore, isbeddel dhinaca kale ah, iyo marka labaad, waxba maaha, aaway koodhadhkii kale? Madaxa qoraaga?... Si kastaba ha ahaatee, kuwani waa wax yar.

Qabowgu wuxuu ka bilaabmaa fariimaha ku saabsan heerka fariimaha iyo nuqullada fariinta:

  • Codsiga Macluumaadka Xaaladda Fariin
    Haddii labada dhinac midkoodna aanu helin macluumaadka ku saabsan xaaladda farriimaha baxaya in muddo ah, waxa ay si cad uga codsan kartaa dhinaca kale:
    msgs_state_req#da69fb52 msg_ids:Vector long = MsgsStateReq;
  • Farriinta Xogta ee ku Saabsan Heerka Fariimaha
    msgs_state_info#04deb57d req_msg_id:long info:string = MsgsStateInfo;
    Halkan, info waa xadhig ka kooban hal bayt oo heerka fariin ah fariin kasta oo ka socota liiska msg_ids ee soo socda:

    • 1 = waxba lagama garanayo fariinta
    • 2 = fariinta aan la helin (msg_id waxay ku dhacdaa inta u dhaxaysa tirada aqoonsiga la kaydiyay; si kastaba ha ahaatee, dhinaca kale hubaal ma helin fariin caynkaas ah)
    • 3 = fariinta lama helin (msg_id aad u saraysa, si kastaba ha ahaatee, kooxda kale wali ma helin)
    • 4 = fariin la helay (ogow in jawaabtani ay sidoo kale isla wakhtigaas tahay qirasho rasiidh ah)
    • +8 = fariin hore loo aqoonsaday
    • +16 = fariin aan u baahnayn qirasho
    • +32 = Weydiinta RPC ee ku jirta fariinta la farsamaynayo ama la habeeyey mar horeba
    • +64 = jawaabta la xidhiidha nuxurka fariinta hore loo soo saaray
    • +128 = qolo kale xaqiiqdii way garanaysaa in farriinta la helay
      Jawaabtaasi uma baahna qirasho. Waa qirashada msgs_state_req ee khuseeya, gudaha iyo nafteedaba.
      Ogow haddii ay si lama filaan ah u soo baxdo in qolada kale aysan haysan fariin u eg in loo soo diray, fariinta si fudud ayaa dib loo soo diri karaa. Xitaa haddii dhinaca kale uu helo laba nuqul oo fariinta isku mar ah, nuqulka waa la iska indhatiraa. (Haddii wakhti badan uu dhaafay, oo msg_id-kii asalka ahaa aanu shaqaynayn, fariinta waa in lagu duuduubaa msg_copy).
  • Isgaarsiin ikhtiyaari ah ee heerka fariimaha
    Labada dhinac midkoodna wuxuu si ikhtiyaari ah u ogeysiin karaa dhinaca kale heerka ay marayaan fariimaha dhinaca kale uu gudbiyay.
    msgs_all_info#8cc0d131 msg_ids:Vector long info:string = MsgsAllInfo
  • Kordhinta Isgaadhsiinta Mutadawacnimada ah ee Xaaladda Hal Farriin
    ...
    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;
  • Codsi cad oo dib loogu dirayo fariimaha
    msg_resend_req#7d861a08 msg_ids:Vector long = MsgResendReq;
    Xisbiga fogfog ayaa isla markiiba ka jawaabaya isagoo dib u diraya fariimaha la codsaday […]
  • Codsi cad oo dib loogu soo dirayo jawaabaha
    msg_resend_ans_req#8610baeb msg_ids:Vector long = MsgResendReq;
    Xisbiga fogfog ayaa isla markiiba ka jawaaba dib u soo diri jawaabaha farriimaha la codsaday […]
  • Nuqullada Farriinta
    Xaaladaha qaarkood, fariin hore oo wata msg_id oo aan hadda shaqaynayn ayaa loo baahan yahay in dib loo soo diro. Kadibna, waxaa lagu duuduubay weel nuqul ah:
    msg_copy#e06046b2 orig_message:Message = MessageCopy;
    Marka la helo, fariinta waxaa loo farsameeyaa sidii haddii duubka uusan meesha ku jirin. Si kastaba ha ahaatee, haddii si dhab ah loo ogaado in fariinta orig_message.msg_id la helay, markaas fariinta cusub lama hawlgelin (iyadoo isla mar ahaantaana, it iyo Orig_message.msg_id la aqoonsan yahay). Qiimaha orig_message.msg_id waa inuu ka hooseeyaa weelka msg_id.

Xataa aan ka aamusno waxa msgs_state_info mar labaad dhegaha TL ee aan dhammayn ayaa soo baxaysa (waxaan u baahanahay vector of bytes, iyo labada qaybood ee hoose waxaa jiray tiro ah, labada sare ee sarena waxaa jiray calan). Ujeedku waa ka duwan yahay. Ma jiraa qof fahmay sababta waxaas oo dhan ay ugu dhaqmaan? macmiilka dhabta ah lagama maarmaanka ah? Laakiin halkan codsiyada ayaa lagu sharaxay safar wareeg ah.

Waxay raacdaa in qolo kastaa aysan kaliya qarin oo dirin fariimaha, laakiin sidoo kale kaydin xogta naftooda ku saabsan, jawaabaha iyaga, waqti aan la garanayn. Dukumeentigu ma qeexayo midkood waqtiyada ama ku-dhaqanka la taaban karo ee sifooyinkan. maya. Waxa ugu yaabka badan waa in dhab ahaantii loo isticmaalo koodhka macaamiisha rasmiga ah! Sida muuqata waxaa loo sheegay wax aan lagu darin waraaqaha dadweynaha. Ka fahma koodka sababta, hadda uma fududa sida kiiska TL - maaha qayb (xilli ahaan) qayb macquul ah oo go'doonsan, laakiin qayb ku xidhan qaab dhismeedka codsiga, i.e. waxay u baahan doontaa waqti aad u badan si loo fahmo code-ka codsiga.

Pings iyo waqtiyada Safafka

Laga soo bilaabo wax walba, haddii aan xasuusanno qiyaasaha ku saabsan qaab-dhismeedka server-ka (qaybinta codsiyada guud ahaan dhabarka), arrin murugo leh ayaa soo socota - in kasta oo dhammaan dammaanadaha gaarsiinta ee TCP (ama xogta la keeno, ama waxaa lagugu wargelin doonaa farqiga, laakiin xogta ayaa la soo gudbin doonaa ka hor intaanay dhibaatadu dhicin), xaqiijinta MProto lafteeda - dammaanad la'aan. Server-ku si sahal ah ayuu u lumin karaa ama u tuuri karaa fariintaada, waxna lagama qaban karo, kaliya isticmaal noocyo kala duwan oo biro ah.

Iyo marka hore - safafka fariinta. Hagaag, hal shay wax walba way iska cadayeen bilowgii hore - fariinta aan la xaqiijin waa in la kaydiyaa lagana cadhoodaa. Oo wakhtigee ka dib? Jesterkuna wuu garanayaa. Waxaa laga yaabaa in farriimaha adeegga balwadda leh ay si uun u xalliyaan dhibaatadan birta, waxaad tidhaahdaan, Telegram Desktop waxaa jira ilaa 4 saf oo u dhigma (laga yaabee in ka badan, sidii horeba loo sheegay, tan waxaad u baahan tahay inaad si dhab ah u dhex gasho koodka iyo qaab dhismeedka; isla Waqtiga, waan ognahay inaan loo qaadan karin muunad ahaan; tiro cayiman oo ka mid ah noocyada nidaamka MTProto laguma isticmaalo).

Maxay tani u dhacaysaa? Malaha, barnaamij-sameeyayaasha server-yadu way awoodi waayeen inay xaqiijiyaan isku halaynta gudaha kutlada, ama xittaa bakhtiyayaasha dheelitirka hore, waxayna u wareejiyeen dhibaatadan macmiilka. Niyad-xumo darteed, Vasily wuxuu isku dayay inuu hirgeliyo ikhtiyaar kale, oo leh laba saf oo keliya, isagoo isticmaalaya algorithms ka TCP - ku cabbiraya RTT server-ka iyo hagaajinta cabbirka "daaqadda" (farimaha) iyadoo ku xiran tirada codsiyada aan la xaqiijin. Taasi waa, heuristic qallafsan oo kale oo lagu qiimeeyo culeyska server-ka ayaa ah inta codsiyadeena ay ku qayilaan karto isku mar oo aan lumin.

Hagaag, taasi waa, waad fahantay, sax? Haddii ay tahay inaad mar kale ku dhaqangeliso TCP korka borotokoolka kor u kaca TCP, tani waxay muujinaysaa hab-maamuus aad u liidata.

Haa, maxaad ugu baahan tahay in ka badan hal saf, oo maxay tani uga dhigan tahay qofka la shaqaynaya API-ga sare si kastaba? Fiiri, waxaad samaysaa codsi, si taxane ah u samee, laakiin badanaa isla markiiba ma diri kartid. Waa maxay sababtu? Sababtoo ah jawaabtu waxay noqon doontaa msg_id, oo ku meel gaar ahаAnigu waxaan ahay sumad, hawshiisu sida ugu fiican dib loo dhigo ilaa inta ugu badan ee suurtogalka ah - waa haddii ay dhacdo in server-ku diido sababtoo ah waqti isku mid ah oo naga dhexeeya annaga iyo isaga (dabcan, waxaan samayn karnaa qolof ah oo waqtigeena ka beddelaya hadda. server-ka adoo ku daraya delta laga soo xisaabiyay jawaabaha server-ka - macaamiisha rasmiga ah ayaa tan sameeya, laakiin waa cayriin oo aan sax ahayn sababtoo ah buffering). Sidaa darteed, marka aad codsi ka samaynayso wicitaan shaqo maxalli ah oo maktabadda, farriintu waxay maraysaa marxaladaha soo socda:

  1. Waxay ku jirtaa hal saf waxayna sugaysaa sirta
  2. la magacaabay msg_id oo fariintu waxay aaday saf kale - gudbin suurtagal ah; u dir godka.
  3. a) Adeegaha ayaa u jawaabay MsgsAck - fariinta waa la keenay, waxaanu ka tirtirnay "kuyuuga kale".
    b) Ama lid ku ah, ma uusan jeclayn wax, wuxuu ku jawaabay badmsg - dib uga soo dir "kuyuu kale"
    c) Waxba lama garanayo, fariintu waxay u baahan tahay in saf kale laga cadhoodo - laakiin goorta saxda ah lama garanayo.
  4. Seerfarkii ayaa ugu dambayntii ku jawaabay RpcResult - jawaabta dhabta ah (ama qaladka) - ma aha oo kaliya in la keeno, laakiin sidoo kale laga baaraandegay.

Malaha, isticmaalka weelasha qayb ahaan waxay xallin karaan dhibaatada. Tani waa marka farriimaha fara badan la soo ururiyo, oo server-ku uu hal mar ka wada jawaabay xaqiijinta dhammaantood, hal mar. msg_id. Laakiin sidoo kale wuu diidi doonaa xirmadan, haddii ay wax khaldameen, gabi ahaanba.

Halkaa marka ay marayso tixgalin aan farsamo ahayn ayaa soo galaysa. Laga soo bilaabo waayo-aragnimada, waxaan aragnay kabo badan, iyo marka lagu daro, waxaan hadda arki doonaa tusaalooyin badan oo talo xumo ah iyo qaab dhismeedka - xaaladahan oo kale, miyay mudan tahay in la aamino oo la sameeyo go'aamo noocaas ah? Su'aashu waa halqabsi (dabcan maaha).

Maxaan ka hadlaynaa? Haddii mawduuca "farriimaha daroogada ee ku saabsan fariimaha" aad weli ku qiyaasi karto diidmo sida "doqon baad tahay, ma aadan fahmin qorshahayaga quruxda badan!" (sidaas darteed qor dukumeenti marka hore, sida dadka caadiga ah ay tahay, oo leh caqli-gal iyo tusaalayaal baakidh beddelasho ah, ka dibna waan hadli doonaa), ka dibna waqtiyada / waqtiyada waa su'aal dhab ah oo la taaban karo oo gaar ah, wax kasta oo halkan ah ayaa la yaqaan muddo dheer. Maxay dukumeentiyadu nooga sheegaan wakhtiyada?

Adeeguhu inta badan waxa uu qiraa helitaanka fariinta macmiilka (sida caadiga ah, waydiinta RPC) isaga oo isticmaalaya jawaabta RPC. Haddii ay jawaabtu tahay wakhti dheer oo soo socda, server-ku waxa uu marka hore soo diri karaa warqad qirasho ah, iyo in yar ka dib, jawaabta RPC lafteeda.

Macmiilku waxa uu si caadi ah u qiraa helitaanka fariinta server-ka (sida caadiga ah, jawaabta RPC) isagoo ku daraya qirashada su'aasha RPC ee soo socota haddii aan la gudbin goor dambe (haddii la soo saaro, dheh, 60-120 ilbiriqsi ka dib rasiidka fariin ka timid server-ka). Si kastaba ha noqotee, haddii muddo dheer aysan jirin sabab loogu diro farriimaha server-ka ama haddii ay jiraan tiro badan oo farriimo ah oo aan la aqoonsan oo ka imanaya server-ka (dheh, in ka badan 16), macmiilku wuxuu gudbiyaa qirasho kaligiis ah.

... Waxaan turjumay: annagu nafteena ma naqaano inta iyo sida aan ugu baahanahay, markaa aan u qaadanno in ay sidan noqoto.

Iyo ku saabsan pings:

Fariimaha Ping (PING/PONG)

ping#7abe77ec ping_id:long = Pong;

Jawaabta inta badan waxaa lagu soo celiyaa isku xirnaanshaha:

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

Fariimahani uma baahna qiraal. Pong waxaa lagu kala qaadaa oo kaliya jawaabta ping halka ping uu bilaabi karo labada dhinac.

Xiritaanka Xidhiidhka Dib loo dhigay + PING

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

Wuxuu u shaqeeyaa sida ping. Intaa waxaa dheer, ka dib marka tan la helo, server-ku wuxuu bilaabayaa saacad kaas oo xiri doona xiriirka hadda jira disconnect_delay ilbiriqsiyo ka dib ilaa uu helo fariin cusub oo isku mid ah taas oo si toos ah dib u dejisa dhammaan saacadihii hore. Haddii macmiilku soo diro pings-kan hal mar 60-kii ilbiriqsi kasta, tusaale ahaan, waxa ay dejin kartaa disconnect_delay oo la mid ah 75 ilbiriqsi.

Ma waalantahay?! 60 ilbiriqsi gudahood, tareenku waxa uu soo gali doonaa saldhiga, ka dagi doona oo qaadi doona rakaabka, waxa uuna mar kale lumin doonaa xidhiidhka tunnelka. 120 ilbiriqsi gudahood, markaad maqasho, waxay imaan doontaa mid kale, waxayna u badan tahay in xiriirku jabo. Hagaag, way caddahay halka lugaha ay ka imanayaan - "Waxaan maqlay dhawaaq, laakiin ma garanayo meesha ay ku taal", waxaa jira Nagl algorithm iyo ikhtiyaarka TCP_NODELAY, oo loogu talagalay shaqada isdhexgalka. Laakin, iga raali noqo, xaji qiimihiisii ​​caadiga ahaa - 200 Milliilbiriqsi Haddii aad runtii rabto inaad sawirto wax la mid ah oo aad ku badbaadiso dhowr baakidh oo suurtagal ah, ka dib dhig 5 ilbiriqsi, ama wax kasta oo "Isticmaalku wax buu qorayaa..." fariintu hadda waa dhammaatay. Laakiin mar dambe ma jirto.

Ugu dambeyntiina, pings. Taasi waa, hubinta noolaanshaha xidhiidhka TCP. Waa wax lagu qoslo, laakiin qiyaastii 10 sano ka hor waxaan ka qoray qoraal xasaasi ah oo ku saabsan farriinta qolka jiifka ee kuliyadayada - qorayaasha halkaas ku sugan ayaa sidoo kale ka soo galiyay server-ka macmiilka, oo aan liddi ku ahayn. Laakiin ardayda sanadka 3aad waa hal shay, xafiis caalami ahna waa mid kale, sax?..

Marka hore, barnaamij waxbarasho oo yar. Xidhiidhka TCP, maqnaanshaha baakidh beddelka, waxa uu noolaan karaa toddobaadyo. Tani waa labadaba wanaag iyo xumaan, iyadoo ku xiran ujeedada. Way fiicantahay haddii aad leedahay xiriir SSH ah oo u furan server-ka, aad ka soo kacday kumbuyuutarka, dib u cusbooneysiisay router-ka, ku soo laabatay goobtaada - fadhiga server-kan lama dillaacin (waxba ma aadan qorin, ma jiraan baakado) , way ku habboon tahay. Way xun tahay haddii ay jiraan kumanaan macaamiil ah oo ku jira server-ka, mid kastaa wuxuu qaadanayaa agabka (hello, Postgres!), Martigeliyaha macmiilka ayaa laga yaabaa inuu dib u bilaabay wakhti dheer ka hor - laakiin garan mayno.

Nidaamyada Chat/IM waxay ku dhacaan kiiska labaad hal sabab oo dheeraad ah dartood - statuses online. Haddii isticmaaluhu “ka dhaco”, waxaad u baahan tahay inaad la socodsiiso wada-hawlgalayaashiisa arrintan. Haddii kale, waxaad ku dhamaan doontaa qalad ay sameeyeen abuurayaasha Jabber (oo la saxay 20 sano) - isticmaaluhu wuu go'ay, laakiin waxay sii wadaan inay u qoraan farriimaha isaga, iyagoo aaminsan inuu internetka ku jiro (kaas oo sidoo kale si buuxda u lumay kuwan. dhowr daqiiqo ka hor inta aan la ogaanin xiriirka). Maya, ikhtiyaarka TCP_KEEPALIVE, oo dad badan oo aan fahmin sida ay u shaqeeyaan saacadaha TCP waxay u tuuraan si aan kala sooc lahayn (iyaga oo dejinaya qiyamka duurjoogta ah sida tobanaan ilbiriqsi), halkan kuma caawin doonto - waxaad u baahan tahay inaad hubiso inaysan ahayn kaliya kernel OS. Mashiinka isticmaaluhu waa nool yahay, laakiin sidoo kale si caadi ah ayuu u shaqeynayaa, awood u leh inuu ka jawaabo, iyo codsiga laftiisa (ma waxaad u maleyneysaa inaysan barafeynin? Telegram Desktop on Ubuntu 18.04 ayaa ii qaboojiyey in ka badan hal mar).

Taasi waa sababta aad u leedahay ping server macmiilka, oo aan lid ku ahayn - haddii macmiilku sidan sameeyo, haddii xidhiidhka la gooyo, ping-ka lama gaarsiin doono, hadafka lama gaari doono.

Maxaan ku aragnaa Telegram? Dhab ahaantii waa caksi! Hagaag, taasi waa. Si rasmi ah, dabcan, labada dhinacba way isku dhufan karaan. Ficil ahaan, macaamiishu waxay isticmaalaan jilbis ping_delay_disconnect, kaas oo dejinaya saacada server-ka. Hagaag, iga raali noqo, maahan in macmiilku go'aansado inta uu rabo inuu ku noolaado halkaas oo aan lahayn ping. Server-ku, oo ku salaysan culayskiisa, ayaa si fiican u yaqaan. Laakiin, dabcan, haddii aadan dan ka lahayn kheyraadka, markaa waxaad noqon doontaa Pinocchio xumaantaada, iyo qoloftu waxay sameyn doontaa ...

Sidee bay ahayd in loo qaabeeyo?

Waxaan aaminsanahay in xaqiiqooyinka kor ku xusan ay si cad u muujinayaan in kooxda Telegram/VKontakte aysan aad ugu filneyn dhinaca gaadiidka (iyo hoose) ee shabakadaha kombiyuutarada iyo shahaadooyinkooda hoose ee arrimaha khuseeya.

Maxay u noqotay mid aad u adag, sideese naqshadeeyayaasha Telegram-ku isku dayi karaan inay diidaan? Xaqiiqda ah in ay isku dayeen in ay sameeyaan fadhi ka badbaaday isku xirka TCP, ie, waxa aan hadda la bixin, waan soo gudbin doonaa mar dambe. Waxay u badan tahay inay sidoo kale isku dayeen inay sameeyaan gaadiidka UDP, laakiin waxay la kulmeen dhibaatooyin oo way ka tageen (taasi waa sababta dukumeentigu madhan yahay - ma jirin wax lagu faano). Laakiin sababta oo ah faham la'aanta sida shabakadaha guud ahaan iyo TCP ay si gaar ah u shaqeeyaan, halkaas oo aad ku tiirsanaan karto, iyo meesha aad u baahan tahay inaad adigu sameyso (iyo sida), iyo isku day inaad tan ku darsato cryptography "laba shimbirood oo leh hal dhagax”, tani waa natiijada.

Sidee loo baahnaa? Iyada oo ku saleysan xaqiiqda msg_id waa shaabad wakhti lagama maarmaan ah marka laga eego aragtida kriptography si looga hortago weerarrada soo noqnoqda, waa qalad in lagu lifaaqo shaqo aqoonsi gaar ah. Sidaa darteed, iyada oo aan si aasaasi ah loo beddelin qaab dhismeedka hadda jira (marka qulqulka Cusboonaysiinta la soo saaro, taasi waa mawduuc heer sare ah oo API ah qayb kale oo ka mid ah qoraalladan taxanaha ah), mid ayaa u baahan doona:

  1. Server-ka haya xidhiidhka TCP ee macmiilka ayaa qaadaya mas'uuliyadda - haddii uu ka akhriyay godka, fadlan ogow, socodsiiso ama soo celi khalad, khasaare ma leh. Markaas xaqiijinta ma aha vector of ids, laakiin si fudud "ugu dambeeyey helay seq_no" - kaliya tiro, sida TCP (laba lambar - aad seq iyo mid la xaqiijiyay). Had iyo jeer waxaan ku jirnaa fadhiga, ma aha?
  2. Jadwalka wakhtiga si looga hortago weerarrada ku celiska ah waxay noqotaa garoon gaar ah, la nonce. Waa la hubiyaa, laakiin ma saamayso wax kale. Ku filan iyo uint32 - Haddii milixdeenu isbedesho ugu yaraan nuskii maalin kasta, waxaan u qoondeyn karnaa 16 bits jajabyada hoose ee qayb ka mid ah qayb ka mid ah wakhtiga hadda, inta soo hartay - qayb jajab ah oo ah ilbiriqsi (sida hadda ah).
  3. Laga saaray msg_id at dhan - laga soo bilaabo aragtida kala soocidda codsiyada on backends, waxaa jira, marka hore, id macmiilka, iyo marka labaad, id kalfadhiga, iyaga concatenate. Sidaas awgeed, hal shay ayaa ku filan aqoonsi ahaan codsi ahaan seq_no.

Tani sidoo kale maaha doorashada ugu guusha badan; random dhamaystiran wuxuu u adeegi karaa aqoonsi ahaan - tan waxaa horeyba loogu sameeyay API-ga heerka sare ah marka fariinta la dirayo, jidka. Way fiicnaan lahayd in gebi ahaanba dib loo sameeyo qaab-dhismeedka laga soo bilaabo qaraabo ilaa dhammaystiran, laakiin tani waa mawduuc qayb kale, maaha boostadan.

API?

Ta-daam! Markaa, annagoo ku dhibtoonnay waddo xanuun iyo jeexjeex ka buuxo, waxaan ugu dambeyntii awoodnay inaan u dirno codsi kasta server-ka oo aan helno jawaabo kasta, sidoo kale waxaan ka helnaa cusbooneysiinta server-ka (ma ahan jawaab celin codsi, laakiin lafteeda noo soo dira, sida PUSH, haddii qof ay sidaas u caddahay).

Fiiro gaar ah, hadda waxaa jiri doona tusaalaha kaliya ee Perl ee maqaalka! (kuwa aan aqoon u lahayn syntax, doodda koowaad ee barakada waa qaab-dhismeedka xogta shayga, ka labaadna waa fasalka):

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

Haa, maaha qaswade ula kac ah - haddii aadan weli akhrin, sii wad oo samee!

Oh, way~~... kani sidee buu u eg yahay? Wax aad loo yaqaan

Hadaba sidaan ayay noqotay... waa maxay sxb? hadda bilaabay?... Miyayna JSON ka badan HTTPS ka fududaan lahayn?! Maxaan ku bedelnay? Dedaalku ma mudnaa?

Aynu qiimayno waxa TL+MTProto na siisay iyo waxa beddelka ah ee suurtogalka ah. Hagaag, HTTP, kaas oo diiradda saaraya qaabka jawaabta-codsiga, waa taam xun, laakiin ugu yaraan wax ka sarreeya TLS?

Taxane is haysta. Markaan arkay qaab-dhismeedka xogtan, oo la mid ah JSON, waxaan xusuustaa inay jiraan noocyo laba-jibaaran ah oo ka mid ah. Aan u calaamadeyno MsgPack mid aan ku filneyn in la fidiyo, laakiin waxaa jira, tusaale ahaan, CBOR - habka, halbeeg lagu sifeeyay RFC 7049. Waxaa xusid mudan xaqiiqda ay qeexayso tags, sida habka ballaarinta, iyo ka mid ah mar hore la habeeyey la heli karo:

  • 25 + 256 - Beddelida khadadka soo noqnoqda iyadoo la tixraacayo lambarka khadka, sida habka cadaadiska jaban
  • 26 - shay Perl taxane ah oo leh magaca fasalka iyo doodaha dhisaha
  • 27 - Shayga ka madaxbannaan luqadda oo taxane ah oo leh magaca nooca iyo doodaha dhisaha

Hagaag, waxaan isku dayay in aan xogta isku mid ah ku sameeyo TL iyo CBOR iyada oo xadhiga iyo xidhidhiyaha shayga karti u yeeshay. Natiijadu waxay bilawday inay ku kala duwanaato CBOR meel u jirta megabyte:

cborlen=1039673 tl_len=1095092

Sidaas gabagabeyn: Waxaa jira qaabab aad u fudud oo aan hoos iman dhibaatada wada shaqayn la'aanta ama aqoonsi aan la garanayn, oo leh hufnaan la mid ah.

Aasaaska xidhiidhka degdega ah. Tani waxay ka dhigan tahay eber RTT ka dib dib-u-xidhka (marka furaha mar hore la sameeyay) - lagu dabaqi karo fariinta MTProto ee ugu horeysay, laakiin qaar ka mid ah boos celin - ku dhufo milix isku mid ah, fadhigu ma qudhun, iwm. Maxay TLS noo siisaa beddelkeeda? Xigasho mowduuca:

Markaad isticmaalayso PFS gudaha TLS, tigidhada fadhiga TLS (RFC 5077) in dib loo bilaabo fadhi qarsoodi ah iyada oo aan dib-u-gorgortanka furayaasha iyo iyada oo aan lagu kaydin macluumaadka muhiimka ah ee server-ka. Marka la furo isku xirka ugu horreeya oo abuuraya furayaasha, server-ku wuxuu sireeyaa xaaladda xiriirka wuxuuna u gudbiyaa macmiilka (qaabka tigidhka fadhiga). Sidaa darteed, marka isku xirka dib loo bilaabo, macmiilku wuxuu soo diraa tigidh fadhiga, oo ay ku jiraan furaha fadhiga, dib ugu noqda server-ka. Tigidhka laftiisa waxa lagu sireeyay fure ku meel gaadh ah (furaha tigidhka fadhiga), kaas oo lagu kaydiyay seerfarka oo waa in loo qaybiyaa dhammaan adeegayaasha hore ee SSL ee xalal isku dhafan.[10]. Markaa, hordhaca tigidhka kalfadhiga waxa laga yaabaa inuu jabiyo PFS haddii furayaasha server-ka ku meel gaadhka ah la jabiyo, tusaale ahaan, marka ay kaydsan yihiin wakhti dheer (OpenSSL, nginx, Apache iyaga ku kaydi si caadi ah muddada barnaamijka oo dhan; goobaha caanka ah ayaa isticmaala furaha dhowr saacadood, ilaa maalmo).

Halkan RTT maaha eber, waxaad u baahan tahay inaad beddesho ugu yaraan ClientHello iyo ServerHello, ka dib markaa macmiilku wuxuu soo diri karaa xogta oo ay weheliso dhammayn. Laakiin halkan waa in aan xasuusannaa in aynaan haysan Websaydhyo, oo leh xidhidhooyin cusub oo la furay, laakiin farriinta, xidhiidhka kaas oo inta badan ah mid iyo in ka badan ama ka yar, codsiyada gaaban ee bogagga shabakadda - wax walba waa la badiyaa. gudaha. Taasi waa, waa wax la aqbali karo haddii aynaan la kulmin qaybta tareenka dhulka hoostiisa mara ee aad u xun.

Wax kale ma illowday? Ku qor faallooyinka

In la sii wado!

Qaybta labaad ee qoraalkan taxanaha ah waxaan tixgelin doonaa ma aha farsamo, laakiin arrimaha ururka - hababka, fikradda, interface, dabeecadda ku wajahan isticmaalayaasha, iwm. Iyadoo lagu saleynayo, si kastaba ha ahaatee, xogta farsamada ee halkan lagu soo bandhigay.

Qaybta saddexaad waxay sii wadi doontaa falanqaynta qaybta farsamada / waayo-aragnimada horumarinta. Waxaad baran doontaa, gaar ahaan:

  • sii wadida pandemonium oo leh noocyo kala duwan oo TL ah
  • waxyaabo aan la garanayn oo ku saabsan kanaalada iyo kooxaha super
  • maxaa wada hadalku uga daran yahay liiska
  • ku saabsan fariinta saxda ah vs qaraabada wax ka qabashada
  • waa maxay farqiga u dhexeeya sawirka iyo sawirka
  • sida emoji u farageliyo qoraalka farta leh

iyo kuwa kale! La soco!

Source: www.habr.com

Add a comment