Ukugxekwa kweprotocol kunye neendlela zombutho zeTelegram. Icandelo 1, ubuchwephesha: amava ngokubhala umxhasi ukusuka ekuqaleni - TL, MT

Kungekudala, izithuba malunga nendlela iTelegram enhle ngayo, indlela abazalwana baseDurov abaqaqambileyo nabanamava ngayo kwiinkqubo zokwakhiwa kwenethiwekhi, njl. Kwangelo xesha, bambalwa kakhulu abantu abaye bazintywilisela kwisixhobo sobugcisa- kakhulu, basebenzisa ilula ngokufanelekileyo (kwaye yahluke kakhulu kwi-MTProto) Bot API esekwe kwi-JSON, kwaye bahlala beyamkela. phezu kokholo zonke iindumiso kunye ne-PR ejikeleza umthunywa. Phantse unyaka onesiqingatha odlulileyo, umlingane wam e-Eshelon NGO Vasily (ngelishwa, iakhawunti yakhe kuHabré yacinywa kunye nedrafti) waqala ukubhala umxhasi wakhe weTelegram ukusuka ekuqaleni ePerl, kwaye kamva umbhali wale migca wajoyina. Kutheni uPerl, abanye baya kubuza ngokukhawuleza? Ngenxa yokuba iiprojekthi ezinjalo sele zikhona kwezinye iilwimi, enyanisweni, akukho ngongoma, kunokubakho naluphi na olunye ulwimi apho kungekho ilayibrari esele yenziwe, kwaye ngokufanelekileyo umbhali kufuneka ahambe yonke indlela ukususela ekuqalei. Ngaphezu koko, i-cryptography yinto yokuthenjwa, kodwa qinisekisa. Ngemveliso ejolise kukhuseleko, awukwazi ukuthembela kwilayibrari esele ilungile evela kumenzi kwaye uyithembe ngokungaboniyo (nangona kunjalo, esi sisihloko secandelo lesibini). Okwangoku, ithala leencwadi lisebenza kakuhle kwinqanaba "eliphakathi" (likuvumela ukuba wenze naziphi na izicelo ze-API).

Nangona kunjalo, akuyi kubakho cryptography okanye izibalo ezininzi kolu luhlu lwezithuba. Kodwa kuya kuba nezinye iinkcukacha ezininzi zobugcisa kunye neentonga zokwakha (zikwaluncedo kwabo bangayi kubhala ukusuka ekuqaleni, kodwa baya kusebenzisa ilayibrari naluphi na ulwimi). Ngoko ke, injongo ephambili yayikukuzama ukuphumeza umxhasi ukususela ekuqaleni ngokwamaxwebhu asemthethweni. Oko kukuthi, makhe sicinge ukuba ikhowudi yomthombo wabathengi abasemthethweni ivaliwe (kwakhona, kwinxalenye yesibini siya kugubungela ngokubanzi isihloko sokuba oku kuyinyaniso. Iyenzeka ngoko), kodwa, njengakwimihla yakudala, umzekelo, kukho umgangatho onje nge-RFC - ngaba kunokwenzeka ukuba ubhale umxhasi ngokweenkcukacha zodwa, "ngaphandle kokujonga" kwikhowudi yomthombo, ibe yigosa (iDesktop yeTelegram, mobile), okanye iTelethon engekho semthethweni?

Isiqulatho:

Uxwebhu... lukhona, akunjalo? Ingaba yinyani?..

Iziqwenga zamanqaku eli nqaku zaqala ukuqokelelwa ehlotyeni edlulileyo. Lonke eli xesha kwiwebhusayithi esemthethweni https://core.telegram.org Uxwebhu lwalunje ngoLuhlu lwama-23, okt. wanamathela kwenye indawo ngo-2014 (khumbula, bekungekho namajelo emva ngelo xesha?). Ngokuqinisekileyo, kwithiyori, oku bekufanele kusivumele ukuba siphumeze umxhasi ngokusebenza ngelo xesha ngo-2014. Kodwa nakweli lizwe, amaxwebhu, okokuqala, ayengaphelelanga, kwaye okwesibini, kwiindawo ayeziphikisa. Ngaphezu kwenyanga nje edlulileyo, ngoSeptemba ka-2019, bekunjalo ngengozi Kwafunyaniswa ukuba kukho uhlaziyo olukhulu lwamaxwebhu kwindawo, kwiLayer 105 yamva nje, kunye nenqaku lokuba ngoku yonke into kufuneka ifundwe kwakhona. Eneneni, amanqaku amaninzi aye ahlaziywa, kodwa amaninzi awazange atshintshe. Ke ngoko, xa ufunda ukugxekwa okungezantsi malunga namaxwebhu, kuya kufuneka ukhumbule ukuba ezinye zezi zinto azisasebenzi, kodwa ezinye zisalungile. Emva kwayo yonke loo nto, iminyaka emi-5 kwihlabathi lanamhlanje ayikho nje ixesha elide, kodwa kakhulu Ezininzi. Ukususela ngaloo maxesha (ingakumbi ukuba awuyi kuthathela ingqalelo iindawo ze-geochat ezilahliweyo kwaye zivuselelwe ukususela ngoko), inani leendlela ze-API kwisikimu likhule ukusuka kwikhulu ukuya ngaphezu kwamakhulu amabini anamashumi amahlanu!

Ungaqala phi njengombhali oselula?

Akukhathaliseki nokuba ubhala ukusuka ekuqaleni okanye usebenzisa, umzekelo, iilayibrari esele zenziwe I-Telethon yePython okanye Madeline for PHP, kuyo nayiphi na imeko, uya kufuna kuqala bhalisa isicelo sakho - fumana iiparamitha api_id и api_hash (abo basebenze kunye neVKontakte API baqonda ngokukhawuleza) apho umncedisi uya kuchonga isicelo. Oku kufuneke u yenze ngezizathu zomthetho, kodwa siza kuthetha ngakumbi malunga nokuba kutheni ababhali bethala leencwadi bengakwazi ukuyipapasha kwicandelo lesibini. Unokwaneliseka ngamaxabiso ovavanyo, nangona anqongophele kakhulu - inyaniso kukuba ngoku unokubhalisa mnye kuphela app, ke musa ukukhawuleza uye kuyo.

Ngoku, ukusuka kumbono wezobugcisa, sifanele sibe nomdla kwinto yokuba emva kokubhaliswa kufuneka sifumane izaziso kwiTelegram malunga nokuhlaziywa kwamaxwebhu, iprotocol, njl. Oko kukuthi, umntu unokucinga ukuba indawo ene-docks ishiywe nje kwaye yaqhubeka isebenza ngokuthe ngqo kunye nabo baqala ukwenza abathengi, kuba kulula. Kodwa hayi, akukho nto injalo yabonwa, akukho lwazi luzayo.

Kwaye ukuba ubhala ukusuka ekuqaleni, ukusebenzisa iiparamitha ezifunyenweyo kusekude kakhulu. Nangona https://core.telegram.org/ kwaye uthetha ngazo kuQalisa kuqala kuzo zonke, enyanisweni, kuya kufuneka uqale uphumeze Iprotocol yeMTProto kodwa ukuba uyakholwa uyilo ngokwemodeli yeOSI ekupheleni kwephepha kwinkcazo ngokubanzi yeprotocol, ngoko kungamampunge ngokupheleleyo.

Ngapha koko, kokubini ngaphambi nangemva kweMTProto, kumanqanaba aliqela ngaxeshanye (njengabasebenzi bomnatha bangaphandle abasebenza kwi-OS kernel bathi, ukwaphulwa kongqimba), isihloko esikhulu, esibuhlungu nesibi siya kungena endleleni...

Uthotho lwesibini: iTL (uHlobo loLwimi) kunye neskimu sayo, kunye neengqimba, kunye namanye amagama amaninzi awoyikisayo.

Esi sihloko, enyanisweni, sisitshixo kwiingxaki zeTelegram. Kwaye kuya kubakho amagama amaninzi amabi ukuba uzama ukungena kuyo.

Ngoko, nanku umzobo. Ukuba eli lizwi lifika engqondweni yakho, yithi, JSON Schema, Ucinge kakuhle. Injongo iyafana: olunye ulwimi lokuchaza iseti enokwenzeka yedatha edlulisiweyo. Kulapho ukufana kuphela khona. Ukuba kwiphepha Iprotocol yeMTProto, okanye kumthombo womthi womxhasi osemthethweni, siya kuzama ukuvula i-schema ethile, siya kubona into efana nale:

int ? = Int;
long ? = Long;
double ? = Double;
string ? = String;

vector#1cb5c415 {t:Type} # [ t ] = Vector t;

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

rpc_answer_unknown#5e2ad36e = RpcDropAnswer;
rpc_answer_dropped_running#cd78e586 = RpcDropAnswer;
rpc_answer_dropped#a43ad8b7 msg_id:long seq_no:int bytes:int = RpcDropAnswer;

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

---functions---

set_client_DH_params#f5045f1f nonce:int128 server_nonce:int128 encrypted_data:bytes = Set_client_DH_params_answer;

ping#7abe77ec ping_id:long = Pong;
ping_delay_disconnect#f3427b8c ping_id:long disconnect_delay:int = Pong;

invokeAfterMsg#cb9f372d msg_id:long query:!X = X;
invokeAfterMsgs#3dc4b4f0 msg_ids:Vector<long> query:!X = X;

account.updateProfile#78515775 flags:# first_name:flags.0?string last_name:flags.1?string about:flags.2?string = User;
account.sendChangePhoneCode#8e57deb flags:# allow_flashcall:flags.0?true phone_number:string current_number:flags.0?Bool = auth.SentCode;

Umntu obona oku okokuqala uya kukwazi ukuqonda kuphela inxalenye yento ebhaliweyo - kulungile, ezi zizakhiwo (nangona liphi igama, ekhohlo okanye ekunene?), Kukho iindawo kuzo, emva koko udidi lulandela emva kwekholoni... mhlawumbi. Apha kwizibiyeli ze-engile mhlawumbi kukho iitemplates ezifana ne-C++ (enyanisweni, hayi ncma). Kwaye zithetha ukuthini zonke ezinye iisimboli, amanqaku emibuzo, amanqaku esikhuzo, iipesenti, amanqaku e-hash (kwaye ngokucacileyo athetha izinto ezahlukeneyo kwiindawo ezahlukeneyo), ngamanye amaxesha akhoyo kwaye ngamanye amaxesha awakho, amanani anehexadecimal - kwaye okona kubaluleke kakhulu, indlela yokufumana kule nto. olungileyo (engayi kwaliwa ngumncedisi) umjelo we-byte? Kuya kufuneka ufunde amaxwebhu (ewe, kukho amakhonkco kwi-schema kwinguqulelo ye-JSON ekufutshane- kodwa loo nto ayiyenzi icace ngakumbi).

Vula iphepha Binary Data Uthotho kunye nokuntywila kwihlabathi lemilingo lamakhowa kunye nezibalo ezicacileyo, into efana ne-matan kunyaka we-4. Ialfabhethi, uhlobo, ixabiso, umdibanisi, umdibanisi osebenzayo, uhlobo oluqhelekileyo, uhlobo oluhlanganisiweyo, uhlobo lwepolymorphic... kwaye lilo lonke elo phepha lokuqala! Okulandelayo kukulindile Ulwimi lweTL, leyo, nangona sele iqulethe umzekelo wesicelo esingenamsebenzi kunye nempendulo, ayinikezi mpendulo konke konke kwiimeko eziqhelekileyo, okuthetha ukuba kuya kufuneka uhambe ngokuphinda ubalise imathematika eguqulelwe ukusuka kwisiRashiya ukuya kwisiNgesi kwezinye ezisibhozo ezizinzisiweyo. amaphepha!

Abafundi abaqheleneyo neelwimi ezisebenzayo kunye nohlobo oluzenzekelayo lwentekelelo baya kuthi, ngokuqinisekileyo, babone ulwimi lwenkcazo kolu lwimi, nokuba kumzekelo, luqhelekile ngakumbi, kwaye banokuthi oku akulunganga kumgaqo. Izichaso koku zezi:

  • ewe, injongo ivakala kakuhle, kodwa yeha, yena ayifezekiswanga
  • Imfundo kwiiyunivesithi zaseRashiya iyahluka naphakathi kweengcali ze-IT - ayinguye wonke umntu othathe ikhosi ehambelanayo
  • Ekugqibeleni, njengoko siza kubona, ekusebenzeni kunjalo a yi funeki, kuba kusetyenziswa kuphela iseti encinci ye-TL echaziweyo

Njengoko kushiwo LeoNerd kwitshaneli #perl kwinethiwekhi ye-IRC ye-FreeNode, ezame ukuphumeza isango ukusuka kwiTelegram ukuya kwi-Matrix (uguqulelo lwesicatshulwa aluchanekanga kwimemori):

Kuvakala ngathi kukho umntu owaziswa ukuchwetheza ithiyori okokuqala, waba nemincili, kwaye waqala ukuzama ukudlala ngayo, engakhathali nokuba iyafuneka na xa isenziwa.

Zibonele ngokwakho, ukuba imfuno yeentlobo ezingenanto (int, ezinde, njl.njl.) njengento esisiseko ayiphakamisi imibuzo - ekugqibeleni kufuneka iphunyezwe ngesandla - umzekelo, makhe sithathe umzamo wokufumana kuzo. vector. Oko, enyanisweni, uluhlu, ukuba ubiza izinto ezibangelwayo ngamagama azo afanelekileyo.

Kodwa kuqala

Inkcazo emfutshane yeseti ye-TL yesintaksi kwabo bangafundiyo amaxwebhu asemthethweni

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;

Inkcazo ihlala iqala umakhi, emva koko ngokuzikhethela (kwisenzo - rhoqo) ngesimboli # kufanele I-CRC32 ukusuka kumtya wenkcazo yesiqhelo yolu hlobo. Okulandelayo kuza inkcazo yemihlaba ukuba ikhona, uhlobo lunokuba lungenanto. Konke oku kugqiba ngophawu olulinganayo, igama lohlobo apho lo makhi - oko kukuthi, enyanisweni, i-subtype - ingowabo. Umfo osekunene kophawu olulinganayo ngu ipholymorphic - oko kukuthi, iintlobo ezininzi ezithile zinokuhambelana nayo.

Ukuba inkcazo yenzeka emva komgca ---functions---, ngoko i-syntax iya kuhlala ifana, kodwa intsingiselo iya kwahluka: umakhi uya kuba ligama lomsebenzi we-RPC, imihlaba iya kuba yiparameters (kakuhle, oko kukuthi, iya kuhlala ifana nqwa nesakhiwo esinikiweyo, njengoko kuchaziwe ngezantsi. , oku kuya kuba yintsingiselo eyabelwe ngokulula), kunye ne "polymorphic type " - uhlobo lwesiphumo esibuyisiweyo. Enyanisweni, iya kuhlala i-polymorphic-ichazwe nje kwicandelo ---types---, kodwa lo makhi "akayi kuqwalaselwa". Ukulayisha ngaphezulu kweentlobo zemisebenzi ebizwa ngokuba yingxoxo yabo, i.e. Ngesizathu esithile, imisebenzi emininzi enegama elifanayo kodwa imisayino eyahlukeneyo, njengakwi-C++, ayibonelelwanga kwiTL.

Kutheni "umakhi" kunye "nepolymorphic" ukuba asiyoOOP? Ewe, eneneni, kuya kuba lula ukuba umntu acinge ngale nto ngokwemigaqo ye-OOP - uhlobo lwepolymorphic njengeklasi engabonakaliyo, kwaye abakhi ziiklasi zabo zenzala ngqo, kwaye final kwisigama seelwimi ezininzi. Enyanisweni, apha kuphela ukufana ngeendlela zokwenene zomakhi ogcwele kakhulu kwiilwimi zokuprograma ze-OO. Kuba apha kukho nje izakhiwo zedatha, akukho ndlela (nangona inkcazo yemisebenzi kunye neendlela ezingaphezulu ziyakwazi ukudala ukudideka entloko ukuba zikhona, kodwa ngumcimbi owahlukileyo) - unokucinga ngomakhi njengexabiso leyo iyakhiwa chwetheza xa ufunda umsinga we-byte.

Kwenzeka njani oku? I-deserializer, ehlala ifunda i-4 bytes, ibona ixabiso 0xcrc32 - kwaye uyayiqonda into eza kwenzeka ngokulandelayo field1 ngodidi int, okt. ifunda ngokuthe ngqo ii-bytes ezi-4, kule ndawo ingaphezulu ngodidi PolymorType funda. Uyabona 0x2crc32 kwaye uyaqonda ukuba kukho amasimi amabini ngaphezulu, okokuqala long, okuthetha ukuba sifunda iibytes ezisi-8. Kwaye ke kwakhona uhlobo oluyinkimbinkimbi, oluchithwa ngendlela efanayo. Umzekelo, Type3 inokubhengezwa kwisekethe kamsinya nje ukuba abakhi ababini, ngokulandelelanayo, ngoko ke kufuneka badibane 0x12abcd34, emva koko kufuneka ufunde ezinye ii-byte ezi-4 int, okanye 0x6789cdef, emva koko akuyi kubakho nto. Nantoni na enye - kufuneka ulahle ngaphandle. Nangona kunjalo, emva koku sibuyela ekufundeni i-4 bytes int amasimi field_c в constructorTwo kwaye ngaloo nto sigqiba ukufunda yethu PolymorType.

Ekugqibeleni, ukuba uyabanjwa 0xdeadcrc kuba constructorThree, ngoko yonke into iba nzima ngakumbi. Intsimi yethu yokuqala bit_flags_of_what_really_present ngodidi # - eneneni, esi sisibizo nje sohlobo nat, elithetha "inani lendalo". Oko kukuthi, i-int engabhalwanga, ngendlela, kuphela imeko xa amanani angabhalwanga esenzeka kwiisekethe zangempela. Ngoko ke, ngokulandelayo ulwakhiwo olunophawu lombuzo, oku kuthetha ukuba le ntsimi - iya kubakho kwi-wire kuphela ukuba i-bit ehambelanayo imiselwe kwintsimi ekubhekiselwe kuyo (malunga nomqhubi we-ternary). Ke, masicinge ukuba le ntwana yayisetiwe, okuthetha ukuba kufuneka sifunde ngakumbi intsimi efana Type, leyo kumzekelo wethu inabakhi aba-2. Enye ayinanto (iquka kuphela isichongi), enye inomhlaba ids ngodidi ids:Vector<long>.

Unokucinga ukuba zombini iitemplates kunye neegenerics zikwi-pros okanye iJava. Kodwa hayi. Phantse. Oku kuphela imeko yokusebenzisa izibiyeli ze-engile kwiisekethe zokwenyani, kwaye isetyenziswa KUPHELA kwiVector. Kwi-byte stream, ezi ziya kuba yi-4 CRC32 bytes yohlobo lweVector ngokwayo, ihlala ifana, emva koko i-4 bytes - inani le-array elements, kwaye ke ezi elementi ngokwazo.

Yongeza kule nto yokuba ulandelelwano luhlala lusenzeka kumagama e-4 bytes, zonke iindidi ziziphindaphinda zayo - iintlobo ezakhelwe ngaphakathi nazo zichazwe. bytes и string ngokulungelelaniswa kwencwadana yobude kunye nokulungelelaniswa kwe-4 - kuhle, kubonakala ngathi kuvakala kuqhelekileyo kwaye kusebenza kakuhle? Nangona i-TL ibango njenge-serialization yokubini esebenzayo, ukuya esihogweni kunye nabo, kunye nokwandiswa kwayo nantoni na, amaxabiso e-Boolean kunye neentambo ezinomlinganiswa omnye ukuya kwii-bytes ezi-4, ngaba i-JSON iya kuba ngqindilili kakhulu? Jonga, namasimi angeyomfuneko angatsitywa ngeeflegi, yonke into ilungile, kwaye inokwandiswa kwixesha elizayo, kutheni ke ungongezi iindawo ezintsha ozikhethelayo kumakhi kamva?..

Kodwa hayi, ukuba awufundi inkcazo emfutshane yam, kodwa amaxwebhu apheleleyo, kwaye ucinge malunga nokuphunyezwa. Okokuqala, i-CRC32 yomakhi ibalwa ngokomgca oqhelekileyo wenkcazo yombhalo weskim (susa indawo emhlophe eyongezelelweyo, njl. njl.) - ke ukuba intsimi entsha yongezwa, umgca wenkcazo yohlobo uya kutshintsha, kwaye ngenxa yoko i-CRC32 yayo kunye , ngenxa yoko, ukulandelelana. Kwaye uya kwenza ntoni umxhasi omdala ukuba ufumana intsimi eneeflegi ezintsha, kwaye akazi ukuba enze ntoni ngazo ngokulandelayo?

Okwesibini, masikhumbule I-CRC32, esetyenziswa apha ngokusisiseko njenge imisebenzi ye-hash ukumisela ngokukodwa ukuba loluphi na uhlobo olu (de) lwenziwe ngothotho. Apha sijongene nengxaki yokungqubana - kwaye hayi, okunokwenzeka akukhona kwi-232, kodwa kukhulu kakhulu. Ngubani oye wakhumbula ukuba i-CRC32 yenzelwe ukukhangela (kwaye ilungise) iimpazamo kumjelo wonxibelelwano, kwaye ngokufanelekileyo iphucule ezi mpawu zibe yingozi kwabanye? Umzekelo, ayikhathali malunga nokuhlengahlengiswa kwee-bytes: ukuba ubala i-CRC32 ukusuka kwimigca emibini, okwesibini utshintshe ii-bytes ezi-4 zokuqala kunye ne-4 bytes elandelayo - iya kufana. Xa igalelo lethu liyimitya yokubhaliweyo ukusuka kwialfabhethi yesiLatini (kunye nesiphumlisi esincinci), kwaye la magama akakhethi ngokukhethekileyo, ukuba nokwenzeka kohlengahlengiso kukhula kakhulu.

Ngendlela, ngubani ojongileyo ukuba kukho ntoni na? ngokwenene CRC32? Enye yeekhowudi zomthombo wokuqala (nangaphambi kokuba uWaltman) abe nomsebenzi we-hash owaphinda-phinda umlinganiswa ngamnye ngenombolo engu-239, ethandwa kakhulu ngaba bantu, ha ha!

Okokugqibela, kulungile, siye saqonda ukuba abakhi abanohlobo lwentsimi Vector<int> и Vector<PolymorType> iya kuba ne-CRC32 eyahlukileyo. Kuthekani ngokusebenza kwe-intanethi? Kwaye ngokwembono yethiyori, ingaba oku kuba yinxalenye yohlobo? Masithi sigqithise uluhlu lwamawaka alishumi amanani, kunye Vector<int> yonke into icacile, ubude kunye nezinye iibhayithi ezingama-40000. Kuthekani ukuba oku Vector<Type2>, equka indawo enye kuphela int kwaye iyodwa kuhlobo - ngaba kufuneka siphinde 10000xabcdef0 34 amaxesha kwaye emva koko 4 bytes int, okanye ulwimi luyakwazi UKUZINIKELA kuthi kumakhi fixedVec kwaye endaweni ye-80000 bytes, utshintshe kwakhona kuphela 40000?

Lo ayingombuzo wethiyori ongasebenziyo konke konke - cinga ukuba ufumana uluhlu lwabasebenzisi beqela, elowo une-id, igama lokuqala, igama lokugqibela - umahluko kwinani ledatha edluliselwe kunxibelelwano lweselula unokubaluleka. Kukusetyenzwa kanye kweTelegram kothotho olubhengezwa kuthi.

Ngoko...

IVector, engazange ikhululwe

Ukuba uzama ukudlula kumaphepha enkcazelo yabahlanganisi njalo njalo, uya kubona ukuba i-vector (kunye ne-matrix) izama ngokusesikweni ukukhutshwa ngeetayipi zamaphepha amaninzi. Kodwa ekugqibeleni bayalibala, inyathelo lokugqibela liyatsitywa, kwaye inkcazo ye-vector inikwe ngokulula, engekabotshwa kuhlobo. Yintoni ingxaki? Ngeelwimi inkqubo, ngakumbi ezisebenzayo, kuyinto eqhelekileyo ukuchaza isakhiwo ngokuphindaphindiweyo - umqambi kunye novavanyo lwayo olunqenayo uya kuqonda kwaye enze yonke into ngokwayo. Ngolwimi ulandelelwano lwedatha into efunekayo yi-EFFICIENCY: kwanele ukuchaza ngokulula uluhlu, okt. ulwakhiwo lwezinto ezimbini - eyokuqala sisiqalelo sedatha, eyesibini sisakhiwo esifanayo ngokwaso okanye isithuba esingenanto somsila (ipaki (cons) eLisp). Kodwa oku kuya kufuna ngokucacileyo wonke umntu element ichitha ezongezelelweyo 4 bytes (CRC32 kwimeko TL) ukuchaza uhlobo yayo. Uluhlu lunokuchazwa ngokulula ubungakanani obusisigxina, kodwa kwimeko yoluhlu lobude obungaziwa kwangaphambili, siyahlukana.

Ke ngoko, kuba iTL ayikuvumeli ukukhupha i-vector, kuye kwafuneka yongezwe ecaleni. Ekugqibeleni amaxwebhu athi:

Uthotho lusoloko lusebenzisa umakhi ofanayo “ivektha” (const 0x1cb5c415 = crc32(“vector t: Uhlobo # [ t ] = Vector t”) engaxhomekekanga kwixabiso elithile lenguqu yohlobo lwe-t.

Ixabiso lokhetho lweparameter t alibandakanyekanga kulandelelwano kuba lisuka kuhlobo lwesiphumo (elihlala lisaziwa phambi kokususwa).

Jonga ngononophelo: vector {t:Type} # [ t ] = Vector t - kodwa akukho ndawo Le nkcazo ngokwayo ayithethi ukuba inani lokuqala kufuneka lilingane nobude be-vector! Kwaye ayiveli naphi na. Oku kunikezelwe ekufuneka kugcinwe engqondweni kwaye kuphunyezwe ngezandla zakho. Kwenye indawo, amaxwebhu achaza ngokunyanisekileyo ukuba uhlobo ayisiyiyo yokwenyani:

IVector t polymorphic pseudotype “luhlobo” oluxabiso layo lululandelelwano lwamaxabiso lwalo naluphi na uhlobo lwe-t, nokuba yibhokisi okanye ayinxibanga.

... kodwa ayigxininisi kuyo. Xa wena, udiniwe kukuhamba ngemathematika (mhlawumbi nokuba waziwa nguwe kwikhosi yaseyunivesithi), uthathe isigqibo sokuncama kwaye ujonge indlela yokusebenza nayo xa usenza, umbono oshiyekileyo entlokweni yakho kukuba oku kuSerious. IMathematika engundoqo, yaqanjwa ngokucacileyo ngabantu abapholileyo (iingcali zezibalo ezimbini - ophumeleleyo we-ACM), kwaye kungekhona nabani na. Injongo - ukuqhayisa - ifezekisiwe.

Ngendlela, malunga nenani. Masikukhumbuze oko # sisithethantonye nat, inombolo yendalo:

Kukho uhlobo lwentetho (uhlobo-expr) kunye namabinzana amanani (nat-expr). Nangona kunjalo, zichazwa ngendlela efanayo.

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

kodwa kwigrama zichazwe ngendlela efanayo, okt. Lo mahluko kufuneka uphinde ukhunjulwe kwaye usetyenziswe ngesandla.

Ewe, ewe, iintlobo zetemplate (vector<int>, vector<User>) banesichongi esifanayo (#1cb5c415), oko kukuthi. ukuba uyazi ukuba umnxeba ubhengezwa njenge

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

emva koko awusalindeli nje i-vector, kodwa i-vector yabasebenzisi. Ngokuchanekileyo, kufanelekile linda - kwikhowudi yokwenyani, yonke into, ukuba ayilohlobo olungenanto, iya kuba nomakhi, kwaye ngendlela elungileyo ekuphunyezweni kuya kuba yimfuneko ukujonga - kodwa sithunyelwe ngokuchanekileyo kuyo yonke into yale vector. olo hlobo? Kuthekani ukuba yayiluhlobo oluthile lwe-PHP, apho uluhlu lunokuqulatha iindidi ezahlukeneyo kwizinto ezahlukeneyo?

Ngeli xesha uqala ukucinga - ngaba iTL iyimfuneko? Mhlawumbi kwinqwelo kuya kuba nakho ukusebenzisa i-serializer yomntu, iprotobuf efanayo esele ikhona ngoko? Yayiyithiyori leyo, makhe sijonge ukuziqhelanisa.

Ukuphunyezwa kweTL ekhoyo kwikhowudi

U-TL wazalelwa ezinzulwini zeVKontakte nangaphambi kokuba iziganeko ezidumileyo ngokuthengiswa kwesabelo sikaDurov kunye (Ingayiyo), nangaphambi kokuba uphuhliso lweTelegram luqale. Kwaye kumthombo ovulekileyo ikhowudi yomthombo wokuphunyezwa kokuqala ungafumana ezininzi iintonga ezihlekisayo. Kwaye ulwimi ngokwalo lwaphunyezwa apho ngokupheleleyo ngakumbi kunokuba lunjalo ngoku kwiTelegram. Umzekelo, i-hashes ayisetyenziswanga kwaphela kwiskim (ithetha i-pseudotype eyakhelwe-ngaphakathi (njenge-vector) enokuziphatha okutenxileyo). Okanye

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

kodwa makhe siqwalasele, ngenxa yokugqibelela, ukulandelela, ngokuthetha, ukuvela kweNgcaciso yeNgcinga.

#define ZHUKOV_BYTES_HACK

#ifdef ZHUKOV_BYTES_HACK

/* dirty hack for Zhukov request */

Okanye le intle:

    static const char *reserved_words_polymorhic[] = {

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

      };

Esi siqwenga simalunga neetemplates ezifana:

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

Le yinkcazo yohlobo lwetemplate ye-hashmap njengevektha ye-int - Uhlobo lwezibini. Kwi-C ++ iya kujongeka ngolu hlobo:

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

ke, alpha -igama elingundoqo! Kodwa kuphela kwi-C ++ ungabhala i-T, kodwa kufuneka ubhale i-alpha, i-beta ... Kodwa akukho ngaphezu kwee-parameters ezi-8, yilapho i-fantasy iphela khona. Kubonakala ngathi ngaxa lithile eSt. Petersburg kwabakho iingxoxo ezifana nezi:

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

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

Kodwa oku kwakumalunga nokuphunyezwa kokuqala kokupapashwa kwe-TL "ngokubanzi". Masiqhubele phambili ekuqwalaseleni ukuphunyezwa kubathengi beTelegram ngokwabo.

Ilizwi kuVasily:

UVasily, [09.10.18 17:07] Uninzi lwazo zonke, i-esile ishushu ngenxa yokuba benza iqela lezinto ezithathayo, kwaye emva koko babethelela ibholithi kubo, kwaye bagquma ikhowudi yejenereyitha ngeentonga.
Ngenxa yoko, okokuqala kwidokhi pilot.jpg
Emva koko ukusuka kwikhowudi dzhekichan.webp

Ewe, kubantu abaqhelene ne-algorithms kunye nemathematika, sinokulindela ukuba bafundile u-Aho, u-Ullmann, kwaye baqhelene nezixhobo eziye zaba ngumgangatho we-de facto kushishino kumashumi eminyaka yokubhala abahlanganisi babo be-DSL, akunjalo?.

Ngu telegram-cli ngu Vitaly Valtman, njengoko kunokuqondwa ukusuka kwifomathi ye-TLO ngaphandle kwemida yayo (cli), ilungu leqela - ngoku ithala leencwadi le-TL parsing linikezelwe. ngokwahlukeneyo, ithini imvakalelo yakhe TL umhlaseli? ..

16.12 04:18 Vasily: Ndicinga ukuba kukho umntu ongayifumaniyo i-lex+yacc
16.12 04:18 Vasily: Andikwazi ukuyichaza ngenye indlela
16.12 04:18 Vasily: kulungile, okanye bahlawulwe inani lemigca kwiVK
16.12 04:19 Vasily: 3k + imigca njl.<censored> endaweni yomcazululi

Mhlawumbi ngaphandle? Makhe sibone ukuba njani yenza Lo nguMxumi OWUSELWENI- iTelegram yeDesktop:

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

Imigca eyi-1100+ kwiPython, isibini samazwi aqhelekileyo + iimeko ezikhethekileyo ezifana ne-vector, ethi, ngokuqinisekileyo, ibhengezwe kwiskimu njengoko kufanele kube ngokwe-TL syntax, kodwa baxhomekeke kule syntax ukuyichaza ... Umbuzo ngulo, kwakutheni ukuze yonke le nto ibe ngummangaliso?иYakhiwe ngakumbi ukuba akukho mntu uza kuyicalula ngokwamaxwebhu kunjalo?!

Ngendlela... Khumbula ukuba sithethe ngokujonga i-CRC32? Ke, kwiTelegram Desktop khowudi generator kukho uluhlu lwezinto ezingaphandle kwezo ntlobo apho iCRC32 ibalwe khona. ayihambelani naleyo ibonisiwe kumzobo!

Vasily, [18.12/22 49:XNUMX] kwaye apha ndingacinga malunga nokuba iTL iyadingeka.
ukuba bendifuna ukungcolisa ngenye indlela yophumezo, bendizakuqala ukufaka ikhefu lomgca, isiqingatha sabacazululi siyakwaphuka kwiingcaciso zemigca emininzi.
tdesktop, nangona kunjalo, nayo

Khumbula inqaku malunga ne-line-line, siya kubuyela kuyo emva koko.

Kulungile, itelegram-cli ayikho semthethweni, iTelegram Desktop isemthethweni, kodwa kuthekani ngezinye? Ngubani owaziyo?. icandelwana lingezantsi.

Yeyiphi eminye imibuzo ephakanyiswa kulandelelwano ngokusebenza? Umzekelo, benze izinto ezininzi, ewe, ngamasimi amancinci kunye nemimandla enemiqathango:

UVasily: flags.0? true
kuthetha ukuba ibala likhona kwaye lilingana nenyani ukuba iflegi isetiwe

UVasily: flags.1? int
kuthetha ukuba intsimi ikhona kwaye ifuna ukuchithwa

UVasily: Esile, ungakhathazeki malunga nento oyenzayo!
UVasily: Kukho ukukhankanywa kwindawo ethile kwidoc ukuba yinyani luhlobo olungenanto-ubude, kodwa akunakwenzeka ukudibanisa nantoni na evela kugqirha wabo.
UVasily: Kumthombo ovulekileyo wophumezo oku akunjalo, kodwa kukho iqela leentonga kunye nenkxaso.

Kuthekani ngeTelethon? Ukukhangela phambili kwisihloko seMTProto, umzekelo - kumaxwebhu kukho iziqwenga ezinjalo, kodwa uphawu % ichazwa kuphela ngokuthi "ihambelana nohlobo olunikiweyo olungenanto", i.e. kule mizekelo ingezantsi kukho impazamo okanye into engabhalwanga:

Vasily, [22.06.18 18:38] Kwindawo enye:

msg_container#73f1f8dc messages:vector message = MessageContainer;

Ngokwahlukileyo:

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

Kwaye oku kubini umahluko omkhulu, kubomi bokwenyani uhlobo oluthile lwevector ehamba ze luza

Khange ndiyibone inkcazo yevector engenanto kwaye andidibananga nayo

Uhlalutyo lubhalwa ngesandla kwi-telethon

Kumzobo wakhe inkcazo ihlonyelwe msg_container

Kwakhona, umbuzo uhlala malunga ne-%. Ayichazwa.

Vadim Goncharov, [22.06.18 19:22] kunye ne-tdesktop?

Vasily, [22.06.18 19:23] Kodwa i-TL yabo ye-parser kwiinjini eziqhelekileyo aziyi kukutya oku.

// parsed manually

I-TL yinto entle yokukhupha, akukho mntu uyiphumezayo ngokupheleleyo

Kwaye i-% ayikho kuguqulelo lwabo lwesikimu

Kodwa apha amaxwebhu ayaziphikisa, ngoko ke idk

Ifunyenwe kwigrama, babenokulibala nje ukuchaza iisemantics

Ubonile uxwebhu kwi-TL, awukwazi ukuyifumana ngaphandle kwesiqingatha selitha

“Ke, masithi,” omnye umfundi uya kuthi, “uyayigxeka into, ke ndibonise ukuba makwenziwe njani.”

UVasily uphendula athi: “Ngokubhekisele kumfundi, ndithanda izinto ezinjalo

    args: /* empty */ { $$ = NULL; }
        | args arg { $$ = g_list_append( $1, $2 ); }
        ;

    arg: LC_ID ':' type-term { $$ = tl_arg_new( $1, $3 ); }
            | LC_ID ':' condition '?' type-term { $$ = tl_arg_new_cond( $1, $5, $3 ); free($3); }
            | UC_ID ':' type-term { $$ = tl_arg_new( $1, $3 ); }
            | type-term { $$ = tl_arg_new( "", $1 ); }
            | '[' LC_ID ']' { $$ = tl_arg_new_mult( "", tl_type_new( $2, TYPE_MOD_NONE ) ); }
            ;

ngandlel' ithile ndiyithanda ngcono kune

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

okanye

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

nantsi iLexer KUPHELA:

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

abo. kulula ukuyibeka ngobulali.”

Ngokubanzi, ngenxa yoko, i-Parser kunye ne-code generator ye-subset esetyenzisiweyo ye-TL ingena malunga nemigca ye-100 yegrama kunye nemigca ye-300 yejenereyitha (ukubala konke. print's ikhowudi evelisiweyo), kuquka uhlobo lwebhani zolwazi lokujongwa kwiklasi nganye. Uhlobo ngalunye lwe-polymorphic lujika lube yiklasi yesiseko engenanto, kwaye abakhi bazuze ilifa kulo kwaye baneendlela zokulandelelana kunye ne-deserialization.

Ukunqongophala kweentlobo kwiintlobo zolwimi

Ukuchwetheza okuqinileyo yinto elungileyo, akunjalo? Hayi, oku akuyo holivar (nangona ndikhetha iilwimi eziguquguqukayo), kodwa iposi ngaphakathi kwesakhelo seTL. Ngokusekelwe kuyo, ulwimi kufuneka lusinike zonke iintlobo zokuhlola. Ewe, kulungile, mhlawumbi kungekhona yena ngokwakhe, kodwa ukuphunyezwa, kodwa kufuneka ubuncinane abachaze. Kwaye luhlobo luni lwamathuba esiwafunayo?

Okokuqala, imiqobo. Apha sibona kumaxwebhu okufaka iifayile:

Umxholo wokubini wefayile uye wahlulwa ube ngamacandelo. Onke amalungu kufuneka abe nobukhulu obufanayo ( inxalenye_yesayizi ) kwaye le miqathango ilandelayo kufuneka ifezekiswe:

  • part_size % 1024 = 0 (yahlulahlulwe nge-1KB)
  • 524288 % part_size = 0 (512 KB kufuneka yahlulwe ngokulinganayo ngenxenye_yesayizi)

Inxalenye yokugqibela ayifuni ukwanelisa le miqathango, ngaphandle kokuba ubungakanani bayo bungaphantsi kwe-part_size.

Ilungu ngalinye kufuneka libe nenombolo yolandelelwano, ifayile_inxalenye, ngexabiso ukusuka kwi-0 ukuya kwi-2,999.

Emva kokuba ifayile yahluliwe kufuneka ukhethe indlela yokuyigcina kumncedisi. Sebenzisa upload.saveBigFilePart kwimeko apho ubungakanani obupheleleyo befayile bungaphezulu kwe-10 MB kwaye upload.saveFilePart kwiifayile ezincinci.
[…] enye yezi mpazamo zilandelayo zokufakwa kwedatha inokubuyiselwa:

  • FILE_PARTS_INVALID — Inani elingasebenziyo lamalungu. Ixabiso alikho phakathi 1..3000

Ngaba nayiphi na kwezi kumzobo? Ngaba oku kubonakaliswa ngandlela ithile usebenzisa iTL? Hayi. Kodwa ndixolele, noTatomkhulu uTurbo Pascal wakwazi ukuchaza ezi ntlobo zichaziweyo uluhlu. Kwaye wayesazi enye into, ngoku eyaziwa ngokuba enum - uhlobo oluquka ubalo lwenani eliqingqiweyo (elincinci) lamaxabiso. Kwiilwimi ezinje ngo-C - amanani, qaphela ukuba ukuza kuthi ga ngoku sithethe kuphela ngeentlobo amanani. Kodwa kukho kwakhona ii-arrays, iintambo ... umzekelo, kuya kuba kuhle ukuchaza ukuba le ntambo ingaba nenombolo yefowuni kuphela, akunjalo?

Akukho nanye kwezi kwi-TL. Kodwa kukho, umzekelo, kwi-JSON Schema. Kwaye ukuba omnye umntu unokuxoxa malunga nokwahlulwa kwe-512 KB, ukuba oku kusafuneka kukhangelwe kwikhowudi, ke qiniseka ukuba umxhasi ngokulula. asi thumela inani ngaphandle koluhlu 1..3000 (kwaye impazamo ehambelanayo ayinakuvela) ibinokwenzeka, akunjalo?..

Ngendlela, malunga neempazamo kunye namaxabiso okubuyisela. Kwanabo basebenze neTL bawafiphalisa amehlo-ayikhange ikhawuleze ifike kuthi loo nto nganye umsebenzi kwi TL awunakubuyisela hayi kuphela uhlobo oluchaziweyo lokubuyisela, kodwa nemposiso. Kodwa oku akunakuchazwa nangayiphi na indlela usebenzisa iTL ngokwayo. Ewe, sele icacile kwaye akukho mfuneko yayo nayiphi na into eyenziwayo (nangona, i-RPC inokwenziwa ngeendlela ezahlukeneyo, siya kubuyela kule nto kamva) - kodwa kuthekani ngoBunyulu beengcamango zeMathematika yeeNdidi ezingabonakaliyo. ukusuka kwihlabathi lasezulwini? .. Ndithathe i-tug - ngoko ke yidibanise.

Kwaye ekugqibeleni, kuthekani ngokufundeka? Ewe, apho, ngokubanzi, ndingathanda Inkcazo unayo kwi-schema (kwi-schema ye-JSON, kwakhona, kunjalo), kodwa ukuba sele unengxaki nayo, kuthekani ngecala elisebenzayo-ubuncinci ujonge ukwahluka ngexesha lohlaziyo? Zibonele ku imizekelo yokwenyani:

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

okanye

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

Kuxhomekeke kuwo wonke umntu, kodwa i-GitHub, umzekelo, iyala ukugqamisa utshintsho ngaphakathi kwemigca emide. Umdlalo "fumana iiyantlukwano ezili-10", kwaye oko ingqondo ibona ngokukhawuleza kukuba ukuqala kunye nokuphela kwimizekelo yomibini iyafana, kufuneka ufunde ngokukrakra kwindawo ethile phakathi ... Ngokombono wam, oku akukhona nje kwithiyori, kodwa ngokubonakalayo umdaka kwaye ulihule.

Ngendlela, malunga nokucoceka kwethiyori. Kutheni sifuna amabala amancinci? Ngaba akubonakali ngathi bona ivumba embi ngokwembono yohlobo ithiyori? Ingcaciso inokubonwa kwiinguqulelo zangaphambili zomzobo. Ekuqaleni, ewe, kwakunjalo, kuyo yonke into ethimla kwadalwa uhlobo olutsha. Ezi ziseko zisekhona kolu hlobo, umzekelo:

storage.fileUnknown#aa963b05 = storage.FileType;
storage.filePartial#40bc6f52 = storage.FileType;
storage.fileJpeg#7efe0e = storage.FileType;
storage.fileGif#cae1aadf = storage.FileType;
storage.filePng#a4f63c0 = storage.FileType;
storage.filePdf#ae1e508d = storage.FileType;
storage.fileMp3#528a0677 = storage.FileType;
storage.fileMov#4b09ebbc = storage.FileType;
storage.fileMp4#b3cea0e4 = storage.FileType;
storage.fileWebp#1081464c = storage.FileType;

Kodwa ngoku khawufane ucinge, ukuba uneendawo ezi-5 ozikhethelayo kwisakhiwo sakho, uya kufuna iindidi ezingama-32 kuzo zonke iinketho ezinokwenzeka. Ugqabhuko-dubulo oludibeneyo. Ke, ukucoceka kwekristale yethiyori ye-TL kwakhona kwaqhekeka ngokuchasene ne-esile yentsimbi yobunyani oburhabaxa bokwenza uthotho.

Ukongeza, kwezinye iindawo aba bafana ngokwabo baphula i-typology yabo. Ngokomzekelo, kwi-MTProto (isahluko esilandelayo) impendulo inokunyanzeliswa yi-Gzip, yonke into ilungile - ngaphandle kokuba iileyile kunye neesekethe ziphulwa. Kwakhona, yayingeyiyo iRpcResult ngokwayo eyavunwa, kodwa imixholo yayo. Kulungile, kutheni le nto?

Okanye omnye umzekelo, sakha safumanisa impazamo - ithunyelwe InputPeerUser вместо InputUser. Okanye ngokuchaseneyo. Kodwa yasebenza! Oko kukuthi, umncedisi akazange akhathalele uhlobo. Inokwenzeka njani le nto? Impendulo inokunikwa kuthi ngamaqhekeza ekhowudi asuka kwitelegram-cli:

  if (tgl_get_peer_type (E->id) != TGL_PEER_CHANNEL || (C && (C->flags & TGLCHF_MEGAGROUP))) {
    out_int (CODE_messages_get_history);
    out_peer_id (TLS, E->id);
  } else {    
    out_int (CODE_channels_get_important_history);

    out_int (CODE_input_channel);
    out_int (tgl_get_peer_id (E->id));
    out_long (E->id.access_hash);
  }
  out_int (E->max_id);
  out_int (E->offset);
  out_int (E->limit);
  out_int (0);
  out_int (0);

Ngamanye amazwi, kulapho ulandelelwano lwenziwa khona NGEMANDLA, ayiveliswanga ikhowudi! Mhlawumbi umncedisi uphunyezwa ngendlela efanayo? .. Ngokomgaqo, oku kuya kusebenza ukuba kwenziwa kanye, kodwa inokuxhaswa njani kamva ngexesha lohlaziyo? Ngaba kungenxa yoko le nto kwayilwa eli cebo? Kwaye apha siqhubela phambili kumbuzo olandelayo.

Uguqulelo. Iileya

Kutheni iinguqulelo zesikimu zibizwa ngokuba ziileya zinokuqikelelwa kuphela ngokusekwe kwimbali yeschematics epapashiweyo. Kuyabonakala ukuba, ekuqaleni ababhali babecinga ukuba izinto ezisisiseko zinokwenziwa kusetyenziswa inkqubo engatshintshwanga, kwaye kuphela apho kuyimfuneko, kwizicelo ezithile, kubonisa ukuba zenziwe kusetyenziswa inguqulelo eyahlukileyo. Ngokomgaqo, kwanombono olungileyo - kwaye entsha iya kuba, njengokuba, "ixutywe", ibekwe phezu kwendala. Kodwa makhe sibone ukuba yenziwa njani. Enyanisweni, andizange ndikwazi ukuyijonga kwasekuqaleni - iyahlekisa, kodwa umzobo womgangatho wesiseko awukho. Iileya ziqalwe ngo-2. Amaxwebhu asixelela malunga nophawu olukhethekileyo lweTL:

Ukuba umxhasi uyaluxhasa uLeya 2, lo makhi ulandelayo kufuneka asetyenziswe:

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

Ngokwesiqhelo, oku kuthetha ukuba phambi kwefowuni nganye ye-API, int enexabiso 0x289dd1f6 kufuneka yongezwe phambi kwenombolo yendlela.

Ivakala njengesiqhelo. Kodwa kwenzeka ntoni emva koko? Emva koko kwavela

invokeWithLayer3#b7475268 query:!X = X;

Ngoko ke yintoni elandelayo? Njengoko unokucinga,

invokeWithLayer4#dea0d430 query:!X = X;

Kuyahlekisa? Hayi, kusesekuseni kakhulu ukuba uhleke, cinga ngale nto nganye isicelo esisuka kolunye umaleko kufuneka sisongelwe kuhlobo olukhethekileyo - ukuba zonke zahlukile kuwe, ungayihlula njani enye into? Kwaye ukudibanisa ii-bytes ezi-4 ngaphambili yindlela esebenzayo. Ngoko,

invokeWithLayer5#417a57ae query:!X = X;

Kodwa kuyacaca ukuba emva kwexesha oku kuya kuba luhlobo oluthile lwe-bacchanalia. Kwaye kwafika isisombululo:

Uhlaziyo: Ukuqala ngeNqanaba lesi-9, iindlela zomncedisi invokeWithLayerN inokusetyenziswa kuphela kunye initConnection

Uxolo! Emva kweenguqulelo ezili-9, ekugqibeleni safika kwinto eyenziwa kwiiprothokholi ze-Intanethi emva kweminyaka engama-80 - ukuvumelana ngoguqulelo kanye ekuqaleni koqhagamshelo!

Khona yintoni elandelayo?..

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

Kodwa ngoku usenako ukuhleka. Kuphela emva kolunye uluhlu lwe-9, umakhi wendalo yonke kunye nenombolo yenguqulo ekugqibeleni yongezwa, efuna ukubizwa kanye kuphela ekuqaleni koqhagamshelo, kwaye intsingiselo yomaleko yabonakala ngathi ilahlekile, ngoku yinguqulelo enemiqathango, njenge. kwenye indawo. Ingxaki isonjululwe.

Kanye?..

Vasily, [16.07.18 14:01] KwangoLwesihlanu ndiye ndacinga:
I-teleserver ithumela imicimbi ngaphandle kwesicelo. Izicelo kufuneka zisongelwe kwi-InvokeWithLayer. Umncedisi akasongi uhlaziyo; akukho sakhiwo sokusonga iimpendulo kunye nohlaziyo.

Ezo. umxhasi akanakukhankanya umaleko afuna kuwo uhlaziyo

UVadim Goncharov, [16.07.18 14:02] ngaba i-InvokeWithLayer ayiyonto ingundoqo?

Vasily, [16.07.18 14:02] Le kuphela kwendlela

Vadim Goncharov, [16.07.18 14:02] eyona nto imele ithethe ukuvumelana kuluhlu ekuqaleni kweseshoni.

Ngendlela, kulandela ukuba ukuhla komxhasi akubonelelwanga

Uhlaziyo, okt. uhlobo Updates kudweliso, yile nto umncedisi ayithumelayo kumxhasi hayi kwimpendulo yesicelo se-API, kodwa ngokuzimeleyo xa isiganeko sisenzeka. Esi sihloko esinzima esiza kuxutyushwa kwesinye isithuba, kodwa ngoku kubalulekile ukwazi ukuba umncedisi ugcina uHlaziyo nangona umxhasi engaxhunyiwe kwi-intanethi.

Ngaloo ndlela, ukuba uyala ukusonga wonke umntu iphakheji ukubonisa inguqulelo yayo, oku kukhokelela ngokusengqiqweni kwezi ngxaki zilandelayo:

  • umncedisi uthumela uhlaziyo kumxhasi naphambi kokuba umxhasi azisile ukuba loluphi na uguqulelo aluxhasayo
  • kufuneka ndenze ntoni emva kokuphucula umxhasi?
  • ngubani iqinisekisaukuba uluvo lomncedisi malunga nenani lomaleko aluyi kutshintsha ngexesha lenkqubo?

Ngaba ucinga ukuba oku kuqikelelo lwethiyori, kwaye ekusebenzeni oku akunakwenzeka, kuba umncedisi ubhalwe ngokuchanekileyo (ubuncinci, uvavanywa kakuhle)? Hayi! Nokuba kunjani na!

Yile nto kanye esadibana nayo ngo-Agasti. Ngomhla we-14 ka-Agasti, kwakukho imiyalezo yokuba into ethile ihlaziywa kwiiseva zeTelegram ... kwaye emva koko kwiilogi:

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.

kunye neemegabytes ezininzi zokulandelela istaki (kakuhle, kwangaxeshanye ukugawulwa kwemithi kwalungiswa). Emva kwayo yonke loo nto, ukuba kukho into engaziwa kwi-TL yakho, kubini ngokusayinwa, ngakumbi ezantsi emgceni ZONKE iya, ukwenza iikhowudi kuya kuba yinto engenakwenzeka. Ufanele wenze ntoni kwimeko enjalo?

Ewe, into yokuqala ethi qatha engqondweni yakhe nabani na kukuqhawula uqhagamshelwano kwaye uzame kwakhona. Ayizange incede. Thina google CRC32 - ezi zijike zibe zizinto ezivela kwi-scheme 73, nangona sisebenze kwi-82. Sijonga ngokucophelela kwiilogi - kukho izichasi ezivela kwiiskimu ezimbini ezahlukeneyo!

Mhlawumbi ingxaki ikumthengi wethu ongekho semthethweni? Hayi, sisungula iTelegram yeDesktop 1.2.17 (uguqulelo olubonelelwe ngenani losasazo lweLinux), ibhala kwilog yangaphandle: MTP Uhlobo olungalindelekanga id #b5223b0f ifundwe kwiMTPMessageMedia…

Ukugxekwa kweprotocol kunye neendlela zombutho zeTelegram. Icandelo 1, ubuchwephesha: amava ngokubhala umxhasi ukusuka ekuqaleni - TL, MT

UGoogle ubonise ukuba ingxaki efanayo sele yenzekile komnye wabaxumi abangekho semthethweni, kodwa ke iinombolo zenguqulelo kwaye, ngokufanelekileyo, iingcamango zazahlukile...

Ngoko ke kufuneka senze ntoni? Mna noVasily sahlukana: wazama ukuhlaziya isiphaluka ukuya kwi-91, ndagqiba ekubeni ndilinde iintsuku ezimbalwa kwaye ndizame kwi-73. Zombini iindlela zasebenza, kodwa ekubeni zinobungqina, akukho ukuqonda ukuba zingaphi iinguqulelo ezifunekayo okanye phantsi. ukutsiba, okanye kufuneka ulinde ixesha elingakanani .

Kamva ndakwazi ukuvelisa kwakhona imeko: siqalisa umxhasi, sicime, siphinde sihlanganise isiphaluka kolunye umaleko, siqalise kwakhona, sibambe ingxaki kwakhona, sibuyele kwindawo yangaphambili - oops, akukho xabiso lokutshintsha kwesekethe kunye nomxhasi uqala kwakhona imizuzu embalwa iya kunceda. Uya kufumana umxube wezakhiwo zedatha ukusuka kwiileya ezahlukeneyo.

Ingcaciso? Njengoko unokuthekelela kwiimpawu ezahlukeneyo ezingathanga ngqo, iseva iqulathe iinkqubo ezininzi zeentlobo ezahlukeneyo koomatshini abahlukeneyo. Ngokunokwenzeka, umncedisi ojongene "ne-buffering" wabeka emgceni oko abaphathi bawo bakunike kona, kwaye banikezela kwisikimu esasikhona ngexesha lesizukulwana. Kwaye de lo mgca "ubolile", akukho nto inokwenziwa ngayo.

Mhlawumbi ... kodwa le nto yinto eyoyikisayo?! .. Hayi, ngaphambi kokucinga ngeengcamango eziphambeneyo, makhe sijonge ikhowudi yabathengi abasemthethweni. Kwinguqulo ye-Android asifumani nayiphi na i-parser ye-TL, kodwa sifumana ifayile enzima (i-GitHub iyala ukuyichukumisa) kunye (de) serialization. Nazi iziqwengana zekhowudi:

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;

okanye

    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... ikhangeleka imbi. Kodwa, mhlawumbi, oku kuveliswa ikhowudi, ngoko kulungile? .. Kodwa ngokuqinisekileyo ixhasa zonke iinguqulelo! Enyanisweni, akucaci ukuba kutheni yonke into ixutywe kunye, iingxoxo eziyimfihlo kunye nazo zonke iintlobo _old7 ngandlela-thile ayibonakali ngathi isizukulwana somatshini ... Nangona kunjalo, uninzi lwazo zonke ndabethwa ngumoya

TL_message_layer104
TL_message_layer104_2
TL_message_layer104_3

Madoda, awunakugqiba nokuba yintoni na ngaphakathi kwinqanaba elinye?! Ewe, kulungile, masithi "ezimbini" zakhululwa ngempazamo, kunjalo, kwenzeka, kodwa AMATHATHU? .. Ngoko nangoko, iraki efanayo kwakhona? Iphonografi yantoni le, uxolo?..

Kwikhowudi yomthombo weTelegram yeDesktop, ngendlela efanayo, kwenzeka into efanayo - ukuba kunjalo, abaninzi benza ngokulandelelana kwiskimu ayitshintshi inombolo yayo yomaleko, kodwa lungisa into ethile. Kwiimeko apho kungekho mthombo osemthethweni wedatha yesikimu, ingafumaneka phi, ngaphandle kwekhowudi yomthombo womthengi osemthethweni? Kwaye ukuba uyithatha apho, awukwazi ukuqiniseka ukuba iskimu sichanekile ngokupheleleyo de uvavanye zonke iindlela.

Kunokuvavanywa njani oku? Ndiyathemba ukuba abalandeli beyunithi, ukusebenza kunye nezinye iimvavanyo ziya kubelana ngamagqabantshintshi.

Kulungile, makhe sijonge esinye isiqwenga sekhowudi:

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;

La mazwana "enziwe ngesandla" acebisa ukuba kuphela inxalenye yale fayile yabhalwa ngesandla (ungayicinga yonke i-nightmare yokugcina?), Kwaye enye yenziwa ngomatshini. Nangona kunjalo, omnye umbuzo uvela - ukuba imithombo iyafumaneka hayi ngokupheleleyo (i-la GPL blobs kwi-Linux kernel), kodwa esi sele sisihloko secandelo lesibini.

Kodwa ngokwaneleyo. Masiqhubele phambili kwiprothokholi engaphezulu kwayo yonke le nkqubo yolandelelwano iqhuba.

Iproto yeMT

Ngoko, masivule inkcazelo ngokubanzi и inkcazo eneenkcukacha yeprotocol kwaye into yokuqala esiyikhubekayo sisigama. Kwaye ngentabalala yayo yonke into. Ngokubanzi, oku kubonakala ngathi yinto yobunikazi beTelegram - ukubiza izinto ngokwahlukileyo kwiindawo ezahlukeneyo, okanye izinto ezahlukeneyo ngegama elinye, okanye ngokuchaseneyo (umzekelo, kwi-API ephezulu, ukuba ubona ipakethi yesincamathelisi, akunjalo. oko ubucinga).

Umzekelo, "umyalezo" kunye "neseshini" ithetha into eyahlukileyo apha kunojongano lomxumi weTelegram. Ewe, yonke into icacile ngomyalezo, unokutolikwa ngokwemigaqo ye-OOP, okanye ubizwe nje ngokuba igama elithi "ipakethi" - eli linqanaba eliphantsi, lezothutho, akukho miyalezo efana neyokujongano, mininzi imiyalezo yenkonzo. . Kodwa iseshoni ... kodwa izinto zokuqala kuqala.

Umaleko wezothutho

Into yokuqala luthutho. Baza kusixelela malunga neenketho ezi-5:

  • TCP
  • Websocket
  • Websocket ngaphezulu kweHTTPS
  • HTTP
  • HTTPS

Vasily, [15.06.18 15:04] Kukho kwakhona i-UDP yothutho, kodwa ayibhalwanga

Kwaye i-TCP kwiintlobo ezintathu

Eyokuqala ifana ne-UDP phezu kwe-TCP, ipakethe nganye iquka inombolo yokulandelelana kunye ne-crc
Kutheni kubuhlungu kangaka ukufunda amaxwebhu enqwelweni?

Ewe, nantso ngoku I-TCP sele ikwiintlobo ezi-4:

  • Igqityiwe
  • Phakathi
  • Ifakwe phakathi
  • Pheleleyo

Ewe, kulungile, iPadded intermediate yeMTProxy, oku kongezwa kamva ngenxa yeziganeko ezaziwa kakhulu. Kodwa kutheni ezinye iinguqulelo ezimbini (ezintathu zizonke) xa unokudlula ngenye? Zone zihluke kuphela kwindlela yokuseta ubude kunye nomthwalo we-MTProto engundoqo, eya kuxoxwa ngayo ngakumbi:

  • kwi-Abridged yi-1 okanye 4 bytes, kodwa hayi 0xef, ngoko umzimba
  • kwi-Intermediate le yi-4 bytes yobude kunye nentsimi, kwaye okokuqala umxhasi kufuneka athumele 0xeeeeeeee ukubonisa ukuba siPhakathi
  • Ngokugcweleyo olona mlutha, ukusuka kwindawo yokujonga umnatha womnatha: ubude, inombolo yolandelelwano, kwaye AYI YIYO eyona MTPto, umzimba, CRC32. Ewe, konke oku kuphezu kwe-TCP. Esibonelela ngezothutho ezithembekileyo ngendlela yolandelelwano lwebhayithi yomsinga; Kulungile, ngoku umntu uya kundichasa ukuba i-TCP ine-16-bit checksum, ngoko ukonakala kwedatha kwenzeka. Mkhulu, kodwa eneneni sine-cryptographic protocol ene-hashes emide kune-16 bytes, zonke ezi mpazamo - kwaye nangaphezulu - ziya kubanjwa yi-SHA engafanelekanga kwinqanaba eliphezulu. AKUKHO ndawo kwi-CRC32 ngaphezulu koku.

Masithelekise i-Abridged, apho i-byte yobude inokwenzeka khona, kunye ne-Intermediate, ethethelela "Xa kufuneka ulungelelwaniso lwedatha ye-4-byte," obubuvuvu. Yintoni, kukholelwa ukuba abadwelisi beenkqubo zeTelegram abanakukwazi ukufunda idatha ukusuka kwisokhethi ukuya kwi-buffer ehambelanayo? Kusafuneka wenze oku, kuba ukufunda kunokukubuyisela naliphi na inani leebhayithi (kwaye kukho nabancedisi bommeli, umzekelo...). Okanye kwelinye icala, kutheni ibhlokhi i-Abridged ukuba sisenayo i-padding enzima ngaphezulu kwee-bytes ezili-16-gcina ii-bytes ezi-3 ngamanye amaxesha ?

Omnye ufumana ingcamango yokuba u-Nikolai Durov uthanda ngokwenene ukubuyisela amavili, kuquka iiprothokholi zenethiwekhi, ngaphandle kwesidingo sokwenyani.

Olunye ukhetho lwezothutho, luquka. Iwebhu kunye neMTroxy, asiyi kuqwalasela ngoku, mhlawumbi kwelinye iposi, ukuba kukho isicelo. Ngokumalunga nale MTProxy efanayo, masikhumbule kuphela ngoku ukuba kungekudala emva kokukhululwa kwayo kwi-2018, ababoneleli bafunde ngokukhawuleza ukuyivimba, ekujoliswe kuyo. ukubhloka kokudlulangu ubungakanani bephakheji! Kwaye nenyaniso yokuba iseva yeMTProxy ebhaliweyo (kwakhona nguWaltman) kwiC yayibotshelelwe ngokugqithisileyo kwiinkcukacha zeLinux, nangona oku kwakungafuneki konke konke (uPhil Kulin uyakuqinisekisa), kwaye iseva efanayo nokuba yiGo okanye kwiNode.js. ingena kwimigca engaphantsi kwekhulu.

Kodwa siya kwenza izigqibo malunga nobuchule bobugcisa bala bantu ekupheleni kwecandelo, emva kokuqwalasela eminye imiba. Okwangoku, masiqhubele phambili kwi-OSI umaleko wesi-5, iseshoni - apho babeke khona iseshoni yeMTProto.

Izitshixo, imiyalezo, iiseshini, Diffie-Hellman

Bayibeka apho hayi ngokuchanekileyo ngokupheleleyo... Iseshoni ayiyoseshoni enye ebonakalayo kujongano phantsi kweeseshoni ezisebenzayo. Kodwa ukuze.

Ukugxekwa kweprotocol kunye neendlela zombutho zeTelegram. Icandelo 1, ubuchwephesha: amava ngokubhala umxhasi ukusuka ekuqaleni - TL, MT

Ngoko sifumene umtya we-byte wobude obaziwayo ukusuka kuluhlu lwezothutho. Oku mhlawumbi ngumyalezo ofihliweyo okanye umbhalo ocacileyo - ukuba sisekwinqanaba lesivumelwano esingundoqo kwaye siyayenza ngokwenene. Leliphi iqela leengqiqo ezibizwa ngokuba “sisitshixo” esithetha ngazo? Masiwucacise lo mbandela kwiqela leTelegram ngokwalo (ndiyaxolisa ngokuguqulela amaxwebhu am ukusuka kwisiNgesi ngengqondo ediniweyo ngo-4 am, bekulula ukushiya amabinzana njengoko enjalo):

Kukho amaziko amabini abizwayo iseshoni - enye kwi-UI yabathengi abasemthethweni phantsi "kweeseshoni zangoku", apho iseshoni nganye ihambelana nesixhobo esipheleleyo / i-OS.
Isibini - iseshoni yeMTProto, enenombolo yolandelelwano lomyalezo (kwinqanaba elisezantsi) kuyo, kwaye yeyiphi inokuhlala phakathi kodibaniso olwahlukileyo lwe-TCP. Iiseshoni ezininzi zeMTProto zinokufakwa ngexesha elinye, umzekelo, ukukhawulezisa ukukhuphela iifayile.

Phakathi kwezi zimbini iiseshoni kukho ingcamango ugunyaziso. Kwimeko ewohlokayo, sinokuthi Iseshoni ye-UI iyafana ne ugunyaziso, kodwa yeha, yonke into inzima. Masijonge:

  • Umsebenzisi okwisixhobo esitsha uvelisa kuqala auth_key kwaye uyibophelele kwiakhawunti, umzekelo ngeSMS - yiyo loo nto ugunyaziso
  • Kwenzeke ngaphakathi kweyokuqala iseshoni yeMTProto, onayo session_id ngaphakathi kuwe.
  • Kweli nyathelo, indibaniselwano ugunyaziso и session_id ingabizwa igunya - eli gama livela kumaxwebhu kunye nekhowudi yabanye abathengi
  • Emva koko, umxhasi unokuvula eziliqela Iiseshoni zeMTProto phantsi okufanayo auth_key - kwi-DC efanayo.
  • Emva koko, ngenye imini umxhasi uya kufuna ukucela ifayile kuyo enye DC - kwaye kule DC kuya kuveliswa entsha auth_key !
  • Ukwazisa inkqubo ukuba ayingomsebenzisi omtsha obhalisayo, kodwa iyafana ugunyaziso (Iseshoni ye-UI), umxhasi usebenzisa iifowuni ze-API auth.exportAuthorization ekhaya DC auth.importAuthorization kwi-DC entsha.
  • Yonke into iyafana, ezininzi zinokuvuleka Iiseshoni zeMTProto (nganye neyakhe session_id) kule DC intsha, phantsi wakhe auth_key.
  • Okokugqibela, umxhasi unokufuna uMfihlo oPhambili Phambili. Yonke auth_key bekunjalo Sigxina isitshixo - nge DC - kwaye umxhasi unokufowuna auth.bindTempAuthKey ukusetyenziswa okwethutyana auth_key - kwaye kwakhona, enye kuphela temp_auth_key nge DC, eqhelekileyo kubo bonke Iiseshoni zeMTProto kule DC.

qaphela, ukuba ityuwa (kunye neetyuwa zexesha elizayo) ikwanye auth_key abo. kwabelwana phakathi komntu wonke Iiseshoni zeMTProto kwi-DC enye.

Kuthetha ukuthini "phakathi koqhagamshelwano lweTCP olwahlukileyo"? Ngoko oku kuthetha into efana i-cookie yogunyaziso kwiwebhusayithi - iyaqhubeka (iphila) ezininzi izixhumanisi ze-TCP kwiseva enikeziweyo, kodwa ngolunye usuku luhamba kakubi. Kuphela ngokungafaniyo ne-HTTP, kwimiyalezo yeMTProto ngaphakathi kweseshoni ibalwa ngokulandelelana kwaye iqinisekisiwe ukuba bangene kwitonela, uxhulumaniso lwaphulwa - emva kokuseka uxhulumaniso olutsha, umncedisi uya kuthumela ngobubele yonke into kule seshoni engazange inikezele ngaphambili; TCP uxhumano.

Nangona kunjalo, ulwazi olungentla lushwankathelwa emva kweenyanga ezininzi zophando. Okwangoku, ngaba siphumeza umxhasi wethu ukusuka ekuqaleni? - makhe sibuyele ekuqaleni.

Ngoko ke makhe sivelise auth_key kwi Iinguqulelo zeDiffie-Hellman ezivela kwiTelegram. Makhe sizame ukuqonda amaxwebhu...

Vasily, [19.06.18 20:05] data_with_hash := SHA1(idatha) + idatha + (nayiphi na i-bytes engaqhelekanga); kangangokuba ubude bulingana nama-255 bytes;
encrypted_data := RSA(data_with_hash, server_public_key); inombolo ende ye-255-byte (endian enkulu) iphakanyiswe kumandla afunekayo phezu kwemodyuli efunekayo, kwaye umphumo ugcinwa njengenombolo ye-256-byte.

Bane-dope ethile ye-DH

Ayibukeki njenge-DH yomntu osempilweni
Akukho zitshixo zimbini zoluntu kwi-dx

Ewe, ekugqibeleni oku kwalungiswa, kodwa intsalela yahlala - ubungqina bomsebenzi wenziwa ngumxhasi ukuba wakwazi ukulinganisa inani. Uhlobo lokhuseleko kuhlaselo lweDoS. Kwaye iqhosha leRSA lisetyenziswa kube kanye kwicala elinye, ngokusisiseko kuguqulelo oluntsonkothileyo new_nonce. Kodwa nangona olu tyando lubonakala lulula luya kuphumelela, yintoni oya kujamelana nayo?

Vasily, [20.06.18/00/26 XNUMX:XNUMX] andikafiki kwisicelo se-appid okwangoku.

Ndithumele esi sicelo ku-DH

Kwaye, kwi-dock yezothutho ithi inokuphendula nge-4 bytes yekhowudi yephutha. Kuko konke

Ewe, wandixelela -404, yintoni ke?

Ngoko ndamxelela: "Bamba i-bullshit yakho efihliweyo ngesitshixo seseva esinomnwe ngolu hlobo, ndifuna i-DH," kwaye yaphendula nge-404 yobudenge.

Ucinga ntoni ngale mpendulo yomncedisi? Kwenziwe ntoni? Akukho mntu unokubuza (kodwa ngaphezulu koko kwicandelo lesibini).

Apha yonke inzala iyenziwa kwi-dock

Akukho nto yimbi endinokuyenza, ndiphuphe nje ukuguqula amanani ndibuye naphambili

Amanani amabini angama-32 bit. Ndazipakisha njengabanye

Kodwa hayi, ezi zimbini kufuneka zongezwe kumgca kuqala njenge-BE

Vadim Goncharov, [20.06.18 15:49] kwaye ngenxa yale 404?

Vasily, [20.06.18 15:49] EWE!

UVadim Goncharov, [20.06.18 15:50] ngoko andiyiqondi into anokuthi "ayifumane"

Vasily, [20.06.18 15:50] malunga

Andikwazanga kufumana ukubola okunjalo kwizinto eziphambili%)

Asizange silawule ingxelo yempazamo

Vasily, [20.06.18 20:18] Oh, kukwakho ne-MD5. Sele ezintathu ezahlukeneyo iihashi

Ushicilelo lweminwe olungundoqo lubalwa ngolu hlobo lulandelayo:

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

SHA1 kunye ne-sha2

Ngoko masiyibeke auth_key sifumene amasuntswana angama-2048 ngobukhulu sisebenzisa iDiffie-Hellman. Yintoni elandelayo? Okulandelayo sifumanisa ukuba i-bits ye-1024 ephantsi kwesi sitshixo ayisetyenziswanga nangayiphi na indlela ... kodwa makhe sicinge ngale nto ngoku. Kweli nyathelo, sinemfihlo ekwabelwana ngayo nomncedisi. I-analogue yeseshoni ye-TLS isekiwe, neyinkqubo ebiza kakhulu. Kodwa umncedisi akakazi nto malunga nokuba singobani! Hayi okwangoku, eneneni. ugunyaziso. Ezo. ukuba ubucinga ngokwe “login-password”, njengoko ubukhe wenza kwi-ICQ, okanye ubuncinci “login-key”, njengakwi-SSH (umzekelo, kwenye igitlab/github). Sifumene umntu ongaziwa. Kuthekani ukuba iseva isixelela ukuba "ezi nombolo zefowuni zinikwa inkonzo yenye i-DC"? Okanye "inombolo yakho yefowuni ivaliwe"? Eyona nto sinokuyenza kukugcina isitshixo ngethemba lokuba siya kuba luncedo kwaye asisayi kubola ngelo xesha.

Ngendlela, "siyifumene" ngokugcina indawo. Umzekelo, ngaba siyamthemba umncedisi? Kuthekani ukuba ayiyonyani? Iitshekhi zeCryptographic ziya kufuneka:

Vasily, [21.06.18 17:53] Banikezela ngabathengi beselula ukujonga inombolo ye-2kbit yeprimality%).

Kodwa ayicacanga kwaphela, nafeijoa

Vasily, [21.06.18 18:02] Uxwebhu alutsho ukuba makwenziwe ntoni xa kubonakala ukuba akukho lula.

Akuthethwanga. Makhe sibone ukuba umthengi osemthethweni we-Android wenza ntoni kule meko? A nantso into (kwaye ewe, yonke ifayile inomdla) - njengoko besitsho, ndiza kushiya oku apha:

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

Hayi, kunjalo, isekhona abanye Kukho iimvavanyo zeprimality yenani, kodwa mna ngokwam andisenalo ulwazi olwaneleyo lwemathematika.

Kulungile, sinaso isitshixo esiyintloko. Ukungena, i.e. thumela izicelo, kufuneka wenze ngakumbi ufihlo, usebenzisa i-AES.

Isitshixo somyalezo sichazwa njenge-128 ye-bits ephakathi ye-SHA256 yomzimba womyalezo (kubandakanya iseshoni, i-ID yomyalezo, njl.njl.), kubandakanywa i-padding bytes, elungiselelwe ngama-bytes angama-32 athathwe kwiqhosha logunyaziso.

Vasily, [22.06.18 14:08] I-avareji, bitch, bits

Yamkelwe auth_key. Konke. Ngaphandle kwabo ... akucaci kuxwebhu. Zive ukhululekile ukufunda ikhowudi yomthombo ovulekileyo.

Qaphela ukuba i-MTProto 2.0 ifuna ukusuka kwi-12 ukuya kwi-1024 bytes ye-padding, ixhomekeke kwimeko yokuba ubude bomyalezo ophumayo bunokwahlulwa nge-16 bytes.

Ke kufuneka udibanise ingakanani i-padding?

Kwaye ewe, kukho kwakhona 404 xa kukho impazamo

Ukuba nabani na ufunde ngokucophelela umzobo kunye nesicatshulwa samaxwebhu, baqaphela ukuba akukho MAC apho. Kwaye ukuba i-AES isetyenziswe kwindlela ethile ye-IGE engasetyenziswanga kwenye indawo. Bona, kunjalo, babhala malunga noku kwi-FAQ yabo ... Apha, njenge, isitshixo somyalezo ngokwawo sikwayi-SHA hash yedatha efihliweyo, esetyenziselwa ukujonga ingqibelelo - kwaye kwimeko yokungafani, uxwebhu ngesizathu esithile. icebisa ukuba ungahoyi ngokuthe cwaka (kodwa kuthekani ngokhuseleko, kuthekani ukuba bayasaphula?).

Andingombhali we-cryptographer, mhlawumbi akukho nto iphosakeleyo ngale modi kule meko ngokwembono yethiyori. Kodwa ndiyakwazi ukubiza ngokucacileyo ingxaki esebenzayo, usebenzisa iTelegram yeDesktop njengomzekelo. Ifihla i-cache yendawo (zonke ezi D877F783D5D3EF8C) ngendlela efanayo nemiyalezo kwiMTrototo (kuphela kule meko inguqulo 1.0), i.e. kuqala iqhosha lomyalezo, emva koko idatha ngokwayo (kwaye kwenye indawo ecaleni eyona inkulu auth_key 256 bytes, ngaphandle kwayo msg_key engenamsebenzi). Ngoko ke, ingxaki ibonakala kwiifayile ezinkulu. Oko kukuthi, kufuneka ugcine iikopi ezimbini zedatha - efihliweyo kwaye ikhutshiwe. Kwaye ukuba kukho i-megabytes, okanye ividiyo yokusakaza, umzekelo?. Kodwa ngeMTProto kuya kufuneka ekuqaleni fihla okanye uguqule ukuntsonkotha komyalezo wonke, emva koko uwugqithisele kumsebenzi womnatha okanye kwidisk. Ke ngoko, kwiinguqulelo zamva nje zeTelegram yeDesktop kwi-cache in user_data Enye ifomathi iphinda isetyenziswe - nge-AES kwimodi ye-CTR.

Vasily, [21.06.18 01:27] Owu, ndifumene ukuba yintoni i-IGE: I-IGE yayiyinzame yokuqala "kwindlela yokuqinisekisa ufihlo," ekuqaleni i-Kerberos. Yayilinge elingaphumelelanga (aliboneleli ngokhuseleko lwemfezeko), kwaye kwafuneka ukuba lisuswe. Eso yaba sisiqalo seminyaka engama-20 yokufuna indlela yokuqinisekisa yoguqulelo oluntsonkothileyo olusebenzayo, oluthe lwafikelela kuvuthondaba lweendlela ezifana ne-OCB kunye ne-GCM.

Kwaye ngoku iingxoxo ezivela kwicala lenqwelo:

Iqela elisemva kweTelegram, elikhokelwa nguNikolai Durov, liquka iintshatsheli ze-ACM ezintandathu, isiqingatha sabo se-Ph.D kwizibalo. Kwabathatha malunga neminyaka emibini ukuhambisa inguqulelo yangoku yeMTProto.

Iyahlekisa lonto. Iminyaka emibini kwinqanaba elisezantsi

Okanye ungathatha nje tls

Kulungile, masithi siyenzile i-encryption kunye namanye ama-nuances. Ngaba ekugqibeleni kunokwenzeka ukuthumela izicelo ezilandelelanisiweyo kwi-TL kwaye ulahlekise iimpendulo? Ke yintoni kwaye kufuneka uyithumele njani? Apha, masithi, indlela initConnection, mhlawumbi yiyo le?

Vasily, [25.06.18 18:46] Iqalisa uqhagamshelwano kwaye ugcine ulwazi kwisixhobo somsebenzisi kunye nesicelo.

Yamkela app_id, device_model, system_version, app_version kunye lang_code.

Kwaye omnye umbuzo

Amaxwebhu njengesiqhelo. Zive ukhululekile ukufunda umthombo ovulekileyo

Ukuba yonke into ibicacile nge-invokeWithLayer, yintoni engalunganga apha? Kuyavela, masithi sinayo - umxhasi sele enento yokubuza umncedisi malunga - kukho isicelo ebesifuna ukusithumela:

Vasily, [25.06.18 19:13] Ngokujonga ikhowudi, umnxeba wokuqala usongelwe kule crap, kwaye i-crap ngokwayo isongelwe kwi-invokewithlayer.

Kutheni i-initConnection ingenakuba yifowuni eyahlukileyo, kodwa kufuneka ibe sisisongelo? Ewe, njengoko kwavela, kufuneka kwenziwe rhoqo ekuqaleni kweseshoni nganye, kwaye kungekhona kanye, njengeqhosha eliphambili. Kodwa! Ayinakubizwa ngumsebenzisi ongagunyaziswanga! Ngoku sifikelele kwinqanaba lokuba isebenze Le iphepha loxwebhu-kwaye lisixelela ukuba...

Kuphela inxalenye encinci yeendlela ze-API ezifumanekayo kubasebenzisi abangagunyaziswanga:

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

Okokuqala kubo, auth.sendCode, kwaye kukho eso sicelo sokuqala sixabisekileyo apho sithumela i-api_id kunye ne-api_hash, kwaye emva koko sifumana iSMS enekhowudi. Kwaye ukuba sikwi-DC engalunganga (iinombolo zomnxeba kweli lizwe zikhonzwa ngomnye, umzekelo), ngoko siya kufumana impazamo kunye nenombolo ye-DC efunwayo. Ukufumana ukuba yeyiphi idilesi ye-IP ngenombolo ye-DC ofuna ukuqhagamshela kuyo, sincede help.getConfig. Ngesinye isikhathi kwakukho ukungena kwe-5 kuphela, kodwa emva kweziganeko ezidumileyo ze-2018, inani liye landa kakhulu.

Ngoku masikhumbule ukuba sifike kweli nqanaba kumncedisi ngokungaziwa. Ngaba akubizi kakhulu ukufumana nje idilesi ye-IP? Kutheni ungenzi oku, kunye neminye imisebenzi, kwindawo engafihlwanga yeMTProto? Ndiva inkcaso: "singaqiniseka njani ukuba akusiyo i-RKN eya kuphendula ngeedilesi zobuxoki?" Kule nto sikhumbula ukuba, ngokubanzi, abathengi abasemthethweni Izitshixo zeRSA zihlonyelwe, o.k. uyakwazi nje uphawu olu lwazi. Ngokwenyani, oku sele kusenziwa ngolwazi malunga nokuthintela ukubhloka abathi abathengi bafumane ngamanye amajelo (ngokusengqiqweni, oku akunakukwenziwa kwiMTProto ngokwayo; kufuneka ukwazi nokuba ungaqhagamshelwa phi).

KULUNGILE. Kweli nqanaba logunyaziso lwabathengi, asikagunyaziswa kwaye asibhalisanga isicelo sethu. Sifuna nje ukubona ngoku ukuba umncedisi uphendula ntoni kwiindlela ezifumanekayo kumsebenzisi ongagunyaziswanga. Kwaye apha...

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;

Kwiskimu, kuqala kuza okwesibini

Kwi-tdesktop schema ixabiso lesithathu ngu

Ewe, ukususela ngoko, ngokuqinisekileyo, amaxwebhu ahlaziyiwe. Nangona kungekudala isenokungabi namsebenzi kwakhona. Ngaba umqhubi we-novice kufuneka azi njani? Mhlawumbi ukuba usibhalisa isicelo sakho, baya kukwazisa? UVasily wenza oku, kodwa ke, abazange bamthumele nantoni na (kwakhona, siza kuthetha ngale nto kwinxalenye yesibini).

...Uqaphele ukuba sele ngandlel 'ithile sifudukele kwi-API, oko kukuthi. ukuya kwinqanaba elilandelayo, kwaye uphoswe yinto kwisihloko seMTProto? Akothusi:

Vasily, [28.06.18 02:04] Mm, bahlola ezinye ze-algorithms kwi-e2e.

I-Mtproto ichaza i-encryption algorithms kunye nezitshixo zazo zombini iindawo, kunye nentwana yesakhiwo esongayo.

Kodwa bahlala bexuba amanqanaba ahlukeneyo esitaki, ke akusoloko kucaca ukuba i-mtproto yaphela phi kwaye inqanaba elilandelayo laqala.

Zixubana njani? Ewe, nantsi iqhosha lexeshana elifanayo le-PFS, umzekelo (ngendlela, i-Telegram Desktop ayikwazi ukuyenza). Yenziwa ngesicelo se-API auth.bindTempAuthKey, o.k. ukusuka kwinqanaba eliphezulu. Kodwa kwangaxeshanye iphazamisana ne-encryption kwinqanaba elisezantsi - emva kwayo, umzekelo, kufuneka uyenze kwakhona. initConnection njl., akunjalo nje isicelo esiqhelekileyo. Eyona nto ikhethekileyo kukuba unokuba nesitshixo ESINYE kuphela sexeshana kwi-DC, nangona intsimi auth_key_id kumyalezo ngamnye ikuvumela ukuba utshintshe isitshixo ubuncinci umyalezo ngamnye, kwaye umncedisi unelungelo "lokulibala" isitshixo sethutyana nangaliphi na ixesha - uxwebhu alutsho ukuba wenzeni kulo mzekelo ... kakuhle, kutheni Awunazo izitshixo ezininzi, njengeseti yeetyuwa ezizayo, kwaye ?..

Kukho ezinye izinto ezimbalwa ezifanele ukuqwalaselwa malunga nomxholo weMTProto.

Imiyalezo yomyalezo, msg_id, msg_seqno, iziqinisekiso, ipings kwicala elingalunganga kunye nezinye idiosyncrasies

Kutheni ufanele wazi ngazo? Ngenxa yokuba "zivuza" kwinqanaba eliphezulu, kwaye kufuneka uziqaphele xa usebenza ne-API. Masicinge ukuba asinamdla kwi-msg_key inqanaba elisezantsi likhuphe yonke into yethu. Kodwa ngaphakathi kwedatha efihliweyo sinemihlaba elandelayo (kunye nobude bedatha, ngoko siyazi ukuba iphi i-padding, kodwa ayibalulekanga):

  • ityuwa - int64
  • session_id - int64
  • message_id - int64
  • seq_no - int32

Masikukhumbuze ukuba kukho ityuwa enye kuphela kwi-DC iphela. Kutheni sazi ngaye? Akunjalo kuba kukho isicelo get_future_salts, ekuxelela ukuba yiyiphi ikhefu eya kusebenza, kodwa kwakhona kuba ukuba ityuwa yakho "ibolile", ngoko umyalezo (isicelo) uya kulahleka. Umncedisi uya kuthi, ngokuqinisekileyo, axele ityuwa entsha ngokukhupha new_session_created - kodwa kunye nomdala kuya kufuneka uyithumele kwakhona ngandlela-thile, umzekelo. Kwaye lo mba uchaphazela ulwakhiwo lwesicelo.

Umncedisi uvumelekile ukuba alahle iiseshoni ngokupheleleyo kwaye aphendule ngale ndlela ngenxa yezizathu ezininzi. Ngokwenyani, yintoni iseshoni yeMTProto kwicala lomxhasi? La ngamanani amabini session_id и seq_no imiyalezo ngaphakathi kule seshini. Ewe, kunye nonxibelelwano lwe-TCP olusisiseko, kunjalo. Masithi umxhasi wethu akakayazi indlela yokwenza izinto ezininzi, uye waqhawula unxibelelwano waphinda waxhuma. Ukuba oku kwenzeka ngokukhawuleza - iseshoni endala yaqhubeka kwi-TCP entsha uxhumano, ukwanda seq_no ngakumbi. Ukuba kuthatha ixesha elide, umncedisi unokuyicima, kuba kwicala layo ikwangumgca, njengoko sifumene.

Kufuneka ibe yintoni seq_no? Owu, ngumbuzo onobuqili lowo. Zama ukuqonda ngokunyanisekileyo oko kwakuthethwa:

Umyalezo onxulumene nomxholo

Umyalezo ofuna ukwamkelwa okucacileyo. Oku kubandakanya yonke imiyalezo yomsebenzisi kunye neenkonzo ezininzi, phantse zonke ngaphandle kwezikhongozeli kunye nemibulelo.

Inombolo yolandelelwano lomyalezo (msg_seqno)

Inani le-32-bit elilingana nenani eliphindwe kabini lemiyalezo "enxulumene nomxholo" (leyo ifuna ukwamkelwa, ngakumbi ezo zingezizo izingxobo) eyenziwe ngumthumeli ngaphambi kwalo myalezo kwaye emva koko inyuswe ngomnye ukuba umyalezo wangoku umyalezo onxulumene nomxholo. Isikhongozeli sisoloko senziwa emva kokuqulathwe kuyo yonke; ke ngoko, inani layo lolandelelwano likhulu okanye lilingana namanani olandelelwano lwemiyalezo equlethwe kuyo.

Loluphi uhlobo lwesekisi olunonyuso ngo-1, kwaye luphinde lube ngo-2? ngokukodwa, iphuma, ingathunyelwa eziliqela iziqinisekiso ezifanayo seq_no! Njani? Ewe, umzekelo, umncedisi usithumela into ethile, uyithumele, kwaye thina ngokwethu sihlala sithule, siphendula kuphela ngemiyalezo yenkonzo eqinisekisa ukufunyanwa kwemiyalezo yayo. Kule meko, iziqinisekiso zethu eziphumayo ziya kuba nenombolo efanayo ephumayo. Ukuba uqhelene ne-TCP kwaye wacinga ukuba oku kuvakala ngandlel 'ithile endle, kodwa kubonakala kungabonakali kakhulu, kuba kwi-TCP seq_no ayitshintshi, kodwa isiqinisekiso siya ku seq_no kwelinye icala, ndiya kukhawuleza ukunikhathaza. Uqinisekiso lunikiwe kwiMTProto HAYI kwi seq_no, njengakwi-TCP, kodwa ngo msg_id !

Yintoni lento msg_id, eyona ibalulekileyo kwezi nkalo? Isichongi somyalezo esisodwa, njengoko igama licebisa. Ichazwa njengenani le-64-bit, i-bits ephantsi kakhulu kwakhona inomlingo "we-server-not-server", kwaye enye i-timestamp ye-Unix, kubandakanywa inxalenye ye-fractional, itshintshe i-32 bits ukuya ngakwesobunxele. Ezo. isitampu sexesha ngokwese (kunye nemiyalezo enamaxesha ahluke kakhulu aya kwaliwa ngumncedisi). Ukusuka koku kuvela ukuba ngokubanzi esi sisazisi esisehlabathini lonke kumxhasi. Inikwe loo nto - masikhumbule session_id - siqinisekisiwe: Akukho naphantsi kweemeko apho umyalezo olungiselelwe iseshini enye ungathunyelwa kwiseshoni eyahlukileyo. Oko kukuthi, kuvela ukuba kukho kakade ezintathu inqanaba - iseshoni, inombolo yeseshoni, umyalezo id. Kutheni le nto i-overcomplication enjalo, le mfihlelo inkulu kakhulu.

Kwaye ke, msg_id iyafuneka...

RPC: izicelo, iimpendulo, iimpazamo. Iziqinisekiso.

Njengoko usenokuba uqaphele, akukho nto ikhethekileyo "yenza isicelo se-RPC" okanye umsebenzi naphi na kumzobo, nangona kukho iimpendulo. Ngapha koko, sinemiyalezo enxulumene nomxholo! Yiyo i, nayiphi na umyalezo unokuba sisicelo! Okanye kungabi njalo. Emveni kwakho konke, wonke umntu is msg_id. Kodwa kukho iimpendulo:

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

Apha kulapho kuboniswa khona ukuba ngowuphi umyalezo lo impendulo kuwo. Ngoko ke, kwinqanaba eliphezulu le-API, kuya kufuneka ukhumbule ukuba yeyiphi inombolo yesicelo sakho - ndicinga ukuba akukho mfuneko yokuchaza ukuba umsebenzi awuhambelani, kwaye kunokubakho izicelo ezininzi eziqhubekayo ngexesha elinye, iimpendulo ekunokubuyiswa ngazo nangaluphi na ulandelelwano? Ngokomgaqo, ukusuka kule kunye nemiyalezo yempazamo efana nabasebenzi, i-architecture emva koku inokulandelelwa: umncedisi ogcina uxhulumaniso lwe-TCP kunye nawe ngumlinganisi wangaphambili, udlulisela izicelo kwii-backends kwaye uziqokelele emva. message_id. Kubonakala ngathi yonke into apha icacile, isengqiqweni kwaye ilungile.

Ewe? .. Kwaye ukuba ucinga ngayo? Emva kwayo yonke loo nto, impendulo ye-RPC ngokwayo inentsimi msg_id! Ngaba kufuneka sikhwaze kumncedisi "awuyiphenduli impendulo yam!"? Kwaye ewe, bekukho ntoni malunga neziqinisekiso? Malunga nephepha imiyalezo malunga nemiyalezo isixelela ukuba yintoni

msgs_ack#62d6b459 msg_ids:Vector long = MsgsAck;

makwenziwe ngamacala omabini. Kodwa hayi ngamaxesha onke! Ukuba ufumene i-RpcResult, yona ngokwayo isebenza njengesiqinisekiso. Oko kukuthi, iseva inokuphendula isicelo sakho nge-MsgsAck-efana, "Ndiyifumene." I-RpcResult inokuphendula ngokukhawuleza. Inokuba zombini.

Kwaye ewe, kusafuneka uphendule impendulo! Isiqinisekiso. Kungenjalo, umncedisi uyakuyithathela ingqalelo ayihambiseki kwaye ayibuyisele kuwe kwakhona. Nasemva kokuba uxhulumaniso kwakhona. Kodwa apha, kunjalo, umba wokuphelelwa lixesha uyavela. Masizijonge kamva.

Okwangoku, makhe sijonge iimpazamo ezinokubakho zokwenza imibuzo.

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

Owu, umntu uya kukhwaza, nantsi ifomathi enobuntu - kukho umgca! Thatha ixesha lakho. Apha uluhlu lweempazamo, kodwa ngokuqinisekileyo ayigqitywanga. Kuyo sifunda ukuba ikhowudi into efana Iimpazamo ze-HTTP (kakuhle, ngokuqinisekileyo, i-semantics yeempendulo ayihlonitshwa, kwezinye iindawo zihanjiswa ngokungaqhelekanga phakathi kweekhowudi), kwaye umgca ubukeka ngathi. CAPITAL_LETTERS_AND_NUMBERS. Umzekelo, PHONE_NUMBER_OCCUPIED okanye FILE_PART_Х_MISSING. Kulungile, oko kukuthi, uzakube usawufuna lo mgca cazulula. Umzekelo FLOOD_WAIT_3600 kuya kuthetha ukuba kufuneka ulinde iyure, kwaye PHONE_MIGRATE_5, ukuba inombolo yefowuni enesimaphambili kufuneka ibhaliswe kwi-5th DC. Sinolwimi oluchwethezayo, akunjalo? Asiyidingi ingxabano evela kumtya, abaqhelekileyo baya kwenza, kulungile.

Kwakhona, oku akukho kwiphepha lemiyalezo yenkonzo, kodwa, njengoko sele kuqhelekile kule projekthi, ulwazi lunokufumaneka kwelinye iphepha loxwebhu. Okanye phosa urhano. Okokuqala, jonga, ukuchwetheza / ukwaphulwa komgangatho - RpcError ingafakwa kwindlwane RpcResult. Kutheni kungekho ngaphandle? Yintoni esingazange siyithathele ingqalelo? .. Ngokuhambelanayo, siphi isiqinisekiso sokuba RpcError Isenokungeniswa ngaphakathi RpcResult, kodwa ibe ngokuthe ngqo okanye ifakwe kwelinye uhlobo? .. Kwaye ukuba ayikwazi, kutheni ingekho kwinqanaba eliphezulu, oko kukuthi. ilahlekile req_msg_id ? ..

Kodwa masiqhubeke malunga nemiyalezo yenkonzo. Umxhasi unokucinga ukuba umncedisi ucinga ixesha elide kwaye enze isicelo esimangalisayo:

rpc_drop_answer#58e4a740 req_msg_id:long = RpcDropAnswer;

Zintathu iimpendulo ezinokuthi zibekho kulo mbuzo, ziphinda zinqumlene nendlela yokuqinisekisa; zizama ukuqonda ukuba zifanele ukuba yintoni na (kwaye ukuba luluphi uluhlu lweentlobo ezingafuni siqinisekiso) lushiyelwa kumfundi njengomsebenzi wesikolo wasekhaya (qaphela: ulwazi olukuluhlu olukuluhlu olungafuni siqinisekiso) ikhowudi yomthombo weTelegram yeDesktop ayigqitywanga).

Ukuba likhoboka leziyobisi: iimeko zomyalezo

Ngokubanzi, iindawo ezininzi kwi-TL, MTProto kunye neTelegram ngokubanzi zishiya imvakalelo yenkani, kodwa ngenxa yembeko, ubuchule kunye nabanye. izakhono ezithambileyo Ngembeko sathi cwaka ngayo, kwaye sajonga amanyala kwiingxoxo. Nangona kunjalo, le ndawoОuninzi lwephepha limalunga imiyalezo malunga nemiyalezo Iyothusa nakum, osebenze kunye neeprotocol zenethiwekhi ixesha elide kwaye ubone iibhayisekile ezinamaqondo ahlukeneyo okugoso.

Iqala ngokungenatyala, kunye neziqinisekiso. Okulandelayo zisixelela ngayo

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;

Ewe, wonke umntu oqala ukusebenza kunye neMTProto kuya kufuneka ajongane nabo kumjikelo "olungisiweyo - ophinde waqaliswa", ukufumana iimpazamo zamanani okanye ityuwa ekwazile ukuhamba kakubi ngexesha lokuhlelwa yinto eqhelekileyo. Nangona kunjalo, kukho iingongoma ezimbini apha:

  1. Oku kuthetha ukuba umyalezo wokuqala ulahlekile. Kufuneka senze imigca ethile, siza kuyijonga kamva.
  2. Ngawaphi la manani empazamo angaqhelekanga? 16, 17, 18, 19, 20, 32, 33, 34, 35, 48, 64... aphi amanye amanani, Tommy?

Amaxwebhu athi:

Injongo kukuba amaxabiso e-error_code adityaniswe (error_code >> 4): umzekelo, iikhowudi 0x40 — 0x4f zihambelana neempazamo zokubola kwesikhongozeli.

kodwa, okokuqala, utshintsho kwelinye icala, kwaye okwesibini, akunamsebenzi, ziphi ezinye iikhowudi? Entloko yombhali? .. Nangona kunjalo, ezi zincinci.

Umlutha uqala kwimiyalezo malunga neemeko zomyalezo kunye neekopi zomyalezo:

  • Isicelo soLwazi ngoBume boMyalezo
    Ukuba elinye iqela alikhange lifumane ulwazi malunga nobume bemiyalezo yalo ephumayo okwethutyana, linokuyicela ngokucacileyo kwelinye iqela:
    msgs_state_req#da69fb52 msg_ids:Vector long = MsgsStateReq;
  • Umyalezo woLwazi malunga neSimo seMiyalezo
    msgs_state_info#04deb57d req_msg_id:long info:string = MsgsStateInfo;
    Apha, info luluhlu oluqulathe ngqo i-byte yesimo somyalezo kumyalezo ngamnye kuluhlu olungenayo lwe-msg_ids:

    • 1 = akukho nto yaziwayo malunga nomyalezo (msg_id iphantsi kakhulu, elinye iqela lisenokuba liwulibele)
    • 2 = umyalezo awufunyanwanga (msg_id iwela phakathi koluhlu lwezazisi ezigciniweyo; nangona kunjalo, elinye iqela ngokuqinisekileyo alikawufumani umyalezo onje)
    • 3 = umyalezo awufunyanwanga (msg_id iphezulu kakhulu; nangona kunjalo, elinye iqela ngokuqinisekileyo alikawufumani)
    • 4 = umyalezo ofunyenweyo (qaphela ukuba le mpendulo ikwangexesha elifanayo ukuvuma ukufunyanwa)
    • +8 = umyalezo sele wamkelwe
    • +16 = umyalezo awufuni kwamkelwa
    • +32 = Umbuzo we-RPC oqulethwe kumyalezo oqhutyelwa phambili okanye osele ugqityiwe
    • +64 = impendulo enxulumene nomxholo kumyalezo osele wenziwe
    • +128 = elinye iqela liyazi ngenyaniso ukuba umyalezo sele ufunyenwe
      Le mpendulo ayifuni kuvuma. Kukuvuma okufanelekileyo msgs_state_req, ngokwayo.
      Qaphela ukuba kuvele ngequbuliso ukuba elinye iqela alinawo umyalezo okhangeleka ngathi uthunyelwe kulo, umyalezo unokuphinda uthunyelwe kwakhona. Nokuba elinye iqela linokufumana iikopi ezimbini zomyalezo ngaxeshanye, ikopi ayisayi kuhoywa. (Ukuba ixesha elininzi ligqithile, kwaye yoqobo msg_id ayisasebenzi, umyalezo kufuneka usongelwe ku msg_copy).
  • UNxibelelwano lokuzithandela lweSimo seMiyalezo
    Naliphi na iqela linokwazisa ngokuzithandela elinye iqela ngesimo semiyalezo ethunyelwa lelinye iqela.
    msgs_all_info#8cc0d131 msg_ids:Vector long info:string = MsgsAllInfo
  • Unxibelelwano lokuZithandela olwandisiweyo lweSimo soMyalezo omnye
    ...
    msg_detailed_info#276d3ec6 msg_id:long answer_msg_id:long bytes:int status:int = MsgDetailedInfo;
    msg_new_detailed_info#809db6df answer_msg_id:long bytes:int status:int = MsgDetailedInfo;
  • Isicelo esicacileyo sokuThunyelelwa kwakhona kweMiyalezo
    msg_resend_req#7d861a08 msg_ids:Vector long = MsgResendReq;
    Iqela elikude liphendula ngokukhawuleza ngokuthumela kwakhona imiyalezo eceliweyo […]
  • Isicelo esicacileyo sokuphinda uthumele iimpendulo
    msg_resend_ans_req#8610baeb msg_ids:Vector long = MsgResendReq;
    Iqela elikude liphendula ngokukhawuleza ngokuthumela kwakhona iimpendulo kwimiyalezo eceliweyo […]
  • Iikopi zomyalezo
    Kwezinye iimeko, umyalezo omdala one msg_id ongasasebenziyo ufuna ukuphinda uthunyelwe. Emva koko, isongelwe kwisikhongozeli sekopi:
    msg_copy#e06046b2 orig_message:Message = MessageCopy;
    Wakuba ufunyenwe, umyalezo ucutshungulwa ngokungathi umsonga ubengekho. Nangona kunjalo, ukuba iyaziwa ngokuqinisekileyo ukuba umyalezo orig_message.msg_id ufunyenwe, ngoko umyalezo omtsha awugqithiswanga (ngelixa elinye, wona kunye ne-orig_message.msg_id ziyavunywa). Ixabiso le-orig_message.msg_id kufuneka libengaphantsi kunesingxobo se-msg_id.

Masithule ndithini msgs_state_info kwakhona iindlebe ze-TL ezingagqitywanga ziphuma ngaphandle (sasidinga i-vector ye-bytes, kwaye kwiindawo ezimbini ezisezantsi kwakukho i-enum, kwaye kwiindawo ezimbini eziphezulu kwakukho iiflegi). Ingongoma yahlukile. Ngaba umntu uyasiqonda isizathu sokuba konke oku kusenzeka? kumxhasi wokwenene Kuyimfuneko? .. Ngobunzima, kodwa umntu unokucinga ngenzuzo ethile ukuba umntu ubandakanyeka kwi-debugging, kwaye kwimodi edibeneyo - buza umncedisi ukuba yintoni kwaye njani. Kodwa apha izicelo zichazwe Uhambo oluphelele.

Oku kulandela ukuba iqela ngalinye alifanele libethelele kwaye lithumele imiyalezo kuphela, kodwa liphinde ligcine idatha malunga nabo, malunga neempendulo kubo, ixesha elingaziwayo. Amaxwebhu awachazi nokuba amaxesha okanye ukusetyenziswa okubonakalayo kwezi mpawu. akukho ndlela. Eyona nto imangalisayo kukuba zisetyenziswa ngokwenene kwikhowudi yabathengi abasemthethweni! Kuyabonakala ukuba baxelelwa into engazange ibandakanywe kumaxwebhu oluntu. Qonda ukusuka kwikhowudi kutheni, ayiselula nje ngokuba kwimeko ye-TL - ayisiyiyo (ngokuhambelanayo) inxalenye ehlukeneyo ngokwengqiqo, kodwa isiqwenga esibotshelelwe kwi-architecture yesicelo, oko kukuthi. iya kufuna ixesha elininzi ukuqonda ikhowudi yesicelo.

Iingoma kunye namaxesha. Imigca.

Ukusuka kuyo yonke into, ukuba sikhumbula uqikelelo malunga nokwakhiwa kweseva (ukusasazwa kwezicelo kwii-backends), into ebuhlungu ilandela - nangona zonke iziqinisekiso zokuhanjiswa kwe-TCP (mhlawumbi idatha ihanjiswa, okanye uya kwaziswa malunga nesikhewu, kodwa idatha iya kuhanjiswa ngaphambi kokuba ingxaki yenzeke), ukuba iziqinisekiso kwiMTProto ngokwayo - akukho ziqinisekiso. Umncedisi angaphulukana okanye alahle umyalezo wakho ngokulula, kwaye akukho nto inokwenziwa ngayo, sebenzisa nje iindidi ezahlukeneyo zeentonga.

Kwaye okokuqala kuzo zonke - imigca yemiyalezo. Ewe, ngento enye yonke into yayicacile kwasekuqaleni - umyalezo ongaqinisekiswanga kufuneka ugcinwe kwaye uthunyelwe. Kwaye emva kweliphi ixesha? Kwaye umhleki uyamazi. Mhlawumbi loo miyalezo yenkonzo yekhoboka ngandlela ithile iyayicombulula le ngxaki ngeentonga, yithi, kwiTelegram yeDesktop kukho malunga nemigca emi-4 ehambelana nayo (mhlawumbi ngaphezulu, njengoko sele kukhankanyiwe, koku kufuneka ujonge kwikhowudi yayo kunye noyilo loyilo ngakumbi; kwangaxeshanye ixesha, thina Siyazi ukuba ayinakuthatyathwa njengesampulu inani elithile leentlobo ezivela kwisikimu seMTProto azisetyenziswanga kuyo).

Kutheni kusenzeka oku? Mhlawumbi, abadwelisi benkqubo beseva abakwazanga ukuqinisekisa ukuthembeka ngaphakathi kweqela, okanye nokuba buffering kwi-balancer yangaphambili, kwaye idlulisele le ngxaki kumxhasi. Ngaphandle kokuphelelwa lithemba, uVasily wazama ukuphumeza enye inketho, kunye nemigca emibini kuphela, usebenzisa i-algorithms esuka kwi-TCP - ukulinganisa i-RTT kumncedisi kunye nokulungelelanisa ubungakanani be "window" (kwimiyalezo) kuxhomekeke kwinani lezicelo ezingaqinisekisiweyo. Oko kukuthi, i-heuristic enzima kangaka yokuvavanya umthwalo womncedisi kukuba zingaphi izicelo zethu ezinokuhlafuna ngexesha elinye kwaye zingalahleki.

Ewe, oko kukuthi, uyaqonda, akunjalo? Ukuba kufuneka uphumeze i-TCP kwakhona ngaphezulu kweprotocol esebenza ngaphezulu kwe-TCP, oku kubonisa iprotocol eyilwe kakubi kakhulu.

Owu ewe, kutheni ufuna ngaphezulu komgca omnye, kwaye oku kuthetha ukuthini kumntu osebenza nge-API ekwinqanaba eliphezulu? Jonga, wenza isicelo, usilungelelanise, kodwa amaxesha amaninzi awukwazi ukusithumela ngoko nangoko. Ngoba? Kuba impendulo iya kuba msg_id, eyexeshanaаNdiyileyibhile, esona sabelo sihlehliswe de kube semva kwexesha kangangoko kunokwenzeka - ukuba umncedisi uyala ngenxa yokungahambelani kwexesha phakathi kwethu naye (ewe, sinokwenza intonga etshintsha ixesha lethu ukusuka ngoku. kumncedisi ngokongeza i-delta ebalwa kwiimpendulo zomncedisi - abaxumi abasemthethweni bayayenza le nto, kodwa ikrwada kwaye ayichanekanga ngenxa ye-buffering). Ke ngoko, xa usenza isicelo ngomnxeba womsebenzi wasekhaya ovela kwithala leencwadi, umyalezo uhamba kula manqanaba alandelayo:

  1. Ilele kumgca omnye kwaye ilindele uguqulelo oluntsonkothileyo.
  2. Utyunjiwe msg_id kwaye umyalezo waya komnye umgca - ugqithiso olunokwenzeka; thumela kwi socket.
  3. a) Umncedisi uphendule uMsgsAck - umyalezo uhanjiswe, siyawucima "komnye umgca".
    b) Okanye ngokuphambeneyo, akazange athande nto, waphendula i-badmsg - thumela kwakhona ukusuka "komnye umgca"
    c) Akukho nto yaziwayo, umyalezo ufuna ukuphinda uthunyelwe komnye umgca - kodwa akwaziwa ukuba nini kanye kanye.
  4. Umncedisi uphendule ekugqibeleni RpcResult - impendulo eyiyo (okanye impazamo) - ayihanjiswanga nje, kodwa iphinde iqhutywe.

Mhlawumbi, ukusetyenziswa kwezikhongozeli kunokusombulula ingxaki. Oku kuxa iqela lemiyalezo lipakishwe kwenye, kwaye umncedisi waphendula ngesiqinisekiso kubo bonke ngaxeshanye, kwenye. msg_id. Kodwa uya kwandula le phakheji, ukuba kukho into engalunganga, ngokupheleleyo.

Kwaye ngeli xesha ingqwalasela engeyiyo yobugcisa iyangena. Ukususela kumava, siye sabona ezininzi iintonga, kwaye ukongezelela, ngoku siza kubona imizekelo emininzi yeengcebiso ezimbi kunye nezakhiwo - kwiimeko ezinjalo, ngaba kufanelekile ukuthembela nokwenza izigqibo ezinjalo? Umbuzo ngowobuciko (ngokuqinisekileyo akunjalo).

Sithetha ngantoni? Ukuba kumxholo othi "imiyalezo yeziyobisi malunga nemiyalezo" usenako ukuthelekelela ngezinto ezichasayo ezinje "usisidenge, awusiqondanga isicwangciso sethu esikrelekrele!" (ngoko bhala amaxwebhu kuqala, njengoko abantu abaqhelekileyo kufuneka, kunye nengqiqo kunye nemizekelo yokutshintshiselana kwepakethi, emva koko siza kuthetha), emva koko amaxesha / ixesha lokuphuma ngumbuzo osebenzayo kunye nombuzo othile, yonke into elapha iyaziwa ixesha elide. Amaxwebhu asixelela ntoni malunga nokuphela kwexesha?

Umncedisi udla ngokuvuma ukufumana umyalezo ovela kumxhasi (ngokuqhelekileyo, umbuzo we-RPC) usebenzisa impendulo ye-RPC. Ukuba impendulo ifike ixesha elide, umncedisi unokuqala athumele ukwamkelwa kwerisithi, kwaye emva koko, impendulo ye-RPC ngokwayo.

Umxhasi udla ngokuvuma ukufumana umyalezo ovela kumncedisi (ngokuqhelekileyo, impendulo ye-RPC) ngokongeza ukuvuma kumbuzo olandelayo we-RPC ukuba awuthunyelwanga emva kwexesha kakhulu (ukuba wenziwe, yithi, imizuzwana engama-60-120 emva kokufunyanwa kwerisithi. yomyalezo osuka kumncedisi). Nangona kunjalo, ukuba ixesha elide akukho sizathu sokuthumela imiyalezo kumncedisi okanye ukuba kukho inani elikhulu lemiyalezo engavunywanga evela kumncedisi (uthi, ngaphezu kwe-16), umxhasi uhambisa ukuvuma okuzimeleyo.

... Ndiguqulela: thina ngokwethu asazi ukuba singakanani kwaye siyidinga njani, ngoko makhe sicinge ukuba makube njalo.

Kwaye malunga neepings:

Imiyalezo ePing (PING/PONG)

ping#7abe77ec ping_id:long = Pong;

Impendulo iqhele ukubuyiswa kuqhagamshelwano olufanayo:

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

Le miyalezo ayifuni mbulelo. Ipong isasazwa kuphela ngokuphendula kwiping ngelixa iping inokuqaliswa nangaliphi na icala.

Ukuvalwa koQhagamshelwano oluMiselweyo + PING

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

Isebenza njenge-ping. Ukongeza, emva kokuba oku kufunyenwe, umncedisi uqalisa isibali-xesha esiza kuvala uqhagamshelo lwangoku disconnect_delay imizuzwana kamva ngaphandle kokuba ifumana umyalezo omtsha wohlobo olufanayo oluseta ngokutsha ngokuzenzekelayo zonke izibali-xesha zangaphambili. Ukuba umxhasi uthumela ezi pings kanye qho ngemizuzwana engama-60, umzekelo, inokuseta disconnect_delay ilingane ne-75 seconds.

Ingaba uphambene?! Kwimizuzwana engama-60, uloliwe uya kungena esitishini, ehle aze akhwelise abakhweli, aphinde aphulukane nonxibelelwano etoneleni. Kwimizuzwana eyi-120, ngelixa uyivayo, iya kufika kwenye, kwaye uqhagamshelo luya kwaphuka. Ewe, kucacile ukuba imilenze ivela phi - "Ndivile ukukhala, kodwa andiyazi ukuba iphi", kukho i-algorithm ye-Nagl kunye nenketho ye-TCP_NODELAY, ejoliswe kumsebenzi wokusebenzisana. Kodwa, ndixolele, bambelela kwixabiso layo elingagqibekanga - 200 Miliimizuzwana Ukuba ufuna ngokwenene ukubonisa into efanayo kwaye ugcine kwiipakethi ezimbalwa ezinokwenzeka, uze uyibeke imizuzwana emi-5, okanye nantoni na "uMsebenzisi uchwetheza..." ixesha lomyalezo liphelile ngoku. Kodwa hayi ngakumbi.

Kwaye ekugqibeleni, pings. Oko kukuthi, ukujonga ubomi bonxibelelwano lwe-TCP. Kuyinto ehlekisayo, kodwa malunga neminyaka eyi-10 edlulileyo ndabhala isicatshulwa esibalulekileyo malunga nomthunywa we-dorm yethu yefaculty - ababhali apho nabo bajonga iseva kumxhasi, hayi ngokuchaseneyo. Kodwa abafundi bonyaka wesi-3 yinto enye, kwaye iofisi yezizwe ngezizwe yenye, akunjalo?..

Okokuqala, inkqubo encinci yemfundo. Uxhulumaniso lwe-TCP, ngokungabikho kwepakethi yokutshintshiselana, inokuphila iiveki. Oku kulungile kwaye kubi, kuxhomekeke kwinjongo. Kulungile ukuba unonxibelelwano lwe-SSH oluvulekele kumncedisi, uvuke kwikhompyutheni, uqalise kwakhona i-router, ubuyele kwindawo yakho - iseshoni ngokusebenzisa le seva ayizange ikrazulwe (awuzange uchwetheze nantoni na, bekungekho iipakethi) , ilungile. Kubi ukuba kukho amawaka abathengi kumncedisi, elowo uthatha izixhobo (hello, Postgres!), Kwaye umninimzi womxhasi unokuthi uqalise kwakhona ixesha elidlulileyo - kodwa asiyi kukwazi malunga nalo.

Iinkqubo zeNgxoxo / ze-IM ziwela kwimeko yesibini ngesizathu esinye esongezelelweyo - i-intanethi. Ukuba umsebenzisi "uwile", kufuneka uxelele abangeneleli bakhe malunga noku. Ngaphandle koko, uya kugqiba ngempazamo eyenziwa ngabadali beJabber (kwaye balungiswa iminyaka engama-20) - umsebenzisi unqanyuliwe, kodwa baqhubeka bebhala imiyalezo kuye, bekholelwa ukuba ukwi-intanethi (ekwaye yalahleka ngokupheleleyo kwezi. imizuzu embalwa phambi kokuba uqhagamshelo lufunyenwe). Hayi, ukhetho lwe-TCP_KEEPALIVE, apho abantu abaninzi abangayiqondiyo indlela yokusebenza kwe-TCP ixesha baphosa ngokungenamkhethe (ngokubeka amaxabiso asendle njengamashumi emizuzwana), ayizukunceda apha - kufuneka uqiniseke ukuba hayi kuphela i-OS kernel. kumatshini womsebenzisi uyaphila, kodwa usebenza ngokuqhelekileyo, ekukwazini ukuphendula, kunye nesicelo ngokwaso (ucinga ukuba asinakuqhwanyaza? I-Telegram Desktop ku-Ubuntu 18.04 ikhenkceze ngaphezu kwesihlandlo esinye).

Yiyo loo nto kufuneka u-ping umncedisi umxhasi, kwaye kungekhona ngokuchaseneyo - ukuba umxhasi wenza oku, ukuba uxhulumaniso luphukile, i-ping ayiyi kuhanjiswa, injongo ayiyi kufezekiswa.

Sibona ntoni kwiTelegram? Kuchasene ngqo noko! Ewe, kunjalo. Ngokusesikweni, ewe, omabini amacala ayakwazi ukuphina omnye komnye. Enyanisweni, abathengi basebenzisa intonga ping_delay_disconnect, ecwangcisa isibali-xesha kumncedisi. Ewe, ndixolele, akukho kumthengi ukuba athathe isigqibo sokuba ufuna ukuhlala ixesha elingakanani apho ngaphandle kwe-ping. Umncedisi, ngokusekelwe kumthwalo wakhe, uyazi ngcono. Kodwa, ewe, ukuba awukhathali ngezixhobo, uya kuba yiPinocchio yakho embi, kwaye intonga iya kwenza ...

Ifanele ukuba iyilwe njani?

Ndiyakholelwa ukuba ezi zibakala zingasentla zibonisa ngokucacileyo ukuba iqela leTelegram / VKontakte alikwazi kakhulu kwintsimi yezothutho (kunye nezantsi) kwinqanaba leenethiwekhi zekhompyutheni kunye neziqinisekiso zabo eziphantsi kwimiba echaphazelekayo.

Kutheni le nto yajika yantsonkotha kangaka, kwaye abakhi beTelegram banokuzama njani ukuchasa? Inyaniso yokuba bazama ukwenza iseshoni esinda kwi-TCP ikhefu lokuxhamla, oko kukuthi, into engazange ihanjiswe ngoku, siya kuhambisa kamva. Mhlawumbi nabo bazama ukwenza i-UDP yokuthutha, kodwa badibana nobunzima kwaye bayishiya (yingakho amaxwebhu angenanto - kwakungekho nto yokuqhayisa). Kodwa ngenxa yokunqongophala kokuqonda indlela amanethiwekhi ngokubanzi kunye ne-TCP esebenza ngayo ngokukodwa, apho unokuthembela kuyo, kwaye apho kufuneka uyenze ngokwakho (kunye njani), kunye nomzamo wokudibanisa oku kunye ne-cryptography "iintaka ezimbini kunye ilitye elinye”, esi sisiphumo.

Kwakuyimfuneko njani? Ngokusekelwe kwinto yokuba msg_id sisitampu sexesha esiyimfuneko ukusuka kwindawo yokujonga i-cryptographic ukunqanda uhlaselo lokudlala kwakhona, yimpazamo ukuncamathisela umsebenzi wokufanisa owodwa kuyo. Ke ngoko, ngaphandle kokutshintsha ngokusisiseko uyilo lwangoku (xa kusenziwa uhlaziyo, sisihloko esikwinqanaba eliphezulu le-API lelinye icandelo lolu luhlu lwezithuba), umntu uya kufuna:

  1. Umncedisi obambe uxhulumaniso lwe-TCP kumxhasi uthatha uxanduva - ukuba ufunde kwi-socket, nceda uvume, usebenze okanye ubuyisele impazamo, akukho lahleko. Emva koko isiqinisekiso ayisiyiyo iVector yeID, kodwa ngokulula "eyokugqibela ifunyenwe seq_no" - inani nje, njengakwi-TCP (amanani amabini - i-seq yakho kunye neqinisekisiweyo). Sisoloko singaphakathi kwiseshoni, akunjalo?
  2. Isitampu sexesha sokuthintela uhlaselo lokuphinda-phinda luba yintsimi eyahlukileyo, i-la nonce. Ijongiwe, kodwa ayichaphazeli nantoni na eyenye. Kwanele kwaye uint32 - ukuba ityuwa yethu iyatshintsha ubuncinane rhoqo ngesiqingatha sosuku, sinokubeka iibhithi ezili-16 kwiisuntswana ezilandelelanayo ezisezantsi zenani elipheleleyo lexesha langoku, intsalela - ukuya kwinxalenye yesekhondi (njengangoku).
  3. Isusiwe msg_id kuzo zonke - ukusuka kwindawo yokujonga izicelo zokwahlula kwii-backends, kukho, okokuqala, i-id yomthengi, kwaye okwesibini, i-id yeseshoni, idibanisa nabo. Ngokufanelekileyo, into enye kuphela eyaneleyo njengesazisi sesicelo seq_no.

Oku kwakhona akulona khetho oluphumeleleyo olupheleleyo olungakhethiyo lunokusebenza njengesazisi - oku sele kwenziwe kwinqanaba eliphezulu le-API xa kuthunyelwa umyalezo, ngendlela. Kuya kuba ngcono ukwenza kwakhona ngokupheleleyo uyilo ukusuka kwisalamane ukuya kuthi ga ngokupheleleyo, kodwa esi sisihloko selinye icandelo, hayi le post.

API?

Ta-daam! Ke, emva kokuzabalaza kwindlela egcwele iintlungu kunye neentonga, ekugqibeleni sakwazi ukuthumela naziphi na izicelo kumncedisi kwaye safumana naziphi na iimpendulo kubo, kunye nokufumana uhlaziyo oluvela kumncedisi (kungekhona ekuphenduleni isicelo, kodwa ngokwayo. usithumela, njengo-PUSH, ukuba nabani na-icace ngakumbi ngaloo ndlela).

Ingqalelo, ngoku kuya kubakho umzekelo kuphela kwiPerl kwinqaku! (kwabo bangaqhelananga ne-syntax, ingxabano yokuqala yentsikelelo lulwakhiwo lwedatha yento, eyesibini ludidi lwayo):

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

Ewe, ayingomonakalisi ngenjongo - ukuba awukafundi, qhubeka uyenzile!

Oh, wai~~... ikhangeleka njani lento? Into eqhelekileyo... mhlawumbi esi sisakhiwo sedatha ye-Web API eqhelekileyo kwi-JSON, ngaphandle kokuba iiklasi nazo zincanyathiselwe kwizinto?..

Ke le yindlela eyenzeka ngayo ... Yintoni malunga nayo, maqabane? ukuqala nje?..Ngaba i-JSON phezu kwe-HTTPS ayiyi kuba lula?! Sifumene ntoni ngokutshintshiselana? Ngaba loo mgudu wawufanelekile?

Masivavanye ukuba iTL+MTroto yasinika ntoni kwaye zeziphi ezinye iindlela ezinokwenzeka. Ewe, i-HTTP, egxile kwimodeli yempendulo yesicelo, yinto embi, kodwa ubuncinane into engaphezulu kwe-TLS?

Ulandelelwano olupheleleyo. Ukubona olu lwakhiwo lwedatha, olufana ne-JSON, ndikhumbula ukuba kukho iinguqulelo zokubini zayo. Masiphawule i-MsgPack njengengonelanga, kodwa kukho, umzekelo, i-CBOR - ngendlela, umgangatho ochazwe RFC 7049. Kuyaphawuleka ukuba ichaza iithegi, njengendlela yokwandisa, naphakathi sele ibekwe emgangathweni ekhoyo:

  • I-25 + 256 - ukutshintsha imigca ephindaphindiweyo ngokubhekisele kwinombolo yomgca, indlela yokucinezela ngexabiso eliphantsi.
  • 26 - into esetyenzisiweyo yePerl enegama leklasi kunye neengxoxo zomakhi
  • 27 - into elandelelanayo yolwimi-ezimeleyo enegama lohlobo kunye neengxoxo zomakhi

Ewe, ndizamile ukulinganisa idatha efanayo kwi-TL nakwi-CBOR ngomtya kunye nokupakishwa kwezinto kunikwe amandla. Iziphumo zaqala ukuhluka ngokuthanda i-CBOR kwenye indawo ukusuka kwi-megabyte:

cborlen=1039673 tl_len=1095092

Kwaye ke, siphelo: Kukho iifomati ezilula kakhulu ezingekho phantsi kwengxaki yokungaphumeleli kongqamaniso okanye isichongi esingaziwayo, esinokuthelekiseka kakuhle.

Ukusekwa koqhagamshelwano olukhawulezayo. Oku kuthetha ukuba i-RTT ye-zero emva kokudibanisa kwakhona (xa isitshixo sele senziwe kanye) - esebenzayo ukusuka kumyalezo wokuqala weMTProto, kodwa ngokugcinwa okuthile - hit ityuwa efanayo, iseshoni ayiboli, njl. Isinika ntoni iTLS endaweni yoko? Caphula ngesihloko:

Xa usebenzisa i-PFS kwi-TLS, amatikiti eseshoni ye-TLS (RFC 5077) ukuqalisa kwakhona iseshoni efihliweyo ngaphandle kothethathethwano kwakhona nezitshixo kwaye ngaphandle kokugcina ulwazi olungundoqo kumncedisi. Xa uvula uxhulumaniso lokuqala kunye nokudala izitshixo, umncedisi ufihla imeko yoqhagamshelwano kwaye ayithumele kumxhasi (ngendlela yetikiti leseshoni). Ngokufanelekileyo, xa uxhulumaniso luqaliswa kwakhona, umxhasi uthumela itikiti leseshoni, kuquka iqhosha leseshoni, emva komncedisi. Itikiti ngokwalo liguqulelwe ngokuntsonkothileyo ngesitshixo sexeshana (iqhosha letikiti leseshoni), eligcinwe kumncedisi kwaye kufuneka lisasazwe phakathi kwabo bonke abancedisi abaphambili abaqhuba i-SSL kwizisombululo ezidibeneyo.[10]. Ke, ukwaziswa kwetikiti leseshoni kunokwaphula i-PFS ukuba izitshixo zeseva zethutyana zisengozini, umzekelo, xa zigcinwe ixesha elide (OpenSSL, nginx, Apache zigcine ngokungagqibekanga kulo lonke ixesha lenkqubo; sebenzisa iisayithi ezidumileyo. isitshixo iiyure ezininzi, ukuya kwiintsuku).

Apha i-RTT ayikho i-zero, kufuneka utshintshise ubuncinane i-ClientHello kunye ne-ServerHello, emva kokuba umxhasi angathumela idatha kunye noFinished. Kodwa apha kufuneka sikhumbule ukuba asinayo iWebhu, kunye neqela layo loqhagamshelo olusanda kuvulwa, kodwa isithunywa, uxhulumaniso oluhlala luhlala ixesha elide okanye elingaphantsi, izicelo ezimfutshane kumaphepha eWebhu - yonke into iphindwaphindwa. ngaphakathi. Oko kukuthi, kwamkelekile ukuba asidibananga necandelo likaloliwe elibi kakhulu.

Ulibele enye into? Bhala kwizimvo.

Iza kuqhubeka!

Kwinxalenye yesibini yolu luhlu lwezithuba asiyi kuqwalasela imiba yobugcisa, kodwa intlangano - iindlela, ingcamango, i-interface, isimo sengqondo kubasebenzisi, njl. Ngokusekwe, nangona kunjalo, kulwazi lobugcisa oluthiwe thaca apha.

Inxalenye yesithathu iya kuqhubeka nokuhlalutya icandelo lobugcisa / amava ophuhliso. Uya kufunda, ngakumbi:

  • ukuqhubeka kwe-pandemonium kunye neentlobo zeentlobo zeTL
  • izinto ezingaziwayo malunga namajelo kunye namaqela amakhulu
  • kutheni iingxoxo zimbi kunoluhlu
  • malunga ne-absolute vs isihlobo somyalezo ophendulayo
  • yintoni umahluko phakathi kwefoto kunye nomfanekiso
  • i-emoji iphazamisana njani nokubhaliweyo okukekeleyo

kunye nezinye iintonga! Hla umamele!

umthombo: www.habr.com

Yongeza izimvo