Kutsoropodza kweprotocol uye nzira dzesangano dzeTeregiramu. Chikamu 1, tekinoroji: ruzivo rwekunyora mutengi kubva kutanga - TL, MT

Munguva ichangopfuura, zvinyorwa pamusoro pekuti Teregiramu yakanaka sei, kupenya uye ruzivo hama dzeDurov dziri mukuvaka network network, nezvimwewo zvakatanga kuonekwa kakawanda paHabré. Panguva imwecheteyo, vanhu vashoma vakanyatso kunyudza mumudziyo wehunyanzvi - kazhinji, vanoshandisa iri nyore (uye rakatosiyana neMTrototo) Bot API yakavakirwa paJSON, uye kazhinji vanongobvuma. pakutenda kurumbidza kwese uye PR inotenderedza mutumwa. Rinenge gore nehafu rapfuura, wandaishanda naye kuEshelon NGO Vasily (nenhamo, nhoroondo yake paHabré yakadzimwa pamwe chete negwaro) akatanga kunyora mutengi wake weTeregiramu kubva pakutanga muPerl, uye gare gare munyori wemitsara iyi akabatana. Sei Perl, vamwe vachakurumidza kubvunza? Nokuti mapurojekiti akadai atovepo mune mimwe mitauro.Hazvisizvo hazvo, panogona kuva nemumwe mutauro pasina kana mutauro. yakagadzirira-yakagadzirwa raibhurari, uye naizvozvo munyori anofanira kuenda kwose kwose kubva pakutanga. Uyezve, cryptography inyaya yekuvimba, asi simbisa. Nechigadzirwa chakanangana nekuchengetedza, haugone kungovimba neraibhurari yakagadzirwa-yakagadzirwa kubva kumugadziri uye nekuvimba nayo neupofu (zvisinei, iyi inyaya yechikamu chechipiri). Parizvino, raibhurari inoshanda chaizvo pa "avhareji" nhanho (inobvumidza iwe kuita chero zvikumbiro zveAPI).

Nekudaro, hapazove nezvakawanda cryptography kana math mune ino nhevedzano yezvinyorwa. Asi pachave nemamwe akawanda ehunyanzvi ruzivo uye madondoro ekuvaka (zvakare anobatsira kune avo vasingazonyora kubva pakutanga, asi vachashandisa raibhurari mune chero mutauro). Saka, chinangwa chikuru chaiva chekuedza kushandisa mutengi kubva pakutanga maererano nezvinyorwa zvepamutemo. Ndokunge, ngatifungei kuti iyo sosi kodhi yevashandisi vepamutemo yakavharwa (zvakare, muchikamu chechipiri tichafukidza zvakadzama musoro wenyaya yekuti ichi ichokwadi. zvinoitika saka), asi, sepamazuva ekare, semuenzaniso, kune mwero wakaita seRFC - zvinokwanisika here kunyora mutengi zvinoenderana neyakaomeswa chete, "pasina kutarisa" pane iyo kodhi kodhi, ive yepamutemo (Telegraph Desktop, mobile), kana unofficial Telethon?

Tafura yezviri mukati:

Documentation... iripo, handiti? Ichokwadi here?..

Zvimedu zvezvinyorwa zvechinyorwa ichi zvakatanga kuunganidzwa zhizha rapfuura. Nguva yese iyi pane webhusaiti yepamutemo https://core.telegram.org Zvinyorwa zvaive zveLayer 23, i.e. yakanamira kumwe kunhu muna 2014 (rangarira, pakanga pasina kana chiteshi kumashure?). Ehe, muchirevo, izvi zvaifanira kunge zvakatibvumidza kuita mutengi nekushanda panguva iyoyo muna 2014. Asi kunyangwe mune iyi mamiriro, zvinyorwa zvaive, chekutanga, zvisina kukwana, uye chechipiri, munzvimbo dzaizvipikisa. Angopfuura mwedzi wapfuura, munaGunyana 2019, zvaive netsaona Zvakaonekwa kuti paive neyakakura gadziriso yezvinyorwa pane saiti, yeiyo ichangoburwa Layer 105, ine noti yekuti zvino zvese zvinoda kuverengwa zvakare. Chokwadi, nyaya dzakawanda dzakagadziridzwa, asi dzakawanda dzakaramba dzisina kuchinja. Naizvozvo, kana uchiverenga kutsoropodza pazasi nezve zvinyorwa, iwe unofanirwa kugara uchifunga kuti zvimwe zvezvinhu izvi hazvichakoshi, asi zvimwe zvichiri zvakanyanya. Mushure mezvose, makore mashanu munyika yemazuva ano haisi nguva yakareba, asi chaizvo zvizhinji. Kubva panguva idzodzo (kunyanya kana iwe usingafungi zvakaraswa uye wakamutsidzirwa nzvimbo dze geochat kubva ipapo), nhamba ye API nzira muchirongwa yakakura kubva kune zana kusvika kune mazana maviri nemakumi mashanu!

Ndotangira papi semunyori wechidiki?

Izvo hazvina basa kuti iwe unonyora kubva pakutanga kana kushandisa, semuenzaniso, akagadzirira-akagadzirwa maraibhurari senge Telethon yePython kana Madeline ye PHP, chero zvakadaro, iwe uchada kutanga nyoresa application yako - kuwana parameters api_id и api_hash (avo vakashanda neVKontakte API pakarepo vanonzwisisa) iyo sevha icharatidza kushandiswa. Izvi ndichaita zviite nekuda kwezvikonzero zvemutemo, asi isu tichataura zvakawanda nezvekuti sei vanyori veraibhurari vasingakwanise kuiburitsa muchikamu chechipiri. Iwe unogona kugutsikana nemaitiro ebvunzo, kunyangwe iwo ari mashoma - chokwadi ndechekuti ikozvino unogona kunyoresa imwe chete app, saka usamhanye kupinda mairi.

Zvino, kubva pakuona kwehunyanzvi, isu tinofanirwa kufarira chokwadi chekuti mushure mekunyoreswa tinofanira kugamuchira zviziviso kubva kuTeregiramu nezvekuvandudzwa kune zvinyorwa, protocol, nezvimwe. Ndiko kuti, munhu anogona kufunga kuti nzvimbo ine docks yakangosiyiwa uye yakaramba ichishanda zvakananga nevaya vakatanga kugadzira vatengi, nokuti. zviri nyore. Asi kwete, hapana zvakadaro zvakaonekwa, hapana ruzivo rwakauya.

Uye kana iwe ukanyora kubva mukutanga, saka kushandisa iyo yakawanikwa parameter ichiri kure kure. Nyangwe https://core.telegram.org/ uye inotaura nezvadzo muKutanga kutanga kune zvese, kutaura zvazviri, unofanira kutanga waita MTProto protocol - asi kana iwe wakatenda marongero zvinoenderana neiyo OSI modhi pamagumo epeji kune tsanangudzo yakazara yeprotocol, zvino hazvina maturo zvachose.

Muchokwadi, pamberi uye mushure meMTrototo, pamatanho akati wandei kamwechete (sekune dzimwe nyika networkers vanoshanda muOS kernel vanoti, kutyora layer), hombe, inorwadza uye inotyisa musoro ichapinda munzira ...

Binary serialization: TL (Type Mutauro) uye hurongwa hwayo, uye mitsara, uye mamwe akawanda mazwi anotyisa.

Ichi chinyorwa, chokwadi, ndicho kiyi yezvinetso zveTeregiramu. Uye pachava nemazwi akawanda anotyisa kana ukaedza kunyura mazviri.

Saka, heino dhayagiramu. Kana izwi iri rikauya mupfungwa dzako, iti, JSON Schema, Mafunga zvakanaka. Chinangwa chakafanana: mumwe mutauro kutsanangura seti inogona kutumirwa data. Apa ndipo panoperera kufanana. Kana kubva papeji MTProto protocol, kana kubva kune sosi yemuti wemutengi wepamutemo, isu tichaedza kuvhura imwe schema, tichaona chimwe chinhu chakadai:

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;

Munhu achiona izvi kekutanga anozokwanisa kuziva chikamu chete chezvakanyorwa - zvakanaka, izvi sezviri pachena zvimiro (kunyangwe zita riripi, kuruboshwe kana kurudyi?), Kune minda mazviri, mushure mezvo imwe mhando inotevera mushure mekoloni ... zvichida. Pano mumakona mabhuraketi panogona kunge paine matemplate senge muC ++ (chaizvoizvo, kwete chaizvo) Uye zvimwe zviratidzo zvese zvinorevei, mamakisi emubvunzo, mamakisi ekushamisika, maperesenti, hashi mamaki (uye zviri pachena kuti anoreva zvinhu zvakasiyana munzvimbo dzakasiyana), dzimwe nguva aripo uye dzimwe nguva kwete, nhamba dzehexadecimal - uye zvakanyanya kukosha, kuti ungawana sei kubva pane izvi. iye chaiye (iyo isingazorambwe neserver) byte stream? Iwe unofanirwa kuverenga zvinyorwa (ehe, pane zvinongedzo kune schema muJSON vhezheni iri padyo - asi izvo hazviite kuti zvijeke).

Vhura peji Binary Data Serialization uye kunyura munyika yemashiripiti yehowa uye discrete masvomhu, chimwe chinhu chakafanana nematan mugore re4. Alphabet, mhando, kukosha, combinator, inoshanda combinator, yakajairika fomu, composite type, polymorphic type... uye ingori peji rekutanga! Zvinokumirira TL Mutauro, iyo, kunyange yatova nemuenzaniso wechikumbiro chiduku nemhinduro, haipe mhinduro zvachose kune dzimwe nyaya dzakawanda, zvinoreva kuti uchafanira kufamba nekudzokorora kwemasvomhu akashandurwa kubva kuRussia kuenda kuChirungu pane mamwe masere akaiswa. mapeji!

Vaverengi vanoziva mitauro inoshanda uye otomatiki mhando inference, hongu, vachaona mutauro wekutsanangura mumutauro uyu, kunyangwe kubva pamuenzaniso, zvakanyanya kujaira, uye vanogona kutaura kuti izvi hazvina kushata musimboti. Zvinopikisa izvi ndezvi:

  • ehe, цель zvinonzwika zvakanaka, asi maiwe, iye hazvina kuwanikwa
  • Dzidzo kumayunivhesiti eRussia inosiyana kunyangwe pakati pehunyanzvi hweIT - havasi vese vakatora kosi inoenderana
  • Pakupedzisira, sezvatichaona, mukuita ndizvo kwete, sezvo chete chikamu chidiki cheiyo TL chakatsanangurwa chinoshandiswa

Sezvakataurwa LeoNerd pachiteshi #perl muFreeNode IRC network, yakaedza kushandisa gedhi kubva kuTeregiramu kuenda kuMatrix (shanduro yekotesheni haina kururama kubva mundangariro):

Zvinoita sekunge mumwe munhu akaunzwa kutaipa dzidziso kekutanga, akafara, akatanga kuyedza kutamba nayo, asina hanya nazvo kuti yaidiwa mukuita.

Zvionere wega, kana kudiwa kweasina-mhando (int, refu, nezvimwewo) sechinhu chekutanga chisingamutsi mibvunzo - pakupedzisira inofanirwa kuitwa nemawoko - semuenzaniso, ngatitorei kuedza kutora kubva kwavari. vector. Ndiko kuti, rondedzero, kana ukadaidza zvinhu zvacho nemazita azvo chaiwo.

Asi kare

Tsanangudzo pfupi yechikamu cheTL syntax kune avo vasingaverenge zviri pamutemo zvinyorwa

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;

Tsanangudzo nguva dzose inotanga конструктор, mushure mezvo zvingasarudzwa (mukuita - nguva dzose) kuburikidza nechiratidzo # ndinofanira CRC32 kubva kune yakajairika tsananguro tambo yerudzi urwu. Inotevera inouya tsananguro yeminda; kana iripo, mhando inogona kunge isina chinhu. Izvi zvese zvinopera nechiratidzo chakaenzana, zita remhando iyo muvaki uyu - kureva kuti, iyo subtype - ndeye. Mukomana ari kurudyi kwechiratidzo chakaenzana ndiye polymorphic - ndiko kuti, akati wandei marudzi anogona kuenderana nawo.

Kana tsanangudzo ikaitika mushure memutsara ---functions---, ipapo syntax icharamba yakafanana, asi chirevo chichave chakasiyana: muvaki achava zita reRPC basa, minda ichava parameters (zvakanaka, kureva, icharamba yakanyatsofanana yakapiwa chimiro, sezvinotsanangurwa pasi apa. , izvi zvichangove zvazvinoreva), uye "polymorphic type" - rudzi rwechigumisiro chakadzorerwa. Ichokwadi, icharamba iine polymorphic - inongotsanangurwa muchikamu ---types---, asi muvaki uyu "haazotariswi". Kuremedza marudzi anonzi mabasa nemakakatanwa avo, i.e. Nechimwe chikonzero, akati wandei ane zita rimwechete asi masiginecha akasiyana, semuC ++, haana kupihwa muTL.

Sei "muvaki" uye "polymorphic" kana isiri OOP? Zvakanaka, chaizvoizvo, zvichave nyore kuti mumwe munhu afunge pamusoro peizvi mumashoko eOOP - rudzi rwepolymorphic sekirasi isinganzwisisike, uye vavaki ndivo makirasi avo akananga, uye final mumashoko emitauro yakati wandei. Muchokwadi, hongu, pano chete kufanana ine chaiyo yakawandisa nzira dzekuvaka muOO programming mitauro. Sezvo pano angori zvimiro zve data, hapana nzira (kunyangwe tsananguro yemabasa uye nzira zvakare inokwanisa kugadzira kuvhiringidzika mumusoro kuti iripo, asi iyo inyaya yakasiyana) - unogona kufunga nezve muvaki semutengo kubva. izvo iri kugadzirwa nyora paunenge uchiverenga byte stream.

Izvi zvinoitika sei? Iyo deserializer, iyo inogara ichiverenga 4 bytes, inoona kukosha 0xcrc32 - uye anonzwisisa zvichaitika zvinotevera field1 with type int, i.e. inoverenga chaizvo 4 bytes, pane iyi ndima yakapfuura nemhando PolymorType verenga. Maona 0x2crc32 uye anonzwisisa kuti kune minda miviri zvakare, yekutanga long, zvinoreva kuti tinoverenga 8 bytes. Uye zvakare zvakare mhando yakaoma, iyo inosarudzika nenzira imwecheteyo. Semuyenzaniso, Type3 inogona kuziviswa mudunhu nekukurumidza kana vaviri vavaki, zvichiteerana, saka ivo vanofanirwa kusangana kana 0x12abcd34, mushure mezvo unoda kuverenga 4 mamwe mabheti int, kana 0x6789cdef, shure kwaizvozvo hakuzovi nechinhu. Chero chimwe chinhu - iwe unofanirwa kukanda kunze. Zvisinei, mushure meizvi tinodzokera kuverenga 4 bytes int minda field_c в constructorTwo uye naizvozvo tinopedza kuverenga zvedu PolymorType.

Pakupedzisira, kana ukabatwa 0xdeadcrc nokuti constructorThree, ipapo zvinhu zvose zvinobva zvanyanya kuoma. Munda wedu wekutanga ndewe bit_flags_of_what_really_present with type # - kutaura zvazviri, ichi chingori chirevo chemhando nat, zvinoreva kuti "nhamba chaiyo". Iko ndiko, kutaura zvazviri, int isina kunyoreswa, nenzira, iyo chete kesi kana nhamba dzisina kunyorwa dzichiitika mumasekete chaiwo. Saka, chinotevera chivakwa chine mucherechedzo webvunzo, zvichireva kuti munda uyu - uchange uripo pawaya chete kana iyo inoenderana bhiti yakaiswa mumunda unotaurwa (inenge senge ternary opareta). Saka, ngatifungei kuti chidimbu ichi chakaiswa, zvinoreva kuti zvakare tinoda kuverenga ndima senge Type, iyo mumuenzaniso wedu ine 2 vavaki. Imwe haina chinhu (inongova nechiziviso), imwe ine munda ids with type ids:Vector<long>.

Iwe unogona kufunga kuti ese matemplate uye mageneric ari mune zvakanakira kana Java. Asi kwete. Kunenge. Izvi ivo chete nyaya yekushandisa mabhaketi emakona mumaseketi chaiwo, uye inoshandiswa CHETE kune Vector. Mune iyo byte stream, aya achave 4 CRC32 bytes yeVector mhando pachayo, inogara yakafanana, ipapo 4 byte - huwandu hwezvinhu zvakarongwa, uyezve izvi zvinhu pachazvo.

Wedzera kune ichi chokwadi chekuti serialization inogara ichiitika mumashoko e4 bytes, marudzi ese anowanza ayo - akavakirwa-mukati marudzi anotsanangurwa zvakare. bytes и string nemanual serialization yehurefu uye kurongeka uku ne4 - zvakanaka, zvinoita sekunge zvakajairika uye zvinotoshanda? Kunyangwe TL ichinzi inoshanda bhinari serialization, kugehena navo, nekuwedzera kwechero chero chinhu, kunyangwe Boolean kukosha uye mutsara-tambo tambo kusvika 4 bytes, JSON icharamba yakakora here? Tarisa, kunyangwe minda isingakodzeri inogona kusvetwa nediki mireza, zvese zvakanaka, uye zvinotowedzera kune remangwana, saka wadii kuwedzera minda mitsva yesarudzo kune muvaki gare gare?..

Asi kwete, kana iwe ukaverenga kwete tsananguro yangu pfupi, asi zvinyorwa zvizere, uye funga nezvekuita. Chekutanga, iyo CRC32 yemugadziri inoverengerwa zvinoenderana neyakajairwa mutsara werondedzero yemavara echirongwa (bvisa yakawedzera whitespace, nezvimwewo) - saka kana munda mutsva wawedzerwa, mhando yekutsanangura mutsara ichachinja, uye nekudaro CRC32 yayo uye , nokudaro, serialization. Uye mutengi wekare aizoita sei kana akagamuchira munda une mireza mitsva yakaiswa, uye haazive zvekuita nawo anotevera? ..

Chechipiri, ngatirangarirei CRC32, iro rinoshandiswa pano se hash mabasa kuti usarudze kuti ndeupi rudzi rwuri kuitwa (de) serialized. Pano takatarisana nedambudziko rekudhumhana - uye kwete, mukana hausi mumwe mu232, asi wakakura. Ndiani akarangarira kuti CRC32 yakagadzirirwa kuona (uye kugadzirisa) zvikanganiso muchiteshi chekutaurirana, uye nekudaro inovandudza zvivakwa izvi kukuvadza vamwe? Semuenzaniso, haina basa nekugadzirisazve mabheti: kana iwe ukaverenga CRC32 kubva mumitsara miviri, mune yechipiri iwe unochinjanisa yekutanga 4 byte neanotevera mabhayiti mana - zvichave zvakafanana. Kana mapindiro edu ari tambo dzemavara kubva kuarufabheti yechiLatin (uye tumapumishoni tudiki), uye aya mazita asina kunyanya kurongeka, mukana wekurongeka patsva unowedzera zvakanyanya.

Nenzira, ndiani akatarisa zvaivepo? chaizvo CRC32? Imwe yemakodhi ekutanga masosi (kunyangwe Waltman asati) aive nebasa rehashi raiwedzera hunhu hwega hwega nenhamba 239, inodiwa nevanhu ava, ha ha!

Pakupedzisira, zvakanaka, takaona kuti vavaki vane mhando yemunda Vector<int> и Vector<PolymorType> ichave neCRC32 yakasiyana. Zvakadini nekuita kwepamhepo? Uye kubva pamaonero edzidziso, izvi zvinova chikamu chemhando? Ngatitii tinopfuudza zviuru gumi zvenhamba, zvakanaka Vector<int> zvinhu zvose zvakajeka, kureba uye mamwe 40000 bytes. Ko kana izvi Vector<Type2>, iyo ine chikamu chimwe chete int uye ndiyo yega mumhando - tinoda kudzokorora 10000xabcdef0 34 nguva uyezve 4 bytes int, kana mutauro unokwanisa KUITIRIRA isu kubva kumugadziri fixedVec uye pachinzvimbo che80000 bytes, chinjisa zvakare 40000 chete?

Uyu hausi mubvunzo usina basa wedzidziso zvachose - fungidzira unogamuchira runyoro rwevashandisi veboka, mumwe nemumwe ane id, zita rekutanga, zita rekupedzisira - mutsauko wehuwandu hwe data inotamiswa pamusoro penharembozha inogona kuve yakakosha. Ndiko chaizvo kushanda kweTelegraph serialization inoshambadzirwa kwatiri.

Saka…

Vector, iyo isina kumbobvira yaburitswa

Kana iwe ukayedza kufamba nemapeji etsanangudzo yevanosanganisa uye zvichingodaro, iwe uchaona kuti vector (uye kunyangwe matrix) iri kuyedza kuyedza kubuda kuburikidza nematepi emapepa akati wandei. Asi pakupedzisira vanokanganwa, danho rekupedzisira rinodarika, uye tsanangudzo yevector inongopiwa, iyo isati yakasungirirwa kune imwe mhando. Chii chiri kunetsa? Mumitauro programming, kunyanya zvinoshanda, zvakajairwa kutsanangura chimiro ichidzokororwa - muunganidzi nekuongorora kwayo kweusimbe achanzwisisa uye kuita zvese pachayo. Mumutauro data serialization chinodiwa KUTEVEDZERA: zvakakwana kungotsanangura Pamazita, i.e. chimiro chezvikamu zviviri - chekutanga chinhu che data, chechipiri chimiro chakafanana pachezvacho kana nzvimbo isina chinhu yemuswe (pack (cons) muLisp). Asi izvi zvichava pachena zvinoda cheumwe neumwe element inoshandisa imwe 4 bytes (CRC32 mune iyo kesi muTL) kutsanangura mhando yayo. Mutsara unogonawo kutsanangurwa zviri nyore saizi yakatarwa, asi muchiitiko cheurefu husingazivikanwi pachine nguva mberi, tinoparadzana.

Naizvozvo, sezvo TL isingatenderi kuburitsa vector, yaifanira kuwedzerwa padivi. Pakupedzisira zvinyorwa zvinoti:

Seriization nguva dzose inoshandisa muvaki mumwe chete “vector” (const 0x1cb5c415 = crc32(“vector t:Type # [ t ] = Vector t”) isingatsamiri pakukosha chaiko kweshanduko yerudzi t.

Iko kukosha kweiyo sarudzo paramende t haina kubatanidzwa mukuteedzerwa sezvo ichitorwa kubva mumhedzisiro mhando (inogara ichizivikanwa isati yasvika deserialization).

Nyatsotarisa: vector {t:Type} # [ t ] = Vector t - asi hapana kwese Iyi tsanangudzo pachayo haitauri kuti nhamba yekutanga inofanira kuenzana nehurefu hwevheti! Uye hazvibvi chero kupi zvako. Izvi zvakapihwa zvinoda kuchengetwa mupfungwa uye kuitwa nemaoko ako. Kumwe kunhu, zvinyorwa zvinototaura zvakatendeseka kuti mhando yacho haisi yechokwadi:

Iyo Vector t polymorphic pseudotype i "mhando" iyo kukosha kwayo kutevedzana kwehunhu hwechero mhando t, ingave yebhokisi kana isina.

... asi haatarise pazviri. Kana iwe, wakaneta nekufamba-famba nekutambanudza kwemasvomhu (zvichida kunyange kuzivikanwa kwauri kubva kuyunivhesiti kosi), sarudza kurega uye kunyatso tarisa maitiro ekushanda nayo mukuita, fungidziro yasara mumusoro mako ndeyekuti izvi zvakakomba. Masvomhu pamusimboti, yakanyatso gadzirwa neVanotonhorera People (masvomhu maviri - ACM anokunda), uye kwete chero munhu. Chinangwa - kushamisira - chave kuwanikwa.

Nenzira, nezve nhamba. Ngatikuyeuchidzei izvozvo # izwi rimwechete nat, natural number:

Pane mazwi emhando (type-expr) uye zvirevo zvenhamba (nat-expr) Zvisinei, vanotsanangurwa nenzira imwe cheteyo.

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

asi mumutauro vanotsanangurwa nenzira imwechete, i.e. Musiyano uyu unofanirwa kurangarirwa zvakare uye kuiswa mukuitwa nemaoko.

Ehe, hongu, mhando dzetemplate (vector<int>, vector<User>) vane chiziviso chakafanana (#1cb5c415), i.e. kana uchiziva kuti kufona kunoziviswa se

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

ipapo iwe hausisiri kumirira chete vector, asi vector yevashandisi. Kunyanya, anofanira mirira - mune kodhi chaiyo, chinhu chimwe nechimwe, kana chisiri rudzi chisina kujeka, chichava nemuvaki, uye nenzira yakanaka mukuita zvingave zvakakosha kutarisa - asi isu takatumirwa chaizvo mune zvese zveiyi vector. mhando iyoyo? Ko dai yaive imwe mhando yePHP, umo hurongwa hunogona kuve nemhando dzakasiyana muzvinhu zvakasiyana?

Panguva ino iwe unotanga kufunga - iyo TL yakadaro inofanirwa here? Zvichida kune ngoro zvingave zvichiita kushandisa serializer yemunhu, iyo protobuf yakafanana yakanga yatovapo kare? Ndiyo yaive dzidziso, ngatitarisei maitiro.

Kuitwa kweTL kuriko mukodhi

TL akaberekerwa munzvimbo dzakadzika dzeVKontakte kunyange zvisati zvaitika zviitiko zvakakurumbira nekutengeswa kwemugove waDurov uye (zvirokwazvo), kunyange kusati kwatanga kugadzirwa kweTeregiramu. Uye mune yakavhurika sosi source code yekutanga kuita unogona kuwana akawanda madondoro anosetsa. Uye mutauro wacho pachawo wakaitwa ipapo zvizere kupfuura zvawava muTeregiramu. Semuenzaniso, hashes haashandiswe zvachose muchirongwa (kureva yakavakirwa-mukati pseudotype (senge vector) ine maitiro akatsauka). Kana

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

asi ngatitarisei, kuitira kuzara, kuronda, sekutaura, kushanduka kweGiant of Thinking.

#define ZHUKOV_BYTES_HACK

#ifdef ZHUKOV_BYTES_HACK

/* dirty hack for Zhukov request */

Kana iyi yakanaka:

    static const char *reserved_words_polymorhic[] = {

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

      };

Ichi chidimbu chiri nezve matemplate akadai:

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

Iyi ndiyo tsanangudzo yehashmap template mhando sevector ye int - Type pairs. MuC ++ zvaizotaridzika seizvi:

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

saka, alpha - keyword! Asi muC ++ chete unogona kunyora T, asi unofanira kunyora alpha, beta ... Asi kwete kupfuura 8 parameters, ndiko kunopera fantasy. Zvinoita sokuti pane imwe nguva muSt. Petersburg dzimwe nhaurirano dzakadai seidzi dzakamboitika:

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

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

Asi izvi zvaive zvekutanga kuburitswa kweTL "zvakawanda". Ngatienderere mberi tichifunga nezvekuita muTeregiramu vatengi pachavo.

Shoko kuna Vasily:

Vasily, [09.10.18 17:07] Chizhinji chezvose, mbongoro inopisa nokuti vakagadzira boka rezvivharo, ndokubva varova bhaudhi pavari, uye vakavhara code generator nemadondoro.
Nekuda kweizvozvo, kutanga kubva kudock pilot.jpg
Zvadaro kubva kodhi dzhekichan.webp

Ehe, kubva kune vanhu vanoziva ma algorithms uye masvomhu, isu tinogona kutarisira kuti vakaverenga Aho, Ullmann, uye vanoziva maturusi akave de facto standard muindasitiri kwemakumi emakore ekunyora avo DSL compilers, handiti?..

By telegram-cli ndiVitaly Valtman, sezvinogona kunzwisiswa kubva pakuitika kweiyo TLO fomati kunze kwe (cli) miganhu, nhengo yechikwata - ikozvino raibhurari yeTL parsing yakapihwa. zvakasiyana, arikufungei TL parser? ..

16.12 04:18 Vasily: Ndinofunga kuti mumwe munhu haana kugona lex+yacc
16.12 04:18 Vasily: Handikwanise kuzvitsanangura neimwe nzira
16.12 04:18 Vasily: zvakanaka, kana kuti vakabhadharwa nhamba yemitsara muVK
16.12 04:19 Vasily: 3k+ mitsetse nezvimwe.<censored> pachinzvimbo chemuongorori

Zvimwe kunze? Ngationei kuti sei zvinoita Uyu ndiye OFFICIAL mutengi - 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+ mitsetse muPython, akati wandei matauriro + akasarudzika makesi senge vector, iyo, chokwadi, inoziviswa muchirongwa sezvainofanirwa kunge ichienderana neTL syntax, asi vaivimba neiyi syntax kuti iparadze ... Mubvunzo unovapo, nei zvese zvaive mashura?иIyo yakawedzera kurongeka kana pasina anozoiburitsa zvinoenderana nezvinyorwa zvakadaro?!

Nenzira... Rangarira takataura nezve CRC32 yekutarisa? Saka, muTeregiramu Desktop kodhi jenareta pane rondedzero yekusarudzika kune idzo mhando umo yakaverengerwa CRC32. hazvienderani neicho charatidzwa mudhayagiramu!

Vasily, [18.12/22 49:XNUMX] uye pano ndaizofunga kana TL yakadaro ichidiwa.
kana ndaida kukanganisa nemamwe mashandisirwo, ndaizotanga kuisa mitsetse yemitsara, hafu yevaparidzi ichatsemuka pane-multi-line tsananguro.
tdesktop, zvisinei, zvakare

Rangarira pfungwa yeimwe-liner, isu tichadzokera kwairi zvishoma gare gare.

Zvakanaka, telegraph-cli haina pamutemo, Teregiramu Desktop iri pamutemo, asi ko vamwe? Ndiani anoziva?.. Muiyo Android client kodhi pakanga pasina schema parser zvachose (izvo zvinomutsa mibvunzo nezve yakavhurika sosi, asi iyi ndeye yechipiri chikamu), asi pakanga paine akati wandei mamwe zvidimbu zvinosetsa zvekodhi, asi zvakawanda pazviri chikamu pazasi.

Ndeipi mimwe mibvunzo inomutswa serialization mukuita? Semuenzaniso, vakaita zvinhu zvakawanda, hongu, neminda mishoma uye minda ine zvirevo:

Vasily: flags.0? true
zvinoreva kuti munda uripo uye wakaenzana chokwadi kana mureza wakaiswa

Vasily: flags.1? int
zvinoreva kuti munda uripo uye unoda kuregererwa

Vasily: mbongoro, usanetseka pamusoro pezvauri kuita!
Vasily: Pane kutaurwa kumwe kunhu mune doc kuti ichokwadi imhando isina zero-kureba, asi hazvigoneke kuunganidza chero chinhu kubva kuchiremba wavo.
Vasily: Mune yakavhurika sosi kuita izvi hazvisizvo zvakare, asi kune boka remadondoro uye anotsigira.

Zvakadini neTelethon? Kutarisa mberi kune musoro weMTProto, muenzaniso - mune zvinyorwa kune zvidimbu zvakadaro, asi chiratidzo % inotsanangurwa chete se "inopindirana neakapiwa asina-mhando", i.e. mumienzaniso iri pazasi pane kukanganisa kana chimwe chinhu chisina kunyorwa:

Vasily, [22.06.18 18:38] Munzvimbo imwe:

msg_container#73f1f8dc messages:vector message = MessageContainer;

Mune zvakasiyana:

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

Uye iyi misiyano mikuru miviri, muhupenyu chaihwo imwe mhando yekushama vector inouya

Ini handisati ndaona isina vector tsananguro uye handina kuwana imwe

Ongororo yakanyorwa neruoko mu telethon

Mumufananidzo wake tsanangudzo inotsanangurwa msg_container

Zvakare, mubvunzo unoramba uri pamusoro pe%. Hazvitsanangurwi.

Vadim Goncharov, [22.06.18 19:22] uye mune tdesktop?

Vasily, [22.06.18 19:23] Asi yavo TL parser pamainjini enguva dzose vangangosadya izvi zvakare.

// parsed manually

TL yakanaka yekubvisa, hapana anoishandisa zvachose

Uye % haisi mushanduro yavo yechirongwa

Asi pano zvinyorwa zvinozvipikisa, saka idk

Yakawanikwa mumutauro, vaigona kungokanganwa kutsanangura semantics

Iwe wakaona gwaro paTL, haugone kuzvifungidzira pasina hafu yerita

"Zvakanaka, ngatiti," mumwe muverengi achati, "unoshoropodza chimwe chinhu, saka ndiratidze kuti chinofanira kuitwa sei."

Vasily anopindura kuti: “Kana ari muparidzi, ndinoda zvinhu zvakadai

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

neimwe nzira inoifarira kupfuura

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

kana

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

iyi ndiyo YESE lexer:

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

avo. zviri nyore kutaura zvinyoro. "

Kazhinji, semhedzisiro, iyo parser uye kodhi jenareta yeiyo chaiyo yakashandiswa subset yeTL inokodzera mune ingangoita zana mitsara yegirama uye ~ 100 mitsetse yejenareta (kuverenga ese. print's yakagadzirwa kodhi), kusanganisira mhando yeruzivo mabhanzi ekufungidzira mukirasi yega yega. Imwe neimwe polymorphic mhando inoshanduka kuita isina chinhu abstract base kirasi, uye vavaki nhaka kubva mairi uye vane nzira dzekuita serialization uye deserialization.

Kushaikwa kwemhando mumutauro wemhando

Kutaipa kwakasimba chinhu chakanaka, handiti? Kwete, iyi haisi holivar (kunyangwe ini ndichifarira mitauro ine simba), asi chirevo mukati meiyo TL. Kubva pazviri, mutauro unofanirwa kutipa marudzi ese echeki kwatiri. Zvakanaka, zvakanaka, pamwe kwete iye pachake, asi kushandiswa, asi anofanira kunge achitsanangura ivo. Uye rudzii rwemikana yatinoda?

Chokutanga pane zvose, zvipingamupinyi. Pano tinoona mune zvinyorwa zvekuisa mafaira:

Iyo bhinari yefaira yemukati inozopatsanurwa kuita zvikamu. Zvikamu zvese zvinofanirwa kunge zvine saizi yakafanana ( part_size ) uye zvinotevera zvinofanirwa kuzadzikiswa:

  • part_size % 1024 = 0 (inopatsanurwa ne1KB)
  • 524288 % part_size = 0 (512KB inofanira kupatsanurwa zvakaenzana nechikamu_saizi)

Chikamu chekupedzisira hachifanire kugutsa aya mamiriro, chero saizi yaro iri pasi pechikamu_saizi.

Chikamu chimwe nechimwe chinofanira kunge chine nhamba yekutevedzana, file_part, ine kukosha kubva pa0 kusvika pa2,999.

Mushure mekunge faira yapatsanurwa iwe unofanirwa kusarudza nzira yekuichengeta pane server. Shandisa upload.saveBigFilePart kana saizi yakazara yefaira inopfuura 10 MB uye upload.saveFilePart kune madiki mafaira.
[...] imwe yeanotevera data yekukanganisa kukanganisa inogona kudzoserwa:

  • FILE_PARTS_INVALID - Nhamba yezvikamu haisiriyo. Kukosha hakusi pakati 1..3000

Pane chimwe cheizvi mudhayagiramu? Izvi zvinonzwika neimwe nzira uchishandisa TL? Aihwa. Asi ndiregerereiwo, kunyangwe sekuru Turbo Pascal akakwanisa kutsanangura mhando dzakataurwa ranges. Uye aiziva chimwe chinhu zvakare, icho zvino chinozivikanwa zviri nani se enum - rudzi runosanganisira kuverengwa kwenhamba yakatarwa (diki) yehukoshi. Mumitauro yakaita seC -nhamba, cherechedza kuti kusvika parizvino tangotaura nezvemhando nhamba. Asi kunewo arrays, tambo ... semuenzaniso, zvingava zvakanaka kutsanangura kuti tambo iyi inogona chete kuva nenhamba yefoni, handiti?

Hapana chimwe cheizvi chiri muTL. Asi pane, semuenzaniso, muJSON Schema. Uye kana mumwe munhu angakakavara pamusoro pekuparadzaniswa kwe512 KB, kuti izvi zvichiri kuda kuongororwa mukodhi, saka ita shuwa kuti mutengi ari nyore. handina kukwanisa tumira nhamba kunze kwehuwandu 1..3000 (uye kukanganisa kwaienderana kwaisagona kumuka) zvingadai zvakagoneka, handiti?..

Nenzira, pamusoro pezvikanganiso uye maitiro ekudzoka. Kunyangwe avo vakashanda neTL vakasvinura maziso avo - hazvina kubva zvangobuda patiri izvozvo imwe neimwe basa riri muTL rinogona kudzosera kwete chete yakatsanangurwa mhando yekudzoka, asiwo kukanganisa. Asi izvi hazvigone kutorwa neimwe nzira uchishandisa iyo TL pachayo. Ehe, zvatove pachena uye hapana chikonzero chechero chinhu mukuita (kunyangwe hazvo, RPC inogona kuitwa nenzira dzakasiyana, isu tichadzoka kune izvi gare gare) - asi zvakadini neKuchena kwemafungiro eMathematics eAbstract Types. kubva kunyika yekudenga?.. Ndakasimudza tug - saka zvifananidze.

Uye pakupedzisira, zvakadini nekuverenga? Zvakanaka, ipapo, kazhinji, ndinoda tsananguro Ive nayo mu schema (muJSON schema, zvakare, ndizvo), asi kana iwe watonetsekana nazvo, saka zvakadini nedivi rinoshanda - zvirinani kutarisa zvakasiyana panguva yekuvandudzwa? Zvionere wega pa mienzaniso chaiyo:

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

kana

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

Izvo zvinoenderana nemunhu wese, asi GitHub, semuenzaniso, inoramba kuratidza shanduko mukati memitsara yakareba kudaro. Mutambo "wana 10 misiyano", uye izvo uropi hunoona pakarepo ndezvokuti kutanga uye kuguma mumienzaniso miviri yakafanana, unoda kuverenga zvakaoma pane imwe nzvimbo pakati ... Mukuona kwangu, izvi hazvisi mudzidziso chete, asi kungoona chete tsvina uye netsvina.

Nenzira, pamusoro pekuchena kwedzidziso. Sei tichida bit fields? Hazviratidzi here kuti ivo munhuwi zvakaipa kubva pakuona kwemhando dzidziso? Tsananguro inogona kuoneka mushanduro dzekare dzedhiyagiramu. Pakutanga, hongu, ndizvo zvazvaive, pakuhotsira kwega kwega rudzi rutsva rwakagadzirwa. Aya ma rudiments achiripo mune iyi fomu, semuenzaniso:

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;

Asi ikozvino fungidzira, kana iwe uine 5 minda yekusarudza muchimiro chako, ipapo iwe unozoda makumi matatu nemaviri marudzi kune ese anogoneka sarudzo. Combinatorial kuputika. Nekudaro, kuchena kwekristaro kweiyo TL dzidziso zvakare yakapwanyika pamusoro pekukandwa-simbi mbongoro yehukasha hwechokwadi hweserialization.

Mukuwedzera, mune dzimwe nzvimbo varume ava pachavo vanoputsa typology yavo pachavo. Semuyenzaniso, muMTrototo (chitsauko chinotevera) mhinduro inogona kudzvinyirirwa neGzip, zvese zvakanaka - kunze kwekunge masekete nedunhu zvakatyorwa. Zvakare, yakanga isiri RpcResult pachayo yakakohwewa, asi zviri mukati. Zvakanaka, sei uchidaro?.. Ndaifanira kucheka mudondoro kuitira kuti compression ishande chero kupi zvako.

Kana mumwe muenzaniso, takamboona chikanganiso - chakatumirwa InputPeerUser panzvimbo ye InputUser. Kana zvakasiyana. Asi zvakashanda! Ndiko kuti, sevha haina basa nemhando. Izvi zvingadaro sei? Mhinduro inogona kupihwa kwatiri nekodhi zvimedu kubva kuteregiramu-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);

Mune mamwe mazwi, apa ndipo panoitwa serialization NEMANWE, isina kugadzirwa kodhi! Zvichida sevha inoshandiswa nenzira yakafanana? Ichi ndicho chikonzero nei chirongwa ichi chakagadzirwa? Uye pano tinoenda kumubvunzo unotevera.

Versioning. Layer

Nei shanduro dzeschematic dzichinzi zvidimbu zvinogona kungofungidzirwa zvichibva munhoroondo yeakadhindwa schematics. Sezviri pachena, pakutanga vanyori vaifunga kuti zvinhu zvinokosha zvaigona kuitwa pachishandiswa chirongwa chisina kuchinjwa, uye chete pazvinenge zvakakodzera, nokuda kwezvikumbiro chaizvo, zvinoratidza kuti zvakanga zvichiitwa pachishandiswa imwe shanduro. Muchidimbu, kunyange pfungwa yakanaka - uye itsva ichava, sokunge, "yakavhenganiswa", yakaiswa pamusoro pekare. Asi ngationei kuti zvakaitwa sei. Chokwadi, ini handina kukwanisa kuzvitarisa kubva pakutanga - zvinosetsa, asi dhayagiramu ye base layer haipo. Matanho akatanga na 2. Zvinyorwa zvinotiudza nezve yakakosha TL chimiro:

Kana mutengi achitsigira Layer 2, ipapo muvaki anotevera anofanira kushandiswa:

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

Mukuita, izvi zvinoreva kuti pamberi pese API kufona, int ine kukosha 0x289dd1f6 inofanira kuwedzerwa pamberi penhamba yenzira.

Zvinonzwika zvakajairika. Asi chii chakazoitika? Akabva aoneka

invokeWithLayer3#b7475268 query:!X = X;

Saka chii chinotevera? Sezvaungafungidzira,

invokeWithLayer4#dea0d430 query:!X = X;

Funny? Aiwa, kunonoka kuseka, funga nezvazvo mumwe nomumwe chikumbiro kubva kune imwe layer inoda kuputirwa mumhando yakasarudzika - kana zvese zvakasiyana kwauri, zvimwe ungazvisiyanisa sei? Uye kuwedzera mabhayithi mana chete kumberi inzira yakanaka inoshanda. Saka,

invokeWithLayer5#417a57ae query:!X = X;

Asi zviri pachena kuti mushure mechinguva ichi chichava imwe mhando ye bacchanalia. Uye mhinduro yakauya:

Kwidziridzo: Kutanga neLayer 9, nzira dzemubatsiri invokeWithLayerN inogona kushandiswa chete pamwe chete initConnection

Hooray! Mushure meshanduro dze9, takazosvika kune izvo zvakaitwa muInternet protocol kumashure kuma80s - kubvumirana pane iyo vhezheni kamwe pakutanga kwekubatana!

Saka chii chinotevera?..

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

Asi ikozvino unogona kuseka. Chete mushure memamwe 9 akaturikidzana, muvaki wepasirese ane nhamba yeshanduro akazopedzisira awedzerwa, iyo inoda kudaidzwa kamwe chete pakutanga kwekubatanidza, uye zvinorehwa nezvikamu zvaiita kunge zvanyangarika, ikozvino yangova vhezheni yemamiriro, senge. kumwe kwose. Dambudziko ragadziriswa.

Ndizvozvo?..

Vasily, [16.07.18 14:01] Kunyange neChishanu ndakafunga kuti:
Iyo teleserver inotumira zviitiko pasina chikumbiro. Zvikumbiro zvinofanirwa kuputirwa muInvokeWithLayer. Sevha haiputire zvigadziriso; hapana chimiro chekupeta mhinduro uye zvigadziriso.

Avo. mutengi haagone kutsanangura iyo layer yaanoda zvigadziriso

Vadim Goncharov, [16.07.18 14:02] haisi InvokeWithLayer crutch in musimboti?

Vasily, [16.07.18 14:02] Iyi ndiyo nzira chete

Vadim Goncharov, [16.07.18 14:02] izvo zvinotofanira kureva kubvumirana pane zvakasara pakutanga kwechikamu.

Nenzira, zvinotevera kuti kuderedzwa kwevatengi hakuna kupihwa

Updates, i.e. type Updates muchirongwa, izvi ndizvo izvo sevha inotumira kune mutengi kwete mukupindura chikumbiro cheAPI, asi yakazvimirira kana chiitiko chikaitika. Iyi inyaya yakaoma ichakurukurwa mune imwe positi, asi ikozvino zvakakosha kuziva kuti sevha inochengetedza Zvidzoreso kunyangwe mutengi asiri pamhepo.

Saka, kana iwe ukaramba kuputira cheumwe neumwe Package kuratidza vhezheni yayo, izvi zvine musoro zvinotungamira kune anotevera matambudziko anogona kuitika:

  • sevha inotumira zvigadziriso kumutengi kunyangwe mutengi asati azivisa kuti inotsigira vhezheni ipi
  • chii chandinofanira kuita mushure mekusimudzira mutengi?
  • uyo anovimbisakuti maonero evhavha nezve nhamba yakaturikidzana haizoshanduke panguva yekuita?

Iwe unofunga kuti iyi ingori fungidziro yekufungidzira, uye mukuita izvi hazvigone kuitika, nekuti sevha yakanyorwa nemazvo (zvishoma, yakaedzwa zvakanaka)? Ha! Hazvina mhosva kuti zvaita sei!

Izvi ndizvo chaizvo zvatakasangana nazvo muna Nyamavhuvhu. Musi wa14 Nyamavhuvhu, pakanga paine mameseji ekuti chimwe chinhu chiri kuvandudzwa pamaseva eTeregiramu... uyezve mumatanda:

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.

uyezve akati wandei megabytes ematehwe ematehwe (zvakanaka, panguva imwechete iyo kutema kwakagadziriswa). Mushure mezvose, kana chimwe chinhu chisingazivikanwe muTL yako, ibhinari nekusaina, zvichidzika pasi mutsara VOSE inoenda, decoding haigoneki. Chii chaunofanira kuita mumamiriro ezvinhu akadaro?

Zvakanaka, chinhu chekutanga chinouya mupfungwa dzemunhu wese kubvisa uye kuyedza zvakare. Hazvina kubatsira. Isu google CRC32 - izvi zvakazove zvinhu kubva kuchirongwa 73, kunyangwe isu takashanda pa82. Tinotarisa zvakanyatsonaka pamatanda - pane zviziviso kubva muzvirongwa zviviri zvakasiyana!

Zvichida dambudziko riri mune yedu isina pamutemo mutengi? Kwete, isu tinotangisa Telegraph Desktop 1.2.17 (vhezheni yakapihwa muhuwandu hwekugoverwa kweLinux), inonyora kune Exception log: MTP Isingatarisirwe mhando id #b5223b0f yakaverengwa muMTPMessageMedia…

Kutsoropodza kweprotocol uye nzira dzesangano dzeTeregiramu. Chikamu 1, tekinoroji: ruzivo rwekunyora mutengi kubva kutanga - TL, MT

Google yakaratidza kuti dambudziko rakafanana rakanga ratoitika kune mumwe wevatengi vasina pamutemo, asi ipapo nhamba dzevhezheni uye, saizvozvo, fungidziro dzaive dzakasiyana ...

Saka tinofanira kuitei? Ini naVasily takaparadzana: akaedza kuvandudza dunhu kusvika 91, ndakasarudza kumirira mazuva mashoma uye kuyedza pa73. Nzira mbiri idzi dzakashanda, asi sezvo dziri empirical, hapana kunzwisisa kuti ingani shanduro kumusoro kana pasi yaunoda. kusvetuka, kana kuti unofanira kumirira kwenguva yakareba sei .

Gare gare ndakakwanisa kuburitsa mamiriro acho ezvinhu: tinotangisa mutengi, kudzima, kudzoreredza dunhu kune imwe dhiza, kutangazve, kubata dambudziko zvakare, kudzokera kune yakapfuura - oops, hapana huwandu hwekuchinja kwedunhu uye mutengi anotangazve maminetsi mashoma achabatsira. Iwe unogashira musanganiswa we data zvimiro kubva kune akasiyana maseru.

Tsananguro? Sezvaunogona kufungidzira kubva kune akasiyana asina kunanga zviratidzo, sevha ine akawanda maitiro emhando dzakasiyana pamakina akasiyana. Zvingangoita, sevha inokonzeresa "buffering" inoisa mumutsara iyo yakapihwa nevakuru vayo, uye vakaipa muchirongwa chaivepo panguva yechizvarwa. Uye kusvikira mutsara uyu "waora", hapana chaigona kuitwa nezvazvo.

Zvichida ... asi iyi itsvimbo inotyisa?! .. Kwete, tisati tafunga nezvemazano anopenga, ngatitarisei kodhi yevatengi vepamutemo. Muiyo Android vhezheni isu hatiwane chero TL parser, asi isu tinowana hefty faira (GitHub inoramba kuibata kumusoro) ne (de) serialization. Heano zvidimbu zvekodhi:

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;

kana

    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 ... zvinoratidzika kunge zvakashata. Asi, pamwe, iyi inogadzirwa kodhi, saka zvakanaka?.. Asi inotsigira zvese shanduro! Ichokwadi, hazvisi pachena kuti sei zvinhu zvose zvakasanganiswa pamwe chete, hurukuro dzepachivande, uye marudzi ose e _old7 neimwe nzira hairatidzike sechizvarwa chemuchina ... Zvisinei, zvizhinji zvezvose ndakaputirwa

TL_message_layer104
TL_message_layer104_2
TL_message_layer104_3

Vakomana, haugone here kusarudza zviri mukati mechikamu chimwe chete?! Zvakanaka, zvakanaka, ngatiti "mbiri" dzakasunungurwa nekukanganisa, zvakanaka, zvinoitika, asi ZVITATU? .. Pakarepo, iyo rake rake zvakare? Imhandoi yezvinonyadzisira iyi, sorry?..

Mune iyo kodhi kodhi yeTeregiramu Desktop, nenzira, chinhu chakafanana chinoitika - kana zvakadaro, akati wandei anoita mumutsara kune chirongwa hachichinje dhizaini nhamba, asi gadzirisa chimwe chinhu. Mumamiriro ezvinhu apo pasina yepamutemo sosi yedata yechirongwa, inogona kuwanikwa kupi, kunze kweiyo kodhi kodhi yemutengi wepamutemo? Uye kana iwe ukaitora kubva ipapo, haugone kuve nechokwadi chekuti chirongwa chacho chakanyatsokwana kusvikira waedza nzira dzese.

Izvi zvingatoedzwa sei? Ndinovimba mafeni eyuniti, anoshanda uye mamwe bvunzo achagovana mune zvakataurwa.

Zvakanaka, ngatitarisei imwe chidimbu chekodhi:

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;

Mashoko aya "akagadzirwa nemaoko" anoratidza kuti chikamu chefaira ichi chakanyorwa nemaoko (iwe unogona kufungidzira dambudziko rose rekugadzirisa?), Uye mamwe acho akagadzirwa nemuchina. Zvisinei, zvino mumwe mubvunzo unomuka - kuti zvinyorwa zviripo kwete zvachose (a la GPL blobs muLinux kernel), asi iyi yatove musoro wechikamu chechipiri.

Asi zvakakwana. Ngatienderere mberi kune protocol pamusoro payo yese iyi serialization inomhanya.

MT Proto

Saka, ngativhure general description и tsananguro yakadzama yeprotocol uye chinhu chekutanga chatinogumburwa nacho ishoko remashoko. Uye nekuwanda kwezvinhu zvose. Kazhinji, izvi zvinoita sechinhu cheTeregiramu - kudaidza zvinhu zvakasiyana munzvimbo dzakasiyana, kana zvinhu zvakasiyana neshoko rimwechete, kana zvinopesana (semuenzaniso, mune yepamusoro-level API, kana ukaona paki yekunamirwa, hazvisi izvo. zvawafunga).

Semuenzaniso, "meseji" uye "chikamu" zvinoreva chimwe chinhu chakasiyana pano pane chakajairika Telegraph mutengi interface. Zvakanaka, zvese zviri pachena nemeseji, inogona kududzirwa mumashoko eOOP, kana kungodaidzwa kuti "packet" - iyi idanho rakaderera, rekufambisa, hapana mameseji akafanana neanowanikwa, kune akawanda masevhisi meseji. . Asi chikamu ... asi zvinhu zvekutanga kutanga.

transport layer

Chekutanga itransport. Ivo vachatiudza nezve 5 sarudzo:

  • TCP
  • Websocket
  • Websocket pamusoro peHTTPS
  • HTTP
  • HTTPS

Vasily, [15.06.18 15:04] Kune zvakare yekufambisa yeUDP, asi haina kunyorwa.

Uye TCP mune matatu akasiyana

Yekutanga yakafanana neUDP pamusoro peTCP, pakiti imwe neimwe inosanganisira nhamba yekutevedzana uye crc
Sei kuverenga magwaro pangoro kuchirwadza kudaro?

Zvakanaka, hezvo zvino TCP yatova mune 4 akasiyana:

  • Kubviswa
  • zvenguva
  • Padded yepakati
  • Full

Zvakanaka, ok, Padded yepakati yeMTProxy, izvi zvakazowedzerwa nekuda kwezviitiko zvinozivikanwa. Asi nei mamwe mavhezheni maviri (matatu akazara) iwe uchikwanisa kupfuura neimwe? Ese mana anosiyana chete munzira yekuseta kureba uye mubhadharo weMTProto huru, iyo ichakurukurwa mberi:

  • muAbridged ndeye 1 kana 4 bytes, asi kwete 0xef, ipapo muviri
  • muIntermediate iyi i4 bytes yehurefu nemunda, uye kekutanga mutengi anofanira kutumira 0xeeeeeeee kuratidza kuti iri Pakati
  • mune Yakazara iyo yakanyanya kupindwa muropa, kubva pakuona kwemunetiweki: kureba, kutevedzana nhamba, uye KWETE IYO inonyanya kuve MTProto, muviri, CRC32. Ehe, zvese izvi zviri pamusoro peTCP. Iyo inotipa yekufambisa yakavimbika muchimiro cheinotevedzana byte rwizi; hapana kutevedzana kunodiwa, kunyanya macheki. Zvakanaka, zvino mumwe munhu achandipikisa kuti TCP ine 16-bit checksum, saka huwori hwe data hunoitika. Hukuru, asi isu tine chaizvo cryptographic protocol ine hashes yakareba kupfuura 16 bytes, zvese izvi zvikanganiso - uye zvakatonyanya - zvichabatwa neSHA mismatch padanho repamusoro. Iko HAPANA poindi muCRC32 pamusoro peizvi.

Ngatifananidzei Yakapfupikiswa, mune imwe byte yehurefu inogoneka, neIpakati, iyo inoruramisa "Kana 4-byte data alignment ichidikanwa," izvo zvisina musoro. Chii, zvinotendwa kuti vagadziri veTeregiramu havana hunyanzvi zvekuti havagone kuverenga data kubva pane socket kuenda kune yakarongwa buffer? Iwe uchiri kuita izvi, nekuti kuverenga kunogona kukudzosera chero nhamba yemabyte (uye kunewo maseva eproxy, semuenzaniso ...). Kana kune rimwe divi, sei kuvharira Abridged kana isu tichiramba tine hefty padding pamusoro pe16 bytes - chengetedza 3 bytes dzimwe nguva ?

Mumwe anowana fungidziro yekuti Nikolai Durov anonyatsoda kudzoreredza mavhiri, kusanganisira network protocol, pasina chero chaicho chinodikanwa chinodiwa.

Dzimwe sarudzo dzekufambisa, kusanganisira. Webhu neMTProxy, isu hatingatarise ikozvino, pamwe mune imwe positi, kana paine chikumbiro. Pamusoro peMTProxy imwechete iyi, ngatirangarirei ikozvino kuti nguva pfupi mushure mekusunungurwa kwayo muna 2018, vanopa vakakurumidza kudzidza kuivharira, yakagadzirirwa bypass blocking, on saizi yepasuru! Uye zvakare chokwadi chekuti sevha yeMTProxy yakanyorwa (zvakare naWaltman) muC yaive yakasungirirwa zvakanyanya kuLinux zvakananga, kunyangwe izvi zvaisadiwa zvachose (Phil Kulin achasimbisa), uye kuti sevha yakafanana ingave muGo kana Node.js. kukwana mumitsetse isingasviki zana.

Asi isu tichatora mhedziso nezvehunyanzvi kuverenga kwevanhu ava pakupera kwechikamu, mushure mekufunga dzimwe nyaya. Parizvino, ngatienderei kuOSI layer 5, chikamu - pavakaisa MTProto chikamu.

Makiyi, mameseji, zvikamu, Diffie-Hellman

Vakaiisa ipapo kwete nemazvo chose... Chikamu hachisi chikamu chimwechete chinoonekwa muinterface pasi peActive sessions. Asi mukurongeka.

Kutsoropodza kweprotocol uye nzira dzesangano dzeTeregiramu. Chikamu 1, tekinoroji: ruzivo rwekunyora mutengi kubva kutanga - TL, MT

Saka takagamuchira tambo yebyte yehurefu hunozivikanwa kubva kune yekutakura layer. Iyi ingangove meseji yakavharidzirwa kana kuti plaintext - kana tichiri padanho rechibvumirano uye tiri kutozviita. Ndeipi yeboka repfungwa inonzi "kiyi" yatiri kutaura nezvayo? Ngatijekese nyaya iyi kuchikwata cheTeregiramu pachacho (Ndinokumbira ruregerero nekuturikira zvangu zvinyorwa kubva kuChirungu nehuropi hwakaneta na4 am, zvaive nyore kusiya mamwe mitsara sezvaari):

Pane masangano maviri anonzi chiitiko - imwe muUI yevashandi vepamutemo pasi pe "zvino zvikamu", uko yega yega inoenderana nechero mudziyo / OS.
Chepiri - MTProto musangano, iyo ine nhamba yenhevedzano yeshoko (mupfungwa yakaderera) mairi, uye izvo inogona kugara pakati peakasiyana TCP kubatana. Masesheni akati wandei eMTProto anogona kuiswa panguva imwe chete, semuenzaniso, kukurumidza kurodha faira.

Pakati pevaviri ava muzvirongwa pane pfungwa mvumo. Muchiitiko chinopera, tinogona kutaura izvozvo UI chikamu zvakafanana ne mvumo, asi nhamo, zvinhu zvose zvakaoma. Ngatitarisei:

  • Mushandisi pamudziyo mutsva anotanga kugadzira auth_key uye anoisungirira kuaccount, semuenzaniso kuburikidza neSMS - ndosaka mvumo
  • Zvakaitika mukati mekutanga MTProto musangano, iyo ine session_id mukati mako.
  • Padanho iri, kusanganiswa mvumo и session_id anogona kudanwa simba -Iri izwi rinowanikwa mune zvinyorwa uye kodhi yevamwe vatengi
  • Zvadaro, mutengi anogona kuvhura akawanda Zvirongwa zveMTProto pasi payo auth_key - kune imwechete DC.
  • Zvino, rimwe zuva mutengi achada kukumbira faira kubva mumwe DC - uye kune iyi DC itsva ichagadzirwa auth_key !
  • Kuzivisa sisitimu kuti haisi mushandisi mutsva ari kunyoresa, asi zvakafanana mvumo (UI chikamu), mutengi anoshandisa API mafoni auth.exportAuthorization kumba DC auth.importAuthorization muDC itsva.
  • Zvese zvakafanana, akati wandei anogona kuvhurwa Zvirongwa zveMTProto (chimwe nechimwe chine chayo session_id) kune iyi DC itsva, pasi ake auth_key.
  • Chekupedzisira, mutengi angangoda Perfect Forward Secrecy. Every auth_key yakanga iri Kusingaperi kiyi - paDC - uye mutengi anogona kufona auth.bindTempAuthKey zvekushandisa kwenguva duku auth_key - uye zvakare, imwe chete temp_auth_key paDC, yakajairika kune vese Zvirongwa zveMTProto kuDC uku.

cherechedzai, izvozvo munyu (uye masaiti emangwana) iriwo imwe pa auth_key avo. zvakagoverwa pakati pevanhu vose Zvirongwa zveMTProto kune mumwe chete DC.

Chii chinonzi "pakati pekubatana kweTCP kwakasiyana" zvinorevei? Saka izvi zvinoreva chinhu chakadai mvumo cookie pawebhusaiti - inoenderera (inopona) yakawanda TCP yekubatanidza kune yakapihwa sevha, asi rimwe zuva zvinoenda zvakashata. Kusiyana chete neHTTP, muMTProto mameseji mukati mechikamu anoverengerwa uye akasimbiswa; kana vakapinda mugero, kubatana kwakatyoka - mushure mekutanga kubatana kutsva, sevha inotumira nemutsa zvese muchikamu chino izvo zvayasina kuendesa mune yakapfuura. TCP kubatana.

Nekudaro, ruzivo rwuri pamusoro rwunopfupikiswa mushure memwedzi yakawanda yekuferefeta. Panguva ino, tiri kuita mutengi wedu kubva pakutanga? - ngatidzokerei pakutanga.

Saka ngatigadzirise auth_key pamusoro Diffie-Hellman shanduro kubva kuTeregiramu. Ngatiedzei kunzwisisa zvinyorwa ...

Vasily, [19.06.18 20:05] data_with_hash := SHA1(data) + data + (chero mabhaiti asina kurongeka); zvekuti kureba kwakaenzana ne255 bytes;
encrypted_data := RSA(data_with_hash, server_public_key); nhamba ye255-byte yakareba (big endian) inosimudzwa kune simba rinodiwa pamusoro peinodiwa modulus, uye mhedzisiro yacho inochengetwa se256-byte nhamba.

Vane imwe dope DH

Haiite seDH yemunhu ane hutano
Iko hakuna makiyi maviri eruzhinji mu dx

Zvakanaka, pakupedzisira izvi zvakagadziriswa, asi zvakasara zvakasara - uchapupu hwebasa hunoitwa nemutengi kuti akakwanisa kuverenga nhamba. Rudzi rwekudzivirira kubva pakurwisa kweDoS. Uye kiyi yeRSA inongoshandiswa kamwe munzira imwe chete, zvakanyanya kuvharidzira new_nonce. Asi nepo kuvhiya uku kunoratidzika kuva kuri nyore kuchabudirira, chii chauchafanira kutarisana nacho?

Vasily, [20.06.18/00/26 XNUMX:XNUMX] Handisati ndasvika kuchikumbiro cheappid

Ndakatumira chikumbiro ichi kuDH

Uye, muchiteshi chekutakura inotaura kuti inogona kupindura ne 4 bytes yekodhi yekukanganisa. Ndizvo zvose

Zvakanaka, akandiudza -404, saka chii?

Saka ndakamuudza kuti: "Bata bhuru rako rakavharidzirwa nekiyi yeseva ine chigunwe chakadai, ndinoda DH," uye yakapindura ne404 benzi.

Iwe ungafungei nezve iyi server mhinduro? Kuita sei? Hapana wekubvunza (asi zvimwe pane izvo muchikamu chechipiri).

Pano kufarira kwese kunoitwa pachiteshi

Ini handina chimwe chekuita, ndangorota ndichishandura manhamba nekudzoka

Nhamba mbiri dze32 bit. Ndakavarongedza sevamwe

Asi kwete, zviviri izvi zvinoda kuwedzerwa kumutsara kutanga se BE

Vadim Goncharov, [20.06.18 15:49] uye nekuda kweizvi 404?

Vasily, [20.06.18 15:49] YES!

Vadim Goncharov, [20.06.18 15:50] saka handinzwisisi zvaanogona "haana kuwana"

Vasily, [20.06.18 15:50] zvishoma

Handina kuwana kuora kwakadaro muzvinhu zvakakosha%)

Hatina kana kutarisira kukanganisa kukanganisa

Vasily, [20.06.18 20:18] Oo, kune zvakare MD5. Nechekare matatu akasiyana hashe

The key fingerprint inoverengwa sezvinotevera:

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

SHA1 uye sha2

Saka ngatiisei auth_key takagamuchira 2048 bits muhukuru tichishandisa Diffie-Hellman. Chii chinotevera? Zvadaro tinoona kuti pasi 1024 bits yekiyi iyi haishandiswi nenzira ipi zvayo ... asi ngatifungei pamusoro peizvi ikozvino. Padanho iri, isu tine chakavanzika chakagovaniswa neseva. Analogue yemusangano weTLS yakasimbiswa, inova nzira inodhura zvikuru. Asi sevha haisati yaziva chero chinhu nezvekuti tiri vanaani! Haisati, chaizvoizvo. mvumo. Avo. kana iwe waifunga maererano ne "login-password", sezvawakamboita muICQ, kana kuti "login-kiyi", seSSH (semuenzaniso, pane imwe gitlab/github). Takagamuchira asina kuzivikanwa zita rake. Ko kana sevha ikatiudza "nhamba dzenhare idzi dzinoshandirwa neimwe DC"? Kana kuti "nhamba yako yefoni yakarambidzwa"? Zvakanakisa zvatingaite kuchengeta kiyi mutariro yekuti ichave inobatsira uye haichazoora panguva iyoyo.

Nenzira, isu "takaigamuchira" nekuchengetedza. Semuenzaniso, tinovimba nesevha here? Ko kana iri fake? Cryptographic cheki yaizodiwa:

Vasily, [21.06.18 17:53] Vanopa vatengi venhare kuti vatarise nhamba ye2kbit yeprimality%).

Asi hazvina kujeka zvachose, nafeijoa

Vasily, [21.06.18 18:02] Gwaro haritauri zvekuita kana zvikazove zvisiri nyore.

Hazvina kutaurwa. Ngationei izvo zviri pamutemo Android mutengi anoita mune iyi kesi? A ndizvo (uye hongu, iyo faira yese inonakidza) - sezvavanotaura, ini ndichangosiya izvi pano:

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

Aiwa, zvirokwazvo zvichiripo vamwe Kune bvunzo dzehukuru hwenhamba, asi ini pachangu handisisina ruzivo rwakakwana rwemasvomhu.

Zvakanaka, tawana master key. Kupinda mukati, i.e. tumira zvikumbiro, unofanirwa kuita imwe encryption, uchishandisa AES.

Kiyi yemeseji inotsanangurwa segumi nemakumi maviri nemasere mabhiti epakati eSHA128 emutumbi wemeseji (kusanganisira chikamu, meseji ID, nezvimwewo), kusanganisira epadding byte, yakafanorongwa ne256 bytes yakatorwa kubva kiyi yekubvumidza.

Vasily, [22.06.18 14:08] Avhareji, hure, zvidimbu

Received auth_key. Zvose. Kupfuura ivo ... hazvisi pachena kubva mugwaro. Inzwa wakasununguka kudzidza iyo yakavhurika sosi kodhi.

Ziva kuti MTProto 2.0 inoda kubva pagumi nemaviri kusvika ku12 mabhayiti epadding, zvichiri pasi pemamiriro ekuti hurefu hwemeseji hunozopatsanurika negumi nematanhatu.

Saka ingani padding yaunofanira kuwedzera?

Uye hongu, kune zvakare 404 kana paine chikanganiso

Kana chero munhu akanyatsodzidza dhiyagiramu uye zvinyorwa zvezvinyorwa, vakaona kuti hapana MAC ipapo. Uye iyo AES inoshandiswa mune imwe IGE modhi isingashandiswe kumwe kumwe. Ivo, hongu, vanonyora pamusoro peizvi mu FAQ yavo... Pano, senge, kiyi yemeseji pachayo ndiyo SHA hashi yedata rakadzikiswa, rinoshandiswa kutarisa kuvimbika - uye kana paine kusawirirana, zvinyorwa zvechimwe chikonzero. inokurudzira kusavafuratira chinyararire (asi zvakadini nekuchengeteka, ko kana vakatiputsa?).

Ini handisi cryptographer, pamwe hapana chakakanganisika neiyi modhi mune ino kesi kubva kune ye theoretical point yekuona. Asi ini ndinogona kudoma zvakajeka dambudziko rinoshanda, ndichishandisa Telegraph Desktop semuenzaniso. Inonyora cache yemunharaunda (ese aya D877F783D5D3EF8C) nenzira imwechete semashoko ari muMTrototo (chete mune iyi kesi vhezheni 1.0), i.e. kutanga kiyi yemeseji, tevere iyo data pachayo (uye kumwe kudivi hombe huru auth_key 256 bytes, pasina izvo msg_key zvisina basa). Saka, dambudziko rinobva raonekwa pamafaira makuru. Sezvineiwo, iwe unofanirwa kuchengeta makopi maviri e data - encrypted uye decrypted. Uye kana paine megabytes, kana mavhidhiyo ekutepfenyura, semuenzaniso?. Asi neMTProto uchafanirwa pakutanga encrypt kana decrypt meseji yese, wozoiendesa kune network kana kudhisiki. Naizvozvo, mune dzazvino shanduro dzeTeregiramu Desktop mune cache in user_data Imwe fomati inoshandiswa zvakare - ine AES muCTR modhi.

Vasily, [21.06.18 01:27] Oo, ndakaona kuti IGE chii: IGE yaive yekutanga kuedza pa "authenticating encryption mode," pakutanga yeKerberos. Kwakanga kuri kuedza kwakakundikana (haipa kuchengetedzwa kwekuvimbika), uye yaifanira kubviswa. Ndiko kwakava kutanga kwemakore makumi maviri ekutsvagisa yechokwadi encryption modhi inoshanda, iyo ichangobva kupera mumamodhi seOCB neGCM.

Uye zvino nharo kubva kudivi rengoro:

Chikwata chiri kumashure kweTeregiramu, chinotungamirwa naNikolai Durov, chine shasha nhanhatu dzeACM, hafu yavo Ph.Ds mumasvomhu. Zvakavatorera makore maviri kuti vaburitse vhezheni yazvino yeMTProto.

Zvinosetsa. Makore maviri padanho rezasi

Kana kuti unogona kungotora tls

Zvakanaka, ngatiti isu takaita encryption uye mamwe nuances. Izvo zvinogoneka here kutumira zvikumbiro zvakateedzerwa muTL uye kushaya mhinduro? Saka chii uye sei unofanira kutumira? Pano, ngatiti, nzira initConnection, pamwe ndizvo here?

Vasily, [25.06.18 18:46] Inotangisa kubatana uye kuchengetedza ruzivo pane mudziyo wemushandisi uye mashandisiro.

Inogamuchira app_id, device_model, system_version, app_version uye lang_code.

Uye mumwe mubvunzo

Documentation senguva dzose. Inzwa wakasununguka kudzidza iyo yakavhurika sosi

Kana zvese zvaive zvakajeka neinvokeWithLayer, saka chii chakashata apa? Zvinoitika, ngatiti tine - mutengi anga atove nechimwe chinhu chekubvunza server nezve - pane chikumbiro chataida kutumira:

Vasily, [25.06.18 19:13] Tichitarisa nekodhi, kufona kwekutanga kunoputirwa mune iyi crap, uye crap pachayo yakaputirwa invokewithlayer.

Sei initConnection isingakwanise kuve runhare rwakasiyana, asi runofanira kunge rwuri kuputira? Hongu, sezvazvakazoitika, inofanira kuitwa nguva dzose pakutanga kwechikamu chega chega, uye kwete kamwe chete, sezvakaita kiyi huru. Asi! Haikwanise kudanwa nemushandisi asina mvumo! Iye zvino tasvika padanho rekuti zvishande Uyu peji rezvinyorwa - uye rinotiudza kuti...

Chikamu chidiki chete chemaitiro eAPI chinowanikwa kune vashandisi vasina mvumo:

  • 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

Chekutanga chazvo, auth.sendCode, uye pane chiya chikumbiro chekutanga chatinotumira api_id uye api_hash, uye tozogamuchira SMS ine kodhi. Uye kana isu tiri muDc isiriyo (nhamba dzefoni munyika ino dzinoshandiswa nemumwe, semuenzaniso), ipapo tichagamuchira kukanganisa nenhamba yeDC yaunoda. Kuti uzive kuti ndeipi IP kero neDC nhamba yaunoda kubatana nayo, tibatsire help.getConfig. Pane imwe nguva kwaingova ne5 chete, asi mushure mezviitiko zvakakurumbira zve 2018, nhamba yacho yakawedzera zvakanyanya.

Zvino ngatirangarirei kuti takasvika padanho rino paserver tisingazivikanwe. Hazvinyanyi kudhura here kuti uwane IP kero? Wadii kuita izvi, uye mamwe maoperation, mune isina kunyorwa chikamu cheMTProto? Ndinonzwa kupokana: "tingave sei nechokwadi kuti haisi RKN inopindura nemakero enhema?" Kune izvi tinorangarira kuti, kazhinji, vatengi vepamutemo Makiyi eRSA akaiswa, i.e. unogona chete nokunyora magwaro ruzivo urwu. Chaizvoizvo, izvi zvave kutoitwa kune ruzivo rwekupfuura kuvharira uko vatengi vanogashira kuburikidza nedzimwe nzira (zvine musoro, izvi hazvigone kuitwa muMTrototo pachayo; iwe zvakare unofanirwa kuziva kwekubatanidza).

OK. Panguva ino yemvumo yemutengi, hatisati tapihwa mvumo uye hatisati tanyoresa application yedu. Isu tinongoda kuona ikozvino izvo sevha inopindura kune nzira dziripo kune asina mvumo mushandisi. Uye pano…

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;

Muchirongwa, chokutanga chinouya chechipiri

Mune tdesktop schema kukosha kwechitatu ndiko

Hongu, kubva ipapo, hongu, zvinyorwa zvakagadziridzwa. Kunyangwe iyo inogona kukurumidza kuve isina basa zvakare. Mugadziri wemutsva anofanira kuziva sei? Pamwe ukanyoresa chikumbiro chako, vanokuzivisa? Vasily akaita izvi, asi nhamo, havana kumutumira chero chinhu (zvakare, tichataura pamusoro peizvi muchikamu chechipiri).

...Wakaona kuti isu tatove neimwe nzira tatamira kuAPI, i.e. kune inotevera nhanho, uye wakapotsa chimwe chinhu muMTProto musoro? Hazvishamisi:

Vasily, [28.06.18 02:04] Mm, vari kuongorora mamwe maalgorithms pa e2e.

Mtproto inotsanangura encryption algorithms uye makiyi eese ari maviri madomasi, pamwe nechidimbu chechimiro chekuputira.

Asi ivo vanogara vachisanganisa mazinga akasiyana eiyo stack, saka hazviwanzo kujeka kuti mtproto yakaguma kupi uye inotevera nhanho yakatanga.

Vanosanganiswa sei? Zvakanaka, heino kiyi yenguva pfupi yePFS, semuenzaniso (nenzira, Telegraph Desktop haigone kuzviita). Inoitwa nechikumbiro che API auth.bindTempAuthKey, i.e. kubva kumusoro. Asi panguva imwechete inokanganisa encryption padanho rezasi - mushure mayo, semuenzaniso, unofanirwa kuzviita zvakare. initConnection nezvimwewo, izvi hazvisi zvakarurama zvakajairika chikumbiro. Chinonyanya kukosha ndechekuti iwe unogona kuve neIMWE chete yenguva kiyi paDC, kunyangwe iyo munda auth_key_id mune yega yega meseji inobvumidza iwe kuti uchinje kiyi kana meseji yese, uye kuti sevha ine kodzero yeku "kanganwa" kiyi yenguva chero nguva - zvinyorwa hazvitauri zvekuita mune iyi nyaya ... zvakanaka, nei Hauna makiyi akati wandei, sekunge ine seti yenguva yemberi munyu, uye?

Pane zvimwe zvinhu zvishoma zvakakosha kucherechedza nezve MTProto theme.

Mameseji emeseji, msg_id, msg_seqno, zvisimbiso, ping iri munzira isiriyo uye mamwe maidi

Nei uchifanira kuziva nezvavo? Nekuti ivo "vanodonhedza" kusvika padanho repamusoro, uye iwe unofanirwa kuziva nezvavo kana uchishanda neiyo API. Ngatifungei kuti hatisi kufarira msg_key; chikamu chepasi chabvisa zvese kwatiri. Asi mukati meiyo decrypted data tine anotevera minda (zvakare kureba kwedata, saka tinoziva kuti padding iripi, asi izvo hazvina kukosha):

  • munyu - int64
  • session_id - int64
  • message_id - int64
  • seq_no - int32

Ngatikuyeuchidzei kuti kune munyu mumwechete weDC yese. Sei kuziva nezvake? Kwete chete nekuti pane chikumbiro get_future_salts, iyo inokuudza kuti ndeipi nguva ichave yakakodzera, asiwo nokuti kana munyu wako "wakaora", ipapo shoko (chikumbiro) richangorasika. Sevha inozotaura chokwadi munyu mutsva nekuburitsa new_session_created - asi neyekare iwe uchafanirwa kuitumira neimwe nzira, semuenzaniso. Uye iyi nyaya inokanganisa dhizaini rekushandisa.

Sevha inotenderwa kudonhedza zvikamu zvachose uye kupindura nenzira iyi nekuda kwezvikonzero zvakawanda. Chaizvoizvo, chii chinonzi MTProto chikamu kubva kudivi remutengi? Idzi nhamba mbiri session_id и seq_no mameseji mukati mechikamu chino. Zvakanaka, uye iyo yepasi TCP yekubatanidza, hongu. Ngatitii mutengi wedu haasati aziva maitiro ekuita zvinhu zvakawanda, akabvisa uye akabatanidzazve. Kana izvi zvikaitika nokukurumidza - chikamu chekare chakaenderera mberi muhutano hutsva hweTCP, kuwedzera seq_no mberi. Kana zvikatora nguva yakareba, sevha inogona kuidzima, nekuti padivi payo iriwo mutsara, sezvatakaona.

Chinofanira kuva chii seq_no? Oo, mubvunzo wakaoma. Edza kunyatsonzwisisa zvairehwa:

Mharidzo ine hukama

Meseji inoda kutenderwa zviri pachena. Izvi zvinosanganisira ese mushandisi uye akawanda masevhisi mameseji, angangoita ese kunze kwemidziyo uye kubvuma.

Message Sequence Number (msg_seqno)

Nhamba ye32-bit yakaenzana nekaviri nhamba ye "zvinechekuita-zvinechekuita" meseji (iyo inoda kutenderwa, uye kunyanya iyo isiri midziyo) yakagadzirwa neatumira meseji iyi isati yasvika uye yozowedzerwa neimwe kana meseji iripo meseji inoenderana nezviri mukati. Chigaba chinogara chichigadzirwa mushure mezvose zviri mukati maro; nokudaro, nhamba yenhevedzano yaro yakakura kudarika kana kuenzana nenhamba dzenhevedzano dzemashoko arimo.

Irudzii rwesekisi iyi ine increment na1, uyezve imwe na 2?. kunyanya, inobuda, inogona kutumirwa akawanda zvisimbiso zvine zvakafanana seq_no! Sei? Zvakanaka, semuenzaniso, sevha inotitumira chimwe chinhu, ichitumira, uye isu pachedu tinoramba takanyarara, tichingopindura chete nemeseji yebasa inosimbisa kugamuchira kwayo meseji. Muchiitiko ichi, yedu inobuda inosimbisa ichave nenhamba imwechete inobuda. Kana iwe uchijairana neTCP uye uchifunga kuti izvi zvinonzwika neimwe nzira, asi zvinoita kunge zvisiri zvemusango, nekuti muTCP seq_no haichinji, asi kusimbiswa kunoenda seq_no kune rumwe rutivi, ndichakurumidza kukutsamwisai. Zvisimbiso zvinopihwa muMTProto NOT pamusoro seq_no, sezvakaita muTCP, asi na msg_id !

Ichi chii msg_id, iyo inonyanya kukosha yeiyi minda? Chiziviso chemeseji chakasiyana, sekureva kunoita zita. Inotsanangurwa se 64-bit nhamba, iyo yakaderera mabhiti ayo zvakare ane "server-kwete-server" mashiripiti, uye yasara ndeye Unix timestamp, kusanganisira chikamu chechikamu, chakachinjisa 32 bits kuruboshwe. Avo. timestamp per se (uye mameseji ane nguva dzinosiyana zvakanyanya anozorambwa nesevha). Kubva pane izvi zvinobuda kuti kazhinji ichi chiziviso chiri pasi rose kune mutengi. Zvichipiwa izvozvo - ngatirangarirei session_id - takavimbiswa: Hapana kana mamiriro ezvinhu anogona meseji inoitirwa chikamu chimwe chete kutumirwa muchikamu chakasiyana. Ndiko kuti, zvinobuda kuti pane kare vatatu nhanho - chikamu, nhamba yechikamu, meseji id. Sei kuwedzeredza kwakadaro, chakavanzika ichi chikuru kwazvo.

Uye saka, msg_id zvinodiwa ku...

RPC: zvikumbiro, mhinduro, zvikanganiso. Zvisimbiso.

Sezvaungave waona, hapana yakakosha "ita chikumbiro cheRPC" mhando kana kushanda chero kupi mudhayagiramu, kunyangwe paine mhinduro. Mushure mezvose, isu tine mameseji ane hukama! Kureva kuti, chero meseji inogona kunge iri chikumbiro! Kana kuti kwete. Shure kwezvose, cheumwe neumwe pane msg_id. Asi pane mhinduro:

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

Apa ndipo panoratidzwa kuti iyi meseji inopindurwa ndeipi. Naizvozvo, padanho repamusoro reAPI, iwe uchafanirwa kuyeuka kuti nhamba yechikumbiro chako chaive chii - ndinofunga kuti hapana chikonzero chekutsanangura kuti basa racho harina kufanana, uye panogona kunge paine zvikumbiro zvakati wandei panguva imwe chete, mhinduro idzo dzinogona kudzorerwa munhevedzano ipi neipi? Muchidimbu, kubva pane izvi uye mhosho meseji senge pasina vashandi, dhizaini iri kuseri kweizvi inogona kuteverwa: sevha inochengetedza TCP yekubatanidza newe ndeyekumberi-yekupedzisira balancer, inoendesa mberi zvikumbiro kune backends uye inozviunganidza kumashure kuburikidza. message_id. Zvinoita sekuti zvese zviri pano zvakajeka, zvine musoro uye zvakanaka.

Hongu?.. Uye kana iwe uchifunga nezvazvo? Mushure mezvose, iyo RPC mhinduro pachayo inewo munda msg_id! Isu tinofanirwa kusheedzera kune sevha "hausi kupindura mhinduro yangu!"? Uye hongu, chii chaivepo nezvezvisimbiso? Nezve peji mameseji nezvemeseji inotiudza kuti chii

msgs_ack#62d6b459 msg_ids:Vector long = MsgsAck;

uye zvinofanira kuitwa kumativi ose. Asi kwete nguva dzose! Kana iwe wakagamuchira RpcResult, iyo pachayo inoshanda sesimbiso. Kureva kuti, sevha inogona kupindura chikumbiro chako neMsgsAck - senge, "Ndaigamuchira." RpcResult inogona kupindura nekukurumidza. Zvinogona kuva zvose.

Uye hongu, iwe uchiri kufanira kupindura mhinduro! Simbiso. Zvikasadaro, sevha inozviona isingasvikiki uye yoidzosera kwauri zvakare. Kunyangwe mushure mekubatanidza zvakare. Asi pano, chokwadi, nyaya yenguva inomuka. Ngatimbovatarisa pava paya.

Zvichakadaro, ngatitarisei pane zvingangoita query execution zvikanganiso.

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

Ah, mumwe munhu achadaidzira, heino chimiro chehunhu - pane mutsara! Tora nguva yako. Here rondedzero yezvikanganiso, asi kwete zvakakwana. Kubva pairi tinodzidza kuti kodhi ndeye chinhu chakadai HTTP zvikanganiso (zvakanaka, hongu, semantics yemhinduro haina kuremekedzwa, mune dzimwe nzvimbo inogoverwa zvisina tsarukano pakati pekodhi), uye mutsara unotaridzika senge. CAPITAL_LETTERS_AND_NUMBERS. Semuenzaniso, PHONE_NUMBER_OCCUPIED kana FILE_PART_Х_MISSING. Zvakanaka, ndiko kuti, iwe ucharamba uchida mutsara uyu tsanangura. Somuenzaniso, FLOOD_WAIT_3600 zvichareva kuti unofanira kumirira awa, uye PHONE_MIGRATE_5, kuti nhamba yefoni ine chivakashure ichi inofanira kunyoreswa mu5th DC. Tine mutauro wemhando, handiti? Isu hatidi nharo kubva kune tambo, dzenguva dzose dzinoita, zvakanaka.

Zvekare, izvi hazvisi pameseji yemeseji peji, asi, sezvatove zvagara nechirongwa ichi, ruzivo runogona kuwanikwa pane imwe mapepa peji. Kana kunyumwira. Chekutanga, tarisa, kutaipa/layer kutyorwa - RpcError inogona kuiswa mukati RpcResult. Wadii kunze? Chii chatisina kufunga nezvacho?.. Naizvozvo, ndeipi vimbiso iyoyo RpcError haigone kuisirwa mukati RpcResult, asi ive yakananga kana nested mune imwe mhando? .. Uye kana isingakwanisi, sei isiri iyo yepamusoro-soro, i.e. yashaikwa req_msg_id ? ..

Asi ngatienderere mberi nezve meseji dzebasa. Mutengi anogona kufunga kuti sevha iri kufunga kwenguva yakareba uye kuita ichi chikumbiro chinoshamisa:

rpc_drop_answer#58e4a740 req_msg_id:long = RpcDropAnswer;

Pane mhinduro nhatu dzinogoneka kumubvunzo uyu, zvakare kupindirana neyekusimbisa meshini; kuyedza kunzwisisa zvavanofanira kunge vari (uye kuti ndeipi rondedzero yemhando dzisingade kusimbiswa) inosiiwa kumuverengi sebasa remumba (chinyorwa: ruzivo mu iyo Telegraph Desktop source code haina kukwana).

Kupindwa muropa nezvinodhaka: mamiriro emashoko

Kazhinji, nzvimbo zhinji muTL, MTProto neTeregiramu kazhinji dzinosiya manzwiro ekusindimara, asi nekuda kwehuremekedzo, kungwara uye nezvimwe. soft skill Takaramba takanyarara pamusoro pazvo neruremekedzo, uye tikaongorora zvinonyadzisa munhaurirano. Zvisinei, nzvimbo iyiОzvizhinji zvepeji ndezve mameseji nezvemeseji Zvinokatyamadza kunyangwe kwandiri, anga achishanda netiweki protocol kwenguva yakareba uye aona mabhasikoro akasiyana siyana ekutsveyama.

Zvinotanga zvisina mhosva, nezvisimbiso. Vanotevera vanotiudza nezvazvo

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;

Zvakanaka, munhu wese anotanga kushanda neMTrototo achafanira kubata nazvo; mu "yakagadziriswa - yakadzokororwa - yakatangwa" kutenderera, kuwana zvikanganiso zvenhamba kana munyu wakwanisa kuipa panguva yekugadziriswa chinhu chakajairika. Zvisinei, pane pfungwa mbiri pano:

  1. Izvi zvinoreva kuti shoko rekutanga rakarasika. Isu tinofanirwa kugadzira mamwe mitsara, isu tichazvitarisa gare gare.
  2. Ndedzipi idzi nhamba dzezvikanganiso zvinoshamisa? 16, 17, 18, 19, 20, 32, 33, 34, 35, 48, 64... dzimwe nhamba dziripi, Tommy?

Zvinyorwa zvinoti:

Chinangwa ndechekuti kukanganisa_kodhi tsika dzakaiswa mumapoka (error_code >> 4): semuenzaniso, makodhi 0x40 - 0x4f anowirirana nezvikanganiso mukuparara kwemudziyo.

asi, chokutanga, kuchinja mune imwe nzira, uye chechipiri, hazvina basa, ndeapi mamwe makodhi? Mumusoro wemunyori?.. Zvisinei, izvi zvidiki.

Kupindwa muropa kunotanga mumameseji nezve meseji meseji uye meseji makopi:

  • Chikumbiro cheMharidzo Status Information
    Kana rimwe bato risati rawana ruzivo rwechimiro chemeseji dzaro kwechinguva, rinogona kukumbira zviripachena kubva kune rimwe bato:
    msgs_state_req#da69fb52 msg_ids:Vector long = MsgsStateReq;
  • Ruzivo rweMharidzo maererano neChimiro cheMharidzo
    msgs_state_info#04deb57d req_msg_id:long info:string = MsgsStateInfo;
    Pano, info tambo ine chaiyo byte imwe chete yemameseji meseji kune yega yega meseji kubva kune iri kuuya msg_ids runyorwa:

    • 1 = hapana chinozivikanwa nezve meseji (msg_id yakanyanya kuderera, mumwe munhu anogona kunge akanganwa)
    • 2 = meseji haina kugashirwa (msg_id inowira pakati pezviziviso zvakachengetwa; zvisinei, mumwe wacho haana kugamuchira meseji yakadaro)
    • 3 = meseji haina kugashirwa (msg_id yakakwira zvakanyanya; zvisinei, mumwe wacho haasati aigamuchira)
    • 4 = meseji yakagamuchirwa (ona kuti mhinduro iyi iri panguva imwechete yekubvuma risiti)
    • +8 = meseji yatobvumwa
    • +16 = meseji isingade kubvumwa
    • +32 = RPC mubvunzo uri mumeseji iri kugadziriswa kana kugadziridzwa kwatopera
    • +64 = mhinduro inoenderana nemeseji kune meseji yakatogadzirwa
    • +128 = rimwe bato rinoziva chokwadi kuti meseji yakatogamuchirwa
      Mhinduro iyi haidi kubvuma. Iko kubvuma kweakakodzera msgs_state_req, mukati uye pachayo.
      Ziva kuti kana zvikaitika kamwe kamwe kuti mumwe wacho haana meseji inoita senge yatumirwa kwairi, meseji inogona kungotumirwa zvakare. Kunyange kana mumwe wacho akagamuchira makopi maviri emeseji panguva imwe chete, akadhindwa acho haazotarisirwi. (Kana nguva yakawandisa yapfuura, uye yekutanga msg_id isingachashande, meseji yacho inofanira kuputirwa mumsg_copy).
  • Kuzvidira Kukurukurirana kweChimiro cheMharidzo
    Chero bato rinogona kuzivisa rimwe bato nekuzvidira mamiriro emashoko anofambiswa nerimwe bato.
    msgs_all_info#8cc0d131 msg_ids:Vector long info:string = MsgsAllInfo
  • Kuwedzerwa Kukurukurirana Kuzvidira kweChimiro cheMharidzo Imwe
    ...
    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;
  • Chikumbiro Chakajeka Chekutumirazve Mameseji
    msg_resend_req#7d861a08 msg_ids:Vector long = MsgResendReq;
    Bato riri kure rinobva rapindura nekutumira zvakare mameseji akakumbirwa […]
  • Chikumbiro Chakajeka Chekutumirazve Mhinduro
    msg_resend_ans_req#8610baeb msg_ids:Vector long = MsgResendReq;
    Bato iri kure rinobva rapindura nekutumira zvakare mhinduro kune mameseji akakumbirwa […]
  • Mharidzo Makopi
    Mune mamwe mamiriro, meseji yekare ine msg_id isingachashande inoda kutumirwazve. Zvadaro, inoputirwa mumudziyo wekopi:
    msg_copy#e06046b2 orig_message:Message = MessageCopy;
    Kana yangogamuchirwa, meseji inogadziriswa sekunge iyo yekuputira yakanga isipo. Zvakadaro, kana zvichizivikanwa kuti meseji orig_message.msg_id yakatambirwa, meseji nyowani haigadziriswe (panguva imwe cheteyo, iyo uye orig_message.msg_id inobvumwa). Kukosha kwe orig_message.msg_id kunofanirwa kudzika pane msg_id yemudziyo.

Totonyarara kuti chii msgs_state_info zvakare nzeve dzeTL dzisina kupera dziri kunamatira kunze (taida vector ye bytes, uye mumakumbo maviri ezasi maiva ne enum, uye mumakumbo maviri akakwirira maiva nemireza). Pfungwa yacho yakasiyana. Pane anonzwisisa here kuti nei zvese izvi zviri mukuita? mumutengi chaiye zvinodikanwa? .. Nekuoma, asi munhu anogona kufungidzira kumwe kubatsirwa kana munhu ari kuita debugging, uye ari interactive mode - bvunza server chii uye sei. Asi pano zvikumbiro zvinotsanangurwa rwendo rwokudzoka.

Izvi zvinotevera kuti bato rega rega harifanire kungovharira uye kutumira mameseji, asiwo kuchengetedza data pamusoro pavo, nezvemhinduro kwavari, kwenguva isingazivikanwe yenguva. Zvinyorwa hazvitsanangure kana nguva kana kushanda kweaya maficha. hapana nzira. Chinonyanya kushamisa ndechekuti ivo vanonyatso shandiswa mune kodhi yepamutemo vatengi! Sezviri pachena vakaudzwa chimwe chinhu chakanga chisina kuiswa muzvinyorwa zvevoruzhinji. Nzwisisa kubva kukodhi nei, haisisiri nyore sezvakaita TL - haisi (zvinei) chikamu chakasarudzika, asi chidimbu chakasungirirwa kune chivakwa chekushandisa, i.e. zvinoda nguva yakawanda kuti unzwisise kodhi yekushandisa.

Pings uye nguva. Queues.

Kubva pane zvese, kana tikarangarira fungidziro nezve server architecture (kugovera zvikumbiro kumativi ese ekumashure), chinhu chinosiririsa chinotevera - kunyangwe zvese zvivimbiso zvekutumira muTCP (kana iyo data inounzwa, kana iwe uchaziviswa nezve gap, asi iyo data ichaunzwa dambudziko risati raitika), izvo zvisimbiso muMTrototo pachayo - hapana zvivimbiso. Sevha inogona kurasikirwa nyore nyore kana kukanda meseji yako, uye hapana chinogona kuitwa nezvazvo, ingoshandisa marudzi akasiyana emadondoro.

Uye chekutanga - meseji mitsara. Zvakanaka, nechinhu chimwe chete zvese zvaive pachena kubva pakutanga - meseji isina kusimbiswa inofanirwa kuchengetwa uye kutukwa. Uye mushure menguva ipi? Uye museki anomuziva. Zvichida iwo mameseji akapindwa muropa sevhisi neimwe nzira anogadzirisa dambudziko iri nemadondoro, toti, muTeregiramu Desktop kune mitsara mina inoenderana navo (pamwe yakawanda, sezvatotaurwa, nekuda kweizvi iwe unofanirwa kunyura mukodhi yayo uye magadzirirwo zvakanyanya; panguva imwe chete. nguva, isu Tinoziva kuti haigone kutorwa semuenzaniso; imwe nhamba yemhando kubva kuMTProto chirongwa haishandiswe mairi).

Nei izvi zviri kuitika? Pamwe, sevha programmers havana kukwanisa kuona kuvimbika mukati mesumbu, kana kunyange kubhuroka kumberi kwebalancer, uye vakaendesa dambudziko iri kumutengi. Nekupererwa, Vasily akaedza kuita imwe sarudzo, aine mitsetse miviri chete, achishandisa algorithms kubva kuTCP - kuyera RTT kune server uye kugadzirisa saizi ye "hwindo" (mune meseji) zvichienderana nehuwandu hwezvikumbiro zvisina kusimbiswa. Ndokunge, iyo yakaoma heuristic yekuongorora mutoro wesevha ndeyekuti zvingani zvezvikumbiro zvedu zvinogona kutsenga panguva imwe chete uye kwete kurasikirwa.

Zvakanaka, ndiko kuti, unonzwisisa, handiti? Kana iwe uchifanira kushandisa TCP zvakare pamusoro peprotocol inomhanya pamusoro peTCP, izvi zvinoratidza protocol isina kunyatsogadzirwa.

Ah hongu, nei uchida kupfuura imwe mutsara, uye izvi zvinorevei kune munhu anoshanda nepamusoro-level API zvakadaro? Tarisa, unoita chikumbiro, gadzirisa, asi kazhinji haugone kuchitumira nekukurumidza. Sei? Nokuti mhinduro ichava msg_id, inova yechinguvanaаIni ndiri zita, iro basa rayo rinomisikidzwa zvakanyanya kusvika pakupera sezvinobvira - kana sevha ichiramba nekuda kwekusawirirana kwenguva pakati pedu naye (zvechokwadi, tinogona kugadzira crutch inoshandura nguva yedu kubva ikozvino. kune sevha nekuwedzera delta yakaverengerwa kubva kumhinduro dzesevha - vatengi vepamutemo vanoita izvi, asi hazvina kunaka uye hazvina chokwadi nekuda kwebhafa). Naizvozvo, kana iwe ukaita chikumbiro nekufona kwenzvimbo kubva kuraibhurari, meseji inofamba nematanho anotevera:

  1. Iyo yakarara mumutsara mumwe uye yakamirira encryption.
  2. Appointed msg_id uye meseji yakaenda kune imwe mutsara - inogoneka kutumira; tumira kune socket.
  3. a) Sevha yakapindura MsgsAck - meseji yakaunzwa, tinoidzima kubva kune "imwe mutsara".
    b) Kana zvinopesana, aisada chimwe chinhu, akapindura badmsg - tumira kubva kune "imwe mutsara"
    c) Hapana chinozivikanwa, meseji inoda kutsamwiswa kubva kune imwe mutsara - asi hazvizivikanwe kuti riini.
  4. Server akazopindura RpcResult - mhinduro chaiyo (kana kukanganisa) - kwete kungounzwa, asi zvakare yakagadziriswa.

Zvichida, kushandiswa kwemidziyo kunogona kugadzirisa dambudziko racho zvishoma. Apa ndipo pakazara mameseji mune imwe, uye sevha yakapindura nechisimbiso kune vese kamwechete, mune imwe. msg_id. Asi acharambawo iyi paki, kana chimwe chinhu chakashata, zvachose.

Uye panguva ino kufunga kusiri kwehunyanzvi kunopinda. Kubva pane zvakaitika, takaona madondoro akawanda, uye nekuwedzera, tichaona mamwe mimwe mienzaniso yezano rakaipa uye zvivakwa - mumamiriro ezvinhu akadaro, zvakakosha here kuvimba uye kuita zvisarudzo zvakadaro? Mubvunzo ndewe rhetorical (zvechokwadi kwete).

Tiri kutaura nezvei? Kana pamusoro pe "mameseji ezvinodhaka nezve meseji" iwe unogona kufungidzira nekupokana senge "iwe wakapusa, hauna kunzwisisa hurongwa hwedu hwakanaka!" (saka nyora zvinyorwa kutanga, sezvinofanirwa kuitwa nevanhuwo zvavo, zvine hungwaru uye nemienzaniso yekutsinhana kwepakiti, tobva tazotaura), ipapo nguva/nguva yekumisikidzwa mubvunzo unoshanda uye wakananga, zvese zviri pano zvave zvichizivikanwa kwenguva refu. Zvinyorwa zvinotiudzei nezvekufamba kwenguva?

Sevha inowanzobvuma kugamuchira meseji kubva kumutengi (kazhinji, mubvunzo weRPC) uchishandisa mhinduro yeRPC. Kana mhinduro iri kuuya kwenguva refu, sevha inogona kutanga yatumira kubvuma, uye imwe gare gare, iyo RPC mhinduro pachayo.

Mutengi anowanzo bvuma kugashira meseji kubva kuseva (kazhinji, mhinduro yeRPC) nekuwedzera kubvuma kune inotevera RPC mubvunzo kana isina kutumirwa kunonoka (kana yagadzirwa, taura, 60-120 masekondi anotevera risiti. yemeseji kubva kuseva). Zvisinei, kana kwenguva yakareba pasina chikonzero chekutumira mameseji kuvhavha kana kana pane nhamba huru yemashoko asingabvumirwi kubva kune server (taura, pamusoro pe16), mutengi anotumira kubvuma-yega.

... Ndinoshandura: isu pachedu hatizivi kuti yakawanda sei uye kuti tinoda sei, saka ngatitorei kuti ngazvive seizvi.

Uye nezve pings:

Ping Messages (PING/PONG)

ping#7abe77ec ping_id:long = Pong;

Mhinduro inowanzodzoserwa kune imwechete yekubatanidza:

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

Mharidzo idzi hadzidi kubvuma. Pong inotapurirwa chete mukupindura kune ping nepo ping inogona kutangwa nemativi ese.

Deferred Connection Kuvhara + PING

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

Inoshanda se ping. Pamusoro pezvo, mushure mekunge izvi zvagamuchirwa, sevha inotangisa timer inozovhara yazvino yekubatanidza disconnect_delay masekonzi gare gare kunze kwekunge yagamuchira meseji nyowani yemhando imwechete iyo inogadzirisa otomatiki ese apfuura nguva. Kana mutengi akatumira pings idzi kamwe chete pamasekonzi makumi matanhatu, semuenzaniso, inogona kuseta disconnect_delay yakaenzana ne60 seconds.

Unopenga here?! Mumasekonzi makumi matanhatu, chitima chichapinda muchiteshi, choburuka uye kusimudza vafambi, uye zvakare kurasikirwa nekubata mugero. Mumasekonzi 60, iwe uchiinzwa, ichasvika pane imwe, uye kubatana kungango dambuka. Zvakanaka, zviri pachena kuti makumbo ari kubva kupi - "Ndakanzwa kurira, asi handizive kuti ndekupi", pane Nagl's algorithm uye TCP_NODELAY sarudzo, yakagadzirirwa basa rinopindirana. Asi, ndiregerereiwo, batisisa kukosha kwayo - 120 Milliseconds Kana iwe uchinyatsoda kuratidza chimwe chinhu chakafanana uye chengetedza pane angangoita akati wandei emapaketi, wobva waisiya kwemasekonzi mashanu, kana chero iyo "Mushandisi ari kutaipa..." meseji nguva yekubuda. Asi hapasisina.

Uye pakupedzisira, pings. Ndiko, kutarisa hupenyu hwekubatana kweTCP. Zvinosekesa, asi angangoita makore gumi apfuura ndakanyora chinyorwa chakatsoropodza nezve mutumwa wedhipatimendi redu - vanyori ipapo vakaisa sevha kubva kumutengi, uye kwete zvinopesana. Asi 10rd gore vadzidzi chinhu chimwe, uye hofisi yepasirese ndeimwe, handiti?..

Kutanga, chirongwa chiduku chedzidzo. Kubatana kweTCP, mukushayikwa kwekuchinjana kwepaketi, kunogona kurarama kwemavhiki. Izvi zvose zvakanaka nezvakaipa, zvichienderana nechinangwa. Zvakanaka kana iwe uine SSH yekubatanidza yakavhurika kune sevha, wakasimuka kubva pakombuta, wotangazve router, wodzokera kunzvimbo yako - iyo chikamu kuburikidza neiyi server haina kubvarurwa (hauna kunyora chero chinhu, pakanga pasina mapaketi) , zviri nyore. Zvakaipa kana paine zviuru zvevatengi pane sevha, imwe neimwe ichitora zviwanikwa (mhoro, Postgres!), Uye mutengi wemutengi anogona kunge atangazve kare - asi isu hatizive nezvazvo.

Chat/IM masisitimu anowira mune yechipiri kesi kune chimwe chikonzero chekuwedzera - online statuses. Kana mushandisi "akadonha", unofanirwa kuzivisa vatauri vake nezveizvi. Zvikasadaro, iwe unozoguma nekukanganisa kwakaitwa nevagadziri veJabber (uye vakagadziridzwa kwemakore makumi maviri) - mushandisi akadzimwa, asi vanoramba vachinyora mameseji kwaari, vachitenda kuti ari online (iyo yakarasika zvachose mune izvi. maminetsi mashoma kubviswa kusati kwaonekwa). Kwete, iyo TCP_KEEPALIVE sarudzo, iyo vanhu vazhinji vasinganzwisise kuti TCP nguva inoshanda sei kukanda zvisina tsarukano (nekumisikidza tsika dzemusango senge makumi emasekondi), hazvibatsire pano - iwe unofanirwa kuve nechokwadi kuti kwete chete OS kernel. yemuchina wemushandisi mhenyu, asi zvakare unoshanda zvakajairwa, mukukwanisa kupindura, uye chishandiso pachacho (unofunga kuti hachigone kuomesa? Teregiramu Desktop paUbuntu 20 yakandiomesa nechando kanopfuura kamwe).

Ndicho chikonzero iwe uchifanira ping server mutengi, uye kwete zvinopesana - kana mutengi achiita izvi, kana kubatana kwakaputsika, ping haigoni kuendeswa, chinangwa hachizowanikwe.

Chii chatinoona paTeregiramu? Zvakatopesana chaizvo! Zvakanaka, ndizvo. Pakarepo, hongu, mativi ese ari maviri anogona ping mumwe nemumwe. Mukuita, vatengi vanoshandisa dondoro ping_delay_disconnect, iyo inoisa timer pane server. Zvakanaka, ndiregererei, hazvisi kumutengi kusarudza kuti anoda kugara kwenguva yakareba sei pasina ping. Sevha, zvichibva pamutoro wayo, inoziva zviri nani. Asi, hongu, kana iwe ukasarangarira zviwanikwa, ipapo iwe unenge uri wako wakaipa Pinocchio, uye mudondoro uchaita ...

Yaifanira kunge yakagadzirwa sei?

Ndinotenda kuti chokwadi chiri pamusoro apa chinoratidza zvakajeka kuti boka reTeregiramu / VKontakte harina kunyatsokwanisa mumunda wekutakura (uye pasi) nhanho yemakombiyuta emakombiyuta uye zvidzidzo zvavo zvakaderera munyaya dzakakodzera.

Nei zvakazove zvakaoma kudaro, uye vagadziri veTeregiramu vangaedza sei kuramba? Icho chokwadi chekuti vakaedza kuita musangano unopona TCP yekuputsika kwekubatanidza, kureva, izvo zvisina kuendeswa ikozvino, isu tichazoendesa gare gare. Vangangodaro vakaedzawo kugadzira UDP yekufambisa, asi vakasangana nematambudziko uye vakaisiya (ndosaka zvinyorwa zvisina chinhu - pakanga pasina chekuzvirumbidza nacho). Asi nekuda kwekushaikwa kwekunzwisisa kwekuita sei network muhuwandu uye TCP kunyanya kushanda, kwaunogona kuvimba nayo, uye kwaunoda kuzviita iwe pachako (uye sei), uye kuedza kubatanidza izvi ne cryptography "shiri mbiri dzine ibwe rimwe”, ichi ndicho chigumisiro.

Zvakanga zvakakodzera sei? Kubva pane chokwadi chekuti msg_id is a timestamp inodiwa kubva kune cryptographic point yekuona kudzivirira kurwiswa kwereplay, iko kukanganisa kubatanidza yakasarudzika identifier basa kwairi. Naizvozvo, pasina kunyatso shandura dhizaini yazvino (kana iyo Updates stream inogadzirwa, ndiyo yepamusoro-level API musoro kune chimwe chikamu cheiyi nhevedzano yezvinyorwa), mumwe angada ku:

  1. Sevha inobata TCP yekubatanidza kune mutengi inotora mutoro - kana yakaverenga kubva pane socket, ndapota bvuma, gadzirisa kana kudzorera kukanganisa, hapana kurasikirwa. Ipapo simbiso haisi vector yeid, asi kungoti "yekupedzisira kugamuchirwa seq_no" - ingori nhamba, sezviri muTCP (nhamba mbiri - yako seq uye yakasimbiswa). Isu tinogara tiri mukati mechikamu, handizvo here?
  2. Iyo timestamp yekudzivirira kurwiswa kwereplay inova nzvimbo yakaparadzana, iyo nonce. Inotariswa, asi haina chainokanganisa. Zvakwana uye uint32 - kana munyu wedu uchichinja kanenge hafu yezuva rega rega, tinogona kugovera 16 bits kune yakaderera-yakarongeka mabits echikamu chechikamu chenguva ino, imwe yese - kune chikamu chechikamu chesekondi (sezvino).
  3. Yakabviswa msg_id zvachose - kubva pakuona kwekusiyanisa zvikumbiro pamashure, pane, chekutanga, id yemutengi, uye chechipiri, id yechikamu, concatenate navo. Naizvozvo, chinhu chimwe chete chakakwana sechikumbiro chiziviso seq_no.

Iyi zvakare haisiriyo yakanyanya kubudirira sarudzo; yakazara isingaite inogona kushanda sechiziviso - izvi zvatoitwa muyepamusoro-level API kana uchitumira meseji, nenzira. Zvingave zviri nani kugadzirisa zvachose chivakwa kubva kuhama kusvika kune mhedziso, asi iyi inyaya yeimwe chikamu, kwete iyi positi.

API?

Ta-daam! Saka, tatambura nemugwagwa uzere nemarwadzo uye madondoro, takazokwanisa kutumira chero zvikumbiro kune server uye kugamuchira chero mhinduro kwavari, pamwe nekugamuchira zvigadziriso kubva kuseva (kwete mukupindura chikumbiro, asi icho pachacho. inotitumira, sePUSH, kana chero munhu akajeka nenzira iyoyo).

Attention, ikozvino pachave neiyo chete muenzaniso muPerl muchinyorwa! (kune avo vasina kujairana neiyo syntax, nharo yekutanga yekuropafadza ndiyo data yechinhu, yechipiri ikirasi yayo):

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

Ehe, kwete muparadzi nemaune - kana usati waiverenga, enda mberi uzviite!

Oh, wai~~... izvi zvinoratidzika sei? Chimwe chinhu chinonyanyo zivikanwa... pamwe ichi ndicho chimiro chedata cheyakajairika Webhu API muJSON, kunze kwekuti makirasi akasungirirwawo kuzvinhu?..

Saka ndozvazvinozoitika... Ko zvaita sei, vakomuredhi? ndichangotanga?...Haizongove JSON pamusoro peHTTPS here? Chii chatakawana mukutsinhana? Kuedza kwacho kwakanga kwakakodzera here?

Ngationgororei zvatakapiwa neTL + MProto uye ndedzipi dzimwe nzira dzinogoneka. Zvakanaka, HTTP, iyo inotarisa pane yekukumbira-mhinduro modhi, yakashata, asi chimwe chinhu chiri pamusoro peTLS?

Compact serialization. Ndichiona iyi data chimiro, yakafanana neJSON, ndinorangarira kuti kune mabhinari mavhezheni ayo. Ngatimaka MsgPack seisina kuwedzera, asi pane, semuenzaniso, CBOR - nenzira, chiyero chinotsanangurwa mu. RFC 7049. Zvinozivikanwa nekuti inotsanangura tags, senzira yekuwedzera, uye pakati yatova standardized zviripo:

  • 25 + 256 - kutsiva mitsara yakadzokororwa nereferensi yenhamba yemutsetse, nzira yakachipa yekumanikidza.
  • 26 - serialized Perl chinhu chine zita rekirasi uye nharo dzemuvaki
  • 27 - serialized mutauro-yakazvimirira chinhu chine zita remhando uye nharo dzemuvaki

Zvakanaka, ndakaedza kuenzanisa iyo data yakafanana muTL uye muCBOR netambo uye chinhu kurongedza chakagoneswa. Mhedzisiro yakatanga kusiyana ichifarira CBOR kumwe kunhu kubva kumegabyte:

cborlen=1039673 tl_len=1095092

Uye saka, mhedziso: Kune mafomati akareruka zvakanyanya asiri pasi pedambudziko rekutadza kwekubatanidza kana chiziviso chisingazivikanwe, nekugona kuenzaniswa.

Fast yekubatanidza kumisikidzwa. Izvi zvinoreva zero RTT mushure mekubatanidzazve (apo kiyi yatogadzirwa kamwe) - inoshanda kubva kune yekutanga MTProto meseji, asi nekumwe kuchengetedza - rova ​​​​munyu wakafanana, chikamu hachina kuora, nezvimwe. Chii chinotipa TLS panzvimbo? Quote pamusoro penyaya:

Paunenge uchishandisa PFS muTLS, TLS matikiti emusangano (RFC 5077) kutangazve chikamu chakavharidzirwa pasina kutauriranazve makiyi uye pasina kuchengetedza ruzivo rwakakosha pane server. Paunenge uchivhura yekutanga yekubatanidza uye kugadzira makiyi, sevha inovharira iyo yekubatanidza mamiriro uye inoendesa kune mutengi (nenzira yetiketi rechikamu). Saizvozvo, kana kubatana kwatangazve, mutengi anotumira tikiti rechikamu, kusanganisira kiyi yechikamu, kudzokera kuseva. Tikiti pacharo rakavharidzirwa nekiyi yenguva pfupi (kiyi yetiketi rechirongwa), inochengetwa paseva uye inofanira kugoverwa pakati pemaseva emberi achigadzira SSL mumhinduro dzakasanganiswa.[10]. Saka, kuiswa kwetikiti remusangano kunogona kutyora PFS kana makiyi enguva pfupi akakanganiswa, semuenzaniso, kana akachengetwa kwenguva yakareba (OpenSSL, nginx, Apache azvichengete nekukasira kwenguva yese yechirongwa; nzvimbo dzakakurumbira dzinoshandisa. kiyi kwemaawa akati wandei, kusvika kumazuva).

Pano RTT haisi zero, unoda kuchinjanisa zvishoma ClientHello uye ServerHello, mushure mokunge mutengi anogona kutumira data pamwe chete neFinished. Asi pano isu tinofanira kuyeuka kuti isu hatina Webhu, neboka rayo rezvichangobva kuvhurwa zvinongedzo, asi mutumwa, iyo yekubatanidza iyo inowanzova imwe uye yakawanda kana shoma yekugara kwenguva refu, zvikumbiro zvipfupi kumapeji eWebhu - zvese zvakapetwa. mukati. Ndokunge, zvinotenderwa kana tisina kuwana chikamu chakashata che subway.

Wakanganwa chimwe chinhu? Nyora mumashoko.

Zvichaenderera mberi!

Muchikamu chechipiri cheiyi nhevedzano yezvinyorwa isu tichafunga kwete tekinoroji, asi nyaya dzesangano - nzira, pfungwa, chimiro, maitiro kune vashandisi, nezvimwe. Zvichienderana, zvisinei, pane ruzivo rwehunyanzvi rwakaratidzwa pano.

Chikamu chechitatu chicharamba chichiongorora iyo tekinoroji chikamu / chiitiko chekusimudzira. Iwe uchadzidza, kunyanya:

  • kuenderera mberi kwepandemonium nemhando dzakasiyana dzeTL
  • zvinhu zvisingazivikanwe nezve machaneli uye supergroups
  • sei ma dialogs ari worse than roster
  • nezve absolute vs hama meseji kero
  • chii musiyano pakati pemufananidzo nemufananidzo
  • kuti emoji inokanganisa sei zvinyorwa zveitalic

nemamwe madondoro! Ramba wakatarisa!

Source: www.habr.com

Voeg