পাঠ ২২ · ৫৭-এর মধ্যে · মডিউল ৫
Home / Courses / Computer Networks / ট্রান্সপোর্ট লেয়ার

ট্রান্সপোর্ট লেয়ার পরিচিতি — পোর্ট ও মাল্টিপ্লেক্সিং

Transport layer intro — ports & multiplexing
৭ মিনিট পড়া মধ্যবর্তী · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • নেটওয়ার্ক লেয়ার বনাম ট্রান্সপোর্ট লেয়ারের দায়িত্বের পার্থক্য
  • পোর্ট নাম্বারের তিনটি রেঞ্জ ও তাদের ব্যবহারিক অর্থ
  • ৫-টাপল দিয়ে একাধিক সমান্তরাল সংযোগ কীভাবে আলাদা রাখা হয়
  • 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-তে একাধিক আলাদা সংযোগ (যেমন একই সাইটের দুটি ব্রাউজার ট্যাব) সহজেই আলাদা রাখা যায় — শুধু সোর্স পোর্ট আলাদা হলেই যথেষ্ট।

Python
# ট্রান্সপোর্ট লেয়ার ডিমাল্টিপ্লেক্সিং সিমুলেশন — টয় ইন-মেমরি ডেটা, কোনো প্রকৃত সকেট/নেটওয়ার্ক নয়

# 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 তাদের আলাদা রাখতে পারছে।")

    
নেটওয়ার্ক ইন্টারফেস (এক IP) পোর্ট ৫১০০০ — ব্রাউজার ট্যাব-১ পোর্ট ৫৩ — DNS পোর্ট ৫১০০২ — ব্রাউজার ট্যাব-২
একই হোস্টের একই IP-তে আগত প্যাকেটকে ৫-টাপল দেখে সঠিক অ্যাপ্লিকেশন/সংযোগে ডিমাল্টিপ্লেক্স করা হয়।
সোর্স পোর্ট সাধারণত ক্লায়েন্ট নিজে বেছে নেয় (dynamic/ephemeral রেঞ্জ থেকে), আর ডেস্টিনেশন পোর্ট হয় সেই well-known সার্ভিস পোর্ট যেটির সাথে সংযোগ করা হচ্ছে। M5-এর পরের পাঠগুলোতে (L23-27) আমরা দেখব UDP ও TCP এই পোর্ট-ভিত্তিক কাঠামোর উপর কীভাবে তাদের নিজস্ব আচরণ (নির্ভরযোগ্যতা, ফ্লো কন্ট্রোল ইত্যাদি) তৈরি করে।
মূল কথা · Key takeaway

ট্রান্সপোর্ট লেয়ার নেটওয়ার্ক লেয়ারের "হোস্ট পর্যন্ত পৌঁছানো" গ্যারান্টিকে "প্রসেস পর্যন্ত পৌঁছানো"-তে রূপান্তরিত করে — আর ৫-টাপলই সেই যাদুকরী চাবি যা একই মেশিনে চলা হাজারো সমান্তরাল সংযোগকে বিভ্রান্তি ছাড়াই আলাদা রাখে।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ দুটি ব্রাউজার ট্যাব একই সময়ে একই ওয়েবসাইটে সংযুক্ত থাকলে তারা একে অপরের সাথে গুলিয়ে যায় না কেন?

কারণ প্রতিটি ট্যাবের সংযোগ একটি ভিন্ন সোর্স পোর্ট (dynamic/ephemeral রেঞ্জ থেকে) ব্যবহার করে — যদিও দুটি সংযোগেরই সোর্স IP, ডেস্টিনেশন IP ও ডেস্টিনেশন পোর্ট একই, ভিন্ন সোর্স পোর্টের কারণে সম্পূর্ণ ৫-টাপল আলাদা হয়ে যায়, তাই OS তাদের সম্পূর্ণ স্বতন্ত্র সংযোগ হিসেবে ট্র্যাক করতে পারে।

প্র ০২ Well-known পোর্ট (০-১০২৩) সংরক্ষিত রাখার সুবিধা কী?

এটি একটি সর্বজনীন প্রত্যাশা তৈরি করে — যে কেউ একটি সার্ভারে সংযোগ করতে চাইলে জানে HTTP মানেই ৮০, HTTPS মানেই ৪৪৩, DNS মানেই ৫৩, আলাদাভাবে জিজ্ঞেস না করেই। এই প্রত্যাশিত সামঞ্জস্যই ইন্টারনেট-স্কেলে ইন্টারঅপারেবিলিটি সম্ভব করে তোলে।

প্র ০৩ একটি প্যাকেট যদি এমন একটি ৫-টাপলে আসে যা সকেট টেবিলে নেই, তাহলে কী হওয়া উচিত বলে মনে হয়?

সাধারণত সেটি ড্রপ করা হয় (কোনো প্রক্রিয়া সেই সংযোগ প্রত্যাশা করছে না), আর TCP-এর ক্ষেত্রে OS সাধারণত একটি RST (reset) প্যাকেট ফেরত পাঠায় জানিয়ে দিতে যে সেই পোর্টে কেউ শুনছে না — এটিই একটি কারণ যে পোর্ট স্ক্যানিং দিয়ে বাইরে থেকে বোঝা যায় কোন পোর্ট "খোলা" (কেউ শুনছে) আর কোনটি "বন্ধ"।

অনুশীলন

  1. চিন্তা করুন: উপরের কোড সেলে socket_table-এ একটি নতুন এন্ট্রি যোগ করুন (ভিন্ন সোর্স পোর্ট, একই সার্ভার) এবং সেই ৫-টাপল মেলে এমন একটি নতুন প্যাকেট incoming_packets-এ যোগ করে Run চেপে দেখুন এটি সঠিক অ্যাপ্লিকেশনে ডিমাল্টিপ্লেক্স হয় কি না।

    নতুন এন্ট্রির ৫-টাপল ঠিক থাকলে এটি সঠিকভাবে মিলে যাবে ও তার নাম প্রিন্ট হবে; ৫-টাপলের যেকোনো একটি অংশ (এমনকি শুধু পোর্ট নাম্বার) ভুল হলেও demultiplex "কোনো মিল নেই" ফেরত দেবে — কারণ dict lookup-এর জন্য key-এর প্রতিটি অংশ হুবহু মিলতে হয়।

  2. পরীক্ষা করুন: incoming_packets-এ এমন একটি প্যাকেট যোগ করুন যার সোর্স পোর্ট সম্পূর্ণ ভিন্ন (যেমন ৯৯৯৯৯, একটি অস্তিত্বহীন এন্ট্রি) এবং দেখুন ফলাফলে কী প্রিন্ট হয়।

    সেটির জন্য "কোনো মিল নেই -> ড্রপ করা হবে" প্রিন্ট হবে, কারণ socket_table.get()-এ সেই exact ৫-টাপল কী হিসেবে নেই — বাস্তব জীবনে ঠিক এভাবেই একটি হোস্ট এমন প্যাকেট চিহ্নিত করে যেটি কোনো পরিচিত সংযোগের অংশ নয়।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

আগের পাঠ
L21 · NAT ও ICMP