প্রশ্ন কিভাবে জোরপূর্বক TIME_WAIT একটি সকেট বন্ধ করতে?


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

একটি প্রোগ্রাম যা আপনি চালাতে পারেন তাৎক্ষণিকভাবে সেই সকেটটি TIME_WAIT অবস্থার বাইরে চলে যেতে পারে?


109
2017-09-03 12:57


উত্স


আপনি এখানে কারণে যদি "অনেক বেশী TIME_WAIT সার্ভারে ", শুধু মাধ্যমে এড়িয়ে যাও প্রথম তিনটি উত্তর যা উত্তর দেওয়ার পরিবর্তে প্রশ্ন এড়াতে পারে। - Pacerier


উত্তর:


/etc/init.d/networking restart

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

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

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

নিম্নলিখিত টিসিপি রাষ্ট্র চিত্রটি দেখুন: alt text

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

আসুন প্রথমটি সক্রিয়ভাবে বন্ধ হয়ে যাওয়ার জন্য কল করুন, এবং অন্যান্য সহকর্মী পাসিক কাছাকাছি। যখন সক্রিয় কাছাকাছি ফিন প্রেরণ করে, রাষ্ট্র FIN-WAIT-1 যায়। তারপর প্রেরিত ফিনের জন্য এটি একটি ACK পায় এবং রাজ্য FIN-WAIT-2 এ যায়। একবার এটি প্যাসিভ কাছাকাছি থেকে FIN পায় একবার, সক্রিয় কাছাকাছি ফিন এ ACK পাঠায় এবং রাষ্ট্র টাইম ওয়েট যায়। দ্বিতীয় ফিনের কাছে যদি পাসিভের কাছাকাছি পাস না হয় তবে এটি ফিন প্যাকেটটি পুনরায় জমা দেবে।

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

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

প্রশ্নের উত্তর দিতে, কিভাবে বলপূর্বক TIME_WAIT এ একটি সকেট বন্ধ করবেন ?, আমি এখনও আমার আসল উত্তর আটকাতে হবে:

/etc/init.d/networking restart

বাস্তবিকভাবে বলতে গেলে, আমি এটি প্রোগ্রাম করব যাতে এটি SO_REUSEADDR বিকল্প ব্যবহার করে টাইম-ওয়েট স্টেটকে উপেক্ষা করে WMR উল্লেখ করে। SO_REUSEADDR ঠিক কি করে?

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


139
2017-09-03 13:11



মহান উত্তর, কিন্তু তার প্রশ্নের সঠিক উত্তর না। নেটওয়ার্কিং পুনঃসূচনা কাজ করবে, কিন্তু তারপর পুনরায় বুট করা হবে, তাই এটি সঠিক হতে পারে না। - Chris Huang-Leaver
@ চরিস হুয়াং-লিভার, প্রশ্ন হচ্ছে "আপনি কি কোন প্রোগ্রামটি চালাতে পারেন যেটি সেই সকেটটি TIME_WAIT রাজ্যের বাইরে চলে যেতে পারে?" যদি পুনরায় চালু করা একটি প্রোগ্রাম চলমান বিবেচনা করা যেতে পারে, তাহলে এটি একটি সঠিক উত্তর হবে। কেন আপনি এই সঠিক হতে পারে না মনে করেন? - Eugene Yokota
WMR সবচেয়ে দরকারী উত্তর (আমি এই ধরনের সমস্যাতে চালানোর সময় যা করি)। নেটওয়ার্কের পুনঃসূচনাটি সমাধান হওয়া খুব কঠিন, এবং সময়সীমার জন্য কেবল অপেক্ষা করার চেয়ে বেশি সময় নিতে পারে। তার প্রশ্নের সঠিক উত্তর হল 'না', তবে SO আপনাকে দুটি অক্ষরের উত্তর দিতে দেয় না :-) - Chris Huang-Leaver
ওহ ঠিক আছে, পরবর্তী সময় SIGTERM এ কিছু প্রক্রিয়া হ্যান্ডসেট করলেই আমি ফিক্স করার পরিবর্তে আমার কম্পিউটারটি ভাঙ্গাব। - Longpoke


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

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


50
2017-09-03 13:17



কিন্তু আমি ইতিমধ্যে আবদ্ধ ত্রুটি পেতে না। যখন আমি আবার প্রোগ্রামটি চালাব তখন এটি পোস্টে (123456) শোনে, আমি দেখি যে সিস্টেমটি সেই পোর্টের জন্য TIME_WAIT দেখাচ্ছে কিন্তু এখনও আমি সংযোগ করতে পারি। কেন? - Jayapal Chandran
এমনকি SO_REUSEADDR এর সাথেও, "ঠিকানা ইতিমধ্যে ব্যবহারে" ত্রুটিটি পাওয়া সম্ভব। বিস্তারিত জানার জন্য পড়ুন hea-www.harvard.edu/~fine/Tech/addrinuse.html। - Jingguo Yao
@WMR SO_REUSEADDR একটি সকেট "বন্ধ" না। এটি কেবলমাত্র আপনি খোলা আছে যারা পুনরায় ব্যবহার করতে সক্ষম করে। তাই প্রশ্ন এখনও "জোরপূর্বক একটি সকেট বন্ধ কিভাবে TIME_WAIT? " - Pacerier


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

/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 সকেটগুলি পুনঃব্যবহৃত করা যেতে পারে তা নিয়ন্ত্রণ করে (সম্ভবত কোনও সময়সীমা ছাড়াই)।

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

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


32
2017-09-03 13:24



মনে হয় দ্বিতীয় দুটি উদাহরণ গুলি / rw / tw / আমি সম্পাদন করতে চাই, কিন্তু যথেষ্ট rep এর অভাব।
কার্নেল ডকুমেন্টেশন থেকে নেওয়া: সতর্কতা। উভয় tcp_tw_recycle এবং tcp_tw_reuse উভয় সমস্যা হতে পারে। নেটওয়ার্ক টোপোলজি বুঝতে না পারলে নোডের ব্যবহার করা বা নোডের মাধ্যমে ব্যবহৃত প্যারামিটারটি সক্রিয় করা উচিত নয়। সংযোগগুলি যেগুলি নোডের মাধ্যমে যেতে পারে যা টিসিপি সংযোগের অবস্থাগুলি সম্পর্কে সচেতন, যেমন ফায়ারওয়াল, NAT বা লোড ব্যালান্সার সেটিংসের কারণে ফ্রেমগুলি ড্রপ করা শুরু করতে পারে। সংযোগ প্রচুর পরিমাণে থাকলে সংযোগটি দৃশ্যমান হবে।
এটি সেট করা 1 ভবিষ্যতে সংযোগের জন্য কাজ করে, কিন্তু ইতিমধ্যে খোলা আছে যারা বর্তমান বেশী কি? - Pacerier


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

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


16
2017-10-30 17:32



ধন্যবাদ! এই ইউটিলিটি মহান কাজ করে! একটি দীর্ঘ কাজ পুনরায় আরম্ভ করার থেকে আমাকে সংরক্ষিত। - Zanson


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


3
2018-06-10 22:33



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


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

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


2
2017-08-21 20:28





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


0
2017-10-13 19:07