Course-এর সূচি

1.1

Client–Server Architecture ও Request–Response Cycle

কে চায়, কে দেয়, এবং একটি HTTP Request ও Response-এ ঠিক কী কী যায়।

30 মিনিট পড়া + Animation

টিপস: ডটেড-আন্ডারলাইন করা যেকোনো শব্দে ট্যাপ বা Hover করলে তার অর্থ দেখবে।

এই Lesson শেষে তুমি পারবে

  • Client–Server Model ব্যাখ্যা করতে: কথোপকথন কে শুরু করে, Data কার কাছে থাকে, আর কেন একে Centralized বলা হয়।
  • Request–Response Cycle-এর পাঁচটি ধাপ বর্ণনা করতে, একটি ক্লিক থেকে পর্দায় Page দেখানো পর্যন্ত।
  • একটি URL ভেঙে দেখাতে (Scheme, Host, Port, Path, Query, Fragment) এবং প্রতিটি অংশ কে ব্যবহার করে তা বলতে।
  • একটি Raw HTTP Request ও Response পড়তে: Request Line, Status Line, Header, ফাঁকা লাইন, Body।
  • সঠিক Method বেছে নিতে (GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS) এবং কোনগুলো Safe আর কোনগুলো Idempotent তা বলতে।
  • 1xx থেকে 5xx পর্যন্ত Status Code বুঝতে, বিশেষ করে Interview-তে প্রিয়গুলো: 201, 204, 304, 401 বনাম 403, 409, 429, 502, 503, 504।
  • Keep-alive, HTTP/1.1 বনাম HTTP/2 বনাম HTTP/3 ব্যাখ্যা করতে, এবং Client কীভাবে কোনো কাজ দুবার না করে Timeout ও Retry সামলাবে তা বলতে।

#Client–Server মানে কী

Client–Server Architecture হলো Web Networking-এর মূল ভিত্তি। এটি একটি Centralized (কেন্দ্রীয়) Model, যেখানে পুরো কাজের দায়িত্ব দুই ভাগে ভাগ করা থাকে:

  • Client: যে পক্ষ কোনো সেবা বা তথ্যের অনুরোধ করে। যেমন: তোমার Web Browser, Mobile App, Postman, curl Command।
  • Server: যে পক্ষ এক কেন্দ্রীয় জায়গায় সমস্ত Data, Logic ও Resource ধারণ করে এবং Client-এর অনুরোধ অনুযায়ী সেবা দেয়। যেমন: Nginx, Apache, Node.js/Express App, Spring Boot Server। Server আসলে কী (Machine, Program, Port), তা পরের Lesson-এ; আর Nginx, Apache ও App Server ভেতরে কীভাবে কাজ করে, তা Web Server ও App Server Lesson-এ।
  +-----------------+                          +-----------------+
  |                 | ──── 1. HTTP Request ──► |                 |
  |     Client      |                          |     Server      |
  |  (Browser/App)  | ◄─── 2. HTTP Response ── | (Node/Nginx/…)  |
  +-----------------+                          +-----------------+

সবসময় Client আগে কথা বলে। Server একটি জানা Address ও Port-এ (HTTPS-এর জন্য 443) অপেক্ষা করে, এবং শুধু উত্তর দেয়। Client-রা একে অপরের সাথে সরাসরি নয়, Server-এর মাধ্যমে কথা বলে, আর Database ছোঁয় শুধু Server।

Client ও Server: কে কার সাথে কথা বলে

প্রতিটি কথোপকথন শুরু করে Client। Server থাকে এক কেন্দ্রীয় জায়গায়, Data ও Logic তারই হাতে।

পরিস্থিতি

BrowserChromeGET /products
Mobile AppAndroid / iOS
Postman / curlDeveloper Tool
Home Router
ISP + Internetঅনেক Router
Server203.0.113.10:443
Database
ধাপ 1 / 8
1

তুমি একটি Link-এ ক্লিক করলে। Browser হলো Client: যে পক্ষ চায়। সাধারণ HTTP-তে Server কখনো নিজে থেকে Browser-এর সাথে যোগাযোগ শুরু করে না।

কেন এভাবে বানানো হয়?

  • সত্যের একটাই উৎস। Data ও Business Rule এক জায়গায় থাকে, তাই সব Client (Web, Android, iOS) একই জিনিস দেখে।
  • নিয়ন্ত্রণ ও নিরাপত্তা। কাজ করার আগে Server প্রতিটি Request যাচাই করে। Client হলো অন্য কারও Device-এ চলা যেকোনো Program, তাকে কখনো বিশ্বাস করা যায় না।
  • হালকা Client। Phone বা Browser-এর পুরো Database বা সব Logic রাখার দরকার নেই।

এর দাম হলো, Server একটি Bottleneck এবং Single Point of Failure (SPOF): Server ধীর হলে বা বন্ধ হলে সব Client ভোগে। তাই বাস্তব System-এ একটি Load Balancer-এর পেছনে Server-এর অনেক কপি চলে, যা নিজের কিছু সমস্যা নিয়ে আসে (পরের Lesson)।

#Request–Response Cycle

Client ও Server-এর মধ্যকার সমস্ত যোগাযোগ একটি নির্দিষ্ট চক্রে সম্পন্ন হয়, যাকে বলা হয় HTTP Request–Response Cycle:

  1. ১. Request তৈরি (Request Creation)

    ব্যবহারকারী কিছু করলে (URL লেখা, Button-এ ক্লিক) Client একটি HTTP Request তৈরি করে। এতে থাকে:

    • HTTP Method: Client কী করতে চায় (GET = Data আনো, POST = নতুন Data পাঠাও, PUT = আপডেট করো, DELETE = মুছে ফেলো)।
    • URL / Endpoint: Server-এর নির্দিষ্ট গন্তব্য, যেমন https://api.example.com/users।
    • Header: Request-এর অতিরিক্ত Metadata, যেমন Content-Type: application/json বা Authorization: Bearer <token>।
    • Body (Payload): POST, PUT বা PATCH-এ পাঠানো মূল Data, যেমন Form Data বা JSON।
  2. ২. Network Transmission

    Request-টি TCP/IP ব্যবহার করে বিভিন্ন Router ও ISP হয়ে Server-এর নির্দিষ্ট IP Address ও Port-এ পৌঁছায় (HTTPS-এর জন্য 443, সাধারণ HTTP-র জন্য 80)। HTTP-র প্রথম Byte পাঠানোর আগেই Client-কে IP খুঁজে বের করতে হয় (DNS, Lesson 1.8) এবং একটি Connection খুলতে হয় (TCP ও TLS, Lesson 1.9), যদি না আগের কোনোটি আবার ব্যবহার করা যায়।

  3. ৩. Server Processing

    Server-এর Router (Code-এর Router, Network-এর বাক্স নয়) Method ও Path দেখে মানানসই Handler চালায়। Handler দেখে কে চাইছে, Input যাচাই করে, Business Logic চালায়, আর প্রয়োজন হলে Database থেকে পড়ে বা লেখে।

  4. ৪. Response তৈরি (Response Generation)

    Server একটি HTTP Response তৈরি করে:

    • Status Code: ফলাফলের অবস্থা (200 OK = সফল, 201 Created = নতুন Resource তৈরি, 400 Bad Request = Client-এর ভুল, 401 Unauthorized = Authentication প্রয়োজন, 404 Not Found = Resource পাওয়া যায়নি, 500 Internal Server Error = Server ব্যর্থ)।
    • Header: Server-এর Metadata, যেমন Content-Type: text/html বা application/json, অথবা Set-Cookie।
    • Body: আসল Content: HTML Page, JSON Data, ছবি…
  5. ৫. Rendering বা Consumption

    Response Client-এ ফিরে আসে। Browser সেটি Render করে ব্যবহারকারীকে দেখায়; Mobile App Data প্রক্রিয়া করে নিজের Screen আপডেট করে। একটি Page-এর সাধারণত আরও কিছু লাগে: HTML পড়ার পরে Browser CSS, JavaScript, ছবি ও Font-এর জন্য আরও Request পাঠায়, প্রতিটিই আলাদা Request–Response চক্র।

Request–Response Cycle

পাঁচটি ধাপ: Request তৈরি, পাঠানো, Process করা, Response তৈরি, দেখানো।

পরিস্থিতি

তুমি
ClientBrowser / App
ServerNode.js / Nginx
Database
“Products”-এ ক্লিক
ধাপ 1 / 13
1

প্রতিটি চক্র শুরু হয় ব্যবহারকারীর কোনো কাজ দিয়ে (URL লেখা, Link বা Button-এ ক্লিক)।

#URL-এর গঠন

একটি URL (Uniform Resource Locator) Client-কে বলে দেয় কোন Protocol-এ কথা বলতে হবে, কোন Machine-এ যেতে হবে, কোন Port-এ, এবং কোন Resource চাইতে হবে।

https://shop.example.com:443/products/42?color=red&size=m#reviews
└─┬─┘   └──────┬───────┘ └┬┘└────┬────┘ └──────┬───────┘ └──┬──┘
scheme        host      port   path         query       fragment
অংশউদাহরণকে ব্যবহার করে, কীভাবে
SchemehttpsClient: TLS-এর ভেতরে HTTP বলো। http মানে Encryption ছাড়া
Hostshop.example.comDNS এটিকে IP-তে রূপান্তর করে; Host Header-এও যায়, কারণ একটি IP-তে অনেক সাইট থাকতে পারে
Port443সাধারণত লেখা হয় না: https-এর Default 443, http-এর 80। আলাদা হলে তবেই লেখা হয়, যেমন localhost:3000
Path/products/42Server-এর Router: কোন Resource (এখানে Product 42)
Query?color=red&size=mHandler: & দিয়ে যুক্ত key=value জোড়া, Filter, Search, Pagination-এর জন্য
Fragment#reviewsশুধু Browser: এটি কখনো Server-এ যায় না; Page ওই Element-এ Scroll করে

URL-এর গঠন: কোন অংশ কে ব্যবহার করে

একটি URL আসলে কিছু নির্দেশনার সমষ্টি। প্রতিটি অংশ ব্যবহার করে আলাদা আলাদা পক্ষ।

পরিস্থিতি

Browser
DNS Resolver
shop.example.com203.0.113.10:443
Route Handler/products/:id

https://shop.example.com/products/42?color=red&size=m#reviews

Scheme

https

Host

shop.example.com

Port

443 (ধরে নেওয়া)

Path

/products/42

Query

?color=red&size=m

Fragment

#reviews

ধাপ 1 / 7
1

পুরো URL (Uniform Resource Locator) চারটি প্রশ্নের উত্তর দেয়: কোন Protocol, কোন Machine, কোন Port, কোন Resource।

#একটি HTTP Message-এর ভেতরে

HTTP (Hypertext Transfer Protocol) হলো সেই ভাষা যা দিয়ে Client ও Server Web Request ও Response আদান-প্রদান করে। HTTPS (HTTP Secure) হলো একই HTTP, তবে Encrypted TLS Connection-এর ভেতরে, তাই পথে কেউ তা পড়তে বা বদলাতে পারে না।

HTTP/1.1-এ একটি Message হলো নির্দিষ্ট গঠনের সাধারণ Text: একটি প্রথম লাইন, Header, একটি ফাঁকা লাইন, তারপর ঐচ্ছিক Body।

HTTP Request ও Response-এর ভেতরে

প্রতিটি HTTP/1.1 Message-এর গঠন একই: প্রথম লাইন, Header, একটি ফাঁকা লাইন, তারপর ঐচ্ছিক Body।

পরিস্থিতি

TCP Connection (HTTPS হলে TLS-এর ভেতরে)198.51.100.7:51544 → 203.0.113.10:443
ধাপ 1 / 4
1

প্রথমে একটি Connection থাকে: তোমার Port 51544 থেকে Server-এর Port 443-এ একটি TCP Connection, HTTPS হলে TLS-এ মোড়া। HTTP-র লেখা এর ভেতর দিয়েই যায়।

HTTP/1.1-এ একটি বাস্তব Request যেভাবে যায়:

POST /api/orders HTTP/1.1
Host: shop.example.com
User-Agent: Mozilla/5.0 (…) Chrome/130
Accept: application/json
Content-Type: application/json
Content-Length: 31
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI0MiJ9.k3…

{"productId": 42, "quantity": 2}

আর Server-এর উত্তর:

HTTP/1.1 201 Created
Content-Type: application/json
Content-Length: 52
Location: /api/orders/981
Cache-Control: no-store

{"id": 981, "productId": 42, "quantity": 2, "paid": false}

Google খুললে Browser-এর পাঠানো সবচেয়ে সাধারণ Request দেখতে এরকম (সরলীকৃত):

GET / HTTP/2
Host: www.google.com
HTTP/2 200
content-type: text/html

#HTTP Method

Method বলে URL-এ নাম দেওয়া Resource নিয়ে Client কী করতে চায়।

Methodঅর্থBody?SafeIdempotentসাধারণ সফল উত্তর
GETএকটি Resource আনানা✅✅200 OK
HEADGET-এর মতোই, কিন্তু শুধু Headerনা✅✅200 OK
OPTIONSএখানে কোন Method/Origin অনুমোদিত? (CORS Preflight)না✅✅204 No Content
POSTপ্রক্রিয়ার জন্য Data পাঠানো; সাধারণত নতুন Resource তৈরিহ্যাঁ❌❌201 Created
PUTএই URL-এর Resource-কে এই পূর্ণ সংস্করণ দিয়ে বদলানো (বা সেখানে তৈরি)হ্যাঁ❌✅200 / 204
PATCHশুধু কিছু Field বদলানোহ্যাঁ❌নিশ্চিত নয়200 / 204
DELETEResource মুছে ফেলাকদাচিৎ❌✅204 No Content

এই Table-এর দুটি শব্দ System Design-এ খুবই গুরুত্বপূর্ণ:

  • Safe: Request Server-এ কিছুই বদলায় না। Browser আগেভাগে আনতে পারে, Crawler অনুসরণ করতে পারে, Cache উত্তর রেখে দিতে পারে।
  • Idempotent: একবার বা দশবার করো, Server একই অবস্থায় থাকে। তাই Timeout-এর পরে Retry করা নিরাপদ। খেয়াল করো, Response আলাদা হতে পারে: দ্বিতীয় DELETE 404 দেয়, কিন্তু Resource দুই ক্ষেত্রেই নেই।

HTTP Method ও Data-র ওপর তাদের প্রভাব

Database-এর নিচের Badge দেখো: প্রতিটি Request-এর পরে সংরক্ষিত Resource কেমন আছে তা দেখায়।

পরিস্থিতি

পড়া। Safe ও Idempotent।

Client
API Server/users
Databaseusers/42 = {name: Rahim, city: Dhaka}
সংরক্ষিত
ধাপ 1 / 4
1

Database-এ User 42 আছে।

Reference-এ আরও দুটি কম ব্যবহৃত Method দেখতে পারো: CONNECT (Proxy-কে একটি Tunnel খুলতে বলে, Proxy-র মধ্য দিয়ে HTTPS-এর জন্য) এবং TRACE (Debugging-এর জন্য Request হুবহু ফেরত দেয়, নিরাপত্তার কারণে সাধারণত বন্ধ রাখা হয়)।

নিজেকে যাচাই করোপ্রশ্ন

একটি Mobile App Request পাঠাতে গিয়ে Timeout পেল এবং স্বয়ংক্রিয়ভাবে Retry করতে চায়। কোন Request হুবহু Retry করা নিরাপদ?

#Status Code

প্রতিটি Response শুরু হয় তিন অঙ্কের একটি Status Code দিয়ে। প্রথম অঙ্কটি শ্রেণি বোঝায়:

শ্রেণিঅর্থকাকে কিছু করতে হবে
1xx Informational“পেয়েছি, চালিয়ে যাও”দৈনন্দিন কাজে কম দেখা যায়
2xx Successকাজ হয়েছেকাউকে না
3xx Redirectionঅন্য কোথাও দেখো (বা তোমার Cache-এর কপি ব্যবহার করো)Client নিজে থেকেই অনুসরণ করে
4xx Client ErrorRequest ভুল ছিলClient-কে কিছু বদলাতে হবে
5xx Server ErrorServer ব্যর্থServer টিম; Client পরে Retry করতে পারে

যে Code-গুলো অবশ্যই জানতে হবে:

Codeনামকখন দেখবে
100ContinueClient বড় Body পাঠানোর কথা জিজ্ঞেস করলে Server রাজি (Expect: 100-continue)
101Switching ProtocolsWebSocket Upgrade-এর উত্তর
200OKসফল, Body-সহ
201Createdনতুন Resource তৈরি; Location Header বলে কোথায়
202Acceptedলাইনে রাখা হলো; পরে প্রক্রিয়া হবে
204No Contentসফল, Body খালি (DELETE, PUT-এ প্রচলিত)
301Moved PermanentlyResource চিরতরে সরে গেছে; Browser মনে রাখে (http → https, পুরনো URL)
302 / 307Found / Temporary Redirectসাময়িকভাবে অন্য জায়গায় (যেমন /login-এ); 307 Method বদলায় না
308Permanent Redirect301-এর মতো, কিন্তু Method ও Body একই থাকে
304Not Modifiedতোমার Cache-এর কপি এখনো বৈধ; Body পাঠানো হয় না
400Bad Requestভুল গঠনের বা অবৈধ Input
401Unauthorizedআসলে “Unauthenticated”: তুমি কে? লগইন করো
403Forbiddenআমি জানি তুমি কে; তোমার অনুমতি নেই
404Not Foundএই URL-এ কোনো Resource নেই (যা দেখার অনুমতি নেই তা লুকাতেও ব্যবহার হয়)
405Method Not Allowedযেমন শুধু GET-এর Endpoint-এ DELETE
409Conflictবর্তমান অবস্থার সাথে সংঘর্ষ: ডুপ্লিকেট, বা অন্য কেউ আগে Edit করেছে
413Content Too LargeBody Server-এর সীমা ছাড়িয়েছে
422Unprocessable Contentগঠন ঠিক কিন্তু Validation-এ ব্যর্থ (কিছু API 400-এর বদলে এটি পছন্দ করে)
429Too Many RequestsRate Limit; Retry-After দেখো
500Internal Server ErrorServer-এ না-সামলানো Bug বা Exception
502Bad GatewayProxy/Load Balancer পেছনের Server থেকে বৈধ উত্তর পায়নি
503Service Unavailableঅতিরিক্ত চাপ বা Maintenance; সাময়িক, প্রায়ই Retry-After-সহ
504Gateway TimeoutProxy পেছনের Server-এর জন্য খুব বেশি সময় অপেক্ষা করেছে

Status Code: Server তোমাকে কী বলছে

প্রথম অঙ্কটি শ্রেণি: 1xx তথ্য, 2xx সফল, 3xx অন্য কোথাও যাও, 4xx তোমার ভুল, 5xx আমাদের ভুল।

পরিস্থিতি

Client
Proxy / Load BalancerNginx
App Server
Database
GET /orders
ধাপ 1 / 7
1

বেশিরভাগ Traffic আগে একটি Proxy বা Load Balancer-এ আসে, যা সেটিকে একটি App Server-এ পাঠায়।

#প্রতিদিন যে Header-গুলো দেখবে

Header হলো Name: value লাইন (নামে বড়-ছোট হাতের অক্ষরে পার্থক্য নেই)। গুরুত্বপূর্ণগুলো:

Headerকে পাঠায়উদ্দেশ্য
HostClientএই IP-র কোন সাইট (HTTP/1.1-এ বাধ্যতামূলক)
User-AgentClientকোন Browser/App জিজ্ঞেস করছে
AcceptClientClient কোন Format বোঝে, যেমন application/json
Content-TypeদুজনেইBody-র Format, যেমন application/json, text/html; charset=utf-8
Content-LengthদুজনেইBody-র আকার Byte-এ, যাতে গ্রাহক বোঝে Message কোথায় শেষ
AuthorizationClientCredential, যেমন Bearer <token>
CookieClientএই সাইটের জন্য Browser-এর রাখা Cookie
Set-CookieServerBrowser-কে একটি Cookie রাখতে বলা
Cache-ControlদুজনেইCaching-এর নিয়ম, যেমন max-age=60, no-store
ETag / If-None-MatchServer / Clientএকটি Version Tag, এবং সেই শর্তসাপেক্ষ Request যা কিছু না বদলালে 304 পায়
LocationServerকোথায় যেতে হবে (Redirect), বা নতুন তৈরি Resource-এর URL (201)
Retry-AfterServerRetry-এর আগে কতক্ষণ অপেক্ষা করতে হবে (429, 503)

তুমি নিজের Header-ও বানাতে পারো (Tracing-এর জন্য X-Request-Id, নিরাপদ Retry-এর জন্য Idempotency-Key)। পরের Lesson-এর বিষয় এদের দুটি, Set-Cookie ও Cookie, এবং কেন এদের আদৌ দরকার।

#Connection ও HTTP Version

HTTP-র নিচে একটি Connection লাগে, আর সেটি খোলা ব্যয়বহুল: একটি TCP Handshake-এ এক Round Trip, TLS আরও এক (TLS 1.3)। HTTP-র ইতিহাস মূলত Connection আরও ভালোভাবে আবার ব্যবহারের গল্প।

VersionসালTransportকী বদলাল
HTTP/1.0১৯৯৬TCPপ্রতি Connection-এ একটি Request, তারপর বন্ধ
HTTP/1.1১৯৯৭TCPDefault-এ Keep-alive: এক Connection-এ অনেক Request, কিন্তু একবারে একটি; Host Header বাধ্যতামূলক
HTTP/2২০১৫TCP + TLSBinary Frame, এক Connection-এ একসাথে অনেক Request-এর Multiplexing, Header Compression
HTTP/3২০২২UDP-র ওপর QUICHTTP/2-এর একই ধারণা, কিন্তু হারানো Packet শুধু নিজের Stream-কে দেরি করায়; দ্রুত শুরু; Network বদলালেও টিকে থাকে

Request-গুলো কীভাবে একটি Connection ভাগ করে

Connection খুলতে Round Trip খরচ হয়। HTTP-র প্রতিটি Version সেটি আবার ব্যবহারের আরও ভালো উপায় বের করেছে।

পরিস্থিতি

Browser
Server203.0.113.10
SYN
ধাপ 1 / 8
1

একটি TCP Handshake Connection খোলে…

  • Keep-alive (Persistent Connection) প্রতিটি Request-এর জন্য নতুন Handshake এড়ায়। Memory বাঁচাতে Server একটি Timeout-এর পরে অলস Connection বন্ধ করে দেয়।
  • Head-of-line Blocking: HTTP/1.1-এ একটি ধীর Response তার পেছনেরগুলো আটকে রাখে, তাই Browser প্রতি Host-এ প্রায় ছয়টি Connection খোলে। HTTP/2 এটি HTTP স্তরে ঠিক করে, কিন্তু একটি TCP Packet হারালে তবুও সব Stream থেমে যায়; HTTP/3 QUIC ব্যবহার করে সেটিও ঠিক করে।
  • Client ও Server Version নিয়ে আলোচনা (Negotiate) করে: HTTP/2 ঠিক হয় TLS Handshake-এর সময় (ALPN), HTTP/3 যখন Server Alt-Svc Header দিয়ে জানায়। বাকি সব (Method, Status Code, Header) সব Version-এ একই।

#Client-এর দিকে যখন সমস্যা হয়

Client-কে ধরে নিতে হবে Network ব্যর্থ হবে। সাধারণ ঘটনাগুলো:

ব্যর্থতাClient কী দেখেকী করতে হবে
DNS ব্যর্থনাম Resolve হলো নাError দেখাও; হয়তো পরে Retry
Server বন্ধ / Port বন্ধConnection Refused (দ্রুত) বা Connect Timeout (ধীর)Backoff-সহ Retry; অন্য Server চেষ্টা করো
Request বা Response হারালRead Timeout: নীরবতাRetry শুধু Idempotent হলে, বা Idempotency Key দিয়ে সুরক্ষিত হলে
4xxউত্তর বলছে Request ভুলঅন্ধভাবে Retry নয়; Input ঠিক করো। 401 হলে নতুন Token নিয়ে একবার Retry
429 / 503“ধীরে / পরে চেষ্টা করো”অপেক্ষা করো (Retry-After, বা Jitter-সহ Exponential Backoff)
500 / 502 / 504Server-এর দিকের ব্যর্থতানিরাপদ হলে কয়েকবার Retry, তারপর Error দেখাও

উত্তর না এলে: Timeout ও Retry

Network বার্তা হারায়। ভালো Client Timeout ঠিক করে রাখে, ঠিক জিনিস Retry করে, এবং কখনো দুবার টাকা কাটে না।

পরিস্থিতি

Mobile App
Payment API
Payment Database
GET /orders/981
ধাপ 1 / 5
1

দুর্বল Mobile Signal-এ Request হারিয়ে যায়।

মূল কথা: একটি Request Timeout হলে Client জানতে পারে না Server সেটি পায়ইনি, নাকি প্রক্রিয়া করেছে কিন্তু উত্তরটি হারিয়ে গেছে। এজন্যই:

১. সবসময় Timeout রাখো (একটি Connect Timeout ও একটি Read Timeout)। অনেক Library-র Default হলো “চিরকাল অপেক্ষা”।

২. স্বয়ংক্রিয়ভাবে শুধু Idempotent Request Retry করো (GET, PUT, DELETE, HEAD)।

৩. গুরুত্বপূর্ণ Non-idempotent Request-কে একটি Idempotency Key দিয়ে Idempotent বানাও: Client Request-এর সাথে একটি অনন্য ID পাঠায়, আর Server সেই ID-র ফলাফল মনে রেখে কাজ দুবার না করে আগের উত্তরটিই ফেরত দেয়।

৪. Jitter-সহ Exponential Backoff ব্যবহার করো (১, ২, ৪ সেকেন্ড… অপেক্ষা, সঙ্গে কিছু এলোমেলো সময়) এবং চেষ্টার সর্বোচ্চ সংখ্যা ঠিক করো, যাতে Retry Storm-এ দুর্বল Server গুঁড়িয়ে না যায়।

#System Design-এ Client–Server

  • Internet-এর বেশিরভাগই Client–Server। Website, REST API, Mobile Backend, এবং কোম্পানির ভেতরের Service-গুলো যখন একে অপরকে ডাকে (একটি Service তখন অন্যটির Client)।
  • API হলো চুক্তি। Method, URL, Status Code ও Header মিলে Client ও Server টিমের মধ্যকার Interface। এগুলো ঠিকভাবে ব্যবহার করলে (তৈরির জন্য 201, সংঘর্ষে 409, Idempotent PUT) Proxy, Cache ও Client Library বিশেষ Code ছাড়াই সঠিক আচরণ করে।
  • Server দিক Scale করা মানে একটি Load Balancer-এর পেছনে অনেকগুলো একই রকম Server। এটি মসৃণভাবে চলে শুধু তখনই, যখন যেকোনো Server যেকোনো Request-এর উত্তর দিতে পারে; এজন্যই HTTP-র Stateless হওয়া এত গুরুত্বপূর্ণ: পরের Lesson।
  • Caching একই Protocol ব্যবহার করে: Cache-Control, ETag ও 304 দিয়ে Browser ও CDN তোমার Server পর্যন্ত না পৌঁছেই Request-এর উত্তর দিতে পারে।
  • ব্যর্থতা সামলানো Design-এরই অংশ: Client-এ Timeout, Retry, Idempotency Key ও Backoff; Server-এ Retry-After-সহ 503 ও Rate Limit (429)।

#নিজে চেষ্টা করো

curl হলো Windows, macOS ও Linux-এ পাওয়া একটি Command-line HTTP Client।

# পুরো কথোপকথন দেখো: Request Header (>) ও Response Header (<)
curl -v https://example.com/

# HEAD Request: শুধু Header
curl -I https://example.com/

# Redirect অনুসরণ করো (-L) এবং শুধু শেষ Status Code দেখাও
curl -s -o /dev/null -w "%{http_code}\n" -L http://github.com/

# একটি Test API-তে JSON POST করো, যা পাওয়া জিনিস ফেরত দেখায়
curl -X POST https://httpbin.org/post \
  -H "Content-Type: application/json" \
  -d '{"productId": 42, "quantity": 2}'

# ইচ্ছে করে একটি Status Code চাও
curl -i https://httpbin.org/status/404

# HTTP/2 বা HTTP/3 জোর করে ব্যবহার (তোমার curl সমর্থন করলে)
curl -sI --http2 https://www.google.com/ | head -1

Windows PowerShell-এ curl-এর বদলে curl.exe লেখো (শুধু নামটি অন্য একটি Command-এর Alias)। Browser-এ Developer Tools খোলো (F12), Network Tab-এ গিয়ে Page Reload করো: প্রতিটি সারি একটি Request–Response চক্র, তার Method, Status, Header, আকার, Protocol (h2, h3) ও সময়সহ।

#সারসংক্ষেপ

মূল শিক্ষা

  • Client–Server Architecture-এ Client চায় আর Server উত্তর দেয়; Server কেন্দ্রীয়ভাবে Data ও Logic রাখে, এবং শুধু সে-ই Database-এর সাথে কথা বলে। এটি সহজ ও নিয়ন্ত্রণযোগ্য, কিন্তু Server একটি Bottleneck ও Single Point of Failure।
  • Request–Response Cycle: Request তৈরি (Method, URL, Header, Body) → TCP/IP দিয়ে পাঠানো → Server Route, যাচাই ও Logic চালায় → Response তৈরি (Status, Header, Body) → Client দেখায়। একটি Page মানে সাধারণত অনেকগুলো চক্র।
  • URL = Scheme + Host + Port + Path + Query + Fragment; Fragment কখনো Server-এ যায় না, আর গোপন তথ্য কখনো URL-এ নয়।
  • Method: GET/HEAD/OPTIONS Safe; GET, HEAD, OPTIONS, PUT ও DELETE Idempotent; POST কোনোটিই নয়, PATCH নিশ্চিত নয়। Idempotent মানে Retry নিরাপদ।
  • Status Code: 2xx সফল, 3xx Redirect বা Cache (301, 302, 304), 4xx Client Error (400, 401 Unauthenticated, 403 Forbidden, 404, 409, 429), 5xx Server Error (500 Code-এর Bug, 502/504 Proxy থেকে, 503 সাময়িক)।
  • Connection: HTTP/1.1 Keep-alive একটি Connection একবারে এক Request করে আবার ব্যবহার করে; HTTP/2 Multiplex করে; HTTP/3 QUIC ব্যবহার করে, তাই Packet হারালে শুধু একটি Stream দেরি হয়।
  • Client-কে ব্যর্থতা সামলাতে হয়: সবসময় Timeout, Backoff ও Jitter-সহ Retry, এবং যা দুবার হওয়া চলবে না তার জন্য Idempotency Key।