ටනලය ඉහළ යයි, යතුරු නිරූපකය දිස්වේ, නමුත් බ්‍රව්සරයේ සෑම ඉල්ලීමක්ම තවමත් කාලය ඉකුත් වී අසාර්ථක වේ. VpnService යෙදුමක මෙම සංයෝගය සාමාන්‍යයෙන් අදහස් කරන්නේ කියවීම් ලූපය ජීවමාන බවත් පිටවීමේ අඩක් කැඩී ඇති බවත් ය, සේවාදායකය අතට ගැනීම ප්‍රතික්ෂේප කළ බව නොවේ. Android දැනටමත් අතුරුමුහුණත සාදා, යෙදුමේ රථවාහන එයට ගෙන ගොස් ඔබේ ක්‍රියාවලියට ගොනු විස්තරකයක් ලබා දී ඇත. එම විස්තරකයට පසු සියල්ල ඔබේ කේතයයි, එක් අතහැරුණු ඇමතුමක් මුළු ප්‍රවාහයම ගිල දැමීමට ප්‍රමාණවත්ය.

පද්ධතිය ලබා දෙන දේ සහ නොදෙන දේ

establish() tun අතුරුමුහුණතක් සඳහා ParcelFileDescriptor එකක් ලබා දෙයි. පද්ධතිය පිටතට යන IP පැකට් එයට ලියන අතර ඔබේ ක්‍රියාවලිය ඒවා කියවා, කොහේ යයිද තීරණය කර සාමාන්‍ය සොකට් එකක් හරහා යවනු ඇතැයි අපේක්ෂා කරයි. යටින් කර්නල් යැවීමක් නැත, එබැවින් කිසිවෙකු නොකියවන විට පැකට් ඉවතලන අතර අතුරුමුහුණතේ ගණකයන් කිසිදා නොසෙල්වේ.

අනුමානය වෙනුවට ගණන් කිරීමෙන් අරඹන්න. සෑම සාර්ථක කියවීමකදීම ගණකයක් වැඩි කර පළමු පැකට්වල ගමනාන්තය සහ ප්‍රොටොකෝලය සටහන් කරන්න. රථවාහන නිපදවන විට ගණකය ශුන්‍යව පවතී නම්, දෝෂය ඔබේ යැවීම් කේතයට ඉහළින් පිහිටයි, එය සෙවීම builder වින්‍යාසය සහ කියවීම් මාදිලියට සීමා කරයි. ගණකය සෙලවී බ්‍රව්සරය තවමත් අසාර්ථක නම්, දෝෂය යැවීමේ හෝ ආපසු එන මාර්ගයේ ය.

බ්ලොක් කරන කියවීම ලූපය සෙලවේද යන්න තීරණය කරයි

setBlocking(true) විස්තරකය බ්ලොක් මාදිලියට දමන අතර API 21 සිට පවතී. පැරණි නිකුතුවල විසඳුම වන්නේ අමු විස්තරකයේ fcntl මගින් O_NONBLOCK ඉවත් කරන කුඩා JNI සහායකයකි. මාදිලිය වැදගත් වන්නේ රැඳී පැකට් නොමැති කියවීමකට කුමක් කළ හැකිද යන්න එය තීරණය කරන නිසාය.

බ්ලොක් නොකරන මාදිලියේ එම කියවීම වහාම සෘණ අගයක් සමඟ ආපසු එයි, ප්‍රතිඵලය නොසලකන ලූපයක් කිසිදු රථවාහනයක් නොසෙල්වා කෝරයක් කරකවයි. බ්ලොක් මාදිලියේ කියවීම රැඳී සිටී, යැවීම් නූලට එයම අවශ්‍යයි, නමුත් ඉන්පසු නූල බාධා කළ නොහැක. කියවීම අසාර්ථක කිරීමට ඇති ආධාරක මාර්ගය විස්තරකය වැසීමයි, එවිට ලූපයට පිටවිය හැක. ක්‍රියාවලිය මැරීම හෝ නූල බාධා කිරීම ඊළඟ ආරම්භය අතුරුමුහුණතට නොගැළපෙන විස්තරකයක් සමඟ තැබිය හැක.

සෑම ඇමතුමකටම අතුරුමුහුණතේ MTU ප්‍රමාණයේ බෆරයකට එක් පැකට් එකක් කියවන්න, සහ ශුන්‍ය හෝ සෘණ ප්‍රතිලාභය හිස් පැකට් එකක් නොව දෝෂයක් ලෙස සලකන්න.

පළමු යැවීමට පෙර protect(), පසුව නොවේ

කැප්සියුලගත පැකට් එකක් ගෙන යන සෑම සොකට් එකක්ම මුලින්ම ආරක්ෂා කළ යුතුය. ආරක්ෂා නොකළ සොකට් ඔබ දැන් ස්ථාපනය කළ එම මාර්ග නීතිම පිළිපදියි, එබැවින් එහි පැකට් නැවත ටනලයට ගොස් ඔබේම කියවීම් ලූපය ඒවා නැවත ගනී. ඉන්පසු ටනලය තම පිටවීම අනන්තව යවයි, සහ පිටතින් එය විවෘත වන නමුත් කිසිදා පිළිතුරු නොදෙන සම්බන්ධතාවක් ලෙස පෙනේ.

අනුපිළිවෙල protect, පසුව connect හෝ bind, පසුව send ය. connectට පසු protect ඇමතීම පෙර මාර්ග තීරණය එලෙසම තැබිය හැක, එබැවින් ඇමතුම true ලබා දුන්නද සොකට් එක වැරදි මාර්ගය භාවිත කරයි. ලබා දෙන බූලියානු අගය පරීක්ෂා කර false විට ශබ්දයෙන් අසාර්ථක වන්න, ක්‍රියා කළ නොහැකි send එකකට ඇතුළු වීම වෙනුවට.

protect() කිසිදා ස්පර්ශ නොකළ සොකට් එකක sendtoයෙන් එන අවසර දෝෂය මෙම වැරැද්දේ සාමාන්‍ය ලකුණයි.

UDP නියැදිය HTTPS ගෙන යන්නේ නැත

බොහෝ නිබන්ධන පිටපත් කරන යැවීම් නියැදිය UDP පමණක් හසුරුවයි. TCPට අතට ගැනීම, අනුක්‍රම අංක, තහවුරු කිරීම් සහ නැවත යැවීම අවශ්‍ය වන අතර tun විස්තරකය සහ සොකට් අතර භාරය පිටපත් කරන ලූපයක් එයින් කිසිවක් ලබා නොදේ. එබැවින් UDP DNS විමසුමක් පහු වී යා හැකි අතර සෑම HTTPS ඉල්ලීමක්ම නතර වේ. එක්කෝ පරිශීලක අවකාශයේ TCP තට්ටුවක් ධාවනය කරන්න, නැතහොත් උපාංගයේ TCP අවසන් කර ප්‍රවාහය යවන දේශීය ප්‍රොක්සියට සම්බන්ධතා ලබා දෙන්න.

ඕනෑම දෙයක් නැවත ලිවීමට පෙර බෙදීම පරීක්ෂා කරන්න: එක් UDP විමසුමක් යවා එම සත්කාරකයට එක් TCP සම්බන්ධතාවක් විවෘත කරන්න. UDP මාර්ගය ක්‍රියා කර TCP මාර්ගය පළමු SYN මත රැඳී ඇත්නම්, ගැටලුව යැවීම් කේතයේ ය, සේවාදායකයේ නොවේ. එම එක් සංසන්දනය ප්‍රයෝජනවත් කිසිවක් නොමැති සේවාදායක ලොග් කියවීමට වැය වන විශාල කාලයක් ඉතිරි කරයි.

මාර්ග ලැයිස්තුව සහ යෙදුම් අනුව පෙරහන් ඔබ දකින දේ සීමා කරයි

addAddress, addRoute සහ addDns පද්ධතිය ටනලයට යවන දේ තීරණය කරයි. මාර්ග ලැයිස්තුවෙන් පිටත ගමනාන්තයක් කිසිදා ඔබේ විස්තරකයට ළඟා නොවේ, එබැවින් කොපමණ යැවීම් තර්කයක් වුවද එය නොසකසයි. ඔබ කරන builder ඇමතුම් සටහන් කර යෙදුම සැබවින්ම ළඟා වීමට උත්සාහ කරන ලිපින සමඟ සසඳන්න.

යෙදුම් අනුව තේරීමට තමන්ගේම පහළ සීමාවක් ඇත: addAllowedApplication සහ addDisallowedApplication ට API 21 අවශ්‍ය වන අතර පැරණි නිකුතුවල එම ක්‍රම නොමැත. පැකට් අනුව පෙරහන් කරන නිර්මාණයකට එහි කිසිසේත් ක්‍රියා කළ නොහැක.

නැවත ස්ථාපනය පැරණි විස්තරක ඉතිරි කරයි

establish() නැවත ඇමතීම නව විස්තරකයක් ලබා දී පෙර අතුරුමුහුණත වසා දමයි. පැරණි විස්තරකය දැන් වලංගු නොවේ, එබැවින් එය මත තවමත් බ්ලොක් වී සිටින නූලකට දෝෂයක් ලැබේ, පැරණි මාර්ගයට සාදන ලද සොකට් ප්‍රතිස්ථාපනය කිරීමට සිදු විය හැක. onRevoke යනු පරිශීලකයා හෝ පද්ධතිය ඉවත් කළ ටනලයක් සඳහා ඇති ආපසු ඇමතුමයි. නැවත ස්ථාපනයට පෙර කියවන්නා නවත්වන තනි හිමිකරුවෙකු ළඟ ජීවන චක්‍රය තැබීම සම්බන්ධිත-නමුත්-මළ තත්ත්ව බොහොමයක් වළක්වයි.

සෑම දෝෂයක්ම එය අයත් පියවර අනුව කියවන්න. recvfromයෙන් සම්බන්ධතා නැවත සැකසීම යනු ඔබේ කේතය තවමත් කියවන අතර ඈත කෙළවර වැසුණු බවයි. නරක ලිපින දෝෂයක් ශීර්ෂ විග්‍රහයට හෝ offset දෝෂයකට යොමු කරයි, ජාලයට නොවේ.

කාර්ය අනුපිළිවෙල: බ්ලොක් මාදිලිය සක්‍රීය, සෑම කියවීමකට එක් පැකට්, ශීර්ෂය විග්‍රහ කර ඇත, සොකට් ආරක්ෂිත, භාරය යවා ඇත, භාරදීමේදී පිරිසිදු වැසීම සහ ගමනාන්තය ආවරණය කරන මාර්ග ලැයිස්තුවක්.

අදාළ ලිපි