
एक ऑनलाइन अनुरोध प्रतिकृति और TCP स्ट्रीम रीप्ले टूल, जो वास्तविक परीक्षण, प्रदर्शन परीक्षण, स्थिरता परीक्षण, तनाव परीक्षण, लोड परीक्षण, स्मोक टेस्टिंग और अधिक के लिए आदर्श है।
TCPCopy एक TCP स्ट्रीम रीप्ले टूल है जो इंटरनेट सर्वर अनुप्रयोगों के यथार्थवादी परीक्षण के लिए उपयोग होता है।
शुरुआती लोगों के लिए TCPCopy का एक अवलोकन
TCPCopy आर्किटेक्चर का एक सामान्य अवलोकन
TCPCopy परीक्षण उपयोग के मामले
हालाँकि इंटरनेट सर्वर अनुप्रयोगों के परीक्षण के लिए वास्तविक लाइव ट्रैफ़िक महत्वपूर्ण है, लेकिन ऑनलाइन वातावरण की जटिलता के कारण इसे सटीक रूप से अनुकरण करना चुनौतीपूर्ण है। अधिक यथार्थवादी परीक्षण को सक्षम करने के लिए, TCPCopy को एक लाइव फ़्लो पुनरुत्पादन उपकरण के रूप में विकसित किया गया था जो उत्पादन वर्कलोड से निकटता से मिलता-जुलता परीक्षण वर्कलोड उत्पन्न करता है। TCPCopy चीन में कंपनियों द्वारा व्यापक रूप से उपयोग किया जाता है।
TCPCopy उत्पादन प्रणाली को न्यूनतम रूप से प्रभावित करता है, केवल अतिरिक्त CPU, मेमोरी और बैंडविड्थ की खपत करता है। पुनरुत्पादित वर्कलोड अनुरोध विविधता, नेटवर्क विलंबता और संसाधन उपयोग के संदर्भ में उत्पादन वातावरण को दर्शाता है।

चित्र 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
pcap फ़ाइल से TCP स्ट्रीम्स को रीप्ले करें।
--pcap-capture
डेटा लिंक लेयर पर पैकेट कैप्चर करें।
--pcap-send
IP लेयर के बजाय डेटा लिंक लेयर पर पैकेट भेजें।
--with-pfring=PATH
PF_RING लाइब्रेरी स्रोतों का पथ निर्दिष्ट करें।
--set-protocol-module=PATH
tcpcopy को एक बाहरी प्रोटोकॉल मॉड्यूल के साथ काम करने के लिए सेट करें।
--single
यदि intercept और tcpcopy दोनों को --single विकल्प के साथ कॉन्फ़िगर किया गया है, तो केवल एक tcpcopy इंस्टेंस intercept के साथ काम करेगा, जिससे बेहतर प्रदर्शन होगा।
--with-tcmalloc
malloc के बजाय tcmalloc का उपयोग करें।
--with-debug
डीबग समर्थन के साथ tcpcopy संकलित करें, लॉग एक फ़ाइल में सहेजे जाएँगे।
मान लें कि 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 पोर्ट 8080 पर सुनने वाले TCP-आधारित एप्लिकेशन से प्रतिक्रिया पैकेट कैप्चर करेगा, eth0 नेटवर्क डिवाइस का उपयोग करके।
कृपया ध्यान दें कि सहायक सर्वर पर ip_forward सक्षम नहीं है।
ऑनलाइन स्रोत सर्वर पर (रूट विशेषाधिकार या CAP_NET_RAW क्षमता आवश्यक):
./tcpcopy -x localServerPort-targetServerIP:targetServerPort -s <intercept server> [-c <ip range>]
उदाहरण के लिए (मान लें कि 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 श्रेणी में से एक में बदलता है, और इन पैकेट को लक्ष्य सर्वर (61.135.233.160) के पोर्ट 8080 पर भेजता है। यह प्रतिक्रिया पैकेट अग्रेषित करने के लिए intercept का अनुरोध करने हेतु 61.135.233.161 से भी जुड़ता है। जबकि -c पैरामीटर वैकल्पिक है, इसका उपयोग यहाँ रूट नियमों को सरल बनाने के लिए किया गया है।
CAP_NET_RAW क्षमता की आवश्यकता है (जैसे, setcap CAP_NET_RAW=ep tcpcopy)।intercept के लिए ./configure --with-resp-payload विकल्प का उपयोग tcpcopy के ./configure विकल्प के साथ एक साथ नहीं किया जा सकता।ip_forward सक्षम नहीं है।./tcpcopy -h या ./intercept -h चलाएँ।कई कारक TCPCopy को प्रभावित कर सकते हैं, जैसा कि निम्नलिखित अनुभागों में विस्तृत है।
डिफ़ॉल्ट रूप से, tcpcopy ऑनलाइन सर्वर पर नेटवर्क लेयर पर पैकेट कैप्चर करने के लिए एक रॉ सॉकेट इनपुट इंटरफ़ेस का उपयोग करता है। उच्च लोड के तहत, सिस्टम कर्नेल कुछ पैकेट छोड़ सकता है।
यदि --pcap-capture के साथ कॉन्फ़िगर किया गया है, तो tcpcopy डेटा लिंक लेयर पर पैकेट कैप्चर करता है और कर्नेल में पैकेट फ़िल्टर कर सकता है। pcap कैप्चरिंग के साथ PF_RING का उपयोग पैकेट हानि को कम कर सकता है।
बेहतरीन कैप्चर के लिए, एक स्विच के माध्यम से इनग्रेस पैकेट को मिरर करने और लोड बैलेंसर के साथ कई मशीनों में ट्रैफ़िक वितरित करने पर विचार करें।
tcpcopy डिफ़ॉल्ट रूप से लक्ष्य सर्वर को नेटवर्क लेयर पर पैकेट भेजने के लिए एक रॉ सॉकेट आउटपुट इंटरफ़ेस का उपयोग करता है। ip_conntrack समस्याओं से बचने या प्रदर्शन में सुधार करने के लिए, इसके बजाय डेटा लिंक लेयर पर पैकेट भेजने के लिए --pcap-send का उपयोग करें।
tcpcopy द्वारा भेजे गए पैकेट को लक्ष्य सर्वर तक पहुँचने से पहले चुनौतियों का सामना करना पड़ सकता है। यदि स्रोत IP पता अंतिम उपयोगकर्ता का IP है (डिफ़ॉल्ट रूप से), तो सुरक्षा उपकरण पैकेट को अमान्य या जाली के रूप में छोड़ सकते हैं। इसका परीक्षण करने के लिए, लक्ष्य सर्वर पर tcpdump का उपयोग करें। यदि पैकेट एक ही नेटवर्क सेगमेंट के भीतर सफलतापूर्वक भेजे जाते हैं, लेकिन सेगमेंट के पार नहीं, तो पैकेट बीच में छोड़े जा सकते हैं।
इसे हल करने के लिए, tcpcopy, लक्ष्य एप्लिकेशन और intercept को एक ही नेटवर्क सेगमेंट में तैनात करें। वैकल्पिक रूप से, दूसरे सेगमेंट में लक्ष्य सर्वर पर पैकेट अग्रेषित करने के लिए उसी सेगमेंट में एक प्रॉक्सी का उपयोग करें।
लक्ष्य सर्वर के एप्लिकेशन को उसी सेगमेंट के भीतर एक वर्चुअल मशीन पर तैनात करने पर अभी भी ये समस्याएँ आ सकती हैं।
लक्ष्य सर्वर स्रोत IP पतों की वैधता सत्यापित करने के लिए rpfilter का उपयोग कर सकता है, जिससे जाली समझे जाने वाले पैकेट छूट सकते हैं। यदि पैकेट tcpdump द्वारा कैप्चर किए जाते हैं, लेकिन संसाधित नहीं होते, तो rpfilter सेटिंग्स जाँचें और आवश्यकतानुसार समायोजित या हटाएँ। अन्य समस्याएँ जैसे iptables सेटिंग्स भी tcpcopy को प्रभावित कर सकती हैं।
लक्ष्य सर्वर पर एप्लिकेशन सभी अनुरोधों को तुरंत संसाधित नहीं कर सकते हैं। एप्लिकेशन में बग या सीमाएँ सॉकेट बफर में विलंबित प्रतिक्रियाओं या असंसाधित अनुरोधों का कारण बन सकती हैं।
सुनिश्चित करें कि सहायक सर्वर पर ip_forward को गलत पर सेट किया गया है ताकि यह पैकेट को रूट न करे और यह एक ब्लैक होल के रूप में कार्य करे।
पहले, ऑनलाइन सर्वर पर telnet का उपयोग करके परीक्षण सर्वर के पोर्ट से कनेक्ट करें। यह जाँचेगा कि नेटवर्क पथ सुलभ है या नहीं। यदि कनेक्शन विफल होता है, तो निम्नलिखित निदान के साथ आगे बढ़ने से पहले इस समस्या को हल करें।
मान लें कि tcpcopy परीक्षण के दौरान, परीक्षण सर्वर पर एप्लिकेशन को कोई अनुरोध प्राप्त नहीं होता है। निर्धारित करें कि प्रारंभिक हैंडशेक पैकेट (अर्थात, SYN पैकेट) परीक्षण सर्वर तक पहुँचता है या नहीं।
1.1 केवल SYN पैकेट कैप्चर किए गए:
यदि आप परीक्षण सर्वर पर tcpdump का उपयोग करते हैं और देखते हैं कि दोहराए गए SYN पैकेट आ रहे हैं, तो यह इंगित करता है कि वे परीक्षण सर्वर की डेटा लिंक लेयर तक पहुँच गए हैं। यदि netstat एप्लिकेशन के लिए कोई कनेक्शन नहीं दिखाता है, तो इसका मतलब है कि पैकेट IP लेयर पर छोड़े गए। जाँचें कि क्या rpfilter कॉन्फ़िगर किया गया है—यदि हाँ, तो इस सेटिंग को हटा दें, और समस्या आम तौर पर हल हो जानी चाहिए। यदि rpfilter सेट नहीं है, तो पुष्टि करें कि iptables सेटिंग्स में कोई विरोध नहीं है और आवश्यकता होने पर प्रासंगिक नियमों को समायोजित करें।
1.2 SYN के बाद RST पैकेट: यदि SYN पैकेट के तुरंत बाद एक रीसेट (RST) पैकेट आता है (एक ही सत्र में उनके बीच 1 सेकंड से कम), तो यह एक रूटिंग समस्या या विरोध को इंगित करता है, जिसके कारण प्रतिक्रिया पैकेट सीधे वास्तविक क्लाइंट को वापस भेज दिया जाता है।
1.3 परीक्षण सर्वर दूसरे हैंडशेक पैकेट के साथ प्रतिक्रिया करता है: सहायक सर्वर पर पैकेट कैप्चर करें यह जाँचने के लिए कि दूसरा हैंडशेक पैकेट उस तक पहुँचा है या नहीं।
यदि पैकेट सहायक सर्वर तक नहीं पहुँचा है, तो यह सुझाव देता है कि रूटिंग सेटअप प्रभावी नहीं है, और इसलिए intercept दूसरे हैंडशेक पैकेट को कैप्चर नहीं कर सकता, जिससे आगे रीप्ले रुक जाता है। एक संभावित समाधान intercept को सीधे परीक्षण सर्वर पर चलाना है (ध्यान दें: रूटिंग सेटअप को अपरिवर्तित रखें, और सुनिश्चित करें कि tcpcopy में -c पैरामीटर उस IP पते पर सेट नहीं है जिसका उपयोग tcpcopy intercept से कनेक्ट करने के लिए करता है, अन्यथा tcpcopy intercept से कनेक्ट नहीं होगा)।
यदि दूसरा हैंडशेक पैकेट कैप्चर किया गया है, तो जाँचें कि क्या ip_forward सक्षम है। यदि हाँ, तो इस सेटिंग को अक्षम करें, क्योंकि इससे प्रतिक्रिया पैकेट सीधे क्लाइंट को वापस भेजे जा सकते हैं, परीक्षण में हस्तक्षेप हो सकता है।
2.1 ऑनलाइन सर्वर पर tcpcopy पैकेट कैप्चर किए गए:
यदि आप ऑनलाइन सर्वर पर tcpdump का उपयोग करके tcpcopy के अग्रेषित पैकेट कैप्चर करते हैं, लेकिन पैकेट परीक्षण सर्वर तक नहीं पहुँचते हैं, तो यह इंगित करता है कि वे रास्ते में छोड़ दिए गए। आप क्लाइंट IP पते को एक मान्य पते में संशोधित करने के लिए tcpcopy में -c पैरामीटर का उपयोग करने का प्रयास कर सकते हैं। चरम मामलों में, क्लाइंट IP को tcpcopy चलाने वाली मशीन के IP पते पर सेट करें (ध्यान दें: NAT समस्याएँ उत्पन्न हो सकती हैं, और यदि intercept परीक्षण सर्वर पर चल रहा है, तो सुनिश्चित करें कि tcpcopy में -c पैरामीटर उस IP पते पर सेट नहीं है जिसका उपयोग tcpcopy intercept से कनेक्ट करने के लिए करता है, अन्यथा tcpcopy intercept से कनेक्ट नहीं होगा)।
2.2 ऑनलाइन सर्वर पर tcpcopy पैकेट कैप्चर नहीं किए गए:
यदि tcpcopy के लॉग में कोई all clt:xx जानकारी नहीं मिलती है, तो यह इंगित करता है कि tcpcopy IP लेयर पर पैकेट कैप्चर करने में असमर्थ है। इस मामले में, डेटा लिंक लेयर पर पैकेट कैप्चर करने के लिए --pcap-capture विकल्प का उपयोग करें। IP लेयर कैप्चरिंग को बायपास करने के लिए -F पैरामीटर (जैसे, 'tcp and dst port 80 and dst host 10.100.1.2') और -i पैरामीटर (नेटवर्क इंटरफ़ेस) सेट करें।
यदि tcpcopy के लॉग में all clt:xx, जहाँ xx > 0, दिखाई देता है, तो इसका मतलब है कि tcpcopy ने पैकेट को सफलतापूर्वक कैप्चर किया, लेकिन इसे ऑनलाइन सर्वर पर IP लेयर द्वारा फ़िल्टर कर दिया गया। आउटपुट चेन पर iptables प्रतिबंध, अन्य सेटिंग्स की जाँच करें। यदि iptables समस्या है और इसे ऑनलाइन सर्वर पर संशोधित नहीं किया जा सकता है, तो डेटा लिंक लेयर से पैकेट भेजने के लिए --pcap-send विकल्प का उपयोग करें।
कोई बग या सुविधा अनुरोध है? कृपया एक नया मुद्दा खोलें। कोई भी मुद्दा खोलने से पहले, कृपया मौजूदा मुद्दों को खोजें।
कॉपीराइट 2025 BSD लाइसेंस के तहत।
इस दस्तावेज़ को लिखने में ड्राफ्ट की समीक्षा और प्रतिक्रिया देकर कई व्यक्तियों ने महत्वपूर्ण भूमिका निभाई है। मैं विशेष रूप से Hongshen Wang के योगदान के लिए आभारी हूँ।