Sunday, August 21, 2016

ডাটা স্ট্রাকচার - ৫ঃ স্ট্যাক

তোমার বাসায় সাতটি চেয়ার আছে। প্রথমে একটি চেয়ার রাখলে, তার উপর দ্বিতীয় চেয়ারটি, তারপর তৃতীয় চেয়ারটি এবং তারপর  চতুর্থ চেয়ার এরপর যথাক্রমে পঞ্চম , ষষ্ঠ এবং সপ্তম! অতঃপর চেয়ারের একটি স্তুপ তৈরী হল। এখন তোমাকে যদি চেয়ারগুলো স্তুপ থেকে আলাদা করতে বলা হয়  তাহলে তুমি  কি করবে? তোমাকে নিশ্চয়ই প্রথমে সাত নাম্বার চেয়ারটা তুলতে হবে তারপর ছয় নাম্বার তারপর পাঁচ নাম্বার  নাম্বার এভাবে সবশেষে এক নাম্বারটা তুলতে হবে। লক্ষ্য করবে  তুমি যে  ১ নাম্বার চেয়ারটি  প্রথমে রেখেছিলে তা তুলতে হল শেষে এবং ৭ নাম্বার চেয়ারটি শেষে দিলেন তা তুলতে হলো প্রথমে। এখানে চেয়ারের স্তুপ এক ধরনের স্ট্যাক। এইতো গেলো থিওরিটিকাল কনসেপ্ট। প্রোগ্রামিং এ  ব্যাপারটা ঠিক একইরকম। 

প্রোগ্রামিং এ আমরা নানান ধরনের ডেটা নিয়ে খেলা করি। ভিবিন্ন উপায়ে আমরা ডেটা রাখতে পারি। স্ট্যাক হল ডেটা রাখার এমনই এক ধরনের উপায়। এই উপায়ে ডেটা গুলো এমনভাবে রাখা হয় বা সাজানো থাকে যাতে পুরোপুরি উপরে বর্ণিত স্ট্যাক পদ্ধতি মেন্টেন করে। মানে প্রথমে যে ডেটা রাখলাম তা শেষে পাবো এবং শেষে যে ডেটা দিলাম তা আগে পাবো। এটাকে সংক্ষেপে বলা হয় FIFO বা ফার্স্ট ইন লাস্ট আউট।

ডেটা আমরা অ্যারে বা লিঙ্ক লিস্ট যেখানেই রাখিনা কেন এমন পদ্ধতি মেন্টেন করবো যাতে স্ট্যাকের নিয়ম অনুযায়ী আমরা ডেটাগুলো পাই। স্ট্যাক পদ্ধতিতে ডেটা রাখাকে বলা হয় Push এবং ডেটা বের করে নিয়ে আসাকে বলা হয় Pop


মুল তত্ত্বঃ  ডেটা ইন্সার্ট করার সময় সর্বশেষ ডেটার ইন্ডেক্স ট্রেস করে রাখবো। সেই ইন্ডেক্সকে বাড়িয়ে কমিয়ে আমরা প্রবেশ করাবো কিম্বা বের করে নিয়ে আসবো। আমাদের ক্ষেত্রে সেই ইন্ডেক্সটার নাম হবে top. যেহেতু প্রথমে অ্যারেতে কোন ডেটা থাকবেনা তাই প্রথমে top = -1 হবে। 


 Push Algorithm:  
 1. Initialize top with -1 and create array stack[MAX]   
 2. Insert data in array and increase the value of top   
 3. Continue 2 until array is not is not full   
 4. If array is full then exit   

 Pop Algorithm:   
 1. Return stack[top] and decrease the top  
 2. Continue 1 until stack is not empty   
 3. If stack is empty then exit   

Pseudo code:
 void push(int data)  
 {  
   top++;  
   if(top==MAX)  
   {  
     printf("Stack is full: ");  
     return sizeOfStack()-1;  
   }  
   stack[top] = data;  
 }  

 int pop()  
 {  
   if(top == -1)  
   {  
     printf("Stack is empty: ");  
     return sizeOfStack();  
   }  
   return stack[top--];  
 }  

ডাটা স্ট্রাকচার - ৬ঃ কিউ

Queue অন্যন্য ডাটা স্ট্রাকচারের মতই একটি ডাটা স্ট্রাকচার। আমরা আদের দৈনন্দিন জীবনে এটা প্রায়ই লক্ষ করি। যেমন,  বিদ্যুত বিল দিতে গেলে লাইনে দাঁড়িয়ে দিতে হয় সেটা একটা কিউডিজিটাল ওয়ার্ল্ডে গেলে লাইনে দাঁড়িয়ে ঢুকতে হয়; ব্যাংক থেকে টাকা তুলতে গেলে কিম্বা টাকা জমা দিতে গেলে সেখানেও লাইনে দাড়াতে হয় আবার ঢাকা শহরে পুটপাতেও মাঝে মাঝে হাটতে গেলে কিউ তৈরি হয়!  মানে আমাদের প্রচলিত জীবন ব্যাবস্থার সর্বক্ষেত্রে রয়েছে কিউ এর ব্যাবহার! 
চিত্রঃ কিউ
প্রোগ্রামিং এ কিউ পদ্ধতিতেও ডেটা রাখা যায়। এ পদ্ধতিতে ডেটা রাখলে আগে আসলে আগে পাবেন ভিত্তিতে আমরা যেকোন ডেটা তুলে নিয়ে আসতে পারি। এজন্য একে কিউ বলা হয়। আমরা এখানে কিউ পদ্ধতিতে ডেটা রাখবো। ডেটা স্টোরেজ হিসেবে ব্যাবহার করবো অ্যারে।  এখন আমরা সি দিয়ে কিউ ইমপ্লিমেন্ট করার চেষ্টা করবো- 

মুল কনসেপ্টঃ আমরা জানি যেকোন কিউ এর ই সামনে এবং পেছন দুইটা পার্ট থাকে। কিউ এর পেছন থেকে দিক থেকে প্রবেশ করে এবং সামনের দিক থেকে কিউ থেকে বের হয়ে যায়। আমরা অ্যারেতে ডেটা রাখার সময় একইসাথে অ্যারের সামনে এবং পেছনের ইন্ডেক্সটা ট্রেস করে রাখবো। পেছনের ইন্ডেক্সটা ব্যাবহার করবো ডেটা প্রবেশ করানোর জন্য আর সামনের ইন্ডেক্স ব্যাবহার করবো বের করে নেওয়ার জন্য, ঠিক বাস্তব জীবনের কিউ যেভাবে কাজ করে। নীচের চিত্রে খেয়াল করো-  


চিত্রে দেখা যাচ্ছে সবার আগে 37 ইনপুট দেওয়া হল এবং সেটা সবার আগে রিমোভ হয়ে যাচ্ছে। ডেটা প্রবেশ করানোকে কিউ এর ভাষায় বলা হয় enqueue আর ডেটা বের করে আনাকে কিউ এর ভাষায় বলা হয় dequeue. 

Algorithm: 
 Enqueue Algorithm:  
 1. Create queue[MAX] and Set rear and front to -1 as there is nothing in the queue   
 2. enqueue data and increase front by 1   
 3. increase rear by 1   
 4. Continue 2 until queue is not full.   

 Dequeue Algorithm:   
 1. return queue[front]   
 2. decrease front by 1   
 3. continue 1 and 2 until queue is not empty   

Pseudocode:
 int enqueue(int data)  
 {  
   if (rear == MAX - 1)  
   {  
     printf("Queue is Full \n");  
     return;  
   }  
   if (rear == - 1)  
     front = 0;  
   rear = rear+1;  
   queue[rear] = data;  
 }  

 int dequeue()  
 {  
   if(front> rear)  
   {  
     printf("Queue is empty\n");  
     return 0;  
   }  
   return queue[front++];  
 }  

ডাটা স্ট্রাকচার - ৯ঃ বাইনারি সার্চ ট্রি

বাইনারি সার্চ ট্রিঃ বাইনারি সার্চ ট্রি এমন বিশেষ ধরনের ট্রি যেখানে প্রতিটা নোডের লেফট চাইল্ড ওই নোডের চেয়ে ছোট হবে এবং রাইট চাইল্ড ঐ নোডের চেয়ে বড় হবে। নীচের চিত্রে খেয়াল করো- 


ইমপ্লিমেন্টেশনঃ বাইনারি ট্রিতে আমরা ডেটা হিসেবে কিছু ইন্টেজার রাখবো-

 Algorithm of BST insert   
 1. Check the root is null or not. If the root is null then it will be the node   
 2. If root is not null then find out its parent on the basis of BST. Make sure that no node is overlapped   

Pseudo Code:
 Node *bstInsert(Node *root, Node *node)  
 {  
   Node *parentNode, *currentNode;  
   if(root == NULL)  
   {  
     root = node;  
   }  
   currentNode = root;  
   while(currentNode!= NULL)  
   {  
     parentNode = currentNode;  
     if(node->data<currentNode->data)  
     {  
       currentNode = currentNode->left;  
     }  
     else  
     {  
       currentNode = currentNode->right;  
     }  
   }  
   if(node->data<parentNode->data)  
   {  
     addLeftChild(parentNode, node);  
   }  
   else  
   {  
     addRightChild(parentNode, node);  
   }  
   return root;  
 }  

ডাটা স্ট্রাকচার - ৮ঃ বাইনারি ট্রি ইমপ্লিমেন্টেশন

এই পর্বে আমরা দেখবো কিভাবে ট্রি আকারে ডেটা স্টোর করা যায়। ইমপ্লিমেন্টেশনের সুবিধার্থে আমরা কোন নোডেই দুইটার বেশী চাইল্ড রাখবোনা। মানে বাইনারি ট্রি নিয়ে কাজ করবো। আর ডেটা হিসেবে রাখবো ইন্টেজার। 


 Algorithm:   
 1. Create node data type which is able to hold two the addresses of another two nodes and an integer   
 2. Create a node variable and put the necessary data in it.   
 3. Add left child of a particular node   
 4. Add right child of a particular node   
 5. Do 2, 3, 4 as much as you want to insert data   

Pseudo code
 //Create node data type 
struct Node  
 {  
   int data;  
   struct Node *left;  
   struct Node *right;  
 };  

 Node *createNode(int item)  
 {  
   Node *newNode = (Node*)malloc(sizeof(Node));  
   if(newNode == NULL)  
   {  
     printf("Error! Couldn't create new node\n");  
     exit(1);  
   }  
   newNode->data = item;  
   newNode->left = NULL;  
   newNode->right = NULL;  
   return newNode;  
 }  

 void addLeftChild(Node *node, Node *child)  
 {   
   node->left = child;  
 }  

 void addRightChild(Node *node, Node *child)  
 {  
   node->right = child;  
 }  

Saturday, August 20, 2016

ডাটা স্ট্রাকচার - ৭ঃ ট্রি টার্মিনোলজি

ট্রি ডেটা স্ট্রাকচার হল ডেটা স্টোর করার আরেকটি কনসেপ্ট। এই পদ্ধতিতে ডেটাগুলোকে এমনভাবে স্টোর করা হয় যার ভিজুয়ালাইজেশন অনেকটা ট্রি এর মত। নীচের চিত্রে খেয়াল করো। আমরা এর আগে দেখেছি যে এক নোড থেকে আরেক নোডে যেতে একটি মাত্র পথ ব্যাবহার করা যেতো এখানে দেখা যাচ্ছে এক নোড থেকে আরেক নোডে যেতে একাধিক পথ পাওয়া যায়। একে নন লিনিয়ার ডেটা স্ট্রাকচার বলে। নীচের চিত্রে খেয়াল করলেই ব্যাপারগুলো পরিষ্কার হয়ে যাবে- 

ট্রি এর কিছু গুরুত্বপুর্ন টার্মঃ 

১। মুল নোড (Root node): যেকোন ট্রি এর সবচেয়ে উপরের নোডটাই হল রুট নোড। যেমন, উপরের ট্রি ক্ষেত্রে রুট নোড হল- 10

২। এজ(Edge): দুটি নোডের মধ্যবর্তী সংযোগকে এজ বলা হয়। প্রত্যেকটি ট্রি'র n-1 লিঙ্ক থাকে! যেখানে হল মোট নোড সংখ্যা! 

৩। প্যারেন্ট এবং চিলড্রেন(Parent and Children): যে নোড থেকে অন্য নোডের দিকে লিঙ্ক করা থাকে তাকে ওই নোডগুলোর প্যারেন্ট বলে। যেমন , 10 হল 20 ও 30 এর প্যারেন্ট নোড। একইভাবে 20, 30 হল 10 এর চিলড্রেন  

৪। সিবলিংস (Siblings): একই প্যারেন্ট যুক্ত নোডগুলোর একে অপরকে সিবলিংস বলে। যেমন, 20 ও 30 হলো পরস্পর পরস্পরের সিবলিংস। 

৫। লিফ নোড (Leaf Node): যে নোডের কোন চিলড্রেন থাকেনা তাদেরকে লিফ নোড বলে। চিত্রে 30, 40, 50 হল লিফ নোড 

৬। অ্যানসেস্টর (Ancestor): রুট নোড থেকে কোন নোডে আসতে যতগুলো নোড অতিক্রম করতে হয় তাদের প্রত্যেককেই ওই নোডের অ্যানসেস্টর বলে। বাংলায় যাকে বলা হয় পূর্বপুরুষ। 
যেমন, 40 এর অ্যানসেস্টর হল 10, 20 , 40
30 এর অ্যানসেস্টর হল- 10, 30  

লক্ষনীয়ঃ প্রত্যেকে আবার নিজেই নিজের নিজের অ্যানসেস্টর! নিজেকে বাদ দিয়ে যে অ্যানসেস্টর হয় তাকে proper ancestor বলে।
যেমনঃ Ancestor of 10: {10, 20}
proper ancestor of 40: {10}

৭। Descendant( বংশধর): কোন নোড থেকে লিফ নোড পর্যন্ত যেতে যতগুলো নোড অতিক্রম করতে হয় তাদের প্রত্যেক্যে ডিসচেন্ডেন্ট বা বংশধর বলে। বাংলায় যাকে বলে- সন্তান-সন্ততি/নাতি-পুতি :|  
10 এর ডিসচেন্ডেন্টঃ 10, 20, 40 

৮।  Degree of Node: কোন নোডের ডিগ্রি হল ওই নোড থেকে যাওয়া মোট সাব- ট্রি'র সংখ্যা! 
যেমন 10 এর সাব ট্রি 20 30 সুতরাং  20 এর ডিগ্রি- 30, 40
এভাবে-
Degree of 10: 2
Degree of 20: 2
Degree of 30: 0

৯। Height of a Node: লিফ নোড থেকে কোন নির্দিষ্ট নোড পর্যন্ত সর্বাধিক লম্বা পথে যে পরিমান লিঙ্ক বা এজ পাওয়া যায় তাকে সে নোডের উচ্চতা বা height বলে। 
Height of 10: 2
Height of 20: 1
Height of 30: 0
Height of 40: 0

৯। Level a Tree (লেবেল): রুট নোডকে বলা হয় লেভেল ০ নোড। রুট নোডের চাইল্ডগুলোকে বলা হয় লেভেল ১ নোড। লেভেল ১ এর চাইল্ডগুলোকে বলা হয় লেভেল ২ নোড। এভাবে নোডগুলোর লেভেলিং হয়। 
Level 0: 10
Level 1: 20, 30
Level 2: 40, 50

১০। Depth of a Node: রুট নোড থেকে ঐ নোড পর্যন্ত যতগুলো লিঙ্ক থাকে সে লিঙ্কের মোট সংখ্যাকে ওই নোডের Depth বলে। যেমন,
Depth of A: 0
Depth of B: 1
Depth of F: 2
Depth of H: 3

***বাইনারি ট্রিঃ  ট্রি অনেক ধরনের হতে পারে। কম্পিউটার প্রোগ্রামিং এ সবচেয়ে বেশী আলোচনা হয় বাইনারি ট্রি নিয়ে। এই বাইনারি ট্রি দিয়েই বেশ কিছু অ্যালগরিদম আছে। বাইনারি ট্রি হল এমন এক ধরনের ট্রি যেখানে প্রতিটা নোডের চাইল্ড দুইটার বেশী হয়না। অথ্যাৎ, প্রতিটা নোডের চাইল্ড সংখ্যা ০, ১, ২ এর মধ্যেই সীমাবদ্ধ। বাইনারি ট্রি 

ফুল বাইনারি ট্রিঃ যেসব ট্রি  এর প্রতিটা নোডের দুইটা করে চাইল্ড থাকে তাকে ফুল বাইনারি ট্রি বলে। 



২। কমপ্লিট বাইনারি ট্রিঃ যেসব নোড ফুল বাইনারি ট্রি না কিন্তু নোডগুলো বাম পাশ থেকে ফিলাপ হয়ে আসে তাকে কমপ্লিট বাইনারি ট্রি বলে। 

Wednesday, August 17, 2016

সাবনেটিং

সাবনেটিং(Sub Netting): সাবনেটিং হল একটি নেটওয়ার্ক কে  অনেকগুলো সাবনেটনেটওয়ার্কে বিভক্ত করা। সাবনেটিং করার কারন হলপৃথিবীতে সীমিত সংখ্যক আইপি থাকা। বর্তমানে ব্যাবহৃত IPV4 এ মোট বিটসংখ্যা ৩২ টি । এখান থেকে মোট 2^32 আইপি উৎপন্ন করা সম্ভব।  যা হিসেব করলে দাঁড়ায় চার বিলিয়নের কিছু বেশী। কিন্তু পৃথিবীতে লোকসংখ্যা প্রায় সাড়ে ৭ বিলিয়নের মত। আবার একেকজন একাধিক ডিভাইস ব্যাবহার করে। তার মানে সর্বমোট জনসংখ্যার তুলনায় ৪ বিলিয়ন আইপি কিছুই না। সাবনেটিং করার আগে আগে বেসিক আইপি অ্যাড্রেসিং সম্পর্কে ধারনা থাকতে হবে। 

কোন আইপিকে সাবনেটিং করার আগে  কয়েকটি জিনিস খেয়াল রাখতে হবেঃ  
১। আইপিটি  কোন ক্লাসের  
২। ডিফল্ট সাবনেট মাস্ক কত  

সাবনেট মাস্কঃ  ইতোমধ্যেই আমরা জানি কোন ক্লাসের ডিফল্ট সাবনেট মাস্ক কতঃ  
Class  
Default Subnet Mask  
255.0.0.0 
255.255.0.0 
255.255.255.0 

সাবনেট করার পর যেসব জিনিস পাওয়া যায়ঃ 
১। সাবনেটওয়ার্ক
২। হোস্ট
৩। ব্রডকাস্ট অ্যাড্রেস 

কোন নেটওয়ার্ক থেকে কি পরিমান নেটওয়ার্কহোস্ট বা ব্রডকাস্ট পাওয়া যাবে তা নির্ভর করে সংশ্লিষ্ট আইপির উপর। তা বের করার কিছু নিয়ম আছেঃ 


  মোট সাবনেটওয়ার্ক(Total Subnet): 2^given CIDR-Default CID
  মোট হোস্ট(Number Of Host per subnet): 2^number of Unmask bits 

সাবনেটিং করার নিয়ম(Rules Of Subnetting): 

১। সাবনেট মাস্কঃ প্রথমে দেখতে হবে CIDR কত দেওয়া আছে। সে অনুযায়ী সাবনেট মাস্ক লিখতে হবে। যেমন,   
192.168.10.0/26
Subnet Mask: 11111111.11111111.11111111.11000000
একে ডেসিমেলে লিখলে এমন হবেঃ 255.255.255.192

যদি কোন CIDR দেওয়া না থাকে তাহলে ডিফল্ট সাবনেট মাস্ক ব্যাবহার করতে হবে যদি CIDR না দেওয়া থাকতো তাহলে সাবনেট মাস্ক হত 255.255.255.0 কারন আইপিটি ক্লাসের এবং আমরা জানি ক্লাসের ডিফল্ট সাবনেট মাস্ক 255.255.255.0

২। ব্লক সাইজঃ  সাবনেট মাস্ক লেখার পর ব্লক সাইজ বের করতে হবে। ব্লক সাইজ বের করতে হলে ডিফল্ট সাবনেট মাস্ক এর পরের সবগুলো অক্টেট কে ২৫৬ থেকে বিয়োগ দিতে হবে। যতগুলো ব্লক সাইজ বের হবে শুন্য থেকে শুরু করে তাদের সর্বোচ্চ কম্বিনেশনে গুনিতক আকারে বাড়তে থাকবে। এটা করার সহজ উপায় হচ্ছে ব্লক সাইজ যোগ করে সামনে এগোনো। তবে অবশ্যই সেটা ওই অক্টেটের ভেলুর চেয়ে বেশী বা ২৫৬ হতে পারবেনা।  

  যেমন              192.168.10.0
Subnet Mask: 255.255.255.192
আমরা জানি প্রথম তিন অক্টেট পর্যন্ত ক্লাসের ডিফল্ট সাবনেট মাস্ক। তারমানে আমাদের চতুর্থ অক্টেট থেকে ব্লক সাইজ বের করতে হবে।

Block Size: 256-192 = 64
তাহলে সাবনেটওয়ার্ক অ্যাড্রেসগুলো হবেঃ    0                  64                 128             192
এখান থেকে চারটির বেশী নেটওয়ার্ক হবেনা (2^26-24= 4)

ব্রডকাস্ট অ্যাড্রেসঃ ব্রডকাস্ট অ্যাড্রেস হল প্রতিটি সাবনেটের পরের সাবনেট-১।  তাহলে উপরের হিসেবে ব্রডকাস্টগুলো হবেঃ

সাবনেটওয়ার্ক(SUBNET):                0                      64                            128                         192
ব্রডকাস্ট(BROADCAST) :               63                    127                           191                         255

হোস্ট(Host): হোস্ট হল সাবনেট অ্যাড্রেসের  পর থেকে শুরু করে ব্রডকাস্ট অ্যাড্রেসের আগ পর্যন্ত যতগুলো সংখ্যা আছে সবগুলোই। অন্যভাবে বললে সাবনেট অ্যাড্রেস+১ থেকে শুরু করে ব্রডকাস্ট অ্যাড্রেস-১ রেঞ্জের মধ্যে যতগুলো আছে সবগুলোই।

Sub network
0
64
128
192                   
Broad Cast
63
127
191
255
Host Range
1-62
65-127
129-190
193-254


রিক্যাপঃ 
Network Address:        192.168.10.0/26
                Broad Cast:  11111111.11111111.11111111.11000000
                Broad Cast:  255.255.255.192

Number Of Subnet: 2^26-2^24= 4
Number of Host Per subnet: 2^6= 62

Sub network
0
64
128
192                   
Broad Cast
63
127
191
255
Host Range
1-62
65-127
129-190
193-254

লক্ষ্যনীয়ঃ সাবনেট করার পর যেসব সাবনেট হোস্ট বের হবে তা সবসময় ডিফল্ট সাবনেট মাস্ক এর পরের অক্টেটগুলোতে প্রভাব ফেলবে। ডিফল্ট সাবনেট মাস্ক পর্যন্ত সবগুলো অক্টেট অপরীবর্তনীয় থাকে। 
সাবনেটিং এর কয়েকটি সমাধান ব্যাখ্যাসহ পাওয়া যাবে এখান থেকে। দেখার পর সব ক্লিয়ার হয়ে যাবে।  



Monday, August 15, 2016

বেসিক আইপি অ্যাড্রেসিং

আইপি সম্পর্কিত কিছু  ফ্যাক্টসঃ

১। আইপি অ্যাড্রেসে মোট চারটা অংশ থাকে। 
২। আইপিকে ডেসিমেল এবং বাইনারি এই দুই রকম নাম্বার সিস্টেমে লেখা যায়। আইপি যদি ডেসিমেলে লেখা হয় তাহলে প্রতিটি অংশকে বলা হয় ডটেড ডেসিমেল (Dotted Decimal) আর আইপি যদি বাইনারিতে লেখা থাকে তাহলে প্রতিটি অংশকে বলা হয় অক্টেট(Octet)
৩।  আইপির প্রতিটি অক্টেট ডট দ্বারা আলাদা করা হয়ে থাকে। 
৪। প্রতিটি অক্টেটে সর্বোচ্চ ২৫৫ পর্যন্ত সংখ্যা থাকবে 
৫। CIDR এর সংখ্যা হল নেটওয়ার্ক অংশের জন্য কি পরিমান বরাদ্ধ করা হল তার সংখ্যা। 
৬। আইপির যে অংশে 1 থাকে তা হল নেটওয়ার্ক অংশ আর যে অংশে 0 থাকে তা হল হোস্ট অংশ। 
আইপি অ্যাড্রেস (IP Address):  
আইপি অ্যাড্রেস হল  ইন্টারনেট প্রটোকল অ্যাড্রেস যা কয়েকটি সংখ্যা দ্বারা নির্দেশিত এবং যা প্রত্যেকটি ডিভাইসের জন্য ইউনিক। ইন্টারনেট ব্যবহার করতে হল প্রতিটি ডিভাইসের আইপি অ্যাড্রেস লাগবেই। আইপি অ্যাড্রেসই হল কোন ডিভাইসের পরিচিতি

আইপির ভার্সনঃ বর্তমানে প্রচলিত ২ ধরনের আইপি আছেঃ  

১। IPV-4 (আইপি ভার্সন-) :  IPV4 এ মোট অক্টেট থাকে ৪ টা , প্রতিটি অক্টেটে ৮ করে বিট থাকে IPV4 এ মোট বিট থাকে (৪X৮) বা  ৩২ টা। 

২। IPV-6 (আইপি ভার্সন -৬ ): আইপি ভার্সন-৬ এ মোট অক্টেট থাকে ১৬ টা এবং প্রতিটি অক্টেটে ৮ করে বিট থাকে এবং মোট বিট সংখ্যা  ১২৮। 
দুই ধরনের আইপি থাকলেও আমাদের আলোচনার বিষয় থাকবে আইপি ভার্সন-৪ নিয়েই।  

ছবিসুত্রঃ উইকিপিডিয়া
আইপির ক্লাস(Different classes of IP Addresses):  আইপির ৫ টা ক্লাস আছে। নিচে এদের বিবরন দেওয়া হলঃ
Class
1st  Octet Range 
Network/Host ID
A
0-127
Network. Host. Host. Host
B
128-191
Network. Network. Host. Host
C
192-223
Network. Network. Network. Host
D
224-239

E
240-255


সাবনেট মাস্ক (SUBNET MASK):  সাবনেট মাস্ক হল একটি ৩২ বিট নাম্বার যা একটি আইপি অ্যাড্রেস কে নেটওয়ার্ক অংশ এবং হোস্ট অংশে ভাগ করে।  কোন আইপির সাবনেট মাস্ক থেকে বুঝা যায় আইপিটা কোন ধরনের। নেটওয়ার্ক অংশকে 1 দ্বারা এবং হোস্ট অংশকে 0 দ্বারা চিহ্নিত করা হয়

সিআইডিআর(CIDR): CIDR মানে হল Class less inter-domain Routing বা একটা আইপিতে কয়টা অক্টেট নেটওয়ার্কিং এর জন্য বরাদ্ধ থাকবে তাই CIDR অথ্যাৎ, একটা আইপিতে কয়টা  1 থাকবে সে সংখ্যাটাই হল CIDRনিচে ভিবিন্য ক্লাসের ডিফল্ট CIDR এবং সাবনেট মাস্ক উল্লেখ করা হল।

Class
Default CIDR/Subnet
Default Subnet Mask in Binary
Default Subnet Mask in Decimal
A
/8
11111111.0.0
255.0.0.0
B
/16
11111111.11111111.0.0
255.255.0.0
C
/24
11111111.11111111.11111111.0
255.255.255.0

দেখাই যাচ্ছে, ক্লাস A এর শুধু একটা অক্টেটই নেটওয়ার্কিং এর জন্য বরাদ্ধ, ক্লাস B এবং C এর জন্য যথাক্রমে ২ টি এবং ৩ টি।