برنامهٔ گوشی و سرور دوردست با واقعیت‌های متفاوت شروع می‌کنند و هیچ‌کدام نمی‌تواند واقعیت‌های دیگری را قرض بگیرد. برنامه می‌تواند از سیستم‌عامل دربارهٔ شبکه‌ای که به کار می‌برد بپرسد، در حالی که سرور تنها چیزی را می‌داند که از طریق اتصال می‌رسد. اجرای نقطهٔ پایانی خودتان دومی را بازنویسی می‌کند و اولی را دست‌نخورده می‌گذارد. اینکه کدام‌یک به پرسش شما پاسخ می‌دهد به خود پرسش بستگی دارد.

دو نقطهٔ مشاهده، دو گونه دلیل

دلیل محلی دستگاه را توصیف می‌کند. رابطی را در بر می‌گیرد که ترافیک را حمل می‌کند، ترابری را که سکو گزارش می‌کند، و آنچه برنامهٔ فراخواننده اجازه دارد بپرسد. دلیل دوردست اتصال را توصیف می‌کند: نشانی مبدأ، پروتکل، زمان‌بندی و هر چیزی که برنامه تصمیم بگیرد بفرستد. هیچ نقطهٔ مشاهده‌ای ابرمجموعهٔ دیگری نیست.

آمیختن این دو ادعاهایی می‌سازد که دقیق به گوش می‌رسند و بازبینی‌پذیر نیستند. نشانه چیزی را دربارهٔ یک شیء شبکه در دستگاه اثبات می‌کند، نه دربارهٔ اینکه یک سرویس دوردست درخواست را چگونه دسته‌بندی می‌کند.

پیش از بحث دربارهٔ تشخیص، بنویسید پرسش به کدام نقطه مربوط است. آیا مسئله این است که برنامهٔ خاصی می‌تواند بفهمد تونلی فعال است، یا اینکه سرویسی می‌تواند استنباط کند درخواست از کجا آمده است؟ این‌ها بررسی‌های جدایند و پاسخ به یکی دربارهٔ دیگری چیزی نمی‌گوید.

رابط محلی سکو چه چیزی را می‌تواند گزارش کند

اندروید نشانهٔ مشخصی عرضه می‌کند. شیء NetworkCapabilities می‌تواند TRANSPORT_VPN را گزارش کند، و hasTransport بررسی می‌کند که آیا آن ترابری روی شیء حاضر است. برنامه شیء را از سرویس اتصال می‌گیرد و می‌خواند، مشروط به مجوز وضعیت شبکه.

نتیجه اطلاعات محلی سکوست، نه جست‌وجو در بازه‌های نشانی یک ارائه‌دهنده. شبکه‌ای را توصیف می‌کند که برنامهٔ فراخواننده به کار می‌برد.

دو محدودیت مهم است. قاعدهٔ تونل تقسیم‌شده که برنامه‌ای را کنار می‌گذارد می‌تواند روی همان گوشی پاسخی متفاوت از آنچه همکاری می‌بیند بدهد، چون برنامه ممکن است جای دیگری بسته شده باشد. نشانه همچنین هست چون سیستم‌عامل رابط‌های VPN را مدل می‌کند، نه چون برنامهٔ خاصی آن را جمع می‌کند. اینکه برنامه‌ای این میدان را بخواند، بفرستد یا نادیده بگیرد ویژگی همان برنامه است. مانیفست و مستندات آن تنها منابع قابل اعتماد برای این پرسش‌اند.

adb shell dumpsys connectivity | grep -i -m5 vpn

سرویس دوردست چه چیزی را می‌تواند ببیند

سرور نشانی مبدأ اتصال، ترابری و زمان‌بندی را می‌بیند و می‌تواند نشانی را با داده‌های ثبت یا مسیریابی غنی کند. همچنین می‌تواند هر چیزی را که برنامه می‌فرستد دریافت کند، از جمله مکان را وقتی برنامه آن را درخواست می‌کند و کاربر می‌پذیرد. این کانال‌ها جدا هستند و تنها یکی به جست‌وجوی نشانی شباهت دارد.

نشانی ثبت‌شده به نام یک ارائه‌دهندهٔ میزبانی به تونل اشاره دارد، در حالی که نشانی ثبت‌شده در شبکهٔ مسکونی به اتصال خانگی اشاره دارد. هر دو نشانه‌های آماری‌اند، نه واقعیت‌هایی دربارهٔ دستگاه.

نشانی مسکونی شخص را در آن نشانی قرار نمی‌دهد و نشانی میزبانی نام اپراتور یا کشور را نمی‌آورد. سرویسی که استنباط را قطعیت بگیرد گاهی اشتباه خواهد کرد بی‌آنکه بتواند آن را تشخیص دهد. اگر نیاز، قابلیت اعتماد باشد نه یک فرضیهٔ ابتکاری، داده‌های نشانی نمی‌توانند آن را فراهم کنند و طراحی‌ای که این را می‌گوید صادقانه‌تر از طراحی‌ای است که حدس را پنهان می‌کند.

دلیلبه چه چیزی پاسخ می‌دهدچه چیزی را نمی‌تواند نشان دهد
نشانهٔ محلی ترابریاینکه آیا این شیء شبکه VPN استچه کسی خروج را اداره می‌کند یا دستگاه کجاست
نشانی مبدأ دوردستکدام نشانی به سرویس رسیداینکه آیا دستگاه تونل هم دارد
بار برنامهآنچه برنامه برای فرستادن برگزیدهر چیزی که برنامه نفرستاد

چرا خروج خودمیزبان تنها یک طرف را تغییر می‌دهد

اجرای نقطهٔ پایانی خودتان نشانی مبدأیی را تغییر می‌دهد که سرویس دوردست می‌بیند، و این می‌تواند آن را بیرون از بازه‌هایی ببرد که آن سرویس با ارائه‌دهندگان تجاری مرتبط می‌داند. در مدل شبکهٔ محلی چیزی را تغییر نمی‌دهد، چون تونل تونل می‌ماند و سیستم‌عامل هنوز آن را گزارش می‌کند.

یک طرف دلیل جابه‌جا می‌شود و طرف دیگر ثابت می‌ماند. شکاف میان آن دو جایی است که انتظارها می‌شکنند.

مرورگر مورد سومی است با رابط‌ها و محدودیت‌های خودش. محتوای وب نمی‌تواند شیء توانمندی بومی را بخواند و اینکه ویژگی یک سیستم‌عامل موبایل را برای یک صفحهٔ وب در دسترس بدانیم خطای دسته‌ای است. اگر پرسش دربارهٔ یک وبگاه است، بررسی کنید وبگاه در واقع چه چیزی می‌تواند به دست آورد، نه اینکه یک API سکو را حرف‌به‌حرف بازنویسی کنید.

با پرسشی که می‌پرسید تصمیم بگیرید

اگر پرسش این است که آیا برنامهٔ خاصی می‌تواند وضعیت تونل را مشاهده کند، رابط سکو جای درست برای نگاه کردن است و پاسخ در کد و مجوزهای همان برنامه است. اگر پرسش این است که سرویس چه چیزی را می‌تواند استنباط کند، فرادادهٔ اتصال دلیل است. پرسش حقوقی یا قراردادی با هیچ‌یک حل نمی‌شود.

پرسش را پیش از گردآوری هر چیزی در یک جمله نام بگذارید. همان جمله تعیین می‌کند کدام نقطهٔ مشاهده اهمیت دارد و نمی‌گذارد بررسی به بحثی دیگر بلغزد.

هر مشاهده را هنگام گزارش بر پایهٔ منبعش برچسب بزنید، چون ادعای بی‌برچسب را نمی‌توان بازبینی کرد. نشانهٔ محلی و استنباط از نشانی هر دو سودمندند و هیچ‌کدام قطعی نیست، از همین رو آمیختن آنها در یک حکم خطاست.

وقتی سرویسی اتصال مجاز را رد می‌کند، از مسیر بازبینی پشتیبانی‌شدهٔ آن استفاده کنید، نه اینکه تنظیمی محلی را برای پنهان کردن یک نشانه تغییر دهید. برداشتن یک مشاهده هرگز اثبات نمی‌کند که بقیه ناپدید شده‌اند.

مقالات مرتبط