আমি জানি যে এটি নিয়ে বেশ কয়েকটি এসই প্রশ্ন রয়েছে এবং আমি বিশ্বাস করি যে আমি এগুলিতে আসার আগে তাদের যতটা গুরুত্বপূর্ণ তা পড়েছি।
"সার্ভার-সাইড TIME_WAIT
" দ্বারা আমি বোঝাচ্ছি যে একটি সার্ভার-সাইড সকেট জুটির অবস্থা যা তার পাসওয়ার্ডটি (সার্ভারের দিকে) শুরু করেছিল।
আমি প্রায়শই এই বিবৃতিগুলি দেখতে পাই যা আমার কাছে বিপরীত:
- সার্ভার-
TIME_WAIT
সাইডটি নিরীহ is - ক্লায়েন্টদের কাছাকাছি থাকতে () ক্লায়েন্টটি নিযুক্ত করার জন্য আপনার নেটওয়ার্ক অ্যাপ্লিকেশনগুলি ডিজাইন করা উচিত, যার ফলে ক্লায়েন্টটি সহ্য করে
TIME_WAIT
আমি এই বিপরীতমুখীটি খুঁজে পাওয়ার কারণটি হ'ল TIME_WAIT
ক্লায়েন্টের জন্য সমস্যা হতে পারে - ক্লায়েন্ট উপলব্ধ পোর্টগুলি চালিয়ে যেতে পারে, সুতরাং সংক্ষেপে উপরের TIME_WAIT
অংশটি ক্লায়েন্টের দিকে বোঝা সরিয়ে দেওয়ার পরামর্শ দিচ্ছে যেখানে এটি সমস্যা হতে পারে, সার্ভার সাইড যেখানে এটি কোনও সমস্যা নয়।
ক্লায়েন্ট-সাইড TIME_WAIT
অবশ্যই ব্যবহারের ক্ষেত্রে সীমিত সংখ্যক সমস্যা। বেশিরভাগ ক্লায়েন্ট-সার্ভার সমাধানগুলিতে একটি সার্ভার এবং অনেক ক্লায়েন্ট জড়িত থাকে, ক্লায়েন্টরা সাধারণত এটির সমস্যা হওয়ার জন্য সংযোগের উচ্চ পরিমাণের সাথে যোগাযোগ করে না এবং এমনকি যদি তা করে থাকে তবে "বুদ্ধিমান" করার জন্য বেশ কয়েকটি সুপারিশ রয়েছে ( যেমন উল্টোদিকে SO_LINGER
0 সময়সীমার আছে বা tcp_tw sysctls সঙ্গে অনধিকারচর্চা) যুদ্ধ ক্লায়েন্ট-সাইড TIME_WAIT
খুব দ্রুত অনেকগুলি সংযোগ তৈরি এড়ানো দ্বারা। তবে এটি সবসময় সম্ভব হয় না, যেমন অ্যাপ্লিকেশন শ্রেণীর জন্য যেমন:
- মনিটরিং সিস্টেম
- জেনারেটর লোড করুন
- প্রক্সি
অন্যদিকে, আমি বুঝতে পারি না যে সার্ভার-সাইডটি কীভাবে TIME_WAIT
আদৌ সহায়ক। এর কারণটিও TIME_WAIT
সেখানে রয়েছে, কারণ এটি বাসি TCP
টুকরোগুলি স্রোতে ইনজেকশন প্রতিরোধ করে যেগুলির সাথে তারা আর নেই। ক্লায়েন্ট-সাইডের জন্য , এই বাসি সংযোগটি থাকতে পারে এমন TIME_WAIT
একই ip:port
জোড়গুলির সাথে সংযোগ তৈরি করা কেবল অসম্ভব করে তৈরি করে (ব্যবহৃত জোড়গুলি লক আউট করা হয়েছে TIME_WAIT
)। তবে সার্ভারের পক্ষে, এটি আটকাতে পারবেন না যেহেতু স্থানীয় ঠিকানায় গ্রহণযোগ্য বন্দর থাকবে এবং সর্বদা একই রকম থাকবে এবং সার্ভারটি (এএফএআইকি, আমার কাছে কেবল অভিজ্ঞতা অভিজ্ঞতা নেই) সংযোগটিকে অস্বীকার করতে পারে কারণ কেবল আগত পিয়ার একই ঠিকানা জুড়ি তৈরি করবে যা ইতিমধ্যে সকেট টেবিলে বিদ্যমান।
আমি এমন একটি প্রোগ্রাম লিখেছিলাম যা দেখায় যে সার্ভার-সাইড TIME-WAIT উপেক্ষা করা হবে। তবুও, পরীক্ষাটি 127.0.0.1 এ সম্পন্ন হওয়ার কারণে, কার্নেলের অবশ্যই একটি বিশেষ বিট থাকতে হবে যা এটি সার্ভার সাইড বা ক্লায়েন্টের দিক কিনা তাও জানায় (অন্যথায় টিপলটি একই হবে)।
উত্স: http://pastebin.com/5PWjkjEf , ফেডোরা 22-তে পরীক্ষা করা হয়েছে, ডিফল্ট নেট কনফিগারেশন।
$ gcc -o rtest rtest.c -lpthread
$ ./rtest 44400 s # will do server-side close
Will initiate server close
... iterates ~20 times successfully
^C
$ ss -a|grep 44400
tcp TIME-WAIT 0 0 127.0.0.1:44400 127.0.0.1:44401
$ ./rtest 44500 c # will do client-side close
Will initiate client close
... runs once and then
connecting...
connect: Cannot assign requested address
সুতরাং, সার্ভার-সাইডের জন্য TIME_WAIT
, একই একই পোর্ট জুটির সংযোগগুলি তাত্ক্ষণিকভাবে এবং সফলভাবে পুনরায় প্রতিষ্ঠিত হতে পারে এবং ক্লায়েন্ট-সাইডের জন্য TIME-WAIT
, দ্বিতীয় পুনরাবৃত্তিতে connect()
ধার্মিকভাবে ব্যর্থ হয়েছে
সংক্ষেপে বলতে গেলে, প্রশ্নটি দুটি ভাঁজ:
- সার্ভার-সাইডটি
TIME_WAIT
কি আসলেই কিছু করে না, এবং কেবলRFC
এটির কারণেই এটি বাকি রয়েছে ? - সার্ভারটি
TIME_WAIT
অকেজো বলে ক্লায়েন্টের কাছে ক্লোজারের কাছে () চালু করার কারণটি কী?
TIME_WAIT
।