文档章节

udp跨网段通信的实现方式

刘大神
 刘大神
发布于 2016/05/16 10:01
字数 921
阅读 1209
收藏 1

最近一直在研究局域网发现活跃主机的demo,没做之前,感觉水不深,做了之后,差点没淹死。。。。。

需求是这样的:现在要开发一种模块,模块的MAC地址出厂的时候已经写好,但是IP地址可以由客户随便设置。现在的要求是只要模块一接上网线,无聊其IP设置为什么,都可以通过上位机软件通过局域网将其搜索出来。

方式一:采用 p2p方式,编写一个服务端程序和客户端程序,客户端程序自动向服务端报告本机IP和mac地址,由服务端进行服务调度,实现局域网发现;

方式二:采用arp协议,对局域网内活动的主机进行发现,这种方式主要是通过对局域网内的arp捕获,分析处理arp包的内容进行判断,实现局域网发现;

方式三:采用组播的方式,客户端所有主机都自动加入到组播中,在组播中,凡是存在的IP都是活跃折,实现局域网发现。

 

实际情况:

    采用第一种方式的话 ,需要连接到外网,很多时候,并不提供外网,所以第一种方案不可以;采用第二种方案也是有着局限性,因为arp协议是采用广播的方式进行,在没有外面的情况下,不同网段需要路由器转发,但路由器默认过滤广播包,所有,只有最终路由器才知道目的IP的MAC地址,如果进行跨网段通信的话,需要特定支持跨网段通信的路由器。

下面详细来说下udp组播方式如何实现的:

    组播(Multicast)传输:在发送者和每一接收者之间实现点对多点网络连接。如果一台发送者同时给多个的接收者传输相同的数据,也只需复制一份的相同数据包。它提高了数据传送效率。减少了骨干网络出现拥塞的可能性。

    在组播方式中,信息的发送者称为“组播源”,信息接收者称为该信息的“组播组”,支持组播信息传输的所有路由器称为“组播路由器”。加入同一组播组的接收者成员可以广泛分布在网络中的任何地方,即“组播组”没有地域限制。需要注意的是,组播源不一定属于组播组,它向组播组发送数据,自己不一定是接收者。多个组播源可以同时向一个组播组发送报文。

    假设只有 Host B、Host D 和Host E 需要信息,采用组播方式时,可以让这些主机加入同一个组播组(Multicast group),组播源向该组播组只需发送一份信息,并由网络中各路由器根据该组播组中各成员的分布情况对该信息进行复制和转发,最后该信息会准确地发送给Host B、Host D 和Host E。

下面附上boost.asio的组播(Multicast)实现:

http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/example/cpp03/multicast/sender.cpp

http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/example/cpp03/multicast/receiver.cpp

 

 

ps:udp进行跨网段通信还有一种方法,就是计算网段进行广播。这种方式就有点复杂了,需要进行计算,这样在效率方面可能也会有些损失,具体实现并没有用过,有兴趣的童鞋可以试试。

© 著作权归作者所有

刘大神
粉丝 8
博文 21
码字总数 18133
作品 0
朝阳
高级程序员
私信 提问
VXLAN介绍——网络技术

读者的约束:需要读者对TCP/IP有较深入的理解。 为什么要VXLAN? ● 虚拟机规模受网络规格限制虚拟机规模受网络规格限制 在大二层网络环境下,数据报文是通过查询MAC地址表进行二层转发,而M...

1160636144
2017/05/25
0
0
七、Docker网络以及跨宿主机通信

讲在前面: 1.目前实现的是单机部署,如何创建镜像,管理镜像;如何创建容器,管理容器;如何快速创建docker虚拟主机machine,如何快速部署多组件项目compose以及如何跨宿主机建立集群swarm...

江措小朋友
01/30
0
0
Kubernetes网络分析之Flannel

Flannel是CoreOS开源的CNI网络插件,下图flannel官网提供的一个数据包经过封包、传输以及拆包的示意图,从这个图片里面里面可以看出两台机器的docker0分别处于不同的段:10.1.20.1/24 和 10...

店家小二
2018/12/14
0
0
Docker的网络模式和如何跨主机通信

版权声明:本文为博主原创文章,未经博主允许不得转载。欢迎访问我的博客 https://blog.csdn.net/smooth00/article/details/82842234 Docker有四种网络模式:Bridge、Host、Container、None,...

smooth00
2018/09/26
0
0
docker下基于flannel的overlay网络分析

近期公司的flannel网络很不稳定,花时间研究了下并且保证云端自动部署的网络能够正常work。 拓扑如下:(点开看大图) 容器网卡通过docker0桥接到flannel0网卡,而每个host对应的flannel0网段...

xue777hua
2015/08/05
0
13

没有更多内容

加载失败,请刷新页面

加载更多

初始化一个vue项目

vue init webpack ”项目名称“ 第一步安装node 第二步项目初始化 1.安装vue-cli cnpm install vue-cli -g //全局安装 vue-cli 2、创建文件夹 3、在文件夹下执行 vue init webpack ”...

cupid_ly
13分钟前
0
0
Leetcode PHP题解--D106 997. Find the Town Judge

D106 997. Find the Town Judge 题目链接 997. Find the Town Judge 题目分析 给定一个数组N代表人数,和给定一个数组,每个元素为一个只有两个值(a,b)的数组。 代表a信任b。 从中找到一个b...

skys215
46分钟前
2
0
日志相关---log4j2配置文件详解

一、关于配置文件的名称以及在项目中的存放位置 log4j 2.x版本不再支持像1.x中的.properties后缀的文件配置方式,2.x版本配置文件后缀名只能为".xml",".json"或者".jsn". 系统选择配置文件的...

spinachgit
46分钟前
1
0
redis 消息队列实现

方式一:通过list的阻塞读取命令,blpop或者brpop 消费者 public class Consumer extends DemoApplicationTests{ @Test public void consume(){ int timeout = 0;//永不超......

小海bug
今天
2
0
如何把微信语音汇总成一个MP3文件?

本篇以苹果手机为例,安卓手机也可类似。 第一步,安装同步助手 同步助手是一款在电脑上安装,可以保存手机上的内容的软件。支持把微信的聊天历史内容导出。甚至支持筛选语音文件按顺序导出—...

吴伟祥
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部