Android VpnService: qari TUN li jwaqqaf kontra żbalji tal-kitba ENOBUFS
Qari li qatt ma jerġa' lura u kitba li tfalli bl-ENOBUFS għandhom kawżi opposti. Kejjel it-tieqa mħabbra u t-tul tal-pakkett biex tagħżel it-tiswija.
Żewġ sintomi jidhru fl-istess ċiklu ta' VpnService u t-tnejn jiġu akkużati bl-istess ħaġa: qarrej li qatt ma jerġa' lura, u kitba li tfalli bl-ENOBUFS. Dawn mhumiex varjanti ta' bug wieħed. Qari mwaqqaf huwa nuqqas ta' qbil dwar il-kontroll tal-fluss mal-peer; kitba falluta hija pakkett li l-interface mhux se taċċetta. Jekk tittrattahom bħala problema waħda, se tqatta' jum tittona buffers li qatt ma kienu involuti. Id-diviżjoni hawn taħt hija kif niddeċiedi liema nofs taċ-ċiklu nkejjel l-ewwel.
Ċiklu wieħed, żewġ punti ta' falliment indipendenti
Is-servizz tiegħek jaqra pakkett IP mid-deskrittur tal-fajl TUN, jeżaminah u jikteb tweġiba lura fl-istess deskrittur. Kull ma jinkiser f'dak il-mogħdija jidher f'waħda minn dawk iż-żewġ sejħiet, u għalhekk it-tnejn huma rrappurtati bħala tunnel miksur. Is-sejħiet għandhom kuntratti differenti. Qari jistenna li l-kernel jagħtik pakkett, u kitba tagħti lill-kernel pakkett li huwa jista' jirrifjuta.
Il-qari huwa n-nofs faċli biex taħseb dwaru. Qari li ma jirritornax xejn jew qed jistenna traffiku li qatt ma jasal jew qed jistenna għax il-peer waqaf jibgħat.
Qari mwaqqaf huwa nuqqas ta' qbil dwar il-kontroll tal-fluss
Il-qari ta' apparat TUN jimblokka sakemm ikun disponibbli pakkett. Dan huwa mġiba ddisinjata, u għalhekk thread li jieqaf ġewwa read jidher normali fuq konnessjoni inattiva. Dan isir waqfa meta l-istack TCP tiegħek stess ikompli jaċċetta data mill-app lokali iżda qatt ma jħabbar tieqa biżżejjed biex il-peer remot jibgħat aktar. Il-peer jimla t-tieqa li ħabbart, jistenna ACK u aġġornament tat-tieqa, u jieqaf. Imbagħad il-qarrej tiegħek m'għandu xejn x'jirritorna, u l-app tara konnessjoni miftuħa u siekta.
Il-kawżi komuni huma stack li jikteb fis-socket mingħajr ma jsegwi t-tieqa mħabbra, u ieħor li jinsa jibgħat aġġornament tat-tieqa wara li jbattal il-buffer tiegħu. Minn barra jidhru identiċi: bytes joħorġu, xejn ma jerġa' lura, l-ebda żball ma jiġi mqajjem. L-imblukkar tat-thread tal-qari fuq parsing, soluzzjoni DNS jew I/O tad-diska jipproduċi l-istess forma ta' sintomu għal raġuni mhux relatata, għalhekk ikkonferma li t-thread huwa tassew ġewwa read qabel ma tagħti l-ħtija lill-kontroll tal-fluss.
Iċċekkja l-kju tal-ibgħat tal-peer u t-tieqa li ra l-aħħar. Jekk il-peer qed iżomm data għax it-tieqa tiegħek hija żero, it-tiswija tinsab fil-mogħdija ACK tiegħek, mhux fil-qari TUN.
ENOBUFS hija problema ta' daqs, mhux nuqqas ta' buffer
Kitba li tirritorna ENOBUFS fuq interface TUN normalment tirrifjuta t-tul tal-pakkett. L-interface għandha MTU, pakkett akbar minnha ma jistax jitqiegħed fil-kju, u li terġa' tipprova l-istess pakkett tfalli bl-istess mod kull darba. Dak id-determiniżmu huwa l-indikazzjoni. Nuqqas reali ta' buffer jinħeles meta l-pressjoni tonqos, filwaqt li rifjut ta' daqs ma jimpurtahx kemm tistenna.
TCP għandu mekkaniżmu eżatt għal dan, u dan huwa l-pass li n-nies jaqbżu: il-clamp MSS. Meta tissintetizza segmenti fl-ispazju tal-utent inti tagħżel id-daqs tal-payload, u li tieħu mill-MTU tal-interface lokali minflok mill-MTU tat-tunnel joħroġ segmenti li t-tunnel ma jistax iġorr. Illimita għall-iżgħar mit-tnejn. Il-clamp ikopri biss TCP, għalhekk datagram UDP akbar minn hekk irid jiġi frammentat jew jintrema mill-kodiċi tiegħek.
Irreġistra t-tul ta' kull pakkett li tikteb waqt id-debugging. It-tul li jfalli huwa t-tweġiba, u mhux se jinbidel bejn tentattivi.
Tliet kejl li jifirdu l-każijiet
M'għandekx bżonn debugger għal waħda mill-fallimenti. Tliet osservazzjonijiet huma biżżejjed biex tmexxik lejn is-sezzjoni t-tajba, u jieħdu inqas ħin minn rebuild.
| What you see | Where to look |
|---|---|
| Reader parked, peer send queue empty, last advertised window zero | Window updates in your ACK path |
| Write fails on one length and succeeds on a smaller one | MSS clamp and tunnel MTU |
| Both directions look fine, app still sees no data | Protected socket and routing loop |
Jekk it-tielet ringiela taqbel, iċ-ċiklu nnifsu huwa tajjeb u l-problema tinsab fejn it-tunnel ma jistax jara: socket tat-trasport mhux protett li jerġa' jġib it-traffiku VPN tiegħek fit-tunnel, li normalment jidher bħala konnessjoni li tirnexxi u mbagħad ma twassal xejn.
Sewwi l-plaming li minnu jiddependu ż-żewġ mogħdijiet
L-ebda sintomu ma jistħoqqlu jiġi segwit qabel ma l-interface tkun mibnija sew. Is-sejħiet builder li jgħoddu huma l-indirizz, ir-rotta, l-MTU u l-kunsens, f'dak l-ordni:
Builder()
.addAddress(10.8.0.2, 32)
.addRoute(0.0.0.0, 0)
.setMtu(1400)
.establish()Issettja l-MTU għall-valur reali tat-tunnel minflok ma tħallih fuq dak li uża l-eżempju. Kull ma tikteb wara huwa kkonfinat b'dak in-numru, u nuqqas ta' qbil bejn l-MTU li tissettja u l-MSS li tillimita għalih huwa l-aktar mod komuni biex terġa' ddaħħal il-falliment tal-kitba wara tiswija. Imbagħad ipproteġi s-socket li ġġorr it-traffiku lejn is-server VPN innifsu. Mingħajr protect dawk il-pakketti jiġu rruttati lura fit-tunnel tiegħek stess u l-konnessjoni qatt ma titlesta, li jidher bħal qari mwaqqaf iżda huwa ċiklu ta' routing.
Il-kunsens ma jistax jiġi evitat. Servizz li jinbeda mingħajr prepare ma jirritornax null ma jikseb l-ebda interface, u establish jirritorna null minflok ma jitfa', għalhekk iċċekkja d-deskrittur qabel ma tibda ċ-ċiklu tiegħek. Ir-referenza VpnService hija l-post biex tikkonferma l-kuntratt tal-builder minflok ma tikkopja eżempju.
Ivverifika direzzjoni waħda kull darba
Ibgħat echo UDP mit-tunnel u osserva t-tulijiet tal-pakketti qabel ma tmiss TCP. Imbagħad iftaħ handshake u kkonferma li s-segmenti jibqgħu taħt l-MSS li kkalkulajt. Għodd pakketti minflok konnessjonijiet, sabiex waqfa tidher bħala vojt fil-counter minflok socket imdendel. Jekk il-qari jieqaf wara raffica ta' kitbiet, it-tieqa hija s-suspettat; jekk il-kitbiet jfallu minnufih, huwa t-tul.
Imbagħad erġa' ibda l-apparat u rrepeti darba, għax VpnService li jaħdem biss sal-ewwel bidla fin-netwerk hija problema ta' routing u mhux ta' kontroll tal-fluss.