´ÙÀ½ ÀÌÀü Â÷·Ê

7. ¸ÖƼij½ºÆ® ³»ºÎ

ÀÌ ÀýÀÇ ¸ñÀûÀº ¸ÖƼij½ºÆ®°¡ ¾î¶»°Ô ÀÛµ¿ÇÏ´ÂÁö¸¦ ÀÌÇØÇϴµ¥ ÇÊ¿äÇÑ Á¤º¸¸¦ Á¦°øÇÏ´Â °Í µµ ¾Æ´Ï°í ¸ÖƼij½ºÆ® ÇÁ·Î±×·¡¹Ö¿¡ ´ëÇÑ Á¤º¸¸¦ Á¦°øÇÏÀÚ´Â °Íµµ ¾Æ´Ï´Ù. ÇÏÁö¸¸ ¸ÖƼij½ºÆ®ÀÇ ±â¹ÝÀ» ÀÌ·ç´Â ÇÁ·ÎÅäÄÝ°ú ±¸ÇöÀ» »ìÆ캽À¸·Î¼­ ½±°Ô ÀúÁö¸£´Â ½Ç¼ö¿Í À߸øµÈ ÀÌÇظ¦ ÇÇÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

7.1 IGMP.

IP_ADD_MEMBERSHIP °ú IP_DROP_MEMBERSHIP¿¡¼­ ÀÌ ¸í·ÉÀ¸·Î Ä¿³Î¿¡ Á¦°øÇÑ Á¤º¸´Â ¾î¶² ¸ÖƼij½ºÆ® µ¥ÀÌÅͱ׷¥À» ¹Þ°í ¾î¶² °ÍÀ» ¹ö¸± °ÍÀÎÁö¸¦ °áÁ¤Çϴµ¥ ¾²Àδٰí Çß´Ù. ¸Â´Â ¸»À̶ó°í ÇÒ ¼ö ÀÖÁö¸¸, ¸ðµÎ ¸Â´Â ¸»Àº ¾Æ´Ï´Ù. ÀÌ·¯ÇÑ ÀϹÝÈ­´Â Àü ¼¼°è ¸ðµç ¸ÖƼij½ºÆ®µ¥ÀÌÅͱ׷¥ÀÌ ¿ì¸®ÀÇ È£½ºÆ®·Î Àü´ÞµÈ ÈÄ, È£½ºÆ®¿¡¼­ ÇÁ·Î¼¼½º°¡ ¹ßÇàÇÑ È¸¿ø°ü°è¸¦ È®ÀÎ ÈÄ µ¥ÀÌÅͱ׷¥ÀÇ Æó±â ¿©ºÎ¸¦ °áÁ¤ÇÑ´Ù´Â ¸»ÀÌ µÈ´Ù. »ý°¢ÇÒ ÇÊ¿äµµ ¾øÀÌ, ÀÌ°ÍÀº ¾öû³­ ´ë¿ªÆø ³¶ºñÀÓÀ» ¾Ë ¼ö ÀÖ´Ù.

½ÇÁ¦·Î´Â È£½ºÆ®°¡ ÀÚ½ÅÀÇ ¶ó¿ìÅÍ¿¡°Ô, ±× ¶ó¿ìÅÍ´Â »óÀ§ ¶ó¿ìÅÍ¿¡°Ô, ±×¸®°í ±× »óÀ§ ¶ó¿ìÅÍ¿¡°Ô....¾î¶² ¸ÖƼij½ºÆ® ±×·ì¿¡ °ü½ÉÀÌ ÀÖ´ÂÁö ¾Ë·ÁÁØ´Ù. ¸ÖƼij½ºÆ® ±×·ì Æ®·¡ÇÈÀ» ¹ÞÀ» °ÍÀÎÁö ¸» °ÍÀÎÁö °áÁ¤ÇÏ´Â ¾Ë°í¸®Áò ÀÚü¿¡´Â »ó´çÈ÷ º¯È­°¡ ½ÉÇѵ¥, ´Ü ÇÑ°¡Áö º¯ÇÏÁö ¾Ê´Â °ÍÀÌ ÀÖ´Ù¸é, ÀÌ Á¤º¸¸¦ Àü´ÞÇÏ´Â ¹æ¹ýÀÌ´Ù. ÀÌ°ÍÀº IGMP(Internet Group Management ProtocolÀ» ÀÌ¿ëÇÑ´Ù. ÇÁ·ÎÅäÄݹøÈ£ 2ÀÎ IGMP´Â ICMP¿Í À¯»çÇÑ »õ·Î¿î ÇÁ·ÎÅäÄÝÀε¥ IP µ¥ÀÌÅͱ׷¥À» ÀÌ¿ëÇÏ¸ç ·¹º§ 2 ÀûÀÀ´Ü°èÀÇ È£½ºÆ®´Â ÀÌ ÇÁ·ÎÅäÄÝÀ» Àǹ«ÀûÀ¸·Î ±¸ÇöÇØ¾ß ÇÑ´Ù. Àü¼úÇÑ ¹Ù¿Í °°ÀÌ ÀÌ°ÍÀº ¶ó¿ìÅÍ¿¡°Ô ȸ¿øÁ¤º¸¸¦ Àü¼ÛÇϴ ȣ½ºÆ®¿Í ¶ó¿ìÅÍ»çÀÌÀÇ Åë½Å ¾çÂÊ ¸ðµÎ »ç¿ëÇÑ´Ù. ´ÙÀ½ ±Û¿¡¼­ È£½ºÆ®-¶ó¿ìÅÍ°£ °ü°è¸¸À» ¼³¸íÇϱâ·Î ÇÑ´Ù. ¿Ö³ÄÇϸé mrouted¼Ò½º Äڵ带 Á¦¿ÜÇÏ°í´Â ¶ó¿ìÅÍ-¶ó¿ìÅÍ°£ Åë½ÅÀ» Çؼ³ÇÏ´Â ÀڷḦ ãÁö ¸øÇÏ¿´±â ¶§¹®ÀÌ´Ù. (RFC 1075-Distance Vector Multicast Routing ProtocolÀº ÀÌÁ¦ »ç¿ëÇÏÁö ¾ÊÀ¸¸ç, mrouted´Â ¾ÆÁ÷ ¹®¼­È­µÇÁö ¾ÊÀº º¯ÇüµÈ DVMRP¸¦ ±¸ÇöÇÏ°í ÀÖ´Ù.)

RFC 988-IGMP ¹öÀü 0Àº ÀÌÁ¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù.

IGMP ¹öÀü 1Àº RFC-1112¿¡ Á¤ÀǵǾî ÀÖ°í, RFC-2236 (IGMP version 2) ¿¡¼­ °³Á¤µÇ¾î ÇöÀç±îÁö ¸¹ÀÌ »ç¿ëÇÏ°í ÀÖ´Ù. ¸®´ª½º Ä¿³Î¿¡¼­´Â IGMP ¹öÀü 1 Àüü¿Í ¹öÀü 2ÀϺΰ¡ ±¸ÇöµÇ¾î ÀÖ´Ù.

Áö±ÝºÎÅÍ ÀÌ ÇÁ·ÎÅäÄÝ¿¡ ´ëÇÑ ¾à½Ä¼³¸íÀ» º¸ÀÚ. RFC-2236À» ÆîÃÄ ³õ°í Á¤È®ÇÑ Á¤½Ä ¼³¸íÀ» º¸´Â °Íµµ ÁÁ´Ù.

¸ðµç IGMP ¸Þ½ÃÁö´Â ´ÙÀ½ ±¸Á¶¸¦ °¡Áø´Ù.

      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |      Type     | Max Resp Time |           Checksum            |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
     |                         Group Address                         |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

IGMP ¹öÀü 1 (ÀÌÇÏ IGMPv1) ´Â Àü¼Û½Ã "Max Resp Time" À» "Unused",Áï ¸ðµÎ 0 À¸·Î ÇÏ°í ¼ö½Å½Ã¿¡´Â ¹«½ÃÇÑ´Ù. "Type"¶õÀº 4ºñÆ® ÆøÀ¸·Î ³ª´©¾î "Version"°ú "Type"À¸·Î »ç¿ëÇÑ´Ù. IGMPv1 ¿¡¼­´Â "ȸ¿øÁúÀÇ(Membership Query)"¸¦ 0x11 (version 1, type 1)À¸·Î È®ÀÎÇÏ°í, IGMPv2 ¿¡¼­´Â 0x11 ·Î È®ÀÎÇϱ⠶§¹®¿¡ 8ºñÆ®¸¦ »ç½Ç»ó µ¿ÀÏÇÏ°Ô Çؼ® ÇÑ´Ù.

IGMPv2 ´Â ÁÖ·Î Ãß°¡»çÇ×µé·Î ÀÌ·ç¾îÁ® Àֱ⠶§¹®¿¡ IGMPv1 À» ÀÏ´Ü ¼³¸íÇÑ ÈÄ IGMPv2 Ãß°¡»çÇ×À» ¼³¸íÇÏ´Â ÆíÀÌ ÁÁÀ» °Í °°´Ù.

´ÙÀ½ ³íÀÇ¿¡¼­ ¶ó¿ìÅÍ´Â ¸ðµç IP ¸ÖƼij½ºÆ® µ¥ÀÌÅͱ׷¥À» ¹Þ´Â´Ù´Â °ÍÀ» ±â¾ïÇ϶ó.

7.2 IGMP version 1.

¶ó¿ìÅÍ´Â ÁÖ±âÀûÀ¸·Î(1ºÐ¿¡¼­ 2ºÐ¿¡ Çѹø¾¿) TTL°ª 1ÀÇ IGMP È£½ºÆ® ȸ¿ø ÁúÀǸ¦ Àüü È£½ºÆ® ±×·ì(224.0.0.1)À¸·Î º¸³½´Ù. ¸ðµç ¸ÖƼij½ºÆ® È£½ºÆ®µéÀÌ ÀÌ ¸Þ½ÃÁö¸¦¹ÞÁö¸¸ IGMP È£½ºÆ® ȸ¿ø º¸°í(Host Membership Report)°¡ ÆøÁÖ(storm)ÇÏ´Â °ÍÀ» ¹æÁöÇϱâ À§ÇØ Áï½Ã ÀÀ´äÇÏÁö ¾Ê´Â´Ù. ´ë½Å ÁúÀǸ¦ ¼ö½ÅÇÑ ÀÎÅÍÆäÀ̽º¿¡ ¼ÓÇÏ´Â °¢ ±×·ì¿¡ ´ëÇØ, ÀÓÀÇ Áö¿¬ ŸÀ̸Ӹ¦ ½ÃÀÛÇÑ´Ù.

Á¶¸¸ °£¿¡ ŸÀ̸Ӱ¡ ¿Ï·áµÇ¸é È£½ºÆ®´Â ¿ª½Ã TTL 1ÀÇ IGMP ȸ¿ø º¸°í¸¦ ¸ÖƼij½ºÆ® ±×·ì¾îµå·¹½º·Î Àü¼ÛÇÑ´Ù. ÀÌ ¸Þ½ÃÁö´Â ÀÌ¹Ì ±×·ì¿¡ Âü¿©ÇÏ°í ÀÖ´Â ¸ðµç È£½ºÆ®µé°ú ŸÀ̸Ӱ¡ ¿Ï·áµÇ±â¸¦ ±â´Ù¸®°í Àִ ȣ½ºÆ®µé¿¡°Ô Àü´ÞµÈ´Ù. ±×·¯¸é °¢ È£½ºÆ®µéÀº ŸÀ̸Ӹ¦ ÁßÁöÇÏ°í ´õ ÀÌ»ó ¾Æ¹«·± º¸°íµµ ÇÏÁö ¾Ê´Â´Ù. ÇÏÁö¸¸ ÀÌ°ÍÀ¸·Î ¶ó¿ìÅÍ´Â ÀÚ½ÅÀÇ ¼­ºê³Ý¿¡ ±× ¸ÖƼij½ºÆ® ±×·ìÀÇ ¸â¹ö°¡ Á¸ÀçÇÑ´Ù´Â °Í¸¸ ¾Ë¸é µÇ±â ¶§¹®¿¡ ȸ¿øÀÌ ¸îÀ̳ª ÀÖ´ÂÁö ¾Ë±â À§ÇØ ´õ ÀÌ»ó, º¸°í ¹ÞÀ» ÇÊ¿ä°¡ ¾ø´Ù.

¸î ¹ø ÁúÀÇÇÑ ÈÄ¿¡µµ ±× ±×·ì¿¡ ´ëÇØ ¾Æ¹«·± ȸ¿ø º¸°í°¡ ¾øÀ¸¸é ¶ó¿ìÅÍ´Â ¸â¹ö°¡ ¾ø´Â °ÍÀ¸·Î °£ÁÖÇÏ°í ÇØ´ç ±×·ìÀÇ Æ®·¡ÇÈÀ» ¼­ºê³ÝÀ¸·Î Æ÷¿öµùÇÏÁö ¾Ê´Â´Ù. IGMPv1 ¿¡¼­´Â "±×·ì Å»Åð ¸Þ½ÃÁö(Leave Group messages)"°¡ ¾ø´Ù´Â Á¡¿¡ ÁÖ¸ñÇ϶ó.

È£½ºÆ®°¡ »õ ±×·ì¿¡ Âü¿©Çϸé Ä¿³ÎÀº ±×·ìÀ¸·Î º¸°í¸¦ º¸³»±â ¶§¹®¿¡ °¢°¢ÀÇ ÇÁ·Î¼¼½ºµéÀº »õ·Î¿î ȸ¿ø ÁúÀÇ°¡ µµÂøÇÒ µ¿¾È(1,2ºÐ Á¤µµ) ±â´Ù¸± ÇÊ¿ä°¡ ¾ø´Ù. "IP_ADD_MEMBERSHIP" Á¤¿¡¼­ º¸¾Ò°ÚÁö¸¸, ÀÌ IGMP ÆÐŶÀº IP_ADD_MEMBERSHI¸í·É¿¡ ´ëÇÑ ÀÀ´äÀ¸·Î Ä¿³ÎÀÌ »ý¼ºÇÑ´Ù. "»õ ±×·ì"À̶ó´Â ¸»À» ÁÖÀÇ ±íÀÌ º¸ÀÚ. È£½ºÆ®°¡ ÀÌ¹Ì Âü¿©ÁßÀÎ ±×·ì¿¡ ´ëÇØ ÇÁ·Î¼¼½º°¡ IP_ADD_MEMBERSHIP ¸í·ÉÀ» º¸³¾ °æ¿ì ¿ì¸®´Â ÀÌ¹Ì ±× ±×·ìÀÇ Æ®·¡ÇÈÀ» ¹Þ°í Àֱ⠶§¹®¿¡ ¾Æ¹«·± IGMP ÆÐŶµµ ¸¸µé¾îÁöÁö ¾ÊÀ» °ÍÀÌ´Ù. ´ë½Å ±×·ì»ç¿ë Ä«¿îÅÍ°¡ Áõ°¡ÇÑ´Ù. IGMPv1¿¡¼­ IP_DROP_MEMBERSHIP ¸í·ÉÀº µ¥ÀÌÅͱ׷¥À» »ý¼º½ÃÅ°Áö ¾Ê´Â´Ù.

È£½ºÆ® ȸ¿ø ÁúÀǴ ŸÀÔ 0x11, È£½ºÆ® ȸ¿ø º¸°í´Â °¢°¢ ŸÀÔ 0x12·Î ±¸ºÐÇÑ´Ù.

Àüü È£½ºÆ® ±×·ì¿¡´Â º¸°íÇÏÁö ¾Ê´Â´Ù. ÀÌ ±×·ìÀ¸·ÎÀÇ È¸¿øÀº ¿µ±¸ÀûÀÌ´Ù.

7.3 IGMP ¹öÀü 2.

»ó±â ³»¿ë¿¡ ´ëÇÑ Ãß°¡ »çÇ× Áß Áß¿äÇÑ °Í ÇÑ°¡Áö´Â ±×·ì ÀÌÅ» ¸Þ½ÃÁö(ŸÀÔ0x17)°¡ Æ÷ÇԵǾú´Ù´Â »ç½ÇÀÌ´Ù. ÀÌ ¸Þ½ÃÁö´Â ¼­ºê³Ý¿¡¼­ ¸¶Áö¸· È£½ºÆ®°¡ ±×·ìÀ» ÀÌÅ»ÇÏ´Â ½ÃÁ¡°ú ÁúÀÇ ½Ã°£ÀÌ ¸¸·áµÇ¾î ¶ó¿ìÅÍ°¡ ´õ ÀÌ»ó ±×·ì¿¡ ³²¾ÆÀִ ȸ¿øÀÌ ¾ø´Ù°í °áÁ¤ÇÏ´Â ½ÃÁ¡ »çÀÌÀÇ ´ë¿ªÆø ³¶ºñ(ÀÌÅ» Áö¿¬-leave latency)¸¦ ÁÙÀ̱â À§ÇØ Ãß°¡µÇ¾ú´Ù. ±×·ì ÀÌÅ» ¸Þ½ÃÁö´Â ±×·ìÀÇ ´Ù¸¥ ¸â¹öµé¿¡°Ô´Â ºÒÇÊ¿äÇÑ Á¤º¸À̱⠶§¹®¿¡ ³²¾ÆÀÖ´Â ±×·ìº¸´Ù Àüü ¶ó¿ìÅÍ ±×·ì(224.0.0.2)ÂÊÀ¸·Î Àü¼ÛÇØ¾ß ÇÑ´Ù. (Ä¿³Î ¹öÀü 2.0.33 ÀÌÇÏ¿¡¼­´Â ÀÌ ¸Þ½ÃÁö¸¦ ±×·ìÀ¸·Î º¸³Â¾ú´Ù. È£½ºÆ®·Î¼­´Â Çظ¦ ÀÔÀ» ÀÏÀº ¾øÁö¸¸, ¾µµ¥¾ø´Â Á¤º¸À̱⠶§¹®¿¡ ÀÌ Á¤º¸¸¦ ó¸®ÇÏ´Â °ÍÀº ½Ã°£³¶ºñÀÏ »ÓÀÌ´Ù.) ¾ðÁ¦ ÀÌÅ» ¸Þ½ÃÁö¸¦ º¸³¾ °ÍÀΰ¡, ¾ðÁ¦ º¸³»Áö ¾ÊÀ» °ÍÀΰ¡ ÇÏ´Â ¹®Á¦¿¡ ´ëÇؼ­´Â ¸î °¡Áö ¹Ì¹¦ÇÑ ¹®Á¦°¡ ÀÖ´Ù. °ü½ÉÀÌ ÀÖ´Ù¸é RFC¸¦ ÂüÁ¶ÇÒ °Í.

IGMPv2¶ó¿ìÅÍ°¡ ÀÌÅ» ¸Þ½ÃÁö¸¦ ¹ÞÀ¸¸é ¶ó¿ìÅÍ´Â ±×·ìÀ» ÁöÁ¤ÇÏ¿©(group-specific) ³²¾ÆÀÖ´Â ±×·ì¿¡°Ô ÁúÀǸ¦ º¸³½´Ù. À̰͵µ IGMPv2 ¿¡¼­ Ãß°¡µÈ »çÇ×ÀÌ´Ù. IGMPv1¿¡¼­ ±×·ì ÁöÁ¤ ÁúÀÇ´Â ¾ø¾ú´Ù. ¸ðµç ÁúÀÇ°¡ Àüü È£½ºÆ® ±×·ìÀ¸·Î º¸³»´Â ÁúÀÇ¿´´Ù. IGMP Çì´õ¿¡ Á¤ÀÇµÈ Å¸ÀÔ °ªÀº º¯ÇÏÁö ¾Ê¾ÒÁö¸¸(Àü°ú µ¿ÀÏÇÏ°Ô 0x11), "±×·ì ÁÖ¼Ò(Group Address)"Çʵå´Â ³²¾ÆÀÖ´Â ¸ÖƼij½ºÆ® ±×·ì ÁּҷΠä¿öÁø´Ù.

IGMPv1¿¡¼­ Àü¼Û½Ã 0À¸·Î ä¿ì°í ¼ö½Å½Ã ¹«½ÃÇϱâ·Î ÇÏ¿´´ø "Max Resp Time" Çʵå´Â "Membership Query"¿¡¼­¸¸ Àǹ̰¡ ÀÖ´Ù. ÀÌ Çʵå´Â º¸°íÇؾßÇÒ ÇÑ°è ½Ã°£À» ¼³Á¤Çϴµ¥ ¾²ÀδÙ. ¼º´ÉÀ» Á¶ÀýÇÏ´Â ¸ÞÄ¿´ÏÁòÀ¸·Î »ç¿ëÇÑ´Ù°í º¼ ¼ö ÀÖ´Ù.

IGMPv2¿¡¼­ »õ·Î¿î ¸Þ½ÃÁö ŸÀÔ 0x16ÀÌ Ãß°¡µÇ¾ú´Ù. ÀÌ°ÍÀº "Version 2 Membership Report"·Î¼­ IGMPv2 È£½ºÆ®°¡ IGMPv2 ¶ó¿ìÅ͸¦ ¹ß°ßÇßÀ» ¶§ Àü¼ÛÇÑ´Ù. (IGMPv2 È£½ºÆ®´Â "Max Response" Çʵ尡 0 À¸·Î ä¿öÁø ÆÐŶÀ» È®ÀÎÇÏ¿© IGMPv1 ¶ó¿ìÅÍ°¡ Á¸ÀçÇÑ´Ù´Â °ÍÀ» ¾Ë¾Æ³½´Ù).

µ¿½Ã¿¡ ¿©·¯ ¶ó¿ìÅÍ°¡ ÁúÀǸ¦ ÇÒ ¶§, IGMPv2 ´Â "discussions"¸¦ ȸÇÇÇÏ´Â ¸ÞÄ¿´ÏÁòÀ» Á¦°øÇÑ´Ù. ÀÌ °æ¿ì ³·Àº IP ÁÖ¼Ò¸¦ °¡Áø ¶ó¿ìÅÍ°¡ ÁúÀÇÀÚ(querier)°¡ µÇ°í ´Ù¸¥ ¶ó¿ìÅʹ ŸÀ̸Ӹ¦ ¼³Á¤ÇÑ´Ù. ³·Àº ¹øÈ£ÀÇ ¶ó¿ìÅÍ°¡ ¾î¶² ÀÌÀ¯·Î Á¦´ë·Î ÀÛµ¿ÇÏÁö ¸øÇϸé ŸÀ̸Ӱ¡ ¸¸·áµÈ ÈÄ ´Ù½Ã ÁúÀÇÀÚ¸¦ ¼³Á¤ÇÑ´Ù.

7.4 Ä¿³Î °ü·Ã »çÇ×

ÀÌ Àý¿¡¼­´Â ¸®´ª½º Ä¿³Î¿¡¼­ ¸ÖƼij½ºÆ® ±¸ÇöÀ» ÇнÀÇϱâ À§ÇÑ ½Ç¸¶¸®¸¦ º¸¿©ÁÙ °ÍÀÌ´Ù. ±¸Çö ÀÚü¸¦ ¼³¸íÇÏÁö´Â ¾Ê´Â´Ù. ´ÜÁö ¾îµð¼­ ãÀ» °ÍÀÎÁö¸¸ ¾Ë·ÁÁÖ´Ù.

ÀÌ ³»¿ëÀº 2.0.32¿¡¼­ÀÇ ¼³¸íÀ̹ǷΠÀÌ ±ÛÀ» Àд ½ÃÁ¡¿¡¼­ Á» ¿À·¡µÈ ³»¿ëÀÏÁöµµ ¸ð¸¥´Ù. (³×Æ®¿÷ ÄÚµå´Â 2.1.x¿¡¼­ ¸¹ÀÌ º¯°æµÇ¾ú´Ù.

¸®´ª½º Ä¿³Î¿¡¼­ ¸ÖƼij½ºÆ® ÄÚµå´Â Ç×»ó #ifdef CONFIG_IP_MULTICAST / #endif ½ÖÀ¸·Î µÑ·¯½Î¿© Àֱ⠶§¹®¿¡ ÇÊ¿äÇÏ´Ù¸é ¾ðÁ¦µçÁö Ä¿³Î¿¡ Æ÷ÇÔ(inclusion/exclusion)½ÃÅ°°Å³ª ¹èÁ¦½Ãų ¼ö ÀÖ´Ù. (ÀÌ Æ÷ÇÔ/¹èÁ¦´Â ÄÄÆÄÀÏ ½Ã¿¡ ÇàÇØÁö¸ç #ifdef ±¸¹®Àº ¼±Çà󸮱Ⱑ ÇÏ´Â ÀÛ¾÷À̶ó´Â °ÍÀ» ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. Æ÷ÇÔ¿©ºÎ °áÁ¤Àºmake config, make menuconfig ¶Ç´Â make xconfig¸¦ ½ÇÇà½Ãų ¶§ ÇÒ ¼ö ÀÖ´Ù.)

¸ÖƼij½ºÆ® ¶ó¿ìÅÍ ±â´ÉÀ» »ç¿ëÇÏ°í ½Í´Ù¸é #ifdef CONFIG_IP_MROUTE / #endif½Ö ¼ÓÀÇ ÄÚµåµéÀ» È°¼ºÈ­ ½ÃÄÑ¾ß ÇÑ´Ù.

Ä¿³Î ¼Ò½º´Â º¸Åë /usr/src/linux¿¡ ÀÖ´Ù. ÇÏÁö¸¸ À§Ä¡´Â º¯ÇÒ ¼öµµ ÀÖ´Â °ÍÀ̱⠶§¹®¿¡ Ä¿³Î ¼Ò½ºÀÇ À§Ä¡¸¦ °£´Ü ¸í·áÇÏ°Ô LINUX¶ó°í °¡Á¤ÇÏÀÚ. ÀÌÁ¦ Ä¿³Î¼Ò½º¸¦ /usr/src/linux ¿¡ Ç®¾úÀ» °æ¿ì, LINUX/net/ipv4/udp.c ´Â /usr/src/linux/net/ipv4/udp.c ¸¦ ÀǹÌÇÑ´Ù.

»ç¿ëÀÚ ÇÁ·Î±×·¥¿¡¼­ÀÇ ¸ÖƼij½ºÆ® ÀÎÅÍÆäÀ̽º´Â ¸ÖƼij½ºÆ® ÇÁ·Î±×·¡¹ÖÀ» ¼³¸íÇÑ Àý¿¡¼­ setsockopt()/ getsockopt()¸¦ ÅëÇØ ¸ðµÎ º¸¿© ÁÖ¾ú´Ù. ÀÌ µÎ ÇÔ¼ö´Â Àü´Þ¹ÞÀº º¯¼öÀÇ À¯È¿¼ºÀ» °Ë»çÇÑ ´ÙÀ½, ´Ù¸¥ ¸î °¡Áö ÇÔ¼ö¸¦ È£ÃâÇÏ¿© Ãß°¡ ÀûÀ¸·Î °Ë»çÇÏ°í, ¶Ç ´Ù¸¥ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ½ÄÀ¸·Î ±¸ÇöµÇ¾ú´Ù. (ÀÌ ¸ðµç ÇÔ¼ö È£Ãâ¿¡ °ü½ÉÀÌ ÀÖ´Ù¸é LINUX/net/socket.c (ÇÔ¼ö sys_socketcall() ¿Í sys_setsockopt()), LINUX/net/ipv4/af_inet.c (ÇÔ¼ö inet_setsockopt()) ±×¸®°í LINUX/net/ipv4/ip_sockglue.c (ÇÔ¼ö ip_setsockopt()) ¸¦ ÂüÁ¶Ç϶ó.)

LINUX/net/ipv4/ip_sockglue.cµµ ÁÖÀÇ ±í°Ô º¸¾Æ¾ß ÇÑ´Ù. ¿©±â¿¡´Â ÇÔ¼ö ip_setsockopt() ¿Í ip_getsockopt() °¡ µé¾î Àִµ¥ ´ëºÎºÐÀº (¾î¶² ¿¡·¯ üũ ÈÄ¿¡) °¡´ÉÇÑ optnameÀ» °Ë»çÇÏ´Â ½ºÀ§Ä¡°°Àº °ÍÀÌ´Ù. À¯´Ïij½ºÆ® ¿É¼Ç°ú ÇÔ²², IP_MULTICAST_TTL, IP_MULTICAST_LOOP, IP_MULTICAST_IF, IP_ADD_MEMBERSHIP, IP_DROP_MEMBERSHIP°°Àº ¸ðµç ¸ÖƼij½ºÆ® ¿É¼ÇÀ» ó¸®ÇÑ´Ù. ÀÌ ½ºÀ§Ä¡ ÀÌÀü¿¡ ¿É¼ÇÀ» °Ë»çÇÏ¿© ±×°ÍÀÌ ¸ÖƼij½ºÆ® ¶ó¿ìÅÍ ÁöÁ¤ ¿É¼ÇÀ̶ó¸é ÇÔ¼ö ip_mroute_setsockopt() ¿Í ip_mroute_getsockopt() ·Î ¶ó¿ìÆà µÈ´Ù. (ÆÄÀÏ LINUX/net/ipv4/ipmr.c ¿¡ ÀÖÀ½).

LINUX/net/ipv4/af_inet.c ¿¡¼­ ÀÌÀü Àý¿¡¼­ ³íÀÇÇß´ø ¼ÒÄÏ »ý¼º ±âº» °ªÀ» º¼ ¼ö ÀÖ´Ù. (loopback enabled, TTL=1, ÇÔ¼ö inet_create() Áß¿¡¼­)


  #ifdef CONFIG_IP_MULTICAST
          sk->ip_mc_loop=1;
          sk->ip_mc_ttl=1;
          *sk->ip_mc_name=0;
          sk->ip_mc_list=NULL;
  #endif

´ÙÀ½ Äڵ尡 "¼ÒÄÏÀ» ´ÝÀ¸¸é Ä¿³ÎÀº ÀÌ ¼ÒÄÏ¿¡ ÀÖ´ø ¸ðµç ȸ¿øÀ» Å»Åð½ÃŲ´Ù"´Â ³»¿ëÀ» ´ÜÁ¤ÀûÀ¸·Î º¸¿©ÁØ´Ù. (À§¿Í µ¿ÀÏ ÆÄÀÏÀÇ ÇÔ¼ö inet_release()¿¡¼­)


  #ifdef CONFIG_IP_MULTICAST
                  /* Applications forget to leave groups before exiting */
                  ip_mc_drop_socket(sk);
  #endif

¸µÅ© °èÃþÀÇ(Link Layer)ÀÇ ÀåÄ¡ µ¶¸³ÀûÀÎ(Device independent) ¿¬»êµéÀº LINUX/net/core/dev_mcast.c ¿¡ ÀÖ´Ù.

¾ÆÁ÷ µÎ °¡Áö Áß¿äÇÑ ÇÔ¼öµéÀ» ¼³¸íÇÏÁö ¾Ê¾Ò´Ù. ÀԷ ó¸® ÇÔ¼ö¿Í ¸ÖƼij½ºÆ® µ¥ÀÌÅͱ׷¥ Ãâ·Â ÇÔ¼öÀÌ´Ù. ´Ù¸¥ µ¥ÀÌÅͱ׷¥µé°ú ¸¶Âù°¡Áö·Î ÀÔ·Â µ¥ÀÌÅͱ׷¥Àº ÀåÄ¡ µå¶óÀ̹ö·ÎºÎÅÍ ip_rcv() ÇÕ¼ö(LINUX/net/ipv4/ip_input.c)·Î Àü´ÞµÈ´Ù. ÀÌ ÇÔ¼ö¿¡¼­ ÇÏÀ§ °èÃþÀ¸·ÎºÎÅÍ ÀüÇØÁø ¸ÖƼij½ºÆ® ÆÐŶÀ» ¿Ïº®ÇÏ°Ô ÇÊÅ͸µÇÑ´Ù(ÇÏÀ§·¹À̾¼­ ÃÖ´ëÇÑ ÇÊÅ͸µÇÏÁö¸¸, IP °èÃþ¿¡¼­ ¿ì¸®°¡ °ü½ÉÀ» °¡Áö°í ÀÖ´Â ±×·ì¿¡ ´ëÇØ 100% ¾Ë°í Àֱ⠶§¹®¿¡ ÆÐŶÀ» ¿ÏÀüÇÏ°Ô ÇÊÅ͸µÇÑ´Ù°í Çß´ø°ÍÀ» ±â¾ïÇÏÀÚ.) È£½ºÆ®°¡ ¸ÖƼij½ºÆ® ¶ó¿ìÅÍ·Î ÀÛµ¿ÁßÀ̶ó¸é ¿ª½Ã ÀÌ ÇÔ¼ö°¡ ÆÐŶ Æ÷¿öµù ¿©ºÎ¸¦ °áÁ¤ÇÏ°í ÀûÀýÇÏ°Ô ipmr_forward()¸¦ È£ÃâÇÑ´Ù. (ipmr_forward() Àº LINUX/net/ipv4/ipmr.c¿¡ ±¸ÇöµÇ¾î ÀÖ´Ù.).

ÆÐŶ Ãâ·Â ÀÓ¹«¸¦ ¸ÃÀº ÄÚµå´Â LINUX/net/ipv4/ip_output.c¿¡ ´ã°ÜÁ® ÀÖ´Ù. ÀÌ°÷¿¡¼­ ÆÐŶÀ» ·çÇÁ¹é ÇÒÁö ¾È ÇÒÁö(¾ÈÇÑ´Ù¸é ip_queue_xmit()È£Ãâ) °Ë»çÇϱ⠶§¹®¿¡IP_MULTICAST_LOOP ¿É¼ÇÀÌ È¿·ÂÀ» ¹ßÈÖÇÏ´Â °÷ÀÌ´Ù. ¶ÇÇÑ, ¿ÜºÎ·Î ÇâÇÏ´Â ÆÐŶÀÌ ¸ÖƼij½ºÆ®ÀÎÁö À¯´Ïij½ºÆ®ÀÎÁö¿¡ ÀÇ°ÅÇÏ¿© TTLÀ» Á¤ÇÏ´Â °÷À̱⵵ ÇÏ´Ù. ÀüÀÚÀÇ °Ü¿ì IP_MULTICAST_TTL ·Î Àü´ÞµÈ º¯¼ö¸¦ »ç¿ëÇÑ´Ù(ÇÔ¼ö ip_build_xmit()).

mrouted(Ä¿³Î¿¡ ¸ÖƼij½ºÆ® µ¥ÀÌÅͱ׷¥ ¶ó¿ìÆà ¹æ¹ýÀ» ¾Ë·ÁÁÖ´Â ÇÁ·Î±×·¥)·Î ÀÛ¾÷ÇÏ´Â µ¿¾È, ¿ì¸®´Â ¸ÖƼij½ºÆ® ¶ó¿ìÅÍ·Î ÀÛµ¿ÇÏ´Â ¿ì¸®ÀÇ ¸®´ª½º ¹Ú½º¿¡¼­ ¸¸µé¾îÁø ÆÐŶÀ» Á¦¿ÜÇÑ, ·ÎÄà ³×Æ®¿÷¿¡¼­ »ý¼ºµÈ ¸ÖƼij½ºÆ® µ¥ÀÌÅͱ׷¥Àº ¸ðµÎ ÀûÀýÇÏ°Ô ¶ó¿ìÆõǴ °ÍÀ» ¹ß°ßÇß´Ù. ip_input.c ´Â Á¦´ë·Î ÀÛµ¿ÇÏ°í ÀÖ´Â°Í °°¾ÒÁö¸¸ ip_output.c ´Â ±×·¸Áö ¾Ê¾Ò´Ù. Ãâ·Â ÇÁ·Î±×·¥ÀÇ ¼Ò½º Äڵ带 Àд µ¿¾È ¿ÜºÎ·Î ³ª°¡´Â µ¥ÀÌÅͱ׷¥µéÀÌ ¶ó¿ìÆà ¿©ºÎ¸¦ °áÁ¤ÇÏ´Â ÇÔ¼ö ipmr_forward()¸¦ °ÅÄ¡Áö ¾Ê´Â °ÍÀ» ¹ß°ßÇß´Ù. ÆÐŶµéÀº ·ÎÄà ³×Æ®¿÷À¸·Î Ãâ·ÂµÇ¾úÁö¸¸ ³×Æ®¿÷ Ä«µå´Â ÀÚ½ÅÀÌ Àü¼ÛÇÏ´Â µ¥ÀÌÅͱ׷¥À» ÀÐÀ» ¼ö ¾ø¾ú°í, ÀÌ·± µ¥ÀÌÅͱ׷¥µéÀº ¶ó¿ìÆõÇÁö ¾Ê¾Ò´Ù. ¿ì¸®°¡ ip_build_xmit() ÇÔ¼ö¿¡ ÀûÀýÇÑ Äڵ带 Ãß°¡ÇÏÀÚ ¸ðµç °ÍÀÌ ¿Ã¹Ù·Î ÀÛµ¿ÇÏ¿´´Ù. (¼Ò½º ¼öÁ¤Àº »çÄ¡¸¦ ¶°´Â °Íµµ À¯½ÄÇÑôÇÏ´Â °Íµµ ¾Æ´Ï´Ù; ÇÊ¿ä´Ù!)

ipmr_forward() ´Â ¼ö Â÷·Ê ¾ð±ÞÇß¾ú´Ù. ipmr_forward() ´Â ¿ì¸®°¡ ÈçÈ÷ À߸ø ÀÌÇØÇÏ°í ÀÖ´Â °ÍÀ» Ç®¾îÁÙ ¼ö Àֱ⠶§¹®¿¡ ¾ÆÁÖ Áß¿äÇÑ ÇÔ¼öÀÌ´Ù. ¸ÖƼij½ºÆ® Æ®·¡ÇÈÀ» ¶ó¿ìÆÃÇÒ ¶§, ÆÐŶ »çº»À» ¸¸µé°í ±×°ÍÀ» ¿Ã¹Ù¸¥ ¼ö½ÅÀÚ¿¡°Ô Àü´ÞÇÏ´Â °ÍÀº mroutedÀÚü°¡ ¾Æ´Ï´Ù. mrouted´Â ¸ðµç ¸ÖƼij½ºÆ® Æ®·¡ÇÈÀ» ¼ö½ÅÇÏ¿©, ±× Á¤º¸¿¡ ±Ù°ÅÇÏ¿© , ¸ÖƼij½ºÆ® ¶ó¿ìÆà Å×À̺íÀ» °è»êÇØ ³»°í Ä¿³Î¿¡ ¶ó¿ìÆà ¹æ¹ýÀ» ¾Ë·ÁÁØ´Ù. "ÀÌ ÀÎÅÍÆäÀ̽º¿¡¼­ µé¾î¿À´Â Àú ±×·ìÀÇ µ¥ÀÌÅͱ׷¥Àº Àú ÀÎÅÍÆäÀ̽º·Î º¸³»¶ó."

ÀÌ ¶ó¿ìÆà Á¤º¸´Â mrouted µ¥¸ó(raw ¼ÒÄÏ »ý¼º½Ã Áö¾îµÈ ÇÁ·ÎÅäÄÝÀº IPPROTO_IGMPÀ̾î¾ß ÇÑ´Ù.)ÀÌ ¸¸µç raw ¼ÒÄÏ¿¡¼­ setsockopt()¸¦ È£ÃâÇÏ¿© Ä¿³Î¿¡ ¼³Á¤ÇÑ´Ù. ÀÌ ¿É¼ÇÀº LINUX/net/ipv4/ipmr.c ÀÇ ip_mroute_setsockopt()ÇÔ¼ö¿¡¼­ ó¸®ÇÑ´Ù. ¼ÒÄÏ¿¡¼­ ¹ßÇàÇÑ Ã¹¹ø° ¿É¼Ç(would be better to call them commands rather than options)Àº MRT_INITÀ̾î¾ß ÇÑ´Ù. ù ¹ø° ¹ßÇàÇÑ ¿É¼ÇÀÌ MRT_INITÀÌ ¾Æ´Ï¶ó¸é ´Ù¸¥ ¸ðµç ¸í·ÉÀº ¹«½ÃÇÑ´Ù. (-EACCES¸¦ ¹Ý³³) ÇÑ È£½ºÆ® »ó¿¡´Â mroutedÀÇ ÀνºÅϽº°¡ ²À Çϳª¸¸ Á¸ÀçÇÒ ¼ö ÀÖ´Ù. ÀÌ°ÍÀ» ÃßÀûÇϱâ À§ÇØ Ã¹ ¹ø° MRT_INIT À» ¹Þ¾ÒÀ» ¶§ ±¸Á¶Ã¼ sock* mroute_socketÀÌ MRT_INIT À» ¼ö½ÅÇÑ ¼ÒÄÏÀ» °¡¸®Å°°Ô µÈ´Ù. ¸¸ÀÏ MRT_INIT À» ¹ßÇàÇßÀ»¶§ mroute_socketÀÌ ³Î(null)°ªÀ» °¡ÁöÁö ¾Ê´Â´Ù¸é ÀÌ¹Ì ´Ù¸¥ mrouted°¡ ÀÛµ¿ÁßÀÓÀ» ÀǹÌÇϹǷΠ-EADDRINUSE À» ¹Ý³³ÇÑ´Ù. ³ª¸ÓÁö ´Ù¸¥ ¸í·Éµé(MRT_DONE, MRT_ADD_VIF, MRT_DEL_VIF, MRT_ADD_MFC, MRT_DEL_MFC and MRT_ASSERT)Àº mroute_socket°ú ´Ù¸¥ ¼ÒÄÏ¿¡¼­ ¿Ã °æ¿ì -EACCES ¸¦ ¹Ý³³ÇÑ´Ù.

¶ó¿ìÆÃµÈ ¸ÖƼij½ºÆ® µ¥ÀÌÅͱ׷¥Àº ¹°¸®Àû ÀÎÅÍÆäÀ̽º ȤÀº (°¡»óÀûÀÎ) ÅͳÎÀ» ÅëÇØ Àü¼ÛÇϱ⠶§¹®¿¡, ÀϹÝÀûÀÎ Ãß»óÈ­(abstraction) ´Ü°è¸¦ VIFs, Áï, °¡»ó ÀÎÅÍÆäÀ̽º (Virtual InterFaces)°í¾ÈÇس´Ù. mrouted´Â ¹°¸® ȤÀº ÅͳΠÀÎÅÍÆäÀ̽º¸¦ °¡¸®Å°´Â vif ±¸Á¶Ã¼¸¦ ¶ó¿ìÆà Å×ÀÌºí¿¡ Ãß°¡Çϱâ À§ÇÏ¿© Ä¿³Î¿¡ ³Ñ°ÜÁÖ°í, µ¥ÀÌÅͱ׷¥À» ¾îµð·Î Æ÷¿öµùÇÒÁö ¾Ë·ÁÁÖ´Â ¸ÖƼij½ºÆ® Æ÷¿öµù ¸ñ·Ï(multicast forwarding entries)¿¡µµ ¾Ë·ÁÁØ´Ù.

VIFs ´Â MRT_ADD_VIF ·Î Ãß°¡ÇÏ°í MRT_DEL_VIF ·Î »èÁ¦ÇÑ´Ù.µÎ ÇÔ¼ö ¸ðµÎ vifctl ±¸Á¶Ã¼¸¦ Ä¿³Î·Î ³Ñ±ä´Ù. ( /usr/include/linux/mroute.h) ¿¡¼­ ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇÏ°í ÀÖ´Ù.


  struct vifctl {
          vifi_t  vifc_vifi;              /* Index of VIF */
          unsigned char vifc_flags;       /* VIFF_ flags */
          unsigned char vifc_threshold;   /* ttl limit */
          unsigned int vifc_rate_limit;   /* Rate limiter values (NI) */
          struct in_addr vifc_lcl_addr;   /* Our address */
          struct in_addr vifc_rmt_addr;   /* IPIP tunnel addr */
  };

ÀÌ Á¤º¸¸¦ ÅëÇØ vif_device ±¸Á¶Ã¼¸¦ ¸¸µç´Ù.


  struct vif_device
  {
          struct device   *dev;                   /* Device we are using */
          struct route    *rt_cache;              /* Tunnel route cache */
          unsigned long   bytes_in,bytes_out;
          unsigned long   pkt_in,pkt_out;         /* Statistics */
          unsigned long   rate_limit;             /* Traffic shaping (NI) */
          unsigned char   threshold;              /* TTL threshold */
          unsigned short  flags;                  /* Control flags */
          unsigned long   local,remote;           /* Addresses(remote for tunnels)*/
  };

ÀÌ ±¸Á¶Ã¼¿¡¼­ dev Ç׸ñÀ» ÁÖ¸ñÇ϶ó. device ±¸Á¶Ã¼´Â /usr/include/linux/netdevice.h ¿¡¼­ Á¤ÀÇÇÏ°í ÀÖ´Ù. ¾ÆÁÖ Å« ±¸Á¶Ã¼ÀÌÁö¸¸ ¿ì¸®´Â ´ÙÀ½ Çʵ忡¸¸ °ü½ÉÀ» µÎ¸é µÈ´Ù.

struct ip_mc_list* ip_mc_list; /* IP multicast filter chain */

ip_mc_list ±¸Á¶Ã¼´Â /usr/include/linux/igmp.h¿¡¼­ ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇÏ°í ÀÖ´Ù. :


  struct ip_mc_list
  {
          struct device *interface;
          unsigned long multiaddr;
          struct ip_mc_list *next;
          struct timer_list timer;
          short tm_running;
          short reporter;
          int users;
  };

dev ±¸Á¶Ã¼ÀÇ ip_mc_list ´Â ip_mc_list Çü ±¸Á¶Ã¼ÀÇ ¿¬°á¸®½ºÆ®¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍÀÌ´Ù. ip_mc_list ´Â ÇØ´ç ³×Æ®¿÷ ÀÎÅÍÆäÀ̽º°¡ ¸â¹ö·Î Âü¿©ÇÏ°í ÀÖ´Â ¸ÖƼij½ºÆ® ±×·ìÀ» ´ã°íÀÖ´Ù. ¿©±â¼­ ´Ù½Ã Çѹø, ȸ¿øÀº ÀÎÅÍÆäÀ̽º¿Í °ü°è°¡ ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. LINUX/net/ipv4/ip_input.c ´Â µ¥ÀÌÅͱ׷¥ÀÌ (µ¥ÀÌÅͱ׷¥À» ¼ö½ÅÇÑ ÀÎÅÍÆäÀ̽º°¡ ¼ÓÇÏ´Â ±×·ì °¡¿îµ¥) ¾î¶² ±×·ì¿¡ ¼ÓÇÑ °ÍÀÎÁö °áÁ¤Çϱâ À§ÇØ ÀÌ ¿¬°á¸®½ºÆ®¸¦ ¼øȸÇÑ´Ù.


  #ifdef CONFIG_IP_MULTICAST
                  if(!(dev->flags&IFF_ALLMULTI) && brd==IS_MULTICAfST
                     && iph->daddr!=IGMP_ALL_HOSTS
                     && !(dev->flags&IFF_LOOPBACK))
                  {
                          /*
                           *      Check it is for one of our groups
                           */
                          struct ip_mc_list *ip_mc=dev->ip_mc_list;
                          do
                          {
                                  if(ip_mc==NULL)
                                  {
                                          kfree_skb(skb, FREE_WRITE);
                                          return 0;
                                  }
                                  if(ip_mc->multiaddr==iph->daddr)
                                          break;
                                  ip_mc=ip_mc->next;
                          }
                          while(1);
                  }
  #endif

ip_mc_list±¸Á¶Ã¼¿¡¼­ users Çʵå´Â "IGMP ¹öÀü 1"¿¡¼­ ¼³¸íÇß´ø °ÍÀ» ±¸ÇöÇϱâ À§ÇØ »ç¿ëÇÑ´Ù. ÇÁ·Î¼¼½º°¡ ±×·ì¿¡ Âü¿© ÇÒ¶§, ÀÎÅÍÆäÀ̽º°¡ ÀÌ¹Ì ±× ±×·ìÀÇ È¸¿øÀ̶ó¸é (´Ù½Ã ¸»Çؼ­, µ¿ÀÏ ÀÎÅÍÆäÀ̽º·Î µ¿ÀÏ ±×·ì¿¡ Âü¿©ÇÑ ÇÁ·Î¼¼½º°¡ ÀÌ¹Ì ÀÖÀ¸¸é) ¸â¹ö ¼ö(users)¸¸ Áõ°¡½ÃŲ´Ù. IGMP ¸Þ½ÃÁö¸¦ º¸³»Áö ¾ÊÀ½À», ´ÙÀ½ Äڵ忡¼­ º¼ ¼ö ÀÖ´Ù. (ip_mc_inc_group() ¿¡¼­ °¡Á®¿ÔÀ¸¸ç, ip_mc_join_group() ¿Í LINUX/net/ipv4/igmp.c¿¡¼­ È£ÃâÇÑ´Ù.)


          for(i=dev->ip_mc_list;i!=NULL;i=i->next)
          {
                  if(i->multiaddr==addr)
                  {
                          i->users++;
                          return;
                  }
          }

¸â¹ö°¡ Å»ÅðÇÒ ¶§ Ä«¿îÅ͸¦ °¨¼ÒÇϸç, Ä«¿îÅÍ°¡ 0¿¡ ´Ù´Ù¶úÀ» ¶§¿¡¸¸ ºÎ°¡ÀûÀÎ ÀÛ¾÷À» ¼öÇàÇÑ´Ù. (ip_mc_dec_group()).

MRT_ADD_MFC ¿Í MRT_DEL_MFC ´Â ¸ÖƼij½ºÆ® ¶ó¿ìÆà Å×ÀÌºí¿¡¼­ Æ÷¿öµù Ç׸ñÀ» ¼ºÁ¤Çϰųª »èÁ¦ÇÑ´Ù. µÑ ´Ù mfcctl ±¸Á¶Ã¼¸¦ ´ÙÀ½ Á¤º¸¿Í ÇÔ²² Ä¿³Î·Î ³Ñ±ä´Ù. (/usr/include/linux/mroute.h ¿¡¼­ Á¤ÀÇ)


  struct mfcctl
  {
          struct in_addr mfcc_origin;             /* Origin of mcast      */
          struct in_addr mfcc_mcastgrp;           /* Group in question    */
          vifi_t  mfcc_parent;                    /* Where it arrived     */
          unsigned char mfcc_ttls[MAXVIFS];       /* Where it is going    */
  };

ÀÌ»óÀÇ Á¤º¸¸¦ °¡Áö°í, ipmr_forward() ´Â VIFs¸¦ "µ¹¾Æ´Ù´Ñ´Ù". ±×¸®°í ÀÏÄ¡ÇÏ´Â Æ÷¿öµù Ç׸ñÀ» ¹ß°ßÇÏ¸é µ¥ÀÌÅͱ׷¥À» º¹»çÇÏ¿© ipmr_queue_xmit()À» È£ÃâÇÑ´Ù. ±×·¯¸é, ipmr_queue_xmit() Àº ÆÐŶÀ» ÅͳÎÀ» ÅëÇØ º¸³¾ °æ¿ì ¶ó¿ìÆà Å×ÀÌºí¿¡ ¸í½Ã µÃ Ãâ·ÂÀåÄ¡¿Í ¸ñÀûÁö ÁÖ¼Ò¸¦ ÀÌ¿ëÇØ Àü¼ÛÇÑ´Ù. (Áï, ¹Ý´ëÆí ÅͳΠÁ¾´ÜÀÇ À¯´Ïij½ºÆ® ÁÖ¼Ò) ÇÔ¼ö ip_rt_event() ´Â(Ãâ·Â°ú Á÷Á¢ÀûÀÎ °ü·ÃÀº ¾øÁö¸¸ ip_output.c ¿¡ µé¾î ÀÖ´Ù.) ÀåÄ¡ È°¼ºÈ­ ¸Þ½ÃÁö °°Àº ³×Æ®¿÷ ÀåÄ¡ °ü·ÃµÈ À̺¥Æ®(event)¸¦ ¹Þ´Â´Ù. ÀÌ ÇÔ¼ö´Â ÀåÄ¡°¡ Àüü È£½ºÆ® ±×·ì¿¡ Âü¿©ÇÏ´Â °ÍÀ» º¸ÁõÇÑ´Ù.

IGMP ÇÔ¼öµéÀº LINUX/net/ipv4/igmp.c ¿¡¼­ ±¸ÇöÇÑ´Ù. ÀÌ ÇÔ¼öµé¿¡ °üÇÑ Áß¿äÇÑ Á¤º¸´Â /usr/include/linux/igmp.h ¿Í /usr/include/linux/mroute.h ¿¡ ÀÖ´Ù. /proc/net ÀÇ IGMP °ü·Ã Ç׸ñÀº LINUX/net/ipv4/ip_output.c¿¡ ÀÖ´Â ip_init() ¿¡¼­ ¸¸µç´Ù.


´ÙÀ½ ÀÌÀü Â÷·Ê