C++ STL À» ÀÌ¿ëÇÑ DOS Attack °ø°Ý °Ë»ç ÇÁ·Î±×·¥ Á¦ÀÛ
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : article>STL_Iterator



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
Iterator

Iterator

À± »ó¹è

dreamyun@yahoo.co.kr



1절. ¼Ò°³

À̹ø±Û¿¡´Â STL ¿¡ ´ëÇÑ °£´ÜÇÑ ÀÀ¿ëÀ» Æ÷ÇÔÇÑ´Ù. ´ë·®ÀÇ µ¥ÀÌŸ¸¦ Ãë±ÞÇØ¾ß ÇÒ¶§ ¾î¶»°Ô ÀÛ¾÷À» ÇØ¾ß ÇÒ·±Áö¿¡ ´ëÇÑ ¸î°¡Áö ¹®Á¦µéÀ» ´ã°í ÀÖ´Ù.

À̸¦ À§Çؼ­ DOS ATTACKÀ» °ËÃâÇÏ´Â ¾îÇø®ÄÉÀ̼ÇÀ» ¿¹·Î µé¾î¼­ ¼³¸íÀ» ÇÒ°ÍÀÌ´Ù. ±×·¯³ª ÀÌ ¹®¼­´Â ¾îµð±îÁö³ª ¹æ¹ýÀ» Á¦½ÃÇÏ´Â ¹®¼­·Î½á ¿Ïº®ÇÑ Äڵ带 Á¦½ÃÇÏÁø ¾ÊÀ»°ÍÀ̸ç, Å×½ºÆ® °¡´ÉÇÑ ¼öÁØÀÇ Äڵ常À» Á¦°øÇÒ°ÍÀÌ¸ç ±¸Çö¿¡ ´ëÇÑ °í¹ÎÀº °¢ÀÚÀÇ ¸òÀÌ µÉ°ÍÀÌ´Ù.

DOS °ø°Ý¿¡ ´ëÇÑ ³»¿ëÀº ³×Æ®¿÷ º¸¾ÈÀÇ ±âº»(1)À» Âü°íÇϱ⠹ٶõ´Ù.


2절. DOS ATTACK °ËÃâ ¾îÇø®ÄÉÀÌ¼Ç Á¦ÀÛ

°£´ÜÇÑ DOS °ø°ÝÀ» °Ë»öÇÏ´Â ¾îÇø®ÄÉÀ̼ÇÀ» ¸¸µç´Ù°í °¡Á¤À» ÇØº¸ÀÚ. DOS °ø°ÝÀÇ °æ¿ì º¸Åë ÇϳªÀÇ IP¿¡¼­ ƯÁ¤ Æ÷Æ®·Î ªÀº½Ã°£¿¡ ¿äûÀÌ µé¾î¿Ã°ÍÀÓÀ¸·Î, "5ÃÊ¿¡ 20¹øÀÇ ¿äûÀÌ ÀÖÀ¸¸é DOS °ø°ÝÀ¸·Î °£ÁÖÇÑ´Ù" ¶ó´Â ½ÄÀ¸·Î DOS °ø°Ý¿¡ ´ëÇØ¼­ Á¤Àǰ¡ °¡´ÉÇÏ´Ù.

±×·¸´Ù¸é ¾îÇø®ÄÉÀ̼ÇÀº ÇØ´çÆÐŶÀÌ µé¾î¿Ã°æ¿ì IP Á¤º¸¸¦ ºÐ¼®Çؼ­ Ä«¿îÆÃÇϰí, ÀÌ Ä«¿îÆÃÀÌ 5ÃÊ ³»¿¡ 20¹ø ¹ß»ý Çß´Ù¸é "DOS WARN ¸Þ½ÃÁö"¸¦ ½ÃÄÑ¾ß ÇÒ°ÍÀÌ´Ù.

ÀÌ ¾îÇø®ÄÉÀ̼ÇÀ» Á¦ÀÛÇϴµ¥ À־ °¡Àå Áß¿äÇÑ Æ÷ÀÎÆ®´Â ÀڷᱸÁ¶ÀÇ À¯Áö¿Í È¿À²¼ºÀÌ µÉ°ÍÀÌ´Ù. DOS ¾îÅÃÀ» ÆÇ´ÜÇÏ´Â ±Ù°Å´Â IP¿Í PORT °¡ µÊÀ¸·Î, ¸ðµç ÀÔ·Â IP¿Í PORT¿¡ ´ëÇÑ Å×À̺íÀ» À¯ÁöÇϰí ÀÖ¾î¾ß ÇÑ´Ù.

±×·±µ¥ ¾Æ½Ã´Ù ½ÃÇÇ IPÀÇ ¹üÀ§´Â ³Ê¹« ³Ð´Ù. Á» ³Î¸® ¾Ë·ÁÁø ¹Ù»Û¼­¹ö ¶ó¸é ªÀº½Ã°£¿¡ ¼öõ-¼ö¸¸ ȤÀº ±×ÀÌ»óÀÇ ¼­·Î´Ù¸¥ IP ¿¡¼­ÀÇ Á¢±ÙÀÌ ÀÌ·ç¾îÁú¼ö ÀÖÀ»°Å´Ù. ¸¸¾à ¶ó¿ìÅÍ¿¡ ¼³Ä¡ÇÒ°æ¿ì ´õ¿í ¸¹Àº Á¢±ÙÀÌ ÀϾ°ÍÀÌ´Ù. ÀÌ°É ´Ü¼øÈ÷ map À̳ª vector ·Î IPÁ¤º¸ Å×À̺íÀ» ±¸¼ºÇÒ°æ¿ì È¿À²¿¡ ¹®Á¦°¡ ¹ß»ýÇÒ¼ö ÀÖ´Ù.


2.1절. È¿À²ÀûÀÎ ÀڷᱸÁ¶¸¦ »ý°¢Çغ¸ÀÚ

±×·³ ¾î¶»°Ô ÇØ¾ß È¿À²ÀûÀÎ ÀڷᱸÁ¶¸¦ ¸¸µé¼ö ÀÖÀ»±î.. ´Ü¼øÇÑ map À¸·Î ÇÒ°æ¿ì ¸¸¾à IP°¡ ¼ö¸¸°³°¡ µé¾î¿Â´Ù¸é, ¼ö¸¸°³ÀÇ ¿ø¼Ò·Î ÀÌ·ç¾îÁø °Å´ëÇÑ map µ¥ÀÌŸ°¡ ¸¸µé¾îÁú °ÍÀ̸ç, ´õ Ä¿Áú¼öµµ ÀÖÀ»°ÍÀÌ´Ù. °Å±â¿¡ port Á¤º¸±îÁö Æ÷ÇÔÇØ¾ß µÊÀ¸·Î, ´Ü¼ø map À¸·Î ±¸¼ºÇϱ⿡´Â ¿ø¼ÒÀÇ °¹¼ö°¡ ³Ê¹« ¸¹¾ÆÁø´Ù.

map Àº Á¤·Ä¿¬°ü ÄÁÅ×À̳ʷΠ±ÕÇü ÀÌÁøÆ®¸® ±¸Á¶¸¦ °¡Áø´Ù. ´ÙÀ½Àº map ÀÇ º¹Àâµµ(Complexity guarantees) ÀÌ´Ù. size() ´Â map ¿¡ Æ÷ÇÔµÈ ¿ø¼ÒÀÇ °¹¼öÀ̸ç, count(k) ´Â »èÁ¦ÇϰíÀÚ ÇÏ´Â key ÀÇ °¹¼öÀÌ´Ù. N Àº ¿ø¼ÒÀÇ °¹¼öÀÌ´Ù.

표 1. Æò±Õ º¹Àâµµ(Average complexity)

erase keyO(log(size()) + count(k))
erase elementconstant time
¹üÀ§ »èÁ¦O(log(size()) + N)
countO(log(size()) + count(k))
findlogarithmic
¿¹¸¦ µé¾î 13¸¸°³ Á¤µµÀÇ ¿ø¼Ò¸¦ °¡Áø map ¿¡¼­ ƯÁ¤ÇÑ ¿ø¼Ò¸¦ ãÀ»°æ¿ì Æò±Õ °É¸®´Â ½Ã°£Àº ¾à 17 Á¤µµ°¡ µÉ°ÍÀÌ´Ù. 1,000,000 Àº ¾à 20 ÀÌ´Ù.

DOS °ø°ÝÀ» °Ë»öÇØ³»´Â ¾îÇø®ÄÉÀ̼ÇÀ̶ó¸é ¶ó¿ìÅÍ¿¡ ¼³Ä¡µÉ°Íµµ »ý°¢ÇغÁ¾ß ÇÑ´Ù. ±×·¡¼­ Æò±Õ 1,000,000 ÀÇ µ¥ÀÌŸ¿¡¼­ ¼­ÃëÇÏ´Â°É·Î ÇØ¼­ °è»êÇØº¸¸é ´ë·® 20 Á¤µµÀÇ ½Ã°£ÀÌ ¼Ò¸ðµÈ´Ù. 20 Àº ÀÌó·³ ¹Ù»Û¾îÇø®ÄÉÀÌ¼Ç ²Ï³ª Å«¼öÄ¡ÀÌ´Ù. ±×·³À¸·Î ½Ã°£À» Á»´õ ÁÙ¿©¾ß ÇÒ Çʿ伺ÀÌ ÀÖ´Ù.

°Ô´Ù°¡ ÀÌ ¾îÇø®ÄÉÀ̼ÇÀ» À§Çؼ­ map À» ±¸¼ºÇÑ´Ù°í ÇßÀ»¶§ map ÀÇ key ´Â IP¿Í PORT ÀÇ Á¶ÇÕÀÌ µÉ°ÍÀÓÀ¸·Î, ¹é¸¸ ÀÌ»óÀÇ µ¥ÀÌŸ¸¦ °¨´çÇÒ¼ö ÀÖ´Ù°í ºÁ¾ßÇÒ°ÍÀÌ´Ù.


2.1.1절. ÇØ½¬¸¦ ÀÌ¿ëÇÑ È¿À²¼º ³ôÀ̱â

±×·¡¼­ »ý°¢ÇÒ¼ö ÀÖ´Â°Ô Hash ÇÔ¼öÀÇ »ç¿ëÀÌ´Ù. Hash ÇÔ¼ö´Â µ¥ÀÌŸ Ãà¾àÀ» À§ÇÑ ÇÔ¼ö·Î½á, °°Àº °ªÀ» ÀÔ·ÂÇßÀ»¶§´Â ¾ðÁ¦³ª °°Àº µ¥ÀÌŸ Ãà¾àÀ» ¾ò¾î³¾¼ö ÀÖ´Â ÇÔ¼öÀÌ´Ù.

¿ì¸®°¡ Ãà¾àÇØ¾ßÇÒ µ¥ÀÌŸ´Â ¹°·Ð 32bit Å©±âÀÇ IP ÁÖ¼Ò ÀÌ´Ù. 32bit ´Â ¹üÀ§°¡ ³Ê¹«³ª ³ÐÀ½À¸·Î À̰ÍÀ» 1024(2^10) Á¤µµ·Î ÁÙÀ̵µ·Ï ÇϰڴÙ. HASH ÇÔ¼ö´Â ¸Å¿ì ´Ü¼ø¹«½ÄÇÑ ¹æ¹ýÀ¸·Î IP ÁÖ¼Ò 32bit Áß 10bit ¸¸À» ÀÌ¿ëÇØ¼­ Hash °ªÀ» ¾òµµ·ÏÇϴµ¥, ´ÜÁö ½¬ÇÁÆ® ¿¬»êÀ» ÇØÁÖ´Â °Í¸¸À¸·Î ÇØ°á°¡´ÉÇÏ´Ù.

int hash(ulong ip)
{
	return ip >> 22;
}
				
ÀÌ °ªµéÀº 0 ºÎÅÍ 1023 ±îÁö ºÐÆ÷°¡ µÉ°ÍÀÓÀ¸·Î vector ȤÀº array ·Î ÀڷᱸÁ¶¸¦ ±¸ÇöÇÒ¼ö ÀÖÀ»°ÍÀÌ´Ù. IP °¡ µé¾î¿À¸é 0 - 1023 Áß¿¡ ÇϳªÀÇ °ªÀ¸·Î hashing µÉ°Çµ¥, vector ¿¡ Áý¾î³ÖÀ»¶§´Â ÀÌ hashing µÈ °ªÀÚü¸¦ ÷ÀÚ·Î ÇØ¼­ ÀÔ·ÂÇÒ¼ö ÀÖÀ½À¸·Î ½Ã°£º¹Àâµµ´Â O(1) ÀÌ µÉ°ÍÀÌ´Ù. ´Ù¸¥ ¸»·Î "ÇÑŰ" ¿¡ ÀÚ½ÅÀÌ ÀúÀåµÉ °÷À» ã¾Æ°¥¼ö ÀÖ°Ô µÈ´Ù. ÀÌ vector ´Â ۸¦ IP¿Í PORT·Î °¡Áö´Â map À» ¿ø¼Ò·Î °¡Áö°Ô µÉ°ÍÀÌ´Ù.

°¡Àå ÀÌ»óÀûÀÎ »óȲÀº IP°¡ 2^20 °³°¡ µé¾îÀִµ¥ 0¿¡¼­ 1023±îÁöÀÇ vector ¿¡ ¾ÆÁÖ ±ÕµîÇÏ°Ô µé¾îÀÖ´Â »óȲÀ¸·Î °¢ vector ÀÇ ¿ø¼Ò´Â 1024 °³ÀÇ ¿ø¼Ò¸¦ °¡Áö´Â map À» °¡Áö°Ô µÉ°ÍÀÌ´Ù. ÀÌ»óȲ¿¡¼­ ¿øÇÏ´Â µ¥ÀÌŸ (IP,PORT¸¦ Ű·Î °¡Áö´Â)¸¦ ã´Âµ¥ °É¸®´Â ½Ã°£Àº "vector ¿¡¼­ ÷ÀÚ¿¬»êÇϴµ¥ °É¸®´Â ½Ã°£ O(1)" + "O(log1024)" °¡ µÉ°ÍÀÌ´Ù. ±×·³À¸·Î ´ë·« 11 ¹øÁ¤µµ¿¡ ¿øÇÏ´Â °ªÀ» ãÀ»¼ö ÀÖ°Ô µÈ´Ù. ÃÖÃÊ map ¸¸À» »ç¿ëÇßÀ»¶§ÀÇ 20 ¿¡ ºñÇÏ¸é °ÅÀÇ Àý¹Ý¼öÁØÀ¸·Î ÁÙ¾îµêÀ» ¾Ë¼ö ÀÖ´Ù.

¹°·Ð À§ÀÇ »óȲÀº ¸Å¿ì ÀÌ»óÀûÀÎ »óȲÀ̸ç, ½ÇÁ¦·Î´Â À§ÀÇ °æ¿ì¿¡ ºñÇØ¼­ ´õ ¸¹Àº ½Ã°£ÀÌ ¼Ò¸ðµÉ°ÍÀÌ´Ù. ¿Ö³ÄÇϸé À§ÀÇ ´Ü¼øÇÑ ÇØ½¬ÇÔ¼ö·Î´Â IP°¡ ±ÕµîÇÏ°Ô 0-1023 À¸·Î ºÐÆ÷µÇ±â°¡ Èûµé°ÍÀ̱⠶§¹®ÀÌ´Ù. ÇØ½¬ÇÔ¼ö¸¦ ¸¸µå´Âµ¥ À־ °¡Àå Áß¿äÇÑ ºÎºÐÀº ¹Ù·Î ÀԷµ¥ÀÌŸµé¿¡ ´ëÇØ¼­ ÃÖ´ëÇÑ ±ÕµîÇÏ°Ô ºÐÆ÷µÇ´Â ÇØ½¬°ªÀ» ¾ò¾î³»´Â °ÍÀε¥, À§ÀÇ ÇÔ¼ö·Î´Â ºÐ¸íÈ÷ ±ÕµîÇÏ°Ô ºÐÆ÷µÇÁö ¾ÊÀ»°ÍÀÌ´Ù. ÇÏÁö¸¸ ÀÏ´ÜÀº À§ÀÇ ÇØ½¬ÇÔ¼ö¸¦ »ç¿ëÇϵµ·Ï ÇϰڴÙ. Á»´õ ¼º´ÉÁÁÀº ÇØ½¬ÇÔ¼ö´Â ¸¹Àº °í¹Î°ú Å×½ºÆ®¸¦ ÅëÇØ¼­ ¸¸µé¾î Áú¼ö ÀÖÀ»°ÍÀÌ´Ù.(°ø°³µÈ°Íµéµµ ¸¹ÀÌ ÀÖÀ¸´Ï google µîÀ» ÅëÇØ¼­ È®ÀÎÇØº¸±â ¹Ù¶õ´Ù)


2.1.2절. ÃÖÁ¾ÀûÀÎ ÀڷᱸÁ¶

´ÙÀ½Àº ÀÌ·¸°Ô ÇØ¼­ ¸¸µé¾îÁø ÃÖÁ¾ÀûÀÎ ÀڷᱸÁ¶ÀÌ´Ù.

그림 1. hash_map ÀڷᱸÁ¶

hash °ªÀ» À§ÇÑ 1024 Å©±âÀÇ vector °¡ ³õÀδÙ. ÀÌ vector Àº IP,PORT ¸¦ key ·Î °¡Áö°í, TIME, COUNT ¸¦ value·Î °¡Áö´Â map À» ¿ø¼Ò·Î °¡Áø´Ù. TIME Àº ÆÐŶÀÌ µé¾î¿Â ½Ã°£À̸ç, COUNT ´Â ¸î¹ø µé¾î¿Ô´ÂÁö¸¦ °è¼öÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù. ÀÌ map ÀÇ ÀڷᱸÁ¶´Â ´ëÃæ ´ÙÀ½°ú °°À» °ÍÀÌ´Ù.
typedef struct _key
{
    int ip;
    int port;
} key;

typedef struct _value
{
    int time;
    int count;
} value;

struct ltstr
{
    bool operator() (key a1, key a2)
    {
        return memcmp((void *)&a1, (void *)&a2, 8) < 0;
    }
};
map<key, value, ltstr> mydata;
				
ltstr À» ÁÖ¸ñÇϱ⠹ٶõ´Ù. ltstr Àº key ¸¦ Á¤·ÄÇϱâ À§Çؼ­ Á¤ÀǵǾú´Âµ¥, memcmp ¸¦ ÀÌ¿ëÇØ¼­ 2°³ÀÇ ±¸Á¶Ã¼ÀÇ Å©±â¸¦ ºñ±³ÇÑ´Ù. 2°³ÀÇ int ¸¦ °¡Áö°í ÀÖÀ½À¸·Î 8byte Å©±â·Î ºñ±³ÇÏ¸é µÉ°ÍÀÌ´Ù. ´ÙÀ½Àº Å×½ºÆ®¸¦ À§ÇÑ °£´ÜÇÑ ÄÚµåÀÌ´Ù.

map_test.cc

#include <vector>
#include <map>
#include <iostream>

using namespace std;

// map ÀÇ KEY °ªÀ¸·Î ip¿Í port Á¤º¸¸¦ °¡Áø´Ù.
typedef struct _key
{
    ulong ip;
    int port;
} key;

// map ÀÇ VALUE °ªÀ¸·Î óÀ½ ¸¸µé¾îÁø ½Ã°£°ú 
// Ä«¿îÆ® °¹¼öÀÌ´Ù. 
typedef struct _value
{
    int time;
    int count;
} value;

// KEY ÀÎ struct key ¸¦ Á¤·ÄÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. 
// memcmp ¸¦ ÀÌ¿ëÇØ¼­ Á¤·ÄÇϵµ·Ï ÇÑ´Ù. 
struct ltstr
{
    bool operator() (key a1, key a2)
    {
        return memcmp((void *)&a1, (void *)&a2, 8) < 0;
    }
};

int main()
{
    key mkey;
    value mvalue;
    map<key, value, ltstr> mydata;

    mkey.ip = 134;
    mkey.port = 4;
    mydata[mkey] = mvalue;

    mkey.ip = 134;
    mkey.port = 3;
    mydata[mkey] = mvalue;

    mkey.ip = 132;
    mkey.port = 1;
    mydata[mkey] = mvalue;

    map<key,value,ltstr>::iterator mi;
    mi = mydata.begin();
    while(mi != mydata.end())
    {
        cout << mi->first.ip << ","<< mi->first.port << endl;
        *mi++;
    }
}
				
Á¤·Ä¼ø¼­´Â ¸ÕÀú ip¸¦ ¿ì¼±À¸·Î ÇÑ´Ù. ¸¸¾à ip °¡ µ¿ÀÏÇÒ°æ¿ì port ¹øÈ£·Î Á¤·ÄÀÌ µÉ°ÍÀÌ´Ù. ¾ÆÁ÷Àº ¸¸µé¾îÁø map Á¤º¸¸¦ hash Å×ÀÌºí¿¡ ÀÔ·ÂÇÏÁö ¾Ê¾Ò´Âµ¥, 2.1.3절¿¡¼­ ¼³¸íÇÒ°ÍÀÌ´Ù.


2.1.3절. skeleton code (°ñ°Ý ÄÚµå)

ÀÌÁ¦ ½ÇÁ¦ÀûÀÎ °ñ°Ý Äڵ带 ¸¸µé¾î º¸µµ·Ï ÇÏÀÚ. ÀÌ°Ç ¾îµð±îÁö³ª Áö±Ý±îÁö ¿ì¸®°¡ »ý°¢Çß´ø ÀڷᱸÁ¶°¡ ½ÇÁ¦ ±¸ÇöµÉ¼ö ÀÖ´ÂÁö¸¦ È®ÀÎÇØ º¸´Â Å×½ºÆ®¼öÁØÀÇ ÄÚµåÀÌ´Ù.

ÀÌ ¾îÇø®ÄÉÀ̼ÇÀº IP¿Í Port ¹øÈ£ ¸¦ ÀÌ¿ëÇØ¼­ Key ¸¦ ¸¸µé°í ¸¸¾à µ¿ÀÏÇÑ IP, Port ¿¡¼­ ¿¬°áÀÌ µé¾î¿Ô´Ù¸é, count ¸¦ 1¾¿ Áõ°¡½ÃŲ´Ù. ¸¸¾à ÁöÁ¤µÈ ½Ã°£(À§À¸ Äڵ忡¼­´Â 30ÃÊ) µ¿¾È 100 ¹øÀÌ»óÀÇ count °¡ ¹ß»ýÇÒ°æ¿ì Dos °ø°ÝÀ̶ó°í ÆÇ´ÜÇÏ°í ¿ö´× ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù.

#include <vector>
#include <map>
#include <time.h>
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>

using namespace std;

typedef struct _key
{
    ulong ip;
    int port;
} key;

typedef struct _value
{
    int time;
    int count;
} value;

struct ltstr
{
    bool operator() (key a1, key a2)
    {
        return memcmp((void *)&a1, (void *)&a2, 8) < 0;
    }
};
int hash(ulong ip)
{
    return ip >> 22;
}

map<key, value, ltstr> mydata;
vector<map<key, value, ltstr> > hash_map(1024);

void InitValue(value *mvalue);
int insert_packet(key akey);

int main()
{
    key mkey;
    value mvalue;

    // Å×½ºÆ®¿ë ÀÚ·á ÀÔ·Â ----------------
    mkey.ip = inet_addr("192.168.100.1");
    mkey.port = 21 ;
    insert_packet(mkey);

    mkey.ip = inet_addr("192.168.100.1");
    mkey.port = 2;
    insert_packet(mkey);

    mkey.ip = inet_addr("192.168.100.3");
    mkey.port = 22;
    insert_packet(mkey);

    mkey.ip = inet_addr("192.168.100.200");
    mkey.port = 80;
    insert_packet(mkey);

    mkey.ip = inet_addr("192.168.100.1");
    mkey.port = 2;
    insert_packet(mkey);
    // Å×½ºÆ®¿ë ÀÚ·á ÀÔ·Â ----------------


    // Å×½ºÆ®¸¦ À§Çؼ­ Ãâ·ÂÇÑ´Ù. 
    // 192.168.100.1 ¿¡ ´ëÇÑ hash ۸¦ ¸¸µé°í 
    // °ªÀ» Ãâ·ÂÇØº»´Ù.  
    mkey.ip = inet_addr("192.168.100.1");
    mkey.port = 2;

    map<key, value, ltstr>::iterator mi;

    cout << hash(mkey.ip) << endl;
    mi = hash_map[hash(mkey.ip)].find(mkey); 
    if (mi == hash_map[hash(mkey.ip)].end())
    {
        cout << "not found " << endl;
    }
    else
    {
        cout << mi->second.time << ":" << mi->second.count << endl;
    }
}

// key ¸¦ ÀԷ¹޾Ƽ­ 
// hash ۸¦ ¸¸µé¾î¼­ ÇØ´ç hash_map ÀڷᱸÁ¶¿¡ ÀÔ·ÂÇÑ´Ù. 
int insert_packet(key akey)
{
    value mvalue;
    int hash_value = hash(akey.ip);
    map<key,value,ltstr>::iterator mi;
    mi = hash_map[hash_value].find(akey);

    InitValue(&mvalue);

    // ¸¸¾à ÀÌ¹Ì Á¸ÀçÇϰí ÀÖ´Ù¸é
    // count ¸¦ Áõ°¡ ½ÃŲ´Ù. 
    if (mi != hash_map[hash_value].end())
    {
        cout << "Count Áõ°¡" << endl;
        mi->second.count++;
    }
    // ±×·¸Áö ¾Ê´Ù¸é »õ·Î »ý¼ºÇÑ´Ù. 
    else
    {
        cout << "Insert " << endl;
        hash_map[hash_value].insert(pair<key, value>(akey, mvalue));
    }
}

void InitValue(value *mvalue)
{
    mvalue->time = time((time_t *)NULL); 
    mvalue->count = 1;
}
				


2.2절. ¹®Á¦ ¹ß»ý(È¿À² ¹®Á¦)

ºñ·Ï °ñ°Ý ÄÚµåÀ̱ä ÇÏÁö¸¸ À§ÀÇ Äڵ尡 ºñ±³Àû È¿À²ÀûÀ¸·Î ÀÛµ¿Çϸ®¶õ°É ¿¹»óÇÒ¼ö ÀÖ´Ù. ±×·¯³ª ÀÌ°Ç ¾îµð±îÁö³ª µ¥ÀÌŸ ÀÔ·ÂÀÇ °æ¿ìÀÌ´Ù.

À§ÀÇ ¹æ½ÄÀ¸·Î ÇØ¼­ µ¥ÀÌŸ°¡ °è¼Ó ½×ÀÌ´Â °Ç ±×·¸´Ù Ä¡°í, Àú·± »óÅ·Π¸î½Ã°£¸¸ µ¹¸é ºÐ¸íÈ÷ map ¿¡´Â ¼ö½Ê/¼ö¹é¸¸°ÇÀÇ µ¥ÀÌŸ°¡ ½×ÀÌ°Ô µÉ°ÍÀÌ´Ù. ±âº»ÀûÀ¸·Î Ä«¿îÅͰ¡ ÀÏÁ¤¼ö¸¦ ³Ñ¾î°¡¾ß¸¸ Áö¿öÁö±â ¶§¹®¿¡ Ä«¿îÅͰ¡ ÃʰúÇßÀ»°æ¿ì ÀڷᱸÁ¶¿¡¼­ Áö¿öÁø´Ù°í ÇÏ´õ¶óµµ, ±×·¸Áö ¾ÊÀº ¼ö¸¹Àº µ¥ÀÌŸ´Â Áö¿öÁöÁö ¾ÊÀ»°ÍÀ̱⠶§¹®ÀÌ´Ù. °á±¹ ¸î½Ã°£µµ ¾ÈµÇ¾î¼­ ¸ðµç ½Ã½ºÅÛ ¸Þ¸ð¸® ÀÚ¿øÀ» ¸ù¶¥ ½á¹ö¸®°Ô µÉ°ÍÀÌ´Ù.

ÀÌ·¯ÇÑ ¹®Á¦ÀÇ ÇØ°áÀ» À§Çؼ­ value ¿¡ time À̶ó´Â º¯¼ö¸¦ µÎ±ä ÇßÀ½À¸·Î, ÀÏÁ¤½Ã°£ ¸¶´Ù time ¸¦ È®ÀÎÇϰí, ÃʰúµÈ ¸Þ½ÃÁö´Â Áö¿öÁÜÀ¸·Î½á ÇØ°áÀÌ °¡´ÉÇÒ °ÍÀÌ´Ù.

±×·¸´Ù¸é ¾î¶»°Ô Áö¿öÁÙ°ÍÀΰ¡.. ´Ü¼øÇѹæ¹ýÀº vector ÀÇ 0¹øºÎÅÍ 1023¹ø±îÁöÀÇ ¸ðµç map À» ¼øÈ¯Çϸ鼭 ÀÏÀÏÀÌ time ºñ±³¸¦ ÇØ¼­ time ÀÌ ÃʰúÇßÀ»°æ¿ì Áö¿öÁÖ´Â ¹æ¹ýÀε¥, ô ºÁµµ ¾Ë°ÚÁö¸¸, ³Ê¹«³Ê¹« ºñÈ¿À²ÀûÀÌ´Ù. µ¥ÀÌŸ°¡ ½Ê¸¸ ȤÀº ¹é¸¸ Á¤µµ µé¾îÀÖ´Ù°í °¡Á¤ÇØ º¸ÀÚ. Á¦´ë·Î ÀÛµ¿ÇÏ´Â°É ±â´ëÇϱâ Èûµé°ÍÀÌ´Ù.


2.2.1절. ÇØ°á - ÀÌÅÍ·¹ÀÌÅÍ ÀúÀåÇϱâ

ÀÌ·²°æ¿ì »ý°¢ÇÒ¼ö ÀÖ´Â ¹æ¹ýÀÌ garbage µ¥ÀÌŸ Á¤¸®¸¦ À§ÇÑ º°µµÀÇ ÀڷᱸÁ¶¸¦ Çϳª ¸¸µé¾î¼­ À¯ÁöÇÏ´Â °ÍÀÌ´Ù. ¿©·¯°¡Áö ÀڷᱸÁ¶¸¦ »ý°¢ÇÒ¼ö Àִµ¥, ¿©±â¿¡¼­´Â multimapÀ» »ç¿ëÇϵµ·Ï Çß´Ù. key ´Â time ÀÌ µÉ°ÍÀε¥, ÀÌ time ÀÌ ºÐ¸íÈ÷ °ãÄ¥¼ö ÀÖÀ»°ÍÀ̱⠶§¹®ÀÌ´Ù.

multimap<int, map<key.value.ltstr>::iterator> garbage_collect;
				
¾ÆÀ̵ð¾î´Â °£´ÜÇÏ´Ù. À§¿¡¼­ ¿ì¸®°¡ map µ¥ÀÌŸ¸¦ ÀÔ·ÂÇÒ¶§ µ¿½Ã¿¡ À§ÀÇ garbage_collect ÀڷᱸÁ¶¿¡ mapµ¥ÀÌŸÀÇ iteraotr À» ÀԷ½ÃÄÑÁÖ´Â °ÍÀÌ´Ù. ±×¸®°í ÀÏÁ¤½Ã°£ÀÌ Áö³ª¸é garbage_collect ÀڷᱸÁ¶¸¦ ¼øÈ¯Çϸ鼭 ½Ã°£ÀÌ ÃʰúµÈ iterator ¿¡ ´ëÇØ¼­ »èÁ¦¸¦ ÇØÁÖ¸é µÉ°ÍÀÌ´Ù. Æ÷ÀÎÅ͸¦ º°µµ·Î ÀúÀåÇØ³õ°í Æ÷ÀÎÅ͸¦ ÀÌ¿ëÇØ¼­ garbage µ¥ÀÌŸ¸¦ »èÁ¦ÇØÁÖ´Â °Í°ú ºñ½ÁÇÑ ¹æ½ÄÀÌ´Ù.

½Ã°£ º¹Àâµµ¸¦ °è»êÇØº¸¸é garbage_collect ¿¡¼­ ¿øÇÏ´Â ¹üÀ§ÀÇ ¿ø¼Ò¸¦ »èÁ¦Çϴµ¥ °É¸®´Â ½Ã°£ "O(log(size()) + N)", garbage_collect ¿¡¼­ ³ª¿Â iterator ¸¦ ÀÌ¿ëÇØ¼­ »èÁ¦½Ã۴µ¥ °É¸®´Â ½Ã°£ O(1) + N, ip ¸¦ hash ·Î ¹Ù²Ù´Âµ¥ °É¸®´Â ½Ã°£ O(1) + N Á¤µµ°¡ µÈ´Ù.

O(log(size()) + N) + O(2N) 
				
N Àº »èÁ¦ÇؾßÇÒ ¿ø¼ÒÀÇ °¹¼öÀÌ´Ù. ¿¹¸¦µé¾î 1000000 °³ÀÇ µ¥ÀÌŸ¿¡¼­ 100 °³ÀÇ µ¥ÀÌŸ¸¦ »èÁ¦ÇØ¾ß ÇÑ´Ù°í °¡Á¤ÇßÀ»¶§, 6+100+200 = 306 Á¤µµ°¡ µÉ°ÍÀÌ´Ù.

hashvector ÀÇ Ã³À½ºÎÅÍ ³¡±îÁö ¼øÈ¯ÇÏ´Â ¹«½ÄÇÑ ¹æ¹ýÀ» »ç¿ëÇßÀ»°æ¿ì ¼øÈ¯¿¡ °É¸®´Â ½Ã°£ N ¿¡ ºñ±³Çϴµ¥ °É¸®´Â ½Ã°£, »èÁ¦Çϴµ¥ °É¸®´Â ½Ã°£µîÀ» ¿¹»óÇϸé ÃÖ¼Ò 2000000 ½Ã°£ÀÌ ¼Ò¸ðµÉ°ÍÀÌ´Ù. (¼øÈ¯¿¡ °É¸®´Â ½Ã°£ 1000000 + ºñ±³Çϴµ¥ °É¸®´Â½Ã°£ 1000000, °Å±â¿¡ »èÁ¦ÇÒ ¿ø¼Ò N°³)

±×·³ °£´ÜÇÏ°Ô Å×½ºÆ® Äڵ带 Çϳª ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ. ºñ·Ï Å×½ºÆ® ÄÚµåÀ̱ä ÇÏÁö¸¸ "ÀÌÅÍ·¹ÀÌÅÍ ÀúÀå" ¾ÆÀ̵ð¾î°¡ Çö½ÇÀûÀÎÁö´Â È®ÀÎÇØ º¼¼ö ÀÖÀ» °ÍÀÌ´Ù.

iterator_map.cc

#include <map>
#include <string>
#include <iostream>
using namespace std;

typedef struct _mydata
{
    int age;
    int num;
} mydata;

int main()
{
    mydata md;

    // map ÀڷᱸÁ¶¹× iterator ¼±¾ð
    map<int, mydata> data[1024];
    map<int, mydata>::iterator mi, my;

    // iterator ¸¦ ÀúÀåÇϱâ À§ÇÑ map °ú 
    // À̰ÍÀÇ iterator ¼±¾ð
    map<int, map<int,mydata>::iterator> garbage_map;
    map<int, map<int,mydata>::iterator>::iterator mmi;

    // Å×½ºÆ®¿ë µ¥ÀÌŸ ÀÔ·Â
    md.age = 12;
    md.num = 1;
    data[0][1] = md;

    md.age = 19;
    md.num = 3;
    data[0][3] = md;

    md.age = 28;
    md.num = 2;
    data[0][2] = md;

    md.age = 40;
    md.num = 22;
    data[0][4] = md;

    md.age = 42;
    md.num = 26;
    data[0][5] = md;

    md.age = 38;
    md.num = 12;
    data[0][6] = md;
    // Å×½ºÆ®¿ë µ¥ÀÌŸ ÀÔ·Â Á¾·á

    int i = 1;
    mi = data[0].begin();
    // Å×½ºÆ®¿ë µ¥ÀÌŸ¸¦ iterator ·Î ¼øÈ¯Çϸ鼭 
    // ÇØ´ç iterator ¸¦ iterator ¸¦ ÀúÀåÇϱâ À§ÇÑ map ¿¡ 
    // ÀÔ·Â 
    while(mi != data[0].end())
    {
        // ÀÔ·Â µð¹ö±ë¿ë Ãâ·Â
        cout << mi->first << ": " << mi->second.num <<  ","
            << mi->second.age<< endl;
        // iterator ¸¦ ÀڷᱸÁ¶¿¡ ÀúÀåÇÔ
        garbage_map[i] = mi;
        *mi++;
        i++;
    }
    cout << "==============================" << endl;

    // key ÀÇ °ªÀÌ 4º¸´Ù ´õÅ« ÀÌÅÍ·¹ÀÌÅ͸¦ ¸ðµÎ »èÁ¦ÇÑ´Ù.   
    mmi = garbage_map.find(4);
    while(mmi != garbage_map.end())
    {
        cout << "erase " << endl;
        data[0].erase(mmi->second);
        *mmi++;
    }

    // garbage map ¿¡¼­ ÇÊ¿ä¾ø´Â µ¥ÀÌŸ¸¦ »èÁ¦ÇÑ´Ù. 
    mmi = garbage_map.find(4);
    garbage_map.erase(mmi, garbage_map.end());
    cout << "iterator num "  << garbage_map.size() << endl;

    cout << "==============================" << endl;

    // map µ¥ÀÌŸ¸¦ Ãâ·ÂÇÑ´Ù. µð¹ö±ë¿ë  
    mi = data[0].begin();
    while(mi != data[0].end())
    {
        cout << mi->first << ": " << mi->second.num <<  ","
            << mi->second.age<< endl;
        *mi++;
    }
    cout << "==============================" << endl;
}
				
°£´ÜÇÏ°Ô Å×½ºÆ® °¡´ÉÇÒ °Å´Ù.


3절. °á·Ð

ÀÌ»ó °£´ÜÇÏ°Ô STL¿¡ ´ëÇÑ ¸î°¡Áö À̽´¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò´Ù. °³ÀÎÀûÀ¸·Î´Â DOS ATTACK °ËÃâÀ» À§ÇÑ Á»´õ ¿Ïº®ÇÑ ¿¹Á¦¸¦ µé¾îº¸°í ½Í¾úÀ¸³ª ±×·¸°Ô Çϱâ À§Çؼ± ÆÐŶĸÃÄ¿Í À̸¦ È¿À²ÀûÀ¸·Î ºÐ¼®Çؼ­ °ËÃâÇØ ³»´Â ¹æ¹ý¿¡ ´ëÇØ¼­ Á»´õ °í¹ÎÇØ¾ß Çϱ⠶§¹®¿¡(ÇѸ¶µð·Î ±ÍÂú¾Æ¼­) ¿Ïº®ÇÑ ¿¹Á¦¸¦ ¸¸µéÁö´Â ¸øÇß´Ù.

¾ðÁ¨°¡ ÀÌ ¹®¼­ÀÇ ÈļӯíÀÌ ¸¸µé¾îÁö¸é Á»´õ ¿Ïº®ÇÑ ¿¹Á¦¸¦ Æ÷ÇÔ½Ã۵µ·Ï ÇϰڴÙ.

ÅÂ±× :

category_Database
category__3
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.