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!
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!
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):
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.
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
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
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.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:
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)
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:
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.
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!
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.
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…
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
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, 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.
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 angapoGawo 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 lakeauth_key.
Pomaliza, kasitomala angafune Perfect Forward Secrecy. Aliyense auth_key anali Osatha key - pa DC - ndipo kasitomala akhoza kuyimba auth.bindTempAuthKey za ntchito zosakhalitsaauth_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.
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?
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.
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.
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…
...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:
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
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:
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.
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:
Ili pamzere umodzi ndikudikirira kubisa.
Osankhidwa msg_id ndi uthenga anapita kumzera wina - zotheka kutumiza; tumizani ku socket.
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.
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.
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.
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:
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?
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).
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):
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:
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.