পাঠ ৩২ · ৫৭-এর মধ্যে · মডিউল ৬

FTP ও ফাইল ট্রান্সফার

FTP & file transfer
৭ মিনিট পড়া মধ্যবর্তী · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

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

  • FTP-এর কন্ট্রোল ও ডেটা কানেকশন — দুইটি পৃথক TCP কানেকশনের নকশা কেন ও কীভাবে কাজ করে
  • Active বনাম Passive মোডের পার্থক্য এবং কেন Passive মোড ফায়ারওয়াল/NAT-এর সাথে ভালো কাজ করে
  • কেন আধুনিক যুগে FTP-কে SFTP/SCP ও HTTP-ভিত্তিক ট্রান্সফার দিয়ে প্রতিস্থাপন করা হচ্ছে
  • Python দিয়ে কন্ট্রোল/ডেটা কানেকশনের স্বাধীনতার একটি সিমুলেশন

১ · FTP কী ও দুই-কানেকশন মডেল

FTPFile Transfer Protocolনেটওয়ার্কের মাধ্যমে ফাইল আদান-প্রদানের অন্যতম প্রাচীনতম অ্যাপ্লিকেশন-লেয়ার প্রোটোকল, ১৯৭০-এর দশক থেকে ব্যবহৃত। হলো ফাইল স্থানান্তরের জন্য তৈরি সবচেয়ে পুরনো অ্যাপ্লিকেশন প্রোটোকলগুলোর একটি। এর নকশায় একটি অস্বাভাবিক বৈশিষ্ট্য আছে — এটি একটিমাত্র নয়, বরং দুইটি পৃথক TCP কানেকশন ব্যবহার করে —

কন্ট্রোল কানেকশনControl Connectionপোর্ট ২১-এ খোলা TCP কানেকশন, পুরো FTP সেশন জুড়ে সচল থাকে, শুধু কমান্ড ও রেসপন্স বহন করে।
পোর্ট ২১, সেশনের পুরোটা সময় খোলা থাকে, LIST/RETR/STOR-এর মতো কমান্ড বহন করে।
ডেটা কানেকশনData Connectionপ্রতিটি ফাইল স্থানান্তরের সময় নতুন করে খোলা হওয়া, এবং স্থানান্তর শেষ হলে বন্ধ হয়ে যাওয়া TCP কানেকশন — শুধু আসল ফাইল বাইট বহন করে।
প্রতিটি ফাইল স্থানান্তরের জন্য আলাদাভাবে খোলা হয়, আসল ফাইল বাইট বহন করে, স্থানান্তর শেষে বন্ধ হয়ে যায়।

বেশিরভাগ অ্যাপ্লিকেশন প্রোটোকল (যেমন HTTP, M6/L29) একটিমাত্র কানেকশনে কমান্ড ও ডেটা উভয়ই পাঠায় — FTP-এর এই দুই-কানেকশন নকশা তাই ব্যতিক্রমী। ঐতিহাসিকভাবে এটি ফায়ারওয়াল ও NAT-এর সাথে বাস্তবিক জটিলতা তৈরি করেছে, কারণ একটি ফায়ারওয়ালকে আলাদা করে ডেটা কানেকশনের জন্য ব্যবহৃত (প্রায়শই আগে থেকে জানা নয় এমন) পোর্টও অনুমতি দিতে হয় — এই জটিলতার প্রযুক্তিগত খুঁটিনাটি এই পাঠে বিস্তারিত না গিয়ে শুধু কারণ হিসেবে উল্লেখ করা হলো।

FTP ক্লায়েন্ট FTP সার্ভার কন্ট্রোল কানেকশন (পোর্ট ২১) — সবসময় খোলা ডেটা কানেকশন — প্রতি ফাইলে নতুন করে খোলে LIST / RETR / STOR কমান্ড প্রকৃত ফাইল বাইট
কন্ট্রোল কানেকশন সেশনজুড়ে খোলা থাকে, কিন্তু ডেটা কানেকশন প্রতিটি ফাইল স্থানান্তরের পর বন্ধ হয়ে যায় — কন্ট্রোল কানেকশন অক্ষত থেকে যায়।

২ · Active বনাম Passive মোড

Active ও Passive মোডের পার্থক্য শুধু একটি বিষয়ে — ডেটা কানেকশনটি কে শুরু করে —

  • Active মোড — সার্ভার নিজে ক্লায়েন্টের কাছে ফিরে এসে ডেটা কানেকশন শুরু করে। ক্লায়েন্ট-পাশের ফায়ারওয়াল প্রায়শই এই "ইনকামিং" কানেকশন ব্লক করে দেয়, কারণ ফায়ারওয়াল সাধারণত ক্লায়েন্ট নিজে যা শুরু করেনি এমন কানেকশন সন্দেহজনক মনে করে।
  • Passive মোড — ক্লায়েন্ট নিজেই উভয় কানেকশন (কন্ট্রোল ও ডেটা) শুরু করে। যেহেতু ক্লায়েন্টের ফায়ারওয়াল সাধারণত নিজের শুরু করা আউটগোয়িং কানেকশনে বাধা দেয় না, তাই Passive মোড ফায়ারওয়াল/NAT-এর সাথে অনেক বেশি সামঞ্জস্যপূর্ণ — এই কারণেই বেশিরভাগ আধুনিক FTP ক্লায়েন্ট ডিফল্টভাবে Passive মোড ব্যবহার করে।
মূল অন্তর্দৃষ্টি

"কে সংযোগ শুরু করে" — এই একটি প্রশ্নের উত্তরই Active ও Passive মোডের সম্পূর্ণ পার্থক্য নির্ধারণ করে। এই একই নীতি (ক্লায়েন্ট-উদ্যোগে আউটগোয়িং কানেকশন ফায়ারওয়াল-বান্ধব) পরবর্তীতে NAT (M4/L21) ও ফায়ারওয়াল ডিজাইনের (M10/L46) অনেক সিদ্ধান্তেও দেখা যাবে।

৩ · আধুনিক প্রেক্ষাপট — FTP-এর উত্তরসূরি

প্লেইন FTP কমান্ড, ইউজারনেম/পাসওয়ার্ড ও ফাইল ডেটা — সবকিছু আনএনক্রিপ্টেড পাঠায়, অর্থাৎ নেটওয়ার্কে কেউ আড়ি পাতলে সহজেই তা পড়তে পারবে। এই কারণে নিরাপত্তা-সংবেদনশীল যেকোনো ফাইল স্থানান্তরে আজ FTP-এর বদলে ব্যবহৃত হয় —

  • SFTP/SCPSSH-based File TransferSSH প্রোটোকলের উপর নির্মিত ফাইল ট্রান্সফার মেকানিজম — পুরো সেশন এনক্রিপ্টেড, একটিমাত্র কানেকশন ব্যবহার করে। — SSH-এর উপর চলে (নেটওয়ার্ক সিকিউরিটি, M10-এর সাথে সংযুক্ত), সম্পূর্ণ এনক্রিপ্টেড, একটিমাত্র কানেকশন ব্যবহার করে (FTP-এর দুই-কানেকশন জটিলতা নেই)।
  • HTTP-ভিত্তিক ফাইল ট্রান্সফার — আধুনিক ওয়েব অ্যাপ্লিকেশন ও ক্লাউড স্টোরেজ সাধারণত সাধারণ HTTPS আপলোড/ডাউনলোডেই ফাইল স্থানান্তর সারে, আলাদা প্রোটোকলের প্রয়োজন হয় না।

সংক্ষেপে — FTP আজও কিছু লিগ্যাসি সিস্টেমে টিকে আছে, কিন্তু নতুন কোনো সিস্টেম ডিজাইন করার সময় নিরাপত্তার কারণে সাধারণত SFTP বা HTTPS-ভিত্তিক সমাধানই বেছে নেওয়া হয়।

Python
# FTP-এর কন্ট্রোল ও ডেটা কানেকশনের স্বাধীনতার সিমুলেশন
# (কোনো real TCP কানেকশন খোলা হচ্ছে না — শুধু in-memory অবস্থা)

class FTPSession:
    def __init__(self, client_name):
        self.client_name = client_name
        self.control_channel = "OPEN (পোর্ট ২১)"
        self.data_channel = "CLOSED"
        self.log = []

    def send_command(self, cmd):
        if self.control_channel != "OPEN (পোর্ট ২১)":
            self.log.append(f"ত্রুটি: কন্ট্রোল চ্যানেল বন্ধ, '{cmd}' পাঠানো গেল না")
            return
        self.log.append(f"[control] {self.client_name} -> সার্ভার: {cmd}")

    def transfer_file(self, filename):
        self.data_channel = f"OPEN (ফাইল: {filename})"
        self.log.append(f"[data]    নতুন ডেটা কানেকশন খোলা হলো -> {filename} স্থানান্তর শুরু")
        self.log.append(f"[data]    {filename} সম্পূর্ণ স্থানান্তরিত হলো")
        self.data_channel = "CLOSED"
        self.log.append("[data]    ডেটা কানেকশন বন্ধ করা হলো")


session = FTPSession("client-1")
session.send_command("USER anonymous")
session.send_command("LIST")
session.transfer_file("report.pdf")
session.send_command("LIST")           # ডেটা কানেকশন বন্ধ হওয়ার পরও কন্ট্রোল কানেকশন কাজ করছে
session.transfer_file("photo.jpg")
session.send_command("QUIT")

for line in session.log:
    print(line)

print("\nকন্ট্রোল চ্যানেলের চূড়ান্ত অবস্থা:", session.control_channel)

    
লক্ষ্য করুন — ডেটা কানেকশন বন্ধ হওয়ার পরেও (প্রথম ফাইল স্থানান্তরের পর) কন্ট্রোল চ্যানেল দিয়ে LIST কমান্ড ঠিকই কাজ করেছে, এবং দ্বিতীয় ফাইলের জন্য একটি সম্পূর্ণ নতুন ডেটা কানেকশন খোলা হয়েছে। এটিই FTP-এর দুই-কানেকশন স্বাধীনতার মূল কথা।
মূল কথা · Key takeaway

FTP-এর দুই-কানেকশন নকশা ঐতিহাসিকভাবে গুরুত্বপূর্ণ হলেও আজকের বাস্তবতায় জটিলতা ও নিরাপত্তা-ঝুঁকির উৎস — তাই আধুনিক সিস্টেমে SFTP/SCP বা HTTPS-ভিত্তিক সমাধান এটিকে বহুলাংশে প্রতিস্থাপন করেছে।

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

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

প্র ০১ HTTP মাত্র একটি কানেকশন ব্যবহার করে সবকিছু (কমান্ড + ডেটা) পাঠায় — FTP কেন দুইটি আলাদা কানেকশন ব্যবহার করে?

FTP ডিজাইন করা হয়েছিল এমনভাবে যাতে বড় ফাইল স্থানান্তর চলাকালীনও ব্যবহারকারী একই সাথে কমান্ড পাঠাতে/দেখতে পারে (যেমন একটি ফাইল আপলোড হওয়ার মাঝেই LIST বা ABOR-এর মতো কমান্ড পাঠানো) — কন্ট্রোল ও ডেটাকে আলাদা কানেকশনে রাখলে একটি বড় ডেটা স্থানান্তর কন্ট্রোল বার্তা আদান-প্রদানকে ব্লক করে না। বাস্তবে এই সুবিধার তুলনায় ফায়ারওয়াল/NAT জটিলতার খরচ বেশি প্রমাণিত হয়েছে, যে কারণে আধুনিক প্রোটোকলগুলো এই নকশা এড়িয়ে চলে।

প্র ০২ Passive মোড কেন Active মোডের চেয়ে ফায়ারওয়ালের সাথে বেশি সামঞ্জস্যপূর্ণ?

Active মোডে সার্ভার নিজে ক্লায়েন্টের দিকে একটি নতুন কানেকশন শুরু করে — বেশিরভাগ ফায়ারওয়াল ডিফল্টভাবে এমন "আনসলিসিটেড ইনকামিং" কানেকশন ব্লক করে। Passive মোডে ক্লায়েন্ট নিজেই উভয় কানেকশন শুরু করে — যেহেতু এগুলো ক্লায়েন্টের নিজের শুরু করা আউটগোয়িং কানেকশন, ফায়ারওয়াল সাধারণত এগুলোকে অনুমতি দেয় বিনা বাধায়।

প্র ০৩ একটি প্রতিষ্ঠান আজ কেন নতুন সিস্টেমে প্লেইন FTP-এর বদলে SFTP বেছে নেবে?

প্লেইন FTP ইউজারনেম, পাসওয়ার্ড ও ফাইল ডেটা — সবকিছু আনএনক্রিপ্টেড পাঠায়, অর্থাৎ নেটওয়ার্কে আড়ি পাতা কেউ সহজেই ক্রেডেনশিয়াল ও কনটেন্ট দুটোই পড়তে পারবে। SFTP SSH-এর উপর চলে, তাই পুরো সেশন এনক্রিপ্টেড এবং একটিমাত্র কানেকশন ব্যবহার করে — নিরাপত্তা ও ফায়ারওয়াল-সামঞ্জস্য উভয় দিক থেকেই এটি স্পষ্টভাবে ভালো পছন্দ।

অনুশীলন

  1. চিন্তা করুন: কেন একটি একক দীর্ঘস্থায়ী ফাইল আপলোডের মাঝে যদি ডেটা কানেকশন হঠাৎ বিচ্ছিন্ন হয়ে যায়, কন্ট্রোল কানেকশন সাথে সাথে বন্ধ হয়ে যাওয়ার দরকার নেই — এই ডিজাইন সিদ্ধান্তের ব্যবহারিক সুবিধা কী?

    ডেটা কানেকশন বিচ্ছিন্ন হয়ে গেলেও কন্ট্রোল কানেকশন সচল থাকায় ক্লায়েন্ট আবার নতুন করে সম্পূর্ণ লগইন/সেশন প্রতিষ্ঠা না করেই শুধু ব্যর্থ ফাইলটির জন্য একটি নতুন ডেটা কানেকশন খুলে পুনরায় চেষ্টা করতে পারে — এতে সময় ও ওভারহেড দুটোই বাঁচে।

  2. পরীক্ষা করুন: উপরের কোড সেলে session.transfer_file(...)-কে পরপর তিনবার ভিন্ন ফাইলনামে কল করে দেখুন প্রতিবার ডেটা কানেকশন সঠিকভাবে খোলে ও বন্ধ হয় কি না, এবং কন্ট্রোল চ্যানেল পুরো সময় OPEN থাকে কি না।

    হ্যাঁ — প্রতিটি transfer_file কলে data_channel "OPEN" হয়ে আবার "CLOSED"-এ ফিরে আসবে, কিন্তু control_channel সবসময় "OPEN (পোর্ট ২১)"-ই থাকবে, কারণ কোনো মেথডই সেটিকে পরিবর্তন করছে না — এটিই কোডে দুই কানেকশনের স্বাধীনতা বাস্তবায়নের উপায়।

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

আগের পাঠ
ইমেইল প্রোটোকল — SMTP, POP3, IMAP