TCP Socket Programming (TCP Socket Programming)

Computer Programming - ইউনিক্স সকেট (Unix Socket)
259
259

TCP Socket Programming হলো TCP (Transmission Control Protocol) প্রোটোকল ব্যবহার করে ক্লায়েন্ট এবং সার্ভারের মধ্যে নির্ভরযোগ্য সংযোগ এবং ডেটা ট্রান্সফার স্থাপন করার একটি পদ্ধতি। TCP একটি কানেকশন-অরিয়েন্টেড প্রোটোকল, যা নির্ভরযোগ্য এবং অর্ডারড ডেটা ট্রান্সমিশন নিশ্চিত করে। TCP Socket Programming ক্লায়েন্ট এবং সার্ভার মডেলে কাজ করে, যেখানে সার্ভার একটি নির্দিষ্ট পোর্টে সংযোগের জন্য অপেক্ষা করে এবং ক্লায়েন্ট সেই সার্ভারের সাথে সংযোগ স্থাপন করে ডেটা আদান-প্রদান করে।

TCP Socket Programming এর মূল উপাদানসমূহ

TCP Socket Programming-এর মাধ্যমে ক্লায়েন্ট এবং সার্ভারের মধ্যে সফলভাবে যোগাযোগ স্থাপন করার জন্য কয়েকটি System Call এবং ফাংশন ব্যবহার করা হয়। নিচে প্রতিটি System Call এবং তাদের ভূমিকা ব্যাখ্যা করা হয়েছে:

socket():

  • একটি নতুন TCP Socket তৈরি করার জন্য ব্যবহৃত হয়।
  • Syntax: int socket(int domain, int type, int protocol);
  • উদাহরণ:
int sockfd = socket(AF_INET, SOCK_STREAM, 0);

bind() (সার্ভারের ক্ষেত্রে):

  • একটি Socket-কে নির্দিষ্ট IP Address এবং Port Number-এর সাথে সংযুক্ত করার জন্য ব্যবহৃত হয়।
  • Syntax: int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • উদাহরণ:
bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));

listen() (সার্ভারের ক্ষেত্রে):

  • ইনকামিং সংযোগের জন্য সার্ভারকে অপেক্ষা করার জন্য প্রস্তুত করে।
  • Syntax: int listen(int sockfd, int backlog);
  • উদাহরণ:
listen(sockfd, 5);

accept() (সার্ভারের ক্ষেত্রে):

  • ইনকামিং সংযোগ গ্রহণ করার জন্য ব্যবহৃত হয় এবং একটি নতুন Socket তৈরি করে।
  • Syntax: int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • উদাহরণ:
int new_sockfd = accept(sockfd, (struct sockaddr*)&client_addr, &addr_size);

connect() (ক্লায়েন্টের ক্ষেত্রে):

  • ক্লায়েন্ট Socket-কে সার্ভারের সাথে সংযোগ স্থাপন করার জন্য ব্যবহৃত হয়।
  • Syntax: int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • উদাহরণ:
connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));

send() এবং recv():

  • send() ফাংশন ডেটা পাঠানোর জন্য এবং recv() ফাংশন ডেটা গ্রহণ করার জন্য ব্যবহৃত হয়।
  • Syntax:
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);

close():

  • সংযোগ বন্ধ করার জন্য ব্যবহৃত হয়।
Syntax: int close(int sockfd);

common.content_added_by

TCP (Transmission Control Protocol) এর মৌলিক ধারণা

264
264

TCP (Transmission Control Protocol) হলো একটি কানেকশন-অরিয়েন্টেড প্রোটোকল, যা ইন্টারনেট বা অন্য কোনো নেটওয়ার্কে নির্ভরযোগ্য এবং অর্ডার মেইনটেনিং ডেটা ট্রান্সফার নিশ্চিত করে। এটি ইন্টারনেট প্রোটোকল স্যুটের অন্যতম প্রধান প্রোটোকল এবং TCP/IP স্ট্যাকের Transport Layer-এ কাজ করে। TCP মূলত ক্লায়েন্ট এবং সার্ভারের মধ্যে নির্ভরযোগ্য যোগাযোগ স্থাপন করে এবং ডেটা প্যাকেটগুলোকে সঠিক ক্রমানুসারে পৌঁছে দেয়।

TCP এর মৌলিক বৈশিষ্ট্যসমূহ

TCP-এর কিছু গুরুত্বপূর্ণ বৈশিষ্ট্য নিচে উল্লেখ করা হলো:

  1. Connection-Oriented Protocol:
    • TCP একটি কানেকশন-অরিয়েন্টেড প্রোটোকল, যা ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি স্থায়ী সংযোগ স্থাপন করে। এটি একটি Three-Way Handshake প্রক্রিয়ার মাধ্যমে সংযোগ স্থাপন করে এবং নিশ্চিত করে যে ডেটা আদান-প্রদান করার আগে উভয় পক্ষের মধ্যে একটি স্থিতিশীল যোগাযোগ ব্যবস্থা রয়েছে।
  2. Reliable Data Transfer:
    • TCP ডেটা ট্রান্সফারকে নির্ভরযোগ্য করে তোলে। এটি ডেটা প্যাকেটের গন্তব্যে পৌঁছানোর নিশ্চয়তা দেয়। যদি কোনো প্যাকেট হারিয়ে যায় বা ক্ষতিগ্রস্ত হয়, তাহলে TCP সেই প্যাকেট পুনরায় পাঠানোর ব্যবস্থা করে।
  3. Ordered Delivery:
    • TCP ডেটা প্যাকেটগুলিকে নির্দিষ্ট ক্রমানুসারে গন্তব্যে পৌঁছানোর নিশ্চয়তা দেয়। ডেটা প্যাকেটগুলো বিভক্ত হয়ে গেলেও TCP সেগুলো পুনরায় সঠিক ক্রমানুসারে সাজিয়ে দেয়।
  4. Error Detection and Recovery:
    • TCP ডেটা প্যাকেটের প্রতিটি সেগমেন্টে চেকসাম ব্যবহার করে ত্রুটি শনাক্ত করে। যদি কোনো ত্রুটি পাওয়া যায়, তাহলে সেই প্যাকেটটি পুনরায় পাঠানো হয়। এটি ডেটা ট্রান্সফারকে নির্ভরযোগ্য করে তোলে।
  5. Flow Control:
    • TCP ফ্লো কন্ট্রোল মেকানিজম ব্যবহার করে নিশ্চিত করে যে প্রেরকের গতি রিসিভারের গতি অতিক্রম না করে। এটি নিশ্চিত করে যে রিসিভার তার ক্যাপাসিটি অনুযায়ী ডেটা গ্রহণ করতে সক্ষম।
  6. Congestion Control:
    • TCP নেটওয়ার্কের অবস্থা পর্যবেক্ষণ করে এবং নেটওয়ার্কে যদি বেশি কনজেশন থাকে তবে তার গতি কমিয়ে দেয়। এটি নেটওয়ার্কের কার্যক্ষমতা এবং স্থিতিশীলতা বজায় রাখে।

TCP কিভাবে কাজ করে?

TCP-এর কাজের পদ্ধতিটি প্রধানত তিনটি ধাপে বিভক্ত: সংযোগ স্থাপন (Connection Establishment), ডেটা ট্রান্সফার (Data Transfer), এবং সংযোগ বন্ধ করা (Connection Termination)।

১. Connection Establishment (Three-Way Handshake)

TCP সংযোগ স্থাপন করার সময় একটি Three-Way Handshake প্রক্রিয়া অনুসরণ করে। এতে তিনটি ধাপ থাকে:

  1. SYN: ক্লায়েন্ট প্রথমে সার্ভারের কাছে একটি SYN (synchronize) প্যাকেট পাঠায়, যা সংযোগ স্থাপনের অনুরোধ করে।
  2. SYN-ACK: সার্ভার সেই SYN প্যাকেট গ্রহণ করে এবং ক্লায়েন্টের কাছে একটি SYN-ACK প্যাকেট পাঠায়, যা সার্ভার থেকে সংযোগ স্থাপনের সম্মতি নির্দেশ করে।
  3. ACK: ক্লায়েন্ট এই SYN-ACK প্যাকেট গ্রহণ করে এবং সার্ভারের কাছে একটি ACK (acknowledgment) প্যাকেট পাঠায়, যা সংযোগ স্থাপন সম্পন্ন করে।

এই প্রক্রিয়া সম্পন্ন হলে, ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি স্থায়ী সংযোগ তৈরি হয় এবং তারা ডেটা ট্রান্সফারের জন্য প্রস্তুত থাকে।

২. Data Transfer

TCP ডেটা প্যাকেটগুলোকে ছোট ছোট সেগমেন্টে ভাগ করে এবং সেগুলোকে সঠিক ক্রমানুসারে ট্রান্সমিট করে। প্রতিটি সেগমেন্টে একটি চেকসাম এবং সিকোয়েন্স নম্বর থাকে, যা ত্রুটি শনাক্তকরণ এবং সঠিক ক্রম নিশ্চিত করে।

  • Acknowledgment: প্রতিটি সেগমেন্ট সঠিকভাবে পৌঁছালে রিসিভার একটি ACK প্যাকেট পাঠায়, যা প্রেরককে জানায় যে সেগমেন্টটি সঠিকভাবে গ্রহণ করা হয়েছে।
  • Retransmission: যদি কোনো সেগমেন্ট হারিয়ে যায় বা ত্রুটিযুক্ত হয়, TCP সেই সেগমেন্টটি পুনরায় পাঠায়।

৩. Connection Termination

TCP সংযোগ বন্ধ করতে Four-Way Handshake পদ্ধতি অনুসরণ করে:

  1. ক্লায়েন্ট একটি FIN (finish) প্যাকেট পাঠায়, যা সার্ভারকে জানায় যে সে সংযোগ বন্ধ করতে চায়।
  2. সার্ভার ACK প্যাকেট পাঠিয়ে সেই FIN প্যাকেটের গ্রহণ নিশ্চিত করে।
  3. এরপর, সার্ভারও একটি FIN প্যাকেট পাঠায়, যা জানায় যে সে সংযোগ বন্ধ করতে প্রস্তুত।
  4. ক্লায়েন্ট একটি শেষ ACK প্যাকেট পাঠিয়ে সংযোগ সম্পূর্ণরূপে বন্ধ করে।

TCP এর ব্যবহার

TCP বিভিন্ন নেটওয়ার্ক ভিত্তিক অ্যাপ্লিকেশন এবং পরিষেবায় ব্যবহৃত হয়, যেমন:

  • HTTP/HTTPS: ওয়েব ব্রাউজার এবং ওয়েব সার্ভারের মধ্যে ডেটা ট্রান্সফারের জন্য TCP ব্যবহার করা হয়।
  • FTP (File Transfer Protocol): ফাইল ট্রান্সফার করার সময় TCP ব্যবহার করে নির্ভরযোগ্য এবং নিরাপদ যোগাযোগ নিশ্চিত করা হয়।
  • SMTP (Simple Mail Transfer Protocol): ইমেইল পরিষেবার ক্ষেত্রে TCP ব্যবহার করা হয়।
  • SSH (Secure Shell): নিরাপদভাবে দূরবর্তী সার্ভারে সংযোগ স্থাপন করতে TCP ব্যবহার করা হয়।

TCP এবং UDP এর তুলনা

TCP এবং UDP (User Datagram Protocol) উভয়ই Transport Layer প্রোটোকল, তবে এদের মধ্যে কয়েকটি গুরুত্বপূর্ণ পার্থক্য রয়েছে:

বৈশিষ্ট্যTCPUDP
প্রোটোকল ধরণConnection-orientedConnectionless
নির্ভরযোগ্যতানির্ভরযোগ্য (Reliable)নির্ভরযোগ্য নয় (Unreliable)
ডেটা অর্ডারঅর্ডার মেইনটেন করেঅর্ডার মেইনটেন করে না
ফ্লো কন্ট্রোলফ্লো কন্ট্রোল ব্যবহার করেফ্লো কন্ট্রোল ব্যবহার করে না
উদাহরণHTTP, FTP, SMTP, SSHDNS, DHCP, VoIP, Online Gaming
স্পিডতুলনামূলকভাবে ধীর (নির্ভরযোগ্যতার জন্য)দ্রুত (কানেকশনলেস)
common.content_added_by

TCP Socket Connection Establishment: Three-Way Handshake

276
276

TCP (Transmission Control Protocol) একটি Three-Way Handshake প্রক্রিয়ার মাধ্যমে ক্লায়েন্ট এবং সার্ভারের মধ্যে সংযোগ স্থাপন করে। এটি একটি কানেকশন-অরিয়েন্টেড প্রোটোকল, যা ক্লায়েন্ট এবং সার্ভারের মধ্যে নির্ভরযোগ্য যোগাযোগ স্থাপন করতে এবং ডেটা ট্রান্সফার শুরু করার আগে উভয় পক্ষের মধ্যে সমঝোতা নিশ্চিত করতে ব্যবহৃত হয়। Three-Way Handshake একটি স্থায়ী এবং নির্ভরযোগ্য সংযোগ তৈরি করার জন্য তিনটি ধাপে সম্পন্ন হয়।

Three-Way Handshake এর ধাপসমূহ

Three-Way Handshake প্রক্রিয়াটি তিনটি প্রধান ধাপের মাধ্যমে সম্পন্ন হয়:

  1. SYN (Synchronize)
  2. SYN-ACK (Synchronize-Acknowledgment)
  3. ACK (Acknowledgment)

ধাপ ১: SYN (Synchronize)

  • ক্লায়েন্ট → সার্ভার: ক্লায়েন্ট প্রথমে সার্ভারের কাছে একটি SYN প্যাকেট পাঠায়, যা সংযোগ স্থাপনের জন্য একটি অনুরোধ।
  • Sequence Number: ক্লায়েন্ট এই SYN প্যাকেটের সাথে একটি Initial Sequence Number (ISN) সংযুক্ত করে, যা ডেটা ট্রান্সফারের সিকোয়েন্সের প্রথম নম্বর হিসেবে ব্যবহৃত হয়।
  • কাজ: এই ধাপে, ক্লায়েন্ট মূলত সার্ভারকে জানায় যে সে সংযোগ স্থাপন করতে চায়।

উদাহরণ:

  • ক্লায়েন্ট একটি SYN প্যাকেট পাঠায়, যার Sequence Number হতে পারে X

ধাপ ২: SYN-ACK (Synchronize-Acknowledgment)

  • সার্ভার → ক্লায়েন্ট: সার্ভার ক্লায়েন্টের SYN প্যাকেট গ্রহণ করার পর, সার্ভার তার স্বীকৃতি জানিয়ে একটি SYN-ACK প্যাকেট পাঠায়।
  • SYN: সার্ভারও তার Initial Sequence Number (ISN) ক্লায়েন্টকে জানাতে SYN অংশ পাঠায়।
  • ACK: সার্ভার ক্লায়েন্টের পাঠানো Sequence Number-এর ACK হিসাবে (X+1) পাঠায়, যা নির্দেশ করে যে ক্লায়েন্টের SYN প্যাকেটটি সফলভাবে গ্রহণ করা হয়েছে।
  • কাজ: এই ধাপে, সার্ভার নিশ্চিত করে যে ক্লায়েন্টের কাছ থেকে SYN প্যাকেটটি ঠিকঠাক পেয়েছে এবং সে-ও সংযোগ স্থাপনে প্রস্তুত।

উদাহরণ:

  • সার্ভার একটি SYN-ACK প্যাকেট পাঠায়, যেখানে সার্ভারের Sequence Number হতে পারে Y এবং ক্লায়েন্টের ACK হিসাবে (X+1)

ধাপ ৩: ACK (Acknowledgment)

  • ক্লায়েন্ট → সার্ভার: ক্লায়েন্ট সার্ভারের SYN-ACK প্যাকেট গ্রহণ করার পর, ক্লায়েন্ট একটি ACK প্যাকেট পাঠায়।
  • ACK: এই ACK প্যাকেটে ক্লায়েন্ট সার্ভারের Sequence Number-এর ACK হিসাবে (Y+1) পাঠায়, যা নিশ্চিত করে যে সার্ভারের SYN-ACK প্যাকেট সফলভাবে গ্রহণ করা হয়েছে।
  • কাজ: এই ধাপে, ক্লায়েন্ট নিশ্চিত করে যে উভয় পক্ষই সংযোগ স্থাপনে প্রস্তুত এবং সংযোগ সম্পূর্ণরূপে স্থাপিত।

উদাহরণ:

  • ক্লায়েন্ট একটি ACK প্যাকেট পাঠায়, যার ACK Number (Y+1)

Three-Way Handshake প্রক্রিয়ার সংক্ষেপে:

ধাপপ্রেরকপ্রাপকপ্যাকেটের ধরনSequence/ACK Number
ক্লায়েন্টসার্ভারSYNSequence Number: X
সার্ভারক্লায়েন্টSYN-ACKSequence Number: Y, ACK: X+1
ক্লায়েন্টসার্ভারACKACK: Y+1

Three-Way Handshake এর গুরুত্ব

  • নির্ভরযোগ্যতা নিশ্চিতকরণ: Three-Way Handshake প্রক্রিয়া নিশ্চিত করে যে উভয় পক্ষই সংযোগ স্থাপনে সক্ষম এবং প্রস্তুত। এটি ডেটা ট্রান্সফারের আগে উভয় পক্ষের মধ্যে সমঝোতা নিশ্চিত করে।
  • ডেটা ট্রান্সফারের জন্য প্রস্তুতি: সংযোগ স্থাপনের পর TCP নিশ্চিত করে যে ডেটা প্যাকেটগুলো সঠিকভাবে অর্ডারে পৌঁছাবে এবং ত্রুটি চেকিং এবং পুনরায় পাঠানোর জন্য মেকানিজম প্রয়োগ করে।
  • Congestion Control: Three-Way Handshake প্রক্রিয়া নেটওয়ার্কের অবস্থা যাচাই করে এবং কনজেশন ম্যানেজমেন্টের মাধ্যমে ডেটা ট্রান্সফার নিয়ন্ত্রণ করে।

Three-Way Handshake এর উদাহরণ

নিচে একটি সাধারণ উদাহরণ দেওয়া হলো যেখানে TCP Three-Way Handshake প্রক্রিয়ার মাধ্যমে ক্লায়েন্ট এবং সার্ভারের মধ্যে সংযোগ স্থাপন করা হয়:

ধাপ ১: ক্লায়েন্ট একটি SYN প্যাকেট পাঠায়:

  • ক্লায়েন্ট সার্ভারের কাছে একটি SYN প্যাকেট পাঠায়, যেখানে Sequence Number 1000

ধাপ ২: সার্ভার একটি SYN-ACK প্যাকেট পাঠায়:

  • সার্ভার ক্লায়েন্টের SYN প্যাকেট গ্রহণ করে এবং ACK হিসাবে 1001 পাঠায় এবং নিজস্ব Sequence Number 2000 পাঠায়।

ধাপ ৩: ক্লায়েন্ট একটি ACK প্যাকেট পাঠায়:

  • ক্লায়েন্ট সার্ভারের SYN-ACK প্যাকেট গ্রহণ করে এবং ACK হিসাবে 2001 পাঠায়।

এই প্রক্রিয়া সম্পন্ন হওয়ার পর, ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি স্থায়ী সংযোগ তৈরি হয় এবং ডেটা ট্রান্সফারের জন্য তারা প্রস্তুত থাকে।

Three-Way Handshake এর সীমাবদ্ধতা

  • Slow Start: Three-Way Handshake প্রক্রিয়া কিছুটা সময় সাপেক্ষ, কারণ এটি তিনটি ধাপের মাধ্যমে সংযোগ স্থাপন করে। এটি কম লেটেন্সি নেটওয়ার্কে প্রায় অদৃশ্য হলেও, উচ্চ লেটেন্সি নেটওয়ার্কে সময় নিতে পারে।
  • Syn Flooding Attack: হ্যাকাররা সার্ভারকে SYN প্যাকেটের মাধ্যমে অতিরিক্ত ব্যস্ত করে রাখতে পারে, যাকে SYN Flooding Attack বলা হয়। এতে সার্ভার অনেক SYN প্যাকেট গ্রহণ করতে গিয়ে ওভারলোড হয়ে যেতে পারে এবং অন্যান্য সংযোগ গ্রহণ করতে অক্ষম হতে পারে। এই আক্রমণ প্রতিরোধের জন্য TCP SYN Cookies বা অন্যান্য নিরাপত্তা পদ্ধতি ব্যবহার করা হয়।
common.content_added_by

TCP Server এবং Client এর উদাহরণ

221
221

TCP Server এবং Client-এর উদাহরণ দেখানোর জন্য আমরা C ভাষায় একটি সহজ প্রোগ্রাম তৈরি করবো, যেখানে সার্ভার একটি নির্দিষ্ট পোর্টে অপেক্ষা করবে এবং ক্লায়েন্ট সেই পোর্টে সংযোগ স্থাপন করে ডেটা পাঠাবে ও গ্রহণ করবে।

TCP Server প্রোগ্রাম উদাহরণ (C ভাষায়)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
   int server_fd, new_socket;
   struct sockaddr_in address;
   int addrlen = sizeof(address);
   char buffer[1024] = {0};
   char *hello = "Hello from server";
   // 1. Socket তৈরি করা
   if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
       perror("Socket creation failed");
       exit(EXIT_FAILURE);
   }
   // 2. সার্ভার ঠিকানা সেটআপ করা
   address.sin_family = AF_INET;
   address.sin_addr.s_addr = INADDR_ANY;
   address.sin_port = htons(PORT);
   // 3. Binding করা
   if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) < 0) {
       perror("Bind failed");
       exit(EXIT_FAILURE);
   }
   // 4. Listening করা
   if (listen(server_fd, 3) < 0) {
       perror("Listen failed");
       exit(EXIT_FAILURE);
   }
   printf("Server is listening on port %d\n", PORT);
   // 5. Accepting সংযোগ
   if ((new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen)) < 0) {
       perror("Accept failed");
       exit(EXIT_FAILURE);
   }
   // 6. ডেটা গ্রহণ করা
   read(new_socket, buffer, 1024);
   printf("Client: %s\n", buffer);
   // 7. ডেটা পাঠানো
   send(new_socket, hello, strlen(hello), 0);
   printf("Hello message sent to client\n");
   // 8. Socket বন্ধ করা
   close(new_socket);
   close(server_fd);
   return 0;
}


TCP Client প্রোগ্রাম উদাহরণ (C ভাষায়)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
   int sock = 0;
   struct sockaddr_in serv_addr;
   char *hello = "Hello from client";
   char buffer[1024] = {0};
   // 1. Socket তৈরি করা
   if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
       printf("Socket creation failed\n");
       return -1;
   }
   // 2. সার্ভার ঠিকানা সেটআপ করা
   serv_addr.sin_family = AF_INET;
   serv_addr.sin_port = htons(PORT);
   // 3. IP Address সেট করা
   if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
       printf("Invalid address or Address not supported\n");
       return -1;
   }
   // 4. সার্ভারের সাথে সংযোগ স্থাপন করা
   if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) {
       printf("Connection Failed\n");
       return -1;
   }
   // 5. ডেটা পাঠানো
   send(sock, hello, strlen(hello), 0);
   printf("Hello message sent to server\n");
   // 6. ডেটা গ্রহণ করা
   read(sock, buffer, 1024);
   printf("Server: %s\n", buffer);
   // 7. Socket বন্ধ করা
   close(sock);
   return 0;
}
প্রোগ্রাম বিশ্লেষণ

সার্ভার প্রোগ্রাম:

Socket তৈরি:

  • socket() ফাংশন ব্যবহার করে TCP প্রোটোকল ব্যবহার করে সার্ভারের জন্য একটি Socket তৈরি করা হয়।

Binding:

  • bind() ফাংশন সার্ভারের Socket-কে নির্দিষ্ট IP Address (INADDR_ANY, যা সমস্ত নেটওয়ার্ক ইন্টারফেস নির্দেশ করে) এবং পোর্ট (8080) এর সাথে সংযুক্ত করে।

Listening:

  • listen() ফাংশন সার্ভারের Socket-কে ইনকামিং সংযোগ গ্রহণের জন্য অপেক্ষমাণ রাখে।

Accepting সংযোগ:

  • accept() ফাংশন একটি ইনকামিং সংযোগ গ্রহণ করে এবং নতুন Socket তৈরি করে, যা ক্লায়েন্টের সাথে ডেটা ট্রান্সফার করতে ব্যবহৃত হয়।

ডেটা গ্রহণ এবং পাঠানো:

  • read() ফাংশন ব্যবহার করে ক্লায়েন্ট থেকে ডেটা গ্রহণ করা হয়, এবং send() ফাংশন ব্যবহার করে ক্লায়েন্টে ডেটা পাঠানো হয়।

Socket বন্ধ করা:

  • close() ফাংশন ব্যবহার করে নতুন Socket এবং সার্ভার Socket বন্ধ করা হয়।

ক্লায়েন্ট প্রোগ্রাম:

Socket তৈরি:

  • socket() ফাংশন ব্যবহার করে TCP প্রোটোকল ব্যবহার করে ক্লায়েন্টের জন্য একটি Socket তৈরি করা হয়।

সার্ভারের ঠিকানা সেটআপ:

  • inet_pton() ফাংশন সার্ভারের IP Address (127.0.0.1, যা localhost নির্দেশ করে) এবং পোর্ট (8080) সেট করে।

সার্ভারের সাথে সংযোগ স্থাপন:

  • connect() ফাংশন ব্যবহার করে ক্লায়েন্ট সার্ভারের সাথে সংযোগ স্থাপন করে।

ডেটা পাঠানো এবং গ্রহণ:

  • send() ফাংশন ব্যবহার করে সার্ভারে ডেটা পাঠানো হয় এবং read() ফাংশন ব্যবহার করে সার্ভার থেকে ডেটা গ্রহণ করা হয়।

Socket বন্ধ করা:

  • close() ফাংশন ব্যবহার করে ক্লায়েন্টের Socket বন্ধ করা হয়।

কিভাবে এই প্রোগ্রামগুলো চালাবেন

প্রথমে সার্ভার প্রোগ্রাম চালু করুন:

  • সার্ভার একটি নির্দিষ্ট পোর্ট (এখানে 8080) এ ইনকামিং সংযোগের জন্য অপেক্ষা করবে।

এরপর ক্লায়েন্ট প্রোগ্রাম চালু করুন:

  • ক্লায়েন্ট প্রোগ্রাম সার্ভারের সাথে সংযোগ স্থাপন করবে এবং একটি বার্তা পাঠাবে।

ক্লায়েন্ট এবং সার্ভারের মধ্যে বার্তা আদান-প্রদান:

  • সার্ভার বার্তাটি গ্রহণ করে ক্লায়েন্টকে একটি বার্তা পাঠাবে। উভয় প্রোগ্রামে বার্তা প্রদর্শিত হবে।
common.content_added_by

Data Transmission এবং Connection Termination

245
245

TCP (Transmission Control Protocol) একটি নির্ভরযোগ্য কানেকশন-অরিয়েন্টেড প্রোটোকল, যা ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা ট্রান্সমিশন এবং সংযোগ বন্ধের (Connection Termination) জন্য নির্দিষ্ট প্রক্রিয়া অনুসরণ করে। TCP ডেটা প্যাকেট ট্রান্সমিশন এবং সংযোগ টার্মিনেশনের মাধ্যমে সংযোগ স্থায়ী ও কার্যকর রাখতে সহায়ক।

Data Transmission (ডেটা আদান-প্রদান)

TCP-তে ডেটা ট্রান্সফার করার সময় ডেটা প্যাকেটগুলোকে সঠিকভাবে ট্রান্সমিট এবং রিসিভ করা হয়। TCP ডেটা ট্রান্সমিশনের সময় নিচের কয়েকটি ধাপ অনুসরণ করে:

ডেটা প্যাকেট বিভাজন (Segmentation):

  • TCP বড় ডেটাকে ছোট ছোট অংশে (সেগমেন্টে) ভাগ করে, যাকে সেগমেন্টেশন বলা হয়। প্রতিটি সেগমেন্টে একটি Sequence Number এবং Checksum থাকে, যা ডেটা অর্ডার এবং ত্রুটি শনাক্ত করতে ব্যবহৃত হয়।

Sequence Number এবং Acknowledgment:

  • প্রতিটি সেগমেন্টে একটি Sequence Number থাকে, যা সেগমেন্টের অর্ডার নির্দেশ করে। রিসিভার প্রতিটি সেগমেন্ট সঠিকভাবে পেলে, সে ACK (Acknowledgment) পাঠায়। এই ACK প্যাকেটটিতে Sequence Number এর ভিত্তিতে অনুমোদন থাকে, যা প্রেরককে জানায় যে ডেটা সঠিকভাবে পৌঁছেছে।

Error Detection এবং Retransmission:

  • TCP প্রতিটি সেগমেন্টে Checksum ব্যবহার করে ত্রুটি চেক করে। যদি কোনো সেগমেন্টে ত্রুটি পাওয়া যায় বা সেটি হারিয়ে যায়, তাহলে রিসিভার ACK পাঠায় না, যা প্রেরককে জানায় যে সেগমেন্টটি পুনরায় পাঠাতে হবে।

Congestion Control এবং Flow Control:

  • TCP ফ্লো কন্ট্রোল ব্যবহার করে নিশ্চিত করে যে রিসিভার তার ক্যাপাসিটি অনুযায়ী ডেটা গ্রহণ করতে সক্ষম। TCP Sliding Window মেকানিজম ব্যবহার করে রিসিভারের ক্ষমতা অনুযায়ী ডেটা পাঠায়।
  • TCP কনজেশন কন্ট্রোল প্রক্রিয়ার মাধ্যমে নেটওয়ার্কের অবস্থা পর্যবেক্ষণ করে এবং যদি কনজেশন (যানজট) হয়, তাহলে ডেটা ট্রান্সমিশনের গতি কমিয়ে দেয়।

Data Transmission উদাহরণ

ধরা যাক, ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা ট্রান্সমিশন হচ্ছে:

  1. ক্লায়েন্ট একটি ডেটা প্যাকেট পাঠায়, যার Sequence Number 1001
  2. সার্ভার সেই প্যাকেট গ্রহণ করে এবং ACK পাঠায়, যেখানে ACK Number 1002 থাকে।
  3. পরবর্তী প্যাকেট পাঠানোর পরেও একই প্রক্রিয়া অনুসরণ করা হয়। যদি কোনো প্যাকেট হারিয়ে যায়, তাহলে TCP সেই প্যাকেট পুনরায় পাঠায়।

Connection Termination (সংযোগ বন্ধ করা)

TCP একটি Four-Way Handshake পদ্ধতি ব্যবহার করে সংযোগ বন্ধ করে। এটি সংযোগ স্থাপন করার মতোই একটি প্রক্রিয়া, যা ক্লায়েন্ট এবং সার্ভার উভয়ের মধ্যে সম্মতিপূর্ণ সংযোগ সমাপ্তি নিশ্চিত করে।

Four-Way Handshake এর ধাপসমূহ

  1. FIN (Finish):
    • ক্লায়েন্ট বা সার্ভার সংযোগ বন্ধ করতে চাইলে, সে একটি FIN প্যাকেট পাঠায়, যা অপর পক্ষকে জানায় যে সে আর ডেটা পাঠাতে চায় না।
  2. ACK (Acknowledgment):
    • অপর পক্ষ FIN প্যাকেট গ্রহণ করার পর, একটি ACK প্যাকেট পাঠায়, যা জানায় যে সে FIN প্যাকেটটি গ্রহণ করেছে।
  3. FIN (Finish):
    • এবার অপর পক্ষও একটি FIN প্যাকেট পাঠায়, যা নির্দেশ করে যে সে সংযোগ বন্ধ করতে প্রস্তুত।
  4. ACK (Acknowledgment):
    • প্রথম পক্ষ সেই FIN প্যাকেট গ্রহণ করার পর একটি ACK পাঠায়, যা শেষ ACK হিসেবে কাজ করে এবং সংযোগ পুরোপুরি বন্ধ হয়ে যায়।

Four-Way Handshake উদাহরণ

ধরা যাক, ক্লায়েন্ট সংযোগ বন্ধ করতে চায়:

  1. ধাপ ১: ক্লায়েন্ট একটি FIN প্যাকেট পাঠায়।
  2. ধাপ ২: সার্ভার সেই FIN প্যাকেট গ্রহণ করে এবং একটি ACK পাঠায়।
  3. ধাপ ৩: সার্ভার এরপর একটি FIN প্যাকেট পাঠায়।
  4. ধাপ ৪: ক্লায়েন্ট সেই FIN প্যাকেট গ্রহণ করে এবং একটি ACK পাঠায়। এর মাধ্যমে সংযোগ সম্পূর্ণরূপে বন্ধ হয়ে যায়।

Connection Termination এর গুরুত্ব

  • অর্ডারলি Termination: TCP একটি ধারাবাহিক এবং সঠিক প্রক্রিয়ার মাধ্যমে সংযোগ বন্ধ নিশ্চিত করে, যা উভয় পক্ষের সম্মতি প্রয়োজন।
  • রিসোর্স মুক্ত করা: সংযোগ বন্ধ হলে TCP সংশ্লিষ্ট সকল রিসোর্স মুক্ত করে দেয়, যেমন Socket, ব্যাফার ইত্যাদি।
  • ন্যায়সঙ্গত ফ্লো কন্ট্রোল: TCP নিশ্চিত করে যে সংযোগ বন্ধের আগে কোনো ডেটা হারিয়ে না যায়।

Connection Termination এর সীমাবদ্ধতা

  • TIME_WAIT অবস্থা: সংযোগ বন্ধ হওয়ার পর TCP ক্লায়েন্ট বা সার্ভারকে একটি TIME_WAIT অবস্থায় রাখে, যাতে পুনরায় কোনো ভুল ACK প্যাকেট না আসে। এটি কিছু সময় নেয় এবং রিসোর্সের ওপর কিছুটা চাপ সৃষ্টি করতে পারে।
  • আক্রমণ ঝুঁকি: ক্লায়েন্ট বা সার্ভারের FIN প্যাকেটগুলির ওপর ভিত্তি করে ডিডস (DDoS) বা SYN Flooding-এর মতো আক্রমণ ঘটতে পারে, যা TCP সংযোগকে ক্ষতিগ্রস্ত করতে পারে।
common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion