Ż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 seeWhere to look
Reader parked, peer send queue empty, last advertised window zeroWindow updates in your ACK path
Write fails on one length and succeeds on a smaller oneMSS clamp and tunnel MTU
Both directions look fine, app still sees no dataProtected 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.

Artikli relatati