Kutsutsa kwa protocol ndi njira zamagulu a Telegraph. Gawo 1, luso: luso polemba kasitomala kuyambira poyambira - TL, MT

Posachedwapa, zolemba za momwe Telegalamu ilili yabwino, momwe abale a Durov ali anzeru komanso odziwa zambiri pomanga makina ochezera a pa Intaneti, ndi zina zotero zayamba kuonekera nthawi zambiri pa Habré. Nthawi yomweyo, anthu owerengeka adadzilowetsa muukadaulo - makamaka, amagwiritsa ntchito njira yosavuta (komanso yosiyana kwambiri ndi MTProto) Bot API yozikidwa pa JSON, ndipo nthawi zambiri amangovomereza. pa chikhulupiriro matamando onse ndi PR zomwe zimazungulira mthenga. Pafupifupi chaka ndi theka chapitacho, mnzanga ku Eshelon NGO Vasily (mwatsoka, akaunti yake pa Habré inafufutidwa pamodzi ndi kulembedwa) anayamba kulemba wake Telegram kasitomala kuchokera zikande ku Perl, ndipo kenako wolemba mizere imeneyi analowa. Chifukwa chiyani Perl, ena amafunsa nthawi yomweyo? Chifukwa ntchito zoterezi zilipo kale m'zinenero zina. Ndipotu izi siziri choncho, pangakhale chinenero china chomwe palibe. okonzeka zopangidwa laibulale, ndipo moyenerera wolembayo ayenera kupita njira yonse kuyambira pachiyambi. Komanso, cryptography ndi nkhani yodalirika, koma tsimikizirani. Ndi chinthu chomwe chimayang'ana chitetezo, simungangodalira laibulale yopangidwa kale kuchokera kwa wopanga ndikuyikhulupirira mwachimbulimbuli (komabe, uwu ndi mutu wa gawo lachiwiri). Pakadali pano, laibulale imagwira ntchito bwino pamlingo wa "average" (imakulolani kuti mupange zopempha zilizonse za API).

Komabe, sipadzakhala ma cryptography kapena masamu ambiri pamndandanda uno. Koma padzakhala zina zambiri zaukadaulo ndi ndodo zomanga (zothandizanso kwa omwe sangalembe kuyambira pachiwonetsero, koma adzagwiritsa ntchito laibulale m'chinenero chilichonse). Choncho, cholinga chachikulu chinali kuyesa kukhazikitsa kasitomala kuyambira pachiyambi malinga ndi zolembedwa zovomerezeka. Ndiye kuti, tiyeni tiyerekeze kuti gwero lamakasitomala ovomerezeka latsekedwa (kachiwiri, mu gawo lachiwiri tifotokoza mwatsatanetsatane mutu wakuti izi ndi zoona. zimachitika kotero), koma, monga m'masiku akale, mwachitsanzo, pali muyezo ngati RFC - ndizotheka kulemba kasitomala molingana ndi zomwe afotokozedwera yekha, "popanda kuyang'ana" pa code source, zikhale zovomerezeka (Telegraph Desktop, mobile), kapena Telethon yosavomerezeka?

M'ndandanda wazopezekamo:

Zolemba ... zilipo, sichoncho? Ndizoona?..

Zidutswa za zolemba za nkhaniyi zinayamba kusonkhanitsidwa chilimwe chatha. Nthawi yonseyi patsamba lovomerezeka https://core.telegram.org Zolembazo zinali ngati za Layer 23, i.e. anakakamira kwinakwake mu 2014 (kumbukirani, panalibe ngakhale mayendedwe kalelo?). Zachidziwikire, izi zikanatilola kuti tigwiritse ntchito kasitomala ndi magwiridwe antchito panthawiyo mu 2014. Koma ngakhale mu dziko lino, zolembedwazo zinali, poyamba, zosakwanira, ndipo kachiwiri, m'malo ena zimatsutsana. Kupitilira mwezi umodzi wapitayo, mu Seputembara 2019, zinali mwa mwayi Zinadziwika kuti panali kusintha kwakukulu kwa zolemba pa tsambalo, kwa Layer 105 yaposachedwa, ndi cholemba kuti tsopano zonse ziyenera kuwerengedwanso. Zoonadi, nkhani zambiri zinasinthidwa, koma zambiri sizinasinthe. Chifukwa chake, powerenga zotsutsa zomwe zili pansipa za zolembedwazi, muyenera kukumbukira kuti zina mwazinthuzi sizilinso zofunikira, koma zina zikadalibe. Ndipotu, zaka 5 mu dziko lamakono si nthawi yaitali, koma kwambiri zambiri za. Kuyambira nthawi imeneyo (makamaka ngati simuganizira za malo otayidwa ndi kutsitsimutsidwa a geochat kuyambira pamenepo), chiwerengero cha njira za API mu chiwembu chakula kuchokera pa zana kupita kupitirira mazana awiri ndi makumi asanu!

Kodi mungayambire kuti ngati wolemba wachinyamata?

Ziribe kanthu kaya mumalemba kuchokera koyambirira kapena kugwiritsa ntchito, mwachitsanzo, malaibulale okonzeka ngati Telethon ya Python kapena Madeline kwa PHP, mulimonse, muyenera choyamba lembani ntchito yanu - kupeza magawo api_id и api_hash (omwe agwira ntchito ndi VKontakte API nthawi yomweyo amamvetsetsa) momwe seva imazindikirira pulogalamuyi. Izi yenera ku zichitani pazifukwa zamalamulo, koma tikambirana zambiri chifukwa chake olemba laibulale sangathe kuzifalitsa mu gawo lachiwiri. Mutha kukhutitsidwa ndi mayeso oyeserera, ngakhale ali ochepa kwambiri - chowonadi ndi chakuti tsopano mutha kulembetsa chimodzi chokha app, kotero musathamangire molunjika momwemo.

Tsopano, kuchokera pamalingaliro aukadaulo, tiyenera kukhala ndi chidwi ndi mfundo yakuti titatha kulembetsa tiyenera kulandira zidziwitso kuchokera ku Telegraph zokhudzana ndi zosintha zamakalata, protocol, ndi zina. Ndiko kuti, wina angaganize kuti malo omwe ali ndi ma doko adangosiyidwa ndikupitiriza kugwira ntchito makamaka ndi omwe anayamba kupanga makasitomala, chifukwa. ndizosavuta. Koma ayi, palibe chomwe chinawonedwa, palibe chidziwitso chinabwera.

Ndipo ngati mulemba kuyambira pachiyambi, ndiye kuti kugwiritsa ntchito magawo omwe mwapeza kudakali kutali. Ngakhale https://core.telegram.org/ ndikulankhula za iwo mu Chiyambi choyamba, kwenikweni, muyenera kukhazikitsa kaye MTProto protocol Koma ngati mudakhulupirira kamangidwe molingana ndi mtundu wa OSI kumapeto kwa tsambali kuti mufotokozere zambiri za protocol, ndiye kuti ndizopanda pake.

M'malo mwake, MTProto isanachitike komanso itatha, pamilingo ingapo nthawi imodzi (monga olumikizana ndi ma netiweki akunja omwe akugwira ntchito mu OS kernel amati, kuphwanya kosanjikiza), mutu waukulu, wowawa komanso wowopsa udzasokoneza ...

Binary serialization: TL (Type Language) ndi dongosolo lake, ndi zigawo, ndi mawu ena ambiri owopsa

Mutuwu, kwenikweni, ndiye chinsinsi chamavuto a Telegraph. Ndipo padzakhala mawu ambiri oyipa ngati mutayesa kufufuza.

Kotero, nachi chithunzicho. Ngati mawu awa abwera m'maganizo mwanu, nenani, JSON Schema, Munaganiza bwino. Cholinga chake ndi chofanana: chilankhulo china chofotokozera gulu lomwe lingathe kufalitsidwa. Apa ndi pamene kufanana kumathera. Ngati kuchokera patsamba MTProto protocol, kapena kuchokera pamtengo wamakasitomala, tiyesa kutsegula schema, tiwona ngati:

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;

Munthu akuwona izi kwa nthawi yoyamba adzatha kuzindikira gawo lokha la zomwe zalembedwa - chabwino, izi ndizopangidwe (ngakhale dzina liri kuti, kumanzere kapena kumanja?), Pali minda momwemo, pambuyo pake mtundu wina umatsatira pambuyo pa colon ... mwinamwake. Pano mumabulaketi amakona pali ma tempuleti monga C++ (kwenikweni, osati kwenikweni). Ndipo zizindikiro zina zonse zikutanthawuza chiyani, mafunso, zidziwitso, maperesenti, ma hashi (ndipo mwachiwonekere amatanthauza zinthu zosiyanasiyana m'malo osiyanasiyana), nthawi zina kupezeka ndipo nthawi zina osati, manambala a hexadecimal - ndipo koposa zonse, momwe mungapezere kuchokera ku izi. zolondola (zomwe sizidzakanidwa ndi seva) mtsinje wa byte? Muyenera kuwerenga zolembedwa (inde, pali maulalo ku schema mu mtundu wa JSON pafupi - koma sizimamveketsa bwino).

Tsegulani tsamba Binary Data seriization ndikulowa mudziko lamatsenga la bowa ndi masamu ang'onoang'ono, zofanana ndi matan m'chaka cha 4. Zilembo, mtundu, mtengo, combinator, chophatikizira chogwira ntchito, mawonekedwe wamba, mtundu wamagulu, mtundu wa polymorphic ... ndipo zonse ndi tsamba loyamba! Chotsatira chikukuyembekezerani Chilankhulo cha TL, zomwe, ngakhale zili kale ndi chitsanzo cha pempho laling'ono ndi kuyankha, sizipereka yankho konse kuzochitika zambiri, zomwe zikutanthauza kuti mudzayenera kudutsanso masamu omasuliridwa kuchokera ku Chirasha kupita ku Chingerezi pa ena asanu ndi atatu ophatikizidwa. masamba!

Owerenga omwe amadziwa zilankhulo zogwira ntchito komanso kutanthauzira kwamtundu wodziwikiratu adzawona chilankhulo chofotokozera m'chinenerochi, ngakhale kuchokera ku chitsanzo, chodziwika bwino, ndipo anganene kuti izi sizoyipa kwenikweni. Zotsutsa pa izi ndi:

  • inde cholinga zikumveka bwino, koma tsoka, iye sanakwaniritsidwe
  • Maphunziro ku mayunivesite aku Russia amasiyana ngakhale pakati pa akatswiri a IT - si onse omwe adatenga maphunzirowo
  • Pomaliza, monga momwe tidzaonera, muzochita izo ziri sizinayesedwe, popeza kagawo kakang'ono kokha ka TL komwe kafotokozedwe kakugwiritsidwa ntchito

Monga tanenera LeoNerd pa kanjira #perl mu netiweki ya FreeNode IRC, yemwe adayesa kukhazikitsa chipata kuchokera ku Telegraph kupita ku Matrix (kumasulira kwa mawuwo ndikolakwika pamtima):

Zimamveka ngati wina adadziwitsidwa kuti alembe chiphunzitso kwa nthawi yoyamba, adakondwera, ndikuyamba kuyesera kusewera nawo, osasamala kwenikweni ngati chinali chofunikira pochita.

Dziwoneni nokha, ngati kufunikira kwa mitundu yopanda kanthu (int, yayitali, ndi zina) ngati chinthu choyambirira sikubweretsa mafunso - pamapeto pake ziyenera kuchitidwa pamanja - mwachitsanzo, tiyeni tiyesetse kuzipeza. vekitala. Ndiko kuti, mndandanda, ngati mutatchula zinthuzo ndi mayina awo.

Koma kale

Kufotokozera mwachidule kagawo kakang'ono ka mawu a TL kwa iwo omwe samawerenga zolembedwa zovomerezeka

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;

Tanthauzo limayamba nthawi zonse wopanga, pambuyo pake posankha (muzochita - nthawizonse) kupyolera mu chizindikiro # ayenera kukhala CRC32 kuchokera pamalongosoledwe okhazikika amtunduwu. Kenako pamabwera kufotokozera kwa minda; ngati alipo, mtunduwo ukhoza kukhala wopanda kanthu. Izi zonse zimatha ndi chizindikiro chofanana, dzina la mtundu womwe womanga uyu - ndiye kuti, kwenikweni, subtype - ndi yake. Mnyamata yemwe ali kumanja kwa chizindikiro chofanana ndi polymorphic - ndiko kuti, mitundu ingapo yeniyeni ingagwirizane nayo.

Ngati kutanthauzira kumachitika pambuyo pa mzere ---functions---, ndiye kuti mawuwo adzakhalabe ofanana, koma tanthauzo lidzakhala losiyana: womanga adzakhala dzina la ntchito ya RPC, minda idzakhala magawo (chabwino, ndiye kuti, idzakhala yofanana ndendende, monga momwe tafotokozera pansipa. , izi zidzangokhala tanthauzo lopatsidwa), ndi "mtundu wa polymorphic" - mtundu wa zotsatira zobwezeredwa. Zowona, ikhalabe ya polymorphic - yongofotokozedwa mgawoli ---types---, koma womanga uyu "sadzaganiziridwa". Kudzaza mitundu ya ntchito zotchedwa ndi zotsutsana zawo, i.e. Pazifukwa zina, ntchito zingapo zokhala ndi dzina lomwelo koma masiginecha osiyanasiyana, monga mu C ++, sizinaperekedwe mu TL.

Chifukwa chiyani "womanga" ndi "polymorphic" ngati si OOP? Chabwino, m'malo mwake, kudzakhala kosavuta kuti wina aganizire za izi m'mawu a OOP - mtundu wa polymorphic ngati gulu losamveka, ndipo omanga ndi magulu ake achindunji, ndipo final m'mawu a zilankhulo zingapo. Ndipotu, ndithudi, pano kokha kufanana ndi njira zomangirira zodzaza ndi zilankhulo za OO. Popeza apa pali ma data okha, palibe njira (ngakhale kufotokozera kwa ntchito ndi njira zowonjezera zimatha kupanga chisokonezo m'mutu kuti zilipo, koma ndizosiyana) - mukhoza kuganiza za womanga ngati mtengo kuchokera. amene ikumangidwa lembani powerenga mtsinje wa byte.

Kodi izi zimachitika bwanji? The deserializer, yomwe nthawi zonse imawerenga ma byte 4, imawona mtengo wake 0xcrc32 - ndikumvetsetsa zomwe zidzachitike kenako field1 ndi mtundu int,ndi. amawerenga ndendende ma 4 mabayiti, pagawo ili pamwamba ndi mtundu PolymorType werengani. Amawona 0x2crc32 ndipo amamvetsa kuti pali minda iwiri patsogolo, choyamba long, kutanthauza kuti timawerenga 8 byte. Ndiyeno kachiwiri mtundu wovuta, womwe umachotsedwa mofananamo. Mwachitsanzo, Type3 akhoza kulengezedwa mu dera mwamsanga pamene omanga awiri, motero, ndiye ayenera kukumana 0x12abcd34, pambuyo pake muyenera kuwerenga 4 mabayiti ena int, kapena 0x6789cdef, pambuyo pake sipadzakhalanso kanthu. Chilichonse - muyenera kutaya chosiyana. Komabe, zitatha izi timabwereranso kuwerenga 4 byte int minda field_c в constructorTwo ndipo timamaliza kuwerenga zathu PolymorType.

Pomaliza, ngati mugwidwa 0xdeadcrc chifukwa constructorThree, ndiye zonse zimakhala zovuta kwambiri. Munda wathu woyamba ndi bit_flags_of_what_really_present ndi mtundu # - M'malo mwake, ichi ndi dzina chabe la mtunduwo nat, kutanthauza “nambala yachibadwa”. Izi ndiye kuti, int yosasainidwa ndi njira yokhayo pomwe manambala osasainidwa amapezeka m'mabwalo enieni. Chifukwa chake, chotsatira ndi chomanga chokhala ndi funso, kutanthauza kuti gawo ili - lidzakhalapo pawaya pokhapokha ngati gawo lolingana likhazikitsidwa pamunda womwe umatchulidwa (pafupifupi ngati woyendetsa ternary). Chifukwa chake, tiyerekeze kuti pang'ono izi zidakhazikitsidwa, zomwe zikutanthauza kuti tikuyenera kuwerenga gawo ngati Type, omwe mu chitsanzo chathu ali ndi 2 omanga. Imodzi ilibe kanthu (imangokhala ndi chizindikiritso), inayo ili ndi gawo ids ndi mtundu ids:Vector<long>.

Mutha kuganiza kuti ma tempulo ndi ma generic onse ali muzabwino kapena Java. Koma ayi. Pafupifupi. Izi chokhacho pogwiritsira ntchito mabakiti aang'ono m'mabwalo enieni, ndipo amagwiritsidwa ntchito pa Vector YOKHA. Mu mtsinje wa byte, awa adzakhala 4 CRC32 mabayiti a mtundu wa Vector wokha, wofanana nthawi zonse, kenako ma byte 4 - kuchuluka kwa zinthu zingapo, kenako zinthu izi zokha.

Onjezani izi ndikuti serialization imachitika nthawi zonse m'mawu a 4 byte, mitundu yonse ndi yochulukitsa - mitundu yomangidwamo imafotokozedwanso. bytes и string ndi kusanja kwamanja kwautali ndi kuyanjanitsa uku ndi 4 - chabwino, zikuwoneka ngati zomveka komanso zogwira mtima? Ngakhale TL imanenedwa kuti ndi njira yolumikizirana ndi binary, kugehena nawo, ndikukulitsa pafupifupi chilichonse, ngakhale zingwe za Boolean ndi zingwe zamtundu umodzi mpaka ma byte 4, kodi JSON idzakhala yokulirapo? Onani, ngakhale minda yosafunikira imatha kudumphidwa ndi mbendera pang'ono, chilichonse ndichabwino, komanso chokulirapo mtsogolo, bwanji osawonjezera magawo atsopano kwa omanga pambuyo pake?..

Koma ayi, ngati simuwerenga mafotokozedwe anga achidule, koma zolemba zonse, ndikuganiza za kukhazikitsa. Choyamba, CRC32 ya omanga imawerengedwa molingana ndi mzere wokhazikika wa mafotokozedwe a chiwembucho (chotsani malo oyera owonjezera, ndi zina zotero) - kotero ngati gawo latsopano likuwonjezedwa, mzere wofotokozera mtundu udzasintha, motero CRC32 yake ndi , chifukwa chake, serialization. Ndipo kasitomala wakaleyo akanatani ngati alandira munda wokhala ndi mbendera zatsopano, ndipo sakudziwa choti achite nawo pambuyo pake? ..

Chachiwiri, tiyeni tikumbukire CRC32, yomwe imagwiritsidwa ntchito pano makamaka ngati ntchito za hash kuti mudziwe mwapadera kuti (de) serialized. Pano tikukumana ndi vuto la kugunda - ndipo ayi, mwayi si umodzi mwa 232, koma waukulu kwambiri. Ndani amakumbukira kuti CRC32 idapangidwa kuti izindikire (ndi kukonza) zolakwika munjira yolumikizirana, ndikuwongolera zinthu izi kuvulaza ena? Mwachitsanzo, sizimasamala za kukonzanso ma byte: ngati muwerengera CRC32 kuchokera ku mizere iwiri, kachiwiri mumasintha ma byte 4 oyambirira ndi ma byte 4 otsatira - zidzakhala zofanana. Pamene zolembera zathu zili zingwe zochokera ku zilembo za Chilatini (ndi zopumira pang'ono), ndipo mayinawa sakhala mwachisawawa, kuthekera kwa kukonzanso koteroko kumawonjezeka kwambiri.

Mwa njira, ndani adafufuza zomwe zinalipo? kwenikweni CRC32 Chimodzi mwama code oyambira (ngakhale Waltman asanakhalepo) anali ndi ntchito ya hashi yomwe imachulukitsa munthu aliyense ndi nambala 239, okondedwa kwambiri ndi anthu awa, ha ha!

Pomaliza, chabwino, tidazindikira kuti omanga okhala ndi mtundu wamunda Vector<int> и Vector<PolymorType> adzakhala ndi CRC32 yosiyana. Nanga bwanji kuchita pa intaneti? Ndipo kuchokera kumalingaliro amalingaliro, kodi izi zimakhala gawo la mtunduwo? Tiyerekeze kuti tadutsa mndandanda wa nambala zikwi khumi, bwino Vector<int> zonse ndi zomveka, kutalika ndi zina 40000 mabayiti. Bwanji ngati izi Vector<Type2>, yomwe ili ndi gawo limodzi lokha int ndipo ili yokha mumtundu - kodi tiyenera kubwereza 10000xabcdef0 nthawi 34 ndiyeno 4 mabayiti int, kapena chinenero chimatha KUTITHANDIZA ife kuchokera kwa womanga fixedVec ndipo m'malo mwa ma byte 80000, sinthaninso 40000 yokha?

Ili si funso longoganiza chabe - taganizirani kuti mumalandira mndandanda wa ogwiritsa ntchito pagulu, aliyense wa iwo ali ndi id, dzina loyamba, dzina lomaliza - kusiyana kwa kuchuluka kwa deta yomwe imasamutsidwa pamalumikizidwe amafoni kungakhale kofunikira. Ndiko kuchita bwino kwa Telegraph serialization yomwe imalengezedwa kwa ife.

Ndiye…

Vector, yomwe sinatulutsidwe konse

Mukayesa kudutsa m'masamba ofotokozera ophatikiza ndi zina zotero, muwona kuti vekitala (komanso matrix) ikuyesera kuti itulutsidwe kudzera pamapepala angapo. Koma potsirizira pake amaiwala, sitepe yomaliza imadumphidwa, ndipo tanthauzo la vector limangoperekedwa, lomwe silinamangidwebe ku mtundu. Vuto ndi chiyani? M'zinenero mapulogalamu, makamaka zogwira ntchito, ndizodziwika bwino kufotokozera kapangidwe kake mobwerezabwereza - wophatikiza ndi kuunika kwake kwaulesi amamvetsetsa ndikuchita zonse payekha. M'chinenero kusanja deta zomwe zimafunika ndi KUGWIRITSA NTCHITO: ndizokwanira kufotokoza mophweka mndandanda,ndi. kapangidwe ka zinthu ziwiri - choyamba ndi chinthu cha data, chachiwiri ndi mawonekedwe omwewo kapena malo opanda kanthu a mchira (paketi) (cons) mu Lisp). Koma izi mwachiwonekere zidzafuna aliyense chinthu chimagwiritsa ntchito ma byte 4 owonjezera (CRC32 mu nkhani ya TL) kufotokoza mtundu wake. Gulu lingathenso kufotokozedwa mosavuta kukula kokhazikika, koma pankhani ya utali wosadziwika bwino pasadakhale, timachoka.

Chifukwa chake, popeza TL siyilola kutulutsa vekitala, idayenera kuwonjezeredwa pambali. Pamapeto pake zolembedwazo zimati:

Kusanjikiza nthawi zonse kumagwiritsa ntchito womanga yemweyo "vector" (const 0x1cb5c415 = crc32("vector t:Type # [ t ] = Vector t") zomwe sizidalira mtengo weniweni wa kusintha kwa mtundu wa t.

Mtengo wa chosankha chosankha t sichimakhudzidwa ndi kusanja chifukwa chimachokera ku mtundu wa zotsatira (zodziwika nthawi zonse zisanachitike deserialization).

Yang'anani mozama: vector {t:Type} # [ t ] = Vector t - koma palibe paliponse Tanthauzoli palokha silinena kuti nambala yoyamba iyenera kukhala yofanana ndi kutalika kwa vector! Ndipo sizichokera kulikonse. Izi ndizoperekedwa zomwe ziyenera kukumbukiridwa ndikugwiritsidwa ntchito ndi manja anu. Kwina konse, zolembedwazo zimanena moona mtima kuti mtunduwo si weniweni:

Vector t polymorphic pseudotype ndi "mtundu" womwe mtengo wake ndi mndandanda wamakhalidwe amtundu uliwonse t, wokhala ndi bokosi kapena wopanda kanthu.

... koma osayang'ana pa izo. Mukatopa ndikudutsa masamu (mwinanso odziwika kwa inu kuchokera ku maphunziro aku yunivesite), mwaganiza zosiya ndikuyang'ana momwe mungagwirire nawo ntchito, malingaliro omwe atsala m'mutu mwanu ndikuti izi ndizovuta kwambiri. Masamu pachimake, adapangidwa momveka bwino ndi Cool People (akatswiri a masamu awiri - wopambana wa ACM), osati aliyense. Cholinga - kudziwonetsera - chakwaniritsidwa.

Mwa njira, za nambala. Tiye tikukumbutseni zimenezo # ndi mawu ofanana nat, Nambala Yachilengedwe:

Pali mitundu ya mawu (mtundu-expr) ndi manambala (nat-expr). Komabe, amafotokozedwa chimodzimodzi.

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

koma mu galamala amafotokozedwa mofanana, i.e. Kusiyanaku kuyenera kukumbukiridwanso ndikuyika kukhazikitsidwa pamanja.

Chabwino, inde, mitundu ya ma template (vector<int>, vector<User>) kukhala ndi chizindikiritso chofanana (#1cb5c415), ndi. ngati mukudziwa kuti kuyitana kumalengezedwa ngati

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

ndiye simukudikirira vekitala chabe, koma vekitala ya ogwiritsa ntchito. Ndendende, ayenera dikirani - mu code yeniyeni, chinthu chilichonse, ngati sichopanda kanthu, chidzakhala ndi womanga, ndipo m'njira yabwino pakukhazikitsa zikanakhala zofunikira kuyang'ana - koma tinatumizidwa ndendende muzinthu zonse za vector iyi. mtundu umenewo? Bwanji ngati ukanakhala mtundu wina wa PHP, momwe gulu likhoza kukhala ndi mitundu yosiyanasiyana muzinthu zosiyanasiyana?

Panthawiyi mumayamba kuganiza - kodi TL ndiyofunikira? Mwinamwake kwa ngolo zikanakhala zotheka kugwiritsa ntchito serializer yaumunthu, protobuf yomweyi yomwe inalipo kale? Limenelo linali chiphunzitso chake, tiyeni tione mchitidwe.

Kukhazikitsa kwa TL komwe kulipo mu code

TL anabadwira kuya kwa VKontakte ngakhale zisanachitike zochitika zodziwika bwino ndikugulitsa gawo la Durov ndi (ndithu), ngakhale chitukuko cha Telegalamu chisanayambe. Ndipo mu Open source gwero la kukhazikitsa koyamba mutha kupeza ndodo zambiri zoseketsa. Ndipo chinenerocho chinakhazikitsidwa kumeneko mokwanira kuposa momwe ziliri mu Telegalamu. Mwachitsanzo, ma hashes sagwiritsidwa ntchito konse mu chiwembu (kutanthauza pseudotype yomangidwa (monga vekitala) yokhala ndi khalidwe lopotoka). Kapena

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

koma tiyeni tilingalire, chifukwa cha kukwanira, kuti tifufuze, titero kunena kwake, chisinthiko cha Chimphona cha Lingaliro.

#define ZHUKOV_BYTES_HACK

#ifdef ZHUKOV_BYTES_HACK

/* dirty hack for Zhukov request */

Kapena wokongola uyu:

    static const char *reserved_words_polymorhic[] = {

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

      };

Chigawo ichi ndi cha ma templates monga:

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

Uku ndiye tanthauzo la mtundu wa template ya hashmap ngati vekitala ya int - Type pairs. Mu C ++ zitha kuwoneka motere:

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

kotero, alpha - mawu ofunika! Koma mu C ++ mungathe kulemba T, koma muyenera kulemba alpha, beta ... Koma osapitirira magawo 8, ndi pamene zongopeka zimatha. Zikuoneka kuti nthawi ina ku St. Petersburg kukambirana kotere kunachitika:

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

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

Koma izi zinali za kukhazikitsidwa koyamba kwa TL "kwambiri". Tiyeni tipitirire kulingalira za kukhazikitsa kwamakasitomala a Telegraph okha.

Mawu kwa Vasily:

Vasily, [09.10.18 17:07] Koposa zonse, bulu ndi wotentha chifukwa adapanga mulu wa zotsalira, ndiyeno amamenyetsa bolt pa iwo, ndikuphimba jenereta ya code ndi ndodo.
Zotsatira zake, choyamba kuchokera ku dock pilot.jpg
Ndiye kuchokera ku code dzhekichan.webp

Zachidziwikire, kuchokera kwa anthu odziwa ma aligorivimu ndi masamu, titha kuyembekezera kuti awerengapo Aho, Ullmann, ndipo amadziwa zida zomwe zakhala zodziwika bwino pamakampani pazaka makumi ambiri polemba ma compilers awo a DSL, sichoncho?.

Wolemba telegram-cli ndi Vitaly Valtman, monga momwe tingamvetsetsere kuchokera ku mawonekedwe a TLO kunja kwa malire ake (cli), membala wa gulu - tsopano laibulale ya TL parsing yaperekedwa. payokha, maganizo ake ndi otani Chithunzi cha TL? ..

16.12 04:18 Vasily: Ndikuganiza kuti wina sanadziwe lex + yacc
16.12 04:18 Vasily: Sindingathe kufotokoza mwanjira ina
16.12 04:18 Vasily: chabwino, kapena adalipidwa chifukwa cha mizere mu VK
16.12 04:19 Vasily: 3k + mizere etc.<censored> m'malo mwa wofotokozera

Mwina kupatula? Tiyeni tione mmene tingachitire amachita Uyu ndiye kasitomala WONSE - Telegraph Desktop:

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

1100+ mizere mu Python, mawu angapo okhazikika + zochitika zapadera ngati vekitala, zomwe, zachidziwikire, zimalengezedwa mu chiwembucho momwe ziyenera kukhalira molingana ndi mawu a TL, koma adadalira mawuwa kuti awafotokozere ... Funso likubuka, chifukwa chiyani zonsezi zinali zodabwitsa?иNdizosanjikiza kwambiri ngati palibe amene angawerenge molingana ndi zolembedwa?!

Mwa njira... Mukukumbukira tidakambirana za CRC32 cheke? Chifukwa chake, mu Telegraph Desktop code jenereta pali mndandanda wazopatula zamitundu yomwe CRC32 yowerengera. sizikufanana ndi yomwe yasonyezedwa pachithunzichi!

Vasily, [18.12/22 49:XNUMX] ndipo apa ndingaganize ngati TL yotere ikufunika.
ndikadafuna kusokoneza njira zina, ndikadayamba kuyika zodulira mizere, theka la magawowo adzaphwanya matanthauzidwe amizere yambiri.
tdesktop, komabe, nawonso

Kumbukirani mfundo yokhudzana ndi mzere umodzi, tidzabwereranso pambuyo pake.

Chabwino, telegraph-cli ndiyosavomerezeka, Telegraph Desktop ndiyovomerezeka, koma nanga enawo? Ndani akudziwa?. kachigawo pansipa.

Ndi mafunso ena ati omwe kutsatizana kumadzutsa muzochita? Mwachitsanzo, iwo anachita zinthu zambiri, ndithudi, ndi minda yaing'ono ndi minda yokhazikika:

Vasily: flags.0? true
zikutanthauza kuti munda ulipo ndipo ndi woona ngati mbendera yakhazikitsidwa

Vasily: flags.1? int
zikutanthauza kuti munda ulipo ndipo uyenera kuchotsedwa

Vasily: Bulu, musadandaule ndi zomwe mukuchita!
Vasily: Pali kutchulidwa kwinakwake mu doc ​​kuti zoona ndi mtundu wopanda utali wa ziro, koma ndizosatheka kusonkhanitsa chilichonse kuchokera kwa dokotala wawo.
Vasily: M'machitidwe otseguka, izi sizili choncho, koma pali ndodo zambiri ndi zothandizira.

Nanga bwanji Telethon? Kuyang'ana kutsogolo kwa mutu wa MTProto, mwachitsanzo - muzolemba pali zidutswa zotere, koma chizindikiro % zimangofotokozedwa ngati "zogwirizana ndi mtundu woperekedwa wopanda kanthu", i.e. mu zitsanzo pansipa pali cholakwika kapena china chake chosalembedwa:

Vasily, [22.06.18 18:38] Malo amodzi:

msg_container#73f1f8dc messages:vector message = MessageContainer;

M'malo osiyanasiyana:

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

Ndipo izi ndi zosiyana ziwiri zazikulu, m'moyo weniweni mtundu wina wa maliseche wamaliseche umabwera

Sindinawonepo tanthauzo la vector ndipo sindinapezepo

Kusanthula kumalembedwa ndi dzanja mu telethon

M'chithunzi chake tanthauzo likufotokozedwa msg_container

Apanso, funso limakhalabe pafupifupi%. Sizinafotokozedwe.

Vadim Goncharov, [22.06.18 19:22] ndi pa tdesktop?

Vasily, [22.06.18 19:23] Koma TL parser yawo pamainjini wamba sangadye izi.

// parsed manually

TL ndichinthu chokongola, palibe amene amachigwiritsa ntchito kwathunthu

Ndipo % sali mu mtundu wawo wa chiwembu

Koma apa zolembedwa zimadzitsutsa, kotero idk

Anapezeka mu galamala, akanangoiwala kufotokoza semantics

Mudawona chikalatacho pa TL, simungachipeze popanda theka la lita

"Chabwino, tinene," wowerenga wina anganene, "mumatsutsa zinazake, ndiye ndiwonetseni momwe ziyenera kuchitikira."

Vasily akuyankha kuti: “Kunena za wokambirana, ndimakonda zinthu ngati

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

mwanjira ina yabwino kuposa

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

kapena

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

uyu ndiye LEXER YONSE:

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

izo. chosavuta ndikuchiyika mofatsa. ”

Nthawi zambiri, chotsatira chake ndi jenereta wa kagawo kakang'ono ka TL kogwiritsidwa ntchito kamakhala pafupifupi mizere 100 ya galamala ndi ~ 300 mizere ya jenereta (kuwerengera zonse. print's opangidwa), kuphatikiza zidziwitso zamtundu kuti muwonetsere kalasi iliyonse. Mtundu uliwonse wa polymorphic umasanduka kalasi yopanda kanthu, ndipo omanga amatengera cholowa chake ndipo amakhala ndi njira zotsatsira ndi kuchotseratu.

Kusowa kwa mitundu m'chinenero cholembera

Kulemba mwamphamvu ndi chinthu chabwino, sichoncho? Ayi, iyi si holivar (ngakhale ndimakonda zilankhulo zamphamvu), koma mawu mkati mwa TL. Potengera izo, chinenerocho chiyenera kutipatsa mitundu yonse ya macheke kwa ife. Chabwino, mwina osati iye mwini, koma kukhazikitsa, koma ayenera kufotokoza iwo. Nanga timafuna mwayi wotani?

Choyamba, zopinga. Apa tikuwona muzolemba zotsitsa mafayilo:

Zomwe zili mufayiloyo zimagawidwa m'magawo. Zigawo zonse ziyenera kukhala ndi kukula kofanana ( gawo_kukula ) ndipo izi ziyenera kukwaniritsidwa:

  • part_size % 1024 = 0 (yogawika ndi 1KB)
  • 524288 % part_size = 0 (512KB iyenera kugawidwa mofanana ndi part_size)

Gawo lomaliza siliyenera kukwaniritsa izi, malinga ngati kukula kwake kuli kochepa kuposa gawo_size.

Gawo lirilonse liyenera kukhala ndi nambala yotsatizana, file_gawo, ndi mtengo woyambira 0 mpaka 2,999.

Fayiloyo ikagawidwa, muyenera kusankha njira yosungira pa seva. Gwiritsani ntchito upload.saveBigFilePart ngati kukula kwa fayilo kuli kopitilira 10 MB ndi upload.saveFilePart kwa mafayilo ang'onoang'ono.
[…] Chimodzi mwazolakwika zolowetsa deta izi zitha kubwezedwa:

  • FILE_PARTS_INVALID - Nambala yolakwika ya magawo. Mtengo suli pakati 1..3000

Kodi izi zili m'chithunzichi? Kodi izi zimamveka mwanjira ina pogwiritsa ntchito TL? Ayi. Koma pepani, ngakhale agogo a Turbo Pascal adatha kufotokoza mitundu yomwe yatchulidwa osiyanasiyana. Ndipo iye ankadziwa chinthu chimodzi, tsopano chodziwika bwino monga enum - mtundu wokhala ndi chiŵerengero cha chiwerengero chokhazikika (chochepa). M'zilankhulo monga C - manambala, dziwani kuti mpaka pano tangolankhula za mitundu manambala. Koma palinso magulu, zingwe ... mwachitsanzo, zingakhale bwino kufotokoza kuti chingwechi chikhoza kukhala ndi nambala ya foni, chabwino?

Palibe mwa izi mu TL. Koma pali, mwachitsanzo, mu JSON Schema. Ndipo ngati wina angatsutse za kugawanika kwa 512 KB, kuti izi ziyenera kufufuzidwabe mu code, onetsetsani kuti kasitomala amangokhalira sakanakhoza tumizani nambala kuchokera pamlingo 1..3000 (ndipo cholakwika chofananacho sichikadakhalapo) zikadatheka, sichoncho?..

Mwa njira, za zolakwika ndi kubwereranso. Ngakhale omwe adagwirapo ntchito ndi TL adasokoneza maso awo - sizinatiwonekere nthawi yomweyo aliyense ntchito mu TL ikhoza kubwezeretsa osati mtundu wobwerera womwe wafotokozedwa, komanso cholakwika. Koma izi sizingaganizidwe mwanjira iliyonse pogwiritsa ntchito TL yokha. Zachidziwikire, zadziwika kale ndipo palibe chifukwa chochitira chilichonse (ngakhale, RPC ikhoza kuchitidwa m'njira zosiyanasiyana, tibwereranso ku izi pambuyo pake) - koma bwanji za Chiyerekezo cha malingaliro a Masamu a Mitundu Yosadziwika. kuchokera ku dziko lakumwamba? .. Ndinanyamula chikokacho - kuti chifanane nacho.

Ndipo potsiriza, nanga bwanji kuwerenga? Chabwino, pamenepo, kawirikawiri, ndikufuna Kufotokoza khalani nazo mu schema (mu JSON schema, kachiwiri, zili choncho), koma ngati muli nazo kale, nanga bwanji mbali yothandiza - kuyang'ana pang'ono kusiyana pakati pa zosintha? Dziwoneni nokha pa zitsanzo zenizeni:

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

kapena

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

Zimatengera aliyense, koma GitHub, mwachitsanzo, amakana kuwunikira zosintha mkati mwa mizere yayitali. Masewerawa "pezani kusiyana kwa 10", ndipo zomwe ubongo umawona nthawi yomweyo ndikuti chiyambi ndi mapeto mu zitsanzo zonsezi ndi zofanana, muyenera kuwerenga motopetsa kwinakwake pakati ... koma zowoneka zauve ndi zosasamala.

Mwa njira, za chiyero cha chiphunzitsocho. Chifukwa chiyani timafunikira magawo ang'onoang'ono? Kodi izo sizikuwoneka kuti iwo fungo zoipa kuchokera pamalingaliro amtundu wa chiphunzitso? Kufotokozera kutha kuwoneka m'matembenuzidwe akale achithunzichi. Poyamba, inde, ndi momwe zinalili, pakuyetsemula kulikonse kunapangidwa mtundu watsopano. Zoyambira izi zilipobe mwanjira iyi, mwachitsanzo:

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;

Koma tsopano tangoganizani, ngati muli ndi magawo 5 omwe mungasankhe, ndiye kuti mudzafunika mitundu 32 pazosankha zonse. Kuphulika kophatikizana. Chifukwa chake, chiyero cha kristalo cha chiphunzitso cha TL chinaswekanso motsutsana ndi bulu wonyezimira wachitsulo chowopsa cha serialization.

Kuphatikiza apo, m'malo ena anyamatawa amaphwanya typology yawo. Mwachitsanzo, mu MTProto (mutu wotsatira) yankho likhoza kukakamizidwa ndi Gzip, chirichonse chiri bwino - kupatula kuti zigawo ndi dera zimaphwanyidwa. Apanso, sinali RpcResult yokha yomwe idakololedwa, koma zomwe zili mkati mwake. Chabwino, chifukwa chiyani izi?.. Ndinayenera kudula mu ndodo kuti kukanikiza kukagwira ntchito kulikonse.

Kapena chitsanzo china, tidapezapo cholakwika - chidatumizidwa InputPeerUser mmalo mwa InputUser. Kapena mosemphanitsa. Koma zinathandiza! Ndiye kuti, sevayo sinasamale za mtunduwo. Kodi izi zingatheke bwanji? Yankho litha kupatsidwa kwa ife ndi zidutswa zama code kuchokera ku telegraph-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);

Mwa kuyankhula kwina, apa ndi pamene serialization ikuchitika PAMANJA, osati code yopangidwa! Mwinamwake seva ikugwiritsidwa ntchito mofananamo?. Kodi ndi chifukwa chake dongosololi linapangidwira? Ndipo apa tikupita ku funso lotsatira.

Kusintha. Zigawo

Chifukwa chiyani ma schematics amatchedwa zigawo zitha kungoganiziridwa potengera mbiri yamachitidwe osindikizidwa. Mwachiwonekere, poyamba olembawo ankaganiza kuti zinthu zofunika zikhoza kuchitidwa pogwiritsa ntchito ndondomeko yosasinthika, ndipo pokhapokha ngati kuli kofunikira, pazopempha zenizeni, zimasonyeza kuti zinali kuchitidwa pogwiritsa ntchito mtundu wina. M'malo mwake, ngakhale lingaliro labwino - ndipo latsopanolo lidzakhala, titero, "losakanizika", lopangidwa pamwamba pa zakale. Koma tiyeni tione mmene zinachitikira. Zowona, sindinathe kuziyang'ana kuyambira pachiyambi - ndizoseketsa, koma chithunzi cham'munsi sichipezeka. Zigawo zinayamba ndi 2. Zolembazo zimatiuza za mawonekedwe apadera a TL:

Ngati kasitomala amathandizira Layer 2, ndiye kuti omanga otsatirawa ayenera kugwiritsidwa ntchito:

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

Pochita izi, izi zikutanthauza kuti musanayambe kuyimba foni ya API, int yokhala ndi mtengo 0x289dd1f6 ayenera kuwonjezeredwa pamaso pa njira nambala.

Zikumveka bwino. Koma kenako chinachitika n’chiyani? Kenako anaonekera

invokeWithLayer3#b7475268 query:!X = X;

Ndiye chotsatira nchiyani? Momwe mungaganizire,

invokeWithLayer4#dea0d430 query:!X = X;

Zoseketsa? Ayi, mwayamba kale kuseka, ganizirani za izi aliyense pempho lochokera ku gulu lina liyenera kukulungidwa mumtundu wapadera wotere - ngati onse ali osiyana kwa inu, mungawasiyanitse bwanji? Ndipo kuwonjezera ma byte 4 okha kutsogolo ndi njira yabwino kwambiri. Choncho,

invokeWithLayer5#417a57ae query:!X = X;

Koma n’zachidziŵikire kuti patapita kanthawi izi zidzakhala mtundu wina wa bacchanalia. Ndipo yankho linafika:

Kusintha: Kuyambira ndi Gawo 9, njira zothandizira invokeWithLayerN angagwiritsidwe ntchito pamodzi ndi initConnection

Uwu! Pambuyo pa matembenuzidwe a 9, tidafika ku zomwe zidachitika muzolemba zapaintaneti m'zaka za m'ma 80 - kuvomereza mtunduwo kamodzi koyambirira kwa kulumikizana!

Ndiye next what?..

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

Koma tsopano mukhoza kuseka. Pambuyo pa zigawo zina 9, womanga wapadziko lonse lapansi wokhala ndi nambala yamtundu adawonjezedwa, yomwe imayenera kutchedwa kamodzi kokha kumayambiriro kwa kugwirizana, ndipo tanthauzo la zigawozo likuwoneka kuti lasowa, tsopano ndi mtundu wokhazikika, monga. kwina kulikonse. Vuto lathetsedwa.

Ndendende?..

Vasily, [16.07.18 14:01] Ngakhale Lachisanu ndinaganiza:
Teleserver imatumiza zochitika popanda pempho. Zofunsira ziyenera kukulungidwa mu InvokeWithLayer. Seva simangirira zosintha; palibe dongosolo lokulunga mayankho ndi zosintha.

Iwo. kasitomala sangathe kufotokoza wosanjikiza amene akufuna zosintha

Vadim Goncharov, [16.07.18 14:02] si InvokeWithLayer crutch in principle?

Vasily, [16.07.18 14:02] Iyi ndi njira yokhayo

Vadim Goncharov, [16.07.18 14:02] zomwe ziyenera kutanthauza kuvomereza pagawo kumayambiriro kwa gawoli.

Mwa njira, zimatsatira kuti kutsitsa kwa kasitomala sikunaperekedwe

Zosintha, i.e. mtundu Updates mu chiwembu, izi ndi zomwe seva imatumiza kwa kasitomala osati poyankha pempho la API, koma palokha pamene chochitika chikuchitika. Uwu ndi mutu wovuta womwe udzakambidwe mu positi ina, koma pakadali pano ndikofunikira kudziwa kuti seva imasunga Zosintha ngakhale kasitomala atakhala pa intaneti.

Choncho, ngati inu kukana kukulunga aliyense Paketi kuti iwonetse mtundu wake, izi zimabweretsa zovuta zotsatirazi:

  • seva imatumiza zosintha kwa kasitomala ngakhale kasitomala asanadziwitse mtundu womwe umathandizira
  • nditani nditakweza kasitomala?
  • ndani zimatsimikizirakuti maganizo a seva pa nambala yosanjikiza sangasinthe panthawiyi?

Kodi mukuganiza kuti izi ndizongopeka chabe, ndipo pochita izi sizingachitike, chifukwa seva idalembedwa molondola (osachepera, imayesedwa bwino)? Ayi! Ziribe kanthu momwe ziriri!

Izi ndi zomwe tinakumana nazo mu Ogasiti. Pa Ogasiti 14, panali mauthenga oti china chake chikusinthidwa pa ma seva a Telegraph ... ndiyeno m'zipika:

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.

ndiyeno ma megabytes angapo amtundu wa stack (chabwino, nthawi yomweyo kudula mitengo kunakhazikitsidwa). Kupatula apo, ngati china chake sichikuzindikirika mu TL yanu, ndichosaina ndi siginecha, kupitilira mzere ONSE kupita, decoding adzakhala zosatheka. Kodi muyenera kuchita chiyani zikatero?

Chabwino, chinthu choyamba chomwe chimabwera m'maganizo a aliyense ndikuchotsa ndikuyesanso. sizinathandize. Ife google CRC32 - izi zinakhala zinthu zochokera ku chiwembu 73, ngakhale kuti tinagwira ntchito pa 82. Timayang'ana mosamala zipika - pali zizindikiritso za ziwembu ziwiri zosiyana!

Mwina vuto liri mwa kasitomala wathu wosavomerezeka? Ayi, tikuyambitsa Telegraph Desktop 1.2.17 (mtundu woperekedwa m'magawo angapo a Linux), imalemba ku chipika Chosiyana: MTP Mtundu wosayembekezeka id #b5223b0f yowerengedwa mu MTPMessageMedia…

Kutsutsa kwa protocol ndi njira zamagulu a Telegraph. Gawo 1, luso: luso polemba kasitomala kuyambira poyambira - TL, MT

Google idawonetsa kuti vuto lofananalo lidachitika kale kwa m'modzi mwamakasitomala osavomerezeka, koma manambala amtunduwo ndipo, molingana, malingaliro anali osiyana ...

Ndiye tiyenera kuchita chiyani? Vasily ndi ine tinagawanika: iye anayesa kusintha dera 91, ndinaganiza dikirani masiku angapo ndikuyesera pa 73. Njira zonsezi zinagwira ntchito, koma popeza ndizovomerezeka, palibe kumvetsetsa kuti ndi matembenuzidwe angati kapena pansi omwe mukufunikira. kulumpha, kapena kuti muyenera kudikira nthawi yayitali bwanji .

Pambuyo pake ndidatha kubwereza zomwe zikuchitika: timayambitsa kasitomala, kuzimitsa, kubwezeretsanso dera kumalo ena, kuyambitsanso, kugwiranso vutolo, kubwereranso m'mbuyomo - oops, palibe kusintha kwa dera ndikuyambiranso kasitomala kwa a. mphindi zochepa zithandiza. Mudzalandira zosakaniza za data kuchokera mumagulu osiyanasiyana.

Kufotokozera? Monga momwe mungaganizire kuchokera kuzizindikiro zosiyanasiyana zosalunjika, seva imakhala ndi njira zambiri zamitundu yosiyanasiyana pamakina osiyanasiyana. Mwachidziwikire, seva yomwe ili ndi udindo wa "buffering" imayika pamzere zomwe oyang'anira ake adapereka, ndipo adazipereka mu chiwembu chomwe chidalipo panthawiyo. Ndipo mpaka mzerewu "wowola", palibe chomwe chingachitike.

Mwina ... koma ichi ndi ndodo yowopsya?! .. Ayi, tisanaganize za malingaliro openga, tiyeni tiwone ndondomeko ya makasitomala ovomerezeka. Mu mtundu wa Android sitipeza TL parser, koma timapeza fayilo yayikulu (GitHub ikukana kuyikhudza) yokhala ndi (de) serialization. Nawa maulalo a code:

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

kapena

    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 ... zikuwoneka zakutchire. Koma, mwina, izi zimapangidwira kachidindo, ndiye chabwino?.. Koma ndithudi imathandizira mitundu yonse! Zoona, sizikudziwika chifukwa chake zonse zimasakanikirana, macheza achinsinsi, ndi mitundu yonse _old7 mwanjira inayake sizikuwoneka ngati kupanga makina ... Komabe, koposa zonse ndidawombedwa nazo

TL_message_layer104
TL_message_layer104_2
TL_message_layer104_3

Anyamata, simungasankhe zomwe zili mkati mwa gawo limodzi?! Chabwino, chabwino, tiyeni tinene kuti "awiri" anamasulidwa ndi cholakwika, chabwino, zimachitika, koma ATATU? .. Nthawi yomweyo, chowotcha chomwecho kachiwiri? Kodi zolaula ndi zotani, pepani?

Mu code source ya Telegraph Desktop, mwa njira, chinthu chofanana chimachitika - ngati ndi choncho, angapo amachita motsatizana ku chiwembucho sasintha nambala yake yosanjikiza, koma konza china chake. M'mikhalidwe yomwe palibe gwero lovomerezeka lachidziwitso cha chiwembuchi, ingapezeke kuti, kupatulapo gwero la kasitomala wovomerezeka? Ndipo ngati mutenga kuchokera pamenepo, simungakhale otsimikiza kuti chiwembucho ndi cholondola mpaka mutayesa njira zonse.

Kodi izi zingayesedwe bwanji? Ndikukhulupirira kuti mafani a unit, magwiridwe antchito ndi mayeso ena agawana nawo ndemanga.

Chabwino, tiyeni tiwone kachidutswa kena ka code:

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

    public int folder_id;

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

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

//manually created

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

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

Ndemanga iyi "yopangidwa pamanja" ikuwonetsa kuti gawo lokha la fayiloyi linalembedwa pamanja (kodi mungaganizire zovuta zonse zokonzekera?), Ndipo zina zonse zidapangidwa ndi makina. Komabe, ndiye funso lina likubwera - kuti magwero alipo osati kwathunthu (a la GPL blobs mu Linux kernel), koma uwu ndi mutu wa gawo lachiwiri.

Koma zokwanira. Tiyeni tipitirire ku protocol yomwe ili pamwamba pa zonse izi zikuyenda.

MT Proto

Kotero, tiyeni titsegule kufotokoza zonse и kufotokoza mwatsatanetsatane protocol ndipo chinthu choyamba chimene timapunthwa nacho ndi mawu akuti: Ndipo ndi kuchuluka kwa chilichonse. Nthawi zambiri, izi zikuwoneka ngati gawo la Telegraph - kuyitana zinthu mosiyana m'malo osiyanasiyana, kapena zinthu zosiyanasiyana ndi liwu limodzi, kapena mosemphanitsa (mwachitsanzo, mu API yapamwamba, ngati muwona paketi yomata, sichoncho. zomwe mudaganiza).

Mwachitsanzo, "uthenga" ndi "gawo" amatanthauza china pano kusiyana ndi mawonekedwe a kasitomala a Telegalamu. Chabwino, zonse zimamveka bwino ndi uthengawo, zitha kutanthauziridwa m'mawu a OOP, kapena kungoti "paketi" - iyi ndi gawo lotsika, loyendetsa, palibe mauthenga ofanana ndi omwe ali mu mawonekedwe, pali mauthenga ambiri othandizira. . Koma gawoli ... koma zinthu zoyamba poyamba.

transport layer

Chinthu choyamba ndi transport. Atiuza za zosankha 5:

  • TCP
  • socket yapaintaneti
  • Websocket pa HTTPS
  • HTTP
  • HTTPS

Vasily, [15.06.18 15:04] Palinso zoyendera za UDP, koma sizinalembedwe

Ndipo TCP mumitundu itatu

Yoyamba ikufanana ndi UDP pa TCP, paketi iliyonse imakhala ndi nambala yotsatizana ndi crc
Chifukwa chiyani kuwerenga zikalata pangolo kumakhala kowawa kwambiri?

Chabwino, apo izo ziri tsopano TCP ili kale mumitundu 4:

  • Chotsitsidwa
  • wapakatikati
  • Padded intermediate
  • Full

Chabwino, chabwino, Padded wapakatikati kwa MTProxy, izi zidawonjezeredwa pambuyo pake chifukwa cha zochitika zodziwika bwino. Koma bwanji matembenuzidwe ena awiri (atatu onse) pomwe mutha kupitilira limodzi? Zonse zinayi zimasiyana kokha momwe mungakhazikitsire kutalika ndi kulipidwa kwa MTProto wamkulu, zomwe zidzakambidwenso:

  • mu Abridged ndi 1 kapena 4 byte, koma osati 0xef, ndiye thupi
  • mu Intermediate iyi ndi ma byte 4 autali ndi gawo, ndipo nthawi yoyamba yomwe kasitomala ayenera kutumiza 0xeeeeeeee kusonyeza kuti ndi Pakati
  • mu Kudzaza kosokoneza kwambiri, kuchokera pamalingaliro a wogwiritsa ntchito maukonde: kutalika, nambala yotsatizana, ndi OSATI IMENE makamaka MTProto, thupi, CRC32. Inde, zonsezi zili pamwamba pa TCP. Zomwe zimatipatsa mayendedwe odalirika ngati mtsinje wotsatizana; palibe kutsata komwe kumafunikira, makamaka macheke. Chabwino, tsopano wina anganditsutse kuti TCP ili ndi cheke cha 16-bit, kotero kuti ziphuphu za data zimachitika. Zabwino, koma tili ndi protocol ya cryptographic yokhala ndi ma hashes otalika kuposa ma byte 16, zolakwika zonsezi - ndi zina zambiri - zidzagwidwa ndi kusagwirizana kwa SHA pamlingo wapamwamba. Palibe mfundo mu CRC32 pamwamba pa izi.

Tiyeni tifanizire Abridged, momwe kutalika kwake kuli kotheka, ndi Intermediate, zomwe zimalungamitsa "Ngati 4-byte data ikufunika," zomwe ndi zopanda pake. Kodi, akukhulupirira kuti opanga mapulogalamu a Telegalamu ndi osakwanira kotero kuti sangathe kuwerenga deta kuchokera pasoketi kupita ku buffer yolumikizana? Mukuyenerabe kuchita izi, chifukwa kuwerenga kumatha kukubwezerani ma byte angapo (ndipo palinso ma seva a proxy, mwachitsanzo ...). Kapena kumbali ina, bwanji kutsekereza Abridged ngati tidzakhalabe ndi ma padding okwera pamwamba pa ma byte 16 - sungani ma byte atatu nthawi zina ?

Mmodzi amaona kuti Nikolai Durov amakondadi reinvent mawilo, kuphatikizapo ma protocol maukonde, popanda zofunika kwenikweni.

Njira zina zoyendera, kuphatikiza. Webusaiti ndi MTProxy, sitidzalingalira tsopano, mwinamwake mu post ina, ngati pali pempho. Pafupi ndi MTProxy yomweyi, tiyeni tingokumbukira tsopano kuti itangotulutsidwa mu 2018, opereka chithandizo adaphunzira mwamsanga kuletsa, pofuna kutsekereza malire, pa kukula kwa phukusi! Komanso mfundo yakuti seva ya MTProxy yolembedwa (kachiwiri ndi Waltman) mu C inali yomangidwa mopitirira muyeso ku Linux, ngakhale izi sizinali zofunikira konse (Phil Kulin adzatsimikizira), komanso kuti seva yofananayo mwina Go kapena Node.js okwana mizere yosakwana zana.

Koma tidzakambirana za luso la luso la anthuwa kumapeto kwa gawoli, titaganiziranso nkhani zina. Pakadali pano, tiyeni tipitirire ku OSI wosanjikiza 5, gawo - pomwe adayika gawo la MTProto.

Makiyi, mauthenga, magawo, Diffie-Hellman

Anaziyika pamenepo osati molondola kwathunthu... Gawo siliri gawo lomwelo lomwe limawonekera mu mawonekedwe a Active sessions. Koma mwa dongosolo.

Kutsutsa kwa protocol ndi njira zamagulu a Telegraph. Gawo 1, luso: luso polemba kasitomala kuyambira poyambira - TL, MT

Chifukwa chake tidalandira chingwe cha byte chautali wodziwika kuchokera pagawo lamayendedwe. Uwu mwina ndi uthenga wobisidwa kapena mawu osavuta - ngati tikadali pamgwirizano waukulu ndipo tikuchitadi. Kodi ndi mfundo ziti zomwe zimatchedwa "key" zomwe tikukamba? Tiyeni tifotokozere bwino nkhaniyi kwa gulu la Telegraph (ndipepesa chifukwa chomasulira zolemba zanga kuchokera ku Chingerezi ndi ubongo wotopa nthawi ya 4 koloko m'mawa, zinali zosavuta kusiya mawu ena momwe alili):

Pali magulu awiri otchedwa gawo - imodzi mu UI ya makasitomala ovomerezeka pansi pa "magawo apano", pomwe gawo lililonse limafanana ndi chipangizo chonse / OS.
Chachiwiri - Gawo la MTProto, yomwe ili ndi nambala yotsatizana ya uthengawo (m’lingaliro lotsika) mmenemo, ndi chimene ikhoza kukhala pakati pa maulumikizidwe osiyanasiyana a TCP. Magawo angapo a MTProto amatha kukhazikitsidwa nthawi imodzi, mwachitsanzo, kufulumizitsa kutsitsa mafayilo.

Pakati pa awiriwa magawo pali lingaliro chilolezo. M'nkhani yowonongeka, tikhoza kunena kuti Chigawo cha UI ndi chimodzimodzi chilolezo, koma tsoka, zonse ndi zovuta. Tiyeni tiwone:

  • Wogwiritsa ntchito pa chipangizo chatsopano amayamba kupanga auth_key ndikuyiyika ku akaunti, mwachitsanzo kudzera pa SMS - ndichifukwa chake chilolezo
  • Zinachitika mkati mwa woyamba Gawo la MTProto, amene ali session_id mkati mwako.
  • Pa sitepe iyi, kuphatikiza chilolezo и session_id akhoza kutchedwa ulamuliro - mawu awa amawoneka muzolemba ndi code ya makasitomala ena
  • Ndiye, kasitomala akhoza kutsegula angapo Gawo la MTProto pansi chomwecho auth_key - ku DC yemweyo.
  • Kenako, tsiku lina kasitomala adzafunika kupempha fayilo kuchokera DC wina - ndipo pa DC iyi papangidwa yatsopano auth_key !
  • Kudziwitsa dongosolo kuti si wosuta watsopano amene akulembetsa, koma chimodzimodzi chilolezo (Chigawo cha UI), kasitomala amagwiritsa ntchito mafoni a API auth.exportAuthorization ku nyumba DC auth.importAuthorization mu DC watsopano.
  • Chilichonse ndi chofanana, zingapo zitha kukhala zotseguka Gawo la MTProto (iliyonse ndi yake session_id) kwa DC watsopanoyu, pansi lake auth_key.
  • Pomaliza, kasitomala angafune Perfect Forward Secrecy. Aliyense auth_key anali Osatha key - pa DC - ndipo kasitomala akhoza kuyimba auth.bindTempAuthKey za ntchito zosakhalitsa auth_key - ndipo kachiwiri, mmodzi yekha temp_auth_key pa DC, wamba kwa onse Gawo la MTProto ku DC uyu.

Onani kuti mchere (ndi mchere wam'tsogolo) ndi chimodzi auth_key izo. kugawana pakati pa aliyense Gawo la MTProto ku DC yemweyo.

Kodi "pakati pa maulumikizidwe osiyanasiyana a TCP" amatanthauza chiyani? Kotero izi zikutanthauza chinachake chonga cookie yololeza patsamba - imapitilira (imakhalabe) kulumikizana ndi TCP ambiri ku seva yopatsidwa, koma tsiku lina zimayipa. Mosiyana ndi HTTP, mu MTProto mauthenga mkati mwa gawo amawerengedwa motsatizana ndikutsimikiziridwa; ngati adalowa mumsewu, kulumikizana kudasweka - atakhazikitsa kulumikizana kwatsopano, seva imatumiza mwachifundo chilichonse chomwe sichinaperekedwe m'mbuyomu. Kugwirizana kwa TCP.

Komabe, zomwe zili pamwambazi zikufotokozedwa mwachidule pambuyo pa miyezi yambiri yofufuza. Pakali pano, kodi tikugwiritsa ntchito kasitomala wathu kuyambira pachiyambi? - tiyeni tibwerere ku chiyambi.

Ndiye tiyeni tipange auth_key pa Mabaibulo a Diffie-Hellman ochokera ku Telegraph. Tiyeni tiyese kumvetsetsa zolembedwa ...

Vasily, [19.06.18 20:05] data_with_hash := SHA1(data) + data + (ma byte aliwonse mwachisawawa); kotero kuti kutalika kwake kumafanana ndi ma byte 255;
encrypted_data := RSA(data_with_hash, server_public_key); nambala yayitali ya 255-byte (ndian yayikulu) imakwezedwa ku mphamvu yofunikira pa modulus yofunikira, ndipo zotsatira zake zimasungidwa ngati nambala ya 256-byte.

Iwo ali ndi dope DH

Sikuwoneka ngati DH ya munthu wathanzi
Palibe makiyi awiri apagulu mu dx

Chabwino, pamapeto pake izi zidakonzedwa, koma chotsaliracho chinatsalira - umboni wa ntchito umachitidwa ndi kasitomala kuti adatha kuwerengera chiwerengerocho. Mtundu wachitetezo motsutsana ndi kuukira kwa DoS. Ndipo kiyi ya RSA imagwiritsidwa ntchito kamodzi kokha kumbali imodzi, makamaka pakubisa new_nonce. Koma ngakhale kuti opaleshoni yooneka ngati yophweka imeneyi idzayenda bwino, kodi mudzafunika kukumana ndi chiyani?

Vasily, [20.06.18/00/26 XNUMX:XNUMX] Sindinapezebe pempho la appid

Ndatumiza pempho ili ku DH

Ndipo, padoko lamayendedwe akuti imatha kuyankha ndi ma byte 4 a code yolakwika. Ndizomwezo

Chabwino, adandiuza -404, ndiye chiyani?

Chifukwa chake ndidamuuza kuti: "Gwira ng'ombe yako yosungidwa ndi kiyi ya seva yokhala ndi chala chotere, ndikufuna DH," ndipo idayankha ndi 404 yopusa.

Mukuganiza bwanji za yankho la sevali? Zoyenera kuchita? Palibe wofunsa (koma zambiri pa izo mu gawo lachiwiri).

Apa chidwi chonse chachitika padoko

Ndilibe china choti ndichite, ndimangolakalaka ndikusintha manambala uku ndi uku

Nambala ziwiri za 32-bit. Ndinawanyamula ngati wina aliyense

Koma ayi, awiriwa akuyenera kuwonjezeredwa pamzere woyamba ngati BE

Vadim Goncharov, [20.06.18 15:49] ndipo chifukwa cha 404 iyi?

Vasily, [20.06.18 15:49] INDE!

Vadim Goncharov, [20.06.18 15:50] kotero sindikumvetsa zomwe "sanapeze"

Vasily, [20.06.18 15:50] pafupifupi

Sindinapeze kuwonongeka kotere kukhala zinthu zazikulu%)

Sitinathe ngakhale kuwongolera malipoti olakwika

Vasily, [20.06.18 20:18] O, palinso MD5. Kale ma hashe atatu osiyana

Zolemba zala zazikulu zimawerengedwa motere:

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

SHA1 ndi sha2

Ndiye tiyeni tiyike auth_key tinalandira 2048 bits kukula pogwiritsa ntchito Diffie-Hellman. Chotsatira ndi chiyani? Kenaka timapeza kuti 1024 bits zapansi za funguloli sizikugwiritsidwa ntchito mwanjira iliyonse ... koma tiyeni tiganizire za izi panopa. Pa sitepe iyi, tili ndi chinsinsi chogawana ndi seva. Analogue ya gawo la TLS yakhazikitsidwa, yomwe ndi njira yokwera mtengo kwambiri. Koma sevayo sadziwa chilichonse chokhudza omwe ndife! Osati, kwenikweni. chilolezo. Iwo. ngati mumaganizira za "login-password", monga momwe mudachitira mu ICQ, kapena "login-key", monga mu SSH (mwachitsanzo, pa gitlab/github ina). Tinalandira wina osadziwika. Nanga bwanji seva itatiuza kuti "nambala za foni izi zimathandizidwa ndi DC wina"? Kapena ngakhale "nambala yanu yafoni ndiyoletsedwa"? Zabwino zomwe tingachite ndikusunga makiyi ndi chiyembekezo kuti zikhala zothandiza ndipo sizidzavunda pofika nthawiyo.

Mwa njira, "tinachilandira" ndi kusungitsa. Mwachitsanzo, kodi timakhulupirira seva? Nanga ngati zili zabodza? Macheke a Cryptographic adzafunika:

Vasily, [21.06.18 17:53] Amapereka makasitomala am'manja kuti awone nambala ya 2kbit kuti ikhale yopambana%)

Koma sizikumveka konse, nafeijoa

Vasily, [21.06.18 18:02] Chikalatacho sichikunena zoyenera kuchita ngati zikuwoneka kuti sizophweka.

Osanena. Tiyeni tiwone zomwe kasitomala wovomerezeka wa Android amachita pankhaniyi? A ndi zomwe (ndipo inde, fayilo yonseyo ndi yosangalatsa) - monga akunena, ndingosiya izi apa:

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

Ayi ndithu ikadalipobe ena Pali mayeso a kuchuluka kwa chiwerengero, koma ine ndekha sindikudziwanso mokwanira masamu.

Chabwino, tapeza master key. Kulowa, i.e. tumizani zopempha, muyenera kuchitanso kubisa, pogwiritsa ntchito AES.

Kiyi ya uthenga imatanthauzidwa ngati ma bits 128 apakati a SHA256 a gulu la uthenga (kuphatikiza gawo, ID ya uthenga, ndi zina), kuphatikiza ma byte a padding, otsogozedwa ndi ma byte 32 otengedwa pa kiyi yovomerezeka.

Vasily, [22.06.18 14:08] Avereji, kuluma, pang'ono

Adalandira auth_key. Zonse. Kupitilira iwo ... sizikumveka bwino kuchokera pachikalatacho. Khalani omasuka kuphunzira code yotsegula.

Dziwani kuti MTProto 2.0 imafuna kuchokera pa 12 mpaka 1024 mabayiti a padding, komabe malinga ndi chikhalidwe choti kutalika kwa uthengawo kugawike ndi ma byte 16.

Ndiye muyenera kuwonjezera padding zingati?

Ndipo inde, palinso 404 pakakhala cholakwika

Ngati wina aphunzira mosamala chithunzi ndi zolemba za zolembazo, adawona kuti palibe MAC pamenepo. Ndipo kuti AES imagwiritsidwa ntchito mumtundu wina wa IGE womwe sugwiritsidwa ntchito kwina kulikonse. Iwo, ndithudi, amalemba za izi mu FAQ yawo ... Pano, ngati, chinsinsi cha uthengawo ndi SHA hash ya deta yotsekedwa, yomwe imagwiritsidwa ntchito poyang'ana kukhulupirika - ndipo ngati kusagwirizana, zolembazo pazifukwa zina. amalimbikitsa kunyalanyaza mwakachetechete (koma bwanji za chitetezo, bwanji ngati atiswa?).

Ine sindine cryptgrapher, mwina palibe cholakwika ndi mode iyi mu nkhani iyi kuchokera mfundo maganizo. Koma nditha kutchula bwino vuto, pogwiritsa ntchito Telegraph Desktop monga chitsanzo. Imasunga cache yakomweko (zonsezi D877F783D5D3EF8C) mofanana ndi mauthenga mu MTProto (pokhapokha pankhaniyi 1.0), i.e. choyamba chinsinsi cha uthenga, kenako deta yokha (ndi penapake pambali yaikulu auth_key 256 byte, popanda izo msg_key zopanda ntchito). Chifukwa chake, vutoli limawonekera pamafayilo akulu. Mwakutero, muyenera kusunga makope awiri a datayo - obisika komanso osindikizidwa. Ndipo ngati pali ma megabytes, kapena mavidiyo akukhamukira, mwachitsanzo?. Koma ndi MTProto muyenera kutero poyamba encrypt kapena decrypt the whole message, only then transfer it to network or to disk. Chifukwa chake, m'mitundu yaposachedwa ya Telegraph Desktop mu cache in user_data Mtundu wina umagwiritsidwanso ntchito - ndi AES mu CTR mode.

Vasily, [21.06.18 01:27] O, ndapeza kuti IGE ndi chiyani: IGE inali kuyesa koyamba pa "njira yotsimikizira kubisa," koyambirira kwa Kerberos. Kunali kuyesa kolephera (sikupereka chitetezo chaumphumphu), ndipo kunayenera kuchotsedwa. Ichi chinali chiyambi cha zaka 20 kufunafuna njira yotsimikizira kubisa yomwe imagwira ntchito, yomwe posachedwapa idafika pachimake mumitundu monga OCB ndi GCM.

Ndipo tsopano zotsutsana kuchokera kumbali ya ngolo:

Gulu lomwe lili kumbuyo kwa Telegraph, lotsogozedwa ndi Nikolai Durov, lili ndi akatswiri asanu ndi limodzi a ACM, theka la iwo a Ph.D mu masamu. Zinawatengera zaka ziwiri kuti atulutse mtundu wamakono wa MTProto.

Zimenezo ndi zoseketsa. Zaka ziwiri pamlingo wapansi

Kapena mutha kungotenga tls

Chabwino, tinene kuti tachita kubisa ndi ma nuances ena. Kodi ndizotheka kutumiza zopempha zotsatiridwa mu TL ndikuchotsa mayankho? Ndiye muyenera kutumiza chiyani komanso bwanji? Apa, tinene, njira InitConnection, mwina ndi izi?

Vasily, [25.06.18 18:46] Imayambitsa kulumikizana ndikusunga zambiri pa chipangizo cha wogwiritsa ntchito ndikugwiritsa ntchito.

Imavomereza app_id, device_model, system_version, app_version ndi lang_code.

Ndipo funso lina

Zolemba monga nthawi zonse. Khalani omasuka kuphunzira gwero lotseguka

Ngati zonse zinali zomveka bwino ndi invokeWithLayer, ndiye cholakwika ndi chiyani apa? Zapezeka, tinene kuti tili ndi - kasitomala anali kale ndi kena kake kofunsa seva - pali pempho lomwe tikufuna kutumiza:

Vasily, [25.06.18 19:13] Tikayang'ana ndi code, kuyimba koyamba kumakutidwa muzabodza izi, ndipo zopusazo zimakutidwa ndi invokewithlayer.

Chifukwa chiyani initConnection sinakhale foni yosiyana, koma iyenera kukhala chomata? Inde, monga momwe zinakhalira, ziyenera kuchitika nthawi iliyonse kumayambiriro kwa gawo lililonse, osati kamodzi, monga ndi kiyi yaikulu. Koma! Sizingatchulidwe ndi wogwiritsa ntchito wosaloledwa! Tsopano tafika pamlingo woyenerera Ic tsamba lolemba - ndipo limatiuza kuti...

Gawo laling'ono chabe la njira za API likupezeka kwa ogwiritsa ntchito osaloledwa:

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

Woyamba wa iwo, auth.sendCode, ndipo pali pempho loyamba lokondedwa lomwe timatumiza api_id ndi api_hash, ndipo pambuyo pake timalandira SMS yokhala ndi code. Ndipo ngati tili mu DC yolakwika (nambala zafoni m'dziko lino zimatumizidwa ndi wina, mwachitsanzo), ndiye kuti tidzalandira cholakwika ndi chiwerengero cha DC chomwe tikufuna. Kuti mudziwe adilesi ya IP ndi nambala ya DC yomwe muyenera kulumikizana nayo, tithandizeni help.getConfig. Panthawi ina panali zolemba 5 zokha, koma pambuyo pa zochitika zodziwika bwino za 2018, chiwerengerocho chawonjezeka kwambiri.

Tsopano tiyeni tikumbukire kuti tinafika pa siteji iyi pa seva mosadziwika. Kodi sizokwera mtengo kuti mungopeza adilesi ya IP? Bwanji osachita izi, ndi ntchito zina, mu gawo losalembetsedwa la MTProto? Ndikumva zotsutsa: "tingatsimikizire bwanji kuti si RKN amene angayankhe ndi maadiresi onama?" Kwa ichi timakumbukira kuti, ambiri, makasitomala ovomerezeka Makiyi a RSA aphatikizidwa,ndi. mukhoza basi lembetsani zambiri izi. M'malo mwake, izi zikuchitika kale kuti mudziwe zambiri pakudutsa kutsekereza komwe makasitomala amalandira kudzera munjira zina (zomveka, izi sizingachitike mu MTProto palokha; muyeneranso kudziwa komwe mungalumikizidwe).

CHABWINO. Pakadali pano chilolezo cha kasitomala, sitinavomerezedwe ndipo sitinalembetse ntchito yathu. Timangofuna kuwona zomwe seva imayankha ku njira zomwe zimapezeka kwa wogwiritsa ntchito wosaloledwa. Ndipo apa…

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;

Mu chiwembu, choyamba chimabwera chachiwiri

Mu tdesktop schema mtengo wachitatu ndi

Inde, kuyambira pamenepo, ndithudi, zolembazo zasinthidwa. Ngakhale posachedwa zitha kukhala zosafunikanso. Kodi woyambitsa novice ayenera kudziwa bwanji? Mwina mukalembetsa fomu yanu, adzakudziwitsani? Vasily anachita izi, koma tsoka, sanamutumize kalikonse (kachiwiri, tikambirana izi mu gawo lachiwiri).

...Munaona kuti tasamukira kale ku API, i.e. kufika pamlingo wotsatira, ndikuphonya china chake pamutu wa MTProto? Palibe zodabwitsa:

Vasily, [28.06.18 02:04] Mm, akufufuza ma algorithms ena pa e2e.

Mtproto imatanthawuza ma aligorivimu ndi makiyi a madera onse awiri, komanso kamangidwe kakang'ono

Koma nthawi zonse amasakaniza magawo osiyanasiyana a stack, kotero sizidziwika nthawi zonse pomwe mtproto idathera ndipo gawo lotsatira lidayamba.

Kodi amasakanikirana bwanji? Chabwino, nayi fungulo losakhalitsa la PFS, mwachitsanzo (mwa njira, Telegraph Desktop siyingachite). Imachitidwa ndi pempho la API auth.bindTempAuthKey,ndi. kuchokera pamwamba. Koma nthawi yomweyo zimasokoneza kubisa m'munsi - pambuyo pake, mwachitsanzo, muyenera kuchitanso. initConnection etc., izi siziri basi pempho labwinobwino. Chapaderanso ndikuti mutha kukhala ndi kiyi IMODZI yokha kwakanthawi pa DC, ngakhale gawolo auth_key_id mu uthenga uliwonse amakulolani kuti musinthe makiyi osachepera uthenga uliwonse, komanso kuti seva ili ndi ufulu "woiwala" fungulo losakhalitsa nthawi iliyonse - zolembazo sizikunena zoyenera kuchita pankhaniyi ... chabwino, chifukwa chiyani mulibe makiyi angapo, monga ndi mchere wam'tsogolo, ndi ?..

Pali zinthu zina zochepa zomwe muyenera kuzidziwa pamutu wa MTProto.

Mauthenga a mauthenga, msg_id, msg_seqno, zitsimikizo, kuloza kolakwika ndi zina.

N’chifukwa chiyani muyenera kudziwa za iwo? Chifukwa "amadumphira" pamlingo wapamwamba, ndipo muyenera kuwazindikira mukamagwira ntchito ndi API. Tiyerekeze kuti tilibe chidwi ndi msg_key; gawo lotsika latichotsera chilichonse. Koma mkati mwa deta yotsekedwa tili ndi magawo otsatirawa (komanso kutalika kwa deta, kotero timadziwa komwe kuli padding, koma sizofunikira):

  • mchere - int64
  • gawo_id - int64
  • message_id - int64
  • seq_no - int32

Tikukumbutseni kuti pali mchere umodzi wa DC yonse. Chifukwa chiyani mukudziwa za iye? Osati kokha chifukwa pali pempho get_future_salts, zomwe zimakuuzani kuti ndi nthawi ziti zomwe zidzakhala zomveka, komanso chifukwa ngati mchere wanu "wowola", ndiye kuti uthenga (pempho) udzatayika. Seva idzanena za mchere watsopano popereka new_session_created - koma ndi yakaleyo mudzayenera kuitumiza mwanjira ina, mwachitsanzo. Ndipo nkhaniyi imakhudza kamangidwe ka ntchito.

Seva imaloledwa kugwetsa magawo palimodzi ndikuyankha motere pazifukwa zambiri. Kwenikweni, gawo la MTProto kuchokera kumbali ya kasitomala ndi chiyani? Izi ndi nambala ziwiri session_id и seq_no mauthenga mkati mwa gawoli. Chabwino, ndi kulumikizana kwapakati pa TCP, inde. Tiyerekeze kuti kasitomala wathu sakudziwabe momwe angachitire zinthu zambiri, adadula ndikulumikizananso. Ngati izi zidachitika mwachangu - gawo lakale lidapitilira kulumikizana kwatsopano kwa TCP, onjezerani seq_no patsogolo. Ngati zitenga nthawi yayitali, seva ikhoza kuichotsa, chifukwa kumbali yake ilinso pamzere, monga tadziwira.

Iyenera kukhala chiyani seq_no? O, ndi funso lovuta. Yesani kumvetsa moona mtima zomwe zinkatanthauza:

Uthenga wokhudzana ndi zinthu

Uthenga wofuna kuvomereza momveka bwino. Izi zikuphatikiza mauthenga onse ogwiritsira ntchito ndi mautumiki ambiri, pafupifupi onse kupatula zotengera ndi kuyamikira.

Nambala Yakutsata Mauthenga (msg_seqno)

Nambala ya 32-bit yofanana ndi kuwirikiza kawiri kuchuluka kwa mauthenga "okhudzana ndi zomwe zili" (zomwe zimafuna kuvomereza, makamaka zomwe sizili zotengera) zopangidwa ndi wotumiza uthengawo usanachitike ndipo kenako ndikuwonjezera ndi umodzi ngati uthenga womwe ulipo uthenga wokhudzana ndi zomwe zili. Chidebe nthawi zonse chimapangidwa pambuyo pa zonse zomwe zili mkati mwake; chotero, nambala yake yotsatizana ndi yaikulu kuposa kapena yofanana ndi manambala otsatizana a mauthenga amene ali mmenemo.

Ndi masewera amtundu wanji omwe ali ndi ma increment ndi 1, kenaka wina ndi 2?. makamaka, imatuluka, ikhoza kutumizidwa angapo zitsimikizo zomwezo seq_no! Bwanji? Chabwino, mwachitsanzo, seva imatitumizira chinachake, kutumiza, ndipo ife tokha timakhala chete, timangoyankha ndi mauthenga a utumiki omwe amatsimikizira kulandira mauthenga ake. Pamenepa, zitsimikizo zathu zotuluka zidzakhala ndi nambala yotuluka yofanana. Ngati mumadziwa TCP ndikuganiza kuti izi zikumveka zakutchire, koma zikuwoneka kuti sizowopsa, chifukwa mu TCP seq_no sichisintha, koma kutsimikizira kumapita seq_no mbali inayo, ndidzafulumira kukukhumudwitsani. Zitsimikizo zimaperekedwa mu MTProto OSATI pa seq_no, monga mu TCP, koma mwa msg_id !

Ichi ndi chiyani msg_id, minda yofunika kwambiri? Chizindikiritso chauthenga chapadera, monga dzina limanenera. Imatanthauzidwa ngati nambala ya 64-bit, yotsika kwambiri yomwe ilinso ndi matsenga a "seva-osati-seva", ndipo ena onse ndi nthawi ya Unix, kuphatikizapo gawo laling'ono, losinthidwa 32 bits kumanzere. Iwo. timestamp pa se (ndipo mauthenga omwe ali ndi nthawi zosiyana kwambiri adzakanidwa ndi seva). Kuchokera pa izi zikuwonekera kuti kawirikawiri ichi ndi chizindikiritso chomwe chiri padziko lonse kwa kasitomala. Popeza kuti - tiyeni tikumbukire session_id - tatsimikizika: Palibe nthawi iliyonse yomwe uthenga wopangidwira gawo limodzi ungatumizidwe mu gawo losiyana. Ndiko kuti, zikuwoneka kuti zilipo kale atatu mlingo - gawo, nambala ya gawo, id ya uthenga. Chifukwa chiyani overcomplication, chinsinsi ichi ndi chachikulu kwambiri.

Ndipo kotero, msg_id zofunika kwa...

RPC: zopempha, mayankho, zolakwika. Zitsimikizo.

Monga momwe mwawonera, palibe chapadera "pangani pempho la RPC" kapena gwiritsani ntchito paliponse pachithunzichi, ngakhale pali mayankho. Kupatula apo, tili ndi mauthenga okhudzana ndi zomwe zili! Ndiko kuti, chilichonse uthenga ukhoza kukhala pempho! Kapena ayi. Izi zili choncho, aliyense pali msg_id. Koma pali mayankho:

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

Apa ndipamene zimasonyezedwa uthenga umene ukuyankha. Choncho, pamwamba pa API, muyenera kukumbukira kuti chiwerengero cha pempho lanu chinali chiyani - ndikuganiza kuti palibe chifukwa chofotokozera kuti ntchitoyi ndi yofanana, ndipo pangakhale zopempha zingapo zomwe zikuchitika panthawi imodzi, mayankho omwe angabwezedwe mwadongosolo lililonse? M'malo mwake, kuchokera ku izi ndi mauthenga olakwika ngati palibe ogwira ntchito, zomanga kumbuyo kwa izi zitha kutsatiridwa: seva yomwe imasunga kulumikizana kwa TCP ndi inu ndiyomwe imayang'anira kutsogolo, imatumiza zopempha kumambuyo ndikuzisonkhanitsa kudzera. message_id. Zikuwoneka kuti zonse apa ndi zomveka, zomveka komanso zabwino.

Inde?.. Ndipo ngati mukuganiza za izo? Kupatula apo, yankho la RPC palokha lilinso ndi gawo msg_id! Kodi tiyenera kufuula pa seva "simukuyankha yankho langa!"? Ndipo inde, zinalipo chiyani za zitsimikizo? Za tsamba mauthenga okhudza mauthenga amatiuza chomwe chiri

msgs_ack#62d6b459 msg_ids:Vector long = MsgsAck;

ndipo zizichitidwa mbali zonse. Koma osati nthawi zonse! Ngati mwalandira RpcResult, imagwira ntchito ngati chitsimikiziro. Ndiye kuti, seva imatha kuyankha pempho lanu ndi MsgsAck - monga, "Ndalandira." RpcResult ikhoza kuyankha nthawi yomweyo. Izo zikhoza kukhala zonse.

Ndipo inde, muyenera kuyankhabe yankho! Chitsimikizo. Kupanda kutero, seva iwona kuti siyingatumizidwe ndikukutumiziraninso. Ngakhale pambuyo kugwirizananso. Koma apa, ndithudi, nkhani ya kutha kwa nthawi imabwera. Tiyeni tiyang'ane pa iwo patsogolo pang'ono.

Pakadali pano, tiyeni tiwone zolakwika zomwe zingatheke poyankha mafunso.

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

O, wina adzafuula, apa pali mawonekedwe aumunthu - pali mzere! Chitani mwachifatse. Pano mndandanda wa zolakwika, koma osamaliza. Kuchokera pamenepo timaphunzira kuti code ndi chinachake chonga Zolakwa za HTTP (chabwino, ndithudi, semantics ya mayankho samalemekezedwa, m'malo ena amagawidwa mwachisawawa pakati pa zizindikiro), ndipo mzere umawoneka ngati CAPITAL_LETTERS_AND_NUMBERS. Mwachitsanzo, PHONE_NUMBER_OCCUPIED kapena FILE_PART_Х_MISSING. Chabwino, ndiye kuti, mudzafunikirabe mzere uwu fotokozera. Mwachitsanzo, FLOOD_WAIT_3600 zidzatanthauza kuti muyenera kudikira ola limodzi, ndi PHONE_MIGRATE_5, kuti nambala yafoni yokhala ndi chiyambi ichi iyenera kulembedwa mu 5th DC. Tili ndi chilankhulo choyimira, sichoncho? Sitikufuna mkangano kuchokera ku chingwe, okhazikika adzachita, chabwino.

Apanso, izi siziri patsamba la mauthenga autumiki, koma, monga momwe zilili kale ndi polojekitiyi, chidziwitsocho chikhoza kupezeka patsamba lina lazolemba. Kapena kukayikira. Choyamba, yang'anani, kulemba / kusanja kusanja - RpcError ikhoza kusungidwa mkati RpcResult. Bwanji osatuluka kunja? Kodi sitinaganizire chiyani? RpcError sizingalowetsedwe mkati RpcResult, koma kukhala mwachindunji kapena zisa mu mtundu wina? .. Ndipo ngati sangathe, bwanji si pa mlingo wapamwamba, i.e. ikusowa req_msg_id ? ..

Koma tiyeni tipitilize za mauthenga a utumiki. Wothandizirayo angaganize kuti seva ikuganiza kwa nthawi yayitali ndikupanga pempho lodabwitsa ili:

rpc_drop_answer#58e4a740 req_msg_id:long = RpcDropAnswer;

Pali mayankho atatu otheka ku funso ili, ndikulumikizananso ndi njira yotsimikizira; kuyesa kumvetsetsa zomwe ziyenera kukhala (ndi zomwe mndandanda wamitundu yonse womwe sufuna kutsimikiziridwa) umasiyidwa kwa owerenga ngati homuweki (chidziwitso: zambiri mu nambala yapa Telegraph Desktop sinamalize).

Kuledzera kwa mankhwala osokoneza bongo: zolemba za mauthenga

Nthawi zambiri, malo ambiri ku TL, MTProto ndi Telegraph nthawi zambiri amasiya kukhumudwa, koma chifukwa chaulemu, mwanzeru ndi zina. luso lofewa Tinakhala chete mwaulemu ponena za izo, ndi kutsutsa zonyansa mu zokambirana. Komabe, malo awaОambiri a tsamba ndi za mauthenga okhudza mauthenga Ndizodabwitsa ngakhale kwa ine, yemwe ndakhala ndikugwira ntchito ndi ma protocol a maukonde kwa nthawi yayitali ndipo ndawona njinga zamitundu yokhota.

Zimayamba mosalakwitsa, ndi zitsimikizo. Kenako amatiuza za

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;

Chabwino, aliyense amene ayamba kugwira ntchito ndi MTProto ayenera kuthana nazo; mu "kuwongolera - kubwerezedwanso - kuyambika", kupeza zolakwika za manambala kapena mchere womwe sunayende bwino pakusintha ndi chinthu wamba. Komabe, pali mfundo ziwiri apa:

  1. Izi zikutanthauza kuti uthenga woyambirira watayika. Tiyenera kupanga mizere ina, tidzayang'ana pambuyo pake.
  2. Kodi manambala olakwika achilendowa ndi ati? 16, 17, 18, 19, 20, 32, 33, 34, 35, 48, 64 ... manambala ena ali kuti, Tommy?

Zolembazo zimati:

Cholinga chake ndichakuti ma error_code agawidwa m'magulu (error_code >> 4): mwachitsanzo, ma code 0x40 - 0x4f amafanana ndi zolakwika pakuwonongeka kwa chidebe.

koma, choyamba, kusintha kwa mbali ina, ndipo kachiwiri, ziribe kanthu, kodi zizindikiro zina zili kuti? M'mutu wa wolemba?.. Komabe, izi ndi zazing'ono.

Kuledzera kumayamba mu mauthenga okhudza ma status a mauthenga ndi makope a mauthenga:

  • Pempho Lachidziwitso cha Momwe Mauthenga
    Ngati gulu linalake silinalandirepo zambiri za momwe mauthenga ake akutuluka kwakanthawi, atha kupempha mwachindunji kwa gulu lina:
    msgs_state_req#da69fb52 msg_ids:Vector long = MsgsStateReq;
  • Mauthenga Okhudza Momwe Mauthenga
    msgs_state_info#04deb57d req_msg_id:long info:string = MsgsStateInfo;
    Pano, info ndi chingwe chomwe chili ndi baiti imodzi yokha ya uthenga wa uthenga uliwonse kuchokera pamndandanda wa msg_ids womwe ukubwera:

    • 1 = palibe chomwe chimadziwika za uthengawo (msg_id yotsika kwambiri, winayo mwina wayiwala)
    • 2 = uthenga womwe sunalandiridwe (msg_id ili mkati mwa zizindikiritso zosungidwa; komabe, winayo sanalandire uthenga wotere)
    • 3 = uthenga womwe sunalandire (msg_id wakwera kwambiri; komabe, winayo sanaulandirebe)
    • 4 = uthenga wolandiridwa (zindikirani kuti yankho ilinso nthawi yomweyo chivomerezo cha risiti)
    • +8 = uthenga wavomerezedwa kale
    • +16 = uthenga wosafunikira kuvomereza
    • +32 = Funso la RPC lomwe lili mu uthenga womwe ukukonzedwa kapena kukonzedwa kale
    • + 64 = kuyankha kokhudzana ndi zomwe zalembedwa kale
    • +128 = gulu lina likudziwa kuti uthenga walandilidwa kale
      Yankho ili silifuna kuvomereza. Ndikuvomereza msgs_state_req yoyenera, mkati mwake.
      Zindikirani kuti ngati zikuwonekera mwadzidzidzi kuti gulu lina liribe uthenga wowoneka ngati watumizidwa kwa iwo, uthengawo ukhoza kutumizidwanso. Ngakhale winayo atalandira makope aŵiri a uthengawo nthawi imodzi, obwerezabwerezawo sadzanyalanyazidwa. (Ngati nthawi yochuluka yadutsa, ndipo msg_id woyambirira sakugwiranso ntchito, uthengawo ukulungidwa mu msg_copy).
  • Kuyankhulana Mwaufulu kwa Momwe Mauthenga
    Gulu lirilonse likhoza kudziwitsa gulu lina mwakufuna za momwe mauthenga omwe amaperekedwa ndi gulu lina.
    msgs_all_info#8cc0d131 msg_ids:Vector long info:string = MsgsAllInfo
  • Kulankhulana Modzifunira Kwawonjezeke kwa Momwe Uthenga Umodzi
    ...
    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;
  • Pempho Lachidziwitso Chotumizanso Mauthenga
    msg_resend_req#7d861a08 msg_ids:Vector long = MsgResendReq;
    Phwando lakutali limayankha nthawi yomweyo potumizanso mauthenga omwe adafunsidwa […]
  • Pempho Lachidziwitso Chofuna Kutumizanso Mayankho
    msg_resend_ans_req#8610baeb msg_ids:Vector long = MsgResendReq;
    Phwando lakutali limayankha nthawi yomweyo ndikutumizanso mayankho ku mauthenga omwe afunsidwa […]
  • Mauthenga Makope
    Nthawi zina, uthenga wakale wokhala ndi msg_id womwe suli wovomerezeka umayenera kutumizidwanso. Kenako, imakutidwa mu chidebe chokopera:
    msg_copy#e06046b2 orig_message:Message = MessageCopy;
    Mukalandira, uthengawo umakonzedwa ngati kuti chokulungacho palibe. Komabe, ngati zikudziwika motsimikiza kuti orig_message.msg_id uthengawo unalandiridwa, ndiye kuti uthenga watsopanowo sunasinthidwe (panthawi yomweyo, iwo ndi orig_message.msg_id amavomerezedwa). Mtengo wa orig_message.msg_id uyenera kukhala wotsika kuposa msg_id wa m'chotengeracho.

Tikhale chete kuti chiyani msgs_state_info kachiwiri makutu a TL osamalizidwa akutuluka (tinafuna vekitala ya ma byte, ndipo m'munsi mwazitsulo ziwiri munali enum, ndipo pamwamba pake panali mbendera). Mfundo yake ndi yosiyana. Kodi alipo amene akumvetsa chifukwa chake zonsezi zikuchitika? mu kasitomala weniweni zofunikira? .. Ndizovuta, koma munthu akhoza kulingalira phindu lina ngati munthu akugwira ntchito yowonongeka, komanso muzokambirana - funsani seva kuti ndi chiyani komanso bwanji. Koma apa zopempha zikufotokozedwa ulendo wozungulira.

Izi zikutsatira kuti phwando lirilonse siliyenera kubisa ndi kutumiza mauthenga, komanso kusunga deta za iwo eni, za mayankho kwa iwo, kwa nthawi yosadziwika. Zolemba sizikufotokoza nthawi kapena momwe izi zimathandizira. palibe njira. Chodabwitsa kwambiri ndi chakuti amagwiritsidwa ntchito m'makhodi a makasitomala ovomerezeka! Zikuoneka kuti anauzidwa chinachake chimene sichinaphatikizidwe muzolemba za anthu onse. Mvetserani kuchokera pa code bwanji, sichikhalanso chophweka monga momwe zilili ndi TL - si (pafupifupi) gawo lodzipatula, koma chidutswa chomangirizidwa ku zomangamanga zogwiritsira ntchito, i.e. zidzafuna nthawi yochulukirapo kuti mumvetsetse khodi yogwiritsira ntchito.

Pings ndi nthawi. Mizere.

Kuchokera pachilichonse, ngati tikumbukira zongopeka za kamangidwe ka seva (kugawa zopempha m'mbuyo), chinthu chomvetsa chisoni chikutsatira - ngakhale zitsimikizo zonse zoperekedwa ku TCP (mwina zomwe zaperekedwa, kapena mudzadziwitsidwa za kupuma, koma deta idzaperekedwa mpaka vuto litachitika), kuti zitsimikizo mu MTProto palokha - palibe zitsimikizo. Seva imatha kutaya kapena kutaya uthenga wanu mosavuta, ndipo palibe chomwe chingachitike pa izi, ingogwiritsani ntchito mitundu yosiyanasiyana ya ndodo.

Ndipo choyamba - mizere ya mauthenga. Chabwino, ndi chinthu chimodzi zonse zinali zoonekeratu kuyambira pachiyambi - uthenga wosatsimikiziridwa uyenera kusungidwa ndikutsutsidwa. Ndipo pambuyo pa nthawi yanji? Ndipo wosekayo akumudziwa. Mwina mauthenga omwe amawagwiritsa ntchito mwanjira inayake amathetsa vutoli ndi ndodo, titi, mu Telegraph Desktop pali mizere 4 yofananira nawo (mwinanso, monga tanenera kale, chifukwa cha izi muyenera kuyang'ana kachidindo ndi kamangidwe kake mozama; nthawi yomweyo. nthawi, ife Tikudziwa kuti sichingatengedwe ngati chitsanzo; chiwerengero china cha mitundu kuchokera ku dongosolo la MTProto sichigwiritsidwa ntchito mmenemo).

N’chifukwa chiyani zimenezi zikuchitika? Mwinamwake, opanga mapulogalamu a seva sanathe kutsimikizira kudalirika mkati mwa tsango, kapena ngakhale kubisala kutsogolo kutsogolo, ndipo anasamutsira vutoli kwa kasitomala. Chifukwa cha kutaya mtima, Vasily anayesa kugwiritsa ntchito njira ina, yokhala ndi mizere iwiri yokha, pogwiritsa ntchito ma aligorivimu kuchokera ku TCP - kuyeza RTT ku seva ndikusintha kukula kwa "zenera" (mu mauthenga) malinga ndi chiwerengero cha zopempha zosatsimikiziridwa. Ndiko kuti, zovuta zotere zowunika kuchuluka kwa seva ndi kuchuluka kwa zopempha zathu zomwe zitha kutafuna nthawi imodzi osataya.

Chabwino, ndiye kuti, mukumvetsa, sichoncho? Ngati mukuyenera kukhazikitsanso TCP pamwamba pa protocol yomwe ikuyenda pa TCP, izi zikuwonetsa protocol yopangidwa molakwika.

O eya, chifukwa chiyani mumafunikira mizere yopitilira imodzi, ndipo izi zikutanthauza chiyani kwa munthu yemwe akugwira ntchito ndi API yapamwamba? Yang'anani, mumapanga zopempha, sinthani, koma nthawi zambiri simungathe kutumiza nthawi yomweyo. Chifukwa chiyani? Chifukwa yankho lidzakhala msg_id, zomwe ndi zakanthawiаNdine chilembo, ntchito yomwe idaimitsidwa bwino mpaka mochedwa - ngati seva ikakana chifukwa cha kusagwirizana kwa nthawi pakati pathu ndi iye (zowona, titha kupanga ndodo yomwe imasintha nthawi yathu kuchokera pano. ku seva powonjezera delta yowerengedwa kuchokera ku mayankho a seva - makasitomala ovomerezeka amachita izi, koma ndizopanda pake komanso zolakwika chifukwa cha buffering). Chifukwa chake, mukapempha ndi foni yam'deralo kuchokera ku library, uthengawo umadutsa magawo awa:

  1. Ili pamzere umodzi ndikudikirira kubisa.
  2. Osankhidwa msg_id ndi uthenga anapita kumzera wina - zotheka kutumiza; tumizani ku socket.
  3. a) Seva idayankha MsgsAck - uthengawo udaperekedwa, timachotsa pa "mzere wina".
    b) Kapena mosemphanitsa, sanakonde china chake, adayankha badmsg - tumizani kuchokera ku "mzere wina"
    c) Palibe chomwe chimadziwika, uthenga uyenera kuchotsedwa pamzere wina - koma sizidziwika kuti ndi liti.
  4. Pomaliza seva idayankha RpcResult - yankho lenileni (kapena cholakwika) - osati kungoperekedwa, komanso kukonzedwa.

Mwinamwake, kugwiritsa ntchito makontena kumatha kuthetsa vutoli pang'ono. Apa ndi pamene mulu wa mauthenga amadzazidwa mu umodzi, ndipo seva inayankha ndi chitsimikiziro kwa onsewo mwakamodzi, mu umodzi. msg_id. Koma adzakananso paketi iyi, ngati chinachake chalakwika, chonsecho.

Ndipo pakadali pano malingaliro osakhala aukadaulo amabwera. Kuchokera pazochitika, tawona ndodo zambiri, ndipo kuwonjezera apo, tsopano tiwona zitsanzo zambiri za uphungu woipa ndi zomangamanga - mumikhalidwe yotere, kodi ndi bwino kukhulupirira ndi kupanga zisankho zoterezi? Funso ndilopanda pake (ndithu ayi).

Kodi tikukamba za chiyani? Ngati pamutu wa "mauthenga amankhwala okhudza mauthenga" mutha kuganizabe ndi zotsutsa monga "ndiwe wopusa, sunamvetsetse dongosolo lathu lanzeru!" (kotero lembani zolembazo poyamba, monga momwe anthu wamba ayenera, ndi zomveka ndi zitsanzo za kusinthanitsa paketi, ndiye tikambirana), ndiye kuti nthawi / nthawi ndi funso lothandiza komanso lachindunji, chirichonse pano chadziwika kwa nthawi yaitali. Kodi zolembedwazo zimatiuza chiyani za nthawi yotha?

Seva nthawi zambiri imavomereza kulandira uthenga kuchokera kwa kasitomala (nthawi zambiri, funso la RPC) pogwiritsa ntchito yankho la RPC. Ngati yankho likubwera nthawi yayitali, seva imatha kutumiza chivomerezo cha risiti, ndipo pambuyo pake, yankho la RPC lokha.

Wothandizira nthawi zambiri amavomereza kulandira uthenga kuchokera ku seva (nthawi zambiri, yankho la RPC) powonjezera chivomerezo ku funso lotsatira la RPC ngati silinatumizidwe mochedwa (ngati lipangidwa, nenani, masekondi 60-120 pambuyo pa chiphaso. za uthenga wochokera ku seva). Komabe, ngati kwa nthawi yayitali palibe chifukwa chotumizira mauthenga kwa seva kapena ngati pali mauthenga ambiri osavomerezeka ochokera kwa seva (kunena, pa 16), kasitomala amatumiza kuvomereza payekha.

... Ndikumasulira: ife tokha sitikudziwa kuti ndi zingati komanso momwe tikufunira, choncho tiyeni tiyerekeze kuti zikhale chonchi.

Ndipo za pings:

Mauthenga a Ping (PING/PONG)

ping#7abe77ec ping_id:long = Pong;

Yankho nthawi zambiri limabwezedwa ku kulumikizana komweku:

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

Mauthengawa safuna kuvomereza. Pong imafalikira poyankha ping pomwe ping imatha kuyambitsidwa mbali zonse.

Kutsekedwa kwa Kuyimitsa Kuyimitsa + PING

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

Zimagwira ntchito ngati ping. Kuphatikiza apo, izi zitalandilidwa, seva imayamba chowerengera chomwe chidzatseka kulumikizana kwapano disconnect_delay masekondi pambuyo pake pokhapokha ngati italandira uthenga watsopano wamtundu womwewo womwe umakhazikitsanso nthawi zonse zam'mbuyomu. Ngati kasitomala atumiza ma ping awa kamodzi pa masekondi 60 aliwonse, mwachitsanzo, imatha kuyika disconnect_delay yofanana ndi masekondi 75.

Ndinu openga?! Pakadutsa masekondi 60, sitimayo idzalowa m’siteshoni, kutsika n’kunyamula anthu, kenako n’kusiyanso kulankhulana mumsewu. Mu masekondi 120, pamene mukuimva, idzafika pa ina, ndipo kugwirizana kudzasweka. Chabwino, zikuwonekeratu komwe miyendo ikuchokera - "Ndinamva kulira, koma sindikudziwa komwe kuli", pali algorithm ya Nagl ndi njira ya TCP_NODELAY, yopangidwira ntchito yolumikizana. Koma, pepani, gwiritsitsani mtengo wake wosasinthika - 200 Milimasekondi Ngati mukufunadi kufotokoza zofananazo ndikusunga pamapaketi angapo, kenaka yikani kwa masekondi asanu, kapena chilichonse "Wogwiritsa akulemba..." nthawi yatha ya uthenga. Koma osatinso.

Ndipo potsiriza, pings. Ndiye, kuyang'ana moyo wa kulumikizana kwa TCP. Ndizoseketsa, koma pafupifupi zaka 10 zapitazo ndidalemba mawu ovuta onena za mesenjala wa dorm ya faculty yathu - olemba kumeneko adatsitsanso seva kuchokera kwa kasitomala, osati mosemphanitsa. Koma ophunzira a chaka cha 3rd ndi chinthu chimodzi, ndipo ofesi yapadziko lonse lapansi ndi ina, sichoncho?

Choyamba, pulogalamu yamaphunziro yaying'ono. Kulumikizana kwa TCP, pakalibe kusinthana kwa paketi, kumatha kukhala milungu ingapo. Izi ndi zabwino ndi zoipa, malingana ndi cholinga. Ndibwino kuti mutakhala ndi SSH yotseguka ku seva, mudanyamuka pa kompyuta, munayambitsanso rauta, mubwerere kumalo anu - gawolo kudzera pa seva iyi silinang'ambika (simunalembe kalikonse, panalibe mapaketi) , ndi yabwino. Ndizoipa ngati pali makasitomala masauzande ambiri pa seva, aliyense akutenga zothandizira (hello, Postgres!), Ndipo wolandira kasitomala angakhale atayambiranso kalekale - koma sitidziwa.

Makina a Chat/IM amagwera pamlandu wachiwiri pazifukwa zina zowonjezera - ziwerengero zapaintaneti. Ngati wogwiritsa ntchito "adagwa", muyenera kudziwitsa olankhula nawo za izi. Kupanda kutero, mudzakhala ndi cholakwika chomwe opanga Jabber adapanga (ndikuwongolera kwa zaka 20) - wogwiritsa ntchito adadula, koma akupitilizabe kumulembera mauthenga, akukhulupirira kuti ali pa intaneti (omwe adatayikanso kwathunthu mu izi. mphindi zochepa kulumikizidwa kusanapezeke). Ayi, njira ya TCP_KEEPALIVE, yomwe anthu ambiri omwe samamvetsetsa momwe ma timer a TCP amagwirira ntchito amaponya mwachisawawa (pokhazikitsa zinthu zakutchire ngati masekondi makumi), sizingathandize apa - muyenera kuwonetsetsa kuti osati OS kernel yokha. makina ogwiritsira ntchito ali amoyo, komanso akugwira ntchito bwino, kuti athe kuyankha, ndi ntchito yokha (kodi mukuganiza kuti siingathe kuzizira? Telegalamu Desktop pa Ubuntu 18.04 inandizizira kangapo kamodzi).

Chifukwa chake muyenera kuyimba Seva kasitomala, osati mosemphanitsa - ngati kasitomala achita izi, ngati kugwirizana kwathyoka, ping sidzaperekedwa, cholinga sichidzakwaniritsidwa.

Kodi tikuwona chiyani pa Telegraph? Ndizosiyana ndendende! Chabwino, izo ziri. Mwamwayi, zowonadi, mbali zonse ziwiri zimatha kukangana. M'malo mwake, makasitomala amagwiritsa ntchito ndodo ping_delay_disconnect, yomwe imayika chowerengera pa seva. Chabwino, ndikhululukireni, sikuli kwa kasitomala kusankha nthawi yomwe akufuna kukhala kumeneko popanda ping. Seva, kutengera katundu wake, imadziwa bwino. Koma, ndithudi, ngati simusamala zothandizira, ndiye kuti mudzakhala Pinocchio wanu woipa, ndipo ndodo idzachita ...

Kodi zikanayenera kupangidwa bwanji?

Ndikukhulupirira kuti zomwe zili pamwambazi zikuwonetseratu kuti gulu la Telegram / VKontakte silili oyenerera kwambiri pa kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe ka kayendetsedwe kake ndi ziyeneretso zawo zochepa pazinthu zoyenera.

Chifukwa chiyani zidakhala zovuta kwambiri, ndipo omanga ma Telegraph angayese bwanji kutsutsa? Mfundo yakuti iwo anayesa kupanga gawo lomwe limapulumuka kusweka kwa TCP kugwirizana, mwachitsanzo, zomwe sizinaperekedwe tsopano, tidzapereka pambuyo pake. Mwinanso adayesa kupanga mayendedwe a UDP, koma adakumana ndi zovuta ndikuzisiya (ndicho chifukwa chake zolembazo zilibe kanthu - panalibe chodzitamandira). Koma chifukwa cha kusowa kumvetsa mmene maukonde ambiri ndi TCP makamaka ntchito, kumene mungadalire, ndi kumene muyenera kuchita nokha (ndi momwe), ndi kuyesa kuphatikiza izi ndi cryptography "mbalame ziwiri ndi mwala umodzi”, izi ndi zotsatira zake.

Kodi zinali zofunika bwanji? Kutengera mfundo yakuti msg_id ndi chidindo chanthawi chofunikira kuchokera pamalingaliro achinsinsi kuti mupewe kuwukiranso, ndikulakwitsa kumangirira chizindikiritso chapadera kwa icho. Chifukwa chake, osasintha mwatsatanetsatane kapangidwe kake (pamene mtsinje wa Zosintha umapangidwa, ndiye mutu wapamwamba kwambiri wa API wa gawo lina lazolembazi), wina angafunike:

  1. Seva yomwe ili ndi kugwirizana kwa TCP kwa kasitomala imatenga udindo - ngati yawerenga kuchokera pa socket, chonde vomerezani, konzekerani kapena mubwezere cholakwika, palibe kutaya. Ndiye kutsimikizira si vekitala ya ma ID, koma kungoti "womaliza kulandira seq_no" - nambala chabe, monga mu TCP (zinambala ziwiri - seq yanu ndi yotsimikizika). Nthawi zonse timakhala mkati mwa gawo, sichoncho?
  2. Chidindo chanthawi choletsa kuwukira kobwereza chimakhala gawo losiyana, la nonce. Imafufuzidwa, koma sichikhudza china chilichonse. Zokwanira ndi uint32 - ngati mchere wathu ukusintha pafupifupi theka lililonse la tsiku, titha kugawa ma bits 16 kumagulu otsika a nthawi yapano, yotsalayo - ku gawo laling'ono la sekondi (monga tsopano).
  3. Zachotsedwa msg_id konse - kuchokera pakuwona kusiyanitsa zopempha pazotsatira, pali, choyamba, id ya kasitomala, ndipo kachiwiri, id ya gawoli, imawagwirizanitsa. Chifukwa chake, chinthu chimodzi chokha ndichokwanira ngati chizindikiritso chopempha seq_no.

Iyinso si njira yopambana kwambiri; mwachisawawa wathunthu akhoza kukhala ngati chizindikiritso - izi zachitika kale mu API yapamwamba potumiza uthenga, mwa njira. Zingakhale bwino kukonzanso zomanga kuchokera pachibale mpaka mtheradi, koma uwu ndi mutu wa gawo lina, osati positi iyi.

API?

Ta-daam! Chifukwa chake, titalimbana ndi njira yodzaza ndi zowawa ndi ndodo, tidatha kutumiza zopempha zilizonse kwa seva ndikulandila mayankho aliwonse kwa iwo, komanso kulandira zosintha kuchokera ku seva (osati poyankha pempho, koma lokha. amatitumizira, monga PUSH, ngati wina amveka bwino motero).

Chenjerani, tsopano pakhala chitsanzo chokhacho mu Perl m'nkhaniyi! (kwa iwo omwe sadziwa kalembedwe ka mawu, mkangano woyamba wa Dalitso ndi mawonekedwe a chinthucho, chachiwiri ndi kalasi yake):

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

Inde, osati wowononga dala - ngati simunawerenge, pitirirani ndikuchita!

O, wai~~... izi zikuwoneka bwanji? Chinachake chodziwika bwino…

Ndiye izi ndi momwe zimakhalira... Nanga bwanji, abwenzi?. ndikungoyamba kumene?...Kodi JSON pa HTTPS sizingakhale zophweka?! Tinapeza chiyani posinthana? Kodi khama limenelo linali lofunika?

Tiyeni tiwone zomwe TL+MTroto adatipatsa ndi njira zina zomwe zingatheke. Chabwino, HTTP, yomwe imayang'ana pamtundu woyankhira, ndiyabwino, koma china chake pamwamba pa TLS?

Compact serialization. Kuwona mawonekedwe a data awa, ofanana ndi JSON, ndikukumbukira kuti pali mitundu yake ya binary. Tiyeni tiyimbe MsgPack ngati yosakwanira, koma pali, mwachitsanzo, CBOR - mwa njira, mulingo wofotokozedwa mu RFC 7049. Ndizodziwika chifukwa zimatanthauzira ma tag, monga njira yowonjezera, ndi pakati zokhazikika kale kupezeka:

  • 25 + 256 - kusintha mizere yobwerezabwereza ndikutchula nambala ya mzere, njira yotsika mtengo yophatikizira
  • 26 - chinthu cha Perl chosakanizidwa chokhala ndi dzina la kalasi ndi mikangano yomanga
  • 27 - chinthu chodziyimira pawokha pachilankhulo chokhala ndi dzina la mtundu ndi mikangano ya omanga

Chabwino, ndidayesa kusanja zomwezo mu TL ndi mu CBOR ndi chingwe ndi kulongedza zinthu kuyatsa. Zotsatira zake zidayamba kusiyanasiyana mokomera CBOR kwinakwake kuchokera ku megabyte:

cborlen=1039673 tl_len=1095092

Ndipo kotero, mawu omaliza: Pali mawonekedwe osavuta kwambiri omwe sakhala ndi vuto la kulephera kwa kulunzanitsa kapena chizindikiritso chosadziwika, chofananirako.

Kukhazikitsa kolumikizana mwachangu. Izi zikutanthauza kuti zero RTT pambuyo polumikizananso (pamene fungulo lidapangidwa kale) - likugwira ntchito kuchokera ku uthenga woyamba wa MTProto, koma ndi kusungitsa kwina - kugunda mchere womwewo, gawolo siliwola, ndi zina zotero. Kodi TLS imatipatsa chiyani m'malo mwake? Mawu pamutu:

Mukamagwiritsa ntchito PFS mu TLS, matikiti a gawo la TLS (RFC 5077) kuti muyambitsenso gawo lobisidwa popanda kukambirananso makiyi komanso osasunga zambiri pa seva. Mukatsegula cholumikizira choyamba ndikupanga makiyi, seva imasunga mawonekedwe olumikizirana ndikutumiza kwa kasitomala (monga tikiti ya gawo). Chifukwa chake, kulumikizana kuyambiranso, kasitomala amatumiza tikiti yagawo, kuphatikiza kiyi yagawo, kubwerera ku seva. Tikitiyo yokhayo imasungidwa ndi kiyi yakanthawi (kiyi ya tikiti yagawo), yomwe imasungidwa pa seva ndipo ikuyenera kugawidwa pakati pa maseva akutsogolo akukonza SSL munjira zosiyanasiyana.[10]. Chifukwa chake, kuyambitsa tikiti yagawo kumatha kuphwanya PFS ngati makiyi osakhalitsa a seva asokonezedwa, mwachitsanzo, akasungidwa kwa nthawi yayitali (OpenSSL, nginx, Apache amawasunga mwachisawawa kwa nthawi yonse ya pulogalamuyo; malo otchuka amagwiritsa ntchito. kiyi kwa maola angapo, mpaka masiku).

Pano RTT si zero, muyenera kusinthanitsa osachepera ClientHello ndi ServerHello, pambuyo pake kasitomala akhoza kutumiza deta pamodzi ndi Finished. Koma apa tiyenera kukumbukira kuti tilibe Webusaiti, ndi gulu lake la maulumikizidwe atsopano otsegulidwa, koma mthenga, kugwirizana komwe nthawi zambiri kumakhala nthawi yayitali kapena yocheperapo, pempho lalifupi pamasamba - chirichonse chiri multiplexed. mkati. Ndiye kuti, ndizovomerezeka ngati sitinapeze gawo loyipa la metro.

Mwayiwala zina? Lembani mu ndemanga.

Zipitilizidwa!

Mu gawo lachiwiri la mndandanda wa zolembazi, sitidzalingalira zaukadaulo, koma nkhani za bungwe - njira, malingaliro, mawonekedwe, malingaliro kwa ogwiritsa ntchito, ndi zina zambiri. Kutengera, komabe, pazambiri zaukadaulo zomwe zidaperekedwa pano.

Gawo lachitatu lipitiliza kusanthula zaukadaulo / luso lachitukuko. Muphunzira, makamaka:

  • kupitiriza kwa pandemonium ndi mitundu yosiyanasiyana ya TL
  • zinthu zosadziwika za ma channels ndi magulu akuluakulu
  • chifukwa chake ma dialog ndi oyipa kuposa mndandanda
  • za absolute vs achibale mauthenga adilesi
  • pali kusiyana kotani pakati pa chithunzi ndi chithunzi
  • momwe emoji imasokonezera zolemba za italic

ndi ndodo zina! Dzimvetserani!

Source: www.habr.com

Kuwonjezera ndemanga