Tuesday, September 6, 2016

ভেরিয়েবল লেন্থ সাবনেট মাস্কিং VLSM

VLSM করার আগে এটি কেন করবো তা জানতে হবে। তার আগে সাবনেটিং সম্পর্কে ধারনা নিতে হবে। পাওয়া যাবে এখানে।  VLSM শুরু করা আগে  একটা সমস্যা নিয়ে আলোচনা করা যাকঃ 

ধরা যাক, XYZ নামের একটি প্রতিষ্ঠান আছে। যার আইপি অ্যাড্রেস 172.17.0.0/23এর  A,B,C,D,E,F নামের সাতটি ডিপার্টমেন্ট আছে প্রতিটি ডিপার্টমেন্ট নিন্মোক্ত সংখ্যক আইপি লাগবে।VLSM এর এজন্য সাবনেটিং অবশ্যই জানতে হবে।

 A= 120  
 B= 100  
 C= 60  
 D= 2  
 E= 2  
 F= 2  

সমাধানঃ দেওয়া আছে আইপি 172.17.0.0/23
এর সাবনেট মাস্কঃ 255.255.254.0

ব্লক সাইজ-   
তৃতীয় অক্টেটঃ 256-254 = 2
চতুর্থ অক্টেটঃ 256-0 = 256

এখান থেকে মোট নেটওয়ার্ক উৎপন্ন করা যাবেঃ  ১২৮ টি 
হোস্ট উৎপন্ন করা যাবেঃ ৫১২ টি
  
Subnet
0.0
2.0
4.0
6.0
8.0
………….
127.0
Broad Cast
1.255
3.255
5.255
7.255
9.255
………….
255.255
Host Min
0.1
2.1
4.1
6.1
8.1
……………
127.1
Host Max
1.254
3.254
5.254
7.254
9.254
……………
255.254

ব্রড কাস্ট এবং হোস্টের জন্য ২ টি আইপি চলে যাওয়ার পর বর্তমানে প্রতিটি সাবনেটে আইপি আছে ৫১০ টি। আমরা চাইলে  ১২৮ টি সাবনেটের মধ্য থেকে ৬ টি সাবনেট ৬ টি ডিপার্টমেন্ট কে দিয়ে দিতে পারি।  কিন্তু এতে  আমাদের আইপির অপচয় হবে। কারনপ্রতিটি সাবনেটে ব্যাবহার উপযোগী আইপি আছে ৫১০ টি। তাহলে ছয়টি সাবনেটের জন্য খরচ হবে (৫১০X৬) বা ৩০৬০ টি কিন্তু প্রকৃত অর্থে আমাদের আইপি কাজে লাগবে মাত্র  (১২০+১০০+৬০+২+২+২) = ২৮৪ টি। বাকি (৩০৬০- ২৮৪)  বা ২৭৭৬ টি আইপি আমাদের নষ্ট হবে। কিন্তু আমরা চাইলেই এই ২৮৪ টি আইপি একটা সাবনেট দিয়ে কাভার করে ফেলতে পারি,কারন প্রতিটি সাবনেটে অলরেডি ৫১০ টি আইপি আছেই।  এটা যে পদ্ধতিতে করা তাই হল, VLSM বা ভেরিয়েবল লেন্থ সাবনেট মাস্ক। অথ্যাত, আমরা আমাদের প্রয়োজন অনুযায়ী সাবনেট তৈরী করতে পারি।  

এখন আমরা প্রয়োজন মত প্রথম সাবনেটটি থেকে আমাদের নেটওয়ার্কগুলো তৈরী করে ফেলিঃ
A  ডিপার্টমেন্টে আইপি দরকার ১২০ টি। ১২০ টি আইপির জন্য দরকার কমপক্ষে ৭ টি হোস্ট বিট। কারন, 2^7=128
৭টি হোস্ট বিট নিয়ে সাবনেট মাস্ক হয়ঃ 11111111.11111111.11111111.1000000
ডেসিমেল করলে হয়ঃ 255.255.255.128
ব্লক সাইজঃ 256-255 = 1
ব্লক সাইজঃ  256-128 = 128
মুল আইপির প্রথম সাবনেট থেকে 128 ব্লক সাইজ নিয়ে ৪ টি  নেটওয়ার্ক বানানো যাবঃ
Subnet
0.0
0.128
1.0
1.128
Broad Cast
0.127
0.255
1.127
1.255
Host Min
0.1
0.129
1.1
1.129
Host Max
0.126
0.254
1.126
1.254

এখানে দেখা যাচ্ছে যে, 0.0 সাবনেটে মোট হোস্ট আইপি আছে 128 টি। এটি চাইলে আমরা A দিয়ে দিতে পারি। তাহলে আইপি খরছ আগে চেয়ে অনেক কমে গেছে।
তাহলে A ডিপার্টমেন্টঃ
Subnet
172.17.0.0
Broad Cast
172.17.0.127
Host Range
172.17.0.1   ------ 172.17.0.126
Mask
/25
Needed Size
120
Allocated Size
126

একই ভাবে আমরা 0.128 সাবনেটটি B কে দিয়ে দিতে পারিঃ
B ডিপার্টমেন্টঃ
Subnet
172.17.0.128
Broad Cast
172.17.0.255
Host Range
172.17.0.129   ------ 172.17.0.254
Mask
/25
Needed Size
100
Allocated Size
126
মুল আইপির প্রথম সাবনেটটি আমরা A এবং B ভাগ করে দিয়ে দিয়েছি। যেখানে এখন পর্যন্ত মোট আইপি খরচ  হয়েছে ২৫৬ টি। কিন্তু এখনো আমাদের হাতে আরো ২৫৬ টি আইপি আছে (সাবনেট 1.0 এবং 1.128)  ওগুলো দিয়েই বাকিগুলো কাভার করা যাবে। 

C ডিপার্টমেন্ট এর জন্য আইপি দরকার- 60
60 টি হোস্ট আইপির জন্য হোস্ট বিট লাগবে কমপক্ষেঃ 6 টি (2^6= 64) 
৬ টি হোস্ট বিট নিয়ে সাবনেট মাস্ক হবেঃ 11111111.11111111.11111111.11000000
ডেসিমেল ফর্মঃ 255.255.255.192
ব্লক সাইজঃ
চতুর্থ অক্টেটঃ 256-192 = 64 
64 ব্লক সাইজ নিয়ে 1.0 সাবনেট থেকে মোট সাবনেট উৎপন্ন করা যাবে 2 টি
প্রতিটি সাবনেটে হোস্ট আইপি পাওয়া যাবেঃ ৬৪ টি

Subnet
1.0
1.64
Broad Cast
1.63
1.127
Host Min
1.1
1.65
Host Max
1.62
1.126

তাহলে C ডিপার্টমেন্টকে 1.0 সাবনেটটি দিয়ে দেবো।
Subnet
172.17.1.0
Broad Cast
172.17.1.63
Host Range
172.17.1.1   ------ 172.17.1.62
Mask
/26
Needed Size
60
Allocated Size
62


E ডিপার্টমেন্টে লাগবে মাত্র ২ টি। ২ টি আইপির জন্য নুন্যতম হোস্ট বিট লাগবে 2 টি (2^2 = 4)
২ টি হোস্ট বিট নিয়ে সাবনেট মাস্ক হয়ঃ 11111111.11111111.11111111.11111100
বা- 255.255.255.252
ব্লক সাইজঃ 256-252 = 4
এখান থেকে মোট নেটওয়ার্ক করা যাবে- 16 টি প্রতিটি সাবনেটে 4 টি হোস্ট বিট নিয়ে

Subnet
1.64
1.68
1.72
1.76
Broad Cast
1.67
1.71
1.75
1.79
Host Min
1.65
1.69
1.73
1.77
Host Max
1.66
1.70
1.74
1.78


তাহলে ডিপার্টমেন্ট এর জন্যঃ 
Subnet
172.17.1.64
Broad Cast
172.17.1.67
Host Range
172.17.1.65   ------ 172.17.1.66
Mask
/30
Needed Size
2
Allocated Size
2

ডিপার্টমেন্ট এর জন্যঃ
Subnet
172.17.1.68
Broad Cast
172.17.1.71
Host Range
172.17.1.69   ------ 172.17.1.70
Mask
/30
Needed Size
2
Allocated Size
2

  F ডিপার্টমেন্ট এর জন্যঃ
Subnet
172.17.1.72
Broad Cast
172.17.1.75
Host Range
172.17.1.73   ------ 172.17.1.74
Mask
/30
Needed Size
2
Allocated Size
2

 পুরো ব্যাপারটা এক দৃষ্টিতে দেখলে এমন দেখাবেঃ 

 
 সবগুলো ডিপার্টমেন্ট কে কাভার করতে আমাদের আইপি খরছ হয়েছে মোট ৩৩২ টি (১২৮+১২৮+৬৪+৪+৪+৪) যেখানে আমাদের প্রয়োজন হতো ৩০৬০ টি। আইপি খরছ অনেক কমে গেছে তাই নয় কি?

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++];  
 }