এই পর্বে যা শিখবেন
- ICMP-এর বার্তার গঠন বাইট ধরে পড়া, আর নিজের হাতে একটি Echo Request-এর checksum হিসাব
- প্রধান type ও code-এর মানে, আর কোন অবস্থায় ICMP ত্রুটির বার্তা পাঠানো নিষেধ
- ping-এর identifier, sequence, RTT-এর min/avg/max/mdev আর loss %, আর “Request timed out” বনাম “Destination host unreachable”
- traceroute-এর তিন রকম probe (UDP, ICMP, TCP),
* * *, asymmetric পথ, MPLS আর rate limit-এর ভুল ব্যাখ্যা - Path MTU Discovery, PMTUD black hole, আর firewall-এ কোন ICMP রাখবেন — প্রতিরক্ষার দৃষ্টিতে
১ · IP-র একজন খবরবাহক দরকার কেন
পর্ব ১৫ আর ১৬-তে দেখেছেন, IP একটি “যতটা পারি চেষ্টা করি” (best effort) সেবা। Router packet পাঠায়, কিন্তু কোনো কথা দেয় না — পৌঁছাবে কি না, কবে পৌঁছাবে, কোনো নিশ্চয়তা নেই। পথে গন্তব্যের route না থাকলে, TTL ফুরালে বা packet কোনো link-এর MTU-র চেয়ে বড় হলে router packet ফেলে দেয়। প্রেরক কিছু না জানলে সে একই ভুল বারবার করবে।
ডাকঘরে একটি চিঠি পাঠালেন, খামের ঠিকানায় ভুল। ভালো ডাকঘর চিঠিটি নিঃশব্দে ফেলে দেয় না — খামের ওপর সিল মেরে লিখে দেয় “এই ঠিকানায় প্রাপক নেই”, আর ফেরত পাঠায় প্রেরকের ঠিকানায়। সাথে থাকে আপনার নিজের খামটি, যাতে বুঝতে পারেন কোন চিঠির কথা বলা হচ্ছে। ইন্টারনেটে এই “ফেরত চিঠির সিল” হলো ICMP (Internet Control Message Protocol). আর ফেরত খামের মতোই, ICMP-এর ত্রুটির বার্তায় মূল packet-এর শুরুর অংশটি জুড়ে দেওয়া থাকে।
ICMP-এর মূল সংজ্ঞা RFC 792, ১৯৮১ সালের সেপ্টেম্বরে Jon Postel-এর সম্পাদনায় প্রকাশিত — IPv4-এর RFC 791-এর সঙ্গী হিসেবে। পরে RFC 1122 (host, ১৯৮৯) আর RFC 1812 (router, ১৯৯৫) এর আচরণ আরও নির্দিষ্ট করে। IPv6-এর সংস্করণ ICMPv6 পর্ব ২১-এ; এই পর্ব IPv4-এর ICMP নিয়ে।
IP-র ভেতরে, অথচ IP-র সহকারী
ICMP-এর অবস্থানটা একটু ধাঁধার মতো। প্রতিটি ICMP বার্তা একটি সাধারণ IP packet-এর ভেতরে যায়, আর IP header-এর Protocol ঘরে লেখা থাকে ১ (TCP-র জন্য ৬, UDP-র জন্য ১৭)। তাহলে কি এটি TCP-UDP-র মতো একটি transport protocol? না। ICMP কোনো অ্যাপের ডেটা বহন করে না, এর কোনো port নেই, আর এর কাজ IP-র নিজের সমস্যার খবর দেওয়া। RFC 792 স্পষ্ট বলে: ICMP হলো IP-র একটি অবিচ্ছেদ্য অংশ, আর প্রতিটি IP বাস্তবায়নে এটি থাকতেই হবে। তাই বইগুলো ICMP-কে network layer-এর অংশ ধরে — শুধু বহনের সুবিধার জন্য সে IP-র খামে চড়ে।
┌──────────────────┬─────────────────────────────────────────┐
│ IP header (20 B) │ ICMP message │
│ Protocol = 1 │ Type │ Code │ Checksum │ rest … │
└──────────────────┴─────────────────────────────────────────┘
Protocol = 6 → TCP, 17 → UDP, 1 → ICMP (IPv6: Next Header = 58 → ICMPv6)
তিনটি মৌলিক নিয়ম মনে রাখুন। প্রথমত, ICMP শুধু খবর দেয়, কিছু সারায় না — সিদ্ধান্ত নেয় প্রেরক। দ্বিতীয়ত, ত্রুটির খবর যায় শুধু মূল packet-এর উৎস ঠিকানায় (source IP), কারণ IP header-এ পথের অন্য কারও ঠিকানা থাকে না। তৃতীয়ত, ICMP নিজেও IP-তে চলে, তাই ICMP বার্তাও হারাতে পারে — এর ওপর ভরসা করে কোনো protocol নিশ্চয়তা দিতে পারে না, শুধু দ্রুত শিখতে পারে।
প্রশ্ন-উত্তর (query)
Echo Request আর Echo Reply — ping-এর ভিত্তি।
type ৮ → type ০ত্রুটির খবর (error)
Packet ফেলে দেওয়ার কারণ প্রেরককে জানানো: পৌঁছানো যায় না, TTL শেষ, header-এ গোলমাল।
type ৩, ১১, ১২নির্দেশনা (control)
Router host-কে বলে “এই গন্তব্যে অন্য router দিয়ে যান” — Redirect.
type ৫২ · ICMP বার্তার গঠন — type, code, checksum আর উদ্ধৃত header
সব ICMP বার্তার প্রথম ৪ বাইট একই ছাঁচের। Type (১ বাইট) বলে বার্তাটি কোন জাতের — Echo, Unreachable, Time Exceeded. Code (১ বাইট) সেই জাতের ভেতরে নির্দিষ্ট কারণ — যেমন Unreachable-এর ভেতরে “নেটওয়ার্ক নেই” না “port বন্ধ”। Checksum (২ বাইট) পুরো ICMP বার্তার ওপর হিসাব করা Internet checksum — পর্ব ৯-এর সেই ১৬-বিট one's complement যোগফল (RFC 1071). পরের ৪ বাইটের মানে type-ভেদে আলাদা, তারপর থাকে ডেটা।
byte: 0 1 2 3
┌────────┬────────┬─────────────────┐
│ Type │ Code │ Checksum │ same for every ICMP message
├────────┴────────┴─────────────────┤
│ rest of header (4 bytes) │ Echo: Identifier │ Sequence
│ │ Type 3: unused │ next-hop MTU
│ │ Type 12: Pointer │ unused
│ │ Type 5: gateway IP address
├───────────────────────────────────┤
│ data │ Echo: any payload (echoed back)
│ │ Error: original IP header + 8 B
└───────────────────────────────────┘
Echo বার্তা — identifier আর sequence
Echo Request (type ৮, code ০) পাঠালে গন্তব্য একটি Echo Reply (type ০, code ০) ফেরত দেয়, যেখানে identifier, sequence আর পুরো ডেটা হুবহু একই থাকে — শুধু type বদলায় (আর তাই checksum). Identifier দিয়ে আলাদা করা হয় কোন ping প্রোগ্রামের উত্তর (একই যন্ত্রে দুটি ping একসাথে চললে), আর sequence দিয়ে কোন packet-এর উত্তর — ১, ২, ৩… একটি নম্বর বাদ গেলে সেই packet হারিয়েছে। ডেটা অংশে Linux-এর ping সাধারণত পাঠানোর সময় (timestamp) লিখে দেয়, যাতে উত্তর এলে RTT হিসাব করা যায়; Windows-এর ping ডিফল্টভাবে ৩২ বাইটের বর্ণমালা পাঠায় (abcdefghijklmnopqrstuvwabcdefghi).
ত্রুটির বার্তা — মূল packet-এর “খাম” ফেরত
ত্রুটির বার্তায় ডেটা অংশে router বা গন্তব্য যন্ত্র জুড়ে দেয় যে packet-টি সমস্যায় পড়েছিল তার IP header, আর তার ঠিক পরের অন্তত ৮ বাইট (RFC 792-এর ভাষায় “64 bits of original data”). এই ৮ বাইট কেন? কারণ সেখানেই থাকে transport header-এর শুরু। UDP-র পুরো header ৮ বাইট: source port, destination port, length, checksum. TCP-র প্রথম ৮ বাইটে source port, destination port আর sequence number. অর্থাৎ এই ৮ বাইট পেলেই প্রেরকের kernel বুঝতে পারে খবরটি কোন socket-এর, কোন সংযোগের — আর সেই প্রোগ্রামকে জানাতে পারে।
┌────────────── new IP header (20 B) ───────────────┐
│ src = router or target dst = original sender │
│ Protocol = 1 (ICMP) │
├────────────── ICMP header (8 B) ──────────────────┤
│ Type = 3 │ Code = 3 │ Checksum │ unused (0) │
├────── quoted: the original IP header (20 B) ──────┤
│ src = 192.168.0.105 dst = 192.0.2.20 Proto = 17 │
├────── quoted: first 8 bytes of its payload ───────┤
│ src port 50000 │ dst port 9999 │ length │ csum │ ← the UDP header
└───────────────────────────────────────────────────┘
RFC 1812 পরে router-দের বলেছে, পুরো ICMP packet ৫৭৬ বাইট না ছাড়িয়ে যত বেশি সম্ভব উদ্ধৃত করতে; Linux-ও তাই করে। NAT router উদ্ধৃত header দেখেই ICMP ত্রুটিকে ভেতরের সঠিক যন্ত্রের কাছে ফেরত পাঠায়, আর Echo-র identifier-কে port-এর মতো ব্যবহার করে — NAT-এর translation table-এর মূল কৌশল পর্ব ১৯-এ।
নিজের হাতে একটি Echo Request বানানো — C
এবার হাতে-কলমে। নিচের C প্রোগ্রাম ১৬ বাইটের একটি Echo Request বানায় — identifier 0x1234, sequence ১, ডেটা abcdefgh — checksum হিসাব করে, hex-এ ছাপে, তারপর একটি “ping socket” খুলে আসল বার্তাটি 127.0.0.1-এ পাঠানোর চেষ্টা করে। Ping socket (SOCK_DGRAM, IPPROTO_ICMP) দিয়ে root ছাড়াই Echo পাঠানো যায়, যদি সিস্টেম অনুমতি দেয় (অংশ ৮)। অনুমতি না পেলে প্রোগ্রাম কারণটি ছাপে, আর উত্তরটি (Echo Reply) নিজেই বানিয়ে দেখায় — সেটি যে নিজের বানানো, তা তারকা চিহ্ন দিয়ে আলাদা করে।
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
static unsigned short csum(const unsigned char *p, int n) { /* RFC 1071 Internet checksum */
unsigned long s = 0; for (int i = 0; i < n; i += 2) s += (unsigned)(p[i] << 8 | (i + 1 < n ? p[i + 1] : 0));
while (s >> 16) s = (s & 0xFFFF) + (s >> 16); /* end-around carry */
return (unsigned short)~s; /* one's complement */
}
static void put(unsigned char *p, int n) { unsigned short c; p[2] = p[3] = 0; c = csum(p, n); p[2] = c >> 8; p[3] = c & 0xFF; }
static void hex(const char *tag, const unsigned char *p, int n) {
printf("%-8s", tag); for (int i = 0; i < n; i++) printf("%02x%s", p[i], i == 3 || i == 7 ? " | " : " ");
printf("\n type=%u code=%u csum=0x%02x%02x id=0x%02x%02x seq=%u verify=%s\n",
p[0], p[1], p[2], p[3], p[4], p[5], p[6] << 8 | p[7], csum(p, n) == 0 ? "OK" : "BAD");
}
int main(void) {
unsigned char req[16] = {8, 0, 0, 0, 0x12, 0x34, 0x00, 0x01, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}, rep[64];
put(req, 16); hex("request", req, 16); /* type 8 = Echo Request */
int s = socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP); /* unprivileged "ping socket" */
if (s < 0) {
int e = errno; char r[64] = "?"; FILE *f = fopen("/proc/sys/net/ipv4/ping_group_range", "r");
if (f) { if (!fgets(r, sizeof r, f)) r[0] = 0; fclose(f); r[strcspn(r, "\n")] = 0; r[strcspn(r, "\t")] = ' '; }
printf("socket() failed: %s (%s); my gid=%u, ping_group_range=\"%s\"\n",
e == EACCES ? "EACCES" : e == EPERM ? "EPERM" : "other", strerror(e), (unsigned)getgid(), r);
memcpy(rep, req, 16); rep[0] = 0; put(rep, 16); /* fallback: build the reply locally */
hex("reply*", rep, 16); printf("(* built locally, not received)\n"); return 0;
}
struct sockaddr_in to = {.sin_family = AF_INET, .sin_addr.s_addr = htonl(INADDR_LOOPBACK)};
sendto(s, req, 16, 0, (struct sockaddr *)&to, sizeof to); /* kernel sets id and checksum */
long n = recv(s, rep, sizeof rep, 0); /* reply = ICMP header + data, no IP header */
if (n >= 8) hex("reply", rep, (int)n); else printf("no reply\n");
close(s); return 0;
}আসল রানের আউটপুট:
request 08 00 54 35 | 12 34 00 01 | 61 62 63 64 65 66 67 68
type=8 code=0 csum=0x5435 id=0x1234 seq=1 verify=OK
socket() failed: EACCES (Permission denied); my gid=999, ping_group_range="0 0"
reply* 00 00 5c 35 | 12 34 00 01 | 61 62 63 64 65 66 67 68
type=0 code=0 csum=0x5c35 id=0x1234 seq=1 verify=OK
(* built locally, not received)
প্রথম লাইন পুরো Echo Request, তিন টুকরোয়: 08 00 54 35 — type ৮, code ০, checksum 0x5435; 12 34 00 01 — identifier আর sequence; বাকি ৮ বাইট a থেকে h-এর ASCII. Checksum হাতে মিলিয়ে নিন: ১৬-বিটের শব্দগুলো 0800 + 0000 + 1234 + 0001 + 6162 + 6364 + 6566 + 6768 = 0x1ABC9; ১৭তম বিটের ক্যারি ঘুরিয়ে যোগ (end-around carry): ABC9 + 1 = ABCA; সব বিট উল্টে 0x5435. verify=OK মানে checksum বসানোর পরে পুরো packet-এর ওপর আবার হিসাব করলে ০ আসে — প্রাপক ঠিক এভাবেই যাচাই করে।
তৃতীয় লাইন — সৎ ফল: এই পাতার কোড যে container-এ চলে, সেখানে ping socket খোলা যায়নি: EACCES. কারণটিও ছাপা হয়েছে — প্রোগ্রামের group id ৯৯৯, আর ping_group_range হলো 0 0, অর্থাৎ শুধু group ০ (root) এই socket খুলতে পারে। তাই আসল packet যায়নি। আপনার নিজের Linux-এ (যেখানে range সাধারণত বড়) একই প্রোগ্রাম kernel-এর পাঠানো আসল উত্তর ছাপবে, আর দেখবেন identifier বদলে গেছে — ping socket-এ kernel নিজেই identifier বসায় (socket-টির জন্য বরাদ্দ একটি নম্বর) আর checksum নতুন করে হিসাব করে।
চতুর্থ লাইন তাই নিজে বানানো Echo Reply: একমাত্র পরিবর্তন প্রথম বাইট 08 → 00. Checksum বদলেছে ঠিক 0x0800: 0x5435 + 0x0800 = 0x5C35. যুক্তিটা সহজ — যোগফল থেকে 0x0800 কমলে তার one's complement ঠিক ততটাই বাড়ে। একে বলে incremental checksum update (RFC 1624); router আর গন্তব্য যন্ত্র পুরো packet আবার না যোগ করেই এভাবে checksum ঠিক করে নিতে পারে।
৩ · প্রধান বার্তাগুলো — type, code আর “কখন পাঠানো নিষেধ”
ICMP-এ অনেক type সংজ্ঞায়িত, কিন্তু রোজকার নেটওয়ার্কে কয়েকটিই বারবার দেখবেন। পুরো তালিকা রাখে IANA; নিচের টেবিলে সেগুলোই, যা পরীক্ষা, ইন্টারভিউ আর বাস্তব সমস্যায় আসে:
| Type / Code | নাম | কে পাঠায়, কখন |
|---|---|---|
8 / 0 → 0 / 0 | Echo Request → Echo Reply | ping; গন্তব্য যন্ত্র উত্তর দেয় |
3 / 0 | Destination Unreachable — Net Unreachable | Router: গন্তব্য নেটওয়ার্কের কোনো route নেই |
3 / 1 | Host Unreachable | শেষ router: নেটওয়ার্ক আছে, কিন্তু যন্ত্রটি সাড়া দিচ্ছে না (সাধারণত ARP-এর উত্তর আসেনি) |
3 / 2 | Protocol Unreachable | গন্তব্য যন্ত্র: IP header-এর protocol নম্বরটি সে চেনে না |
3 / 3 | Port Unreachable | গন্তব্য যন্ত্র: ওই UDP port-এ কোনো প্রোগ্রাম শুনছে না |
3 / 4 | Fragmentation Needed and DF Set | Router: packet পরের link-এর MTU-র চেয়ে বড়, অথচ “টুকরো করা যাবে না” (DF) বিট দেওয়া — Path MTU Discovery-র ভিত্তি (অংশ ৬) |
3 / 13 | Communication Administratively Prohibited | Router বা firewall: নিয়ম অনুযায়ী আটকানো (RFC 1812); অনেক firewall অবশ্য কিছু না জানিয়েই ফেলে দেয় |
11 / 0 | Time Exceeded — TTL exceeded in transit | Router: TTL কমিয়ে ০ হয়েছে — traceroute-এর ভিত্তি |
11 / 1 | Fragment Reassembly Time Exceeded | গন্তব্য যন্ত্র: সব টুকরো সময়মতো আসেনি, জোড়া লাগানো গেল না |
5 / 0–3 | Redirect | Router: একই LAN-এর host-কে “এই গন্তব্যে অন্য router ভালো” জানায় |
12 / 0–2 | Parameter Problem | Router বা host: header-এ এমন ভুল যা অন্য কোনো type-এ পড়ে না; Pointer ঘর দেখায় কোন বাইটে গোলমাল |
Type ৩ (Destination Unreachable)-এর code দেখেই বোঝা যায় packet কত দূর গিয়েছিল: code ০ — পথের মাঝে, ১ — গন্তব্যের LAN পর্যন্ত, ২ ও ৩ — যন্ত্রটি পর্যন্ত।
পুরোনো আর বাতিল বার্তা
কয়েকটি type ইতিহাসে আছে, কিন্তু আজ ব্যবহার করা উচিত নয়। Source Quench (type ৪) দিয়ে ব্যস্ত router প্রেরককে “ধীরে” বলত; এটি অকার্যকর আর জাল বার্তায় অপব্যবহারযোগ্য ছিল, TCP-র congestion control (পর্ব ৩২) কাজটি অনেক ভালো করে, তাই RFC 6633 (২০১২) একে বাতিল করেছে। Information Request/Reply (১৫/১৬) আর Address Mask Request/Reply (১৭/১৮) বহু আগেই DHCP-র মতো ব্যবস্থার কাছে জায়গা হারিয়েছে, আর RFC 6918 (২০১৩) সেগুলোসহ আরও কিছু type বাতিল ঘোষণা করেছে। Timestamp Request/Reply (১৩/১৪) RFC 6918-এর তালিকায় নেই, তাই এখনো আনুষ্ঠানিকভাবে বাতিল নয়, কিন্তু খুব কম ব্যবহৃত, আর ঘড়ির তথ্য ফাঁস করে বলে সাধারণত বাইরের দিকে বন্ধ রাখা হয়।
কখন ICMP ত্রুটির বার্তা পাঠানো নিষেধ
একটি ত্রুটি থেকে যদি আরেকটি ত্রুটির খবর, তা থেকে আরেকটি — এভাবে চলতে থাকে, তবে নেটওয়ার্ক বার্তার বন্যায় ডুবে যাবে। তাই RFC 1122 আর RFC 1812 কয়েকটি কড়া নিয়ম দিয়েছে। ICMP ত্রুটির বার্তা পাঠানো হবে না, যদি সমস্যার packet-টি:
- নিজেই একটি ICMP ত্রুটির বার্তা হয় — ত্রুটির খবরের ত্রুটি নেই, নইলে অসীম চক্র। (তবে Echo-র মতো query-র ক্ষেত্রে ত্রুটির খবর যায় — এজন্যই
tracert-এর ICMP Echo probe-এর জন্য Time Exceeded আসে।) - Broadcast বা multicast ঠিকানায় (বা link স্তরের broadcast হিসেবে) এসেছে — নইলে একটি packet-এর জবাবে শত শত যন্ত্র একসাথে ত্রুটি পাঠাত।
- একটি fragment, যা প্রথম টুকরো নয় — শুধু প্রথম টুকরোতেই transport header (port) থাকে, তাই পরের টুকরোর জন্য খবর পাঠালে প্রেরক চিনতেই পারত না, আর একটি packet-এর জন্য অনেক খবর যেত। (Fragmentation পর্ব ১৬-তে।)
- এমন উৎস-ঠিকানা থেকে আসে, যা একটি নির্দিষ্ট host নয় — যেমন
0.0.0.0, loopback, broadcast বা multicast ঠিকানা।
এর ওপর আধুনিক router আর OS ICMP পাঠানোর হার সীমিত রাখে (rate limiting) — RFC 1812 এটি অনুমোদন করে, আর ICMPv6-এর RFC 4443 তো বাধ্যতামূলক করেছে। এই হার-সীমা traceroute পড়ার সময় বড় ভূমিকা রাখে (অংশ ৫)।
এবার একটি সম্পূর্ণ ঘটনা ধাপে ধাপে দেখুন: একটি ল্যাপটপ একটি সার্ভারের এমন UDP port-এ ডেটা পাঠাল, যেখানে কেউ শুনছে না।
- ল্যাপটপ
192.168.0.105UDP port 50000 - সার্ভার
192.0.2.20port 9999-এ কেউ নেই - ICMP 3/3
192.0.2.20 → 192.168.0.105Port Unreachable - প্রেরকের kernel
ECONNREFUSEDসঠিক socket-কে জানায়
- Datagram রওনা দিল। ল্যাপটপের একটি প্রোগ্রাম UDP দিয়ে ৫ বাইট (
hello) পাঠাল সার্ভারের ৯৯৯৯ port-এ। UDP header ৮ বাইট, তাই UDP length ৮ + ৫ = ১৩. IP header-এর protocol ঘরে ১৭ (UDP), TTL ৬৪ — Linux-এর ডিফল্ট শুরুর মান। UDP-তে কোনো handshake নেই, তাই পাঠানোর আগে কেউ জানে না অন্য প্রান্তে কেউ আছে কি না। - সার্ভারে পৌঁছাল, কিন্তু কেউ নেই। পথে ৮টি router TTL ৮ কমিয়েছে (৬৪ → ৫৬)। সার্ভারের IP স্তর protocol ১৭ দেখে packet UDP-র হাতে দিল। UDP খুঁজল — ৯৯৯৯ port-এ কোনো socket bind করা আছে? নেই। TCP হলে এখানে সার্ভার একটি RST পাঠাত (পর্ব ২৯); UDP-র নিজের এমন কোনো উপায় নেই, তাই সে ICMP-এর সাহায্য নেয়।
- ICMP Port Unreachable তৈরি। সার্ভারের kernel একটি নতুন IP packet বানাল: উৎস নিজে, গন্তব্য মূল প্রেরক, protocol ১. ভেতরে ICMP type ৩, code ৩, আর ডেটা অংশে মূল packet-এর IP header (যেভাবে পৌঁছেছিল, TTL ৫৬ সহ) আর তার পরের ৮ বাইট — অর্থাৎ পুরো UDP header, port দুটিসহ। এটিই সেই “ফেরত খাম”।
- প্রেরক খবরটি ঠিক জায়গায় পৌঁছায়। ল্যাপটপের kernel ICMP বার্তাটি খুলে উদ্ধৃত অংশ পড়ে: protocol ১৭, port ৫০০০০ → ৯৯৯৯. এই চারটি তথ্য (দুই ঠিকানা, দুই port) মিলিয়ে সে খুঁজে পায় কোন UDP socket-এর packet ছিল। Socket-টি
connect()করা থাকলে Linux পরেরrecv()-এECONNREFUSEDদেয় — UDP-তেও “Connection refused”! (প্রোগ্রামিংয়ের দিক পর্ব ৪২-এ।) - ICMP না এলে কী? Firewall datagram নিঃশব্দে ফেলে দিতে পারে, সার্ভার ICMP-র হার সীমিত রাখে, আর broadcast-এ পাঠানো datagram-এর জন্য ত্রুটি যায়ই না। তখন প্রেরক কিছুই জানে না — শুধু অপেক্ষা করে, শেষে timeout. তাই UDP-তে “উত্তর এলো না” মানে “বন্ধ” নয়; হয় বন্ধ, নয় আটকানো, নয় হারানো।
৪ · ping ভেতর থেকে — RTT, loss, mdev আর TTL-এর ইঙ্গিত
পর্ব ৬-এ ping চালানো আর তার আউটপুট পড়া শিখেছেন, আর পর্ব ৫-এ দেখেছেন RTT-এর ভেতরে কোন কোন delay লুকিয়ে থাকে। এখানে দেখব ping আসলে কী করে। প্রতি সেকেন্ডে একটি Echo Request, sequence প্রতিবার ১ বেশি; উত্তর এলে identifier আর sequence মিলিয়ে “এখনের সময় − পাঠানোর সময়” = RTT; শেষে পরিসংখ্যান।
শেষ লাইনের চারটি সংখ্যা
Linux-এর ping (iputils) শেষে ছাপে rtt min/avg/max/mdev. প্রথম তিনটি সোজা — সবচেয়ে কম, গড়, সবচেয়ে বেশি। চতুর্থটি mdev: নাম “mean deviation” শোনালেও iputils আসলে হিসাব করে population standard deviation:
অর্থাৎ RTT-গুলো গড়ের চারপাশে কতটা ছড়িয়ে আছে — jitter-এর একটি মাপ। মাত্র একটি দেরিতে আসা উত্তর mdev অনেক বাড়িয়ে দিতে পারে, কারণ বিচ্যুতি বর্গ করা হয়। আর packet loss-এর হিসাব: (পাঠানো − পাওয়া) ÷ পাঠানো × ১০০. খেয়াল করুন, Linux-এর ping হারানো packet-এর জন্য কোনো লাইন ছাপে না — শুধু icmp_seq-এ একটি ফাঁক থাকে। নিচের simulator ঠিক iputils-এর মতো করে হিসাব করে — microsecond-এর পূর্ণসংখ্যায়, যেভাবে আসল প্রোগ্রাম করে। “চালান” চাপুন, তারপর rtt তালিকায় সংখ্যা বদলে বা null যোগ করে দেখুন:
// ping statistics, computed the way Linux iputils ping does (integer microseconds)
const target = "192.0.2.10", ttl = 56;
const rtt = [38.204, 37.912, null, 39.871, 51.204, 38.533, null, 38.090, 41.577, 39.012]; // ms, null = lost
function fmt(ms) { // iputils prints fewer decimals for bigger times
return ms >= 100 ? ms.toFixed(0) : ms >= 10 ? ms.toFixed(1) : ms >= 1 ? ms.toFixed(2) : ms.toFixed(3);
}
const us = []; // received RTTs in microseconds
console.log(`PING ${target} (${target}) 56(84) bytes of data.`);
rtt.forEach((t, i) => {
if (t === null) return; // a lost reply prints nothing: look for the gap in icmp_seq
us.push(Math.round(t * 1000));
console.log(`64 bytes from ${target}: icmp_seq=${i + 1} ttl=${ttl} time=${fmt(t)} ms`);
});
const n = us.length, sent = rtt.length;
const sum = us.reduce((a, b) => a + b, 0), sum2 = us.reduce((a, b) => a + b * b, 0);
const avg = Math.floor(sum / n);
const variance = Math.floor((sum2 - Math.floor(sum * sum / n)) / n); // E[x^2] - E[x]^2
const mdev = Math.floor(Math.sqrt(variance));
const ms3 = x => (x / 1000).toFixed(3);
console.log(`\n--- ${target} ping statistics ---`);
console.log(`${sent} packets transmitted, ${n} received, ${+((sent - n) * 100 / sent).toPrecision(6)}% packet loss, time ${(sent - 1) * 1000 + 9}ms`);
console.log(`rtt min/avg/max/mdev = ${ms3(Math.min(...us))}/${ms3(avg)}/${ms3(Math.max(...us))}/${ms3(mdev)} ms`);
console.log(`\ncheck: sum=${sum} us, mean=${(sum / n).toFixed(1)} us, mdev=${mdev} us (population std. dev.)`);
console.log(`Windows ping would say: Lost = ${sent - n} (${Math.floor((sent - n) * 100 / sent)}% loss), ` +
`Minimum = ${Math.round(Math.min(...us) / 1000)}ms, Maximum = ${Math.round(Math.max(...us) / 1000)}ms, Average = ${Math.round(sum / n / 1000)}ms`);আসল রানের আউটপুট:
PING 192.0.2.10 (192.0.2.10) 56(84) bytes of data.
64 bytes from 192.0.2.10: icmp_seq=1 ttl=56 time=38.2 ms
64 bytes from 192.0.2.10: icmp_seq=2 ttl=56 time=37.9 ms
64 bytes from 192.0.2.10: icmp_seq=4 ttl=56 time=39.9 ms
64 bytes from 192.0.2.10: icmp_seq=5 ttl=56 time=51.2 ms
64 bytes from 192.0.2.10: icmp_seq=6 ttl=56 time=38.5 ms
64 bytes from 192.0.2.10: icmp_seq=8 ttl=56 time=38.1 ms
64 bytes from 192.0.2.10: icmp_seq=9 ttl=56 time=41.6 ms
64 bytes from 192.0.2.10: icmp_seq=10 ttl=56 time=39.0 ms
--- 192.0.2.10 ping statistics ---
10 packets transmitted, 8 received, 20% packet loss, time 9009ms
rtt min/avg/max/mdev = 37.912/40.550/51.204/4.182 ms
check: sum=324403 us, mean=40550.4 us, mdev=4182 us (population std. dev.)
Windows ping would say: Lost = 2 (20% loss), Minimum = 38ms, Maximum = 51ms, Average = 41ms
ফাঁক খুঁজুন: icmp_seq ৩ আর ৭ নেই — ওই দুটি উত্তর আসেনি, তাই ১০টির মধ্যে ৮টি পাওয়া, loss (১০ − ৮) ÷ ১০ = ২০%. প্রতিটি লাইনের সময় এক দশমিকে, কারণ iputils ১০ ms-এর বেশি সময় এক দশমিকে আর ১০০ ms-এর বেশি পূর্ণসংখ্যায় ছাপে। time 9009ms এখানে একটি অনুমান (প্রতি সেকেন্ডে একটি packet ধরে); আসল ping মাপা সময় ছাপে।
পরিসংখ্যান হাতে মেলান: আটটি RTT-র যোগফল ৩২৪,৪০৩ µs, গড় ৪০,৫৫০.৪ → ছাপা হয়েছে 40.550 (পূর্ণসংখ্যা µs-এ কেটে)। min 37.912, max 51.204. আর mdev 4.182 ms — বেশ বড়, অথচ আটটির মধ্যে সাতটিই ৩৮–৪২ ms-এর ঘরে! কারণ একটিই — ৫ নম্বরের ৫১.২ ms. গড় থেকে এর বিচ্যুতি প্রায় ১০.৬৫, বর্গ প্রায় ১১৩. তালিকা থেকে 51.204 সরিয়ে আবার চালালে দেখবেন mdev এক ms-এর আশপাশে নেমে আসে। তাই mdev দেখে “নেটওয়ার্ক অস্থির” বলার আগে প্রতিটি লাইনও দেখুন।
Windows দেখায় পূর্ণ মিলিসেকেন্ডে, mdev ছাড়া; শেষ লাইনটি তার একটি আনুমানিক রূপ (আসল গোল করার নিয়ম একটু আলাদা হতে পারে)।
উত্তরের TTL থেকে অনুমান — সাবধানে
উত্তরের ttl=56 দেখে পর্ব ৬-এ hop গুনেছিলেন: প্রচলিত শুরুর মান ৬৪ (Linux, macOS, Android), ১২৮ (Windows), ২৫৫ (অনেক router আর নেটওয়ার্ক যন্ত্র) — উত্তরের TTL-এর ঠিক ওপরের মানটিকে শুরু ধরে বিয়োগ করলে ফেরার পথের router-সংখ্যার অনুমান মেলে, আর শুরুর মানটি OS-এর একটি দুর্বল ইঙ্গিত দেয়। দুর্বল, কারণ শুরুর মান বদলানো যায় (net.ipv4.ip_default_ttl), পথের load balancer বা firewall নিজেই উত্তর দিতে পারে, আর ফেরার পথ আলাদা হতে পারে — এটি সূত্র, প্রমাণ নয়।
“Request timed out” বনাম “Destination host unreachable”
এই দুটি বার্তা দেখতে কাছাকাছি, কিন্তু মানে সম্পূর্ণ আলাদা — আর নতুনরা প্রায়ই গুলিয়ে ফেলেন। নিচের উদাহরণগুলো একটি বাসার LAN-এর (Windows আর Linux; চালানো নয়, উদাহরণ):
PS> ping 192.0.2.99 # দূরের ঠিকানা, উত্তর আসে না
Pinging 192.0.2.99 with 32 bytes of data:
Request timed out.
Request timed out.
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
PS> ping 192.168.0.77 # নিজের LAN-এ, কিন্তু ওই ঠিকানায় কোনো যন্ত্র নেই
Pinging 192.168.0.77 with 32 bytes of data:
Reply from 192.168.0.105: Destination host unreachable.
Reply from 192.168.0.105: Destination host unreachable.
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),$ ping -c 3 192.168.0.77
PING 192.168.0.77 (192.168.0.77) 56(84) bytes of data.
From 192.168.0.105 icmp_seq=1 Destination Host Unreachable
From 192.168.0.105 icmp_seq=2 Destination Host Unreachable
From 192.168.0.105 icmp_seq=3 Destination Host Unreachable
--- 192.168.0.77 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2030ms
$ ping -c 2 192.0.2.200
PING 192.0.2.200 (192.0.2.200) 56(84) bytes of data.
From 198.51.100.1 icmp_seq=1 Destination Net Unreachable- Request timed out (Linux-এ কোনো লাইনই আসে না) — Echo গেছে, কিন্তু নির্দিষ্ট সময়ে (Windows-এ ডিফল্ট ৪ সেকেন্ড) কোনো উত্তর বা ত্রুটির খবর আসেনি। গন্তব্য বন্ধ, firewall, না পথে হারানো — নিশ্চিত নয়।
- Destination host unreachable — নিজের ঠিকানা থেকে (
192.168.0.105) — খবরটি দিয়েছে আপনার নিজের কম্পিউটার! গন্তব্য একই LAN-এ, তাই আপনার যন্ত্র ARP দিয়ে তার MAC খুঁজেছিল, কয়েকবার চেষ্টায় কোনো উত্তর পায়নি, তাই packet পাঠাতেই পারেনি (ARP পর্ব ১৮-তে)। মানে: ওই ঠিকানায় এখন কোনো যন্ত্র চালু নেই বা LAN-এ যুক্ত নেই। লক্ষ করুন, Windows এই “Reply”-গুলোকে পাওয়া উত্তর গুনে0% lossদেখায় — একটি বিখ্যাত বিভ্রান্তি। - অন্য কারও ঠিকানা থেকে Unreachable (
From 198.51.100.1 … Net Unreachable) — পথের একটি router জানাচ্ছে তার কাছে ওই নেটওয়ার্কের কোনো route নেই। এবার সমস্যা আপনার যন্ত্রে নয়, ওই router-এর routing-এ; আর খবরদাতার ঠিকানাই বলে দেয় কোথায় খুঁজতে হবে।
৫ · traceroute ভেতর থেকে — TTL, তিনটি probe আর তিন রকম পদ্ধতি
traceroute-এর মূল কৌশল পর্ব ৬-এ দেখেছেন: TTL ১ দিয়ে শুরু, প্রতিবার ১ বাড়ানো, আর যে router-এ TTL ০ হয় সে ICMP Time Exceeded পাঠায় — তার উৎস-ঠিকানাই সেই hop. Linux-এর traceroute ডিফল্টভাবে UDP probe পাঠায়, গন্তব্য port ৩৩৪৩৪ থেকে শুরু করে প্রতিটি probe-এ ১ বাড়িয়ে, আর প্রতি TTL-এ তিনটি probe. ধাপে ধাপে দেখুন — পথে দুটি router, তারপর গন্তব্য:
- ল্যাপটপ
192.168.0.105src port 45012 - hop ১ — R1
192.168.0.1বাসার router - hop ২ — R2
198.51.100.1ISP-এর router - hop ৩ — গন্তব্য
192.0.2.10port 33440-এ কেউ নেই
| probe | |
| কোথায় থামল | |
| ফেরত ICMP | |
| উদ্ধৃত dst port |
- TTL ১, port ৩৩৪৩৪. প্রথম probe পৌঁছায় R1-এ। Router forward করার আগে TTL দেখে: ১ মানে আর এগোনো যাবে না। সে packet ফেলে দেয় আর ল্যাপটপকে পাঠায় ICMP type ১১, code ০ — উৎস-ঠিকানা
192.168.0.1. বার্তার ভেতরে উদ্ধৃত থাকে probe-এর IP header আর UDP header, যেখানে লেখা dst port33434. traceroute জানে কোন port কোন probe-এর, কখন পাঠানো — তাই সে বলতে পারে এটি probe #১-এর উত্তর, RTT ১.২৮৪ ms. - TTL ২, port ৩৩৪৩৭. TTL ১-এর তিনটি probe (৩৩৪৩৪, ৩৩৪৩৫, ৩৩৪৩৬) শেষ, তাই TTL ২-এর প্রথম probe-এর port ৩৩৪৩৭. R1 TTL ২ থেকে ১ করে পাঠিয়ে দেয়; R2-তে TTL ১, সে ফেলে দিয়ে Time Exceeded পাঠায়
198.51.100.1থেকে। Port আলাদা থাকায় দেরিতে আসা পুরোনো উত্তরও ভুল লাইনে বসে না। - TTL ৩, port ৩৩৪৪০ — গন্তব্যে। R1 আর R2 দুজনেই TTL কমায় (৩ → ২ → ১), আর packet TTL ১ নিয়ে গন্তব্যে পৌঁছায়। গন্তব্য যন্ত্র নিজেই packet-এর প্রাপক, তাই TTL-এর পরীক্ষা তার জন্য প্রযোজ্য নয় — TTL শুধু forward করার সময় দেখা হয়। packet UDP-র হাতে যায়, ৩৩৪৪০-এ কেউ শুনছে না, ফলে আসে type ৩, code ৩ — Port Unreachable. এজন্যই traceroute এত উঁচু, সাধারণত অব্যবহৃত port বাছে।
- প্রতি hop-এ তিনটি সময় কেন। প্রতিটি TTL-এ তিনটি আলাদা probe, তাই তিনটি RTT — একটি মাপের ওপর ভরসা না করে ওঠানামা দেখা যায়। কোনো probe-এর উত্তর ডিফল্ট সময়ের (কয়েক সেকেন্ড) মধ্যে না এলে তার জায়গায়
*বসে। আর তিনটি probe আলাদা port-এ যায় বলে load balancing-এর নেটওয়ার্কে তারা আলাদা পথেও যেতে পারে — তখন একই লাইনে দুটি ভিন্ন router-এর ঠিকানা দেখা যায়। - থামার নিয়ম। গন্তব্য থেকে Port Unreachable আসামাত্র traceroute বোঝে আর এগোনোর দরকার নেই — সে থামে। গন্তব্য যদি ICMP না পাঠায় (firewall), তবে traceroute থামার সংকেত পায় না, আর ৩০ hop (ডিফল্ট সর্বোচ্চ) পর্যন্ত
* * *লাইন ছাপতে থাকে। মোট এখানে ৯টি probe: ৬টির উত্তর Time Exceeded, শেষ ৩টির Port Unreachable.
তিন রকম probe — UDP, ICMP আর TCP
| পদ্ধতি | কে ব্যবহার করে | গন্তব্য থেকে কী আসে | কখন কাজে লাগে |
|---|---|---|---|
| UDP, উঁচু port (৩৩৪৩৪ থেকে) | Linux আর macOS-এর traceroute-এর ডিফল্ট | ICMP 3/3 Port Unreachable | সাধারণ ক্ষেত্রে; কিন্তু অনেক firewall অচেনা UDP আটকায় |
| ICMP Echo Request | Windows tracert; Linux-এ traceroute -I | ICMP 0/0 Echo Reply | যেখানে Echo চলে কিন্তু UDP আটকানো |
| TCP SYN (যেমন port ৪৪৩) | Linux-এ traceroute -T (root লাগে), tcptraceroute | TCP SYN-ACK (port খোলা) বা RST (বন্ধ) | ওয়েব সার্ভারের সামনের firewall পার হতে — সেই port তো খোলা থাকেই |
তিন পদ্ধতিতেই মাঝের router-দের উত্তর একই — Time Exceeded; আলাদা শুধু শেষের সংকেত। আরেকটি সূক্ষ্মতা: Linux-এ ছোট একটি বিকল্প tracepath (iputils), যা root ছাড়াই UDP দিয়ে পথ খোঁজে আর সাথে path MTU-ও জানায় (অংশ ৬)।
traceroute পড়ার চারটি ফাঁদ
* * *মানেই ভাঙা নয়। কোনো router Time Exceeded পাঠায় না (নীতি বা firewall), তবু packet ঠিকই forward করে। পরের hop-গুলো উত্তর দিলে সেটিই প্রমাণ যে পথ চালু।- Asymmetric পথ। traceroute শুধু যাওয়ার পথ দেখায়। কিন্তু প্রতিটি RTT-তে ফেরার পথও ঢোকে, আর ইন্টারনেটে ফেরার পথ প্রায়ই আলাদা (asymmetric routing) — প্রতিটি নেটওয়ার্ক নিজের নীতিতে পথ বাছে (BGP, পর্ব ২৫)। ফলে কোনো hop-এর RTT এমন একটি ফেরার পথের প্রভাব বহন করতে পারে, যা তালিকায় নেই-ই।
- MPLS-এ লুকানো hop. অনেক ISP-এর ভেতরের নেটওয়ার্ক MPLS-এ চলে। প্রবেশের router যদি IP-র TTL MPLS label-এ না বসায় (TTL propagation বন্ধ), তবে ভেতরের router-রা traceroute-এ অদৃশ্য — কয়েকটি hop মিলে একটি মনে হয়।
- মাঝের hop ধীর, অথচ শেষটা দ্রুত — rate limiting. এটিই সবচেয়ে প্রচলিত ভুল ব্যাখ্যা। নিচের simulator-এ দেখুন।
Router packet forward করে বিশেষ হার্ডওয়্যারে (data plane), কিন্তু ICMP বানায় সাধারণ CPU-তে — control plane-এ, কম অগ্রাধিকারে আর হার সীমিত রেখে (rate limiting), যাতে কেউ TTL-ফুরানো packet-এর বন্যায় CPU দখল করতে না পারে। ফল: hop-এর নিজের উত্তর ধীর, অথচ তাকে পার হওয়া packet দ্রুত। নিচের simulator একটি নির্দিষ্ট পথে traceroute চালায় — একটি hop নীরব, একটি hop ধীর আর হার-সীমিত — আর শেষে প্রতিটি লাইনের ব্যাখ্যা ছাপে:
// traceroute simulator: UDP probes with TTL 1, 2, 3 ..., three probes per TTL
const path = [ // ms = one-way delay to this router; cpu = extra time its CPU takes to reply
{ ip: "192.168.0.1", ms: 0.6 },
{ ip: "198.51.100.1", ms: 2.1 },
{ ip: "198.51.100.9", ms: 3.0, silent: true }, // never sends Time Exceeded
{ ip: "203.0.113.5", ms: 17.4, cpu: 45, limit: 2 }, // slow, max 2 ICMP per burst
{ ip: "203.0.113.77", ms: 18.6 },
{ ip: "192.0.2.10", ms: 18.9, dest: true }, // the target host
];
const wobble = [0.12, -0.08, 0.21, 0.03, -0.15, 0.09]; // fixed jitter: repeatable output
let port = 33434, k = 0;
const notes = [];
console.log("traceroute to 192.0.2.10 (192.0.2.10), 30 hops max, 60 byte packets");
for (let ttl = 1; ttl <= 30; ttl++) {
const r = path[ttl - 1]; // a probe sent with TTL = n dies (or arrives) at hop n
const parts = []; let sent = 0;
for (let p = 0; p < 3; p++, port++) {
if (r.silent || (r.limit && sent >= r.limit)) { parts.push("*"); continue; }
if (sent++ === 0) parts.push(r.ip);
parts.push((2 * r.ms + (r.cpu || 0) + wobble[k++ % 6] + 0.3 * p).toFixed(3) + " ms");
}
console.log(String(ttl).padStart(2) + " " + (sent ? parts.join(" ") : "* * *"));
notes.push(ttl + ": " + (r.silent ? "no reply at all (ICMP filtered/disabled); later hops answer, so packets DO pass"
: r.dest ? "ICMP 3/3 Port Unreachable from the target itself (dst ports 33434.." + (port - 1) + ") -> stop"
: r.limit ? "ICMP 11/0, slow + one probe unanswered: rate limit on the router CPU, later hops fine"
: "ICMP 11/0 Time Exceeded from " + r.ip));
if (r.dest) break;
}
console.log("--- explanation ---\n" + notes.join("\n"));আসল রানের আউটপুট:
traceroute to 192.0.2.10 (192.0.2.10), 30 hops max, 60 byte packets
1 192.168.0.1 1.320 ms 1.420 ms 2.010 ms
2 198.51.100.1 4.230 ms 4.350 ms 4.890 ms
3 * * *
4 203.0.113.5 79.920 ms 80.020 ms *
5 203.0.113.77 37.410 ms 37.530 ms 37.650 ms
6 192.0.2.10 37.890 ms 38.220 ms 38.320 ms
--- explanation ---
1: ICMP 11/0 Time Exceeded from 192.168.0.1
2: ICMP 11/0 Time Exceeded from 198.51.100.1
3: no reply at all (ICMP filtered/disabled); later hops answer, so packets DO pass
4: ICMP 11/0, slow + one probe unanswered: rate limit on the router CPU, later hops fine
5: ICMP 11/0 Time Exceeded from 203.0.113.77
6: ICMP 3/3 Port Unreachable from the target itself (dst ports 33434..33451) -> stop
লাইন ৪-এর দিকে তাকান: প্রায় ৮০ ms, আর তৃতীয় probe-এর জায়গায় *. প্রথম দেখায় মনে হয় “এখানে জ্যাম, এখানে packet হারাচ্ছে”। কিন্তু লাইন ৫ আর ৬-এ মাত্র ~৩৮ ms, কোনো * নেই — hop ৪ পার হওয়া packet দ্রুত আর অক্ষত, তাই forward-এ সমস্যা নেই; শুধু তার নিজের ICMP উত্তর ধীর (CPU-তে ~৪৫ ms) আর দফায় দুটির বেশি নয়। নিয়মটি মনে রাখুন: delay বা loss যে hop থেকে শুরু হয়ে গন্তব্য পর্যন্ত টিকে থাকে, সেখানেই আসল সমস্যা; যা পরের hop-এ মিলিয়ে যায়, তা প্রায় সবসময় ICMP-র rate limit বা কম অগ্রাধিকার।
লাইন ৩-এর * * *: router-টি কোনো Time Exceeded পাঠায়নি, কিন্তু লাইন ৪ থেকে উত্তর আসছে — অর্থাৎ packet তাকে পার হচ্ছে। শেষ লাইনে গন্তব্য Port Unreachable দিয়েছে, তাই traceroute থেমেছে; ৬টি TTL × ৩টি probe = ১৮টি probe, port ৩৩৪৩৪ থেকে ৩৩৪৫১. path-এ hop ৪-এর cpu মান ০ করে চালিয়ে দেখুন — “জ্যাম” উধাও।
বিরতিহীন সমস্যা খুঁজতে একবারের traceroute যথেষ্ট নয়। mtr (Linux, macOS) পথের প্রতিটি hop-এ বারবার probe পাঠিয়ে প্রতি hop-এর loss % আর RTT-এর হিসাব জীবন্ত দেখায়; Windows-এর pathping প্রথমে পথ খুঁজে তারপর প্রতিটি hop-এ কিছুক্ষণ ধরে মেপে একই রকম সারাংশ দেয়। পড়ার নিয়ম একই — নিচের উদাহরণে hop ৪-এর ৩৮% loss পরের কোনো hop-এ নেই, তাই সেটি আসল loss নয়:
$ mtr -rwnc 100 192.0.2.10
HOST: laptop Loss% Snt Last Avg Best Wrst StDev
1.|-- 192.168.0.1 0.0% 100 1.4 1.5 1.1 3.2 0.3
2.|-- 198.51.100.1 0.0% 100 4.3 4.6 4.0 9.8 0.7
3.|-- ??? 100.0% 100 0.0 0.0 0.0 0.0 0.0
4.|-- 203.0.113.5 38.0% 100 80.1 81.0 79.6 95.2 2.1
5.|-- 203.0.113.77 0.0% 100 37.5 37.7 37.2 40.1 0.4
6.|-- 192.0.2.10 0.0% 100 38.0 38.3 37.8 41.0 0.5
PS> tracert -d 192.0.2.10 # Windows: ICMP Echo probe, সময় পূর্ণ ms-এ
1 1 ms 1 ms 2 ms 192.168.0.1
2 4 ms 4 ms 5 ms 198.51.100.1
3 * * * Request timed out.
4 80 ms 80 ms * 203.0.113.5
5 37 ms 37 ms 38 ms 203.0.113.77
6 38 ms 38 ms 38 ms 192.0.2.10
Trace complete.৬ · Path MTU Discovery — “Fragmentation Needed” আর black hole
পথের প্রতিটি link-এর MTU আলাদা হতে পারে: সাধারণ Ethernet-এ ১৫০০ বাইট, PPPoE সংযোগে প্রায়ই ১৪৯২, VPN বা অন্য tunnel-এ আরও কম (header-এর জায়গা ছাড়তে হয়)। পথের সবচেয়ে ছোট MTU-ই path MTU. বড় packet ছোট link-এ ঢোকাতে IPv4 router packet টুকরো করতে পারে (fragmentation — বিস্তারিত পর্ব ১৬-তে), কিন্তু টুকরো করা ব্যয়বহুল আর একটি টুকরো হারালে পুরো packet নষ্ট। তাই আধুনিক host, বিশেষ করে TCP, packet-এ DF (Don't Fragment) বিট দিয়ে পাঠায় আর নিজেই পথের MTU শিখে নেয়। এই কৌশলের নাম Path MTU Discovery (PMTUD), RFC 1191 (১৯৯০)। আর শেখার একমাত্র উৎস — ICMP type ৩, code ৪.
RFC 1191 type ৩-এর অব্যবহৃত ৪ বাইটের শেষ ২ বাইটে একটি নতুন ঘর যোগ করেছে: Next-Hop MTU — router জানিয়ে দেয় পরের link কত বড় packet নিতে পারে। নিচে একটি ওয়েব সার্ভার একজন ব্যবহারকারীকে বড় একটি পাতা পাঠাচ্ছে, আর মাঝে একটি ১৪০০ বাইটের tunnel link:
- ওয়েব সার্ভার
203.0.113.80link MTU 1500 - R1
198.51.100.1পরের link MTU 1400 - R2
198.51.100.200tunnel-এর অন্য প্রান্ত - ব্যবহারকারী
192.0.2.55পাতা আসছে
| packet-এর আকার | |
| DF বিট | |
| জানা path MTU | |
| অবস্থা |
- বড় packet রওনা। সার্ভারের নিজের link-এর MTU ১৫০০, তাই TCP পূর্ণ আকারের segment বানায়: ২০ বাইট IP header + ২০ বাইট TCP header + ১৪৬০ বাইট ডেটা = ১৫০০. Linux TCP-র packet-এ ডিফল্টভাবে DF বিট দেয় — অর্থাৎ “পথে কেউ এটি টুকরো করবেন না; না ধরলে আমাকে জানান”।
- R1 আটকে যায়, জানায়। R1-এর পরের link (tunnel) ১৪০০-র বেশি নেয় না। DF = ১, তাই টুকরো করার অনুমতি নেই — R1 packet ফেলে দেয় আর সার্ভারকে পাঠায় ICMP type ৩, code ৪ (Fragmentation Needed and DF Set), Next-Hop MTU ঘরে ১৪০০. উদ্ধৃত অংশে মূল IP header আর TCP-র প্রথম ৮ বাইট — port ৪৪৩ → ৫১৫১৫ আর sequence number.
- সার্ভার শেখে। সার্ভারের kernel উদ্ধৃত port দেখে TCP সংযোগটি চেনে, আর ওই গন্তব্যের জন্য path MTU ১৪০০ মনে রাখে (Linux-এ route cache-এ, ডিফল্টভাবে ৬০০ সেকেন্ড পর্যন্ত —
ip route get 192.0.2.55-এmtu 1400দেখা যায়)। TCP এখন segment-এর ডেটা ১৪০০ − ৪০ = ১৩৬০ বাইটে নামায় আর হারানো ডেটা আবার পাঠায়। - এবার পার হয়। ১৪০০ বাইটের packet tunnel-এ ঢুকে যায়, R2 হয়ে ব্যবহারকারীর কাছে পৌঁছায়। খরচ মাত্র একটি ICMP বার্তা আর একবার পুনরায় পাঠানো; মেয়াদ শেষে সার্ভার আবার বড় packet চেষ্টা করে।
- Black hole — ICMP আটকালে। এবার ধরুন সার্ভারের দিকে কোনো firewall “নিরাপত্তার জন্য” সব ICMP ফেলে দেয়। R1 ঠিকই type ৩, code ৪ পাঠায়, কিন্তু তা সার্ভারে পৌঁছায় না। সার্ভার ভাবে packet হারিয়েছে, আবার ১৫০০ পাঠায় — আবার হারায়, চিরকাল। TCP handshake (ছোট packet) ঠিক চলে, ছোট অনুরোধও যায়, কিন্তু বড় পাতা বা ফাইল আটকে থাকে। এটিই PMTUD black hole — সবচেয়ে বিভ্রান্তিকর নেটওয়ার্ক সমস্যার একটি, কারণ “সংযোগ তো হচ্ছে!”
- প্রতিকার। প্রথম আর আসল সমাধান: firewall-এ ICMP type ৩ (বিশেষত code ৪), ১১ আর ১২ চলতে দিন। দ্বিতীয়: tunnel বা PPPoE-র router TCP-র SYN packet-এ MSS-এর মান ছোট করে লিখে দেয় (MSS clamping), যাতে দুই প্রান্ত শুরু থেকেই ছোট segment পাঠায় — শুধু TCP-তে কাজ করে। তৃতীয়: PLPMTUD — প্রেরক ICMP-র ওপর নির্ভর না করে নিজেই বিভিন্ন আকারের probe পাঠিয়ে দেখে কোনটি পৌঁছায় (RFC 4821, আর UDP-ভিত্তিক protocol-এর জন্য RFC 8899; Linux TCP-তে
net.ipv4.tcp_mtu_probing).
PMTUD black hole বাস্তবে এত প্রচলিত যে ২০০০ সালেই RFC 2923 TCP-র PMTUD সমস্যাগুলোর তালিকায় একে শীর্ষে রেখেছিল। Linux-এ tracepath দিয়ে নিজের পথের MTU দেখা যায় — উদাহরণ (চালানো নয়):
$ tracepath -n 192.0.2.55
1?: [LOCALHOST] pmtu 1500
1: 198.51.100.1 1.102ms
1: 198.51.100.1 1.054ms
2: 198.51.100.1 1.210ms pmtu 1400
2: 198.51.100.200 6.871ms
3: 192.0.2.55 7.305ms reached
Resume: pmtu 1400 hops 3 back 3IPv6-এ router কখনো packet টুকরো করে না; সেখানে একই কাজ করে ICMPv6-এর “Packet Too Big” বার্তা, আর সেটি আটকালে IPv6 ব্যবহারই অচল হয়ে পড়ে — পর্ব ২১-এ দেখবেন।
৭ · ICMP আর নিরাপত্তা — কোনটি রাখবেন, কোনটি নয়
ICMP-এর অপব্যবহারের ইতিহাস আছে, আর সেই ইতিহাস থেকেই আজকের নিয়মগুলো এসেছে। এখানে আক্রমণগুলো শুধু ধারণা হিসেবে — কীভাবে কাজ করত আর কীভাবে ঠেকানো হয়েছে।
ইতিহাস থেকে তিনটি শিক্ষা। Ping flood — অসংখ্য Echo Request পাঠিয়ে লক্ষ্যের সংযোগ বা CPU ভরিয়ে দেওয়া; এটি সাধারণ bandwidth-বন্যার একটি রূপ মাত্র। Smurf attack (১৯৯০-এর দশকের শেষ ভাগ; CERT ১৯৯৮ সালে এ নিয়ে সতর্কবার্তা দেয়) ছিল আরও চতুর: আক্রমণকারী লক্ষ্যের ঠিকানা জাল করে (IP spoofing) কোনো নেটওয়ার্কের directed broadcast ঠিকানায় Echo পাঠাত; সেই নেটওয়ার্কের সব যন্ত্র একসাথে উত্তর দিত লক্ষ্যকে — একটি packet, শত উত্তর। আর “Ping of Death” (১৯৯৬-এর দিকে) ছিল নিয়মের চেয়ে বড় টুকরো করা ICMP packet, যা জোড়া লাগাতে গিয়ে কিছু পুরোনো সিস্টেম crash করত — এটি ছিল OS-এর বাগ, যা পরে সারানো হয়।
যেভাবে ঠেকানো হয়েছে: RFC 2644 (১৯৯৯) router-দের ডিফল্টভাবে directed broadcast forward না করতে বলেছে — smurf-এর “বর্ধক” নেটওয়ার্কই আর পাওয়া যায় না। Host-রাও broadcast ঠিকানার Echo-র উত্তর দেয় না (Linux-এ icmp_echo_ignore_broadcasts = 1, ডিফল্ট)। জাল উৎস-ঠিকানা ঠেকাতে ISP-রা নিজেদের গ্রাহকের দিক থেকে আসা packet-এর উৎস যাচাই করে (ingress filtering, BCP 38 / RFC 2827). আর প্রতিটি যন্ত্র ICMP-র হার সীমিত রাখে, ISP-র প্রান্তে বন্যা-traffic ছেঁকে ফেলা হয়। বড় আকারের DDoS আর তার প্রতিরক্ষা পর্ব ৫০-এ।
Redirect — সুবিধা, কিন্তু ঝুঁকিও
Redirect (type ৫)-এর উদ্দেশ্য সৎ: এক LAN-এ দুটি router থাকলে ভুল router host-কে ঠিক router দেখিয়ে দেয়। কিন্তু একই LAN-এর কোনো দুষ্ট যন্ত্র জাল Redirect পাঠিয়ে host-এর traffic নিজের দিকে ঘুরিয়ে নিতে পারে — মাঝখানে বসে আড়ি পাতার (MITM) একটি পথ। তাই আজকের পরামর্শ: সাধারণ host-এ Redirect গ্রহণ বন্ধ, router নয় এমন যন্ত্রে পাঠানোও বন্ধ, আর নেটওয়ার্কের সীমানায় বাইরের Redirect ফেলে দেওয়া। Linux-এ এগুলো sysctl দিয়ে নিয়ন্ত্রিত হয় (উদাহরণ, নিজের যন্ত্রে root হিসেবে):
net.ipv4.conf.all.accept_redirects = 0 # Redirect মেনে route বদলাবে না
net.ipv4.conf.all.send_redirects = 0 # router না হলে Redirect পাঠাবে না
net.ipv4.icmp_echo_ignore_broadcasts = 1 # broadcast-এ পাঠানো Echo-র উত্তর নয় (ডিফল্ট)
net.ipv4.icmp_ignore_bogus_error_responses = 1“সব ICMP বন্ধ” কেন খারাপ নীতি
অনেক প্রতিষ্ঠানের firewall-এ এখনো দেখা যায় “ICMP: deny all”. “ping বন্ধ থাকলে কেউ খুঁজে পাবে না” — দুর্বল যুক্তি, কারণ খোলা TCP port (যেমন ৪৪৩) থেকেই সার্ভার চেনা যায়। অথচ দাম অনেক: PMTUD ভাঙে, নিজের দলের সমস্যা খোঁজা কঠিন হয়, UDP অ্যাপ অকারণে অপেক্ষা করে। তাই নির্দেশিকাগুলো (যেমন ICMPv6-এর জন্য RFC 4890) বেছে বেছে নিয়মের কথা বলে:
| ICMP | সাধারণ সুপারিশ (ভেতরের দিকে আসা) | কারণ |
|---|---|---|
| ৩ — Destination Unreachable (বিশেষত code ৪) | অনুমতি দিন | PMTUD আর দ্রুত ব্যর্থতার খবর |
| ১১ — Time Exceeded | অনুমতি দিন | traceroute, routing loop শনাক্ত |
| ১২ — Parameter Problem | অনুমতি দিন | header-এর ত্রুটির খবর |
| ৮ / ০ — Echo | অনুমতি, কিন্তু হার-সীমা দিয়ে (নীতিভেদে) | পর্যবেক্ষণ আর সমস্যা খোঁজা |
| ৫ — Redirect | সীমানায় বন্ধ | জাল route-এর ঝুঁকি |
| ১৩/১৪ Timestamp, বাতিল type-গুলো | বন্ধ | দরকার নেই, তথ্য ফাঁস |
Stateful firewall (পর্ব ৪৯) এ কাজ আরও সহজ করে: চলমান কোনো সংযোগের সাথে সম্পর্কিত ICMP ত্রুটিকে সে উদ্ধৃত header দেখে চেনে আর “related” হিসেবে ঢুকতে দেয় — অর্থাৎ অংশ ২-এর সেই ৮ বাইট firewall-এর কাছেও প্রমাণপত্র।
৮ · Linux-এ ICMP — ping socket, kernel-এর হিসাব আর সেটিং
ICMP-এর কোনো port নেই, তাই সাধারণ TCP/UDP socket দিয়ে Echo পাঠানো যায় না। ঐতিহ্যগতভাবে ping ব্যবহার করত raw socket — যেখানে প্রোগ্রাম নিজেই পুরো ICMP বার্তা বানায়, আর যে কোনো packet পাঠাতে ও দেখতে পারে। এত ক্ষমতা বলে raw socket-এ root লাগে (বা CAP_NET_RAW নামের capability). তাই বহু বছর ping ছিল setuid root; পরে অনেক distribution শুধু cap_net_raw দেয় (প্র ০৫-এ ইতিহাস)।
Linux 3.0 (২০১১) একটি পরিচ্ছন্ন সমাধান আনে — ping socket: socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP). এটি শুধু Echo পাঠাতে আর তার উত্তর পেতে দেয়; identifier kernel বসায়, যাতে একজন অন্যের ping-এর উত্তর পড়তে না পারে। কে এটি খুলতে পারবে, তা ঠিক করে net.ipv4.ping_group_range — দুটি সংখ্যা, group id-র একটি পরিসর। Kernel-এর ডিফল্ট 1 0 (খালি পরিসর — কেউ নয়), কিন্তু systemd-এর একটি সংস্করণ থেকে অনেক distribution এটি 0 2147483647 (সবাই) করে দেয় — আপনার যন্ত্রে কী আছে তা নিজে দেখে নিন। আধুনিক iputils-এর ping অনুমতি থাকলে ping socket ব্যবহার করে, নইলে raw socket. (macOS-এও এমন socket আছে।)
অংশ ২-এর C প্রোগ্রাম ঠিক এই কারণে EACCES পেয়েছিল। এবার bash দিয়ে একই container-এ দেখি: কোন ICMP টুল আছে, ping socket-এর অনুমতি কার, আর kernel-এর ICMP হিসাব /proc/net/snmp-এ কীভাবে বদলায়। ওই ফাইলে প্রতিটি protocol-এর দুটি লাইন — প্রথমটিতে counter-এর নাম, দ্বিতীয়টিতে মান, একই ক্রমে; স্ক্রিপ্ট দুটি লাইন জোড়া লাগিয়ে শুধু শূন্য নয় এমন counter ছাপে। মাঝখানে bash-এর নিজস্ব /dev/udp সুবিধা দিয়ে 127.0.0.1-এর ৯ নম্বর port-এ তিনটি UDP datagram পাঠানো হয় — যেখানে কেউ শোনে না। অংশ ৩-এর স্টেপার মনে আছে?
echo "== 1. tools =="
for t in ping traceroute tracepath mtr; do
command -v "$t" >/dev/null && echo " $t: আছে ($(command -v "$t"))" || echo " $t: নেই"
done
echo "== 2. ping socket permission =="
read -r lo hi < /proc/sys/net/ipv4/ping_group_range
echo " ping_group_range = $lo $hi ; my gid = $(id -g)"
if [ "$(id -g)" -ge "$lo" ] && [ "$(id -g)" -le "$hi" ]; then echo " -> ICMP datagram socket allowed"
else echo " -> ICMP datagram socket NOT allowed for this group"; fi
show() { # print only the non-zero Icmp / IcmpMsg counters (header line + value line)
awk -v want="$1" '$1 == want":" { if (!h) { split($0, n); h = 1 } else { for (i = 2; i <= NF; i++)
if ($i != 0) printf " %s %s = %s\n", want, n[i], $i } }' /proc/net/snmp
}
echo "== 3. counters before =="
show Icmp; show IcmpMsg; echo " (anything not listed is 0)"
echo "== 4. three UDP datagrams to 127.0.0.1:9 (nobody listens there) =="
for i in 1 2 3; do echo "probe $i" > /dev/udp/127.0.0.1/9; done
sleep 0.2
echo "== 5. counters after =="
show Icmp; show IcmpMsg
echo "== 6. related settings =="
for f in icmp_echo_ignore_broadcasts icmp_ratelimit icmp_ratemask ip_default_ttl; do
echo " $f = $(cat /proc/sys/net/ipv4/$f)"
doneআসল রানের আউটপুট:
== 1. tools ==
ping: নেই
traceroute: নেই
tracepath: নেই
mtr: নেই
== 2. ping socket permission ==
ping_group_range = 0 0 ; my gid = 999
-> ICMP datagram socket NOT allowed for this group
== 3. counters before ==
(anything not listed is 0)
== 4. three UDP datagrams to 127.0.0.1:9 (nobody listens there) ==
== 5. counters after ==
Icmp InMsgs = 3
Icmp InDestUnreachs = 3
Icmp OutMsgs = 3
Icmp OutDestUnreachs = 3
IcmpMsg InType3 = 3
IcmpMsg OutType3 = 3
== 6. related settings ==
icmp_echo_ignore_broadcasts = 1
icmp_ratelimit = 1000
icmp_ratemask = 6168
ip_default_ttl = 64
১ আর ২: ping, traceroute, tracepath, mtr — কোনোটিই এই container-এ নেই, আর থাকলেও বাইরে যাওয়ার ইন্টারনেট নেই। Ping socket-এর অনুমতিও নেই: পরিসর 0 0, আমাদের group ৯৯৯ — C প্রোগ্রামের EACCES-এর ব্যাখ্যা মিলে গেল। তাই এই পর্বের ping আর traceroute-এর আউটপুটগুলো simulator বা সাধারণ যন্ত্রের উদাহরণ — এখানে চালানো নয়।
৩ থেকে ৫ — নিজের চোখে Port Unreachable: শুরুতে সব ICMP counter শূন্য (তাই কিছুই ছাপা হয়নি; IcmpMsg লাইন তখন ফাইলেই ছিল না — কোনো বার্তা না থাকলে kernel সেটি লেখে না)। তিনটি datagram পাঠানোর পরে: OutDestUnreachs = 3 — kernel তিনটি Destination Unreachable পাঠিয়েছে, আর InDestUnreachs = 3 — তিনটিই পেয়েছে। দুটোই, কারণ প্রেরক আর প্রাপক একই যন্ত্র (loopback): UDP স্তর port ৯-এ কাউকে পায়নি, kernel type ৩ বানিয়ে 127.0.0.1-কে পাঠিয়েছে, আর সেটি এই kernel-এই ফিরেছে। IcmpMsg-এর OutType3/InType3 একই কথা type নম্বর ধরে বলে। তিনটিই গেছে, কারণ Linux loopback-এ ICMP-র হার-সীমা প্রয়োগ করে না।
৬ — সেটিং: icmp_ratelimit = 1000 — একই গন্তব্যে হার-সীমিত ICMP-র মধ্যে ন্যূনতম ব্যবধান, মিলিসেকেন্ডে (ছোট burst-এর অনুমতিসহ)। কোন type-গুলো হার-সীমিত, তা বলে icmp_ratemask = 6168 — একটি bitmask: ৬১৬৮ = ৪০৯৬ + ২০৪৮ + ১৬ + ৮ = বিট ১২, ১১, ৪ আর ৩ — অর্থাৎ Parameter Problem, Time Exceeded, Source Quench আর Destination Unreachable. Echo Reply (type ০) এই তালিকায় নেই। ip_default_ttl = 64 — পর্ব ৬ আর অংশ ৪-এর সেই শুরুর মান।
আরও গভীরে: Linux kernel-এ সব ICMP ত্রুটি বানায় icmp_send() (net/ipv4/icmp.c); সেখানেই অংশ ৩-এর “পাঠানো নিষেধ” নিয়মগুলো কোডে লেখা, আর হার-সীমা দুই স্তরে — প্রতিটি গন্তব্যের জন্য একটি token bucket (icmp_ratelimit), আর পুরো যন্ত্রের জন্য একটি সর্বোচ্চ হার (icmp_msgs_per_sec, icmp_msgs_burst). RFC 4884 ICMP ত্রুটির বার্তায় কাঠামোবদ্ধ “extension” যোগের নিয়ম দিয়েছে; এর একটি ব্যবহার (RFC 4950) MPLS router-কে Time Exceeded-এর সাথে নিজের label জানাতে দেয়, যা Linux-এর traceroute -e দেখাতে পারে। গবেষকরা ICMP-র হার-সীমার আচরণ মেপে router চেনা আর ইন্টারনেটের মানচিত্র তৈরির কাজও করেছেন — Paris traceroute-এর মতো টুল load balancing-এর ভুল পথ দূর করতে probe-এর flow পরিচয় স্থির রাখে।
৯ · AI-এর যুগে ICMP — উত্তর মিলিয়ে নেওয়া
“traceroute-এ hop ৭-এ ২০০ ms, ISP-কে কী বলব?” — এমন প্রশ্নে AI প্রায়ই আত্মবিশ্বাসী ভুল করে: মাঝের hop-এর delay-কে সমস্যা ধরে নেয়, “নিরাপত্তার জন্য সব ICMP বন্ধ করুন” পরামর্শ দেয়, বা ভুল type/code বলে।
| AI-এর সাধারণ ভুল | কীভাবে ধরবেন |
|---|---|
| “সব ICMP বন্ধ করুন” বা “ping বন্ধ মানেই নিরাপদ” | অংশ ৭-এর টেবিল; type ৩, ১১, ১২ রাখতে হবে — RFC 4890-এর সুপারিশ নিজে পড়ুন |
| মাঝের hop-এর বেশি RTT বা loss-কে আসল সমস্যা বলা | পরের hop আর গন্তব্যে টিকে আছে কি না দেখুন; mtr দিয়ে অনেকক্ষণ মাপুন |
| ভুল type/code (যেমন Time Exceeded-কে type ৩ বলা) বা “ping port 7 ব্যবহার করে” | IANA-র ICMP parameters তালিকা আর RFC 792 মিলিয়ে নিন; ICMP-এর port নেই |
| Checksum বা mdev-এর হাতের হিসাবে ভুল | এই পর্বের C আর JS কোডে সংখ্যা বসিয়ে আবার হিসাব করুন |
পুরোনো কমান্ড (netstat -s) বা অন্য OS-এর flag (Linux-এ tracert) | nstat, /proc/net/snmp; man traceroute, command -v |
| বানানো RFC নম্বর (“ICMP rate limit RFC 9999-এ আছে”) | rfc-editor.org-এ নম্বর খুলে শিরোনাম মেলান |
| অন্যের নেটওয়ার্কে ICMP দিয়ে “scan” বা চাপ পরীক্ষা করার পরামর্শ | শুধু নিজের, বা লিখিত অনুমতির নেটওয়ার্কে; প্রশ্নেই সীমাটি বলে দিন |
traceroute বা ping-এর সমস্যা নিয়ে AI-কে প্রশ্ন করার একটি ভালো ছাঁচ — OS, পুরো আউটপুট, আর কী চান না:
AI-এর ICMP-বিষয়ক উত্তর মানার আগে — চেকলিস্ট
পরীক্ষা ও ইন্টারভিউতে এই বিষয়ে প্রায়ই যা জিজ্ঞেস করা হয়:
- ICMP কোন স্তরের protocol, আর IP header-এ এর protocol নম্বর কত? — Network layer-এর সহকারী (IP-র অংশ), যদিও IP-র ভেতরে বহন হয়; protocol নম্বর ১.
- ICMP ত্রুটির বার্তায় মূল packet-এর কী থাকে, আর কেন? — মূল IP header আর তার পরের অন্তত ৮ বাইট; তাতে UDP/TCP-র port থাকে, তাই প্রেরক সঠিক socket বা সংযোগ চিনতে পারে।
- traceroute কীভাবে থামে বোঝে (Linux আর Windows)? — Linux-এর UDP probe-এ গন্তব্য থেকে Port Unreachable (৩/৩); Windows
tracert-এ Echo Reply (০/০)। - PMTUD black hole কী, আর লক্ষণ কী? — Fragmentation Needed (৩/৪) আটকে গেলে প্রেরক path MTU শেখে না; handshake আর ছোট অনুরোধ চলে, বড় transfer আটকে যায়।
- কোন ক্ষেত্রে ICMP ত্রুটি পাঠানো হয় না? — অন্য ICMP ত্রুটির জবাবে, broadcast/multicast গন্তব্যে, প্রথম নয় এমন fragment-এ, আর একক host নয় এমন উৎস-ঠিকানার packet-এ।
ভাবনার প্রশ্ন
প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন — তারপর “→ উত্তর” চাপুন।
প্র ০১ICMP IP packet-এর ভেতরে যায়, তবু একে transport protocol না বলে network layer-এর অংশ বলা হয় কেন? স্তরের নিয়ম কি এখানে ভাঙা হলো?
স্তরের ছবিটি (পর্ব ৩) পড়লে মনে হয় প্রতিটি protocol ঠিক একটি তাকে বসে, আর নিচের তাকের সেবা নেয়। ICMP এই ছবিতে অস্বস্তিকর: এটি IP-র সেবা নেয় (IP-র খামে চড়ে), অথচ এর কাজ IP-র নিজেরই অংশ। ১৯৮১ সালে Jon Postel যখন RFC 791 (IP) আর RFC 792 (ICMP) একসাথে প্রকাশ করেন, তখন উদ্দেশ্য ছিল ব্যবহারিক — router আর host-কে একে অন্যের সাথে “IP-র ব্যাপারে” কথা বলার একটি উপায় দেওয়া। সেই কথাবার্তার জন্য নতুন কোনো বহনব্যবস্থা বানানোর দরকার ছিল না; IP তো আছেই। তাই ICMP-কে IP-র ওপরে বসানো হলো, কিন্তু সংজ্ঞায় লেখা হলো — এটি IP-র অবিচ্ছেদ্য অংশ, প্রতিটি IP module-কে এটি বাস্তবায়ন করতেই হবে।
কেন transport নয়? Transport protocol-এর কাজ দুই প্রান্তের অ্যাপের মধ্যে ডেটা পৌঁছানো, port দিয়ে অ্যাপ আলাদা করা। ICMP কোনো অ্যাপের ডেটা বহন করে না (ping-এর payload ব্যতিক্রম, কিন্তু সেটিও পরীক্ষার জন্য), এর port নেই, আর এর বার্তা তৈরি করে মূলত router — যে transport স্তর পর্যন্ত যায়ই না। Router-এর কাছে IP আর ICMP একসাথে থাকে; TCP থাকে না। এই অর্থে ICMP network layer-এর “control plane”-এর অংশ।
আরও কিছু protocol এমন সীমানায় বসে। OSPF (পর্ব ২৪) সরাসরি IP-র ওপরে চলে (protocol ৮৯), BGP (পর্ব ২৫) তো TCP-র ওপরে — অথচ দুটোই routing, অর্থাৎ network layer-এর কাজ। ARP (পর্ব ১৮) Ethernet-এর ওপরে চলে, কিন্তু IP-র জন্য কাজ করে। এগুলো দেখায় যে স্তরের মডেল একটি চিন্তার কাঠামো, আইন নয়: কোন protocol কোন খামে চড়ে, আর সে কোন সমস্যা সমাধান করে — দুটি আলাদা প্রশ্ন। পরীক্ষায় “ICMP কোন স্তরের” প্রশ্নের প্রত্যাশিত উত্তর network layer; কিন্তু ভালো উত্তরে এই দ্বৈত চরিত্রটিও লেখা উচিত।
মূল উপলব্ধি: কোনো protocol কোন স্তরের, তা ঠিক হয় তার কাজ দিয়ে, তার খাম দিয়ে নয়। ICMP IP-র খামে চড়লেও তার কাজ IP-র নিজের সমস্যার খবর দেওয়া — তাই সে network layer-এর অংশ।
প্র ০২“নিরাপত্তার জন্য সব ICMP বন্ধ” — বহু প্রতিষ্ঠানে এই নিয়ম কেন এলো, আর এর দাম কে, কীভাবে দেয়?
১৯৯০-এর দশকের মাঝামাঝি থেকে শেষ ভাগ পর্যন্ত ICMP ছিল আক্রমণের একটি পরিচিত বাহন: Ping of Death কিছু OS-কে crash করাত, smurf আক্রমণ broadcast-এর মাধ্যমে বহুগুণ traffic বানাত, আর ping sweep দিয়ে নেটওয়ার্কের কোন ঠিকানায় যন্ত্র আছে তা খোঁজা যেত। প্রশাসকদের কাছে সহজ সমাধান মনে হলো — ICMP পুরোটাই বন্ধ।
সমস্যা হলো, এই নিয়ম আক্রমণগুলোর আসল প্রতিকার নয়। Ping of Death ছিল OS-এর বাগ, যা patch দিয়ে সারানো হয়েছে; smurf থেমেছে directed broadcast বন্ধ (RFC 2644) আর ingress filtering দিয়ে; আর কোন যন্ত্র চালু আছে তা খোলা TCP port দিয়েও বোঝা যায়। অথচ ICMP বন্ধ করার দাম বাস্তব। সবচেয়ে বড়টি PMTUD black hole: RFC 2923 (২০০০) এটিকে TCP-র PMTUD সমস্যার তালিকায় প্রথমে রেখেছিল। লক্ষণ এত অদ্ভুত যে খুঁজে পেতে দিন লাগে — সাইট খোলে কিন্তু ছবি আসে না, ইমেইল যায় কিন্তু বড় attachment আটকায়, VPN-এ সংযোগ হয় কিন্তু ফাইল share ঝুলে থাকে।
দামটা প্রায়ই দেয় অন্য কেউ। ধরুন একটি ওয়েব সার্ভারের সামনের firewall সব ICMP ফেলে দেয়। সার্ভারের ব্যবহারকারীদের যাদের পথে কোনো ছোট-MTU link আছে — PPPoE-র ব্রডব্যান্ড, VPN, মোবাইল নেটওয়ার্কের কোনো tunnel — শুধু তারাই সমস্যায় পড়েন। সার্ভারের প্রশাসক নিজের অফিস থেকে পরীক্ষা করে সব ঠিক দেখেন, কারণ তাঁর পথে MTU ১৫০০. এজন্যই অনেক ISP আর VPN প্রদানকারী নিজেরাই MSS clamping করে, অন্যের ভুল ঢাকতে।
আধুনিক নির্দেশিকা তাই বেছে নেওয়ার কথা বলে। ICMPv6-এর জন্য RFC 4890 স্পষ্ট তালিকা দিয়েছে কোন বার্তা কখনো আটকানো যাবে না (যেমন Packet Too Big), আর IPv4-এর জন্যও একই যুক্তি খাটে: type ৩, ১১, ১২ রাখুন, Echo-তে হার-সীমা দিন, Redirect আর বাতিল type সীমানায় বন্ধ করুন। Stateful firewall “related” ICMP-কে নিজেই চিনে নেয়, তাই নিয়ম লেখাও সহজ।
মূল উপলব্ধি: নিরাপত্তা মানে ঝুঁকি আর কার্যকারিতার হিসাব, অন্ধ নিষেধ নয়। কোনো কিছু বন্ধ করার আগে জানুন সেটি কী কাজ করে — নইলে আক্রমণকারীর বদলে আপনার নিজের ব্যবহারকারীরাই আটকে যাবেন।
প্র ০৩Smurf আর ping flood-এর যুগ থেকে ইন্টারনেট কী শিখল? “Amplification” ধারণাটি কেন আজও প্রাসঙ্গিক?
Smurf আক্রমণের মূল চালাকি ছিল দুটি দুর্বলতার যোগফল। প্রথমত, IP-র উৎস-ঠিকানা কেউ যাচাই করত না — যে কেউ packet-এ অন্যের ঠিকানা লিখে দিতে পারত (spoofing). দ্বিতীয়ত, অনেক router “directed broadcast” forward করত — দূরের কোনো নেটওয়ার্কের broadcast ঠিকানায় (যেমন একটি /24-এর শেষ ঠিকানা) পাঠানো packet সেই নেটওয়ার্কের সব যন্ত্রের কাছে পৌঁছে দিত। দুটি মিলিয়ে একটি Echo Request শত শত Echo Reply-তে পরিণত হতো, আর সবগুলো যেত জাল ঠিকানার আসল মালিকের দিকে। CERT ১৯৯৮ সালে এ নিয়ে সতর্কবার্তা প্রকাশ করে।
প্রতিকার এলো তিন দিক থেকে, আর এই তিনটিই আজকের ইন্টারনেট-নিরাপত্তার ভিত্তি। এক, ডিফল্ট বদল: RFC 2644 (১৯৯৯) router-দের ডিফল্টভাবে directed broadcast forward না করতে বলল, আর প্রস্তুতকারকেরা সেই ডিফল্ট মানল। দুই, host-এর আচরণ: broadcast-এ পাঠানো Echo-র উত্তর না দেওয়া (Linux-এ আজও ডিফল্ট)। তিন, উৎসে যাচাই: BCP 38 (RFC 2827, ২০০০) ISP-দের বলল, গ্রাহকের দিক থেকে এমন উৎস-ঠিকানার packet ঢুকতে দেবেন না, যা সেই গ্রাহকের নয়। শেষেরটি আজও পুরোপুরি বাস্তবায়িত নয়, আর সেটিই পরের প্রজন্মের আক্রমণের দরজা খোলা রেখেছে।
“Amplification” — ছোট অনুরোধে বড় বা অনেক উত্তর — smurf-এর পরে অন্য protocol-এ ফিরে এসেছে। DNS, NTP বা memcached-এর মতো UDP সেবার কিছু অনুরোধের উত্তর অনুরোধের চেয়ে বহুগুণ বড়; জাল উৎস-ঠিকানার সাথে মিলিয়ে এগুলো দিয়ে বিশাল DDoS হয়েছে। প্রতিকারের নীতিও সেই একই: সেবা এমনভাবে নকশা করা যাতে উত্তর অনুরোধের চেয়ে বেশি বড় না হয় বা যাচাই ছাড়া না যায়, খোলা সেবা বন্ধ রাখা, হার-সীমা, আর উৎস-ঠিকানা যাচাই। QUIC-এর মতো নতুন protocol (পর্ব ৩৩) তো শুরু থেকেই নিয়ম রেখেছে — ঠিকানা যাচাইয়ের আগে প্রাপ্ত ডেটার নির্দিষ্ট গুণিতকের বেশি পাঠানো যাবে না।
মূল উপলব্ধি: আক্রমণ থেকে টেকসই প্রতিরক্ষা আসে নিরাপদ ডিফল্ট, উৎসে যাচাই আর অনুপাতের সীমা থেকে — একটি protocol পুরো বন্ধ করে নয়। প্রতিটি নতুন protocol নকশার সময় প্রশ্ন করুন: এটি কি অন্যকে আঘাত করার “বর্ধক” হতে পারে?
প্র ০৪traceroute-এ hop ৭-এ ২০০ ms আর ৩০% loss, কিন্তু গন্তব্যে ৪০ ms আর ০% — ISP-র কাছে অভিযোগ করা কি ঠিক হবে? Router-এর ভেতরে কী ঘটছে?
না, এই তথ্য দিয়ে অভিযোগ টেকে না — আর অভিজ্ঞ নেটওয়ার্ক প্রকৌশলী এটি প্রথম দেখাতেই বুঝবেন। কারণ বুঝতে router-এর ভেতরের গঠন দেখতে হবে। আধুনিক router-এ packet forward করার কাজ হয় বিশেষ chip-এ (ASIC বা network processor), যেখানে প্রতিটি packet-এর জন্য routing সিদ্ধান্ত হার্ডওয়্যারেই নেওয়া হয় — এটি data plane, লাইনের পূর্ণ গতিতে চলে। কিন্তু যে packet-এর TTL ফুরিয়েছে, সেটির জন্য ICMP Time Exceeded বানাতে হয় — এই কাজ “ব্যতিক্রম”, তাই packet পাঠানো হয় router-এর সাধারণ CPU-তে, control plane-এ।
সেই CPU-র আসল দায়িত্ব অনেক গুরুত্বপূর্ণ: BGP আর OSPF চালানো, routing table হালনাগাদ রাখা, প্রশাসকের SSH সেশন। তাই প্রস্তুতকারকেরা control plane-কে রক্ষা করেন — ICMP বানানোর কাজ কম অগ্রাধিকারে চলে, আর একটি নীতি (Cisco-র ভাষায় control plane policing) দিয়ে সেকেন্ডে নির্দিষ্ট সংখ্যার বেশি ICMP তৈরি হয় না। ফলে ব্যস্ত সময়ে এই router-এর নিজের উত্তর দেরিতে আসে বা আসেই না — traceroute-এ দেখা যায় বেশি RTT আর loss. কিন্তু যে packet এই router দিয়ে যাচ্ছে, তা data plane-এ দ্রুত পার হয়ে যায়; তাই পরের hop আর গন্তব্য স্বাভাবিক।
আরেকটি কারণ হতে পারে ফেরার পথ। Hop ৭-এর router তার Time Exceeded যে পথে ফেরত পাঠায়, তা গন্তব্য থেকে আসা উত্তরের পথ থেকে আলাদা হতে পারে (asymmetric routing) — হয়তো সেটি একটি দীর্ঘ বা ব্যস্ত পথ।
তাহলে কখন অভিযোগ যুক্তিসংগত? যখন delay বা loss একটি hop থেকে শুরু হয়ে প্রতিটি পরের hop আর গন্তব্যেও থাকে — যেমন hop ৭ থেকে সব লাইনে +১৫০ ms আর ২০% loss. তখন mtr দিয়ে কয়েকশো probe-এর রিপোর্ট, দুই দিক থেকে traceroute (সম্ভব হলে গন্তব্য থেকেও আপনার দিকে), আর সময়ের তথ্য নিয়ে ISP-র কাছে গেলে তাঁরা কাজে লাগাতে পারবেন। অনেক ISP-র সহায়তা দল এই ধরনের mtr রিপোর্টই চান।
মূল উপলব্ধি: traceroute মাপে router-দের উত্তর দেওয়ার আচরণ, তাদের forward করার মান নয়। যা গন্তব্য পর্যন্ত টিকে থাকে না, তা সমস্যা নয় — মাপযন্ত্রের নিজস্ব ছাপ।
প্র ০৫ping-এর মতো নিরীহ একটি টুলের জন্য বহু বছর root লাগত কেন? Ping socket এই সমস্যার সমাধান কীভাবে করল, আর এর পেছনের নিরাপত্তা-নীতি কী?
Mike Muuss ১৯৮৩ সালে যখন ping লেখেন, তখন ICMP পাঠানোর একমাত্র উপায় ছিল raw socket — যেখানে প্রোগ্রাম নিজেই পুরো বার্তা বানায়, আর kernel প্রায় কোনো যাচাই করে না। Raw socket দিয়ে যে কোনো protocol-এর packet বানানো যায়, জাল উৎস-ঠিকানা দেওয়া যায় (বিশেষ বিকল্পে), অন্য প্রোগ্রামের জন্য আসা ICMP-ও পড়া যায়। এত ক্ষমতা সাধারণ ব্যবহারকারীকে দেওয়া যায় না, তাই raw socket-এ root লাগে। ফলে ping হয়ে গেল setuid root প্রোগ্রাম — যে কেউ চালালেও সেটি root-এর ক্ষমতায় চলে।
Setuid প্রোগ্রাম নিরাপত্তার জন্য সবসময় দুর্বল জায়গা: এর কোডে একটি buffer overflow মানেই সাধারণ ব্যবহারকারী থেকে root হওয়ার পথ। ping-এর ইতিহাসেও এমন নিরাপত্তা-ত্রুটি পাওয়া গেছে। প্রথম উন্নতি এলো Linux capability দিয়ে: পুরো root-এর বদলে ping ফাইলকে শুধু CAP_NET_RAW দেওয়া — বাগ থাকলেও আক্রমণকারী শুধু raw socket পায়, পুরো সিস্টেম নয়। এটি “ন্যূনতম অধিকার” (principle of least privilege) নীতির প্রয়োগ, যা অপারেটিং সিস্টেম কোর্সের নিরাপত্তা পর্বেও দেখবেন।
দ্বিতীয় আর পরিচ্ছন্ন উন্নতি — ping socket, Linux 3.0-তে (২০১১)। ধারণাটি সহজ: সমস্যা “ICMP পাঠানো” নয়, সমস্যা “যা খুশি পাঠানো”। তাই সমাধান একটি সংকীর্ণ socket, যা শুধু Echo Request পাঠায় আর শুধু নিজের Echo Reply পায়। Kernel identifier নিজে বসায়, checksum নিজে হিসাব করে, আর উত্তর ভাগ করে identifier দেখে — একজন অন্যের ping দেখতে পায় না। কোন group এটি ব্যবহার করবে, তা ping_group_range দিয়ে প্রশাসক ঠিক করেন। এই পর্বের container-এ পরিসর ছিল 0 0, তাই আমাদের C প্রোগ্রাম সৎভাবে EACCES পেয়েছে; Docker-এর মতো অনেক container ব্যবস্থা অবশ্য নিজেদের ডিফল্টে এটি খুলে দেয় বলে জানা যায় — নিজের পরিবেশে cat /proc/sys/net/ipv4/ping_group_range দিয়ে দেখে নিন।
মূল উপলব্ধি: নিরাপত্তা প্রায়ই “কাকে কতটুকু দরকার” প্রশ্নের উত্তর। পুরো চাবির গোছা না দিয়ে শুধু একটি দরজার চাবি দিলে, ভুল বা বাগের ক্ষতিও সেই দরজাতেই সীমিত থাকে।
অনুশীলন
হাতে হিসাব, MTU-র অঙ্ক, আউটপুট অনুমান আর firewall নিয়ম লেখা — চারটিই করুন।
-
হাতে checksum (হিসাব): একটি Echo Request: type ৮, code ০, identifier
0x0001, sequence0x0007, ডেটা দুই বাইটhi(0x68 0x69). এর ICMP checksum কত? এর Echo Reply-এর checksum কত হবে?Checksum ঘর ০ ধরে ১৬-বিটের শব্দগুলো যোগ:
0800 + 0000 + 0001 + 0007 + 6869. ধাপে ধাপে:0800 + 0001 + 0007 = 0808;0808 + 6869 = 7071. কোনো ক্যারি নেই (ফল ১৬ বিটের মধ্যে)। সব বিট উল্টে:~0x7071 = 0x8F8E. তাই Echo Request-এর checksum0x8F8E.Echo Reply-তে শুধু type ৮ → ০, অর্থাৎ যোগফল থেকে
0x0800কমে0x6871; উল্টে0x978E. যাচাই:0x8F8E + 0x0800 = 0x978E— incremental update-এর নিয়ম মিলে গেল। উত্তর0x978E. অংশ ২-এর C প্রোগ্রামেreq-এর বাইটগুলো বদলে (দৈর্ঘ্য ১০) নিজে মিলিয়ে নিন। -
MTU-র অঙ্ক (numerical): একটি সার্ভার থেকে ব্যবহারকারী পর্যন্ত পথে link-গুলোর MTU: ১৫০০ → ১৪৯২ (PPPoE) → ১৪০০ (VPN) → ১৫০০. সার্ভার DF দিয়ে ১৫০০ বাইটের TCP packet দিয়ে শুরু করে, IP আর TCP header ২০ বাইট করে (কোনো option নেই)। PMTUD ঠিকমতো চললে সার্ভার কয়টি ICMP 3/4 পাবে, প্রতিটিতে Next-Hop MTU কত থাকবে, আর শেষে প্রতিটি segment-এ ডেটা কত বাইট?
প্রথম ১৫০০ বাইটের packet ১৪৯২-র link-এর আগের router-এ আটকায় → প্রথম ICMP 3/4, Next-Hop MTU ১৪৯২. সার্ভার ১৪৯২-তে নামে; সেটি পরের ১৪০০-র link-এর আগে আটকায় → দ্বিতীয় ICMP 3/4, Next-Hop MTU ১৪০০. এরপর ১৪০০ বাইটের packet শেষ link (১৫০০) পর্যন্ত সহজে যায়। মোট দুটি ICMP বার্তা, path MTU ১৪০০ (= পথের সবচেয়ে ছোট MTU).
প্রতিটি segment-এর ডেটা = ১৪০০ − ২০ (IP) − ২০ (TCP) = ১৩৬০ বাইট. প্রথম দুটি চেষ্টার ডেটা ছিল ১৪৬০ আর ১৪৫২. TCP option (যেমন timestamp-এর ১২ বাইট) থাকলে ডেটা আরও ১২ বাইট কম হতো।
-
আউটপুট অনুমান: একটি Linux ল্যাপটপ থেকে
traceroute 192.0.2.10চালানো হলো (ডিফল্ট UDP probe). পথে তিনটি router, সবাই ঠিকমতো Time Exceeded পাঠায়। কিন্তু গন্তব্য সার্ভারের firewall সব আগত UDP নিঃশব্দে ফেলে দেয় আর নিজে কোনো ICMP পাঠায় না। আউটপুট দেখতে কেমন হবে? কী বদলালে traceroute গন্তব্য পর্যন্ত দেখাতে পারে?প্রথম তিনটি লাইনে তিনটি router-এর ঠিকানা আর সময় আসবে। চতুর্থ probe-গুলো গন্তব্যে পৌঁছায় ঠিকই, কিন্তু firewall ফেলে দেয় — Port Unreachable আসে না, তাই traceroute থামার সংকেত পায় না। ফলে লাইন ৪ থেকে ৩০ পর্যন্ত (ডিফল্ট সর্বোচ্চ hop) সব
* * *:1 192.168.0.1 1.3 ms ... 2 198.51.100.1 4.4 ms ... 3 203.0.113.77 37.6 ms ... 4 * * * 5 * * * ... 30 * * *সমাধান: সার্ভার যা চলতে দেয়, সেই protocol-এ probe পাঠানো। ওয়েব সার্ভার হলে
sudo traceroute -T -p 443 192.0.2.10(TCP SYN) — গন্তব্য SYN-ACK দেবে, শেষ লাইনে সার্ভার দেখা যাবে। Echo চলতে দিলেtraceroute -I. এটি শুধু নিজের বা অনুমতির সার্ভারে করুন। -
নিয়ম লিখুন: একটি Linux সার্ভারের nftables-এ input chain-এর ডিফল্ট নীতি
drop. এমন নিয়ম লিখুন যাতে চলমান সংযোগের সাথে সম্পর্কিত ICMP, Destination Unreachable, Time Exceeded আর Parameter Problem ঢুকতে পারে, আর Echo Request চলে কিন্তু সেকেন্ডে ৫টির বেশি নয়।table inet filter { chain input { type filter hook input priority 0; policy drop; iif "lo" accept ct state established,related accept # related ICMP errors match here icmp type { destination-unreachable, time-exceeded, parameter-problem } accept icmp type echo-request limit rate 5/second accept tcp dport 22 accept # admin SSH (restrict further in real life) } }ct state relatedসেই ICMP ত্রুটিগুলোকে ধরে, যার উদ্ধৃত header একটি চলমান সংযোগের সাথে মেলে — অংশ ২-এর ৮ বাইটের কল্যাণে। তবু type ৩, ১১, ১২-এর আলাদা নিয়ম রাখা নিরাপদ অভ্যাস (যেমন connection tracking-এ নেই এমন traffic-এর জন্য)।limit rateEcho-কে পুরো বন্ধ না করে বন্যা থেকে রক্ষা করে। IPv6-এর জন্য আলাদাicmpv6 typeনিয়ম লাগবে, যেখানে Packet Too Big আর Neighbor Discovery অবশ্যই রাখতে হয় (পর্ব ২১)। দূরের সার্ভারে firewall বদলানোর আগে ফেরার পথ (console) রাখুন, আরnft -c -fদিয়ে আগে শুধু যাচাই করুন। Firewall-এর পূর্ণ আলোচনা পর্ব ৪৯-এ।
নিজেকে যাচাই করুন
ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।
ক্রমPath MTU Discovery-র ধাপগুলো সঠিক ক্রমে সাজান (▲▼ চেপে সরান)
- প্রেরক DF বিট দিয়ে নিজের link-এর MTU-র সমান বড় packet পাঠায়
- ছোট MTU-র link-এর আগের router দেখে packet বড়, DF দেওয়া — ফেলে দেয়
- Router প্রেরককে ICMP type ৩, code ৪ পাঠায়, Next-Hop MTU সহ
- প্রেরকের kernel উদ্ধৃত header দেখে সংযোগ চেনে আর ওই গন্তব্যের path MTU মনে রাখে
- প্রেরক ছোট packet-এ ডেটা আবার পাঠায়, যা পুরো পথ পার হয়
একটি ল্যাপটপ 192.0.2.20-এর UDP port 9999-এ একটি datagram পাঠাল, যেখানে কোনো প্রোগ্রাম শুনছে না, আর পথে কোনো firewall নেই। কোন ICMP বার্তা ফিরে আসার কথা, আর কে পাঠাবে?
- পথের শেষ router থেকে Time Exceeded (type 11, code 0)
- পথের একটি router থেকে Net Unreachable (type 3, code 0)
- গন্তব্য
192.0.2.20থেকে Port Unreachable (type 3, code 3) - গন্তব্য থেকে Echo Reply (type 0)
ICMP ত্রুটির বার্তায় মূল packet-এর IP header-এর পরে অন্তত ৮ বাইট জুড়ে দেওয়া হয়। এই ৮ বাইটের প্রধান উদ্দেশ্য কী?
- ICMP বার্তার checksum যাচাই করা
- মূল packet-এর transport header (port) দিয়ে প্রেরক যেন সঠিক socket বা সংযোগ চিনতে পারে
- হারানো ডেটা পুনরুদ্ধার করে প্রাপকের কাছে পৌঁছে দেওয়া
- যে router বার্তাটি পাঠিয়েছে তার পরিচয় দেওয়া
একটি traceroute-এ hop 7 দেখায় 210 ms আর একটি *, কিন্তু hop 8 থেকে গন্তব্য (hop 11) পর্যন্ত সব লাইনে প্রায় 40 ms, কোনো * নেই। সবচেয়ে সম্ভাব্য ব্যাখ্যা কোনটি?
- Hop 7-এর link-এ ভীষণ জ্যাম, সব traffic সেখানে আটকে আছে
- Hop 7-এর পরে পথ বিচ্ছিন্ন, গন্তব্যে কিছু পৌঁছাচ্ছে না
- গন্তব্যের firewall traceroute-এর probe আটকাচ্ছে
- Hop 7-এর router নিজের ICMP উত্তর ধীরে আর হার-সীমা দিয়ে বানায়; forward করায় সমস্যা নেই
একটি অফিসে ব্যবহারকারীরা বলছেন: ওয়েবসাইটে লগইন হয়, ছোট পাতা খোলে, কিন্তু বড় রিপোর্ট ডাউনলোড আটকে যায়। সার্ভারের firewall-এ সব ICMP বন্ধ, আর ব্যবহারকারীরা VPN দিয়ে আসেন। সবচেয়ে সম্ভাব্য কারণ কী?
- PMTUD black hole — Fragmentation Needed (type 3, code 4) সার্ভারে পৌঁছাচ্ছে না
- DNS server ভুল ঠিকানা দিচ্ছে
- ICMP Echo বন্ধ থাকায় TCP ডেটা পাঠাতে পারছে না
- সার্ভারের TTL খুব ছোট, তাই বড় packet পথে ফুরিয়ে যায়
RFC 1122 অনুযায়ী নিচের কোন packet-এর সমস্যার জন্য ICMP ত্রুটির বার্তা পাঠানো নিষেধ?
- একটি unicast UDP datagram, যা বন্ধ port-এ এসেছে
- একটি ICMP Echo Request, যার TTL পথে ফুরিয়েছে
- একটি ICMP Destination Unreachable বার্তা, যার TTL পথে ফুরিয়েছে
- একটি packet-এর প্রথম fragment, যা MTU-র কারণে আটকেছে
একটি Windows ল্যাপটপের (192.168.0.105/24) ping 192.168.0.77-এর আউটপুট: Reply from 192.168.0.105: Destination host unreachable. এর সবচেয়ে সঠিক ব্যাখ্যা কোনটি?
- 192.168.0.77 চালু আছে আর ping-এর উত্তর দিয়েছে
- ল্যাপটপ নিজেই জানাচ্ছে যে ARP-এ 192.168.0.77-এর MAC পাওয়া যায়নি
- ইন্টারনেটের কোনো router-এ route নেই
- 192.168.0.77-এর firewall ping আটকাচ্ছে
শব্দকোষ
লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন — অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:
মনে রাখুন
- ICMP IP-র খবরবাহক: IP-র ভেতরে যায় (protocol ১), কিন্তু network layer-এর অংশ; খবর যায় শুধু মূল উৎস-ঠিকানায়, আর ICMP নিজেও হারাতে পারে।
- গঠন: type, code, checksum, ৪ বাইটের type-নির্ভর ঘর; ত্রুটির বার্তায় মূল IP header আর অন্তত ৮ বাইট — port দিয়ে সঠিক socket চেনার জন্য।
- মূল বার্তা: ৮/০ Echo, ৩ Unreachable (০ net, ১ host, ২ protocol, ৩ port, ৪ fragmentation needed), ১১ Time Exceeded, ৫ Redirect, ১২ Parameter Problem. ICMP ত্রুটি, broadcast আর পরের fragment-এর জন্য ত্রুটি নয়।
- ping: id + seq, RTT-এর min/avg/max/mdev (population std. dev.), loss %; traceroute: TTL বাড়িয়ে Time Exceeded, শেষে Port Unreachable বা Echo Reply. মাঝের hop-এর delay গন্তব্যে না টিকলে তা rate limit.
- PMTUD চলে ICMP ৩/৪-এর ওপর; তা আটকালে black hole. দরকারি ICMP রাখুন, Echo-তে হার-সীমা দিন, Redirect সীমানায় বন্ধ করুন।
আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ
- পর্ব ২১ · IPv6 — ঠিকানা, header, SLAAC আর রূপান্তরপরবর্তী পর্বICMPv6, Neighbor Discovery আর Packet Too Big — IPv6-এ ICMP ছাড়া কিছুই চলে না।
- কম্পিউটার নেটওয়ার্ক · কোর্স হোম৬২টি পর্বপুরো কোর্সের রোডম্যাপ — দশটি মডিউল।
- পর্ব ০৬ · Linux-এ নেটওয়ার্ক দেখা — ip, ping, ss, curl আর /proc/netফিরে দেখুনping আর traceroute চালানো ও পড়ার প্রথম পরিচয়, Windows আর macOS-এর কমান্ডসহ।
- পর্ব ০৯ · Error detection আর correctionভিত্তিInternet checksum-এর one's complement যোগফল আর তার সীমাবদ্ধতা।
- Operating Systems · OS নিরাপত্তাপাশের ট্র্যাকন্যূনতম অধিকার, capability আর setuid — ping socket-এর পেছনের নীতি।