1.IP地址的分类
单播地址,一般的地址,帧数据发往单个地址
广播地址,一个主机向网上的其它全部主机发送帧数据的地址,比如ARP和RARP等等
多播地址,数据帧仅仅发给属于多播组的主机
从上面可以看出,多播和广播需要网络层和数据链路层两层的支持,而且多播和广播在传输层只支持UDP数据报,因为TCP是端到端的通信
查看网络接口是否支持广播可以用ifconfig找到flag字段
2.帧的过滤流程,在TCP/IP协议框架下
3.mac地址的广播地址
mac认为最高字节的地位为1就是多播地址,以太网广播地址(ff:ff:ff:ff:ff:ff)可以看作多播地址的特殊例子。
在发送多播报文的时候需要数据链路层的支持,即把数据链路层的帧目的地址转化为多播地址,而IP多播地址为D类地址格式为:
范围从224.0.0.0到239.255.255.255(一些多播地址已经被IANA分配)
224.0.0.1指的是子网里面所有系统组
224.0.0.2指的是子网里面所有路由器
这里我们需要一个IP地址映射到mac地址的方式,mac地址的规定如下01:00:5e:00:00:00到01:00:5e:7f:ff:ff,只有23位,现在系统采用的方式直接复制组播IP到mac的低23位。这样会有32个IP映射到同一个mac地址(所以需要在IP层或者链路层进行帧过滤)
4.广播的缺点
因为广播是到UDP层才能进行分析,因此增大了对报文不感兴趣的主机的压力(广播没有增加网络通信量)
在mac上广播数据不支持分片 可以用ping -s 1473 host xxx来验证
5.代码实现和分析
5.1服务器端和客户端的简单实现
代码里面服务器端发送了一个指向3000端口的多播报文,多播地址为224.0.0.23。创建于本地3000端口的UDP客户端收到多播报文(本机加入了多播组)
/**
* Created by PhpStorm.
* User: kisstheraik
* Date: 16/7/26
* Time: 上午10:35
* Description: 模拟IP多播
*/
//创建一个socket,加入一个多播组,然后向这个接口发送多播报文
//客户端socket
$rsocket=socket_create(AF_INET,SOCK_DGRAM,SOL_UDP);
//接收端口加入多播组
socket_set_option($rsocket,IPPROTO_IP,MCAST_JOIN_GROUP,array("group"=>'224.0.0.23'));
//这里要用0.0.0.0来表明本机所有的ip,使用localhost或者127.0.0.1是回环地址,收不到数据
socket_bind($rsocket,'0.0.0.0',3008);
$data='hello';
//服务器端socket
$ssocket=socket_create(AF_INET,SOCK_DGRAM,SOL_UDP);
socket_sendto($ssocket,$data,strlen($data),0,'224.0.0.23',3008);
socket_close($ssocket);
//客户端读取数据
socket_recvfrom($rsocket,$rec,65335,0,$host,$port);
echo $rec.PHP_EOL;
socket_close($rsocket);
5.2数据报的分析
可以看到目的mac地址是由ip地址的低23位复制过来的,发送的却是是UDP报文