ক্লায়েন্ট সংযোগ ব্যর্থতার কারণ

সংযোগ ব্য失败 ক্লায়েন্ট সাধারণত দুইটি ত্রুটি বার্তা পায়, connection refuse এবং connection timeout

connection refuse(সংযোগ প্রত্যাখ্যাত)

সাধারণত নিম্নলিখিত কারণে হয়:

  1. ক্লায়েন্ট সংযোগের পোর্ট ভুল
  2. ক্লায়েন্ট সংযোগের ডোমেইন অথবা আইপি ভুল
  3. যদি ক্লায়েন্ট ডোমেইন ব্যবহার করে সংযোগ করে, তাহলে ডোমেইনটি সম্ভবত ভুল সার্ভারের আইপিতে নির্দেশ করছে
  4. সার্ভার সিডিএন বা অন্যান্য তাত্ক্ষণিক এজেন্ট ব্যবহার করছে, যা সংযোগের প্রকৃত আইপি এবং প্রত্যাশিত আইপির মধ্যে বিপরীততা সৃষ্টি করছে
  5. সার্ভারের কোন পরিষেবা চলছে না অথবা পোর্টটি শোনা হচ্ছে না
  6. নেটওয়ার্ক প্রক্সি সফটওয়্যার ব্যবহার করছে
  7. সার্ভারের শোনার আইপি এবং অ্যাক্সেসে ব্যবহৃত ঠিকানা একসাথে নয়। উদাহরণস্বরূপ, সার্ভার 127.0.0.1 শুনছে হলে, ক্লায়েন্ট শুধুমাত্র 127.0.0.1 এর মাধ্যমে সংযোগ করতে পারবে, স্থানীয় নেটওয়ার্কের আইপি বা বাইরের নেটওয়ার্কের আইপির মাধ্যমে নয়। সুপারিশ করা হয় শোনার ঠিকানা 0.0.0.0 সেট করা, এটি স্থানীয়, অভ্যন্তরীণ, বাইরের সমস্ত সংযোগকে অনুমতি দেবে।

connection timeout(সংযোগ সময়সীমা শেষ)

সাধারণত নিম্নলিখিত কারণে হয়:

  1. সার্ভারের ফায়ারওয়াল সংযোগকে বাধা দিচ্ছে, আপনি সাময়িকভাবে ফায়ারওয়াল বন্ধ করে দেখতে পারেন
  2. যদি এটি ক্লাউড সার্ভার হয়, নিরাপত্তা গোষ্ঠীও সংযোগ প্রতিষ্ঠা করতে বাধা দিতে পারে, আপনাকে প্রশাসনিক প্যানেলে সংশ্লিষ্ট পোর্ট মুক্ত করতে হবে
  3. যদি বাটা বা অন্যান্য প্যানেল ব্যবহার করেন, তবে ব্যাটাতে সংশ্লিষ্ট পোর্ট মুক্ত করতে হবে
  4. সার্ভারটি বিদ্যমান নয় বা শুরু হয়নি
  5. যদি ক্লায়েন্ট ডোমেইন ব্যবহার করে সংযোগ করে, তাহলে ডোমেইনটি সম্ভবত ভুল সার্ভারের আইপিতে নির্দেশ করছে
  6. ক্লায়েন্ট যে আইপি অ্যাক্সেস করছে সেটি সার্ভারের অভ্যন্তরীণ আইপি এবং ক্লায়েন্ট ও সার্ভার একই স্থানীয় নেটওয়ার্কে নেই

cannot assign requested address (অনুরোধকৃত ঠিকানা বরাদ্দ করা যাচ্ছে না)

ক্লায়েন্ট হিসেবে প্রতিটি সংযোগ শুরু করার সময় স্থানীয় একটি অস্থায়ী পোর্ট ব্যবহার করতে হয়, একটি সার্ভারে ডিফল্টরূপে প্রায় 2-3 হাজার উপলব্ধ অস্থায়ী পোর্ট থাকে, যদি নির্দিষ্ট সার্ভারের প্রতি সংযোগের সংখ্যা এই মান অতিক্রম করে, তাহলে উপলব্ধ পোর্ট বরাদ্দ করা সম্ভব হবে না, এতে এই ত্রুটি হবে।
স্থানীয় অস্থায়ী পোর্টের সংখ্যা বৃদ্ধি করার জন্য আপনি কির্নেল প্যারামিটার /etc/sysctl.conf এর net.ipv4.ip_local_port_range পরিবর্তন করতে পারেন, উদাহরণস্বরূপ সেটি 10000 65535 এ সেট করুন (স্থানীয় পোর্টের পরিসর 10000 65535 এর কাছে, অর্থাৎ স্থানীয় পোর্টের সংখ্যা 55535 বাড়িয়ে নিয়ে যাবে), এবং পিএইচপি sysctl -p চালান।
অন্যদিকে সংযোগ বিচ্ছিন্ন হওয়ার পরে সংযোগটি TIME_WAIT অবস্থায় চলে যায়, যা নির্দিষ্ট সময়ের জন্য সংশ্লিষ্ট স্থানীয় পোর্ট দখল করে রাখবে, অর্থাৎ সংক্ষিপ্ত সময়ের মধ্যে অনেক (২-৩ হাজারের বেশি) সংক্ষিপ্ত সংযোগ করার চেষ্টা করলে Cannot assign requested address ত্রুটি আসবে, যদি এটি হয় তবে কির্নেলকে TIME_WAIT দ্রুত পুনরুদ্ধারের জন্য কনফিগার করা যেতে পারে, কির্নেল অপটিমাইজেশন হলে।

দ্রষ্টব্য
স্থানীয় পোর্টের সংখ্যা সীমাবদ্ধতা শুধুমাত্র ক্লায়েন্টের জন্য, সার্ভারের জন্য স্থানীয় পোর্টের কোন সীমাবদ্ধতা নেই, যতক্ষণ না সম্পদ যথেষ্ট থাকে, সার্ভারটি সংযোগ সংখ্যা সামলাতে ব্যবহার করা যেতে পারে।

অন্যান্য ত্রুটি

যদি ঘটানো ত্রুটি connection refuse এবং connection timeout না হয় তবে সাধারণত নিম্নলিখিত কারণে হয়:

1. ক্লায়েন্ট ব্যবহার করে যে যোগাযোগ প্রোটোকল সার্ভারের সাথে সঙ্গতিপূর্ণ নয়।
যেমন সার্ভার HTTP যোগাযোগ প্রোটোকল ব্যবহার করছে, ক্লায়েন্ট যদি WebSocket যোগাযোগ প্রোটোকল ব্যবহার করে, তা হলে সংযোগ করা সম্ভব হবে না। যদি ক্লায়েন্ট WebSocket প্রোটোকল ব্যবহার করে সংযোগ করে, তবে সার্ভারকে ও WebSocket প্রোটোকলে থাকতে হবে। যদি সার্ভার HTTP প্রোটোকলের পরিষেবা হয়, তাহলে ক্লায়েন্ট HTTP প্রোটোকল ব্যবহার করে সংযোগ করতে হবে।

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

যোগাযোগ প্রোটোকল অমিলের কারণে ঘটে এমন সাধারণ ত্রুটিগুলি হল:

WebSocket connection to 'ws://xxx.com:xx/' failed: Error during WebSocket handshake: Unexpected response code: xxx

WebSocket connection to 'ws://xxx.com:xx/' failed: Error during WebSocket handshake: net::ERR_INVALID_HTTP_RESPONSE

সমাধান:
উপরের দুটি ত্রুটির উত্স থেকে দেখা যাচ্ছে, ক্লায়েন্ট WS সংযোগটি WebSocket প্রোটোকল ব্যবহার করছে। সার্ভারকেও WebSocket প্রোটোকল ব্যবহার করতে হবে, সার্ভারের শোনার অংশের কোডে WebSocket প্রোটোকল উল্লেখ করতে হবে, যেমন নিচের মতো

যদি এটি GatewayWorker হয়, তাহলে শোনার অংশের কোডটি এরকম হবে

// websocket প্রোটোকল, এইভাবে ক্লায়েন্ট ws://... ব্যবহার করে সংযোগ করতে পারে। xxxx পোর্ট পরিবর্তন করার প্রয়োজন নেই
$gateway = new Gateway('websocket://0.0.0.0:xxxx');

যদি এটি Workerman হয় তাহলে এটি হবে

// websocket প্রোটোকল, এইভাবে ক্লায়েন্ট ws://... ব্যবহার করে সংযোগ করতে পারে। xxxx পোর্ট পরিবর্তন করার প্রয়োজন নেই
$worker = new Worker('websocket://0.0.0.0:xxxx');