সার্ভার-সাইড `TIME_WAIT` কীভাবে কাজ করে?


11

আমি জানি যে এটি নিয়ে বেশ কয়েকটি এসই প্রশ্ন রয়েছে এবং আমি বিশ্বাস করি যে আমি এগুলিতে আসার আগে তাদের যতটা গুরুত্বপূর্ণ তা পড়েছি।

"সার্ভার-সাইড TIME_WAIT" দ্বারা আমি বোঝাচ্ছি যে একটি সার্ভার-সাইড সকেট জুটির অবস্থা যা তার পাসওয়ার্ডটি (সার্ভারের দিকে) শুরু করেছিল।

আমি প্রায়শই এই বিবৃতিগুলি দেখতে পাই যা আমার কাছে বিপরীত:

  1. সার্ভার- TIME_WAITসাইডটি নিরীহ is
  2. ক্লায়েন্টদের কাছাকাছি থাকতে () ক্লায়েন্টটি নিযুক্ত করার জন্য আপনার নেটওয়ার্ক অ্যাপ্লিকেশনগুলি ডিজাইন করা উচিত, যার ফলে ক্লায়েন্টটি সহ্য করে TIME_WAIT

আমি এই বিপরীতমুখীটি খুঁজে পাওয়ার কারণটি হ'ল TIME_WAITক্লায়েন্টের জন্য সমস্যা হতে পারে - ক্লায়েন্ট উপলব্ধ পোর্টগুলি চালিয়ে যেতে পারে, সুতরাং সংক্ষেপে উপরের TIME_WAITঅংশটি ক্লায়েন্টের দিকে বোঝা সরিয়ে দেওয়ার পরামর্শ দিচ্ছে যেখানে এটি সমস্যা হতে পারে, সার্ভার সাইড যেখানে এটি কোনও সমস্যা নয়।

ক্লায়েন্ট-সাইড TIME_WAITঅবশ্যই ব্যবহারের ক্ষেত্রে সীমিত সংখ্যক সমস্যা। বেশিরভাগ ক্লায়েন্ট-সার্ভার সমাধানগুলিতে একটি সার্ভার এবং অনেক ক্লায়েন্ট জড়িত থাকে, ক্লায়েন্টরা সাধারণত এটির সমস্যা হওয়ার জন্য সংযোগের উচ্চ পরিমাণের সাথে যোগাযোগ করে না এবং এমনকি যদি তা করে থাকে তবে "বুদ্ধিমান" করার জন্য বেশ কয়েকটি সুপারিশ রয়েছে ( যেমন উল্টোদিকে SO_LINGER0 সময়সীমার আছে বা 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অকেজো বলে ক্লায়েন্টের কাছে ক্লোজারের কাছে () চালু করার কারণটি কী?

আপনি কেবল 1 ক্লায়েন্টকে না ফেলে আপনি পোর্টের বাইরে চলে যাবেন না। আপনার কাছে ক্লায়েন্ট / সার্ভার আইপির প্রতিটি সংমিশ্রনের জন্য 65535 পোর্ট রয়েছে। ১.২.৩.৪.১১১১১১ এর সংযোগটি ৪.৩.২.১:1১১১১১ এর থেকে পৃথক। প্রতিটি সংযোগের জন্য এটি কেবল কয়েক বাইট মেমরি নেয় TIME_WAIT
Marki555

উত্তর:


1

ইন বিভিন্ন TCP পদ সার্ভার প্রান্তের এখানে হোস্ট রাষ্ট্র শুনুন মধ্যে সকেট আছে যা মানে।

আরএফসি 1122 টাইম-ওয়েট রাজ্যে সকেটকে কিছু শর্তের সাথে নতুন সংযোগ গ্রহণ করার অনুমতি দেয়

        When a connection is closed actively, it MUST linger in
        TIME-WAIT state for a time 2xMSL (Maximum Segment Lifetime).
        However, it MAY accept a new SYN from the remote TCP to
        reopen the connection directly from TIME-WAIT state, if it:

শর্তাদি সম্পর্কে সঠিক তথ্যের জন্য, দয়া করে RFC1122 দেখুন । আমি আশা করতাম সকেটে অবশ্যই একটি ম্যাচিং প্যাসিভ ওপেন থাকবে (LISSTEN রাজ্যে সকেট)।

অ্যাক্টিভ ওপেন (ক্লায়েন্ট সাইড কানেক্ট কল) এর মতো ব্যতিক্রম নেই এবং আরএফসি 79৯৩ অনুসারে সকেটটি টাইম-ওয়েটে থাকা অবস্থায় ত্রুটি দিতে হবে ।

ক্লায়েন্টের পরামর্শের জন্য আমার ধারণা (টিসিপি পদে হোস্ট সক্রিয় ওপেন অর্থাৎ সংযোগ করা) আপনার কাছাকাছি অবস্থিত একই রকম, সাধারণ ক্ষেত্রে এটি TIME-WAIT সকেট আরও হোস্টে ছড়িয়ে দেয় যেখানে প্রচুর সংস্থান আছে সকেট। সাধারণ ক্ষেত্রে ক্লায়েন্টরা SYN প্রেরণ করে না যা সার্ভারে TIME-WAIT সকেটগুলি পুনরায় ব্যবহার করবে। আমি সম্মত হই যে এই জাতীয় সুপারিশ প্রয়োগ করা এখনও ব্যবহারের ক্ষেত্রে নির্ভর করে।


0

এটি সম্ভবত টাইম-ওয়েট আসলে কী করে তার আরও স্পষ্ট উদাহরণ এবং এটি আরও গুরুত্বপূর্ণ কারণ। লিনাক্স মেশিনগুলিতে 'টাইম-ওয়েট'কে' হ্রাস 'করার জন্য কিছু বিশেষজ্ঞের পরামর্শ এড়াতে কেন এটি ব্যাখ্যা করে।


এখনও যখন ক্লায়েন্ট-> সার্ভার সংযোগ শুরু করা হয় তখন কী ঘটে তা ব্যাখ্যা করে না এবং একটি সার্ভারের সাথে এই জুটিটি একটি TIME_WAIT- এ লক আউট রয়েছে
পাভেল ভেসেলভ

দয়া করে স্ট্যাকওভারফ্লো / প্রশ্নগুলি দেখুন / 1490196/… - আপনি যা খুঁজছেন তার উত্তরটি এখানে রয়েছে।
খুশিল

0

টিসিপি সেশন টিউপল (সোর্সআইপি, সোর্সপোর্ট, ডেসটাইপ, ডেটপোর্ট) দ্বারা সনাক্ত করা হয়। তাই প্রতিটি টিসিপি সংযোগে TIME_WAIT কাজ করে।

সমাপ্তির দিকটি সম্পর্কে, কিছু পরিস্থিতিতে ক্লায়েন্টের পক্ষ থেকে বন্ধ করা সার্ভারের TIME_WAIT সকেটগুলি হ্রাস করতে পারে, ফলে স্মৃতিশক্তি কিছুটা হ্রাস পায়। সকেটের স্থানটি ক্লান্ত হয়ে যেতে পারে (সাময়িক বন্দর ক্ষয়জনিত কারণে) (যেমন লোভী ক্লায়েন্ট একই সার্ভারের সাথে অনেক সংযোগ সহ) এই সমস্যাটি যে কোনও দিকেই সমাধান করা উচিত।


দয়া করে ব্যাখ্যা করুন; আপনি যখন জিজ্ঞাসা করেন সার্ভার-সাইড টিডব্লিউ কিছু করে কিনা, আপনি ভাবছেন যে একই সংযোগটি টিডব্লু সময়কালে পুনরায় ব্যবহার করা যেতে পারে। উত্তরটি হ'ল কারণ টিপল দ্বারা সংজ্ঞায়িত সংযোগটি সার্ভারের টিসিপি টেবিলটিতে স্থান নেয়। যদি ক্লায়েন্টটি শীঘ্রই একই সংযোগটি খোলার চেষ্টা করে, এটি কার্যকরভাবে টিসিপি সংযোগ অস্বীকার করে একটি আরএসটি গ্রহণ করবে। যাইহোক, খুশিলের নিবন্ধটি অত্যন্ত বর্ণনামূলক।
বাসো

আমি খুব দুঃখিত, আপনার উত্তরটি আসলে প্রশ্নের উত্তর দেয়, আমি এটি ভুল পড়েছি, এবং আমার মন্তব্য প্রত্যাহার করেছি। তবে এটিও ভুল বলে মনে হচ্ছে, কারণ আমার কাছে এমন কোড রয়েছে যা প্রমাণ করে যে সার্ভার-সাইড থেকে কোনও সুরক্ষা নেই TIME_WAIT(আমি সেই তথ্য দিয়ে প্রশ্ন আপডেট করেছি)। @ খুশিলের রেফারেন্সটিতে সার্ভার-সাইড TIME_WAITকেসগুলি পর্যাপ্ত বিবরণে আবরণ করা যায় না ।
পাভেল ভেসেলভ

-2

অবিশ্বাস্য প্রোটোকলের মাধ্যমে আপনি কখনই নিশ্চিত হতে পারবেন না যে আপনি নিজের পিয়ার ডিভাইস থেকে শেষ বার্তাটি পেয়েছেন, সুতরাং আপনার সঙ্গী ফোনটি হঠাৎ হ্যাং করে দিয়েছে বলে ধরে নেওয়া বিপদজনক। এটি টিসিপি প্রোটোকলের একটি বড় অসুবিধা যে কেবল 65000 বা তাই পোর্টগুলি একই সাথে খোলা যেতে পারে। তবে এ থেকে উত্তরণের উপায় হ'ল একটি সার্ভার ফার্মে চলে যাওয়া, যা পোর্ট সংখ্যাগুলি দ্রুত পুনর্ব্যবহার করার চেয়ে লোডের সাথে আরও ভাল স্কেল করে। ক্লায়েন্ট শেষে এটি অত্যন্ত সম্ভাবনা নয় যে আপনি যদি বুনিয়াদি ওয়ার্কস্টেশন হয়ে থাকেন তবে পোর্টগুলি শেষ হয়ে যাবে।


আমি খুব দুঃখিত, কিন্তু এটি আমার প্রশ্নের উত্তর দেয় না।
পাভেল ভেসেলভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.