Ceanglaíonn VpnService Android ach ní shroicheann aon phaicéad an líonra
Tollán suas agus leathanaigh fós ag teip: seiceáil an modh léitheoireachta, cosaint an socket, tacaíocht TCP agus an liosta bealaí sula gcuireann tú an milleán ar an bhfreastalaí VPN.
Tagann an tollán suas, feictear an deilbhín eochrach, agus téann gach iarratas sa bhrabhsálaí thar am fós. In aip VpnService ciallaíonn an meascán sin de ghnáth go bhfuil an lúb léitheoireachta beo agus an leath aschuir briste, ní gur dhiúltaigh an freastalaí don chroitheadh láimhe. Tá an comhéadan cruthaithe ag Android cheana, an trácht aipe curtha isteach ann agus tuairisceoir comhaid tugtha do do phróiseas. Is é do chód féin gach rud tar éis an tuairisceora sin, agus is leor aon ghlao atá ar iarraidh chun an sruth iomlán a shlogadh.
An rud a thugann an córas duit, agus nach dtugann
Filleann establish() ParcelFileDescriptor do chomhéadan tun. Scríobhann an córas paicéid IP amach isteach ann agus tá súil aige go léifidh do phróiseas iad, go gcinneadh sé cá dtéann siad agus go seolfaidh sé trí socket gnáth iad. Níl aon aistriú eithne faoi, mar sin nuair nach léann éinne, caithtear na paicéid agus ní ghluaiseann cuntair an chomhéadain riamh.
Tosaigh ag comhaireamh in ionad buille faoi thuairim. Méadaigh cuntar ar gach léamh rathúil agus logáil ceann scríbe agus prótacal na gcéad phaicéad. Má fhanann an cuntar ag nialas agus trácht á ghiniúint, tá an locht os cionn do chóid aistrithe, rud a chúngaíonn an cuardach go cumraiocht an builder agus go modh na léitheoireachta. Má ghluaiseann an cuntar agus má theipeann ar an mbrabhsálaí fós, tá an locht sa chonair seolta nó ar an mbealach ar ais.
Cinneann léamh blocála an ngluaiseann an lúb
Cuireann setBlocking(true) an tuairisceoir i modh blocála agus tá sé ann ó API 21. Ar eisiúintí níos sine is é an réiteach cabhróir beag JNI a ghlanann O_NONBLOCK le fcntl ar an tuairisceoir amh. Tá tábhacht leis an modh mar cinneann sé cad a cheadaítear do léamh gan phaicéad ag feitheamh a dhéanamh.
I modh neamh-bhlocála filleann an léamh sin láithreach le luach diúltach, agus casann lúb a dhéanann neamhaird den toradh croí gan aon trácht a bhogadh. I modh blocála fanann an léamh ag feitheamh, rud is mian le snáithe aistrithe, ach ansin ní féidir an snáithe a bhriseadh isteach a thuilleadh. Is é dúnadh an tuairisceora an bealach tacaíochta chun an léamh a chur ar theip ionas go bhféadfadh an lúb imeacht. Má mharaítear an próiseas nó má bhristear isteach ar an snáithe ina ionad, féadfaidh an chéad tosú eile tuairisceoir a choinneáil nach n-oireann don chomhéadan a thuilleadh.
Léigh paicéad amháin in aghaidh an ghlao isteach i maolán atá méadaithe de réir MTU an chomhéadain, agus caith le nialas nó le toradh diúltach mar earráid seachas mar phaicéad folamh.
protect() roimh an gcéad seoladh, ní ina dhiaidh
Caithfear gach socket a iompraíonn paicéad ionchochlaithe a chosaint ar dtús. Géilleann socket gan chosaint do na rialacha ródaithe céanna a shuiteáil tú anois díreach, mar sin téann a phaicéid ar ais isteach sa tollán agus piocann do lúb léitheoireachta féin suas iad arís. Ansin aistríonn an tollán a aschur féin gan teorainn, agus ón taobh amuigh breathnaíonn sé cosúil le nasc a osclaíonn agus nach bhfreagraíonn riamh.
Is é an t-ordú protect, ansin connect nó bind, ansin send. Féadfaidh glao protect tar éis connect an cinneadh bealaigh níos luaithe a fhágáil ina áit, mar sin leanann an socket ag úsáid an chonair mhícheart cé gur fhill an glao true. Seiceáil an boolean a fhilleann sé agus teip go hard nuair atá sé false in ionad siúl isteach i seoladh nach féidir oibriú.
Is é earráid cheada ó sendto ar socket nár theagmhaigh le protect() riamh síniú gnásúil na hearráide seo.
Ní iompraíonn an sampla UDP HTTPS
Ní láimhseálann an sampla aistrithe a chóipeálann formhór na dteagascóirí ach UDP agus faic eile. Teastaíonn croitheadh láimhe, uimhreacha seichimh, admhálacha agus athsheoladh ó TCP, agus ní sholáthraíonn lúb a chóipeálann ualaí idir tuairisceoir tun agus socket aon cheann díobh sin. Sin é an fáth ar féidir le hiarratas DNS thar UDP dul tríd agus gach iarratas HTTPS ag stopadh. Buail stac TCP i spás úsáideora nó tabhair na naisc do sheachfhreastalaí áitiúil a chríochnaíonn TCP ar an ngléas agus a aistríonn an sruth.
Tástáil an deighilt sula ndéanann tú aon rud a athscríobh: seol iarratas UDP amháin agus oscail nasc TCP amháin chuig an óstach céanna. Má oibríonn conair UDP agus má hangsálann conair TCP ag an gcéad SYN, is é an cód aistrithe an fhadhb agus ní an freastalaí. Sábhálann an chomparáid amháin sin go leor ama a chaitear ag léamh loganna freastalaí nach bhfuil aon rud úsáideach iontu.
Cuireann an liosta bealaí agus scagairí in aghaidh an aipe teorainn leis an méid a fheiceann tú
Sainmhíníonn addAddress, addRoute agus addDns cad a sheolann an córas isteach sa tollán. Ní shroicheann ceann scríbe lasmuigh den liosta bealaí do thuaireisceoir riamh, mar sin ní cheartóidh aon mhéid de loighic aistrithe é. Logáil na glaonna builder a dhéanann tú agus cuir i gcomparáid iad leis na seoltaí a ndéanann an aip iarracht iad a shroichinn i ndáiríre.
Tá a urlár féin ag roghnú in aghaidh an aipe: teastaíonn API 21 ó addAllowedApplication agus addDisallowedApplication, agus ar eisiúintí níos sine níl na modhanna ann ar chor ar bith. Ní féidir le dearadh a scagann de réir paicéid rith ansin in aon chor.
Fágann athbhunú tuairisceoirí seanchaite ina dhiaidh
Filleann glao eile ar establish() tuairisceoir nua agus dúnann sé an comhéadan roimhe. Tá an seantuairisceoir neamhbhailí anois, mar sin faigheann snáithe atá fós blocáilte air earráid, agus b'fhéidir go gcaithfear soicéid a cruthaíodh don sean-chonair a athsholáthar. Is é onRevoke an glao ar ais do thollán a thóg an t-úsáideoir nó an córas. Coinníonn sé an saolré ag úinéir amháin, a stopann an léitheoir sula ndéantar athbhunú, agus cuireann sé sin stop le formhór na stát ceangailte-ach-marbh.
Léigh gach earráid de réir an chéime lena mbaineann sí. Ciallaíonn athshocrú naisc ó recvfrom gur dhún an fhoirceann i bhfad i gcéin agus do chód fós ag léamh. Cuireann earráid seoladh mhícheart in iúl go bhfuil fadhb le parsáil ceannteidil nó le hoscar, ní leis an líonra.
Ordú oibre: modh blocála air, paicéad amháin in aghaidh an léimh, ceanntásc parsáilte, socket cosanta, ualach seolta, dúnadh glan ar aistriú agus liosta bealaí a chlúdaíonn an ceann scríbe.