1、在IP分类中,D类IP地址用于组播MAC。
2、在TCP/IP中,最常用的v4组播MAC地址的前24位固定为01005e,第25位固定为0,后23位由IP地址的后23位复制得出。
3、在D类组播IP中有5位未用,也就是说组播IP和组播MAC的映射并不唯一,
4、每一个组播MAC最多可映射对应32个组播IP。
5、备注:映射涉及到2进制和16进制之间的转换:4位2进制对应一位16进制:000000001(二进制)——>01(16进制)
组播ip(十进制):224.0.0.0–239.255.255.255
组播ip(二进制):11100000.00000000.00000000.00000000----111011111.111111111.111111111.11111111
组播mac(二进制):00000001.00000000.01011110+0+组播ip后23位(二进制)
组播mac(十六进制):01-00-5e+【(0+组播ip后23位)映射16进制】
可用组播范围:0100.5E00.0000----0100.5E07.FFFF
MAC由48bit组成:前24位是OUI ,后24位由厂商定义
组播IP和组播MAC的映射示意图如下:

最笨的方法,也是最安全的方法,就是把组播IP地址,换成二进制数。再把二进制换成16进制,第1个8位(从左往右看)不用,因为有组播MAC的限制已经规定是0100.5E开头,组播IP地址第2个8位中的第1位规定为0(从左往右看).所以当不为0时,要改成0来换算。
Example:
源IP 224.1.1.1
换算成二进制 11100000.00000001.00000001.00000001
再换成16进制 01 .01 .01
加上组播MAC头 —— 0100.5E
最后形成组播MAC—— 0100.5E01.01.01
可用的其它31个组播IP地址:
224.129.1.1
225.1.1.1; 225.129.1.1
226.1.1.1 ;226.129.1.1
227.1.1.1 ;227.129.1.1
228.1.1.1 ;228.129.1.1
229.1.1.1 ; 229.129.1.1
230.1.1.1 ;230.129.1.1
231.1.1.1 ;231.129.1.1
232.1.1.1 ;232.129.1.1
233.1.1.1 ;233.129.1.1
234.1.1.1 ;234.129.1.1
235.1.1.1 ;235.129.1.1
236.1.1.1 ;236.129.1.1
237.1.1.1 ; 237.129.1.1
238.1.1.1 ;238.129.1.1
239.1.1.1 ;239.129.1.1
加上:224.1.1.1 刚好32个。
源IP 224.132.1.1
换算成二进制 : 11100000.10000100.00000001.00000001
取组播ip后23位 : 11100000.1{0000100.00000001.00000001}
将第24位为0 11100000.{0}0000100.00000001.00000001
再换成16进制 04 .01 .01
组播mac(二进制):00000001.00000000.01011110+0+组播ip后23位(二进制)
即:00000001.00000000.01011110.{+0+0000100.00000001.00000001}
即:00000001.00000000.01011110.00000100.00000001.00000001
组播mac(十六进制):01-00-5e+【04.01.01】
最后形成: 0100.5e04.01.01
可用的其它31个组播IP地址:
224.4.1.1
225.4.1.1 -225.132.1.1
226.4.1.1 -226.132.1.1
227.4.1.1- 227.132.1.1
228.4.1.1 -228.132.1.1
229.4.1.1- 229.132.1.1
230.4.1.1 -230.132.1.1
231.4.1.1 -231.132.1.1
232.4.1.1 -232.132.1.1
233.4.1.1 -233.132.1.1
234.4.1.1 -234.132.1.1
235.4.1.1 -235.132.1.1
236.4.1.1 -236.132.1.1
237.4.1.1 -237.132.1.1
238.4.1.1 -238.132.1.1
239.4.1.1- 239.132.1.1
加上224.132.1.1,刚好32个。
另一种方法是:如果给的IP地址第1、2、3位都大于128,可以用128除以16(因为可用IP是28位,可用MAC是23位,剩5位可变,2的4次方是16),得出来的商换成16进制是MAC的左位,得出来的余数换成16进制是MAC的右位。第4组8位不看,因为是规定是0100.5E开头。
第3组第8位必需为0.当为1时,要去掉换成0.
Example:
源IP : 224.215.145.230
转成二进制:11100000.11010111.10010001.11101000
除16: 215/16商:13,余:7 . 145/16商:9,余:1 . 230/16商:14,余:6
换成(16进制): D7 . 91. E6
第24位为0 57.91.E6
加上组播MAC头 0100.5E
形成: 0100.5E57.91.E6
可用的其它31们组播IP地址:
224.87.145.230
225.87.145.230 225.215.145.230
225.87.145.230 225.215.145.230
226.87.145.230 226.215.145.230
227.87.145.230 227.215.145.230
228.87.145.230 228.215.145.230
229.87.145.230 229.215.145.230
230.87.145.230 230.215.145.230
231.87.145.230 231.215.145.230
232.87.145.230 232.215.145.230
233.87.145.230 233.215.145.230
234.87.145.230 234.215.145.230
235.87.145.230 235.215.145.230
236.87.145.230 236.215.145.230
237.87.145.230 237.215.145.230
238.87.145.230 238.215.145.230
239.87.145.230 239.215.145.230
加上224.215.145.230.刚好32个。
计算剩于其它的可用组播IP方法:
刚第三位大于128时,要减去128
当第三位小于128时,要加上128
这样从224-239每一组里有两个地址,刚好32个。
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
我想将我的MacSnowLeopardruby从1.8.7升级到1.9.1版本,有人知道轻松且最好的升级方法吗?因为我读了一些论坛/帖子/博客/讨论说覆盖苹果发布的ruby不好将Rails从版本2.2.2升级到2.3.8的最佳方法是什么?因为我找到的所有信息都仅适用于豹/老虎,而且很少有关于雪豹的复杂文章。他们还说覆盖apple提供的rails不好吗。谁能帮帮我?谢谢。 最佳答案 DanBenjamin有一些greatinstructionsforcompilingandinstallingRuby,RubyGemsandRai
我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案
如果names为nil,则以下中断。我怎样才能让这个map只有在它不是nil时才执行?self.topics=names.split(",").mapdo|n|Topic.where(name:n.strip).first_or_create!end 最佳答案 其他几个选项:选项1(在其上执行map时检查split的结果):names_list=names.try(:split,",")self.topics=names_list.mapdo|n|Topic.where(name:n.strip).first_or_create!e
我已经通过提供MagickWand.h的路径尝试了一切,我安装了命令工具。谁能帮帮我?$geminstallrmagick-v2.13.1Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingrmagick:ERROR:Failedtobuildgemnativeextension./Users/ghazanfarali/.rvm/rubies/ruby-1.8.7-p357/bin/rubyextconf.rbcheckingforRubyversion>=1.8.5...yescheckingfor/
我想在Ruby的TCPServer中获取客户端的IP地址。以及(如果可能的话)MAC地址。例如,Ruby中的时间服务器,请参阅评论。tcpserver=TCPServer.new("",80)iftcpserverputs"Listening"loopdosocket=tcpserver.acceptifsocketThread.newdoputs"Connectedfrom"+#HERE!HowcanigettheIPAddressfromtheclient?socket.write(Time.now.to_s)socket.closeendendendend非常感谢!
我正在使用macos,我想使用ruby驱动程序连接到sqlserver。我想使用tiny_tds,但它给出了缺少free_tds的错误,但它已经安装了。怎么能过这个?~brewinstallfreetdsWarning:freetds-0.91.112alreadyinstalled~sudogeminstalltiny_tdsBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtiny_tds:ERROR:Failedtobuildgemnativeextension.完整日志如下:/System
在此处阅读有关SO的各种解释,它们是这样描述的:map:Themapmethodtakesanenumerableobjectandablock,andrunstheblockforeachelement注入(inject):Injecttakesavalueandablock,anditrunsthatblockonceforeachelementofthelist.希望你明白为什么我觉得它们表面上看起来很相似。我什么时候会选择一个而不是另一个,它们之间有什么明显的区别吗? 最佳答案 如果您认为inject也别名为reduce,这
我一直在工作中使用seleniumIDE。现在我们决定将Seleniumwebdriver与Ruby结合使用。我完全不知道如何设置我的Mac,MacProYosemite10.10.5。在我的终端中,我运行了这些命令:$ruby-e"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/master/install)"$brewdoctorYoursystemisreadytobrew.$brewinstallruby==>Summary/usr/local/Cellar/openssl/1.0.2d_1:464fi
我在尝试通过rubygems安装json模块时收到此警告。有什么想法吗?Mac-Minipoulh$sudogeminstalljsonPassword:WARNING:File'/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8/specifications/json-1.2.0.gemspec'doesnotevaluatetoagemspecificationBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errori