কীভাবে জোর করে TIME_WAIT এ সকেট বন্ধ করবেন?


113

আমি লিনাক্সে একটি বিশেষ প্রোগ্রাম পরিচালনা করি যা কখনও কখনও ক্র্যাশ হয়। আপনি যদি এটির পরে এটি দ্রুত খোলেন, এটি প্রথমবারের মতো 49200 এর পরিবর্তে 49201 সকেটে শোনে। নেটস্যাট প্রকাশ করেছে যে 49200 টি TIME_WAIT অবস্থায় রয়েছে।

সকেটটিকে তাত্ক্ষণিকভাবে TIME_WAIT রাজ্য থেকে সরিয়ে নিয়ে যাওয়ার জন্য এমন কোনও প্রোগ্রাম রয়েছে যা আপনি চালাতে পারেন?


1
আপনি এখানে কারণে হন "অনেকগুলি TIME_WAITসার্ভারে" শুধু মাধ্যমে লাফালাফি প্রথম তিন উত্তর যা উত্তর পরিবর্তে প্রশ্ন এড়ানো।
পেসারিয়ার

উত্তর:


148
/etc/init.d/networking restart

আমাকে বিস্তারিত জানাতে দিন। ট্রান্সমিশন কন্ট্রোল প্রোটোকল (টিসিপি) একটি দ্বি নির্দেশমূলক, আদেশযুক্ত এবং দুটি শেষ পয়েন্ট (প্রোগ্রাম) এর মধ্যে নির্ভরযোগ্য ডেটা ট্রান্সমিশন প্রোটোকল হিসাবে ডিজাইন করা হয়েছে। এই প্রসঙ্গে, নির্ভরযোগ্য শব্দের অর্থ হ'ল এটি প্যাকেটগুলি মাঝখানে হারিয়ে গেলে পুনরায় প্রেরণ করবে। টিসিপি পিয়ারের কাছ থেকে প্রাপ্ত একক বা একাধিক প্যাকেটের জন্য স্বীকৃতি (ACK) প্যাকেটগুলি ফেরত পাঠিয়ে নির্ভরযোগ্যতার গ্যারান্টি দেয়।

এটি নিয়ন্ত্রণ সংকেত যেমন সমাপ্তির অনুরোধ / প্রতিক্রিয়া হিসাবে একই রকম হয়। আরএফসি 793 টাইম-ওয়েট রাষ্ট্রটিকে নিম্নলিখিত হিসাবে সংজ্ঞায়িত করেছে:

টাইম-ওয়েট - দূরবর্তী টিসিপি তার সংযোগ সমাপ্তির অনুরোধের স্বীকৃতি পেয়েছে তা নিশ্চিত হওয়ার জন্য পর্যাপ্ত সময়ের জন্য অপেক্ষা করা প্রতিনিধিত্ব করে।

নিম্নলিখিত টিসিপি রাজ্যের চিত্রটি দেখুন: বিকল্প পাঠ

টিসিপি একটি দ্বি নির্দেশমূলক যোগাযোগ প্রোটোকল, সুতরাং যখন সংযোগটি প্রতিষ্ঠিত হয় তখন ক্লায়েন্ট এবং সার্ভারের মধ্যে কোনও পার্থক্য থাকে না। এছাড়াও, হয় কেউ ছাড়তে কল করতে পারে এবং একটি প্রতিষ্ঠিত টিসিপি সংযোগ পুরোপুরি বন্ধ করতে উভয় সমবয়সীদের বন্ধ হওয়ার বিষয়ে একমত হতে হবে।

সক্রিয়কে নিকটস্থ হিসাবে সক্রিয়কে কল করতে প্রথমটিকে কল করুন এবং অন্যটি প্যাসিভকে আরও কাছের করে দেখুন। সক্রিয় যখন কাছাকাছি এফআইএন প্রেরণ করে তখন রাষ্ট্রটি ফিন-ওয়েট -১ এ যায় 1 তারপরে এটি প্রেরিত এফআইএন এর জন্য একটি এসকে পায় এবং রাজ্যটি ফিন-ওয়েট -২ এ যায়। এটি একবার প্যাসিভ কাছ থেকে কাছাকাছি থেকে এফআইএন গ্রহণ করলে, সক্রিয় কাছাকাছি এসকেকে এফআইএন প্রেরণ করে এবং রাষ্ট্রটি টাইম-ওয়েটে চলে যায়। যদি প্যাসিভ কাছের লোকেরা দ্বিতীয় এফআইএন-এর কাছে এসিসি না পেয়ে থাকে তবে এটি এফআইএন প্যাকেটটি পুনঃপ্রেরণ করবে।

আরএফসি 793 সর্বোচ্চ সময়কালের লাইফটাইম বা 2MSL এর দ্বিগুণ হওয়ার জন্য টাইম-আউট সেট করে। এমএসএল, যেহেতু কোনও প্যাকেট ইন্টারনেটের আশেপাশে ঘুরে বেড়াতে পারে তার সর্বোচ্চ সময় 2 মিনিটে সেট করা হয়, 2MSL 4 মিনিট। যেহেতু কোনও এসিকে এসিके নেই, সক্রিয়ভাবে সক্রিয় কাছাকাছি টিসিপি / আইপি প্রোটোকলটি সঠিকভাবে মেনে চললে 4 মিনিট অপেক্ষা করা ছাড়া কিছুই করতে পারে না, কেবল প্যাসিভ প্রেরক যদি এসআইকে তার ফিনে না পেয়ে থাকে (তাত্ত্বিকভাবে) ।

বাস্তবে, অনুপস্থিত প্যাকেটগুলি সম্ভবত বিরল এবং খুব বিরল যদি এটি ল্যানের মধ্যে বা কোনও একক মেশিনের মধ্যে ঘটে থাকে।

প্রশ্নের ভারব্যাটিমের উত্তর দেওয়ার জন্য, কীভাবে জোর করে TIME_WAIT- তে একটি সকেট বন্ধ করতে হবে? আমি এখনও আমার মূল উত্তরটির সাথে লেগে থাকব:

/etc/init.d/networking restart

ব্যবহারিকভাবে বলতে গেলে, আমি এটি প্রোগ্রাম করব তাই এটি ডাব্লুএমআর উল্লিখিত হিসাবে SO_REUSEADDR বিকল্পটি ব্যবহার করে TIME-WAIT রাজ্যটিকে উপেক্ষা করবে। SO_REUSEADDR ঠিক কী করে?

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


8
দুর্দান্ত উত্তর, তবে তার প্রশ্নের সঠিক উত্তর নয়। নেটওয়ার্কিং পুনরায় চালু করা কাজ করবে, তবে তারপরে পুনরায় চালু হবে, সুতরাং এটি সঠিক হতে পারে না।
ক্রিস হুয়াং-লিভার

3
@ ক্রিস হুয়াং-লিভার, প্রশ্নটি হল "সকেটকে তাত্ক্ষণিকভাবে TIME_WAIT রাজ্য থেকে সরিয়ে নিতে বাধ্য করার জন্য আপনি কি এমন কোনও প্রোগ্রাম চালাতে পারেন?" যদি রিবুটিং কোনও প্রোগ্রাম চালানো হিসাবে বিবেচনা করা যায়, তবে এটিও একটি সঠিক উত্তর হবে। আপনি কেন মনে করেন এটি সঠিক হতে পারে না?
ইউজিন ইয়োকোটা

8
ডাব্লুএমআরের সবচেয়ে দরকারী উত্তর রয়েছে (যখন আমি এই ধরণের ইস্যুটি চালাই তখন আমি যা করি)। নেটওয়ার্ক পুনরায় আরম্ভ করা সমাধানের পক্ষে অত্যন্ত কঠোর এবং সময়সীমার অপেক্ষা অপেক্ষা করা থেকে বেশি সময় নিতে পারে his তাঁর প্রশ্নের সঠিক উত্তর হ'ল 'না', তবে এসও আপনাকে দুটি চিঠি উত্তর টাইপ করতে দেয় না :-)
ক্রিস হুয়াং- লিভার

6
ওহ ঠিক আছে, পরের বার সিগনটারে কিছু প্রক্রিয়া স্থগিত হ'ল আমি আমার কম্পিউটার ঠিক করার পরিবর্তে কেবল এটি ভেঙে দেব।
লংপোক

এর সাধারণীকরণ হ'ল "নেটওয়ার্ক পরিষেবাগুলি পুনরায় চালু করুন"। নির্দিষ্ট অবস্থানটি /etc/init.d/networkingপ্ল্যাটফর্ম-নির্দিষ্ট (দেবিয়ান?) তাই অন্যান্য সিস্টেমের জন্য সুনির্দিষ্ট কমান্ড লাইনটি (কখনও কখনও বরং মূলত তাই) আলাদা হবে। আমি অন্যান্য মন্তব্যকারীদের সাথে একমত যে এটিকে গুরুতর ওভারকিলের মতো বলে মনে হচ্ছে এবং কোনও সম্পর্কযুক্ত নেটওয়ার্ক পরিষেবাদির জন্য স্পষ্টতই ব্যাহতকারী।
ট্রিপলি

51

আপনি যে নির্দিষ্ট প্রোগ্রামটি চালাচ্ছেন তার উত্স কোড আছে কিনা তা আমি জানি না, তবে যদি আপনি কেবলমাত্র SO_REUSEADDR সেট করতে পারতেন setsockopt(2)যার মাধ্যমে আপনি সকেটটি TIME_WAIT অবস্থায় থাকলেও একই স্থানীয় ঠিকানার উপর বাঁধাই করতে পারবেন (তা না হলে) সকেট সক্রিয়ভাবে শুনছে, দেখুন socket(7))।

TIME_WAIT স্থিতির আরও তথ্যের জন্য ইউনিক্স সকেট FAQ দেখুন


তবে আমি ইতিমধ্যে আবদ্ধ ত্রুটিটি পাইনি। যখন আমি প্রোগ্রামটি আবার চালিত করি তখন এটি পোস্টে শোনায় (123456) এছাড়াও আমি এটি দেখতে পাচ্ছি যে সিস্টেমটি এই বন্দরের জন্য TIME_WAIT দেখায় তবে আমি সংযোগ করতে পারি। কেন?
জয়পাল চন্দ্রন

2
এমনকি SO_REUSEADDR এর পরেও "ইতিমধ্যে ব্যবহারের ঠিকানাটি" ত্রুটি পাওয়া সম্ভব। বিশদগুলির জন্য, hea-www.harvard.edu/~fine/Tech/addrinuse.html দেখুন
জিংগুও ইয়াও

@WMR SO_REUSEADDRএকটি সকেট "বন্ধ" করে না। এটি কেবলমাত্র যা ইতিমধ্যে খোলা আছে তাদের পুনরায় ব্যবহার করতে সক্ষম করে। সুতরাং প্রশ্নটি এখনও "জোর করে কিভাবে একটি সকেটটি বন্ধ করতে হবে TIME_WAIT?"
পেসিয়ার

এটি সঠিক উত্তর, তবে প্রশ্নটি পুরোপুরি সঠিক ছিল না। কমপক্ষে আমার সমস্যাটি সুন্দরভাবে সমাধান করুন (পুরো নেটওয়ার্কটি অন্য সমস্ত সংযোগ ভেঙে পুনরায় চালু করার মতো নয়)।
ভি-মার্ক

SO_REUSEADDRbind()এগিয়ে যেতে দেওয়া হবে; তবে আপনি যদি সেই সকেট শুনতে চান তবে সমস্ত একই রকম listen()ফিরে আসবে EADDRINUSE। অন্য কথায়, এই উত্তরটি ক্লায়েন্ট সফটওয়্যারকে সাময়িক বন্দর ব্যবহার করে সহায়তা করতে পারে তবে সার্ভার সফ্টওয়্যারটির জন্য সমস্যাটি সমাধান করে না।
উইল

33

আমি যতদূর জানি আপনার প্রোগ্রামে আরও ভাল সিগন্যাল হ্যান্ডলার লেখার বাইরে সকেটটি জোর করে বন্ধ করার কোনও উপায় নেই, তবে একটি / প্রোক ফাইল রয়েছে যা সময়সীমাটি কতক্ষণ সময় নেয় তা নিয়ন্ত্রণ করে। ফাইলটি হ'ল

/proc/sys/net/ipv4/tcp_tw_recycle

এবং আপনি এটি করে সময়সীমাটি 1 সেকেন্ডে সেট করতে পারেন:

echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle 

যাইহোক, এই পৃষ্ঠায় এই ভেরিয়েবলটি সেট করার সময় সম্ভাব্য নির্ভরযোগ্যতা সম্পর্কিত সমস্যা সম্পর্কে একটি সতর্কতা রয়েছে।

সম্পর্কিত একটি ফাইলও রয়েছে

/proc/sys/net/ipv4/tcp_tw_reuse

যা TIME_WAIT সকেটগুলি পুনরায় ব্যবহার করা যেতে পারে কিনা তা নিয়ন্ত্রণ করে (সম্ভবত কোনও সময়সীমা ছাড়াই)।

ঘটনাক্রমে, কার্নেল ডকুমেন্টেশন আপনাকে সতর্ক করে যে 'প্রযুক্তিগত বিশেষজ্ঞদের পরামর্শ / অনুরোধ' ছাড়াই এই মানগুলির কোনওটি পরিবর্তন না করে। যা আমি নই।

প্রোগ্রামটি অবশ্যই অবশ্যই 49200 বন্দরটিতে একটি বাঁধাইয়ের চেষ্টা করার জন্য এবং তারপরে বন্দরটি ইতিমধ্যে ব্যবহারে থাকলে 1 দ্বারা বৃদ্ধি করা উচিত। সুতরাং, যদি আপনার উত্স কোডের নিয়ন্ত্রণ থাকে, আপনি কয়েক সেকেন্ড অপেক্ষা করার জন্য এই আচরণটি পরিবর্তন করতে পারেন এবং বাড়ানোর পরিবর্তে একই বন্দরে আবার চেষ্টা করতে পারেন।


ভাবেন যে দ্বিতীয় দুটি উদাহরণ এস / আরডাব্লু / টু / আমি সম্পাদনা করব, তবে পর্যাপ্ত প্রতিনিধিত্বের অভাব রয়েছে।

1
কার্নেল ডকুমেন্টেশন থেকে নেওয়া: সতর্কতা। Tcp_tw_reयकल এবং tcp_tw_reuse উভয়ই সমস্যার কারণ হতে পারে। নোড (গুলি) এর মধ্যে যেগুলি প্যারামিটারটি সক্ষম করেছে সেগুলি নোড ব্যবহার করছে বা ব্যবহার করছে তার মধ্যে নেটওয়ার্ক টপোলজি না বুঝে আপনি সক্ষম করা উচিত নয়। টিসিপি সংযোগের অবস্থাগুলি সম্পর্কে সচেতন নোডগুলির মধ্য দিয়ে যাওয়া সংযোগগুলি যেমন ফায়ারওয়াল, NAT বা লোড ব্যালেন্সার সেটিংসের কারণে ফ্রেমগুলি নামানো শুরু করতে পারে। বিপুল সংখ্যক সংযোগ থাকলে সমস্যাটি দৃশ্যমান হবে।

এটি 1ভবিষ্যতের সংযোগগুলির জন্য কাজ করে সেট করা , তবে ইতিমধ্যে খোলা সেই বর্তমানগুলির সম্পর্কে কী?
পেসারিয়ার 4

18

আসলে একটি সংযোগ হত্যার উপায় আছে - কিলকেক্স । তারা দাবি করে যে এটি সংযোগের কোনও অবস্থায় (যা আমি যাচাই করে নি) কাজ করে। আপনার যোগাযোগটি এমন ইন্টারফেসটি জানতে হবে যেখানে যোগাযোগটি ঘটে থাকে যদিও এটি ডিফল্টরূপে eth0 বলে মনে হয়।

আপডেট: আরেকটি সমাধান হ'ল কাটার যা কিছু লিনাক্স ডিস্ট্রোজের সংগ্রহস্থলে আসে।


3

আর একটি বিকল্প হল 0 এর টাইমআউট সহ SO_LINGER বিকল্পটি ব্যবহার করা This আপনি যখন সকেটটি বন্ধ করেন তখন জোর করে বন্ধ করে দেওয়া হয়, FIN / ACK বন্ধের আচরণের পরিবর্তে আরএসটি প্রেরণ করা। এটি TIME_WAIT রাজ্যটি এড়িয়ে যাবে এবং কিছু ব্যবহারের জন্য আরও উপযুক্ত হতে পারে।


2
এটি ট্রানজিটে থাকা যে কোনও আউটবাউন্ড ডেটাও হারায় এবং অন্য প্রান্তে ত্রুটি ঘটায়। প্রস্তাবিত নয়।
ব্যবহারকারী 207421

@ জেজে ব্যর্থ হওয়া প্রায়শই ডান কল। নেটওয়ার্কিং নির্ভরযোগ্য নয়, এবং লড়াই যা জিনিসগুলিকে ধীর করে দেবে। কোনও ক্র্যাশ অ্যাপ্লিকেশন ধরে নিতে পারে না যে কোনও ডেটা নিরাপদে এটি তৈরি করেছে।
টুবু

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

@ তোবু নেটওয়ার্কিং নির্ভরযোগ্য নয়, তবে টিসিপি হওয়ার চেষ্টা করে, এবং আরও খারাপ করে তোলা আরও ভাল কিছু তৈরি করে না, এবং টিসিপিকে তার কাজটি করতে দেওয়া কোনওরকম 'লড়াইয়ের' মতো হয় না।
ব্যবহারকারী 207421

2

একটি বিকল্প সমাধান হ'ল কিছু নির্ভরযোগ্য প্রক্সি বা পোর্ট ফরওয়ার্ডিং সফ্টওয়্যার রয়েছে যা পোর্ট 49200 শোনায়, তারপরে বিভিন্ন পোর্ট ব্যবহার করে আপনার কম নির্ভরযোগ্য প্রোগ্রামের কয়েকটি উদাহরণের সাথে সংযোগটি ফরোয়ার্ড করুন ... হ্যাপ্রোক্স স্প্রিংস মনে রাখবেন।

ঘটনাক্রমে আপনার সংযোগটি বন্দরটি অনেক বেশি। আপনি 0-1024 ব্যাপ্তির ঠিক উপরে একটি অব্যবহৃত ব্যবহার করার চেষ্টা করতে পারেন। আপনার সিস্টেমে একটি সাময়িক বন্দর হিসাবে কম পোর্ট নম্বর ব্যবহার করার সম্ভাবনা কম।


0

সকেট প্রোগ্রামিং ক্লায়েন্ট সার্ভার আর্কিটেকচারে TIME_WAIT সর্বাধিক সাধারণ সমস্যা। পর্যায়ক্রমে চেষ্টা করা কয়েক সেকেন্ড অপেক্ষা করুন এটির জন্য সেরা সমাধান। রিয়েল টাইম অ্যাপ্লিকেশনগুলির জন্য তাদের সার্ভারের প্রয়োজন তাৎক্ষণিকভাবে উঠতে হবে তাদের জন্য SO_REUSEADDR বিকল্প রয়েছে।

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