আমি এইচটিটিপি চালিয়ে যাওয়ার কথা শুনেছি তবে আপাতত আমি রিমোট সার্ভারের সাথে সকেট সংযোগ খুলতে চাই।
এখন কি এই সকেট সংযোগ চিরকাল খোলা থাকবে বা এর সাথে কি কোনও টাইমআউট সীমাবদ্ধতা যুক্ত হবে এইচটিটিপি-বাঁচিয়ে রাখার মতো?
আমি এইচটিটিপি চালিয়ে যাওয়ার কথা শুনেছি তবে আপাতত আমি রিমোট সার্ভারের সাথে সকেট সংযোগ খুলতে চাই।
এখন কি এই সকেট সংযোগ চিরকাল খোলা থাকবে বা এর সাথে কি কোনও টাইমআউট সীমাবদ্ধতা যুক্ত হবে এইচটিটিপি-বাঁচিয়ে রাখার মতো?
উত্তর:
টিসিপি সকেটগুলি বন্ধ না হওয়া পর্যন্ত খোলা থাকে।
এটি বলেছিল, আসলে কোনও ডেটা না প্রেরণে একটি ভাঙ্গা সংযোগ (ভাঙ্গা, যেমন রাউটারে মারা যাওয়া ইত্যাদি) সনাক্ত করা খুব কঠিন, তাই বেশিরভাগ অ্যাপ্লিকেশনগুলি প্রায়শই প্রায়শই নিশ্চিত হওয়ার জন্য কিছুটা পিং / পং প্রতিক্রিয়া করে থাকে সংযোগটি এখনও জীবিত।
এখন এই সকেট সংযোগটি চিরকাল খোলা থাকবে বা এর সাথে কি কোনও টাইমআউট সীমাবদ্ধতা যুক্ত হবে এইচটিটিপি-বাঁচিয়ে রাখার মতো?
সংক্ষিপ্ত উত্তর হল কোন এটি চিরতরে খোলা থাকে না, এটা সম্ভবত কয়েক ঘন্টার পর আউট সময় হবে। অতএব হ্যাঁ সেখানে হয় একটি টাইমআউটের এবং এটি মাধ্যমে জারি করা হয়েছে বিভিন্ন TCP সক্রিয়-রাখুন ।
আপনি যদি আপনার মেশিনে কিপ-অ্যালাইভের সময়সীমাটি কনফিগার করতে চান তবে নীচে "টিসিপি পরিবর্তনকরণের সময় পরিবর্তন" বিভাগটি দেখুন। অন্যথায় টিসিপি কীপ-অ্যালাইভ কীভাবে কাজ করে তা শিখতে বাকী উত্তরের মাধ্যমে পড়ুন।
টিসিপি সংযোগগুলি দুটি সকেট নিয়ে গঠিত, সংযোগের প্রতিটি প্রান্তে একটি করে। যখন এক পক্ষ সংযোগটি শেষ করতে চায়, তখন এটি এমন একটি RST
প্যাকেট প্রেরণ করে যা অন্য পক্ষ স্বীকৃতি দেয় এবং উভয়ই তাদের সকেট বন্ধ করে দেয়।
এটি না হওয়া পর্যন্ত উভয় পক্ষই তাদের সকেট অনির্দিষ্টকালের জন্য উন্মুক্ত রাখবে। এটি ইচ্ছাকৃতভাবে বা কিছু ত্রুটির কারণে অন্য দিকটি অবহিত না করেই একদিকে তাদের সকেটটি বন্ধ করে দেওয়ার সম্ভাবনাটি ছেড়ে দেয় RST
। এই দৃশ্যটি সনাক্ত করতে এবং বাসি সংযোগগুলি বন্ধ করতে টিসিপি রাখুন জীবিত প্রক্রিয়া ব্যবহৃত হয়।
তিনটি কনফিগারযোগ্য বৈশিষ্ট্য রয়েছে যা কীপ-অ্যালাইভস কীভাবে কাজ করে তা নির্ধারণ করে। লিনাক্স এ তারা 1 :
tcp_keepalive_time
tcp_keepalive_probes
tcp_keepalive_intvl
প্রক্রিয়াটি এইভাবে কাজ করে:
tcp_keepalive_time
সেকেন্ডের জন্য নিঃশব্দ থাকে তবে একটি একক খালি ACK
প্যাকেটটি প্রেরণ করুন ।ঘACK
তার নিজস্ব ?
tcp_keepalive_intvl
সেকেন্ড , তারপরে অন্য একটি প্রেরণ করুনACK
ACK
যে পরিমাণ প্রোবের সমান প্রেরণ করা হয়েছে তার সমান হওয়া পর্যন্ত পুনরাবৃত্তি করুনtcp_keepalive_probes
।RST
এবং সংযোগটি সমাপ্ত করুন।এই প্রক্রিয়াটি বেশিরভাগ অপারেটিং সিস্টেমে ডিফল্টরূপে সক্ষম হয় এবং অন্য প্রান্তটি 2 ঘন্টা 11 মিনিট (7200 সেকেন্ড + 75 * 9 সেকেন্ড) এর প্রতিক্রিয়াহীন হয়ে গেলে মৃত টিসিপি সংযোগগুলি নিয়মিত ছাঁটাই করা হয়।
যেহেতু কোনও সংযোগ ডিফল্টরূপে দুই ঘন্টা অলস না হওয়া পর্যন্ত প্রক্রিয়া শুরু হয় না, বাসি টিসিপি সংযোগগুলি ছাঁটাই হওয়ার আগে খুব দীর্ঘ সময়ের জন্য লম্বা থাকতে পারে। এটি বিশেষত ব্যয়বহুল সংযোগ যেমন ডেটাবেস সংযোগগুলির জন্য ক্ষতিকারক হতে পারে।
মতে বোঝায় যা RFC 1122 4.2.3.6 , রেসপন্ড করার এবং / অথবা বিভিন্ন TCP সক্রিয়-রাখুন প্যাকেট রিলে ঐচ্ছিক :
প্রয়োগকারীরা তাদের টিসিপি বাস্তবায়নে "কিপ-অ্যালাইভস" অন্তর্ভুক্ত করে, যদিও এই অনুশীলন সর্বজনস্বীকৃত নয়। যদি কিপ-আলাইভস অন্তর্ভুক্ত থাকে তবে অ্যাপ্লিকেশনটি প্রতিটি টিসিপি সংযোগের জন্য এগুলি চালু বা বন্ধ করতে সক্ষম হবে এবং এগুলি ডিফল্টরূপে বন্ধ করতে হবে।
...
এটি মনে রাখা অত্যন্ত গুরুত্বপূর্ণ যে এসি কে বিভাগগুলিতে কোনও ডেটা নেই সেগুলি টিসিপি দ্বারা নির্ভরযোগ্যভাবে সংক্রমণ করে না।
যুক্তিযুক্ত কারণ হ'ল কিপ-অ্যালাইভ প্যাকেটে কোনও ডেটা থাকে না এবং কঠোরভাবে প্রয়োজনীয় হয় না এবং অতিরিক্ত ব্যবহার করা হলে ইন্টারভ্যুবের টিউবগুলি আটকে রাখার ঝুঁকি থাকে।
তবে বাস্তবে আমার অভিজ্ঞতাটি হ'ল ব্যান্ডউইথ সস্তা হওয়ায় সময়ের সাথে এই উদ্বেগ হ্রাস পেয়েছে; এবং এভাবে কিপ-অ্যালাইভ প্যাকেটগুলি সাধারণত বাদ পড়ে না। আমাজন ইসি 2 ডকুমেন্টেশনউদাহরণস্বরূপ কিপ-অ্যালাইভের একটি অপ্রত্যক্ষ অনুমোদনের প্রস্তাব দেয়, সুতরাং আপনি যদি এডাব্লুএসের সাথে হোস্টিং করেন তবে আপনি সম্ভবত কিপ-অ্যালাইভের উপর নির্ভর করে নিরাপদ হন তবে আপনার মাইলেজটি আলাদা হতে পারে।
দুর্ভাগ্যক্রমে যেহেতু টিসিপি সংযোগগুলি ওএস স্তরে পরিচালিত হয়, তাই জাভা প্রতি সকেট স্তরে যেমন টাইমআউটগুলি কনফিগার করতে সমর্থন করে না java.net.Socket
। আমি কিছু চেষ্টা পেয়েছি 3 জাভা দেশীয় ইন্টারফেস (JNI) ব্যবহার জাভা সকেট যে এই অপশন কনফিগার করতে নেটিভ কোড কল তৈরি করতে, কিন্তু তেমন কাউকে ব্যাপক সম্প্রদায় গ্রহণ বা সমর্থন আছে প্রদর্শিত হবে।
পরিবর্তে, আপনি সামগ্রিকভাবে অপারেটিং সিস্টেমে আপনার কনফিগারেশনটি প্রয়োগ করতে বাধ্য হতে পারেন। সচেতন হন যে এই কনফিগারেশনটি পুরো সিস্টেমে চলমান সমস্ত টিসিপি সংযোগগুলিকে প্রভাবিত করবে।
বর্তমানে কনফিগার করা টিসিপি কিপ-অ্যালাইভ সেটিংস পাওয়া যাবে
/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_probes
/proc/sys/net/ipv4/tcp_keepalive_intvl
আপনি এর মতো যেকোনটি আপডেট করতে পারেন:
# Send first Keep-Alive packet when a TCP socket has been idle for 3 minutes
$ echo 180 > /proc/sys/net/ipv4/tcp_keepalive_time
# Send three Keep-Alive probes...
$ echo 3 > /proc/sys/net/ipv4/tcp_keepalive_probes
# ... spaced 10 seconds apart.
$ echo 10 > /proc/sys/net/ipv4/tcp_keepalive_intvl
এই পরিবর্তনগুলি পুনরায় আরম্ভের মাধ্যমে স্থির থাকবে না। অবিরাম পরিবর্তন করতে, ব্যবহার করুন sysctl
:
sysctl -w net.ipv4.tcp_keepalive_time=180 net.ipv4.tcp_keepalive_probes=3 net.ipv4.tcp_keepalive_intvl=10
বর্তমানে কনফিগার করা সেটিংস এর সাথে দেখা যেতে পারে sysctl
:
$ sysctl net.inet.tcp | grep -E "keepidle|keepintvl|keepcnt"
net.inet.tcp.keepidle: 7200000
net.inet.tcp.keepintvl: 75000
net.inet.tcp.keepcnt: 8
লক্ষণীয় বিষয়, ম্যাক ওএস এক্স লিনাক্সের বিপরীতে মিলিসেকেন্ডগুলির ইউনিটগুলিতে সংজ্ঞা দেয় keepidle
এবং keepintvl
সেকেন্ড ব্যবহার করে uses
বৈশিষ্ট্যগুলি সেট করা যেতে পারে sysctl
যা রিবুটগুলি জুড়ে এই সেটিংসটি বহাল রাখবে:
sysctl -w net.inet.tcp.keepidle=180000 net.inet.tcp.keepcnt=3 net.inet.tcp.keepintvl=10000
বিকল্পভাবে, আপনি এগুলিতে যুক্ত করতে পারেন /etc/sysctl.conf
(ফাইলটি উপস্থিত না থাকলে তৈরি করা)।
$ cat /etc/sysctl.conf
net.inet.tcp.keepidle=180000
net.inet.tcp.keepintvl=10000
net.inet.tcp.keepcnt=3
কনফার্ম করার জন্য আমার কাছে উইন্ডোজ মেশিন নেই, তবে আপনার রেজিস্ট্রিতে সম্পর্কিত টিসিপি কিপ-অ্যালাইভ সেটিংস পাওয়া উচিত
\HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\TCPIP\Parameters
পাদটীকা
1. man tcp
আরও তথ্যের জন্য দেখুন।
২. এই প্যাকেটটি প্রায়শই "কিপ-অ্যালাইভ" প্যাকেট হিসাবে উল্লেখ করা হয়, তবে টিসিপি নির্দিষ্টকরণের মধ্যে এটি কেবল একটি নিয়মিত ACK
প্যাকেট। ওয়্যারশার্কের মতো অ্যাপ্লিকেশনগুলি সকেটের পূর্ববর্তী যোগাযোগের সাথে সম্পর্কিত ক্রম এবং স্বীকৃতি সংখ্যার মেটা-বিশ্লেষণ করে এটিকে "কিপ-অ্যালাইভ" প্যাকেট হিসাবে লেবেল করতে সক্ষম হয়।
৩. বেসিক গুগল অনুসন্ধান থেকে পাওয়া কয়েকটি উদাহরণ হ'ল লুকুইলিয়ামস / জাভালিনাক্সনেট এবং ফ্লোনটেল / লাইবডন্টি ।
$ no -a | grep tcp_keep
কমান্ড ব্যবহার করে অনুসন্ধান করা যেতে পারে ।
আপনি SO_KEEPALIVE সকেট বিকল্পটি সন্ধান করছেন।
জাভা সকেট API- টি অনাবৃত "সক্রিয়-রাখুন" অ্যাপ্লিকেশন মাধ্যমে setKeepAlive
এবংgetKeepAlive
পদ্ধতি।
সম্পাদনা: SO_KEEPALIVE কোনও "আসল" ডেটা না প্রেরণ ওএস নেটওয়ার্ক প্রোটোকল স্ট্যাকগুলিতে প্রয়োগ করা হয়। কিপ-লাইভ ইন্টার্ভাল অপারেটিং সিস্টেম নির্ভর, এবং কার্নেল প্যারামিটারের মাধ্যমে এটি টিউনযোগ্য হতে পারে।
যেহেতু কোনও ডেটা প্রেরণ করা হয়নি, তাই SO_KEEPALIVE কেবলমাত্র নেটওয়ার্ক সংযোগের প্রাণবন্ততা পরীক্ষা করতে পারে, সকেটের সাথে সংযুক্ত সেবার লাইভনেস নয়। পরবর্তীটি পরীক্ষা করার জন্য, আপনাকে এমন কিছু কার্যকর করতে হবে যাতে সার্ভারে বার্তা প্রেরণ এবং প্রতিক্রিয়া পাওয়া জড়িত।
টিসিপি রক্ষণশীল এবং এইচটিটিপি রক্ষণশীল খুব আলাদা ধারণা। টিসিপিতে, কীটালাইভ হ'ল বাসি সংযোগ সনাক্ত করতে প্রেরণ করা প্রশাসনিক প্যাকেট। এইচটিটিপি-তে, কিটালাইভ মানে অবিচ্ছিন্ন সংযোগের অবস্থা।
এটি টিসিপি স্পেসিফিকেশন থেকে,
বেঁচে থাকা প্যাকেটগুলি কেবল তখনই প্রেরণ করতে হবে যখন কোনও বিরতিতে সংযোগের জন্য কোনও ডেটা বা স্বীকৃতি প্যাকেটগুলি না পেয়ে। এই ব্যবধানটি কনফিগারযোগ্য এবং দু'ঘন্টারও কম ডিফল্ট হওয়া আবশ্যক।
আপনি দেখতে পাচ্ছেন, বেশিরভাগ অ্যাপ্লিকেশনের জন্য ডিফল্ট টিসিপি রক্ষণশীলের ব্যবধান খুব দীর্ঘ। আপনার অ্যাপ্লিকেশন প্রোটোকলে আপনাকে কিপালাইভ যুক্ত করতে হতে পারে।
HTTP/1.0
প্রতিটি অনুরোধ / প্রতিক্রিয়াতে সার্ভারের সাথে পুনরায় সংযোগ প্রয়োজন। কারণ HTTP/1.1
তারা একটি Keep-Alive
শিরোনাম প্রবর্তন করেছে যা আরও ফাইলগুলির অনুরোধ এবং 'পাইপলাইনিং' এর অনুমতি দেওয়ার জন্য প্রতিক্রিয়া প্রক্রিয়া করার পরে সংযোগটি না কাটিয়ে দেওয়ার জন্য সার্ভারকে ট্রিগার করতে ব্যবহার করা যেতে পারে; একাধিক অনুরোধ প্রেরণ করে সমস্ত ডেটা ফিরে আসার অপেক্ষায়।
যদি আপনি কোনও মাস্ক্রেটিং NAT এর পিছনে থাকেন (তবে বেশিরভাগ ঘরোয়া ব্যবহারকারীরা এই দিনগুলি হিসাবে) তবে বাহ্যিক বন্দরের সীমিত পুল রয়েছে এবং এগুলি অবশ্যই টিসিপি সংযোগগুলির মধ্যে ভাগ করে নেওয়া উচিত। সুতরাং নির্দিষ্ট সময়ের জন্য কোনও ডেটা প্রেরণ করা না থাকলে NAT সংকেতকে হস্তান্তর করার বিষয়টি ধারনা করে a
এটি এবং এই জাতীয় অন্যান্য সমস্যাগুলি (দুটি শেষ পয়েন্টের মধ্যে যে কোনও জায়গায়) এর অর্থ হ'ল যদি আপনি যুক্তিসঙ্গত নিষ্ক্রিয় সময়ের পরে ডেটা প্রেরণের চেষ্টা করেন তবে সংযোগটি আর "কাজ" করবে না। তবে, আপনি ডেটা প্রেরণের চেষ্টা না করা পর্যন্ত আপনি এটি আবিষ্কার করতে পারবেন না ।
উভয়ই ক্যাপালাইভগুলি ব্যবহার করে লাইনের নীচে কোথাও সংযোগ বিঘ্নিত হওয়ার সম্ভাবনা হ্রাস পায় এবং আপনাকে খুব শীঘ্রই একটি ভাঙা সংযোগ সম্পর্কে সন্ধান করতে দেয়।
এখানে রক্ষণশীল সম্পর্কিত কিছু পরিপূরক সাহিত্য রয়েছে যা এটি আরও সূক্ষ্ম বিশদে ব্যাখ্যা করে।
http://www.tldp.org/HOWTO/html_single/TCP-Kipalive-HOWTO
যেহেতু জাভা আপনাকে প্রকৃত রক্ষণশীল সময়গুলি নিয়ন্ত্রণ করতে দেয় না, আপনি যদি লিনাক্স কার্নেল (বা প্রোক ভিত্তিক ওএস) ব্যবহার করেন তবে উদাহরণগুলি সেগুলি পরিবর্তন করতে ব্যবহার করতে পারেন।
জাভা সকেটে - টিসিপি সংযোগগুলি ওএস স্তরে পরিচালিত হয়, java.net.Sket প্রতি সকেট স্তরে কিপালিভ প্যাকেটের জন্য টাইমআউট সেট করতে কোনও অন্তর্নির্মিত ফাংশন সরবরাহ করে না। তবে আমরা জাভা সকেটের জন্য রক্ষণশীল বিকল্প সক্ষম করতে পারি তবে একটি বাসি টিসিপি সংযোগের পরে প্রক্রিয়া করতে ডিফল্টরূপে এটি 2 ঘন্টা 11 মিনিট (7200 সেকেন্ড) লাগে। এই কারণ সংযোগটি শুদ্ধ হওয়ার আগে খুব দীর্ঘ সময়ের জন্য অবলম্বিত হবে। সুতরাং আমরা জাভা নেটিভ ইন্টারফেস (জেএনআই) ব্যবহার করার কিছু সমাধান পেয়েছি যা এই বিকল্পগুলি কনফিগার করতে নেটিভ কোড (সি ++) কল করে।
**** উইন্ডোজ ওএস ****
উইন্ডোজ অপারেটিং সিস্টেমে কিপালিভ_টাইম এবং কিপালাইভ_িন্টভিএল কনফিগারযোগ্য হতে পারে তবে tcp_keepalive_probes পরিবর্তন করা যায় না T ডিফল্ট হিসাবে, যখন কোনও টিসিপি সকেট শুরু হয় তখন ২ ঘন্টা এবং কিপ-লাইভ ব্যবধানটি 1 সেকেন্ডে সেট করে। কিপ-লাইভ টাইমআউটটির ডিফল্ট সিস্টেম-প্রশস্ত মান ক্যাপএলাইভটাইম রেজিস্ট্রি সেটিংয়ের মাধ্যমে নিয়ন্ত্রণযোগ্য যা মিলসেকেন্ডে একটি মান নেয়।
উইন্ডোজ ভিস্তা এবং তারপরে, রাখুন-জীবিত প্রোবের সংখ্যা (ডেটা পুনঃপ্রেরণ) 10 তে সেট করা আছে এবং এটি পরিবর্তন করা যায় না।
উইন্ডোজ সার্ভার 2003, উইন্ডোজ এক্সপি এবং উইন্ডোজ 2000-এ, লাইভ-লাইভ প্রোবের সংখ্যা নির্ধারণের জন্য ডিফল্ট সেটিংটি 5 রয়েছে-বেঁচে থাকা প্রোবের সংখ্যা নিয়ন্ত্রণযোগ্য। উইন্ডোজের জন্য উইনসক আইওসিটিএল লাইব্রেরি টিসিপি-কিপালাইভ পরামিতিগুলি কনফিগার করতে ব্যবহৃত হয়।
int WSAIoctl (সকেটএফডি, // বর্ণনাকারী একটি সকেট সনাক্ত করছে এসআইও_কিইপিএলআইভিআইপিএল, // ডিওয়াইওকন্ট্রোলকোড (এলপিভিআইআইডি) lpvInBuffer, // পয়েন্টার টিসিপি_কিটালাইভ স্ট্রাক্ট (ডিডাবর্ড) সিবিআইনফার, // ইনপুট আকার বাফার এর দৈর্ঘ্য NULL আউটপুট বাফার (এলপিডিডাবর্ড) lpcbBytesReturned, // বাইট সংখ্যা NULL, // ওভারল্যাপড কাঠামো নাল // সমাপ্তির রুটিন) ফেরত;
লিনাক্স ওএস
লিনাক্স ক্যাপালাইভের জন্য অন্তর্নির্মিত সমর্থন রয়েছে যা এটি ব্যবহার করার জন্য টিসিপি / আইপি নেটওয়ার্কিং সক্ষম করা প্রয়োজন। প্রোগ্রামসকে অবশ্যই তাদের সকেটের জন্য সেটকপ্ট ইন্টারফেস ব্যবহার করে রক্ষণাবেক্ষণ নিয়ন্ত্রণের জন্য অনুরোধ করতে হবে।
ইন্ট সেসকোপ্ট (ইন সকেট, ইনট লেভেল, ইন্ট অপ্টনাম, কনস্ট বেড * অপ্টাল, সোকলেন_ ট অপটলেন)
প্রতিটি ক্লায়েন্ট সকেট java.net.Sket ব্যবহার করে তৈরি করা হবে। প্রতিটি সকেটের ফাইল বর্ণনাকারী আইডি জাভা প্রতিবিম্ব ব্যবহার করে পুনরুদ্ধার করবে।
উইন্ডোজ জন্য মাইক্রোসফ্ট ডক্স অনুযায়ী