Alamomi biyu suna bayyana a cikin luf ɗaya na VpnService kuma ana zargin abu ɗaya: mai karatu da ba ya dawowa, da rubutu da ke gazawa da ENOBUFS. Ba sa bambancin kurege ɗaya. Karatun da ya tsaya rashin jituwa ne kan sarrafa kwarara da peer; rubutun da ya gaza fakiti ne da interfacen ba zai karɓa ba. Idan ka ɗauke su a matsayin matsala ɗaya, za ka yi kwana ɗaya kana daidaita buffers waɗanda ba su taɓa shiga ba. Rabon da ke ƙasa shi ne yadda nake yanke shawarar wane rabin luf zan fara aunawa.

Luf ɗaya, wuraren gazawa biyu masu zaman kansu

Savis ɗinka yana karanta fakitin IP daga descriptor ɗin fayil ɗin TUN, yana duba shi sannan yana rubuta amsa zuwa wannan descriptor ɗin. Duk abin da ya lalace a wannan hanya yana bayyana a ɗaya daga cikin waɗannan kira biyu, shi ya sa ake ba da rahoton duka biyun a matsayin tunnel ɗin ya lalace. Kiran biyu suna da yarjejeniya daban-daban. Karatu yana jira kernel ya ba ka fakiti, rubutu kuma yana ba kernel fakiti wanda yana da haƙƙin ƙi shi.

Karatun shi ne rabin mai sauƙi don yin tunani. Karatun da ba ya dawo da komai ko yana jiran zirga-zirgar da ba za ta taɓa zuwa ba ko kuma yana jira saboda peer ya daina aikawa.

Tsayawar karatu rashin jituwa ne kan sarrafa kwarara

Karatun na'urar TUN yana toshewa har sai fakiti ya samu. Wannan halin da aka tsara ne, kuma shi ya sa zare da ya tsaya cikin read yake kamar al'ada a hanyar da ba ta aiki. Yana zama ratsewa lokacin da stack ɗinka na TCP ya ci gaba da karɓar bayanai daga app ɗin gida amma ba ya sanar da isasshiyar taga don peer ɗin nesa ya aika ƙari. Peer ɗin yana cika tagar da ka sanar, yana jiran ACK da sabuntawar taga, sannan ya tsaya. Sannan mai karatunka ba shi da abin da zai mayar, app ɗin kuma yana ganin haɗin da yake buɗe kuma shiru.

Dalilan da suka zama ruwan dare su ne stack da ke rubutu cikin socket ba tare da bin tagar da aka sanar ba, da kuma wanda ya manta aika sabuntawar taga bayan ya kwashe buffer ɗinsa. Daga waje suna kama da juna: bytes suna fita, babu abin da ke dawowa, ba a tayar da kurege. Toshe zaren karatu a kan parsing, warwarewar DNS ko I/O na diski yana haifar da irin wannan alamar saboda wani dalili maras alaƙa, don haka tabbatar zaren yana cikin read da gaske kafin ka zargi sarrafa kwarara.

Duba jerin aikawa na peer da tagar da ya gani na ƙarshe. Idan peer yana riƙe da bayanai saboda tagarka sifili ce, gyaran yana cikin hanyar ACK ɗinka, ba cikin karatun TUN ba.

ENOBUFS matsalar girma ce, ba ƙarancin buffer ba

Rubutun da ke mayar da ENOBUFS a interface ɗin TUN yawanci yana ƙin tsawon fakitin. Interface ɗin yana da MTU, fakiti mafi girma da shi ba za a iya sa shi a jere ba, kuma sake gwada wannan fakitin yana gazawa iri ɗaya kowace lokaci. Wannan tabbaci shi ne alamar. Ƙarancin buffer na gaske yana sharewa yayin da matsin ya ragu, yayin da ƙin girma ba ya damu da tsawon da kake jira.

TCP yana da inji don wannan daidai, kuma shi ne matakin da mutane ke tsallakawa: ƙuntatawar MSS. Lokacin da kake ƙirƙirar segments a cikin sararin mai amfani kai ne ke zaɓar girman payload ɗin, kuma ɗaukar shi daga MTU na interface ɗin gida maimakon MTU na tunnel yana fitar da segments da tunnel ba zai iya ɗauka ba. Ƙuntata zuwa ƙarami daga cikinsu biyu. Ƙuntatawar tana rufe TCP ne kawai, don haka datagram ɗin UDP da ya wuce girma dole ne lambar ɗinka ta raba shi ko ta jefar da shi.

Yi rijistar tsawon kowane fakitin da ka rubuta yayin da kake gyara. Tsawon da ya gaza shi ne amsar, kuma ba zai motsa ba tsakanin yunƙuri.

Ma'auni uku da suke raba al'amuran

Ba ka bukatar debugger don kowane ɗaya daga cikin gazawar biyu. Dubawa uku sun isa ka kai kanka zuwa sashen da ya dace, kuma suna ɗaukar ƙasa da lokacin sake ginawa.

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

Idan layi na uku ya dace, luf ɗin kansa yana da kyau kuma matsalar tana inda tunnel ba zai iya ganinta ba: socket ɗin jigilar da ba a kare shi ba wanda ke ɗaukar zirga-zirgar VPN ɗinka ta koma cikin tunnel, wanda yawanci yana bayyana a matsayin haɗin da ya yi nasara sannan bai isar da komai ba.

Gyara aikin bututun da hanyoyin biyu suka dogara da shi

Babu alamar da ta cancanci bibiya har sai an gina interface ɗin daidai. Kiran builder masu muhimmanci su ne adireshi, hanya, MTU da yarda, a wannan tsari:

Builder()
  .addAddress(10.8.0.2, 32)
  .addRoute(0.0.0.0, 0)
  .setMtu(1400)
  .establish()

Saita MTU zuwa ainihin ƙimar tunnel maimakon barin shi a kan abin da misalin ya yi amfani da shi. Duk abin da ka rubuta daga baya yana iyakance da wannan lambar, kuma rashin daidaituwa tsakanin MTU da ka saita da MSS da kake ƙuntata zuwa gare shi ita ce hanyar da ta fi yawa ta dawo da gazawar rubutu bayan gyara. Sannan ka kare socket ɗin da ke ɗaukar zirga-zirga zuwa sabar VPN da kanta. Ba tare da protect ba ana tura waɗannan fakiti zuwa cikin tunnel ɗinka kuma haɗin ba ya ƙarewa, wanda yake kama da tsayawar karatu amma luf ɗin ture ne.

Ba za a iya tsallake yarda ba. Sabis ɗin da aka fara ba tare da prepare ya mayar da null ba yana samun interface, kuma establish yana mayar da null maimakon jefawa, don haka duba descriptor ɗin kafin ka fara luf ɗinka. Bayanan VpnService shi ne wurin tabbatar da yarjejeniyar builder maimakon kwafin misali.

Tabbatar da shugabanci ɗaya a lokaci ɗaya

Aika amsar UDP ta cikin tunnel ka kalli tsawon fakiti kafin ka taɓa TCP. Sannan buɗe musafaha ka tabbatar segments sun kasance ƙasa da MSS da ka lissafta. Ƙidaya fakiti maimakon haɗi, don tsayawa ta bayyana a matsayin rami a cikin ma'auni maimakon socket ɗin da ya ratse. Idan karatu ya tsaya bayan tarin rubutu, taga shi ne wanda ake zargi; idan rubutu ya gaza nan take, tsawon ne.

Sannan sake kunna na'urar ka maimaita sau ɗaya, domin VpnService da ke aiki kawai har sai an canza hanyar sadarwa ta farko matsalar ture ce ba ta sarrafa kwarara ba.

Labarai masu alaƙa