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,
curlCommand। - 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 তারই হাতে।
পরিস্থিতি
তুমি একটি 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:
১. 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।
২. 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), যদি না আগের কোনোটি আবার ব্যবহার করা যায়।
৩. Server Processing
Server-এর Router (Code-এর Router, Network-এর বাক্স নয়) Method ও Path দেখে মানানসই Handler চালায়। Handler দেখে কে চাইছে, Input যাচাই করে, Business Logic চালায়, আর প্রয়োজন হলে Database থেকে পড়ে বা লেখে।
৪. 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, ছবি…
৫. 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 তৈরি, দেখানো।
পরিস্থিতি
প্রতিটি চক্র শুরু হয় ব্যবহারকারীর কোনো কাজ দিয়ে (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
| অংশ | উদাহরণ | কে ব্যবহার করে, কীভাবে |
|---|---|---|
| Scheme | https | Client: TLS-এর ভেতরে HTTP বলো। http মানে Encryption ছাড়া |
| Host | shop.example.com | DNS এটিকে IP-তে রূপান্তর করে; Host Header-এও যায়, কারণ একটি IP-তে অনেক সাইট থাকতে পারে |
| Port | 443 | সাধারণত লেখা হয় না: https-এর Default 443, http-এর 80। আলাদা হলে তবেই লেখা হয়, যেমন localhost:3000 |
| Path | /products/42 | Server-এর Router: কোন Resource (এখানে Product 42) |
| Query | ?color=red&size=m | Handler: & দিয়ে যুক্ত key=value জোড়া, Filter, Search, Pagination-এর জন্য |
| Fragment | #reviews | শুধু Browser: এটি কখনো Server-এ যায় না; Page ওই Element-এ Scroll করে |
URL-এর গঠন: কোন অংশ কে ব্যবহার করে
একটি URL আসলে কিছু নির্দেশনার সমষ্টি। প্রতিটি অংশ ব্যবহার করে আলাদা আলাদা পক্ষ।
পরিস্থিতি
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
পুরো 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।
পরিস্থিতি
প্রথমে একটি 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? | Safe | Idempotent | সাধারণ সফল উত্তর |
|---|---|---|---|---|---|
| GET | একটি Resource আনা | না | ✅ | ✅ | 200 OK |
| HEAD | GET-এর মতোই, কিন্তু শুধু 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 |
| DELETE | Resource মুছে ফেলা | কদাচিৎ | ❌ | ✅ | 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।
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 Error | Request ভুল ছিল | Client-কে কিছু বদলাতে হবে |
| 5xx Server Error | Server ব্যর্থ | Server টিম; Client পরে Retry করতে পারে |
যে Code-গুলো অবশ্যই জানতে হবে:
| Code | নাম | কখন দেখবে |
|---|---|---|
| 100 | Continue | Client বড় Body পাঠানোর কথা জিজ্ঞেস করলে Server রাজি (Expect: 100-continue) |
| 101 | Switching Protocols | WebSocket Upgrade-এর উত্তর |
| 200 | OK | সফল, Body-সহ |
| 201 | Created | নতুন Resource তৈরি; Location Header বলে কোথায় |
| 202 | Accepted | লাইনে রাখা হলো; পরে প্রক্রিয়া হবে |
| 204 | No Content | সফল, Body খালি (DELETE, PUT-এ প্রচলিত) |
| 301 | Moved Permanently | Resource চিরতরে সরে গেছে; Browser মনে রাখে (http → https, পুরনো URL) |
| 302 / 307 | Found / Temporary Redirect | সাময়িকভাবে অন্য জায়গায় (যেমন /login-এ); 307 Method বদলায় না |
| 308 | Permanent Redirect | 301-এর মতো, কিন্তু Method ও Body একই থাকে |
| 304 | Not Modified | তোমার Cache-এর কপি এখনো বৈধ; Body পাঠানো হয় না |
| 400 | Bad Request | ভুল গঠনের বা অবৈধ Input |
| 401 | Unauthorized | আসলে “Unauthenticated”: তুমি কে? লগইন করো |
| 403 | Forbidden | আমি জানি তুমি কে; তোমার অনুমতি নেই |
| 404 | Not Found | এই URL-এ কোনো Resource নেই (যা দেখার অনুমতি নেই তা লুকাতেও ব্যবহার হয়) |
| 405 | Method Not Allowed | যেমন শুধু GET-এর Endpoint-এ DELETE |
| 409 | Conflict | বর্তমান অবস্থার সাথে সংঘর্ষ: ডুপ্লিকেট, বা অন্য কেউ আগে Edit করেছে |
| 413 | Content Too Large | Body Server-এর সীমা ছাড়িয়েছে |
| 422 | Unprocessable Content | গঠন ঠিক কিন্তু Validation-এ ব্যর্থ (কিছু API 400-এর বদলে এটি পছন্দ করে) |
| 429 | Too Many Requests | Rate Limit; Retry-After দেখো |
| 500 | Internal Server Error | Server-এ না-সামলানো Bug বা Exception |
| 502 | Bad Gateway | Proxy/Load Balancer পেছনের Server থেকে বৈধ উত্তর পায়নি |
| 503 | Service Unavailable | অতিরিক্ত চাপ বা Maintenance; সাময়িক, প্রায়ই Retry-After-সহ |
| 504 | Gateway Timeout | Proxy পেছনের Server-এর জন্য খুব বেশি সময় অপেক্ষা করেছে |
Status Code: Server তোমাকে কী বলছে
প্রথম অঙ্কটি শ্রেণি: 1xx তথ্য, 2xx সফল, 3xx অন্য কোথাও যাও, 4xx তোমার ভুল, 5xx আমাদের ভুল।
পরিস্থিতি
বেশিরভাগ Traffic আগে একটি Proxy বা Load Balancer-এ আসে, যা সেটিকে একটি App Server-এ পাঠায়।
#প্রতিদিন যে Header-গুলো দেখবে
Header হলো Name: value লাইন (নামে বড়-ছোট হাতের অক্ষরে পার্থক্য নেই)। গুরুত্বপূর্ণগুলো:
| Header | কে পাঠায় | উদ্দেশ্য |
|---|---|---|
Host | Client | এই IP-র কোন সাইট (HTTP/1.1-এ বাধ্যতামূলক) |
User-Agent | Client | কোন Browser/App জিজ্ঞেস করছে |
Accept | Client | Client কোন Format বোঝে, যেমন application/json |
Content-Type | দুজনেই | Body-র Format, যেমন application/json, text/html; charset=utf-8 |
Content-Length | দুজনেই | Body-র আকার Byte-এ, যাতে গ্রাহক বোঝে Message কোথায় শেষ |
Authorization | Client | Credential, যেমন Bearer <token> |
Cookie | Client | এই সাইটের জন্য Browser-এর রাখা Cookie |
Set-Cookie | Server | Browser-কে একটি Cookie রাখতে বলা |
Cache-Control | দুজনেই | Caching-এর নিয়ম, যেমন max-age=60, no-store |
ETag / If-None-Match | Server / Client | একটি Version Tag, এবং সেই শর্তসাপেক্ষ Request যা কিছু না বদলালে 304 পায় |
Location | Server | কোথায় যেতে হবে (Redirect), বা নতুন তৈরি Resource-এর URL (201) |
Retry-After | Server | Retry-এর আগে কতক্ষণ অপেক্ষা করতে হবে (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 | ১৯৯৭ | TCP | Default-এ Keep-alive: এক Connection-এ অনেক Request, কিন্তু একবারে একটি; Host Header বাধ্যতামূলক |
| HTTP/2 | ২০১৫ | TCP + TLS | Binary Frame, এক Connection-এ একসাথে অনেক Request-এর Multiplexing, Header Compression |
| HTTP/3 | ২০২২ | UDP-র ওপর QUIC | HTTP/2-এর একই ধারণা, কিন্তু হারানো Packet শুধু নিজের Stream-কে দেরি করায়; দ্রুত শুরু; Network বদলালেও টিকে থাকে |
Request-গুলো কীভাবে একটি Connection ভাগ করে
Connection খুলতে Round Trip খরচ হয়। HTTP-র প্রতিটি Version সেটি আবার ব্যবহারের আরও ভালো উপায় বের করেছে।
পরিস্থিতি
একটি 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-SvcHeader দিয়ে জানায়। বাকি সব (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 / 504 | Server-এর দিকের ব্যর্থতা | নিরাপদ হলে কয়েকবার Retry, তারপর Error দেখাও |
উত্তর না এলে: Timeout ও Retry
Network বার্তা হারায়। ভালো Client Timeout ঠিক করে রাখে, ঠিক জিনিস Retry করে, এবং কখনো দুবার টাকা কাটে না।
পরিস্থিতি
দুর্বল 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।
আগে নিজে উত্তর দাও, তারপর ব্যাখ্যাটা পড়ো। ঠিক হলেও পড়ো, কারণ ভুল Option-গুলো কেন ভুল, সেটাও ওখানে আছে।
নিজেকে যাচাই করোপ্রশ্ন
Client–Server Model-এ কথোপকথন শুরু করে কে?
নিজেকে যাচাই করোপ্রশ্ন
HTTP/1.1 Message-এ Header আর Body-কে আলাদা করে কোনটা?
নিজেকে যাচাই করোপ্রশ্ন
POST /api/orders সফল হয়ে 201 Created এল। নতুন Order-টার URL কোন Response Header-এ থাকে?
নিজেকে যাচাই করোপ্রশ্ন
HTTP/3 কীসের ওপর চলে?
নিজেকে যাচাই করোপ্রশ্ন
Server-এ GET /products/42 কোন Code সামলাবে, সেটা ঠিক করে কে?
নিজেকে যাচাই করোপ্রশ্ন
অন্য Origin-এ Request পাঠানোর আগে Browser জিজ্ঞেস করে নেয় কোন Method আর Origin অনুমোদিত। এর জন্য সে কোন Method ব্যবহার করে?
নিজেকে যাচাই করোপ্রশ্ন
https://shop.example.com/products/42?color=red#reviews-এর কোন অংশ কখনো Server-এ যায় না?
নিজেকে যাচাই করোপ্রশ্ন
কোন Method Safe-ও নয়, Idempotent-ও নয়?
নিজেকে যাচাই করোপ্রশ্ন
কোন দুটো Method Safe, মানে Server-এ কিছুই বদলায় না? (দুটো বেছে নাও।)
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
একজন ব্যবহারকারী সাধারণ গ্রাহক হিসেবে লগইন করে /admin খুলল। Server কী ফেরত দেবে?
নিজেকে যাচাই করোপ্রশ্ন
তোমার ব্যবহারকারীরা 504 Gateway Timeout দেখছে। প্রথমে কোথায় খুঁজবে?
নিজেকে যাচাই করোপ্রশ্ন
একটা Mobile App-এর Token-এর মেয়াদ শেষ, তাই পরের Request-এ এল 401 Unauthorized। ঠিক প্রতিক্রিয়া কোনটা?
নিজেকে যাচাই করোপ্রশ্ন
একটা Payment Request (POST /payments) Timeout হলো। Client বুঝতে পারছে না Card থেকে টাকা কাটা হয়েছে কি না। দুবার টাকা কাটার ঝুঁকি ছাড়া Retry করার উপায় কী?
নিজেকে যাচাই করোপ্রশ্ন
DELETE /users/42-এর উত্তর এল 204। Client আবার পাঠাল, এবার এল 404। DELETE কি এখনও Idempotent?
নিজেকে যাচাই করোপ্রশ্ন
User 42-এর আছে নাম, Email আর ফোন নম্বর। একটা Client PUT /users/42 পাঠাল, Body-তে শুধু নতুন Email। Server যদি PUT-এর আসল মানে মেনে চলে, তাহলে পরে কী জমা থাকবে?
নিজেকে যাচাই করোপ্রশ্ন
একটা Client Exponential Backoff দিয়ে Retry করছে: প্রথম ব্যর্থতার পরে ১ সেকেন্ড অপেক্ষা, তারপর ২, তারপর ৪, প্রতিবার দ্বিগুণ। Jitter আর প্রতিটা Request-এর সময় বাদ দিলে, প্রথম ব্যর্থতার কতক্ষণ পরে পঞ্চম চেষ্টা শুরু হবে?
নিজেকে যাচাই করোপ্রশ্ন
একটা Round Trip-এ লাগে ১০০ ms। HTTPS Connection খুলতে TCP-র জন্য এক Round Trip, TLS 1.3-এর জন্য আরও এক। একটা Page-এর জন্য একই Server-এ ৩টা Request লাগবে। HTTP/1.0-এর (প্রতি Request-এ নতুন Connection) তুলনায় HTTP/1.1 Keep-alive Connection খোলার কতটা সময় বাঁচায়?
নিজেকে যাচাই করোপ্রশ্ন
একটা Load Balancer-এর পেছনে আর একটাও সুস্থ App Server নেই। ব্যবহারকারীরা সম্ভবত কোন Status দেখবে?
নিজেকে যাচাই করোপ্রশ্ন
একটা API 429 Too Many Requests দিল, সাথে Retry-After: 30। ভদ্র Client কী করবে?
নিজেকে যাচাই করোপ্রশ্ন
দুর্বল Mobile Network-এ একটা Phone HTTP/2 ব্যবহার করছে। একটা TCP Packet হারিয়ে গেল। ওই Connection-এর বাকি Stream-গুলোর কী হবে?
নিজেকে যাচাই করোপ্রশ্ন
shop.example.com আর blog.example.com একই IP Address আর একই Port-এ চলছে। Request কোন Site-এর জন্য, Server বোঝে কীভাবে?
নিজেকে যাচাই করোপ্রশ্ন
একজন Developer লগইন বানাল GET /login?user=ana&password=… দিয়ে, আর বলল Site তো HTTPS, তাই সমস্যা নেই। আসল সমস্যাটা কী?
নিজেকে যাচাই করোপ্রশ্ন
Notes-এ লেখা ‘500 = Server Crash’। কোন কথাটা সঠিক?
নিজেকে যাচাই করোপ্রশ্ন
কোনো HTTP আদান-প্রদানের আগেই Client সঙ্গে সঙ্গে ‘Connection Refused’ পেল। সবচেয়ে সম্ভাব্য কারণ কী?
নিজেকে যাচাই করোপ্রশ্ন
দুজন Admin একই Product খুলেছে। দ্বিতীয়জন যে Version দেখে বদল করেছে, প্রথমজন সেটা আগেই বদলে ফেলেছে। কোন Status Code সবচেয়ে মানানসই?
নিজেকে যাচাই করোপ্রশ্ন
Browser একটা HTML Page আনল, যেটায় আছে ২টা CSS File, ৩টা JavaScript File আর ৫টা ছবি। Cache না থাকলে অন্তত কয়টা Request–Response Cycle লাগবে?
নিজেকে যাচাই করোপ্রশ্ন
নিচের কোন Header Client পাঠায় না?
নিজেকে যাচাই করোপ্রশ্ন
কোন দুটো Status Code তোমার নিজের Code বানায় না, বানায় Proxy বা Load Balancer তার পেছনের Server সম্পর্কে? (দুটো বেছে নাও।)
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
একটা পুরনো URL স্থায়ীভাবে সরে গেছে, আর Redirect সব Client-এর জন্য কাজ করতে হবে। কোন দুটো Status Code স্থায়ী Redirect? (দুটো বেছে নাও।)
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
HTTP Version নিয়ে কোন দুটো কথা সত্য? (দুটো বেছে নাও।)
বেছে নাও ২
নিজেকে যাচাই করোপ্রশ্ন
কেন্দ্রীয় Client–Server Model-এর আসল দুটো দাম কোনগুলো? (দুটো বেছে নাও।)
বেছে নাও ২