টিসিপি প্রোটোকল স্তরে কীভাবে shutdownএবং কীভাবে closeকাজ করে তা বিদ্যমান উত্তরগুলির কোনওটিই লোকেরা জানায় না, তাই এটি যুক্ত করা ভাল।
4-চূড়ান্ত চূড়ান্তকরণের মাধ্যমে একটি স্ট্যান্ডার্ড টিসিপি সংযোগটি বন্ধ হয়ে যায়:
- একবার কোনও অংশগ্রহণকারীর কাছে পাঠানোর মতো আরও কোনও ডেটা না থাকলে, এটি অন্যটিতে একটি এফআইএন প্যাকেট প্রেরণ করে
- অন্য পক্ষটি এফআইএন-এর জন্য একটি এসকে প্রদান করে।
- অন্য পক্ষ যখন ডেটা স্থানান্তর শেষ করে, এটি অন্য একটি এফআইএন প্যাকেট প্রেরণ করে
- প্রাথমিক অংশগ্রহণকারী একটি এসকে প্রদান করে এবং স্থানান্তর চূড়ান্ত করে।
তবে, টিসিপি সংযোগ বন্ধ করার জন্য আরও একটি "উদীয়মান" উপায় রয়েছে:
- একজন অংশগ্রহণকারী একটি আরএসটি প্যাকেট প্রেরণ করে এবং সংযোগটি ত্যাগ করে
- অন্য পক্ষটি একটি আরএসটি পায় এবং তারপরে সংযোগটি ত্যাগ করে
ওয়াইরশার্কের সাথে আমার পরীক্ষায়, ডিফল্ট সকেট অপশন সহ, shutdownঅন্য প্রান্তে একটি এফআইএন প্যাকেট প্রেরণ করে তবে এটি সব কিছু করে। অন্য পক্ষ আপনাকে এফআইএন প্যাকেট না পাঠানো পর্যন্ত আপনি এখনও ডেটা পেতে সক্ষম হন are এটি একবার হয়ে গেলে, আপনি Receiveএকটি 0 আকারের ফলাফল পাবেন। সুতরাং আপনি যদি "প্রেরণ" বন্ধ করে দেন তবে আপনি প্রথমবারের মতো ডেটা গ্রহণ করা শেষ করে সকেটটি বন্ধ করে দেওয়া উচিত।
অন্যদিকে, আপনি যদি কল করেন closeযে সংযোগটি এখনও সক্রিয় রয়েছে (অন্য পক্ষটি এখনও সক্রিয় রয়েছে এবং আপনার সিস্টেমের বাফারেও অাপনি ডেটা থাকতে পারে), অন্যদিকে একটি আরএসটি প্যাকেট প্রেরণ করা হবে। এটি ত্রুটির জন্য ভাল। উদাহরণস্বরূপ, আপনি যদি ভাবেন যে অন্য পক্ষটি ভুল ডেটা সরবরাহ করেছে বা এটি ডেটা সরবরাহ করতে অস্বীকার করেছে (ডস আক্রমণ?), আপনি সরাসরি সকেটটি বন্ধ করতে পারেন।
বিধি সম্পর্কে আমার মতামত হবে:
- সম্ভব হলে
shutdownআগে বিবেচনা করুনclose
- আপনি শাটডাউন করার সিদ্ধান্ত নেওয়ার আগে যদি আপনি (০ আকারের ডেটা প্রাপ্ত হওয়া) পাওয়া শেষ করেন তবে শেষ প্রেরণের (যদি থাকে) শেষ হওয়ার পরে সংযোগটি বন্ধ করুন।
- আপনি যদি সংযোগটি স্বাভাবিকভাবে বন্ধ করতে চান তবে সংযোগটি বন্ধ করুন (SHUT_WR এর সাথে, এবং যদি আপনি এই পয়েন্টের পরেও SHUT_RD এর সাথে ডেটা গ্রহণের বিষয়ে চিন্তা না করেন) এবং আপনি যদি 0 আকারের ডেটা না পান ততক্ষণ অপেক্ষা করুন এবং তারপরে বন্ধ করুন সকেট.
- যাইহোক, অন্য কোনও ত্রুটি ঘটলে (উদাহরণস্বরূপ সময়সীমা), কেবল সকেটটি বন্ধ করুন।
SHUT_RD এবং SHUT_WR এর জন্য আদর্শ বাস্তবায়ন
নিম্নলিখিতগুলি পরীক্ষা করা হয়নি, নিজের ঝুঁকিতে বিশ্বাস করুন। তবে আমি বিশ্বাস করি এটি কাজ করার একটি যুক্তিসঙ্গত এবং ব্যবহারিক উপায়।
যদি টিসিপি স্ট্যাক কেবলমাত্র SHUT_RD এর সাথে একটি শাটডাউন পেয়ে থাকে তবে এটি আর কোনও ডেটা প্রত্যাশিত হিসাবে এই সংযোগটি চিহ্নিত করবে না। কোনও মুলতুবি ও পরবর্তী readঅনুরোধ (যে কোনও থ্রেডে নির্বিশেষে) তারপরে শূন্য আকারের ফলাফল সহ ফিরে আসবে। তবে সংযোগটি এখনও সক্রিয় এবং ব্যবহারযোগ্য - আপনি উদাহরণস্বরূপ এখনও ওওবি ডেটা পেতে পারেন। এছাড়াও, ওএস এই সংযোগের জন্য প্রাপ্ত যে কোনও ডেটা ফেলে দেবে। তবে এটি হ'ল কোনও প্যাকেজ অন্যদিকে প্রেরণ করা হবে না।
যদি টিসিপি স্ট্যাক কেবলমাত্র SHUT_WR এর সাথে একটি শাটডাউন পেয়ে থাকে তবে এটি আর কোনও ডেটা প্রেরণ করা যাবে না বলে এটি এই সংযোগটি চিহ্নিত করবে। সমস্ত মুলতুবি লেখার অনুরোধ সমাপ্ত হবে, তবে পরবর্তী লেখার অনুরোধগুলি ব্যর্থ হবে। তদুপরি, একটি এফআইএন প্যাকেট অন্য দিকে প্রেরণ করা হবে তাদের জানাতে আমাদের কাছে পাঠানোর মতো আরও ডেটা নেই।