সকেট API কীভাবে () ফাংশনটি গ্রহণ করে?


126

সকেট এপিআই হ'ল টিসিপি / আইপি এবং ইউডিপি / আইপি যোগাযোগের জন্য ডি-ফ্যাক্টো স্ট্যান্ডার্ড (এটি আমরা জানি যেমন নেটওয়ার্কিং কোড)। যাইহোক, এর মূল ফাংশনগুলির accept()মধ্যে একটি, কিছুটা মায়াবী।

একটি আধা-আনুষ্ঠানিক সংজ্ঞা নিতে:

গ্রহণ () সার্ভার সাইডে ব্যবহৃত হয়। এটি রিমোট ক্লায়েন্টের কাছ থেকে একটি নতুন টিসিপি সংযোগ তৈরির জন্য প্রাপ্ত আগত প্রচেষ্টা গ্রহণ করে এবং এই সংযোগের সকেট ঠিকানা জুটির সাথে যুক্ত একটি নতুন সকেট তৈরি করে।

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

কিভাবে acceptকাজ করে? কীভাবে এটি বাস্তবায়ন করা হয়? এই বিষয় নিয়ে অনেক বিভ্রান্তি রয়েছে। অনেকের দাবি মেনে নেওয়া একটি নতুন বন্দর খোলে এবং আপনি এর মাধ্যমে ক্লায়েন্টের সাথে যোগাযোগ করেন। কোনও নতুন বন্দর খোলা না হওয়ায় এটি অবশ্যই সত্য নয়। আপনি একই ক্লায়েন্টের সাথে বিভিন্ন ক্লায়েন্টের সাথে যোগাযোগ করতে পারেন তবে কীভাবে? যখন বেশ কয়েকটি থ্রেড recvএকই বন্দরে কল করে তখন ডেটা কোথায় যাবে তা কীভাবে জানবে?

আমি অনুমান করি এটি ক্লায়েন্টের ঠিকানার সাথে সকেট বর্ণনাকারীর সাথে সম্পর্কিত এবং এটি যখনই ডেটা আসে তখনই recvএটি সঠিক সকেটে নিয়ে যায়, তবে আমি নিশ্চিত নই।

এই প্রক্রিয়াটির অভ্যন্তরীণ কাজগুলির সম্পর্কে বিশদ বিবরণ পাওয়া ভাল লাগবে।


2
সুতরাং প্রতিটি ক্লায়েন্টের অনুরোধের জন্য, সার্ভারের শেষে একটি ব্র্যান্ড নিউ সকেট সংযোগ খোলা হবে। ইনকামিং কলগুলি শোনার জন্য সার্ভারটি সর্বদা 80 এ খোলা থাকতে হবে। যদি এটি কোনও কল পায়, তবে এটি নীচে উল্লিখিত চারটি টিপল সহ তাত্ক্ষণিকভাবে একটি নতুন সকেট তৈরি করবে যা ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি টিসিপি সংযোগ তৈরি করবে। আমার বোধগম্যতা কি সঠিক?
মস্তিষ্কে ঝড়

1
এটি একটি খুব মৌলিক প্রশ্ন এবং আমি সম্প্রতি একটি সাক্ষাত্কারে এটি সম্পর্কে পরীক্ষিত হয়েছিলাম: স্ট্যাকওভারফ্লো / প্রশ্ন / 24871827/… আপনার যদি এই বিষয়ে কোনও মন্তব্য থাকে তবে দয়া করে পোস্ট করুন
মস্তিষ্কের ঝড়

@ ব্রেনস্টর্ম কেবলমাত্র যদি আপনি HTTP- র অস্তিত্বকে সম্পূর্ণরূপে উপেক্ষা করেন।
লার্নের মারকুইস

উত্তর:


140

আপনার বিভ্রান্তি এই ভেবেই নিহিত যে কোনও সকেট সার্ভার আইপি: সার্ভার পোর্ট দ্বারা চিহ্নিত করা হয়েছে। বাস্তবের ক্ষেত্রে, সকেটগুলি তথ্যের চৌকোটি দ্বারা স্বতন্ত্রভাবে চিহ্নিত করা হয়:

Client IP : Client Port এবং Server IP : Server Port

সার্ভার আইপি এবং সার্ভার পোর্ট সমস্ত স্বীকৃত সংযোগগুলিতে স্থির থাকা অবস্থায় ক্লায়েন্টের সাইডের তথ্য হ'ল এটি কোথায় যা হচ্ছে তা ট্র্যাক রাখতে দেয়।

বিষয়গুলি পরিষ্কার করার উদাহরণ:

বলুন আমাদের কাছে একটি সার্ভার রয়েছে 192.168.1.1:80এবং দুটি ক্লায়েন্ট রয়েছে 10.0.0.1এবং 10.0.0.2

10.0.0.1স্থানীয় পোর্টে একটি সংযোগ খোলে 1234এবং সার্ভারে সংযোগ স্থাপন করে। এখন সার্ভারের একটি সকেট নিম্নরূপে চিহ্নিত হয়েছে:

10.0.0.1:1234 - 192.168.1.1:80  

এখন 10.0.0.2স্থানীয় বন্দরে একটি সংযোগ খোলে 5678এবং সার্ভারের সাথে সংযোগ স্থাপন করে। এখন সার্ভারের দুটি সকেট নিম্নলিখিত হিসাবে চিহ্নিত হয়েছে:

10.0.0.1:1234 - 192.168.1.1:80  
10.0.0.2:5678 - 192.168.1.1:80

3
আমি বাস্তবায়ন বিশদটি জানি না (যা সম্ভবত প্ল্যাটফর্ম থেকে প্ল্যাটফর্মের পরিবর্তে পৃথক হতে পারে), আমি কেবল জানি যে ধারণাগতভাবে সকেটগুলি আমি বর্ণিত তথ্যের চৌকোটি দ্বারা চিহ্নিত করা হয়।
26

3
আপনার এই বিষয়ে কোন রেফারেন্স আছে?
Qeek

3
এলোমেলো প্রশ্ন: যদি NAT ব্যবহার করা হচ্ছে এবং সার্ভারের সাথে সংযোগের সময় একই নেটওয়ার্কের দুটি ক্লায়েন্ট একই স্থানীয় পোর্টটি ব্যবহার করার চেষ্টা করে তবে কী ঘটে? উদাহরণস্বরূপ, যদি 10.0.0.1 এবং 10.0.0.2 উভয়ই রাউটারের সাথে 192.168.0.1 এর বাহ্যিক আইপি সংযুক্ত থাকে, তাই 192.168.1.1 এ সার্ভারটি 192.168.0.1 থেকে দুটি সংযোগ দেখতে পাবে। সেই ক্ষেত্রে কি হবে যদি 10.0.0.1 এবং 10.0.0.2 উভয় এলোমেলো-নাম্বার জেনারেটরের কোনও ফ্লুক দ্বারা একই স্থানীয় বন্দরটি বেছে নেওয়া হয়?
অ্যারোথ

4
রাউটারে NAT সমর্থন সেখানে বিশদটির যত্ন নেয়। নেটওয়ার্ক ট্র্যাফিক আসলে দুটি সংযোগ ছাড়িয়ে যাচ্ছে - ক্লায়েন্ট থেকে রাউটার এবং রাউটার থেকে সার্ভার। রাউটার দুটি পৃথক পোর্ট 192.168.0.1e3234 এবং 192.168.0.1:5678 এ বহির্গামী সংযোগগুলি করে। আগত ট্র্যাফিকটি রাউটার দ্বারা সঠিক ক্লায়েন্টে পুনঃনির্দেশিত হয়।
26 এর

3
যদি কোনও সকেট চৌকোটি দ্বারা চিহ্নিত করা হয় তবে শ্রোতার সকেটের চৌকোটি তথ্য কী?
এরিক ঝেং

74

"26 এর 17" ব্যবহারকারীর দেওয়া উত্তরে কেবল যুক্ত করতে

সকেটটি আসলে 5 টি টিপল নিয়ে থাকে - (উত্স আইপি, উত্স পোর্ট, গন্তব্য আইপি, গন্তব্য পোর্ট, প্রোটোকল)। এখানে প্রোটোকল টিসিপি বা ইউডিপি বা কোনও পরিবহন স্তর প্রোটোকল পারে। এই প্রোটোকলটি আইপি ডেটাগ্রামে 'প্রোটোকল' ক্ষেত্র থেকে প্যাকেটে চিহ্নিত করা হয়েছে।

এইভাবে সার্ভারে একই ক্লায়েন্টের সাথে একই একই 4-টিউপলগুলিতে যোগাযোগ করা হলেও প্রোটোকল ক্ষেত্রে পৃথক পৃথক অ্যাপ্লিকেশন থাকা সম্ভব। উদাহরণ স্বরূপ

সার্ভার সাইডে অ্যাপাচি (টিসিপিতে সার্ভার 1.com:880-client1:13234) এবং ওয়ার্ক্রফের ওয়ার্ল্ড ইউডিপিতে কথা বলছে (সার্ভার 1.com:880-স্লায়েন্ট 1 নম্বর 234)

ক্লায়েন্ট এবং সার্ভার উভয়ই এটিকে আইপি প্যাকেটে প্রোটোকল ক্ষেত্র হিসাবে পরিচালনা করবে অন্য সমস্ত 4 টি ক্ষেত্র একই থাকলেও different


13

আমি যখন এটি শিখছিলাম তখন আমাকে কী বিভ্রান্ত করেছিল, এটি ছিল শর্তাদি socketএবং portসেগুলি শারীরিক কিছু হওয়ার পরামর্শ দেয়, যখন সত্যিকার অর্থে তারা কেবল ডেটা স্ট্রাকচার হিসাবে নেটওয়ার্কের বিবরণ বিমূর্ত করতে কার্নেল ব্যবহার করে।

যেমন, বিভিন্ন ক্লায়েন্টের থেকে সংযোগ আলাদা রাখতে সক্ষম হতে ডেটা স্ট্রাকচারগুলি প্রয়োগ করা হয়। হিসেবে কিভাবে তারা বাস্তবায়িত করছি, উত্তর হয় একটি।) এটা কোন ব্যাপার না, সকেট API- এর উদ্দেশ্য অবিকল যে বাস্তবায়ন মাত্র একটি চেহারা আছে ব্যাপার অথবা B উচিত নয়।) কি ভাবে হয়। একটি বাস্তবায়নের বিশদ বিবরণ সরবরাহকারী অত্যন্ত প্রস্তাবিত স্টিভেনস বইগুলি ছাড়াও লিনাক্স বা সোলারিস বা বিএসডি-র যে কোনও একটিতে উত্সটি পরীক্ষা করে দেখুন।


হ্যাঁ, বেশিরভাগ নেটওয়ার্কিং পরিভাষা কেবল কিছু বিট সংগ্রহ এবং তাদের মানগুলির ("প্রোটোকল শনাক্তকারী", "রাউটিং", "বাইন্ডিং", "সকেট" ইত্যাদি) এর উপর ভিত্তি করে নেওয়া সিদ্ধান্তগুলিতে নাম নির্দিষ্ট করে দেয়। আপনার সমস্ত নেটওয়ার্ক কার্ডের হার্ডওয়্যার গ্রহণের জন্য ডিজাইন করা হয়েছে এটি বিটের একটি স্ট্রিম। আপনার কম্পিউটারে প্রোগ্রামগুলির সাথে তাদের কী ঘটে তা ড্রাইভার এবং ওএস দ্বারা স্থির করা হয়। আমরা চাইলে আগামীকাল সেই সমস্ত পরিভাষা থেকে মুক্তি পেতে পারি, তবে বিটগুলির প্রবাহ সরবরাহ করার নীতিটি মৌলিক বলে মনে হচ্ছে ...
মাস্টারেক্সিলো

-1

অন্য লোকটি যেমন বলেছে, একটি সকেট অনন্যভাবে একটি 4-টিউপল (ক্লায়েন্ট আইপি, ক্লায়েন্ট পোর্ট, সার্ভার আইপি, সার্ভার পোর্ট) দ্বারা চিহ্নিত করা হয়।

সার্ভার আইপি-তে চলমান সার্ভার প্রক্রিয়া সক্রিয় সকেটগুলির সারণীর / সারণী / তালিকা / বৃক্ষ / অ্যারে / যাদু ডেটা স্ট্রাকচারটি ব্যবহার করে তা বোঝায় না) এটি সার্ভার পোর্টে শুনবে এবং শুনবে। যখন এটি একটি বার্তা পায় (সার্ভারের টিসিপি / আইপি স্ট্যাকের মাধ্যমে), এটি ক্লায়েন্ট আইপি এবং পোর্টটি ডাটাবেসের বিরুদ্ধে পরীক্ষা করে। ক্লায়েন্ট আইপি এবং ক্লায়েন্ট পোর্টটি যদি একটি ডাটাবেস এন্ট্রিতে পাওয়া যায়, তবে বার্তাটি একটি বিদ্যমান হ্যান্ডলারের হাতে দেওয়া হয়, অন্যথায় একটি নতুন ডাটাবেস এন্ট্রি তৈরি হয় এবং একটি নতুন হ্যান্ডলার সেই সকেটটি পরিচালনা করতে সক্ষম হয়।

এআরপিএনেটের প্রথম দিনগুলিতে কিছু নির্দিষ্ট প্রোটোকল (যার জন্য এফটিপি) সংযোগের জন্য অনুরোধের জন্য একটি নির্দিষ্ট পোর্টটি শোনাত এবং হ্যান্ড অফ পোর্ট দিয়ে উত্তর দিত। এই সংযোগের জন্য আরও যোগাযোগগুলি হ্যান্ড অফ পোর্টের উপর দিয়ে যাবে। এটি প্রতি প্যাকেটের কার্যকারিতা উন্নত করার জন্য করা হয়েছিল: কম্পিউটারগুলি সেই দিনগুলিতে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে নাম যায়।


আপনি 'হ্যান্ডঅফ পোর্ট' অংশটি বিস্তারিতভাবে বলতে পারেন?
এলি বেন্ডারস্কি

1
এটি হয় কিছু প্রাক-টিসিপি প্রোটোকলের বিবরণ, বা অতিরিক্ত সরলীকৃত। শ্রোতা সকেটে সংযোগ স্থাপনের চেষ্টা করা একটি ক্লায়েন্ট সংযোগ স্থাপনের জন্য একটি বিশেষ প্যাকেট প্রেরণ করে (এসওয়াইএন বিট সেট)। একটি প্যাকেট একটি নতুন সকেট তৈরি করার এবং বিদ্যমান সকেট ব্যবহার করার মধ্যে একটি স্পষ্ট পার্থক্য রয়েছে।
জন এম

... সংযোগ স্থাপনের জন্য একটি বিশেষ প্যাকেট প্রেরণ করে (এসওয়াইএন বিট সেট)। যা (যেমন আমি এটি বুঝতে পারি) প্রোটোকল স্ট্যাক এটিকে 'শ্রোতাদের' (যদি থাকে) দেয় এবং এজন্য ঠিকানা / পোর্ট / প্রোটোকল সংমিশ্রণে কেবলমাত্র একটি শ্রবণ পোর্ট থাকতে পারে। আমি নিশ্চিত না যদিও এটি চশমা বা নিছক বাস্তবায়নের সম্মেলনে রয়েছে কিনা।
পিটার উইন

1
দ্বিতীয় অনুচ্ছেদে টিসিপি স্তর বা সার্ভার প্রক্রিয়ার মধ্যে কী ঘটে তা সঠিকভাবে বর্ণনা করে না। সার্ভার প্রসেসগুলি কোনও ধরণের সকেটের ডেটা স্ট্রাকচারগুলি বজায় রাখতে বা ইনকামিং আইপি: যে কোনও কিছুর বিপরীতে পোর্ট পেয়ারগুলি পরীক্ষা করতে হবে না। সকেট কি জন্য আছে। সমস্ত 'পরবর্তী যোগাযোগের' জন্য নয়, প্রোটোকলকে সহজ করার জন্য টুপিগুলি করা হয়েছে, পারফরম্যান্সের কারণে নয়, এফটিপি ডেটার জন্য পৃথক পোর্ট ব্যবহার করে। কোনওভাবেই কার্যকারিতা উন্নত না করার সময় একটি নতুন বন্দর ব্যবহার করা।
লার্নের মারকুইস

"একটি ডাটাবেস বজায় রাখে (যার অর্থ এটি কী ধরণের টেবিল / তালিকা / গাছ / অ্যারে / যাদু ডেটা কাঠামো ব্যবহার করে তা বিবেচ্য নয়)" :) আমি সাধারণত এটিকে একটি "টেবিল" (অথবা সম্ভবত "গ্রাফ" বা "সিদ্ধান্ত গাছ" বলি) )। "ডাটাবেস" আমাকে কিছু প্রয়োগের পরামর্শ দেয়।
মাস্টারেক্সিলো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.