广播和多播,及其代码实现

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客户端收到多播报文(本机加入了多播组)

<?php
/**
 * 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报文

转载于:https://my.oschina.net/lovezfy/blog/718756

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值