
أداة لتكرار الطلبات عبر الإنترنت وإعادة تشغيل تدفقات TCP، مثالية للاختبار الحقيقي، اختبار الأداء، اختبار الاستقرار، اختبار الإجهاد، اختبار الحمل، اختبار التدخين، والمزيد.
TCPCopy هي أداة إعادة تشغيل تدفق TCP للاختبار الواقعي لتطبيقات خوادم الإنترنت.
نظرة عامة على TCPCopy للمبتدئين
نظرة عامة عامة على بنية TCPCopy
أمثلة التسخين المسبق لـ TCPCopy
على الرغم من أن حركة المرور الحية الحقيقية ضرورية لاختبار تطبيقات خوادم الإنترنت، إلا أن محاكاتها بدقة يمثل تحديًا بسبب تعقيد البيئات عبر الإنترنت. لتمكين اختبار أكثر واقعية، تم تطوير TCPCopy كأداة إعادة إنتاج التدفق الحي لتوليد أحمال عمل اختبارية تشبه إلى حد كبير أحمال العمل الإنتاجية. يستخدم TCPCopy على نطاق واسع من قبل الشركات في الصين.
يؤثر TCPCopy بشكل طفيف على نظام الإنتاج، حيث يستهلك فقط وحدة معالجة مركزية إضافية وذاكرة وعرض نطاق ترددي. يعكس عبء العمل المُعاد إنتاجه بيئة الإنتاج من حيث تنوع الطلبات وزمن وصول الشبكة واستخدام الموارد.

الشكل 1. نظرة عامة على بنية TCPCopy.
كما هو موضح في الشكل 1، يتكون TCPCopy من مكونين: tcpcopy و intercept. يعمل مكون tcpcopy على الخادم عبر الإنترنت، حيث يلتقط الطلبات الحية، بينما يعمل intercept على خادم المساعد، ويقوم بمهام مثل تمرير معلومات الاستجابة إلى tcpcopy. يعمل تطبيق الاختبار نفسه على الخادم الهدف.
افتراضيًا، يستخدم tcpcopy مآخذ توصيل خام لالتقاط الحزم في طبقة الشبكة (كما هو موضح بالسهام البرتقالية في الشكل). يتعامل مع عمليات مثل محاكاة تفاعل TCP، والتحكم في زمن وصول الشبكة، ومحاكاة التفاعل في الطبقة العليا. ثم يرسل الحزم إلى الخادم الهدف باستخدام مآخذ توصيل خام للإخراج (كما هو موضح بالسهام الحمراء الفاتحة في الشكل).
المهمة الوحيدة المطلوبة على الخادم الهدف هي تكوين قواعد التوجيه لتوجيه حزم الاستجابة (كما هو موضح بالسهام الخضراء الفاتحة في الشكل) إلى خادم المساعد.
دور مكون intercept هو إعادة توجيه رأس الاستجابة (افتراضيًا) إلى tcpcopy. يلتقط حزم الاستجابة، ويستخرج معلومات رأس الاستجابة، ويرسل هذه المعلومات إلى tcpcopy عبر قناة مخصصة (ممثلة بالسهام الزرقاء الفاتحة في الشكل). عند استلام رأس الاستجابة، يستخدم tcpcopy المعلومات لتعديل سمات الحزم عبر الإنترنت ويواصل إرسال الحزم اللاحقة.
من المهم ملاحظة أن الاستجابات من الخادم الهدف يتم توجيهها إلى خادم المساعد، الذي يعمل بمثابة ثقب أسود.
بالنسبة لـ intercept، لديك خياران:
git clone git://github.com/session-replay-tools/intercept.git.بالنسبة لـ tcpcopy، لديك أيضًا خياران
git clone git://github.com/session-replay-tools/tcpcopy.git.intercept:cd intercept./configure makeintercept:make installintercept--single
تشغيل intercept في الوضع غير الموزع.
--with-pfring=PATH
تحديد مسار مكتبات مصدر PF_RING.
--with-debug
تجميع intercept مع دعم التصحيح، مع حفظ السجلات في ملف.
tcpcopy على الخادم عبر الإنترنتtcpcopy:cd tcpcopy./configure maketcpcopy:make installtcpcopy--offline
إعادة تشغيل تدفقات TCP من ملف pcap.
--pcap-capture
التقاط الحزم في طبقة ارتباط البيانات.
--pcap-send
إرسال الحزم في طبقة ارتباط البيانات بدلاً من طبقة IP.
--with-pfring=PATH
تحديد مسار مكتبات مصدر PF_RING.
--set-protocol-module=PATH
تعيين tcpcopy للعمل مع وحدة بروتوكول خارجية.
--single
إذا تم تكوين كل من intercept و tcpcopy باستخدام الخيار --single، فسيعمل نسخة واحدة فقط من tcpcopy مع intercept، مما يؤدي إلى أداء أفضل.
--with-tcmalloc
استخدام tcmalloc بدلاً من malloc.
افترض أنه تم تكوين كل من tcpcopy و intercept باستخدام ./configure.
على الخادم الهدف الذي يعمل عليه تطبيقات الخادم:
قم بتكوين قواعد التوجيه لتوجيه حزم الاستجابة إلى خادم المساعد. على سبيل المثال، إذا كان 61.135.233.161 هو عنوان IP لخادم المساعد، استخدم أمر التوجيه التالي لتوجيه جميع الاستجابات من العملاء في نطاق 62.135.200.x إلى خادم المساعد:
route add -net 62.135.200.0 netmask 255.255.255.0 gw 61.135.233.161
على خادم المساعد الذي يعمل عليه intercept (مطلوب صلاحية الجذر أو صلاحية CAP_NET_RAW):
./intercept -F <filter> -i <device>
لاحظ أن تنسيق المرشح هو نفس تنسيق مرشح pcap. على سبيل المثال:
./intercept -i eth0 -F 'tcp and src port 8080' -d
في هذا المثال، سيلتقط intercept حزم الاستجابة من تطبيق يعتمد على TCP يستمع على المنفذ 8080، باستخدام جهاز الشبكة eth0.
يرجى ملاحظة أن ip_forward غير ممكّن على خادم المساعد.
على خادم المصدر عبر الإنترنت (مطلوب صلاحية الجذر أو صلاحية CAP_NET_RAW):
./tcpcopy -x localServerPort-targetServerIP:targetServerPort -s <intercept server> [-c <ip range>]
CAP_NET_RAW (مثل setcap CAP_NET_RAW=ep tcpcopy)../configure --with-resp-payload لـ intercept مع خيار ./configure لـ tcpcopy.ip_forward على خادم المساعد../tcpcopy -h أو ./intercept -h.يمكن لعدة عوامل أن تؤثر على TCPCopy، كما هو مفصل في الأقسام التالية.
بشكل افتراضي، يستخدم tcpcopy واجهة إدخال مآخذ توصيل خام لالتقاط الحزم في طبقة الشبكة على الخادم عبر الإنترنت. تحت الحمل العالي، قد يقوم نواة النظام بإسقاط بعض الحزم.
إذا تم تكوينه باستخدام --pcap-capture، فإن tcpcopy يلتقط الحزم في طبقة ارتباط البيانات ويمكنه ترشيح الحزم في النواة. يمكن أن يؤدي استخدام PF_RING مع التقاط pcap إلى تقليل فقدان الحزم.
للحصول على التقاط مثالي، ضع في اعتبارك عكس حزم الإدخال عبر محول وتوزيع حركة المرور عبر أجهزة متعددة باستخدام موازن تحميل.
يستخدم tcpcopy افتراضيًا واجهة إخراج مآخذ توصيل خام لإرسال الحزم في طبقة الشبكة إلى الخادم الهدف. لتجنب مشاكل ip_conntrack أو تحسين الأداء، استخدم --pcap-send لإرسال الحزم في طبقة ارتباط البيانات بدلاً من ذلك.
قد تواجه الحزم التي يرسلها tcpcopy تحديات قبل الوصول إلى الخادم الهدف. إذا كان عنوان IP المصدر هو عنوان IP للمستخدم النهائي (افتراضيًا)، فقد تقوم أجهزة الأمان بإسقاط الحزمة باعتبارها غير صالحة أو مزيفة. لاختبار ذلك، استخدم tcpdump على الخادم الهدف. إذا تم إرسال الحزم بنجاح داخل نفس قطاع الشبكة ولكن ليس عبر القطاعات، فقد يتم إسقاط الحزم في منتصف الطريق.
لمعالجة ذلك، قم بنشر tcpcopy والتطبيقات الهدف و intercept داخل نفس قطاع الشبكة. بدلاً من ذلك، استخدم وكيلاً في نفس القطاع لإعادة توجيه الحزم إلى الخادم الهدف في قطاع آخر.
قد يواجه نشر تطبيق الخادم الهدف على جهاز افتراضي داخل نفس القطاع هذه المشكلات أيضًا.
قد يستخدم الخادم الهدف rpfilter للتحقق من شرعية عناوين IP المصدر، وإسقاط الحزم التي تعتبر مزيفة. إذا تم التقاط الحزم بواسطة tcpdump ولكن لم تتم معالجتها، فتحقق من إعدادات rpfilter واضبطها أو أزلها حسب الحاجة. قد تؤثر مشكلات أخرى مثل إعدادات iptables أيضًا على tcpcopy.
قد لا تقوم التطبيقات على الخادم الهدف بمعالجة جميع الطلبات على الفور. يمكن أن تؤدي الأخطاء أو القيود في التطبيق إلى استجابات متأخرة أو طلبات غير معالجة في مخزن المؤقت للمقبس.
تأكد من تعيين ip_forward على false على خادم المساعد لمنعه من توجيه الحزم وضمان عمله كثقب أسود.
أولاً، استخدم telnet على الخادم عبر الإنترنت للاتصال بمنفذ خادم الاختبار. سيتحقق هذا مما إذا كان مسار الشبكة متاحًا. إذا فشل الاتصال، قم بحل هذه المشكلة قبل متابعة التشخيصات التالية.
افترض أنه أثناء اختبار tcpcopy، لا يتلقى التطبيق على خادم الاختبار أي طلبات. حدد ما إذا كانت حزمة المصافحة الأولية (أي حزمة SYN) تصل إلى خادم الاختبار.
1.1 تم التقاط حزم SYN فقط:
إذا كنت تستخدم tcpdump على خادم الاختبار ورأيت أن حزم SYN المنسوخة تصل، فهذا يشير إلى أنها وصلت إلى طبقة ارتباط البيانات لخادم الاختبار. إذا أظهر netstat عدم وجود اتصالات للتطبيق، فهذا يعني أنه تم إسقاط الحزم في طبقة IP. تحقق مما إذا كان rpfilter مهيئًا - إذا كان كذلك، قم بإزالة هذا الإعداد، ويجب حل المشكلة بشكل عام. إذا لم يتم تعيين rpfilter، فتأكد من عدم وجود تعارضات في إعدادات iptables واضبط القواعد ذات الصلة إذا لزم الأمر.
1.2 SYN متبوعة بحزمة RST: إذا تم إرسال حزمة SYN فورًا بعدها حزمة إعادة تعيين (RST) (مع أقل من ثانية واحدة بينهما في نفس الجلسة)، فهذا يشير إلى وجود مشكلة توجيه أو تعارض، مما يؤدي إلى إرسال حزمة الاستجابة مباشرة إلى العميل الحقيقي.
1.3 خادم الاختبار يستجيب بحزمة المصافحة الثانية: قم بالتقاط الحزم على خادم المساعد للتحقق مما إذا كانت حزمة المصافحة الثانية قد وصلت إليه.
إذا لم تصل الحزمة إلى خادم المساعد، فهذا يشير إلى أن إعداد التوجيه غير فعال، وبالتالي لا يمكن لـ intercept التقاط حزمة المصافحة الثانية، مما يمنع المزيد من إعادة التشغيل. الحل المحتمل هو تشغيل intercept مباشرة على خادم الاختبار (ملاحظة: حافظ على إعداد التوجيه دون تغيير، وتأكد من أن المعامل -c في tcpcopy لم يتم تعيينه على عنوان IP الذي يستخدمه tcpcopy للاتصال بـ intercept، وإلا فلن يتصل tcpcopy بـ intercept).
إذا تم التقاط حزمة المصافحة الثانية، تحقق مما إذا كان ip_forward ممكّنًا. إذا كان ممكّنًا، قم بتعطيل هذا الإعداد، لأنه قد يؤدي إلى إرسال حزم الاستجابة مباشرة إلى العميل، مما يتداخل مع الاختبار.
2.1 تم التقاط حزم tcpcopy على الخادم عبر الإنترنت:
إذا قمت بالتقاط حزم tcpcopy المُعاد توجيهها باستخدام tcpdump على الخادم عبر الإنترنت، ولكن الحزم لا تصل إلى خادم الاختبار، فهذا يشير إلى أنها تم إسقاطها على طول الطريق. يمكنك محاولة استخدام المعامل -c في tcpcopy لتعديل عنوان IP للعميل إلى عنوان صالح. في الحالات القصوى، قم بتعيين عنوان IP للعميل إلى عنوان IP للجهاز الذي يعمل عليه tcpcopy (ملاحظة: قد تنشأ مشاكل NAT، وإذا كان intercept يعمل على خادم الاختبار، فتأكد من أن المعامل -c في tcpcopy لم يتم تعيينه على عنوان IP الذي يستخدمه tcpcopy للاتصال بـ intercept، وإلا فلن يتصل tcpcopy بـ intercept).
2.2 لم يتم التقاط حزم tcpcopy على الخادم عبر الإنترنت:
إذا لم يتم العثور على معلومات all clt:xx في سجل tcpcopy، فهذا يشير إلى أن tcpcopy غير قادر على التقاط الحزم في طبقة IP. في هذه الحالة، استخدم الخيار --pcap-capture لالتقاط الحزم في طبقة ارتباط البيانات. قم بتعيين المعامل -F (على سبيل المثال، 'tcp and dst port 80 and dst host 10.100.1.2') والمعامل -i (واجهة الشبكة) لتجاوز الالتقاط في طبقة IP.
إذا تم رؤية all clt:xx، حيث xx > 0، في سجل tcpcopy، فهذا يعني أن tcpcopy التقط الحزمة بنجاح، ولكن تمت تصفيتها بواسطة طبقة IP على الخادم عبر الإنترنت. تحقق من قيود iptables على سلسلة الإخراج، من بين إعدادات أخرى. إذا كانت iptables هي المشكلة ولا يمكن تعديلها على الخادم عبر الإنترنت، فاستخدم الخيار --pcap-send لإرسال الحزم من طبقة ارتباط البيانات.
هل لديك خطأ أو طلب ميزة؟ يرجى فتح مشكلة جديدة. قبل فتح أي مشكلة، يرجى البحث عن المشكلات الموجودة.
إذا وجدت هذا المشروع مفيدًا، فكر في التبرع:
حقوق النشر 2025 بموجب ترخيص BSD.
كان العديد من الأفراد حاسمين في كتابة هذا المستند من خلال مراجعة المسودات وتقديم الملاحظات. أنا ممتن بشكل خاص لمساهمات Hongshen Wang.
--with-debug
تجميع tcpcopy مع دعم التصحيح، مع حفظ السجلات في ملف.
على سبيل المثال (بافتراض أن 61.135.233.160 هو عنوان IP للخادم الهدف):
./tcpcopy -x 80-61.135.233.160:8080 -s 61.135.233.161 -c 62.135.200.x
في هذا المثال، يلتقط tcpcopy الحزم على المنفذ 80 من الخادم الحالي، ويغير عنوان IP للعميل إلى عنوان من نطاق 62.135.200.x، ويرسل هذه الحزم إلى المنفذ 8080 على الخادم الهدف (61.135.233.160). كما يتصل بـ 61.135.233.161 لطلب intercept لإعادة توجيه حزم الاستجابة. على الرغم من أن معامل -c اختياري، إلا أنه يستخدم هنا لتبسيط قواعد التوجيه.