কম্পিউটার

কিভাবে ইন্টারনেট কথা বলে

একটি যোগাযোগের গল্প

আপনি কি কখনো ভেবে দেখেছেন কিভাবে ইন্টারনেট আসলে কথা বলে? কিভাবে একটি কম্পিউটার ইন্টারনেটের মাধ্যমে অন্য কম্পিউটারের সাথে "কথা" করে?

যখন লোকেরা একে অপরের সাথে যোগাযোগ করে, তখন আমরা আপাতদৃষ্টিতে অর্থপূর্ণ বাক্যে শব্দগুলি ব্যবহার করি। বাক্যগুলি শুধুমাত্র অর্থপূর্ণ কারণ আমরা এই বাক্যগুলির একটি অর্থের উপর একমত হয়েছি। আমরা যোগাযোগের একটি প্রোটোকল সংজ্ঞায়িত করেছি, তাই কথা বলতে।

দেখা যাচ্ছে, কম্পিউটার ইন্টারনেটের মাধ্যমে একইভাবে একে অপরের সাথে কথা বলে। কিন্তু, আমরা নিজেদের থেকে এগিয়ে যাচ্ছি। লোকেরা যোগাযোগের জন্য তাদের মুখ ব্যবহার করে, আসুন প্রথমে কম্পিউটারের মুখ কী তা খুঁজে বের করি৷

সকেটে প্রবেশ করুন

সকেট কম্পিউটার বিজ্ঞানের সবচেয়ে মৌলিক ধারণাগুলির মধ্যে একটি। আপনি সকেট ব্যবহার করে আন্তঃসংযুক্ত ডিভাইসগুলির সম্পূর্ণ নেটওয়ার্ক তৈরি করতে পারেন৷

কম্পিউটার বিজ্ঞানের অন্যান্য সমস্ত জিনিসের মতো, একটি সকেট একটি খুব বিমূর্ত ধারণা। সুতরাং, একটি সকেট কি তা সংজ্ঞায়িত করার পরিবর্তে, একটি সকেট কি করে তা সংজ্ঞায়িত করা অনেক সহজ৷

সুতরাং, একটি সকেট কি করে? এটি দুটি কম্পিউটারকে একে অপরের সাথে যোগাযোগ করতে সহায়তা করে। এটা কিভাবে কাজ করে? এটির দুটি পদ্ধতি সংজ্ঞায়িত করা হয়েছে, যাকে বলা হয় send() এবং recv() যথাক্রমে প্রেরণ এবং গ্রহণের জন্য।

ঠিক আছে, এটি সবই দুর্দান্ত, তবে কী করবেন send() এবং recv() আসলে পাঠান এবং গ্রহণ করেন? লোকেরা যখন তাদের মুখ নড়াচড়া করে তখন তারা শব্দ বিনিময় করে। যখন সকেট তাদের পদ্ধতি ব্যবহার করে, তারা বিট এবং বাইট বিনিময় করে।

একটি উদাহরণ দিয়ে পদ্ধতিগুলি ব্যাখ্যা করা যাক। ধরা যাক আমাদের দুটি কম্পিউটার আছে, A এবং B। কম্পিউটার A কম্পিউটার B কে কিছু বলার চেষ্টা করছে। তাই, কম্পিউটার B কম্পিউটার A যা বলছে তা শোনার চেষ্টা করছে। এটি দেখতে কেমন হবে তা এখানে।

কিভাবে ইন্টারনেট কথা বলে
বাফার সহ সকেট

বাফার পড়া

একটু অদ্ভুত লাগছে, তাই না? একটির জন্য, উভয় কম্পিউটারই মাঝখানে একটি বারের দিকে নির্দেশ করছে, শিরোনাম 'বাফার'৷

বাফার কি? বাফার একটি মেমরি স্ট্যাক. এটি যেখানে প্রতিটি কম্পিউটারের ডেটা সংরক্ষণ করা হয়, এবং কার্নেল দ্বারা বরাদ্দ করা হয়৷

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

ঠিক আছে, এখন যেহেতু আমরা জানি এটি দৃশ্যত দেখতে কেমন, আসুন এটিকে কোডে বিমূর্ত করা যাক৷

#Computer A sends data computerA.send(data) 
#Computer B receives data computerB.recv(1024)

এই কোড স্নিপেট ঠিক একই জিনিস উপরে চিত্র প্রতিনিধিত্ব করে. একটি কৌতূহল ছাড়া, আমরা computerB.recv(data) বলি না . পরিবর্তে, আমরা ডেটার জায়গায় একটি আপাতদৃষ্টিতে এলোমেলো সংখ্যা নির্দিষ্ট করি৷

কারণটা সহজ। একটি নেটওয়ার্কে ডেটা বিটগুলিতে প্রেরণ করা হয়। তাই, যখন আমরা কম্পিউটারবি-তে recv করি, তখন আমরা বিট সংখ্যা উল্লেখ করি আমরা যেকোনো একটি নির্দিষ্ট সময়ে গ্রহণ করতে ইচ্ছুক।

কেন আমি একবারে প্রাপ্ত করার জন্য 1024 বাইট বাছাই করেছি? কোন সুনির্দিষ্ট কারণ নেই। সাধারণত 2 পাওয়ারে আপনি কতগুলি বাইট পাবেন তা উল্লেখ করা ভাল। আমি 1024 বেছে নিয়েছি যা 2¹⁰।

সুতরাং, কিভাবে বাফার এই চিন্তা করে? ঠিক আছে, কম্পিউটার A বাফারে এটির সাথে সংরক্ষিত যাই হোক না কেন ডেটা লিখে বা পাঠায়। কম্পিউটার B সেই বাফারে সংরক্ষিত প্রথম 1024 বাইট পড়ার বা গ্রহণ করার সিদ্ধান্ত নেয়।

ঠিক আছে, দুর্দান্ত! কিন্তু, কিভাবে এই দুই কম্পিউটার একে অপরের সাথে কথা বলতে জানে? উদাহরণস্বরূপ, যখন কম্পিউটার A এই বাফারে লেখে, তখন এটি কীভাবে জানবে যে কম্পিউটার B এটিকে তুলতে যাচ্ছে? এটিকে পুনরায় ব্যাখ্যা করার জন্য, কীভাবে এটি নিশ্চিত করা যায় যে দুটি কম্পিউটারের মধ্যে একটি সংযোগের একটি অনন্য বাফার রয়েছে?

IP-এ পোর্টিং

কিভাবে ইন্টারনেট কথা বলে
কম্পিউটারগুলির পোর্ট এবং আইপি

উপরের চিত্রটি দেখায় একই দুটি কম্পিউটারে আমরা কাজ করছি সেই সাথে আরও একটি বিশদ যুক্ত করা হয়েছে৷ প্রতিটি কম্পিউটারের সামনে একটি বারের দৈর্ঘ্য বরাবর একগুচ্ছ সংখ্যা তালিকাভুক্ত রয়েছে৷

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

255 এর নিচের পোর্টগুলি সাধারণত সিস্টেম কল এবং নিম্ন-স্তরের সংযোগের জন্য সংরক্ষিত। সাধারণত 8000-এর মতো উচ্চ 4-অঙ্কে একটি পোর্টে একটি সংযোগ খোলার পরামর্শ দেওয়া হয়। আমি উপরের ছবিতে বাফারটি আঁকেনি, তবে আপনি ধরে নিতে পারেন যে প্রতিটি পোর্টের নিজস্ব বাফার রয়েছে।

বার নিজেই এর সাথে যুক্ত একটি সংখ্যা আছে. এই নম্বরটিকে আইপি ঠিকানা বলা হয়। আইপি অ্যাড্রেসের সাথে যুক্ত একগুচ্ছ পোর্ট রয়েছে। নিম্নলিখিত উপায়ে এটি চিন্তা করুন:

                          127.0.0.1                             / | \                            /  |  \                           /   |   \                        8000  8001 8002

দুর্দান্ত, আসুন কম্পিউটার A এবং কম্পিউটার B এর মধ্যে একটি নির্দিষ্ট পোর্টে একটি সংযোগ সেট আপ করি৷

# computerA.pyimport socket 
computerA = socket.socket() 
# Connecting to localhost:8000 computerA.connect(('127.0.0.1', 8000)) string = 'abcd' encoded_string = string.encode('utf-8') computerA.send(encoded_string)

এখানে computerB.py এর কোড আছে

# computerB.py import socket 
computerB = socket.socket() 
# Listening on localhost:8000 computerB.bind(('127.0.0.1', 8000)) computerB.listen(1) 
client_socket, address = computerB.accept() data = client_socket.recv(2048) print(data.decode('utf-8'))

দেখে মনে হচ্ছে আমরা কোডের পরিপ্রেক্ষিতে একটু এগিয়ে গেছি, কিন্তু আমি এটির মধ্য দিয়ে যাব। আমরা জানি আমাদের দুটি কম্পিউটার আছে, A এবং B। তাই, ডেটা পাঠানোর জন্য আমাদের একটি এবং ডেটা গ্রহণের জন্য একটি প্রয়োজন৷

আমি নির্বিচারে ডেটা পাঠানোর জন্য A এবং ডেটা গ্রহণের জন্য B নির্বাচন করেছি। এই লাইনে computerA.connect((‘127.0.0.1’, 8000) , আমি IP ঠিকানা 127.0.0.1-এ পোর্ট 8000-এর সাথে কম্পিউটারএ কানেক্ট করছি।

দ্রষ্টব্য:127.0.0.1 সাধারণত লোকালহোস্টকে বোঝায়, যা আপনার মেশিনকে উল্লেখ করে

তারপর, কম্পিউটারবি-এর জন্য, আমি আইপি অ্যাড্রেস 127.0.0.1-এ 8000 পোর্টে এটিকে আবদ্ধ করছি। এখন, আপনি সম্ভবত ভাবছেন কেন আমার কাছে দুটি ভিন্ন কম্পিউটারের জন্য একই আইপি ঠিকানা আছে।

কারণ আমি প্রতারণা করছি। আপনি কীভাবে সকেট ব্যবহার করতে পারেন তা প্রদর্শন করতে আমি একটি কম্পিউটার ব্যবহার করছি (আমি মূলত সরলতার জন্য একই কম্পিউটার থেকে এবং একই কম্পিউটারে সংযোগ করছি)। সাধারণত দুটি ভিন্ন কম্পিউটারের দুটি ভিন্ন IP ঠিকানা থাকে।

আমরা ইতিমধ্যেই জানি যে ডেটা প্যাকেটের অংশ হিসাবে শুধুমাত্র বিটগুলি পাঠানো যেতে পারে, তাই আমরা এটি পাঠানোর আগে স্ট্রিংটিকে এনকোড করি। একইভাবে, আমরা কম্পিউটার B-এ স্ট্রিংটি ডিকোড করি। আপনি যদি উপরের দুটি ফাইল স্থানীয়ভাবে চালানোর সিদ্ধান্ত নেন, তাহলে computerB.py চালানো নিশ্চিত করুন প্রথমে ফাইল করুন। আপনি যদি computerA.py চালান প্রথমে ফাইল করুন, আপনি একটি সংযোগ প্রত্যাখ্যান ত্রুটি পাবেন।

ক্লায়েন্টদের সেবা করা

কিভাবে ইন্টারনেট কথা বলে
ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা ট্রান্সমিটিং

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

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

আসুন এটি আরও পরীক্ষা করার জন্য একটি উপমা ব্যবহার করার চেষ্টা করি। দুই ব্যক্তির মধ্যে নিম্নলিখিত কথোপকথন কল্পনা করুন.

কিভাবে ইন্টারনেট কথা বলে

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

আমাদের ক্লায়েন্ট এবং সার্ভার একটি অনুরূপ প্রোটোকল প্রয়োজন. অন্যথায়, তারা কীভাবে জানবে যখন তাদের ডেটার প্যাকেট পাঠানোর পালা?

আমরা এটি ব্যাখ্যা করার জন্য সহজ কিছু করব। ধরা যাক আমরা কিছু ডেটা পাঠাতে চাই যা স্ট্রিংগুলির একটি অ্যারে হতে পারে। ধরা যাক অ্যারেটি নিম্নরূপ:

arr = ['random', 'strings', 'that', 'need', 'to', 'be', 'transferred', 'across', 'the', 'network', 'using', 'sockets']

উপরের ডেটা যা ক্লায়েন্ট থেকে সার্ভারে লেখা হবে। আরেকটি সীমাবদ্ধতা তৈরি করা যাক। সার্ভারকে এমন ডেটা গ্রহণ করতে হবে যা ঠিক সেই মুহূর্তে পাঠানো স্ট্রিং দ্বারা দখলকৃত ডেটার সমতুল্য৷

সুতরাং, উদাহরণস্বরূপ, যদি ক্লায়েন্ট 'র্যান্ডম' স্ট্রিং জুড়ে পাঠাতে যাচ্ছে, এবং ধরা যাক প্রতিটি অক্ষর 1 বাইট দখল করে, তাহলে স্ট্রিং নিজেই 6 বাইট দখল করে। 6 বাইট তাহলে 6*8 =48 বিটের সমান। তাই, স্ট্রিং 'র্যান্ডম' ক্লায়েন্ট থেকে সার্ভারে সকেট জুড়ে স্থানান্তর করার জন্য, সার্ভারকে জানতে হবে যে ডেটার নির্দিষ্ট প্যাকেটের জন্য এটিকে 48 বিট অ্যাক্সেস করতে হবে৷

এই সমস্যাটি ভেঙে ফেলার একটি ভাল সুযোগ। আমাদের প্রথমে কিছু জিনিস বের করতে হবে।

একটি স্ট্রিং কতগুলি বাইট দখল করে তা আমরা কীভাবে বের করব পাইথন?

আচ্ছা, আমরা প্রথমে একটি স্ট্রিং এর দৈর্ঘ্য বের করে শুরু করতে পারি। এটি সহজ, এটি শুধুমাত্র len() এ একটি কল৷ . কিন্তু, আমাদের এখনও একটি স্ট্রিং দ্বারা দখলকৃত বাইটের সংখ্যা জানতে হবে, শুধু দৈর্ঘ্য নয়।

আমরা প্রথমে স্ট্রিংটিকে বাইনারিতে রূপান্তর করব, এবং তারপর ফলস্বরূপ বাইনারি উপস্থাপনার দৈর্ঘ্য খুঁজে বের করব। এটি আমাদের ব্যবহৃত বাইটের সংখ্যা দিতে হবে।

len(‘random’.encode(‘utf-8’)) আমরা যা চাই তা আমাদের দেবে

আমরা কিভাবে প্রতিটি দ্বারা দখলকৃত বাইটের সংখ্যা পাঠাব সার্ভারে স্ট্রিং?

সহজ, আমরা বাইটের সংখ্যাকে (যা একটি পূর্ণসংখ্যা) সেই সংখ্যাটির একটি বাইনারি উপস্থাপনায় রূপান্তর করব এবং এটি সার্ভারে পাঠাব। এখন, সার্ভারটি স্ট্রিংটি পাওয়ার আগে একটি স্ট্রিংয়ের দৈর্ঘ্য পাওয়ার আশা করতে পারে৷

ক্লায়েন্ট সব পাঠানো শেষ হলে সার্ভার কীভাবে জানবে স্ট্রিং?

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

আমরা এখন পর্যন্ত যে প্রোটোকল ডিজাইন করেছি তা এখানে:

কিভাবে ইন্টারনেট কথা বলে
আমাদের সরল প্রোটোকল

স্ট্রিংটির দৈর্ঘ্য হবে 2 বাইট, এর পরে প্রকৃত স্ট্রিংটি পরিবর্তনশীল দৈর্ঘ্য হবে। এটি পূর্ববর্তী প্যাকেটে পাঠানো স্ট্রিং দৈর্ঘ্যের উপর নির্ভর করবে এবং আমরা স্ট্রিং দৈর্ঘ্য এবং স্ট্রিং নিজেই পাঠানোর মধ্যে বিকল্প করব। ইওটি মানে হল এন্ড অফ ট্রান্সমিশন, এবং স্ট্রিং 'এন্ড' পাঠানোর অর্থ হল পাঠানোর জন্য আর কোনও ডেটা নেই৷

দ্রষ্টব্য:আমরা চালিয়ে যাওয়ার আগে, আমি কিছু উল্লেখ করতে চাই। এটি একটি খুব সাধারণ এবং বোকা প্রোটোকল। আপনি যদি দেখতে চান একটি ভাল-ডিজাইন করা প্রোটোকল দেখতে কেমন হয়, তাহলে HTTP প্রোটোকল ছাড়া আর তাকাবেন না৷

এর কোড আউট করা যাক. আমি নীচের কোডে মন্তব্যগুলি অন্তর্ভুক্ত করেছি তাই এটি স্ব-ব্যাখ্যামূলক৷

দুর্দান্ত, আমাদের একটি ক্লায়েন্ট চলছে। এরপরে, আমাদের সার্ভার দরকার৷

আমি উপরের সারাংশে কোডের কয়েকটি নির্দিষ্ট লাইন ব্যাখ্যা করতে চাই। প্রথমটি, clientSocket.py থেকে ফাইল।

len_in_bytes = (len_of_string).to_bytes(2, byteorder='little')

উপরেরটি যা করে তা হল একটি সংখ্যাকে বাইটে রূপান্তর করা। to_bytes ফাংশনে পাস করা প্রথম প্যারামিটারটি হল len_of_string রূপান্তরের ফলাফলে বরাদ্দকৃত বাইটের সংখ্যা। এর বাইনারি উপস্থাপনা।

দ্বিতীয় প্যারামিটারটি লিটল এন্ডিয়ান ফরম্যাট বা বিগ এন্ডিয়ান ফরম্যাট অনুসরণ করবে কিনা তা নির্ধারণ করতে ব্যবহৃত হয়। আপনি এখানে এটি সম্পর্কে আরও পড়তে পারেন। আপাতত, শুধু জেনে রাখুন যে আমরা সবসময় সেই প্যারামিটারের জন্য সামান্যই থাকব।

কোডের পরবর্তী লাইনটি আমি দেখতে চাই:

client_socket.send(string.encode(‘utf-8’))

আমরা ‘utf-8’ ব্যবহার করে স্ট্রিংটিকে একটি বাইনারি ফর্ম্যাটে রূপান্তর করছি এনকোডিং।

এরপরে, serverSocket.py-এ ফাইল:

data = client_socket.recv(2) str_length = int.from_bytes(data, byteorder='little')

উপরের কোডের প্রথম লাইনটি ক্লায়েন্ট থেকে 2 বাইট ডেটা গ্রহণ করে। মনে রাখবেন যে যখন আমরা clientSocket.py এ স্ট্রিংটির দৈর্ঘ্যকে একটি বাইনারি বিন্যাসে রূপান্তরিত করেছি , আমরা 2 বাইটে ফলাফল সংরক্ষণ করার সিদ্ধান্ত নিয়েছি। এই কারণেই আমরা একই ডেটার জন্য এখানে 2 বাইট পড়ছি।

পরবর্তী লাইন বাইনারি বিন্যাস একটি পূর্ণসংখ্যা রূপান্তর জড়িত. byteorder byteorder-এর সাথে মেলে এখানে "সামান্য" আমরা ক্লায়েন্টে ব্যবহার করেছি।

আপনি যদি এগিয়ে যান এবং দুটি সকেট চালান, তাহলে আপনাকে দেখতে হবে যে সার্ভারটি ক্লায়েন্ট যে স্ট্রিংগুলি পাঠাবে তা মুদ্রণ করবে। আমরা যোগাযোগ স্থাপন করেছি!

উপসংহার

ঠিক আছে, আমরা এ পর্যন্ত বেশ কিছুটা কভার করেছি। যথা, সকেট কি, কিভাবে আমরা সেগুলি ব্যবহার করি এবং কিভাবে একটি খুব সহজ এবং বোকা প্রোটোকল ডিজাইন করি। আপনি যদি সকেটগুলি কীভাবে কাজ করে সে সম্পর্কে আরও জানতে চান, আমি অত্যন্ত পরামর্শ দিচ্ছি Beej-এর গাইড টু নেটওয়ার্ক প্রোগ্রামিং পড়ার। সেই ই-বুকটিতে অনেক দুর্দান্ত জিনিস রয়েছে৷

আপনি এখন পর্যন্ত এই নিবন্ধে যা পড়েছেন তা অবশ্যই নিতে পারেন এবং রাস্পবেরিপিআই ক্যামেরা থেকে আপনার কম্পিউটারে ছবি স্ট্রিম করার মতো আরও জটিল সমস্যায় এটি প্রয়োগ করতে পারেন। এটার সাথে মজা করুন!

আপনি যদি চান, আপনি আমাকে Twitter বা GitHub-এ অনুসরণ করতে পারেন। আপনি এখানে আমার ব্লগ চেক আউট করতে পারেন. আপনি আমার সাথে যোগাযোগ করতে চাইলে আমি সর্বদা উপলব্ধ!

মূলত 14 ফেব্রুয়ারি, 2019-এ https://redixhumayun.github.io/networking/2019/02/14/how-the-internet-speaks.html-এ প্রকাশিত।


  1. কম্পিউটার নেটওয়ার্কিং টিউটোরিয়াল - কীভাবে নেটওয়ার্ক অ্যাপ্লিকেশনগুলি ইন্টারনেটে কথা বলে

  2. কিভাবে ইন্টারনেটে বেনামী থাকা যায়

  3. ইন্টারনেটে আপলোডের গতি বাড়ানোর ৭ উপায়

  4. কিভাবে ইন্টারনেট থেকে ব্যক্তিগত তথ্য সরাতে হয়