ট্রান্সপোর্ট লেয়ার পরিচিতি — পোর্ট ও মাল্টিপ্লেক্সিং
এই পাঠে যা শিখবেন
- নেটওয়ার্ক লেয়ার বনাম ট্রান্সপোর্ট লেয়ারের দায়িত্বের পার্থক্য
- পোর্ট নাম্বারের তিনটি রেঞ্জ ও তাদের ব্যবহারিক অর্থ
- ৫-টাপল দিয়ে একাধিক সমান্তরাল সংযোগ কীভাবে আলাদা রাখা হয়
- Python দিয়ে একটি ডিমাল্টিপ্লেক্সিং সিমুলেশন
১ · হোস্ট পর্যন্ত পৌঁছানো যথেষ্ট নয়
M4-এ আমরা দেখেছি নেটওয়ার্ক লেয়ারNetwork LayerIP অ্যাড্রেসিং ও রাউটিং ব্যবহার করে একটি প্যাকেটকে সোর্স হোস্ট থেকে ডেস্টিনেশন হোস্ট পর্যন্ত পৌঁছে দেয় (M4/L14, L17)। কীভাবে একটি প্যাকেটকে সঠিক হোস্ট পর্যন্ত পৌঁছায় (IP অ্যাড্রেসিং ও রাউটিং দিয়ে)। কিন্তু একটি কম্পিউটারে একই সময়ে ব্রাউজার, ইমেইল ক্লায়েন্ট, গেম, মিউজিক প্লেয়ার — সবাই একসাথে নেটওয়ার্ক ব্যবহার করতে পারে। প্যাকেট হোস্টে পৌঁছালেও, সেটি ঠিক কোন প্রসেস/অ্যাপ্লিকেশনের জন্য তা জানা দরকার। এটিই ট্রান্সপোর্ট লেয়ারTransport LayerOSI/TCP-IP মডেলের সেই স্তর যা হোস্টের মধ্যে সঠিক প্রসেস পর্যন্ত ডেটা পৌঁছে দেয়, পোর্ট নাম্বার ব্যবহার করে (TCP ও UDP এখানেই বাস করে)।-এর মূল দায়িত্ব।
নেটওয়ার্ক লেয়ার = host-to-host ডেলিভারি (IP অ্যাড্রেস ব্যবহার করে)। ট্রান্সপোর্ট লেয়ার = process-to-process ডেলিভারি (পোর্ট নাম্বার ব্যবহার করে)। M5-এর বাকি পাঠগুলোতে আমরা দেখব TCP ও UDP — এই স্তরের দুটি প্রধান প্রোটোকল — এই দায়িত্ব ঠিক কীভাবে পালন করে।
২ · পোর্ট নাম্বার — তিনটি রেঞ্জ
একটি পোর্ট নাম্বার ১৬-বিটের একটি সংখ্যা (০ থেকে ৬৫৫৩৫, মোট ৬৫৫৩৬টি সম্ভাব্য মান)। এগুলোকে তিনটি রেঞ্জে ভাগ করা হয় —
- Well-known ports (০-১০২৩) — স্ট্যান্ডার্ড সার্ভিসের জন্য সংরক্ষিত, যেমন ৮০ = HTTP, ৪৪৩ = HTTPS, ৫৩ = DNS, ২২ = SSH (M6-এ বিস্তারিত দেখব)।
- Registered ports (১০২৪-৪৯১৫১) — নির্দিষ্ট সফটওয়্যার/সার্ভিসের জন্য নিবন্ধিত, কিন্তু OS-স্তরে বিশেষ সুবিধাপ্রাপ্ত নয়।
- Dynamic/ephemeral ports (৪৯১৫২-৬৫৫৩৫) — সাধারণত একটি ক্লায়েন্টের সাময়িক সোর্স পোর্ট হিসেবে ব্যবহৃত হয় যখন এটি বাইরের কোনো সংযোগ শুরু করে (যেমন আপনার ব্রাউজার প্রতিটি নতুন ট্যাবের জন্য একটি নতুন এফিমেরাল পোর্ট নেয়)।
৩ · মাল্টিপ্লেক্সিং ও ডিমাল্টিপ্লেক্সিং
একটি হোস্ট একই IP অ্যাড্রেস দিয়ে বহু অ্যাপ্লিকেশন একসাথে চালাতে পারে — একে মাল্টিপ্লেক্সিং বলে (একাধিক অ্যাপ্লিকেশনের ডেটা একই নেটওয়ার্ক ইন্টারফেসের মধ্য দিয়ে পাঠানো)। উল্টো দিকে, আগত প্যাকেট ঠিক কোন অ্যাপ্লিকেশনের জন্য তা বের করাকে ডিমাল্টিপ্লেক্সিং বলে। এই কাজটি সম্ভব হয় একটি ৫-টাপল5-Tuple(source IP, source port, destination IP, destination port, protocol) — এই পাঁচটি মানের সমন্বয় প্রতিটি নেটওয়ার্ক সংযোগকে ইউনিকভাবে চিহ্নিত করে। দিয়ে — (source IP, source port, destination IP, destination port, protocol)। এই পাঁচটি মান একসাথে প্রতিটি সংযোগকে অনন্যভাবে চিহ্নিত করে, তাই একই ক্লায়েন্ট IP থেকে একই সার্ভার IP-তে একাধিক আলাদা সংযোগ (যেমন একই সাইটের দুটি ব্রাউজার ট্যাব) সহজেই আলাদা রাখা যায় — শুধু সোর্স পোর্ট আলাদা হলেই যথেষ্ট।
# ট্রান্সপোর্ট লেয়ার ডিমাল্টিপ্লেক্সিং সিমুলেশন — টয় ইন-মেমরি ডেটা, কোনো প্রকৃত সকেট/নেটওয়ার্ক নয়
# socket_table: ৫-টাপল -> কোন অ্যাপ্লিকেশন/সকেট সেটি ধারণ করছে
socket_table = {
("203.0.113.10", 51000, "93.184.216.34", 443, "TCP"): "ব্রাউজার ট্যাব-১ (HTTPS)",
("203.0.113.10", 51002, "93.184.216.34", 443, "TCP"): "ব্রাউজার ট্যাব-২ (HTTPS)",
("203.0.113.10", 51010, "8.8.8.8", 53, "UDP"): "DNS রিজলভার কুয়েরি",
}
def demultiplex(packet, socket_table):
key = (packet["src_ip"], packet["src_port"], packet["dst_ip"], packet["dst_port"], packet["protocol"])
return socket_table.get(key, "কোনো মিল নেই -> ড্রপ করা হবে")
incoming_packets = [
{"src_ip": "203.0.113.10", "src_port": 51000, "dst_ip": "93.184.216.34", "dst_port": 443, "protocol": "TCP"},
{"src_ip": "203.0.113.10", "src_port": 51002, "dst_ip": "93.184.216.34", "dst_port": 443, "protocol": "TCP"},
{"src_ip": "203.0.113.10", "src_port": 51010, "dst_ip": "8.8.8.8", "dst_port": 53, "protocol": "UDP"},
{"src_ip": "203.0.113.10", "src_port": 51099, "dst_ip": "93.184.216.34", "dst_port": 443, "protocol": "TCP"},
]
print("আগত প্যাকেট -> ডিমাল্টিপ্লেক্স করা অ্যাপ্লিকেশন:")
for pkt in incoming_packets:
app = demultiplex(pkt, socket_table)
tuple_str = f"({pkt['src_ip']}:{pkt['src_port']} -> {pkt['dst_ip']}:{pkt['dst_port']}, {pkt['protocol']})"
print(f" {tuple_str} => {app}")
print("\nলক্ষ্য করুন — ট্যাব-১ ও ট্যাব-২ একই সার্ভার IP:পোর্টে যাচ্ছে, শুধু সোর্স পোর্ট আলাদা হওয়াতেই OS তাদের আলাদা রাখতে পারছে।")
ট্রান্সপোর্ট লেয়ার নেটওয়ার্ক লেয়ারের "হোস্ট পর্যন্ত পৌঁছানো" গ্যারান্টিকে "প্রসেস পর্যন্ত পৌঁছানো"-তে রূপান্তরিত করে — আর ৫-টাপলই সেই যাদুকরী চাবি যা একই মেশিনে চলা হাজারো সমান্তরাল সংযোগকে বিভ্রান্তি ছাড়াই আলাদা রাখে।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।
প্র ০১ দুটি ব্রাউজার ট্যাব একই সময়ে একই ওয়েবসাইটে সংযুক্ত থাকলে তারা একে অপরের সাথে গুলিয়ে যায় না কেন?
কারণ প্রতিটি ট্যাবের সংযোগ একটি ভিন্ন সোর্স পোর্ট (dynamic/ephemeral রেঞ্জ থেকে) ব্যবহার করে — যদিও দুটি সংযোগেরই সোর্স IP, ডেস্টিনেশন IP ও ডেস্টিনেশন পোর্ট একই, ভিন্ন সোর্স পোর্টের কারণে সম্পূর্ণ ৫-টাপল আলাদা হয়ে যায়, তাই OS তাদের সম্পূর্ণ স্বতন্ত্র সংযোগ হিসেবে ট্র্যাক করতে পারে।
প্র ০২ Well-known পোর্ট (০-১০২৩) সংরক্ষিত রাখার সুবিধা কী?
এটি একটি সর্বজনীন প্রত্যাশা তৈরি করে — যে কেউ একটি সার্ভারে সংযোগ করতে চাইলে জানে HTTP মানেই ৮০, HTTPS মানেই ৪৪৩, DNS মানেই ৫৩, আলাদাভাবে জিজ্ঞেস না করেই। এই প্রত্যাশিত সামঞ্জস্যই ইন্টারনেট-স্কেলে ইন্টারঅপারেবিলিটি সম্ভব করে তোলে।
প্র ০৩ একটি প্যাকেট যদি এমন একটি ৫-টাপলে আসে যা সকেট টেবিলে নেই, তাহলে কী হওয়া উচিত বলে মনে হয়?
সাধারণত সেটি ড্রপ করা হয় (কোনো প্রক্রিয়া সেই সংযোগ প্রত্যাশা করছে না), আর TCP-এর ক্ষেত্রে OS সাধারণত একটি RST (reset) প্যাকেট ফেরত পাঠায় জানিয়ে দিতে যে সেই পোর্টে কেউ শুনছে না — এটিই একটি কারণ যে পোর্ট স্ক্যানিং দিয়ে বাইরে থেকে বোঝা যায় কোন পোর্ট "খোলা" (কেউ শুনছে) আর কোনটি "বন্ধ"।
অনুশীলন
-
চিন্তা করুন: উপরের কোড সেলে
socket_table-এ একটি নতুন এন্ট্রি যোগ করুন (ভিন্ন সোর্স পোর্ট, একই সার্ভার) এবং সেই ৫-টাপল মেলে এমন একটি নতুন প্যাকেটincoming_packets-এ যোগ করে Run চেপে দেখুন এটি সঠিক অ্যাপ্লিকেশনে ডিমাল্টিপ্লেক্স হয় কি না।নতুন এন্ট্রির ৫-টাপল ঠিক থাকলে এটি সঠিকভাবে মিলে যাবে ও তার নাম প্রিন্ট হবে; ৫-টাপলের যেকোনো একটি অংশ (এমনকি শুধু পোর্ট নাম্বার) ভুল হলেও
demultiplex"কোনো মিল নেই" ফেরত দেবে — কারণ dict lookup-এর জন্য key-এর প্রতিটি অংশ হুবহু মিলতে হয়। -
পরীক্ষা করুন:
incoming_packets-এ এমন একটি প্যাকেট যোগ করুন যার সোর্স পোর্ট সম্পূর্ণ ভিন্ন (যেমন ৯৯৯৯৯, একটি অস্তিত্বহীন এন্ট্রি) এবং দেখুন ফলাফলে কী প্রিন্ট হয়।সেটির জন্য "কোনো মিল নেই -> ড্রপ করা হবে" প্রিন্ট হবে, কারণ
socket_table.get()-এ সেই exact ৫-টাপল কী হিসেবে নেই — বাস্তব জীবনে ঠিক এভাবেই একটি হোস্ট এমন প্যাকেট চিহ্নিত করে যেটি কোনো পরিচিত সংযোগের অংশ নয়।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ পরবর্তী পাঠ — UDP, TCP, ফ্লো কন্ট্রোল ও কনজেশন কন্ট্রোল — এই মডিউলেই আসছে।
- Cloud Computing & DevOps কোর্স সঙ্গী কোর্স ক্লাউডে লোড ব্যালেন্সার কীভাবে পোর্ট-ভিত্তিক ট্রাফিক রুট করে তা শিখতে দেখুন।
- Cybersecurity & Ethical Hacking কোর্স সঙ্গী কোর্স পোর্ট স্ক্যানিং কীভাবে কাজ করে ও কেন এটি রিকনেসাঁর প্রথম ধাপ তা শিখতে দেখুন।
- সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity, Cloud Computing & DevOps ও Computer Networks — সব এক জায়গায়।