A’ càineadh protocol agus dòighean eagrachaidh Telegram. Pàirt 1, teicnigeach: eòlas air sgrìobhadh neach-dèiligidh bhon fhìor thoiseach - TL, MT

O chionn ghoirid, tha puist mu cho math ‘s a tha Telegram, cho sgoinneil agus cho eòlach sa tha na bràithrean Durov ann a bhith a’ togail shiostaman lìonraidh, msaa air tòiseachadh a ’nochdadh nas trice air Habré. Aig an aon àm, is e glè bheag de dhaoine a tha air am bogadh fhèin anns an inneal theicnigeach - aig a 'char as motha, bidh iad a' cleachdadh API Bot gu math sìmplidh (agus gu math eadar-dhealaichte bho MTProto) stèidhichte air JSON, agus mar as trice tha iad a 'gabhail ris air creidimh a h-uile moladh agus PR a tha timcheall an teachdaire. Cha mhòr bliadhna gu leth air ais, thòisich mo cho-obraiche aig Eshelon NGO Vasily (gu mì-fhortanach, chaidh a chunntas air Habré a dhubhadh às còmhla ris an dreach) a’ sgrìobhadh a neach-dèiligidh Telegram fhèin bhon toiseach ann am Perl, agus an dèidh sin thàinig ùghdar nan loidhnichean sin còmhla. Carson Perl, bidh cuid a’ faighneachd sa bhad? Leis gu bheil pròiseactan mar seo ann mu thràth ann an cànanan eile. Gu dearbh, chan e sin as coireach, dh’ fhaodadh cànan sam bith eile a bhith leabharlann deiseil, agus a rèir sin feumaidh an t-ùghdar a dhol fad na slighe bhon fhìor thoiseach. A bharrachd air an sin, tha cryptography na chùis earbsa, ach dearbhaich. Le toradh a tha ag amas air tèarainteachd, chan urrainn dhut dìreach a bhith an urra ri leabharlann deiseil bhon neach-dèanamh agus earbsa a chuir ann gu dall (ge-tà, is e seo cuspair airson an dàrna pàirt). Aig an àm seo, tha an leabharlann ag obair gu math aig an ìre “cuibheasach” (a ’leigeil leat iarrtasan API sam bith a dhèanamh).

Ach, cha bhi mòran cryptography no matamataigs anns an t-sreath phuist seo. Ach bidh mòran mion-fhiosrachadh teicnigeach eile agus bagaichean ailtireachd (cuideachd feumail dhaibhsan nach sgrìobh bhon toiseach, ach a chleachdas an leabharlann ann an cànan sam bith). Mar sin, b 'e am prìomh amas feuchainn ris an neach-dèiligidh a chuir an gnìomh bhon toiseach a rèir sgrìobhainnean oifigeil. Is e sin, gabhamaid ris gu bheil còd stòr teachdaichean oifigeil dùinte (a-rithist, anns an dàrna pàirt còmhdaichidh sinn nas mionaidiche cuspair gu bheil seo fìor a 'tachairt mar sin), ach, mar anns na seann làithean, mar eisimpleir, tha inbhe mar RFC - a bheil e comasach neach-dèiligidh a sgrìobhadh a rèir an t-sònrachadh a-mhàin, “gun a bhith a’ coimhead ”air a’ chòd stòr, biodh e oifigeil (Telegram Desktop, fòn-làimhe), neo Telethon neo-oifigeil?

Faclan-cinn:

Sgrìobhainnean... tha e ann, ceart? A bheil e fìor? ..

Thòisich pìosan notaichean airson an artaigil seo a chruinneachadh as t-samhradh an-uiridh. A h-uile turas seo air an làrach-lìn oifigeil https://core.telegram.org Bha na sgrìobhainnean aig Ìre 23, i.e. steigte an àiteigin ann an 2014 (cuimhnich, cha robh eadhon seanalan air ais an uairsin?). Gu dearbh, ann an teòiridh, bu chòir seo a bhith air leigeil leinn neach-dèiligidh le comas-gnìomh a chuir an gnìomh aig an àm sin ann an 2014. Ach eadhon anns an staid seo, bha na sgrìobhainnean, an toiseach, neo-choileanta, agus san dàrna àite, bha e an aghaidh a chèile ann an àiteachan. Dìreach beagan is mìos air ais, san t-Sultain 2019, bha e gu dona Chaidh a lorg gu robh ùrachadh mòr air na sgrìobhainnean air an làrach, airson an Layer 105 a bha gu math o chionn ghoirid, le nota gum feumar a h-uile dad a leughadh a-rithist. Gu dearbh, chaidh mòran artaigilean ath-sgrùdadh, ach dh’ fhan mòran gun atharrachadh. Mar sin, nuair a bhios tu a’ leughadh a’ chàineadh gu h-ìosal mu na sgrìobhainnean, bu chòir dhut cumail nad inntinn nach eil cuid de na rudan sin buntainneach tuilleadh, ach tha cuid fhathast gu math. Às deidh na h-uile, chan e a-mhàin ùine fhada a tha ann an 5 bliadhna ann an saoghal an latha an-diugh, ach cuideachd glè mhath Tòrr mòr. Bhon uairsin (gu sònraichte mura toir thu aire do na làraich geochat a chaidh a dhubhadh às agus ath-bheothachadh bhon uairsin), tha an àireamh de dhòighean API san sgeama air a dhol suas bho cheud gu còrr air dà cheud gu leth!

Càite an tòisich thu mar sgrìobhadair òg?

Chan eil e gu diofar a bheil thu a’ sgrìobhadh bhon toiseach no a’ cleachdadh, mar eisimpleir, leabharlannan deiseil mar Telethon airson python no Madeline airson php, ann an suidheachadh sam bith, feumaidh tu an toiseach clàraich an tagradh agad - faigh paramadairean api_id и api_hash (tuigidh an fheadhainn a tha air a bhith ag obair leis an VKontakte API sa bhad) leis an aithnich am frithealaiche an tagradh. Seo feumar dèan e airson adhbharan laghail, ach bruidhnidh sinn barrachd mu carson nach urrainn ùghdaran leabharlainn fhoillseachadh san dàrna pàirt. Is dòcha gu bheil thu riaraichte leis na luachan deuchainn, ged a tha iad gu math cuingealaichte - is e an fhìrinn gum faod thu a-nis clàradh ach a h-aon app, mar sin na dèan cabhag a-steach dha.

A-nis, bho thaobh teignigeach, bu chòir gum biodh ùidh againn anns an fhìrinn gum bu chòir dhuinn fiosan fhaighinn bho Telegram an dèidh clàradh mu ùrachaidhean gu sgrìobhainnean, protocol, msaa. Is e sin, dh'fhaodadh aon a bhith den bheachd gu robh an làrach leis na docaichean dìreach air a thrèigsinn agus a 'leantainn air adhart ag obair gu sònraichte leis an fheadhainn a thòisich a' dèanamh luchd-dèiligidh, oir tha e nas fhasa. Ach chan e, cha deach dad mar sin fhaicinn, cha tàinig fiosrachadh sam bith.

Agus ma sgrìobhas tu bhon toiseach, tha cleachdadh nam paramadairean a gheibhear fhathast fada air falbh. Ged a https://core.telegram.org/ agus a 'bruidhinn mun deidhinn ann an Toiseach tòiseachaidh an toiseach, gu dearbh, feumaidh tu an toiseach a chur an gnìomh Pròtacal MTProto — ach ma chreid thu cruth a rèir modail OSI aig deireadh na duilleige airson tuairisgeul coitcheann air a’ phròtacal, tha e gu tur dìomhain.

Gu dearbh, an dà chuid ro agus às deidh MTProto, air grunn ìrean aig an aon àm (mar a tha luchd-lìonraidh cèin a tha ag obair ann an kernel OS ag ràdh, briseadh còmhdach), gheibh cuspair mòr, goirt agus uamhasach air an t-slighe ...

Sreathachadh binary: TL (Type Language) agus an sgeama aige, agus sreathan, agus mòran fhaclan eagallach eile

Tha an cuspair seo, gu dearbh, na phrìomh dhòigh air duilgheadasan Telegram. Agus bidh tòrr fhaclan uamhasach ann ma dh'fheuchas tu ri sgrùdadh a dhèanamh air.

Mar sin, seo an diagram. Ma thig am facal so gu d' inntinn, abair, Sgeama JSON, Bha thu a' smaoineachadh gu ceart. Tha an t-amas mar an ceudna: beagan cànain airson cunntas a thoirt air seata dàta a dh’ fhaodadh a bhith air a chraoladh. Seo far a bheil na h-ionannachdan a’ tighinn gu crìch. Ma tha bhon duilleag Pròtacal MTProto, no bho chraobh stòr an neach-dèiligidh oifigeil, feuchaidh sinn ri beagan sgeama fhosgladh, chì sinn rudeigin mar:

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;

Bidh neach a tha a 'faicinn seo airson a' chiad uair comasach air aithneachadh gu h-intuitive ach pàirt de na tha sgrìobhte - uill, tha e coltach gur e structaran a tha seo (ged a tha an t-ainm, air an taobh chlì no air an làimh dheis?), Tha raointean annta, às deidh sin tha seòrsa a’ leantainn às deidh coloin... is dòcha. An seo eadar camagan ceàrn is dòcha gu bheil teamplaidean mar ann an C ++ (gu dearbh, chan eil gu dearbh). Agus dè tha na samhlaidhean eile a’ ciallachadh, comharran ceist, clisgeadh, ceudadan, comharran hash (agus gu follaiseach tha iad a’ ciallachadh diofar rudan ann an diofar àiteachan), uaireannan an làthair agus uaireannan nach eil, àireamhan sia-thaobhach - agus as cudromaiche buileach, ciamar a gheibh thu bho seo ceart (nach tèid a dhiùltadh leis an fhrithealaiche) sruth beithe? Feumaidh tu na sgrìobhainnean a leughadh (tha, tha ceanglaichean ris an sgeama ann an dreach JSON faisg air làimh - ach chan eil sin ga dhèanamh nas soilleire).

Fosgail an duilleag Serialization dàta binary agus dàibheadh ​​​​a-steach do shaoghal draoidheil balgan-buachair agus matamataig air leth, rudeigin coltach ri matan anns a’ 4mh bliadhna. Aibidil, seòrsa, luach, combinator, combinator gnìomh, cruth àbhaisteach, seòrsa co-dhèanta, seòrsa polymorphic ... agus sin uile dìreach a’ chiad duilleag! Tha an ath rud a’ feitheamh riut Cànan TL, a tha, ged a tha eisimpleir ann mu thràth de dh’ iarrtas agus freagairt bheag, nach eil a’ toirt seachad freagairt idir do chùisean nas àbhaistiche, a tha a’ ciallachadh gum feum thu coiseachd tro ath-aithris air matamataig air eadar-theangachadh bho Ruisis gu Beurla air ochd eile freumhaichte. duilleagan!

Bidh luchd-leughaidh a tha eòlach air cànanan gnìomh agus co-dhùnadh seòrsa fèin-ghluasadach, gu dearbh, a’ faicinn a ’chànan tuairisgeul sa chànan seo, eadhon bhon eisimpleir, mar a tha mòran nas eòlaiche, agus faodaidh iad a ràdh nach eil seo dona ann am prionnsapal. Is e na gearanan mu dheidhinn seo:

  • tha, an amas fuaim math, ach mo thruaighe, i nach deach a choileanadh
  • Tha foghlam aig oilthighean Ruiseanach ag atharrachadh eadhon am measg eòlaichean IT - chan eil a h-uile duine air an cùrsa co-fhreagarrach a ghabhail
  • Mu dheireadh, mar a chì sinn, ann an cleachdadh a tha e chan eil feum air, leis nach eil ach fo-sheata cuibhrichte de eadhon an TL a chaidh a mhìneachadh air a chleachdadh

Mar a thuirt LeonNairde air an t-sianal #perl ann an lìonra FreeNode IRC, a dh’ fheuch ri geata a chuir an gnìomh bho Telegram gu Matrix (tha eadar-theangachadh a ’chuòt mearachdach bhon chuimhne):

Tha e a’ faireachdainn gun deach cuideigin a thoirt a-steach do theòiridh seòrsa airson a’ chiad uair, air bhioran, agus air tòiseachadh a’ feuchainn ri cluich leis, gun a bhith a’ gabhail cùram an robh feum air ann an cleachdadh.

Faic dhut fhèin, mura h-eil an fheum air seòrsaichean lom (int, fada, msaa) mar rudeigin bunaiteach a’ togail cheistean - aig a’ cheann thall feumaidh iad a bhith air an cur an gnìomh le làimh - mar eisimpleir, feuch an dèan sinn oidhirp faighinn bhuapa. vectar. Is e sin, gu dearbh, raon, ma ghairmeas tu na nithean a thig às leis na h-ainmean ceart aca.

Ach roimhe

Tuairisgeul goirid air fo-sheata de cho-chòrdadh TL dhaibhsan nach leugh na sgrìobhainnean oifigeil

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;

Bidh mìneachadh an-còmhnaidh a’ tòiseachadh neach-togail, às deidh sin gu roghnach (ann an cleachdadh - an-còmhnaidh) tron ​​​​samhla # feumaidh iad a bhith CRC32 bhon t-sreath tuairisgeul àbhaisteach den t-seòrsa seo. An ath rud thig tuairisgeul air na raointean; ma tha iad ann, faodaidh an seòrsa a bhith falamh. Tha seo uile a 'crìochnachadh le soidhne co-ionnan, ainm an t-seòrsa ris a bheil an neach-togail seo - is e sin, gu dearbh, an subtype - a' buntainn. Tha am fear air taobh deas an t-soidhne equals polymorphic - is e sin, faodaidh grunn sheòrsachan sònraichte a bhith a 'freagairt ris.

Ma thachras am mìneachadh às deidh na loidhne ---functions---, an uairsin bidh an co-chòrdadh fhathast mar a tha e, ach bidh an ciall eadar-dhealaichte: bidh an neach-togail gu bhith na ainm air gnìomh RPC, bidh na raointean gu bhith nan crìochan (uill, is e sin, fuirichidh e dìreach mar an aon structar a chaidh a thoirt seachad, mar a tha air a mhìneachadh gu h-ìosal , is e seo dìreach an ciall ainmichte), agus an “seòrsa polymorphic” - an seòrsa toradh a chaidh a thilleadh. Fìor, bidh e fhathast polymorphic - dìreach air a mhìneachadh san roinn ---types---, ach cha tèid beachdachadh air an neach-togail seo. A’ luchdachadh cus de na seòrsaichean ghnìomhan ris an canar leis na h-argamaidean aca, i.e. Air adhbhar air choireigin, chan eilear a’ toirt seachad grunn ghnìomhan leis an aon ainm ach ainmean-sgrìobhte eadar-dhealaichte, mar ann an C ++, san TL.

Carson "constructor" agus "polymorphic" mura h-e OOP a th 'ann? Uill, gu dearbh, bidh e nas fhasa do chuideigin smaoineachadh mu dheidhinn seo ann an teirmean OOP - seòrsa polymorphic mar chlas eas-chruthach, agus is e luchd-togail na clasaichean sliochd dìreach aige, agus final ann am briathrachas grunn chànanan. Gu dearbh, gu dearbh, an seo a-mhàin coltachd le fìor dhòighean togail luchd-togail ann an cànanan prògramadh OO. Leis gur e dìreach structaran dàta a tha ann an seo, chan eil dòighean ann (ged a tha an tuairisgeul air gnìomhan agus modhan nas fhaide gu math comasach air troimh-chèile a chruthachadh sa cheann gu bheil iad ann, ach tha sin na chùis eadar-dhealaichte) - faodaidh tu smaoineachadh air neach-togail mar luach bho a tha ga thogail dèan seòrsa nuair a leughas tu sruth byte.

Ciamar a tha seo a’ tachairt? Bidh an deserializer, a bhios an-còmhnaidh a’ leughadh 4 bytes, a’ faicinn an luach 0xcrc32 - agus a 'tuigsinn dè a thachras a-rithist field1 le seòrsa int, i.e. a’ leughadh dìreach 4 bytes, air an seo an raon a bharrachd leis an t-seòrsa PolymorType leugh. A' faicinn 0x2crc32 agus a’ tuigsinn gu bheil dà raon nas fhaide, an toiseach long, a tha a’ ciallachadh gun leugh sinn 8 bytes. Agus an uairsin a-rithist seòrsa iom-fhillte, a tha air a dhì-dhealbhadh san aon dòigh. Mar eisimpleir, Type3 Dh'fhaodadh iad a bhith air an ainmeachadh anns a 'chuairt cho luath ri dà neach-togail, fa leth, feumaidh iad coinneachadh an dàrna cuid 0x12abcd34, às deidh sin feumaidh tu 4 bytes eile a leughadh int, no 0x6789cdef, an deigh sin cha bhi ni sam bith ann. Rud sam bith eile - feumaidh tu eisgeachd a thilgeil. Co-dhiù, às deidh seo thèid sinn air ais gu bhith a’ leughadh 4 bytes int achaidhean field_c в constructorTwo agus leis a sin tha sinn a' criochnachadh ar leughadh PolymorType.

Mu dheireadh, ma gheibh thu grèim ort 0xdeadcrc airson constructorThree, an uairsin bidh a h-uile dad nas iom-fhillte. Tha a 'chiad raon againn bit_flags_of_what_really_present le seòrsa # - gu dearbh, chan eil seo ach alias airson an t-seòrsa nat, a’ ciallachadh “àireamh nàdarra”. Is e sin, gu dearbh, is e int gun ainm, leis an t-slighe, an aon chùis nuair a bhios àireamhan gun ainm a’ nochdadh ann an cuairtean fìor. Mar sin, an ath rud tha togail le comharra ceist, a 'ciallachadh gu bheil an raon seo - bidh e an làthair air an uèir a-mhàin ma tha am pìos co-fhreagarrach air a shuidheachadh anns an raon air a bheil iomradh (mu thimcheall mar ghnìomhaiche ternary). Mar sin, gabhamaid gun deach am pìos seo a shuidheachadh, a tha a’ ciallachadh gum feum sinn tuilleadh a leughadh mar raon Type, anns a bheil 2 neach-togail san eisimpleir againn. Tha aon dhiubh falamh (chan eil ann ach an aithnichear), tha raon aig an fhear eile ids le seòrsa ids:Vector<long>.

Is dòcha gu bheil thu a’ smaoineachadh gu bheil an dà chuid teamplaidean agus generics anns na buannachdan no Java. Ach chan eil. Cha mhòr. Seo an aon fhear a-mhàin cùis a bhith a’ cleachdadh camagan ceàrn ann an cuairtean fìor, agus tha e air a chleachdadh A-MHÀIN airson Vector. Ann an sruth byte, bidh iad sin 4 CRC32 bytes airson an seòrsa Vector fhèin, an-còmhnaidh mar an ceudna, an uairsin 4 bytes - an àireamh de eileamaidean rèite, agus an uairsin na h-eileamaidean sin iad fhèin.

Cuir ris an seo gu bheil sreathachadh an-còmhnaidh a’ tachairt ann am faclan 4 bytes, tha a h-uile seòrsa nan iomadan dheth - thathas cuideachd a’ toirt cunntas air na seòrsaichean togte bytes и string le sreathadh làimhe den fhad agus an co-thaobhadh seo le 4 - uill, tha e coltach gu bheil e àbhaisteach agus eadhon gu ìre mhath èifeachdach? Ged a thathar ag ràdh gu bheil TL na shreathadh binary èifeachdach, gu ifrinn leotha, le leudachadh air cha mhòr rud sam bith, eadhon luachan Boolean agus sreangan aon-charactar gu 4 bytes, am bi JSON fhathast tòrr nas tiugh? Coimhead, faodar eadhon raointean neo-riatanach a sheachnadh le brataichean beaga, tha a h-uile dad gu math, agus eadhon leudachail airson an ama ri teachd, mar sin carson nach cuir thu raointean roghainneil ùra ris an neach-togail nas fhaide air adhart?

Ach chan e, mura leugh thu an tuairisgeul goirid agam, ach na sgrìobhainnean slàn, agus ma smaoinicheas tu air a’ bhuileachadh. An toiseach, tha CRC32 an neach-togail air a thomhas a rèir loidhne àbhaisteach tuairisgeul teacsa an sgeama (cuir air falbh àite geal a bharrachd, msaa) - mar sin ma thèid raon ùr a chuir ris, atharraichidh an loidhne tuairisgeul seòrsa, agus mar sin an CRC32 agus , mar thoradh air an sin, sreathachadh. Agus dè dhèanadh an seann neach-dèiligidh nam faigheadh ​​​​e raon le brataichean ùra, agus nach eil fios aige dè a nì e leotha an ath rud?..

San dàrna àite, cuimhnicheamaid CRC32, a tha air a chleachdadh an seo gu bunaiteach mar gnìomhan hash gus faighinn a-mach gu sònraichte dè an seòrsa a thathas a’ (de)sreathachadh. An seo tha sinn a 'toirt aghaidh air duilgheadas tubaistean - agus chan e, chan eil an coltachd aon ann an 232, ach mòran nas motha. Cò a chuimhnich gu bheil CRC32 air a dhealbhadh gus mearachdan a lorg (agus a cheartachadh) anns an t-sianal conaltraidh, agus a rèir sin a’ leasachadh nan togalaichean sin a’ dèanamh cron air càch? Mar eisimpleir, chan eil e gu diofar mu bhith ag ath-eagrachadh bytes: ma nì thu cunntas air CRC32 bho dhà loidhne, san dàrna fear bidh thu ag iomlaid a’ chiad 4 bytes leis na h-ath 4 bytes - bidh e mar an ceudna. Nuair a tha an cuir a-steach againn mar shreathan teacsa bhon aibideil Laideann (agus beagan puingeachadh), agus nach eil na h-ainmean sin gu sònraichte air thuaiream, tha an coltas gum bi ath-rèiteachadh mar sin a’ dol am meud gu mòr.

Co-dhiù, cò rinn sgrùdadh air dè bha ann? dha-rìribh CRC32? Bha gnìomh hash aig aon de na còdan tùsail (eadhon ro Waltman) a dh’ iomadachadh gach caractar leis an àireamh 239, cho measail leis na daoine sin, ha ha!

Mu dheireadh, ceart gu leòr, thuig sinn gu robh luchd-togail le seòrsa achaidh Vector<int> и Vector<PolymorType> bidh CRC32 eadar-dhealaichte aige. Dè mu dheidhinn coileanadh air-loidhne? Agus bho shealladh teòiridheach, a bheil seo gu bhith na phàirt den t-seòrsa? Canaidh sinn gun tèid sinn seachad air raon de dheich mìle àireamh, uill le Vector<int> tha a h-uile dad soilleir, an fhaid agus 40000 bytes eile. Agus ma tha seo Vector<Type2>, anns nach eil ach aon raon int agus tha e na aonar san t-seòrsa - am feum sinn ath-aithris 10000xabcdef0 34 tursan agus an uairsin 4 bytes int, air neo gu bheil a' chainnt comasach air a h-IOMPACHADH dhuinne o'n fhear-togail fixedVec agus an àite 80000 bytes, gluasad a-rithist dìreach 40000?

Chan e ceist teòiridheach seòlta a tha seo idir - smaoinich gum faigh thu liosta de luchd-cleachdaidh buidhne, aig a bheil id, ciad ainm, ainm mu dheireadh aig gach fear - faodaidh an diofar anns an uiread de dhàta a chaidh a ghluasad thairis air ceangal gluasadach a bhith cudromach. Is e dìreach èifeachdas sreathadh Telegram a tha air a shanasachadh dhuinn.

Mar sin…

Vector, nach deach a leigeil ma sgaoil

Ma dh'fheuchas tu ri coiseachd tro na duilleagan tuairisgeul air combinators agus mar sin air adhart, chì thu gu bheil vectar (agus eadhon matrix) a 'feuchainn gu foirmeil ri bhith air a thoirt a-mach tro thuples de ghrunn dhuilleagan. Ach aig a 'cheann thall bidh iad a' dìochuimhneachadh, tha an ceum mu dheireadh air a leum, agus tha mìneachadh air vectar air a thoirt seachad gu sìmplidh, nach eil fhathast ceangailte ri seòrsa. Dè tha ceàrr? Ann an cànanan prògramadh, gu h-àraidh feadhainn gnìomhach, tha e gu math àbhaisteach cunntas a thoirt air an structar gu ath-chuairteach - tuigidh an neach-cruinneachaidh le a mheasadh leisg agus nì e a h-uile dad fhèin. Ann an cànan sreathachadh dàta tha feum air ÈIFEACHDACHD: tha e gu leòr dìreach cunntas a thoirt liosta, i.e. structar dà eileamaid - tha a 'chiad fhear na eileamaid dàta, is e an dàrna fear an aon structar fhèin no àite falamh airson an earbaill (pasgan (cons) ann an Lisp). Ach bidh seo gu follaiseach a dhìth gach fear Bidh an eileamaid a’ cosg 4 bytes a bharrachd (CRC32 sa chùis ann an TL) gus cunntas a thoirt air an t-seòrsa aige. Faodar cunntas a thoirt air sreath gu furasta cuideachd meud stèidhichte, ach a thaobh sreath de dh'fhaid neo-aithnichte ro làimh, bidh sinn a 'briseadh dheth.

Mar sin, leis nach eil TL a’ ceadachadh vectar a chuir a-mach, dh’ fheumadh e a chuir ris air an taobh. Aig a’ cheann thall tha na sgrìobhainnean ag ràdh:

Bidh sreathachadh an-còmhnaidh a’ cleachdadh an aon “vector” constructor (const 0x1cb5c415 = crc32 (“vector t: Type # [ t ] = Vector t”) nach eil an urra ri luach sònraichte caochladair seòrsa t.

Chan eil luach am paramadair roghnach t an sàs anns an t-sreathachadh leis gu bheil e a’ tighinn bhon t-seòrsa toraidh (aithnichte an-còmhnaidh mus deach an deserialization).

Thoir sùil nas mionaidiche: vector {t:Type} # [ t ] = Vector t - ach àite sam bith Chan eil am mìneachadh seo fhèin ag ràdh gum feum a’ chiad àireamh a bhith co-ionann ri fad an vectar! Agus chan eil e a 'tighinn bho àite sam bith. Is e seo tabhartas a dh’ fheumar a chumail nad inntinn agus a chuir an gnìomh le do làmhan. An àite eile, tha na sgrìobhainnean eadhon gu h-onarach ag ràdh nach eil an seòrsa fìor:

Is e “seòrsa” a th’ ann am pseudotype polymorphic Vector t aig a bheil luach sreath de luachan de sheòrsa t, aon chuid ann am bogsa no lom.

... ach chan eil e ag amas air. Nuair a bhios tu, sgìth de bhith a’ coiseachd tro shìneadh matamataig (is dòcha eadhon aithnichte dhut bho chùrsa oilthigh), a’ co-dhùnadh leigeil seachad agus gu dearbh coimhead air mar a dh’ obraicheas tu leis ann an cleachdadh, is e a’ bheachd a tha air fhàgail nad cheann gu bheil seo Droch Matamataig aig cridhe, bha e gu soilleir a chruthachadh le Cool People (dithis neach-matamataig - buannaiche ACM), agus chan e dìreach duine sam bith. Tha an amas - a thaisbeanadh - air a choileanadh.

Co-dhiù, mun àireamh. Leig leinn sin a chuimhneachadh # tha e na cho-fhacal nat, àireamh nàdarra:

Tha abairtean seòrsa ann (seòrsa-expr) agus abairtean àireamhach (nat-expr). Ach, tha iad air an comharrachadh san aon dòigh.

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

ach anns a' ghràmar tha iad air an cur sios air an dòigh cheudna, i.e. Feumar an eadar-dhealachadh seo a chuimhneachadh a-rithist agus a chuir an gnìomh le làimh.

Uill, tha, seòrsaichean teamplaid (vector<int>, vector<User>) aig a bheil aithnichear cumanta (#1cb5c415), i.e. ma tha fios agad gu bheil a’ ghairm air ainmeachadh mar

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

an uairsin chan eil thu a’ feitheamh ri dìreach vectar, ach vectar luchd-cleachdaidh. Nas mionaidiche, bu chòir feitheamh - ann an còd fìor, bidh inneal-togail aig a h-uile eileamaid, mura h-eil seòrsa lom, agus ann an dòigh mhath ann an gnìomh bhiodh feum air sgrùdadh - ach chaidh ar cur gu dìreach anns a h-uile eileamaid den vectar seo seòrsa sin? Dè nam biodh e na sheòrsa de PHP, anns am faod diofar sheòrsan a bhith ann an diofar eileamaidean?

Aig an ìre seo tòisichidh tu a’ smaoineachadh - a bheil feum air TL mar sin? Is dòcha airson a’ chairt gum biodh e comasach sreathaiche daonna a chleachdadh, an aon protobuf a bha ann mu thràth an uairsin? B’ e sin an teòiridh, leig dhuinn sùil a thoirt air cleachdadh.

Gnìomhan TL a tha ann an-dràsta ann an còd

Rugadh TL ann an doimhneachd VKontakte eadhon ro na tachartasan ainmeil le reic cuibhreann Durov agus (gu deimhin), eadhon mus do thòisich leasachadh Telegram. Agus ann an stòr fosgailte còd stòr a’ chiad bhuileachadh gheibh thu tòrr crutches èibhinn. Agus chaidh an cànan fhèin a chur an gnìomh an sin nas coileanta na tha e a-nis ann an Telegram. Mar eisimpleir, chan eil hashes air a chleachdadh idir san sgeama (a’ ciallachadh pseudotype togte (mar vectar) le giùlan meallta). Air neo

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

ach thugamaid fainear, air son iomlanachd, a bhi 'lorg, mar a labhradh, mean-fhàs Famhair na Smuain.

#define ZHUKOV_BYTES_HACK

#ifdef ZHUKOV_BYTES_HACK

/* dirty hack for Zhukov request */

No am fear àlainn seo:

    static const char *reserved_words_polymorhic[] = {

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

      };

Tha am pìos seo mu dheidhinn teamplaidean mar:

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

Is e seo am mìneachadh air seòrsa teamplaid hashmap mar vectar de int - Seòrsa càraidean. Ann an C ++ bhiodh e a’ coimhead rudeigin mar seo:

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

mar sin, alpha - prìomh-fhacal! Ach dìreach ann an C ++ an urrainn dhut T a sgrìobhadh, ach bu chòir dhut alpha, beta a sgrìobhadh ... Tha e coltach gun do thachair cuid de chòmhraidhean mar seo aon uair ann an St.

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

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

Ach bha seo mu dheidhinn a’ chiad fhoillseachadh fhoillseachadh de TL “san fharsaingeachd”. Gluaisidh sinn air adhart gu bhith a’ beachdachadh air buileachadh anns na teachdaichean Telegram fhèin.

Facal gu Vasily:

Vasily, [09.10.18 17:07] Nas cudromaiche buileach, tha an asal teth oir chruthaich iad dòrlach de tharraingean, agus an uairsin chuir iad òrd orra, agus chòmhdaich iad gineadair a’ chòd le crutches
Mar thoradh air an sin, an toiseach bho dock pilot.jpg
An uairsin bhon chòd dzhekichan.webp

Gu dearbh, bho dhaoine a tha eòlach air algorithms agus matamataig, faodaidh sinn a bhith an dùil gu bheil iad air Aho, Ullmann a leughadh, agus gu bheil iad eòlach air na h-innealan a thàinig gu bhith nan inbhe de facto sa ghnìomhachas thar nan deicheadan airson a bhith a’ sgrìobhadh an luchd-cruinneachaidh DSL, ceart?..

Le bhith teileagram-cli is Vitaly Valtman, mar a thuigeas tu bho bhith a’ nochdadh cruth TLO taobh a-muigh a chrìochan (cli), ball den sgioba - a-nis tha leabharlann airson parsadh TL air a riarachadh air leth, ciod an sealladh a th' oirre TL parser? ..

16.12 04:18 Vasily: Tha mi a’ smaoineachadh nach do rinn cuideigin maighstireachd lex + yacc
16.12 04:18 Vasily: Chan urrainn dhomh a mhìneachadh a chaochladh
16.12 04:18 Vasily: uill, no chaidh am pàigheadh ​​​​airson an àireamh de loidhnichean ann an VK
16.12 04:19 Vasily: 3k+ loidhnichean msaa<censored> an àite parser

Is dòcha eisgeachd? Chì sinn ciamar a ’dèanamh Is e seo an neach-dèiligidh OIFIGEIL - Telegram Desktop:

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

1100+ loidhnichean ann am Python, abairt no dhà cunbhalach + cùisean sònraichte mar vectar, a tha, gu dearbh, air ainmeachadh san sgeama mar a bu chòir a bhith a rèir co-chòrdadh TL, ach bha iad an urra ris a’ cho-chòrdadh seo airson a pharsadh... Tha a’ cheist ag èirigh, carson a bha e uile na mhìorbhail?иTha e nas sreathach mura h-eil duine gu bhith ga pharsadh a rèir nan sgrìobhainnean co-dhiù?!

Co-dhiù... Cuimhnich gun do bhruidhinn sinn mu dheidhinn sgrùdadh CRC32? Mar sin, ann an gineadair còd Telegram Desktop tha liosta eisgeachdan airson na seòrsaichean sin anns a bheil an CRC32 air a thomhas nach eil a ’maidseadh leis an fhear a tha air a chomharrachadh san diagram!

Vasily, [18.12/22 49:XNUMX] agus an seo bhithinn a’ smaoineachadh a bheil feum air leithid de TL
nam biodh mi airson bùrach a dhèanamh le buileachadh eile, thòisicheadh ​​​​mi air briseadh loidhne a chuir a-steach, brisidh leth de na parsers air mìneachaidhean ioma-loidhne
tdesktop, ge-tà, cuideachd

Cuimhnich air a 'phuing mu dheidhinn aon-loidhne, tillidh sinn thuige beagan nas fhaide air adhart.

Gu ceart, tha telegram-cli neo-oifigeil, tha Telegram Desktop oifigeil, ach dè mu dheidhinn an fheadhainn eile? Cò aig a tha fios?.. Ann an còd teachdaiche Android cha robh parser sgeama ann idir (a thogas ceistean mu stòr fosgailte, ach tha seo airson an dàrna pàirt), ach bha grunn phìosan còd èibhinn eile ann, ach barrachd orra san fo-earrann gu h-ìosal.

Dè na ceistean eile a bhios sreathachadh a’ togail ann an cleachdadh? Mar eisimpleir, rinn iad tòrr rudan, gu dearbh, le raointean beaga agus raointean cumhach:

Vasily: flags.0? true
a 'ciallachadh gu bheil an raon an làthair agus co-ionann fìor ma tha am bratach air a shuidheachadh

Vasily: flags.1? int
a 'ciallachadh gu bheil an raon an làthair agus feumar a dhì-shreathachadh

Vasily: Ass, na gabh dragh mu na tha thu a 'dèanamh!
Vasily: Tha iomradh ann an àiteigin anns an doc gur e fìor sheòrsa fad neoni a th’ ann, ach gu bheil e do-dhèanta rud sam bith a chruinneachadh bhon doc aca
Vasily: Anns na gnìomhan stòr fosgailte chan eil seo fìor nas motha, ach tha dòrlach de luchd-brathaidh agus taic ann

Dè mu dheidhinn Telethon? A 'coimhead air adhart ris a' chuspair MTProto, eisimpleir - anns na sgrìobhainnean tha pìosan mar sin, ach an soidhne % tha e air a mhìneachadh a-mhàin mar “a’ freagairt ri seòrsa lom sònraichte”, i.e. anns na h-eisimpleirean gu h-ìosal tha mearachd no rudeigin gun sgrìobhainn:

Vasily, [22.06.18 18:38] Ann an aon àite:

msg_container#73f1f8dc messages:vector message = MessageContainer;

Ann an dòigh eile:

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

Agus is e dà eadar-dhealachadh mòr a tha seo, ann am fìor bheatha thig seòrsa de vectar rùisgte

Chan fhaca mi mìneachadh lom vector agus chan eil mi air tighinn tarsainn air aon

Tha mion-sgrùdadh air a sgrìobhadh le làimh ann an telethon

Anns an diagram aige tha am mìneachadh air a mhìneachadh msg_container

A-rithist, tha a 'cheist fhathast mu %. Chan eil e air a mhìneachadh.

Vadim Goncharov, [22.06.18 19:22] agus ann an tdesktop?

Vasily, [22.06.18 19:23] Ach is dòcha nach ith am parser TL aca air einnseanan cunbhalach seo nas motha

// parsed manually

Tha TL na tharraing bhrèagha, chan eil duine ga chuir an gnìomh gu tur

Agus chan eil % anns an dreach aca den sgeama

Ach an seo tha na sgrìobhainnean a’ dol an aghaidh a chèile, mar sin idk

Chaidh a lorg anns a 'ghràmar, dh' fhaodadh iad a bhith dìreach air dìochuimhneachadh cunntas a thoirt air semantics

Chunnaic thu an sgrìobhainn air TL, chan urrainn dhut obrachadh a-mach às aonais leth-liotair

“Uill, canaidh,” canaidh leughadair eile, “tha thu a’ càineadh rudeigin, agus mar sin seall dhomh ciamar a bu chòir a dhèanamh.”

Fhreagair Vasily: “A thaobh a’ pharser, is toil leam rudan mar

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

dòigh air choireigin nas fheàrr na

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

no

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

seo an lexer UILE:

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

iadsan. tha e nas sìmplidh a chuir gu socair.”

San fharsaingeachd, mar thoradh air an sin, bidh am parser agus an gineadair còd airson an fho-sheata de TL a chaidh a chleachdadh gu fìrinneach a’ freagairt air timcheall air 100 loidhne de ghràmar agus ~ 300 loidhne den ghineadair (a’ cunntadh a h-uile càil). print's còd gineadh), a’ toirt a-steach seòrsa de bhunan fiosrachaidh airson introspection anns gach clas. Bidh gach seòrsa polymorphic a’ tionndadh gu bhith na chlas bunaiteach eas-chruthach falamh, agus bidh luchd-togail a ’sealbhachadh bhuaithe agus tha dòighean aca airson sreathachadh agus dì-shreathachadh.

Dìth sheòrsan anns a’ chànan seòrsa

Tha sgrìobhadh làidir na rud math, ceart? Chan e, chan e holivar a tha seo (ged is fheàrr leam cànanan fiùghantach), ach postulate taobh a-staigh frèam TL. Stèidhichte air, bu chòir don chànan a h-uile seòrsa seic a thoirt dhuinn. Uill, ceart gu leòr, is dòcha nach e e fhèin a th 'ann, ach am buileachadh, ach bu chòir dha innse dhaibh co-dhiù. Agus dè an seòrsa chothroman a tha sinn ag iarraidh?

An toiseach, cuingealachaidhean. An seo chì sinn anns na sgrìobhainnean airson luchdachadh suas faidhlichean:

Tha susbaint dà-chànanach an fhaidhle an uairsin air a roinn ann am pàirtean. Feumaidh an aon mheud a bhith aig gach pàirt ( pàirt_meud ) agus feumar na cumhaichean a leanas a choileanadh:

  • part_size % 1024 = 0 (sgaraichte le 1KB)
  • 524288 % part_size = 0 (Feumaidh 512KB a bhith air a sgaradh gu cothromach le part_size)

Chan fheum am pàirt mu dheireadh na cumhaichean sin a choileanadh, cho fad ‘s a tha a mheud nas lugha na pàirt_size.

Bu chòir àireamh sreath a bhith aig gach pàirt, faidhle_pàirt, le luach eadar 0 agus 2,999.

Às deidh dhut am faidhle a sgaradh feumaidh tu dòigh a thaghadh airson a shàbhaladh air an fhrithealaiche. Cleachd upload.saveBigFilePart air eagal gu bheil meud iomlan an fhaidhle nas motha na 10 MB agus upload.saveFilePart airson faidhlichean nas lugha.
[…] faodar aon de na mearachdan cuir a-steach dàta a leanas a thilleadh:

  • FILE_PARTS_INVALID — Àireamh mì-dhligheach de phàirtean. Chan eil an luach eadar 1..3000

A bheil gin de seo anns an diagram? A bheil seo air a chuir an cèill ann an dòigh air choreigin a’ cleachdadh TL? Chan eil. Ach gabh mo leisgeul, bha eadhon Turbo Pascal aig seanair comasach air cunntas a thoirt air na seòrsaichean a chaidh a shònrachadh raointean. Agus bha fios aige air aon rud eile, ris an canar a-nis nas fheàrr enum - seòrsa anns a bheil àireamhachadh de àireamh stèidhichte (beag) de luachan. Ann an cànanan mar C - àireamhach, thoir an aire nach eil sinn air bruidhinn ach mu dheidhinn seòrsaichean gu ruige seo àireamhan. Ach tha arrays, sreangan ann cuideachd ... mar eisimpleir, bhiodh e math innse nach urrainn ach àireamh fòn a bhith anns an t-sreang seo, ceart?

Chan eil gin de seo san TL. Ach tha, mar eisimpleir, ann an sgeama JSON. Agus ma dh’ fhaodadh cuideigin eile argamaid a dhèanamh mu sgaradh 512 KB, gum feumar seo a sgrùdadh fhathast ann an còd, dèan cinnteach gu bheil an neach-dèiligidh dìreach Cha b ’urrainn dhomh cuir àireamh a-mach à raon 1..3000 (agus cha b’ urrainn don mhearachd co-fhreagarrach a bhith air èirigh) bhiodh e air a bhith comasach, ceart? ..

Co-dhiù, mu mhearachdan agus luachan tilleadh. Bidh eadhon an fheadhainn a tha air a bhith ag obair le TL a’ deàrrsadh an sùilean - cha do nochd e sa bhad oirnn sin gach fear faodaidh gnìomh ann an TL tilleadh chan e a-mhàin an seòrsa tilleadh a chaidh a mhìneachadh, ach cuideachd mearachd. Ach chan urrainnear seo a thoirt a-mach ann an dòigh sam bith a’ cleachdadh an TL fhèin. Gu dearbh, tha e mar-thà soilleir agus chan eil feum air rud sam bith ann an cleachdadh (ged gu dearbh, RPC faodar a dhèanamh ann an diofar dhòighean, bidh sinn a 'tilleadh gu seo nas fhaide air adhart) - ach dè mu dheidhinn an Purity de na bun-bheachdan Matamataig Seòrsan Abstract bhon t-saoghal nèamhaidh?.. Thog mi an tughadh - mar sin maids e.

Agus mu dheireadh, dè mu dheidhinn leughadh? Uill, an sin, san fharsaingeachd, bu mhath leam Tuairisgeul a bheil e ceart san sgeama (ann an sgeama JSON, a-rithist, tha e), ach ma tha thu air do shàrachadh leis mu thràth, dè mu dheidhinn an taobh phractaigeach - co-dhiù gu h-obann a’ coimhead air diffs rè ùrachaidhean? Faic dhut fhèin aig eisimpleirean fìor:

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

no

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

Tha e an urra ris a h-uile duine, ach tha GitHub, mar eisimpleir, a’ diùltadh cuideam a chuir air atharrachaidhean taobh a-staigh nan loidhnichean fada sin. Is e an geama “lorg 10 eadar-dhealachaidhean”, agus is e na tha an eanchainn a’ faicinn sa bhad gu bheil na tùsan agus na crìochnachaidhean anns an dà eisimpleir mar an ceudna, feumaidh tu a bhith a’ leughadh gu sgiobalta am badeigin sa mheadhan... Nam bheachd-sa, chan eil seo dìreach ann an teòiridh, ach a dh'aon sealladh salach agus salach.

Co-dhiù, mu dheidhinn purity an teòiridh. Carson a tha feum againn air raointean beaga? Chan eil e coltach gu bheil iad pachnut dona bho shealladh teòiridh seòrsa? Chithear am mìneachadh ann an dreachan nas tràithe den diagram. An toiseach, tha, is ann mar sin a bha e, airson a h-uile sreothartaich chaidh seòrsa ùr a chruthachadh. Tha na bun-bheachdan sin fhathast san fhoirm seo, mar eisimpleir:

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;

Ach a-nis smaoinich, ma tha 5 raointean roghainneil san structar agad, feumaidh tu 32 seòrsa airson a h-uile roghainn a tha comasach. spreadhadh combinatorial. Mar sin, bhris purrachd criostail teòiridh TL a-rithist an-aghaidh asal iarann-teine ​​​​fìrinn chruaidh sreathachadh.

A bharrachd air an sin, ann an cuid de dh'àiteachan tha na daoine sin iad fhèin a 'briseadh an clò-sgrìobhaidh aca fhèin. Mar eisimpleir, ann am MTProto (an ath chaibideil) faodaidh an fhreagairt a bhith air a dhlùthadh le Gzip, tha a h-uile dad gu math - ach a-mhàin gu bheil na sreathan agus an cuairteachadh air am briseadh. A-rithist, cha b’ e RpcResult fhèin a chaidh a bhuain, ach na bha ann. Uill, carson a nì mi seo?.. B' fheudar dhomh gearradh a-steach do chrutch gus an obraicheadh ​​​​an teannachadh an àite sam bith.

No eisimpleir eile, lorg sinn mearachd aon uair - chaidh a chuir InputPeerUser an àite InputUser. No a chaochladh. Ach dh'obraich e! Is e sin, cha robh dragh aig an fhrithealaiche mun t-seòrsa. Ciamar a dh'fhaodas seo a bhith? Faodar am freagairt a thoirt dhuinn le criomagan còd bho telegram-cli:

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

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

Ann am faclan eile, seo far a bheil sreathachadh air a dhèanamh LAOIDH, gun chòd air a chruthachadh! Is dòcha gu bheil am frithealaiche air a chuir an gnìomh san aon dòigh?.. Ann am prionnsapal, obraichidh seo ma thèid a dhèanamh aon uair, ach ciamar a gheibh e taic nas fhaide air adhart rè ùrachaidhean? An ann air sgàth sin a chaidh an sgeama a chruthachadh? Agus an seo gluaisidh sinn air adhart chun ath cheist.

Tionndadh. Sreathan

Chan urrainnear beachdachadh air carson a chanar sreathan ris na dreachan sgeamach ach stèidhichte air eachdraidh sgeamaichean foillsichte. A rèir choltais, an toiseach bha na h-ùghdaran den bheachd gun gabhadh rudan bunaiteach a dhèanamh a’ cleachdadh an sgeama gun atharrachadh, agus dìreach far a bheil sin riatanach, airson iarrtasan sònraichte, a’ nochdadh gun robhas gan dèanamh a’ cleachdadh dreach eile. Ann am prionnsabal, eadhon deagh bheachd - agus bidh am fear ùr, mar gum biodh, "measgaichte", air a chòmhdach air mullach an t-seann. Ach chì sinn mar a chaidh a dhèanamh. Fìor, cha b 'urrainn dhomh coimhead air bhon fhìor thoiseach - tha e èibhinn, ach chan eil an diagram den t-sreath bunaiteach ann. Thòisich sreathan le 2. Tha na sgrìobhainnean ag innse dhuinn mu fheart sònraichte TL:

Ma tha neach-dèiligidh a’ toirt taic do Sreath 2, feumar an neach-togail a leanas a chleachdadh:

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

Ann an cleachdadh, tha seo a’ ciallachadh, ro gach gairm API, int leis an luach 0x289dd1f6 feumar a chur ris ron àireamh modh.

Fuaimean àbhaisteach. Ach dè thachair an ath rud? An uairsin nochd

invokeWithLayer3#b7475268 query:!X = X;

Mar sin dè an ath rud? Mar a shaoileadh tu,

invokeWithLayer4#dea0d430 query:!X = X;

èibhinn? Chan e, tha e ro thràth airson gàire a dhèanamh, smaoinich air an fhìrinn gu bheil gach fear feumaidh iarrtas bho shreath eile a bhith air a phasgadh ann an seòrsa sònraichte - ma tha iad uile eadar-dhealaichte dhutsa, ciamar eile a dh 'aithnicheas tu iad? Agus is e dòigh gu math èifeachdach a th’ ann a bhith a’ cur dìreach 4 bytes air beulaibh. Mar sin,

invokeWithLayer5#417a57ae query:!X = X;

Ach tha e follaiseach gum bi seo na sheòrsa de bacchanalia às deidh ùine. Agus thàinig am fuasgladh:

Ùrachadh: A’ tòiseachadh le Sreath 9, dòighean cuideachaidh invokeWithLayerN faodar a chleachdadh a-mhàin còmhla ri initConnection

Hooray! Às deidh 9 dreachan, thàinig sinn mu dheireadh gu na chaidh a dhèanamh ann am protocols eadar-lìn air ais anns na 80n - ag aontachadh air an dreach aon uair aig toiseach a ’cheangail!

Mar sin dè an ath rud? ..

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

Ach a-nis faodaidh tu fhathast gàire a dhèanamh. Is ann dìreach às deidh 9 sreathan eile, chaidh neach-togail uile-choitcheann le àireamh dreach a chuir ris mu dheireadh, nach fheumar a ghairm ach aon turas aig toiseach a ’cheangail, agus bha coltas gu robh brìgh nan sreathan air a dhol à bith, a-nis chan eil ann ach dreach le cumhachan, mar anns gach àite eile. Duilgheadas air fhuasgladh.

Dìreach?..

Vasily, [16.07.18 14:01] Fiù ‘s air Dihaoine bha mi a’ smaoineachadh:
Bidh an teleserver a’ cur thachartasan gun iarrtas. Feumaidh iarrtasan a bhith air am pasgadh ann an InvokeWithLayer. Cha bhith am frithealaiche a’ cuairteachadh ùrachaidhean; chan eil structar ann airson freagairtean is ùrachaidhean a phasgadh.

An fheadhainn sin. chan urrainn don neach-dèiligidh an ìre anns a bheil e ag iarraidh ùrachaidhean a shònrachadh

Vadim Goncharov, [16.07.18 14:02] nach e InvokeWithLayer crutch ann am prionnsapal?

Vasily, [16.07.18 14:02] 'S e seo an aon dòigh

Vadim Goncharov, [16.07.18 14:02] a bu chòir gu bunaiteach a bhith a’ ciallachadh aontachadh air an ìre aig toiseach an t-seisein

Co-dhiù, tha e a’ leantainn nach eil ìsleachadh teachdaiche air a thoirt seachad

Ùrachaidhean, i.e. seòrsa Updates san sgeama, is e seo a bhios an frithealaiche a’ cur chun neach-dèiligidh chan ann mar fhreagairt air iarrtas API, ach gu neo-eisimeileach nuair a thachras tachartas. Is e cuspair iom-fhillte a tha seo a thèid a dheasbad ann am post eile, ach airson a-nis tha e cudromach fios a bhith agad gu bheil am frithealaiche a’ sàbhaladh ùrachaidhean eadhon nuair a tha an neach-dèiligidh far-loidhne.

Mar sin, ma dhiùltas tu pasgadh gach fear pasgan gus an dreach aige a chomharrachadh, tha seo gu loidsigeach a’ leantainn gu na duilgheadasan a leanas a dh’ fhaodadh a bhith ann:

  • bidh am frithealaiche a’ cur ùrachaidhean chun neach-dèiligidh eadhon mus innis an neach-dèiligidh dè an dreach a tha e a’ toirt taic
  • Dè bu chòir dhomh a dhèanamh às deidh dhomh an neach-ceannach ùrachadh?
  • barrantasannach atharraich beachd an fhrithealaiche mu àireamh an t-sreatha tron ​​phròiseas?

A bheil thu a’ smaoineachadh gur e prothaideachadh teòiridheach a-mhàin a tha seo, agus ann an cleachdadh chan urrainn seo tachairt, leis gu bheil am frithealaiche sgrìobhte gu ceart (co-dhiù, tha e air a dhearbhadh gu math)? Ha! Ge bith ciamar a tha e!

Is e seo dìreach a ruith sinn a-steach san Lùnastal. Air 14 Lùnastal, bha teachdaireachdan ann gu robh rudeigin ga ùrachadh air na frithealaichean Telegram ... agus an uairsin anns na logaichean:

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.

agus an uairsin grunn megabytes de lorgan stac (uill, aig an aon àm chaidh an logadh a shuidheachadh). Às deidh na h-uile, mura h-eil rudeigin air aithneachadh anns an TL agad, tha e dà-chànanach le ainm-sgrìobhte, nas fhaide sìos an loidhne UILE falbh, bidh dì-chòdachadh gu bhith eu-comasach. Dè bu chòir dhut a dhèanamh ann an suidheachadh mar sin?

Uill, is e a’ chiad rud a thig gu inntinn neach sam bith a bhith a’ dì-cheangal agus feuchainn a-rithist. Cha do chuidich. Rinn sinn google CRC32 - thionndaidh iad sin gu bhith nan nithean bho sgeama 73, ged a bha sinn ag obair air 82. Bidh sinn a’ coimhead gu faiceallach air na logaichean - tha aithnichearan ann bho dhà sgeama eadar-dhealaichte!

Is dòcha gu bheil an duilgheadas dìreach anns an neach-dèiligidh neo-oifigeil againn? Chan e, bidh sinn a’ cur air bhog Telegram Desktop 1.2.17 (dreach air a sholarachadh ann an grunn sgaoilidhean Linux), bidh e a’ sgrìobhadh chun loga eisgeachd: MTP Seòrsa id ris nach robh dùil # b5223b0f air a leughadh ann am MTPMessageMedia…

A’ càineadh protocol agus dòighean eagrachaidh Telegram. Pàirt 1, teicnigeach: eòlas air sgrìobhadh neach-dèiligidh bhon fhìor thoiseach - TL, MT

Sheall Google gu robh duilgheadas coltach ris air tachairt mar-thà do aon de na teachdaichean neo-oifigeil, ach an uairsin bha àireamhan an tionndaidh agus, a rèir sin, bha na barailean eadar-dhealaichte ...

Mar sin dè a bu chòir dhuinn a dhèanamh? Dhealaich Vasily agus mise: dh’ fheuch e ris a’ chuairt ùrachadh gu 91, chuir mi romham feitheamh beagan làithean agus feuchainn air 73. Dh’obraich an dà dhòigh, ach leis gu bheil iad empirigeach, chan eil tuigse sam bith ann air cia mheud dreach suas no sìos a dh’ fheumas tu. leum, no dè cho fada 'sa dh'fheumas tu feitheamh.

Nas fhaide air adhart bha e comasach dhomh an suidheachadh ath-riochdachadh: bidh sinn a ’cur air bhog an neach-dèiligidh, ga thionndadh dheth, ag ath-chruinneachadh a’ chuairt gu ìre eile, ag ath-thòiseachadh, a ’glacadh an duilgheadas a-rithist, a’ tilleadh chun fhear roimhe - oops, gun tomhas de thionndadh cuairteachaidh agus ag ath-thòiseachadh teachdaiche airson a cuidichidh beagan mhionaidean. Gheibh thu measgachadh de structaran dàta bho dhiofar shreathan.

Mìneachadh? Mar a shaoileadh tu bho dhiofar chomharran neo-dhìreach, tha an t-seirbheisiche air a dhèanamh suas de iomadh pròiseas de dhiofar seòrsa air diofar innealan. Nas coltaiche, chuir am frithealaiche a tha an urra ri “buffering” a-steach don ciudha na thug na h-àrd-oifigearan e, agus thug iad e san sgeama a bha na àite aig àm a ’ghinealaich. Agus gus an robh an ciudha “grodadh” seo, cha b’ urrainn dad a dhèanamh mu dheidhinn.

Is dòcha... ach is e cnap uamhasach a tha seo?!.. Chan e, mus smaoinich sinn air beachdan seòlta, leig dhuinn sùil a thoirt air còd an luchd-dèiligidh oifigeil. Anns an dreach Android chan eil sinn a’ lorg parser TL sam bith, ach lorgaidh sinn faidhle hefty (tha GitHub a’ diùltadh suathadh ris) le (de) serialization. Seo na criomagan còd:

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;

no

    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... a' coimhead fiadhaich. Ach, is dòcha, is e còd gineadh a tha seo, an uairsin ceart gu leòr?.. Ach gu cinnteach tha e a’ toirt taic do gach dreach! Fìor, chan eil e soilleir carson a tha a h-uile càil measgaichte, còmhraidhean dìomhair, agus a h-uile seòrsa de _old7 dòigh air choireigin chan eil thu a’ coimhead coltach ri gineadh innealan... Ach, gu ìre mhòr bha mi air mo sguabadh air falbh

TL_message_layer104
TL_message_layer104_2
TL_message_layer104_3

Guys, nach urrainn dhut eadhon co-dhùnadh dè a tha taobh a-staigh aon shreath?! Uill, ceart gu leòr, canaidh sinn “dithis” air an leigeil ma sgaoil le mearachd, uill, tha e a’ tachairt, ach TRÌ?.. Anns a’ bhad, an aon ràcan a-rithist? Dè an seòrsa pornagraf a tha seo, duilich?..

Ann an còd stòr Telegram Desktop, co-dhiù, tha an aon rud a’ tachairt - ma tha, cha bhith grunn a’ gealltainn ann an sreath ris an sgeama ag atharrachadh an àireamh còmhdach aca, ach a’ càradh rudeigin. Ann an suidheachaidhean far nach eil stòr dàta oifigeil ann airson an sgeama, cò às a gheibhear e, ach a-mhàin còd stòr an neach-dèiligidh oifigeil? Agus ma bheir thu às an sin e, chan urrainn dhut a bhith cinnteach gu bheil an sgeama gu tur ceart gus an dèan thu deuchainn air a h-uile modh.

Ciamar as urrainn seo eadhon a dhearbhadh? Tha mi an dòchas gun roinn luchd-leantainn deuchainnean aonad, gnìomh agus eile anns na beachdan.

Ceart gu leòr, leig dhuinn sùil a thoirt air pìos còd eile:

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;

Tha am beachd seo “air a chruthachadh le làimh” a’ nochdadh nach deach ach pàirt den fhaidhle seo a sgrìobhadh le làimh (an urrainn dhut smaoineachadh air trom-laighe cumail suas gu lèir?), Agus chaidh an còrr a chruthachadh le inneal. Ach, an uairsin tha ceist eile ag èirigh - gu bheil na stòran rim faighinn chan eil gu tur (a la GPL blobs anns an kernel Linux), ach tha seo mar-thà na chuspair airson an dàrna pàirt.

Ach gu leòr. Gluaisidh sinn air adhart chun phròtacal air a bheil a h-uile sreathachadh seo a 'ruith.

MT Proto

Mar sin, leig leinn fosgladh tuairisgeul coitcheann и tuairisgeul mionaideach air a’ phròtacal agus is e a' cheud ni air an teid sinn thairis am briathrachas. Agus le pailteas de gach nì. San fharsaingeachd, tha e coltach gu bheil seo na fheart seilbh de Telegram - a ’gairm rudan ann an dòigh eadar-dhealaichte ann an diofar àiteachan, no diofar rudan le aon fhacal, no a chaochladh (mar eisimpleir, ann an API àrd-ìre, ma chì thu pasgan stiogair, chan eil na bha thu a’ smaoineachadh).

Mar eisimpleir, tha “teachdaireachd” agus “seisean” a’ ciallachadh rudeigin eadar-dhealaichte an seo seach ann an eadar-aghaidh àbhaisteach teachdaiche Telegram. Uill, tha a h-uile dad soilleir leis an teachdaireachd, dh ’fhaodadh e a bhith air a mhìneachadh ann an teirmean OOP, no dìreach ris an canar“ pacaid ”- is e ìre còmhdhail ìosal a tha seo, chan eil na h-aon teachdaireachdan ann ris an eadar-aghaidh, tha mòran teachdaireachdan seirbheis ann . Ach an seisean... ach a' chiad rud an-toiseach.

còmhdach còmhdhail

Is e còmhdhail a’ chiad rud. Innsidh iad dhuinn mu 5 roghainnean:

  • TCP
  • Socaid-lìn
  • Websocket thairis air HTTPS
  • HTTP
  • https

Vasily, [15.06.18 15:04] Tha còmhdhail UDP ann cuideachd, ach chan eil e clàraichte

Agus TCP ann an trì atharrachaidhean

Tha a 'chiad fhear coltach ri UDP thairis air TCP, tha gach pasgan a' toirt a-steach àireamh sreath agus crc
Carson a tha leughadh sgrìobhainnean air cairt cho goirt?

Uill, sin e a-nis TCP mu thràth ann an 4 tionndaidhean:

  • Giorrachadh
  • Eadar-mheadhanach
  • Padded eadar-mheadhanach
  • Full

Uill, ceart gu leòr, Padded intermediate airson MTProxy, chaidh seo a chuir ris nas fhaide air adhart air sgàth tachartasan ainmeil. Ach carson a tha dà dhreach eile (trì gu h-iomlan) nuair a gheibheadh ​​tu seachad le aon? Tha na ceithir gu bunaiteach eadar-dhealaichte dìreach a thaobh mar a shuidhicheas iad fad agus uallach pàighidh a’ phrìomh MTProto, a thèid a dheasbad tuilleadh:

  • ann an Giorrachadh tha e 1 no 4 bytes, ach chan e 0xef, an uairsin a’ bhodhaig
  • ann an Eadar-mheadhanach is e seo 4 bytes de dh'fhaid agus raon, agus a 'chiad uair a dh'fheumas an neach-dèiligidh a chuir 0xeeeeeeee gus innse gur e Eadar-mheadhanach a th’ ann
  • gu h-iomlan an fheadhainn as addictive, bho shealladh lìonraiche: fad, sreath àireamh, agus NACH AN AON a tha sa mhòr-chuid MTProto, bodhaig, CRC32. Tha, tha seo uile a bharrachd air TCP. A bheir dhuinn còmhdhail earbsach ann an cruth sruth byte sreath; chan eil feum air sreathan, gu sònraichte checksums. Ceart gu leòr, a-nis cuiridh cuideigin an aghaidh mi gu bheil sgrùdadh 16-bit aig TCP, agus mar sin bidh coirbeachd dàta a’ tachairt. Sgoinneil, ach gu dearbh tha protocol criptografach againn le hashes nas fhaide na 16 bytes, thèid na mearachdan sin uile - agus eadhon barrachd - a ghlacadh le mì-chothromachadh SHA aig ìre nas àirde. Chan eil adhbhar sam bith ann an CRC32 a bharrachd air an seo.

Dèanamaid coimeas eadar Giorrachadh, anns a bheil aon bhìosa de dh'fhaid comasach, le Eadar-mheadhanach, a tha a 'dearbhadh "Ma tha feum air co-thaobhadh dàta 4-byte," rud a tha gu math gòrach. Dè, thathas a’ creidsinn gu bheil luchd-prògramaidh Telegram cho neo-chomasach nach urrainn dhaibh dàta bho socaid a leughadh gu bufair co-thaobhadh? Feumaidh tu seo a dhèanamh fhathast, oir faodaidh leughadh àireamh sam bith de bytes a thilleadh thugad (agus tha frithealaichean progsaidh ann cuideachd, mar eisimpleir...). No air an làimh eile, carson a chuireas casg air giorrachadh ma bhios pleadhag mòr againn fhathast a bharrachd air 16 bytes - sàbhail 3 bytes uaireannan ?

Tha aon a’ faighinn a’ bheachd gur toil le Nikolai Durov cuibhlichean ath-thòiseachadh, a’ toirt a-steach protocolaidhean lìonra, gun fhìor fheum practaigeach.

Roghainnean còmhdhail eile, a’ gabhail a-steach. Web agus MTProxy, cha bheachdaich sinn a-nis, is dòcha ann am post eile, ma tha iarrtas ann. Mun aon MTProxy seo, na cuimhnich dhuinn a-nis, goirid às deidh dha a bhith air a leigeil ma sgaoil ann an 2018, gun do dh’ ionnsaich solaraichean gu sgiobalta gus a bhacadh, an dùil. seach-rathad bacadhle meud pacaid! Agus cuideachd an fhìrinn gu robh am frithealaiche MTProxy sgrìobhte (a-rithist le Waltman) ann an C ceangailte gu mòr ri mion-fhiosrachadh Linux, ged nach robh feum air seo idir (dearbhaichidh Phil Kulin), agus gum biodh frithealaiche coltach ris an dàrna cuid ann an Go no Node.js iomchaidh ann an nas lugha na ceud loidhne.

Ach thig sinn gu co-dhùnaidhean mu litearrachd theicnigeach nan daoine sin aig deireadh na h-earrainn, às deidh dhuinn beachdachadh air cùisean eile. Airson a-nis, gluaisidh sinn air adhart gu còmhdach OSI 5, seisean - air an do chuir iad seisean MTProto.

Iuchraichean, teachdaireachdan, seiseanan, Diffie-Hellman

Chuir iad an sin e gun a bhith buileach ceart... Chan e seisean an aon sheisean a tha ri fhaicinn san eadar-aghaidh fo sheiseanan Gnìomhach. Ach ann an òrdugh.

A’ càineadh protocol agus dòighean eagrachaidh Telegram. Pàirt 1, teicnigeach: eòlas air sgrìobhadh neach-dèiligidh bhon fhìor thoiseach - TL, MT

Mar sin fhuair sinn sreath byte de dh'fhaid aithnichte bhon ìre còmhdhail. Is e teachdaireachd crioptaichte no teacsa lom a tha seo - ma tha sinn fhathast aig a’ phrìomh ìre aonta agus gu bheil sinn ga dhèanamh. Dè am buidheann de bhun-bheachdan ris an canar “key” air a bheil sinn a’ bruidhinn? Nì sinn a’ chùis seo a shoilleireachadh airson sgioba Telegram fhèin (tha mi duilich airson na sgrìobhainnean agam fhèin eadar-theangachadh bhon Bheurla le eanchainn sgìth aig 4m, bha e na b’ fhasa cuid de abairtean fhàgail mar a tha iad):

Tha dà bhuidheann ris an canar seisean - aon ann an UI luchd-dèiligidh oifigeil fo “seiseanan gnàthach”, far a bheil gach seisean a ’freagairt ri inneal / OS gu lèir.
Tha an dàrna fear Seisean MTProto, aig a bheil àireamh sreath na teachdaireachd (ann an seagh ìre ìosal) innte, agus dè faodaidh e mairsinn eadar diofar cheanglaichean TCP. Faodar grunn sheiseanan MTProto a chuir a-steach aig an aon àm, mar eisimpleir, gus luchdachadh sìos faidhle a luathachadh.

Eadar an dithis so seiseanan tha bun-bheachd ann ùghdarrachadh. Anns a 'chùis lùbach, faodaidh sinn sin a ràdh Seisean UI tha an aon rud ri ùghdarrachadh, ach mo thruaighe, tha a h-uile dad iom-fhillte. Bheir sinn sùil:

  • Bidh an neach-cleachdaidh air an inneal ùr a’ gineadh an toiseach ugh_ iuchair agus ga cheangal gu cunntas, mar eisimpleir tro SMS - is ann air sgàth sin ùghdarrachadh
  • Thachair e taobh a-staigh a 'chiad fhear Seisean MTProto, aig a bheil session_id taobh a-staigh thu fhèin.
  • Aig an ìre seo, am measgachadh ùghdarrachadh и session_id b'urrainnear a ghairm eisimpleir - tha am facal seo a 'nochdadh ann an sgrìobhainnean agus còd cuid de luchd-dèiligidh
  • An uairsin, faodaidh an neach-dèiligidh fosgladh grunnan Seiseanan MTProto fon aon ugh_ iuchair - chun an aon DC.
  • An uairsin, aon latha feumaidh an neach-dèiligidh am faidhle iarraidh DC eile - agus airson an DC seo thèid fear ùr a chruthachadh ugh_ iuchair !
  • Gus innse don t-siostam nach e neach-cleachdaidh ùr a tha a 'clàradh, ach an aon rud ùghdarrachadh (Seisean UI), bidh an neach-dèiligidh a’ cleachdadh gairmean API auth.exportAuthorization aig an taigh DC auth.importAuthorization anns an DC ùr.
  • Tha a h-uile dad mar an ceudna, is dòcha gum bi grunn dhiubh fosgailte Seiseanan MTProto (gach fear le a chuid fhèin session_id) ris an DC ùr seo, fo aige ugh_ iuchair.
  • Mu dheireadh, is dòcha gum bi an neach-dèiligidh ag iarraidh Perfect Forward Secretcy. A h-uile ugh_ iuchair a bha Maireannach iuchair - gach DC - agus faodaidh an neach-dèiligidh fios a chuir auth.bindTempAuthKey airson a chleachdadh sealach ugh_ iuchair - agus a-rithist, dìreach aon temp_auth_key gach DC, cumanta dha na h-uile Seiseanan MTProto ris an DC seo.

Thoir fa-near sin salann (agus salainn san àm ri teachd) cuideachd aon air adhart ugh_ iuchair iadsan. roinnte eadar na h-uile Seiseanan MTProto chun an aon DC.

Dè tha “eadar diofar cheanglaichean TCP” a’ ciallachadh? Mar sin tha seo a’ ciallachadh rudeigin mar briosgaid ùghdarrachaidh air làrach-lìn - bidh e a’ leantainn (mairidh e) mòran cheanglaichean TCP ri frithealaiche sònraichte, ach aon latha thèid e dona. Dìreach eu-coltach ri HTTP, ann am MTProto tha teachdaireachdan taobh a-staigh seisean air an àireamhachadh agus air an dearbhadh le òrdugh; ma chaidh iad a-steach don tunail, chaidh an ceangal a bhriseadh - às deidh dha ceangal ùr a stèidheachadh, cuiridh am frithealaiche a h-uile càil san t-seisean seo nach do lìbhrig e san t-seisean roimhe. Ceangal TCP.

Ach, tha geàrr-chunntas air an fhiosrachadh gu h-àrd às deidh grunn mhìosan de sgrùdadh. Anns an eadar-ama, a bheil sinn a’ buileachadh ar teachdaiche bhon fhìor thoiseach? - rachamaid air ais chun an toiseach.

Mar sin cruthaichidh sinn auth_key air a ' Tionndaidhean Diffie-Hellman bho Telegram. Feuchaidh sinn ri na sgrìobhainnean a thuigsinn ...

Vasily, [19.06.18 20:05] data_with_hash := SHA1 (dàta) + dàta + (bytes air thuaiream sam bith); gus am bi an fhaid co-ionann ri 255 bytes;
encrypted_data := RSA(data_with_hash, server_public_key); tha àireamh 255-byte fada (endian mòr) air a thogail chun a 'chumhachd riatanach thairis air a' mhodulus riatanach, agus tha an toradh air a stòradh mar àireamh 256-byte.

Tha beagan dope DH aca

Chan eil e coltach ri DH neach fallain
Chan eil dà iuchair phoblach ann an dx

Uill, aig a 'cheann thall chaidh seo a rèiteachadh, ach dh' fhan fuigheall - tha dearbhadh air obair air a dhèanamh leis an neach-dèiligidh gun robh e comasach dha an àireamh a chomharrachadh. Seòrsa dìon an aghaidh ionnsaighean DoS. Agus chan eil an iuchair RSA air a chleachdadh ach aon turas ann an aon taobh, gu sònraichte airson crioptachadh new_nonce. Ach ged a shoirbhicheas leis an obair shìmplidh seo, dè a bhios agad ri aghaidh?

Vasily, [20.06.18/00/26 XNUMX:XNUMX] Chan eil mi air faighinn chun iarrtas appid fhathast

Chuir mi an t-iarrtas seo gu DH

Agus, anns an doca còmhdhail tha e ag ràdh gum faod e freagairt le 4 bytes de chòd mearachd. Sin e

Uill, thuirt e rium -404, mar sin dè?

Mar sin thuirt mi ris: “Glac do bullshit air a chrioptachadh le iuchair frithealaiche le lorgan-meòir mar seo, tha mi ag iarraidh DH,” agus fhreagair e le 404 gòrach

Dè do bheachd air freagairt an fhrithealaiche seo? Dè a nì thu? Chan eil duine ri faighneachd (ach barrachd air sin san dàrna pàirt).

An seo tha an ùidh gu lèir air a dhèanamh air an doca

Chan eil dad eile agam ri dhèanamh, bha mi dìreach a’ bruadar air àireamhan a thionndadh air ais is air adhart

Dà àireamh 32 bit. Pacaich mi iad mar a h-uile duine eile

Ach chan e, feumar an dithis seo a chur ris an loidhne an toiseach mar BE

Vadim Goncharov, [20.06.18 15:49] agus air sgàth seo 404?

Vasily, [20.06.18 15:49] THA!

Vadim Goncharov, [20.06.18 15:50] mar sin chan eil mi a 'tuigsinn dè as urrainn dha "nach do lorg"

Vasily, [20.06.18 15:50] mu thimcheall

Cha b’ urrainn dhomh a leithid de lobhadh a lorg ann am prìomh fhactaran%)

Cha do stiùir sinn eadhon aithris mhearachdan

Vasily, [20.06.18 20:18] Ò, tha MD5 ann cuideachd. Mar-thà trì diofar hashes

Tha am prìomh lorgan-meòir air a thomhas mar a leanas:

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

SHA1 agus sha2

Mar sin leig dhuinn a chuir auth_key fhuair sinn pìosan 2048 ann am meud a’ cleachdadh Diffie-Hellman. Dè an ath rud? An uairsin gheibh sinn a-mach nach eil na pìosan 1024 as ìsle den iuchair seo air an cleachdadh ann an dòigh sam bith ... ach smaoinichidh sinn air seo airson a-nis. Aig a’ cheum seo, tha dìomhaireachd co-roinnte againn leis an fhrithealaiche. Chaidh analogue den t-seisean TLS a stèidheachadh, a tha na dhòigh-obrach gu math daor. Ach chan eil fios aig an fhrithealaiche fhathast cò sinn! Chan eil fhathast, gu dearbh. ùghdarrachadh. An fheadhainn sin. ma smaoinich thu a thaobh “login-password”, mar a rinn thu uaireigin ann an ICQ, no co-dhiù “login-key”, mar ann an SSH (mar eisimpleir, air cuid de gitlab / github). Fhuair sinn fear gun urra. Dè ma dh’ innseas am frithealaiche dhuinn “tha na h-àireamhan fòn sin air an seirbheiseachadh le DC eile”? No eadhon “tha an àireamh fòn agad toirmisgte”? Is e an rud as fheàrr as urrainn dhuinn a dhèanamh an iuchair a chumail an dòchas gum bi e feumail agus nach tèid e grod ron àm sin.

Co-dhiù, tha sinn “air fhaighinn” le teagamhan. Mar eisimpleir, a bheil earbsa againn san fhrithealaiche? Dè ma tha e meallta? Bhiodh feum air sgrùdaidhean criptografach:

Vasily, [21.06.18 17:53] Bidh iad a’ tabhann teachdaichean gluasadach sgrùdadh a dhèanamh air àireamh 2kbit airson prìomhachd%)

Ach chan eil e soilleir idir, ge-tà

Vasily, [21.06.18 18:02] Chan eil an sgrìobhainn ag ràdh dè a nì thu ma tha e coltach nach eil e sìmplidh

Cha deach a ràdh. Nach faic sinn dè a bhios an neach-dèiligidh oifigeil Android a’ dèanamh sa chùis seo? A is e sin (agus tha, tha am faidhle gu lèir inntinneach) - mar a chanas iad, fàgaidh mi seo an-seo:

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

Chan e, gu dearbh tha e fhathast ann cuid Tha deuchainnean ann airson prìomhachd àireamh, ach gu pearsanta chan eil eòlas gu leòr agam air matamataig tuilleadh.

Ceart gu leòr, fhuair sinn am prìomh iuchair. Airson logadh a-steach, i.e. cuir iarrtasan, feumaidh tu tuilleadh crioptachaidh a dhèanamh, a’ cleachdadh AES.

Tha an iuchair teachdaireachd air a mhìneachadh mar na pìosan meadhanach 128 de SHA256 den bhuidheann teachdaireachd (a ’toirt a-steach seisean, ID teachdaireachd, msaa), a’ toirt a-steach na bytes pleadhaig, air an ullachadh le 32 bytes air an toirt bhon iuchair ùghdarrais.

Vasily, [22.06.18 14:08] Cuibheasach, galla, pìosan

Fhuaireadh auth_key. Uile. Seachad orra... chan eil sin soilleir bhon sgrìobhainn. Faodaidh tu sgrùdadh a dhèanamh air a’ chòd stòr fosgailte.

Thoir an aire gu bheil feum aig MTProto 2.0 bho 12 gu 1024 bytes de pleadhag, fhathast le ùmhlachd don chumha gum bi fad an teachdaireachd a thig às a roinn le 16 bytes.

Mar sin cia mheud pleadhag a bu chòir dhut a chur ris?

Agus tha, tha 404 ann cuideachd gun fhios nach bi mearachd ann

Ma rinn duine sgrùdadh gu faiceallach air an diagram agus teacsa nan sgrìobhainnean, mhothaich iad nach robh MAC ann. Agus gu bheil AES air a chleachdadh ann am modh IGE sònraichte nach eilear a’ cleachdadh an àite sam bith eile. Bidh iad, gu dearbh, a’ sgrìobhadh mu dheidhinn seo anns na Ceistean Cumanta aca... An seo, mar, is e an iuchair teachdaireachd fhèin cuideachd hash SHA an dàta dì-chrioptaichte, air a chleachdadh gus ionracas a sgrùdadh - agus ma thachras mì-chothromachadh, na sgrìobhainnean airson adhbhar air choireigin a’ moladh gun an aire a thoirt dhaibh gu sàmhach (ach dè mu dheidhinn tèarainteachd, dè ma bhristeas iad sinn?).

Chan e cryptographer a th’ annam, is dòcha nach eil dad ceàrr air a’ mhodh seo sa chùis seo bho shealladh teòiridheach. Ach is urrainn dhomh duilgheadas practaigeach ainmeachadh gu soilleir, a’ cleachdadh Telegram Desktop mar eisimpleir. Bidh e a’ cuairteachadh an tasgadan ionadail (iad sin uile D877F783D5D3EF8C) san aon dòigh ri teachdaireachdan ann am MTProto (dìreach sa chùis seo dreach 1.0), i.e. an toiseach iuchair na teachdaireachd, an uairsin an dàta fhèin (agus an àiteigin gu aon taobh am prìomh fhear auth_key 256 bytes, às aonais sin msg_key gun fheum). Mar sin, bidh an duilgheadas follaiseach air faidhlichean mòra. Is e sin, feumaidh tu dà leth-bhreac den dàta a chumail - air a chrioptachadh agus air a dhì-chrioptachadh. Agus ma tha megabytes ann, no sruthadh bhidio, mar eisimpleir? Ach le MTProto feumaidh tu an toiseach crioptaich no dì-chrioptaich an teachdaireachd gu lèir, dìreach an uairsin gluais e chun lìonra no gu diosc. Mar sin, anns na dreachan as ùire de Telegram Desktop anns an tasgadan a-steach user_data Tha cruth eile air a chleachdadh cuideachd - le AES ann am modh CTR.

Vasily, [21.06.18 01:27] O, fhuair mi a-mach dè a th’ ann an IGE: b’ e IGE a’ chiad oidhirp air “modh crioptachaidh dearbhaidh,” airson Kerberos bho thùs. B’ e oidhirp air fàiligeadh a bh’ ann (chan eil e a’ toirt seachad dìon iomlanachd), agus b’ fheudar a thoirt air falbh. B’ e sin toiseach ceist 20 bliadhna airson modh crioptachaidh dearbhaidh a tha ag obair, a thàinig gu crìch o chionn ghoirid le modhan mar OCB agus GCM.

Agus a-nis na h-argamaidean bho thaobh na cairt:

Tha an sgioba air cùl Telegram, air a stiùireadh le Nikolai Durov, air a dhèanamh suas de shia curaidhean ACM, leth dhiubh Ph.Ds ann am matamataigs. Thug e timcheall air dà bhliadhna dhaibh an dreach làithreach de MTProto a sgaoileadh.

Tha sin èibhinn. Dà bhliadhna aig an ìre as ìsle

No dh'fhaodadh tu dìreach tls a ghabhail

Ceart gu leòr, canaidh sinn gu bheil sinn air an crioptachadh agus nuances eile a dhèanamh. A bheil e comasach mu dheireadh iarrtasan sreathach a chuir ann an TL agus na freagairtean a thoirt air falbh? Mar sin dè agus ciamar a bu chòir dhut a chuir? An seo, canaidh sinn, am modh initCeangal, is dòcha gur e seo e?

Vasily, [25.06.18 18:46] A’ tòiseachadh ceangal agus a’ sàbhaladh fiosrachadh air inneal is tagradh an neach-cleachdaidh.

Gabhaidh e ri app_id, device_model, system_version, app_version agus lang_code.

Agus beagan ceist

Sgrìobhainnean mar a bha e an-còmhnaidh. Faodaidh tu sgrùdadh a dhèanamh air an stòr fosgailte

Nam biodh a h-uile dad cha mhòr soilleir le invokeWithLayer, dè tha ceàrr an seo? Tha e a’ tionndadh a-mach, canaidh sinn gu bheil againn - bha rudeigin aig an neach-dèiligidh mu thràth airson faighneachd don t-seirbheisiche mu dheidhinn - tha iarrtas ann a bha sinn airson a chuir:

Vasily, [25.06.18 19:13] A’ breithneachadh leis a’ chòd, tha a’ chiad ghairm air a phasgadh a-steach don sgàineadh seo, agus tha an crap fhèin air a phasgadh ann an invokewithlayer

Carson nach b’ urrainn initConnection a bhith na ghairm air leth, ach gum feum e a bhith na phasgan? Tha, mar a thionndaidh e a-mach, feumar a dhèanamh a h-uile turas aig toiseach gach seisean, agus chan ann aon uair, mar leis a 'phrìomh iuchair. Ach! Chan urrainn neach-cleachdaidh gun chead a bhith air a ghairm! A-nis tha sinn air an ìre far a bheil e iomchaidh a ruighinn am fear seo duilleag sgrìobhainnean - agus tha e ag innse dhuinn gu bheil...

Chan eil ach cuibhreann bheag de dhòighean API rim faighinn le luchd-cleachdaidh gun chead:

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

A' chiad fhear dhiubh, auth.sendCode, agus tha a’ chiad iarrtas measail sin anns am bi sinn a’ cur api_id agus api_hash, agus às deidh sin gheibh sinn SMS le còd. Agus ma tha sinn anns an DC ceàrr (tha àireamhan fòn san dùthaich seo air am frithealadh le fear eile, mar eisimpleir), gheibh sinn mearachd leis an àireamh de DC a tha thu ag iarraidh. Gus faighinn a-mach dè an seòladh IP a rèir àireamh DC a dh'fheumas tu ceangal ris, cuidich sinn help.getConfig. Aig aon àm cha robh ach 5 inntrigidhean ann, ach às deidh tachartasan ainmeil 2018, tha an àireamh air a dhol suas gu mòr.

A-nis cuimhnichidh sinn gun d’ fhuair sinn chun ìre seo air an fhrithealaiche gun urra. Nach eil e ro dhaor dìreach seòladh IP fhaighinn? Carson nach dèan thu seo, agus gnìomhachd eile, anns a’ phàirt neo-chrioptachadh de MTProto? Tha mi a’ cluinntinn a’ ghearan: “ciamar as urrainn dhuinn dèanamh cinnteach nach e RKN a fhreagras le seòlaidhean meallta?” Gus seo tha sinn a 'cuimhneachadh gu bheil, san fharsaingeachd, luchd-cleachdaidh oifigeil Tha iuchraichean RSA freumhaichte, i.e. an urrainn dhut dìreach soidhne am fiosrachadh seo. Gu fìrinneach, tha seo mar-thà ga dhèanamh airson fiosrachadh mu bhith a 'seachnadh bacadh, a gheibh luchd-dèiligidh tro shianalan eile (gu loidsigeach, chan urrainnear seo a dhèanamh ann am MTProto fhèin, feumaidh fios a bhith agad càite an dèan thu ceangal).

ceart gu leòr. Aig an ìre seo de chead teachdaiche, chan eil sinn ùghdarraichte fhathast agus chan eil sinn air an tagradh againn a chlàradh. Tha sinn dìreach airson faicinn airson a-nis dè a bhios am frithealaiche a’ freagairt air dòighean a tha rim faighinn le neach-cleachdaidh gun chead. Agus an seo…

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;

Anns an sgeama, thig an dàrna àite an toiseach

Anns an sgeama tdesktop tha an treas luach

Tha, bhon uairsin, gu dearbh, chaidh na sgrìobhainnean ùrachadh. Ged a dh 'fhaodadh gum fàs e neo-iomchaidh a-rithist. Ciamar a bu chòir fios a bhith aig leasaiche ùr? Is dòcha ma chlàras tu an tagradh agad, gun toir iad fios dhut? Rinn Vasily seo, ach gu mì-fhortanach, cha do chuir iad dad dha (a-rithist, bruidhnidh sinn mu dheidhinn seo san dàrna pàirt).

...Mhothaich thu gu bheil sinn mu thràth air gluasad chun API air dòigh air choireigin, i.e. chun ath ìre, agus rudeigin a chall ann an cuspair MTProto? Gun iongnadh:

Vasily, [28.06.18 02:04] Mm, tha iad a’ dol tro chuid de na h-algorithms air e2e

Bidh Mtproto a’ mìneachadh algorithms crioptachaidh agus iuchraichean airson an dà raon, a bharrachd air beagan de structar còmhdaich

Ach bidh iad an-còmhnaidh a’ measgachadh diofar ìrean den chruach, agus mar sin chan eil e an-còmhnaidh soilleir càite an do chrìochnaich mtproto agus thòisich an ath ìre

Ciamar a tha iad a 'measgachadh? Uill, seo an aon iuchair sealach airson PFS, mar eisimpleir (co-dhiù, chan urrainn dha Telegram Desktop a dhèanamh). Tha e air a chur gu bàs le iarrtas API auth.bindTempAuthKey, i.e. bhon ìre as àirde. Ach aig an aon àm tha e a 'cur bacadh air crioptachadh aig an ìre as ìsle - às deidh sin, mar eisimpleir, feumaidh tu a dhèanamh a-rithist initConnection msaa, chan eil seo dìreach iarrtas àbhaisteach. Is e an rud a tha sònraichte cuideachd nach urrainn dhut ach AON iuchair sealach a bhith agad gach DC, ged a tha an raon auth_key_id anns gach teachdaireachd leigidh sin leat an iuchair atharrachadh co-dhiù a h-uile teachdaireachd, agus gu bheil còir aig an fhrithealaiche “dìochuimhneachadh” an iuchair shealach aig àm sam bith - chan eil na sgrìobhainnean ag ràdh dè a nì thu sa chùis seo... uill, carson nach b’ urrainn 'eil grunn iuchraichean agad, mar a tha le seata de shalainn san àm ri teachd, agus ?..

Tha cuid de rudan eile ann as fhiach toirt fa-near mun chuspair MTProto.

Teachdaireachdan teachdaireachd, msg_id, msg_seqno, dearbhaidhean, pings san t-slighe cheàrr agus gnàthasan-cainnte eile

Carson a dh'fheumas tu fios a bhith agad mun deidhinn? Leis gu bheil iad “ag aoidion” gu ìre nas àirde, agus feumaidh tu a bhith mothachail orra nuair a bhios tu ag obair leis an API. Gabhamaid ris nach eil ùidh againn ann am msg_key; tha an ìre as ìsle air a h-uile càil a dhì-chrioptachadh dhuinn. Ach taobh a-staigh an dàta dì-chrioptaichte tha na raointean a leanas againn (cuideachd fad an dàta, gus am bi fios againn càite a bheil am pleadhag, ach chan eil sin cudromach):

  • salann - int64
  • seisean_id - int64
  • message_id — int64
  • seq_no - int32

Leig leinn do chuimhneachadh nach eil ann ach aon salann airson an DC gu lèir. Carson a tha fios aice mu deidhinn? Chan ann dìreach air sgàth gu bheil iarrtas ann get_future_salts, a tha ag innse dhut dè na h-amannan a bhios dligheach, ach cuideachd air sgàth ma tha an salann agad “grodadh”, bidh an teachdaireachd (iarrtas) dìreach air chall. Bidh am frithealaiche, gu dearbh, ag aithris air an t-salann ùr le bhith a’ cur a-mach new_session_created - ach leis an t-seann fhear bidh agad ri ath-sgrìobhadh air dòigh air choireigin, mar eisimpleir. Agus tha a 'chùis seo a' toirt buaidh air ailtireachd tagraidh.

Tha cead aig an fhrithealaiche seiseanan a leigeil seachad gu tur agus freagairt san dòigh seo airson iomadach adhbhar. Gu fìrinneach, dè a th’ ann an seisean MTProto bho thaobh an neach-dèiligidh? Seo dà àireamh session_id и seq_no brathan taobh a-staigh an t-seisein seo. Uill, agus an ceangal TCP bunaiteach, gu dearbh. Canaidh sinn nach eil fios aig an neach-dèiligidh againn fhathast mar a nì iad mòran rudan, rinn e dì-cheangal agus ath-cheangal. Ma thachair seo gu luath - lean an t-seann seisean anns a 'cheangal TCP ùr, àrdachadh seq_no tuilleadh. Ma bheir e ùine mhòr, dh’ fhaodadh am frithealaiche a sguabadh às, oir air a thaobh tha e cuideachd na ciudha, mar a fhuair sinn a-mach.

Dè bu chòir a bhith seq_no? O, is ceist dhoirbh a tha sin. Feuch ri tuigsinn gu h-onarach dè bha e a’ ciallachadh:

Teachdaireachd co-cheangailte ri susbaint

Teachdaireachd a dh’ fheumas aithne shoilleir. Tha iad sin a’ toirt a-steach a h-uile neach-cleachdaidh agus mòran theachdaireachdan seirbheis, cha mhòr uile ach a-mhàin soithichean agus teisteanasan.

Àireamh Seicheamh Teachdaireachd (msg_seqno)

Àireamh 32-bit co-ionann ri dà uair an àireamh de theachdaireachdan “co-cheangailte ri susbaint” (an fheadhainn a dh’ fheumas aithne, agus gu sònraichte an fheadhainn nach eil nan soithichean) a chruthaich an neach a chuir a-steach ron teachdaireachd seo agus an uairsin àrdachadh le fear ma tha an teachdaireachd làithreach na teachdaireachd co-cheangailte ri susbaint. Bidh soitheach an-còmhnaidh air a chruthachadh às deidh a shusbaint gu lèir; mar sin, tha àireamh an t-sreath aige nas motha na no co-ionann ri àireamhan sreath nam brathan a tha na bhroinn.

Dè an seòrsa siorcas a tha seo le àrdachadh le 1, agus an uairsin fear eile le 2?.. Tha amharas agam gun robh iad an toiseach a’ ciallachadh “am pìos as cudromaiche airson ACK, is e àireamh a th’ anns a ’chòrr”, ach chan eil an toradh buileach mar an ceudna - gu sònraichte, tha e a 'tighinn a-mach, faodar a chuir grunnan dearbhaidhean aig a bheil an aon rud seq_no! Ciamar? Uill, mar eisimpleir, bidh an frithealaiche a ’cur rudeigin thugainn, ga chuir, agus bidh sinn fhìn sàmhach, a’ freagairt dìreach le teachdaireachdan seirbheis a ’dearbhadh gun d’ fhuair sinn na teachdaireachdan aige. Anns a’ chùis seo, bidh an aon àireamh a-mach aig ar dearbhaidhean a-mach. Ma tha thu eòlach air TCP agus a 'smaoineachadh gu bheil seo a' faireachdainn gu math fiadhaich, ach tha e coltach nach eil e gu math fiadhaich, oir ann an TCP seq_no chan atharraich, ach tha dearbhadh a’ dol seq_no air an taobh eile, greasaidh mi gu tuireadh. Tha dearbhaidhean air an toirt seachad ann am MTProto NOT air a ' seq_no, mar ann an TCP, ach le msg_id !

Dè tha seo msg_id, am fear as cudromaiche de na raointean sin? Aithneadair teachdaireachd sònraichte, mar a tha an t-ainm a’ moladh. Tha e air a mhìneachadh mar àireamh 64-bit, agus tha an draoidheachd “server-not-server” aig na pìosan as ìsle dhiubh a-rithist, agus tha an còrr mar chlàr-ama Unix, a’ toirt a-steach am pàirt bloighteach, air a ghluasad 32 buillean air an taobh chlì. An fheadhainn sin. stampa-ama per se (agus thèid teachdaireachdan le amannan a tha ro eadar-dhealaichte a dhiùltadh leis an fhrithealaiche). Bho seo tha e a 'tionndadh a-mach gur e seo san fharsaingeachd aithnichear a tha cruinneil airson an neach-dèiligidh. Leis an sin - cuimhnicheamaid session_id - tha sinn cinnteach: Chan urrainn ann an suidheachadh sam bith teachdaireachd a tha a’ ciallachadh airson aon seisean a chuir gu seisean eile. Is e sin, tha e a 'tionndadh a-mach gu bheil mar-thà trì ìre - seisean, àireamh seisean, id teachdaireachd. Carson a tha an leithid de dhuilgheadas ann, tha an dìomhaireachd seo glè mhath.

Agus mar sin, msg_id a dhìth airson...

RPC: iarrtasan, freagairtean, mearachdan. Dearbhaidhean.

Mar is dòcha gu bheil thu air mothachadh, chan eil seòrsa no gnìomh sònraichte “dèan iarrtas RPC” an àite sam bith san diagram, ged a tha freagairtean ann. Às deidh na h-uile, tha teachdaireachdan co-cheangailte ri susbaint againn! S e sin, sam bith dh’ fhaodadh gur e iarrtas a th’ anns an teachdaireachd! No gun a bhith. An dèidh a h-uile nì, gach fear tha msg_id. Ach tha freagairtean ann:

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

Seo far a bheilear ag innse dè an teachdaireachd a tha seo mar fhreagairt. Mar sin, aig an ìre as àirde den API, feumaidh tu cuimhneachadh dè an àireamh a bha san iarrtas agad - tha mi a’ smaoineachadh nach eil feum air mìneachadh gu bheil an obair asyncronach, agus faodaidh grunn iarrtasan a bhith a’ dol air adhart aig an aon àm, na freagairtean a dh'fhaodar a thilleadh ann an òrdugh sam bith? Ann am prionnsapal, bho seo agus teachdaireachdan mearachd mar gun luchd-obrach sam bith, faodar an ailtireachd air cùl seo a lorg: tha am frithealaiche a chumas ceangal TCP riut na chothromachadh aghaidh aghaidh, bidh e a’ cur iarrtasan air adhart gu na backends agus gan cruinneachadh air ais tro message_id. Tha e coltach gu bheil a h-uile dad an seo soilleir, loidsigeach agus math.

Seadh?.. Agus ma smaoinicheas tu air? Às deidh na h-uile, tha raon aig freagairt RPC fhèin cuideachd msg_id! Am feum sinn èigheach ris an fhrithealaiche “chan eil thu a’ freagairt mo fhreagairt!”? Agus tha, dè a bha ann mu dhearbhaidhean? Mu dheidhinn duilleag teachdaireachdan mu dheidhinn teachdaireachdan ag innse dhuinn dè a th’ ann

msgs_ack#62d6b459 msg_ids:Vector long = MsgsAck;

agus feumar a dheanamh air gach taobh. Ach chan ann an-còmhnaidh! Ma fhuair thu RpcResult, tha e fhèin na dhearbhadh. Is e sin, faodaidh an frithealaiche freagairt a thoirt don iarrtas agad le MsgsAck - mar, “Fhuair mi e.” Faodaidh RpcResult freagairt sa bhad. Dh’ fhaodadh e a bhith an dà chuid.

Agus tha, feumaidh tu fhathast am freagairt a fhreagairt! Dearbhadh. Rud eile, beachdaichidh am frithealaiche nach gabh a lìbhrigeadh agus cuiridh e air ais thugad a-rithist e. Fiù 's an dèidh ath-cheangal. Ach an seo, gu dearbh, tha ceist ùine-ama ag èirigh. Bheir sinn sùil orra beagan nas fhaide air adhart.

Anns an eadar-ama, leig dhuinn sùil a thoirt air mearachdan cur an gnìomh ceist a dh’ fhaodadh a bhith ann.

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

O, glaodhaidh cuideigin, seo cruth nas daonnaiche - tha loidhne ann! Air do shocair. Seo liosta de mhearachdan, ach gu dearbh chan eil e coileanta. Bhon e tha sinn ag ionnsachadh gu bheil an còd rudeigin mar Mearachdan HTTP (uill, gu dearbh, chan eilear a’ toirt spèis do semantics nam freagairtean, ann an cuid de dh’àiteachan tha iad air an sgaoileadh air thuaiream am measg nan còdan), agus tha coltas air an loidhne CAPITAL_LETERS_AND_NUMBERS. Mar eisimpleir, PHONE_NUMBER_OCCUPIED no FILE_PART_Х_MISSING. Uill, is e sin, bidh feum agad air an loidhne seo fhathast parsaidh. Mar eisimpleir FLOOD_WAIT_3600 ciallachadh gum feum thu feitheamh uair a thìde, agus PHONE_MIGRATE_5, gum feum àireamh fòn leis an ro-leasachan seo a bhith clàraichte anns an 5mh DC. Tha seòrsa de chànan againn, ceart? Chan fheum sinn argamaid bho shreang, nì feadhainn àbhaisteach, ceart gu leòr.

A-rithist, chan eil seo air duilleag teachdaireachdan seirbheis, ach, mar a tha àbhaisteach leis a’ phròiseact seo, gheibhear am fiosrachadh air duilleag sgrìobhainnean eile. Air neo tilgeadh amharas. An toiseach, seall, clò-sgrìobhadh / briseadh còmhdach - RpcError faodar a neadachadh ann RpcResult. Carson nach eil thu a-muigh? Dè nach tug sinn fa-near?.. Mar sin, càite a bheil an gealladh sin RpcError is dòcha NACH EIL freumhaichte ann RpcResult, ach a bhith dìreach no air an neadachadh ann an seòrsa eile?.. Agus mura h-urrainn, carson nach eil e aig an ìre as àirde, i.e. tha e a dhìth req_msg_id ? ..

Ach leanamaid oirnn mu theachdaireachdan seirbheis. Is dòcha gu bheil an neach-dèiligidh a’ smaoineachadh gu bheil an frithealaiche a’ smaoineachadh airson ùine mhòr agus gun dèan e an t-iarrtas iongantach seo:

rpc_drop_answer#58e4a740 req_msg_id:long = RpcDropAnswer;

Tha trì freagairtean comasach don cheist seo, a-rithist a’ trasnadh an uidheamachd dearbhaidh; a’ feuchainn ri tuigsinn dè bu chòir dhaibh a bhith (agus dè an liosta choitcheann de sheòrsan nach eil feumach air dearbhadh) air fhàgail don leughadair mar obair-dachaigh (nota: am fiosrachadh ann an chan eil còd stòr Telegram Desktop coileanta).

Tràilleachd dhrogaichean: inbhe teachdaireachd

San fharsaingeachd, tha mòran àiteachan ann an TL, MTProto agus Telegram san fharsaingeachd a’ fàgail faireachdainn de sheasmhachd, ach a-mach à modhalachd, tact agus feadhainn eile. sgilean bog Chùm sinn sàmhach mu dheidhinn gu modhail, agus rinn sinn caisgireachd air na mì-thuigse anns na còmhraidhean. Ach, an àite seoОtha a’ mhòr-chuid den duilleag mu dheidhinn teachdaireachdan mu dheidhinn teachdaireachdan Tha e uamhasach eadhon dhòmhsa, a tha air a bhith ag obair le protocolaidhean lìonra airson ùine mhòr agus a tha air baidhsagalan de dhiofar ìrean de cham fhaicinn.

Bidh e a’ tòiseachadh gu neo-chiontach, le dearbhaidhean. An ath rud bidh iad ag innse dhuinn mu dheidhinn

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;

Uill, feumaidh a h-uile duine a thòisicheas ag obair le MTProto dèiligeadh riutha; anns a ’chearcall“ ceartaichte - ath-chruinneachadh - air a chuir air bhog ”, is e rud cumanta a th’ ann a bhith a ’faighinn mhearachdan àireamh no salann a tha air a dhol dona rè deasachaidhean. Ach, tha dà phuing an seo:

  1. Tha seo a 'ciallachadh gu bheil an teachdaireachd tùsail air chall. Feumaidh sinn ciudhaichean a chruthachadh, bheir sinn sùil air sin nas fhaide air adhart.
  2. Dè na h-àireamhan mearachd neònach seo? 16, 17, 18, 19, 20, 32, 33, 34, 35, 48, 64... càit a bheil na h-àireamhan eile, a Thomaidh?

Tha na sgrìobhainnean ag ràdh:

Is e an rùn gum bi luachan error_code air an cruinneachadh (error_code >> 4): mar eisimpleir, tha na còdan 0x40 - 0x4f a’ freagairt ri mearachdan ann an lobhadh container.

ach, an toiseach, gluasad air an taobh eile, agus san dàrna àite, chan eil e gu diofar, càite a bheil na còdan eile? Ann an ceann an ùghdair?.. Ach, 's e trifles a tha seo.

Bidh tràilleachd a’ tòiseachadh ann am teachdaireachdan mu inbhe teachdaireachd agus lethbhric teachdaireachd:

  • Iarrtas airson Fiosrachadh Inbhe Teachdaireachd
    Mura d’ fhuair an dàrna pàrtaidh fiosrachadh mu inbhe a theachdaireachdan a-mach airson greis, faodaidh e iarraidh gu soilleir bhon phàrtaidh eile:
    msgs_state_req#da69fb52 msg_ids:Vector long = MsgsStateReq;
  • Teachdaireachd Fiosrachaidh a thaobh Inbhe Teachdaireachdan
    msgs_state_info#04deb57d req_msg_id:long info:string = MsgsStateInfo;
    An seo, info na shreang anns a bheil dìreach aon byte de inbhe teachdaireachd airson gach teachdaireachd bhon liosta msg_ids a tha a’ tighinn a-steach:

    • 1 = chan eil fios sam bith mun teachdaireachd (msg_id ro ìosal, is dòcha gu bheil am pàrtaidh eile air a dhìochuimhneachadh)
    • 2 = teachdaireachd nach d’ fhuaireadh (tha msg_id taobh a-staigh raon nan aithnichearan a chaidh a stòradh; ge-tà, gu cinnteach chan eil am pàrtaidh eile air teachdaireachd mar sin fhaighinn)
    • 3 = teachdaireachd nach d’ fhuaireadh (msg_id ro àrd; ge-tà, gu cinnteach chan eil am pàrtaidh eile air fhaighinn fhathast)
    • 4 = teachdaireachd a fhuaireadh (thoir an aire gu bheil an fhreagairt seo cuideachd na aideachadh cuidhteas aig an aon àm)
    • +8 = teachdaireachd air aithneachadh mu thràth
    • +16 = teachdaireachd nach eil feumach air aideachadh
    • +32 = Tha a’ cheist RPC san teachdaireachd a thathar a’ pròiseasadh no a’ giollachd deiseil mu thràth
    • +64 = freagairt co-cheangailte ris an t-susbaint don teachdaireachd a chaidh a chruthachadh mu thràth
    • +128 = tha fios aig a’ phàrtaidh eile airson fìrinn gun d’ fhuaireadh an teachdaireachd mu thràth
      Chan fheum an fhreagairt seo aideachadh. Tha e na aithneachadh air an msgs_state_req iomchaidh, ann fhèin agus ann fhèin.
      Thoir an aire ma thionndaidh e a-mach gu h-obann nach eil teachdaireachd aig a’ phàrtaidh eile a tha coltach gun deach a chuir thuige, faodar an teachdaireachd a chuir a-rithist gu sìmplidh. Fiù ma gheibh am pàrtaidh eile dà leth-bhreac den teachdaireachd aig an aon àm, cha tèid an dùblachadh a leigeil seachad. (Ma tha cus ùine air a dhol seachad is nach eil an msg_id tùsail dligheach tuilleadh, tha an teachdaireachd ri phasgadh ann am msg_copy).
  • Conaltradh saor-thoileach air Inbhe Teachdaireachdan
    Faodaidh gach pàrtaidh innse gu saor-thoileach don phàrtaidh eile mu inbhe nam brathan a chuir am pàrtaidh eile a-mach.
    msgs_all_info#8cc0d131 msg_ids:Vector long info:string = MsgsAllInfo
  • Conaltradh Saor-thoileach Leudaichte air Inbhe Aon Teachdaireachd
    ...
    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;
  • Iarrtas soilleir airson teachdaireachdan a chuir air ais
    msg_resend_req#7d861a08 msg_ids:Vector long = MsgResendReq;
    Bidh am pàrtaidh iomallach a’ freagairt sa bhad le bhith ag ath-chur na teachdaireachdan a chaidh iarraidh […]
  • Iarrtas soilleir airson freagairtean a chuir air ais
    msg_resend_ans_req#8610baeb msg_ids:Vector long = MsgResendReq;
    Bidh am pàrtaidh iomallach a 'freagairt sa bhad le bhith a' cur a-rithist fhreagairtean dha na teachdaireachdan a chaidh iarraidh […]
  • Leth-bhreacan teachdaireachd
    Ann an cuid de shuidheachaidhean, feumar seann teachdaireachd le msg_id nach eil dligheach tuilleadh a chur a-rithist. An uairsin, tha e air a phasgadh ann an soitheach leth-bhreac:
    msg_copy#e06046b2 orig_message:Message = MessageCopy;
    Nuair a gheibhear e, thèid an teachdaireachd a phròiseasadh mar nach biodh am pasgan ann. Ach, ma tha fios cinnteach gun deach an teachdaireachd orig_message.msg_id fhaighinn, chan eil an teachdaireachd ùr air a ghiullachd (agus aig an aon àm, tha e agus orig_message.msg_id air an aideachadh). Feumaidh luach orig_message.msg_id a bhith nas ìsle na msg_id an t-soithich.

Feuchaidh sinn eadhon sàmhach mu dè msgs_state_info a-rithist tha cluasan an TL neo-chrìochnaichte a’ cumail a-mach (bha feum againn air vectar de bytes, agus anns an dà phìos ìosal bha enum, agus anns an dà phìos as àirde bha brataichean). Tha am puing eadar-dhealaichte. A bheil duine a 'tuigsinn carson a tha seo uile ann an cleachdadh? ann an neach-dèiligidh fìor riatanach?.. Le duilgheadas, ach faodaidh duine smaoineachadh air buannachd ma tha neach an sàs ann an debugging, agus ann am modh eadar-ghnìomhach - faighnich don fhrithealaiche dè agus ciamar. Ach an seo tha na h-iarrtasan air am mìneachadh cuairt cruinn.

Tha e a’ leantainn gum feum gach pàrtaidh chan e a-mhàin teachdaireachdan a chrioptachadh agus a chuir, ach cuideachd dàta a stòradh mun deidhinn fhèin, mu na freagairtean dhaibh, airson ùine neo-aithnichte. Chan eil na sgrìobhainnean a’ toirt cunntas an dàrna cuid air amannan no air iomchaidheachd practaigeach nam feartan sin. cha bhi idir ann. Is e an rud as iongantaiche gu bheil iad dha-rìribh air an cleachdadh ann an còd teachdaichean oifigeil! A rèir choltais chaidh innse dhaibh rudeigin nach robh ann an sgrìobhainnean poblach. Tuigibh bhon chòd carson, chan eil e a-nis cho sìmplidh ri cùis TL - chan e pàirt (gu ìre mhath) a th’ ann a tha iomallach gu loidsigeach, ach pìos ceangailte ri ailtireachd an tagraidh, i.e. bidh feum air tòrr a bharrachd ùine airson còd an tagraidh a thuigsinn.

Pings agus amannan. ciudha.

Bhon a h-uile càil, ma chuimhnicheas sinn air na tuairmsean mu ailtireachd an fhrithealaiche (sgaoileadh iarrtasan thar backends), leanaidh rud caran brònach - a dh’ aindeoin na gealltanasan lìbhrigidh ann an TCP (an dàrna cuid tha an dàta air a lìbhrigeadh, no thèid innse dhut mun bheàrn, ach thèid an dàta a lìbhrigeadh mus tachair an duilgheadas), gum bi dearbhadh ann am MTProto fhèin - chan eil gealltanas sam bith ann. Faodaidh an frithealaiche do theachdaireachd a chall no a thilgeil a-mach gu furasta, agus chan urrainnear dad a dhèanamh mu dheidhinn, dìreach cleachd diofar sheòrsaichean crutches.

Agus an toiseach - ciudha teachdaireachd. Uill, le aon rud bha a h-uile dad follaiseach bhon fhìor thoiseach - feumaidh teachdaireachd neo-dhearbhte a bhith air a stòradh agus a bhith feargach. Agus dè an ùine às deidh sin? Agus tha fios aig an fheusag air. Is dòcha gu bheil na teachdaireachdan seirbheis tràilleach sin dòigh air choireigin a’ fuasgladh na duilgheadas seo le bagaichean, can, ann an Telegram Desktop tha timcheall air ciudhaichean 4 a’ freagairt orra (is dòcha barrachd, mar a chaidh ainmeachadh roimhe, airson seo feumaidh tu sgrùdadh a dhèanamh air a’ chòd agus an ailtireachd aige; aig an aon àm ùine, tha fios againn nach gabh a ghabhail mar shampall; chan eil àireamh sònraichte de sheòrsan bhon sgeama MTProto air an cleachdadh ann).

Carson a tha seo a’ tachairt? Is dòcha, cha robh e comasach dha prògramadairean an fhrithealaiche dèanamh cinnteach à earbsachd taobh a-staigh a’ bhuidheann, no eadhon buffering air a’ chothromaiche aghaidh, agus ghluais iad an duilgheadas seo chun neach-dèiligidh. A-mach à eu-dòchas, dh’ fheuch Vasily ri roghainn eile a chuir an gnìomh, le dìreach dà ciudha, a’ cleachdadh algoirmean bho TCP - a’ tomhas an RTT chun an fhrithealaiche agus ag atharrachadh meud an “uinneag” (ann am brathan) a rèir an àireamh de dh’iarrtasan neo-dhearbhte. Is e sin, is e an leithid de heuristic garbh airson a bhith a’ measadh eallach an fhrithealaiche cia mheud de na h-iarrtasan againn as urrainn dhuinn a bhith a’ cagnadh aig an aon àm agus gun a bhith air an call.

Uill, is e sin, tha thu a’ tuigsinn, ceart? Ma dh'fheumas tu TCP a chuir an gnìomh a-rithist a bharrachd air protocol a tha a 'ruith thairis air TCP, tha seo a' comharrachadh protocol air a dhroch dhealbhadh.

O seadh, carson a tha feum agad air barrachd air aon ciudha, agus dè tha seo a’ ciallachadh dha neach a tha ag obair le API àrd-ìre co-dhiù? Seall, tha thu a' deanamh iarrtas, a' deanamh sreath dheth, ach gu tric cha'n urrainn thu a chur air falbh gun dàil. Carson? Oir bidh am freagairt msg_id, a tha sealachаIs e leubail a th’ annam, agus tha e nas fheàrr an obair aige a chuir dheth cho fada ‘s a ghabhas - air eagal’ s gum bi an frithealaiche ga dhiùltadh air sgàth dìth ùine eadar sinn fhèin agus esan (gu dearbh, is urrainn dhuinn crutch a dhèanamh a ghluaiseas ar n-ùine bhon latha an-diugh chun an fhrithealaiche le bhith a 'cur delta air a thomhas bho fhreagairtean an fhrithealaiche - bidh cleachdaichean oifigeil a' dèanamh seo, ach tha e mì-chinnteach agus mì-cheart mar thoradh air buffering). Mar sin, nuair a nì thu iarrtas le gairm gnìomh ionadail bhon leabharlann, thèid an teachdaireachd tro na h-ìrean a leanas:

  1. Tha e na laighe ann an aon ciudha agus a’ feitheamh ri crioptachadh.
  2. Air a chur an dreuchd msg_id agus chaidh an teachdaireachd gu ciudha eile - comasach air adhart; cuir chun an t-socaid.
  3. a) Fhreagair am frithealaiche MsgsAck - chaidh an teachdaireachd a lìbhrigeadh, sguabaidh sinn às an “ciudha eile” e.
    b) No a chaochladh, cha do chòrd rudeigin ris, fhreagair e badmsg - ath-sgrìobh bho “ciudha eile”
    c) Chan eil fios sam bith ann, feumaidh an teachdaireachd a bhith tàmailt bho ciudha eile - ach chan eil fios cuin.
  4. Fhreagair am frithealaiche mu dheireadh RpcResult - an fhìor fhreagairt (no mearachd) - chan ann a-mhàin air a lìbhrigeadh, ach cuideachd air a phròiseasadh.

Is dòcha gu bheil, dh'fhaodadh cleachdadh soithichean fuasgladh fhaighinn air an duilgheadas gu ìre. Seo nuair a thèid dòrlach de theachdaireachdan a phacaigeadh ann an aon, agus fhreagair am frithealaiche le dearbhadh dhaibh uile aig an aon àm, ann an aon msg_id. Ach diùltaidh e am pasgan seo cuideachd, ma chaidh rudeigin ceàrr, gu h-iomlan.

Agus aig an ìre seo thig beachdachaidhean neo-theicnigeach a-steach. Bho eòlas, tha sinn air mòran crutches fhaicinn, agus a bharrachd air an sin, chì sinn a-nis barrachd eisimpleirean de dhroch chomhairle agus ailtireachd - ann an leithid de shuidheachaidhean, is fhiach earbsa a bhith ann agus co-dhùnaidhean mar sin a dhèanamh? Tha a’ cheist reul-eòlasach (gu dearbh chan eil).

Dè tha sinn a 'bruidhinn mu dheidhinn? Ma tha thu air cuspair “teachdaireachdan dhrogaichean mu theachdaireachdan” faodaidh tu fhathast prothaideachadh le gearanan mar “tha thu gòrach, cha do thuig thu am plana sgoinneil againn!” (mar sin sgrìobh na sgrìobhainnean an-toiseach, mar a bu chòir do dhaoine àbhaisteach, le feallsanachd agus eisimpleirean de iomlaid phasgan, an uairsin bruidhnidh sinn), an uairsin tha amannan / amannan-ama dìreach na cheist phractaigeach agus sònraichte, tha a h-uile dad an seo air a bhith aithnichte airson ùine mhòr. Dè tha na sgrìobhainnean ag innse dhuinn mu amannan-ama?

Mar as trice bidh frithealaiche ag aideachadh gun d’ fhuair e teachdaireachd bho neach-dèiligidh (mar as trice, ceist RPC) a’ cleachdadh freagairt RPC. Ma tha freagairt ùine mhòr a’ tighinn, faodaidh frithealaiche aithne cuidhteas a chuir a-steach an toiseach, agus beagan nas fhaide air adhart, freagairt an RPC fhèin.

Mar as trice bidh neach-dèiligidh ag aideachadh gu bheil e air teachdaireachd fhaighinn bho fhrithealaiche (mar as trice, freagairt RPC) le bhith a’ cur aithne ris an ath cheist RPC mura tèid a chuir a-mach ro fhadalach (ma thèid a chruthachadh, can, 60-120 diogan às deidh an cuidhteas de theachdaireachd bhon t-seirbheisiche). Ach, mura h-eil adhbhar ann airson teachdaireachdan a chuir chun t-seirbheisiche airson ùine mhòr no ma tha àireamh mhòr de theachdaireachdan gun aithneachadh bhon t-seirbheisiche (can, thairis air 16), bidh an neach-dèiligidh a’ toirt seachad aithne fa-leth.

... tha mi ag eadar-theangachadh: chan eil fios againn fhìn dè an ìre agus mar a tha feum againn air, mar sin gabhamaid ris gum biodh e mar seo.

Agus mu dheidhinn pings:

Teachdaireachdan Ping (PING/PONG)

ping#7abe77ec ping_id:long = Pong;

Mar as trice thèid freagairt a thilleadh chun an aon cheangal:

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

Chan fheum na teachdaireachdan seo aideachadh. Chan eil pong air a chraoladh ach mar fhreagairt air ping agus faodar ping a thòiseachadh air gach taobh.

Dùin ceangail dàil + PING

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

Ag obair mar ping. A bharrachd air an sin, às deidh seo fhaighinn, tòisichidh am frithealaiche timer a dhùineas an ceangal gnàthach disconnect_delay diogan às deidh sin mura faigh e teachdaireachd ùr den aon sheòrsa a dh’ ath-shuidhicheas a h-uile clàr-ama roimhe gu fèin-ghluasadach. Ma chuireas an neach-dèiligidh na pings sin aon uair gach 60 diog, mar eisimpleir, faodaidh e disconnect_delay a shuidheachadh co-ionann ri 75 diog.

A bheil thu craicte?! Ann an 60 diog, thèid an trèana a-steach don stèisean, leig às agus togail luchd-siubhail, agus a-rithist caillidh i conaltradh san tunail. Ann an 120 diog, fhad ‘s a chluinneas tu e, ruigidh e fear eile, agus is coltaiche gum bris an ceangal. Uill, tha e soilleir cò às a tha na casan a’ tighinn - “Chuala mi glaodh, ach chan eil fhios agam càite a bheil e”, tha algairim Nagl agus an roghainn TCP_NODELAY, airson obair eadar-ghnìomhach. Ach, gabh mo leisgeul, cùm grèim air a luach bunaiteach - 200 Millidiog Ma tha thu dha-rìribh ag iarraidh rudeigin coltach ri seo a nochdadh agus sàbhaladh air pacaid no dhà a dh’ fhaodadh a bhith ann, an uairsin cuir dheth e airson 5 diogan, no ge bith dè a tha an ùine teachdaireachd “Cleachdaiche a’ taipeadh…” a-nis. Ach chan eil tuilleadh.

Agus mu dheireadh, pings. Is e sin, a’ sgrùdadh beòthalachd a ’cheangail TCP. Tha e èibhinn, ach mu 10 bliadhna air ais sgrìobh mi teacsa breithneachail mu theachdaire dorm ar dàmh - chuir na h-ùghdaran an sin cuideachd an t-seirbheisiche bhon neach-dèiligidh, agus chan ann a chaochladh. Ach is e aon rud a th’ ann an oileanaich 3rd bliadhna, agus is e oifis eadar-nàiseanta rud eile, ceart?..

An toiseach, prògram foghlaim beag. Faodaidh ceangal TCP, às aonais iomlaid pacaid, a bhith beò airson seachdainean. Tha seo an dà chuid math agus dona, a rèir an adhbhair. Tha e math ma bha ceangal SSH agad fosgailte don fhrithealaiche, dh'èirich thu bhon choimpiutair, ath-thòisich thu an router, thill thu dhan àite agad - cha deach an seisean tron ​​​​t-seirbheisiche seo a reubadh (cha do thaidhp thu dad, cha robh pacaidean ann) , tha e goireasach. Tha e dona ma tha mìltean de luchd-dèiligidh air an fhrithealaiche, gach fear a’ cleachdadh ghoireasan (hello, Postgres!), Agus is dòcha gu bheil aoigh an neach-dèiligidh air ath-thòiseachadh o chionn fhada - ach cha bhith fios againn mu dheidhinn.

Bidh siostaman Chat/IM a’ tighinn a-steach don dàrna cùis airson aon adhbhar a bharrachd - inbhean air-loidhne. Ma tha an neach-cleachdaidh “tuiteam dheth”, feumaidh tu innse don eadar-theachdairean aige mu dheidhinn seo. Rud eile, thig thu gu crìch le mearachd a rinn luchd-cruthachaidh Jabber (agus air a cheartachadh airson 20 bliadhna) - tha an neach-cleachdaidh air a dhì-cheangal, ach tha iad fhathast a ’sgrìobhadh teachdaireachdan thuige, a’ creidsinn gu bheil e air-loidhne (a bha cuideachd air chall gu tur anns na beagan mhionaidean mus deach an dì-cheangal a lorg). Chan e, cha chuidich an roghainn TCP_KEEPALIVE, a bhios mòran dhaoine nach eil a’ tuigsinn mar a bhios timers TCP ag obair a’ tilgeil a-steach air thuaiream (le bhith a’ suidheachadh luachan fiadhaich mar deichean diogan), an seo - feumaidh tu dèanamh cinnteach nach e a-mhàin an kernel OS de inneal an neach-cleachdaidh beò, ach cuideachd ag obair gu h-àbhaisteach, comasach air freagairt, agus an aplacaid fhèin (a bheil thu a’ smaoineachadh nach urrainn dha reothadh? Chaidh Telegram Desktop air Ubuntu 18.04 a reothadh dhòmhsa barrachd air aon uair).

Sin as coireach gum feum thu ping frithealaiche neach-dèiligidh, agus chan ann a chaochladh - ma nì an neach-dèiligidh seo, ma thèid an ceangal a bhriseadh, cha tèid am ping a lìbhrigeadh, cha tèid an amas a choileanadh.

Dè a chì sinn air Telegram? Tha e dìreach an aghaidh! Uill, tha sin. Gu foirmeil, gu dearbh, faodaidh an dà thaobh ping a chèile. Ann an cleachdadh, bidh luchd-dèiligidh a 'cleachdadh crutch ping_delay_disconnect, a tha a 'suidheachadh an timer air an fhrithealaiche. Uill, gabh mo leisgeul, chan eil e an urra ris an neach-dèiligidh co-dhùnadh dè cho fada ‘s a tha e airson fuireach ann gun ping. Tha fios nas fheàrr aig an fhrithealaiche, stèidhichte air an luchd. Ach, gu dearbh, mura h-eil dragh agad mu na goireasan, bidh thu nad Pinocchio olc fhèin, agus nì crutch ...

Ciamar a bu chòir a bhith air a dhealbhadh?

Tha mi a’ creidsinn gu bheil na fìrinnean gu h-àrd a’ nochdadh gu soilleir nach eil an sgioba Telegram/VKontakte glè chomasach ann an raon còmhdhail (agus nas ìsle) de lìonraidhean coimpiutair agus na teisteanasan ìosal aca ann an cùisean iomchaidh.

Carson a bha e cho toinnte, agus ciamar as urrainn dha ailtirean Telegram feuchainn ri cur an aghaidh? Leis gun do dh’ fheuch iad ri seisean a dhèanamh a mhaireas briseadh ceangail TCP, ie, an rud nach deach a lìbhrigeadh a-nis, lìbhrigidh sinn nas fhaide air adhart. Is dòcha gun do dh’ fheuch iad cuideachd ri còmhdhail UDP a dhèanamh, ach bha duilgheadasan aca agus thrèig iad e (is e sin as coireach gu bheil na sgrìobhainnean falamh - cha robh dad ann airson brag mu dheidhinn). Ach air sgàth dìth tuigse air mar a tha lìonraidhean san fharsaingeachd agus TCP gu sònraichte ag obair, far am faod thu earbsa a bhith ann, agus far am feum thu fhèin a dhèanamh (agus ciamar), agus oidhirp air seo a chur còmhla ri cryptography “dà eun le aon chloich", seo an toradh.

Ciamar a bha feum air? Stèidhichte air an fhìrinn gu bheil msg_id na stampa-ama a tha riatanach bho shealladh criptografach gus casg a chuir air ionnsaighean ath-chluich, is e mearachd a th’ ann gnìomh aithnichear sònraichte a cheangal ris. Mar sin, gun a bhith ag atharrachadh gu bunaiteach an ailtireachd gnàthach (nuair a thèid an t-sruth Ùrachaidhean a chruthachadh, tha sin na chuspair API àrd-ìre airson pàirt eile den t-sreath phuist seo), dh'fheumadh fear:

  1. Bidh uallach air an fhrithealaiche aig a bheil an ceangal TCP ris an neach-dèiligidh - ma tha e air leughadh bhon t-socaid, feuch an aithnich thu, pròiseas no till air ais mearachd, gun chall sam bith. An uairsin chan e vectar de ids a th’ anns an dearbhadh, ach dìreach “an seq_no mu dheireadh a fhuaireadh” - dìreach àireamh, mar ann an TCP (dà àireamh - an seq agad agus am fear dearbhte). Tha sinn an-còmhnaidh taobh a-staigh an t-seisein, nach eil?
  2. Bidh an clàr-ama gus casg a chuir air ionnsaighean ath-chluich gu bhith na raon air leth, a la nonce. Tha e air a sgrùdadh, ach chan eil e a 'toirt buaidh air rud sam bith eile. Gu leòr agus uint32 - ma dh'atharraicheas an salann againn co-dhiù a h-uile leth latha, is urrainn dhuinn 16 pìosan a riarachadh gu pìosan òrdugh ìosal pàirt iomlan den ùine làithreach, an còrr - gu pàirt bloigheach de dhiog (mar a tha e an-dràsta).
  3. Air a thoirt air falbh msg_id idir - bho thaobh a bhith a’ comharrachadh iarrtasan air na backends, tha, an toiseach, id an neach-dèiligidh, agus san dàrna àite, id an t-seisein, gan ceangal. Mar sin, chan eil ach aon rud gu leòr mar aithnichear iarrtas seq_no.

Chan e seo an roghainn as soirbheachaile cuideachd; dh’ fhaodadh tuaiream iomlan a bhith na aithnichear - tha seo air a dhèanamh mu thràth san API àrd-ìre nuair a chuireas tu teachdaireachd, co-dhiù. Bhiodh e na b’ fheàrr an ailtireachd ath-dhèanamh gu tur bho choimeas gu iomlan, ach tha seo na chuspair airson pàirt eile, chan e an dreuchd seo.

API?

Ta-daam! Mar sin, às deidh dhuinn a bhith a’ strì tro fhrith-rathad làn pian agus bagannan, bha e comasach dhuinn mu dheireadh iarrtasan sam bith a chuir chun t-seirbheisiche agus freagairtean sam bith fhaighinn dhaibh, a bharrachd air ùrachaidhean fhaighinn bhon t-seirbheisiche (chan ann mar fhreagairt air iarrtas, ach e fhèin a 'cur thugainn, mar PUSH, ma tha duine sam bith nas soilleire mar sin).

Thoir an aire, a-nis bidh an aon eisimpleir ann am Perl san artaigil! (dhaibhsan nach eil eòlach air a’ cho-chòrdadh, is e a’ chiad argamaid beannachaidh structar dàta an nì, is e an dàrna fear a chlas):

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

Seadh, chan e spoiler a dh’aona ghnothach - mura h-eil thu air a leughadh fhathast, falbh air adhart agus dèan e!

O, wai~~... cò ris a tha seo coltach? Rud gu math eòlach ... is dòcha gur e seo structar dàta API Lìn àbhaisteach ann an JSON, ach a-mhàin gu bheil clasaichean ceangailte ri nithean cuideachd?..

Mar sin seo mar a thionndaidh e a-mach... Cò mu dheidhinn a tha e, a chompanaich?.. Na h-uimhir de dh’ oidhirp - agus stad sinn a’ gabhail fois far an robh na prògraman lìn dìreach a' tòiseachadh?..Nach biodh e dìreach JSON thairis air HTTPS nas sìmplidh?! Dè fhuair sinn mar mhalairt? An fhiach an oidhirp e?

Nach dèan sinn measadh air na thug TL + MTProto dhuinn agus dè na roghainnean eile a tha comasach. Uill, tha HTTP, a tha ag amas air a’ mhodail freagairt-iarrtas, gu math iomchaidh, ach co-dhiù rudeigin a bharrachd air TLS?

Sreathachadh compact. A’ faicinn an structair dàta seo, coltach ri JSON, tha cuimhne agam gu bheil dreachan dà-chànanach dheth. Comharraichidh sinn MsgPack mar nach eil gu leòr leudachail, ach tha, mar eisimpleir, CBOR - leis an t-slighe, inbhe a tha air a mhìneachadh ann an RFC 7049. Tha e sònraichte airson an fhìrinn gu bheil e ga mhìneachadh tagaichean, mar inneal leudachaidh, agus am measg àbhaisteach mu thràth ri fhaighinn:

  • 25 + 256 - a’ toirt iomradh air àireamh na loidhne an àite loidhnichean a-rithist, dòigh teannachaidh cho saor
  • 26 - nì Perl sreathach le ainm clas agus argamaidean neach-togail
  • 27 - nì sreathach neo-eisimeileach cànain le ainm seòrsa agus argamaidean neach-togail

Uill, dh’ fheuch mi ris an aon dàta a chuir ann an TL agus ann an CBOR le pacadh sreang is stuth air a chomasachadh. Thòisich an toradh ag atharrachadh a thaobh fàbhar CBOR an àiteigin bho megabyte:

cborlen=1039673 tl_len=1095092

Agus mar sin, co-dhùnadh: Tha an ìre mhath nas sìmplidh cruthan nach eil fo ùmhlachd do dhuilgheadas sioncranachaidh fàilligeadh no unknown aithnichear, le coimeasach èifeachdas.

Stèidheachadh ceangail luath. Tha seo a ’ciallachadh neoni RTT às deidh ath-cheangal (nuair a chaidh an iuchair a chruthachadh aon uair mar-thà) - buntainneach bhon chiad teachdaireachd MTProto, ach le beagan teagamhan - buail an aon salann, chan eil an seisean grod, msaa. Dè tha TLS a’ tabhann dhuinn na àite? Aithris air cuspair:

Nuair a bhios tu a’ cleachdadh PFS ann an TLS, tiogaidean seisean TLS (RFC 5077) seisean crioptaichte ath-thòiseachadh gun a bhith ag ath-rèiteachadh iuchraichean agus gun a bhith a’ stòradh prìomh fhiosrachadh air an fhrithealaiche. Nuair a dh’ fhosglas e a’ chiad cheangal agus nuair a chruthaicheas tu iuchraichean, bidh an frithealaiche a’ crioptachadh an staid ceangail agus ga chuir chun neach-dèiligidh (ann an cruth tiogaid seisean). Mar sin, nuair a thèid an ceangal ath-thòiseachadh, bidh an neach-dèiligidh a’ cur tiogaid seisean, a’ toirt a-steach iuchair an t-seisein, air ais chun t-seirbheisiche. Tha an tiogaid fhèin air a chrioptachadh le iuchair shealach (iuchair tiogaid seisean), a tha air a stòradh air an fhrithealaiche agus a dh’ fheumar a sgaoileadh am measg a h-uile seirbheisiche aghaidh a tha a’ giullachd SSL ann am fuasglaidhean cruinnichte.[10]. Mar sin, faodaidh toirt a-steach tiogaid seisean briseadh PFS ma thèid iuchraichean frithealaiche sealach a chuir an cunnart, mar eisimpleir, nuair a bhios iad air an stòradh airson ùine mhòr (OpenSSL, nginx, bidh Apache gan stòradh gu bunaiteach fad beatha a’ phrògraim; bidh làraichean mòr-chòrdte a’ cleachdadh an iuchair airson grunn uairean a thìde, suas ri làithean).

An seo chan eil an RTT neoni, feumaidh tu iomlaid co-dhiù ClientHello agus ServerHello, às deidh sin faodaidh an neach-dèiligidh dàta a chuir còmhla ri Crìochnaichte. Ach an seo bu chòir dhuinn cuimhneachadh nach e an lìon a th’ againn, leis na th’ againn de cheanglaichean a tha air ùr fhosgladh, ach teachdaire, aig a bheil an ceangal gu tric mar aon iarrtas no nas lugha fad-ùine, caran goirid air duilleagan lìn - tha a h-uile càil ioma-fhillte. a-staigh. Is e sin, tha e gu math iomchaidh mura tàinig sinn tarsainn air roinn fo-thalamh fìor dhona.

Na dhìochuimhnich thu rudeigin eile? Sgrìobh anns na beachdan.

Ri leantainn!

Anns an dàrna pàirt den t-sreath de phuist seo beachdaichidh sinn nach e cùisean teicnigeach, ach eagrachaidh - dòighean-obrach, ideòlas, eadar-aghaidh, sealladh luchd-cleachdaidh, msaa. Stèidhichte, ge-tà, air an fhiosrachadh theicnigeach a chaidh a thaisbeanadh an seo.

Leanaidh an treas pàirt a’ sgrùdadh a’ phàirt theicnigeach / eòlas leasachaidh. Ionnsaichidh tu, gu sònraichte:

  • leantainn air adhart leis an pandemonium le measgachadh de sheòrsan TL
  • rudan neo-aithnichte mu shianalan agus supergroups
  • carson a tha còmhraidhean nas miosa na roster
  • mu sheòladh teachdaireachd iomlan vs càirdeach
  • dè an diofar eadar dealbh agus dealbh
  • mar a tha emoji a’ cur bacadh air teacsa clò eadailteach

agus crùban eile! Cùm sùil!

Source: www.habr.com

Cuir beachd ann