سرعة البروكسي: زمن الاستجابة والإنتاجية
سرعة البروكسي ليست رقماً واحداً، بل ثلاثة: زمن الاستجابة، والإنتاجية، وزمن وصول أول بايت. البروكسي يضيف مسافة إلى طريق اتصالك فيرفع زمن الاستجابة، وتحدّ أبطأ حلقة في السلسلة إنتاجيته. وتستطيع قياس كل مرحلة على حدة بأمر curl واحد.
ثلاثة مقاييس مختلفة
- زمن الاستجابة (latency). الوقت الذي تستغرقه رسالة لتذهب وتعود، ويُسمّى زمن الرحلة الكاملة (RTT). يقاس بالملّي ثانية، ويتحدد أساساً بالمسافة وعدد المحطات في الطريق.
- الإنتاجية (throughput). كمية البيانات التي تصل في الثانية بعد أن يبدأ النقل. تقاس بالميغابت في الثانية، ويحدّها عرض النطاق (bandwidth) في أضيق جزء من الطريق.
- زمن أول بايت (TTFB). الوقت من بدء الطلب حتى وصول أول بايت من الرد. يجمع زمن إنشاء الاتصال ورحلات المصافحة ووقت معالجة الخادم.
الصفحات والطلبات الصغيرة تتأثر بزمن الاستجابة أكثر من غيره. أما تنزيل ملف كبير فتحكمه الإنتاجية.
ماذا يحدث قبل أول بايت
هذا تسلسل طلب HTTPS عبر بروكسي HTTP على اتصال جديد:
- جهازك يفتح اتصال TCP بالبروكسي: رحلة كاملة بينك وبين البروكسي.
- يرسل أمر CONNECT باسم الموقع. البروكسي يحلّ الاسم ويفتح اتصالاً بالموقع، ثم يرد بالموافقة. هذه رحلة إلى البروكسي، ومعها رحلة بين البروكسي والموقع. شرح الأمر في بروكسي HTTPS وأمر CONNECT.
- مصافحة TLS بينك وبين الموقع عبر النفق. في TLS 1.3 تأخذ رحلة كاملة واحدة على الطريق كله، كما في RFC 8446، وفي الإصدار 1.2 رحلتين.
- الطلب نفسه: رحلة كاملة أخرى على الطريق كله، يضاف إليها وقت معالجة الخادم.
مثال حسابي: إن كانت الرحلة بينك وبين البروكسي 80 ms وبين البروكسي والموقع 20 ms، فالطريق كله 100 ms. يصل أول بايت بعد نحو 380 ms زائد وقت الخادم: 80 للاتصال، و100 لـCONNECT، و100 لـTLS، و100 للطلب.
مع SOCKS5 تختلف الخطوة الثانية فقط. يحدد RFC 1928 تبادلاً لاختيار طريقة المصادقة، ثم المصادقة إن وُجدت، ثم طلب الاتصال بالموقع. وعلى اتصال مفتوح مسبقاً تختفي الخطوات الثلاث الأولى، ويبقى الطلب وحده.
لماذا لا تكفي سرعة خطك
الإنتاجية عبر البروكسي لا تتجاوز أبطأ الحلقات: خطك، ثم الطريق إلى البروكسي، ثم خط البروكسي نفسه، ثم الطريق إلى الموقع. وزمن الاستجابة يدخل هنا أيضاً، لا في أول بايت وحده.
يشرح RFC 6349 السبب: بروتوكول TCP لا يرسل أكثر من حجم النافذة قبل أن يصله تأكيد الاستلام. فالإنتاجية القصوى تساوي حجم النافذة مضروباً في 8 ومقسوماً على زمن الرحلة. وكمية البيانات التي يجب أن تكون «في الطريق» لملء الخط هي حاصل ضرب عرض النطاق في زمن الرحلة (BDP).
مثال: نافذة 64 KB مع رحلة 200 ms تحدّ الاتصال الواحد بنحو 2.6 Mbit/s، مهما كان الخط سريعاً. ولملء خط 12 Mbit/s مع الرحلة نفسها تحتاج نافذة 300 KB على الأقل. ولهذا يكون البروكسي البعيد أبطأ في التنزيل من القريب، حتى بخطوط متساوية. وفقدان الحزم، الشائع في الشبكات اللاسلكية، يخفض الإنتاجية أكثر.
خصوصية المخارج الخلوية
في الشبكة الخلوية يضاف إلى الطريق جزء لاسلكي بين الجهاز والمحطة. زمن الاستجابة فيه يتغيّر مع قوة الإشارة وعدد المستخدمين على المحطة نفسها. لذلك تتفاوت القياسات على مخرج خلوي أكثر مما تتفاوت على خادم في مركز بيانات.
وحين يمتلئ الخط بتنزيل كبير، تتراكم الحزم في ذاكرات الانتظار على الطريق، فيرتفع زمن الاستجابة لكل الاتصالات الأخرى. فإن كان تنزيل يعمل في الخلفية، فتوقّع أن تبطؤ الصفحات معه. وسرعة الرفع في الشبكات الخلوية أقل عادةً من سرعة التنزيل.
القياس بتوقيتات curl
الخيار -w في curl يطبع توقيت كل مرحلة بعد انتهاء الطلب:
curl -s -o /dev/null -x http://HOST:PORT --proxy-user USER:PASS \
-w 'connect %{time_connect}\ntls %{time_appconnect}\nfirstbyte %{time_starttransfer}\ntotal %{time_total}\n' \
https://example.com/
كل القيم بالثواني، وكلها تُحسب من بداية الطلب لا من نهاية المرحلة السابقة. هذه معانيها كما في دليل curl:
| المتغير | ما يقيسه | ملاحظة مع البروكسي |
|---|---|---|
| time_namelookup | حتى انتهاء حلّ الاسم | البروكسي هو من يحلّ اسم الموقع، فيقيس هذا اسم البروكسي فقط |
| time_connect | حتى اكتمال اتصال TCP بالمضيف أو بالبروكسي | هنا هو الاتصال بالبروكسي، أي المسافة بينك وبينه |
| time_appconnect | حتى اكتمال مصافحة TLS مع المضيف البعيد | يشمل فتح النفق واتصال البروكسي بالموقع |
| time_starttransfer | حتى وصول أول بايت | هذا هو زمن أول بايت |
| time_total | مدة العملية كلها | يشمل النقل كاملاً |
| speed_download | متوسط سرعة التنزيل بالبايت في الثانية | اضربه في 8 لتحصل على البت في الثانية |
الفروق بين القيم تحدد موضع البطء:
- time_connect كبير: البروكسي بعيد عنك أو محمّل.
- الفرق بين time_appconnect وtime_connect كبير: البطء في إعداد النفق والطريق من البروكسي إلى الموقع.
- الفرق بين time_starttransfer وtime_appconnect كبير: الخادم بطيء في المعالجة، أو الطريق كله طويل.
ولقياس الإنتاجية نزّل ملفاً كبيراً، مئة ميغابايت مثلاً، واطبع %{speed_download}. الملفات الصغيرة لا تكفي، لأن TCP يبدأ بطيئاً ثم يكبّر نافذته تدريجياً.
كيف تقيس قياساً يُعتمد عليه
- كرّر كل قياس عشر مرات على الأقل، وخذ الوسيط لا المتوسط، لأن قيمة شاذة واحدة تفسد المتوسط.
- قِس الأمر نفسه دون -x، فالفرق بين النتيجتين هو كلفة البروكسي.
- فرّق بين الاتصال الجديد والاتصال المعاد استخدامه، فالأول يدفع كلفة المصافحات كلها.
- اختبر في أوقات مختلفة من اليوم، وعلى الموقع الذي ستستخدمه فعلاً.
كيف تحسّن السرعة
- أعد استخدام الاتصالات. اتصال مفتوح، أو HTTP/2 الذي يحمل طلبات كثيرة على اتصال واحد، يوفّر كل المصافحات.
- اختر مخرجاً قريباً من الموقع إن كانت المهمة تسمح، ومدخلاً قريباً منك إن كان المزوّد يتيح ذلك.
- اترك حلّ الأسماء للبروكسي بـsocks5h، فيتم قرب الموقع ولا يتسرّب إلى مزوّدك.
- لا تسلسل البروكسيات دون حاجة، فكل حلقة تضيف رحلة إلى كل مصافحة.
- وزّع التنزيلات الكبيرة على أكثر من اتصال إن كانت النافذة هي الحد، ضمن ما يسمح به المخرج.
في syriaproxy يخرج اتصالك من شبكة سيريتل للجيل الرابع داخل سوريا، بسرعة تصل إلى 12 Mbit/s. زمن الاستجابة يشمل الطريق منك إلى سوريا ثم إلى الموقع. لذلك تكون المواقع والخدمات السورية أسرع استجابة من المواقع البعيدة عن سوريا.
أسئلة شائعة
لماذا تبدو نتيجة اختبار السرعة عالية والصفحات بطيئة؟
اختبارات السرعة تقيس الإنتاجية بملفات كبيرة. أما الصفحات فتتكون من طلبات صغيرة كثيرة، وكل اتصال جديد بينها يدفع كلفة الرحلات، فيحكمها زمن الاستجابة.
ما الفرق بين Mbit/s وMB/s؟
البايت ثمانية بتات. فـ12 Mbit/s تعادل نحو 1.5 MB/s، وهذا ما يظهر عادةً في برامج التنزيل.
هل بروكسي HTTP أسرع من SOCKS5؟
الفرق صغير في الغالب. SOCKS5 مع المصادقة يحتاج تبادلات أكثر قليلاً عند فتح الاتصال، لكن بعد ذلك ينقل البيانات بالسرعة نفسها. والمسافة إلى البروكسي أهم من البروتوكول.
لماذا يكون القياس الأول أبطأ مما يليه؟
لأن الطلب الأول يدفع كلفة كل شيء: حلّ الأسماء، والاتصال، والمصافحات. الطلبات التالية تستفيد من ذاكرة الأسماء المؤقتة، وقد تستأنف جلسة TLS سابقة أو تعيد استخدام الاتصال نفسه.
قِس زمن استجابة بروكسيك بأداة فحص البروكسي المجانية، دون سطر أوامر.