IPC onvif全网通的实现原理

理解onvif全网通之前需要先理解一个概念,那就“IP网段”。先看看百度百科对IP网段的解释:

(以下是百度百科的解释)

网段(network segment)一般指一个计算机网络中使用同一物理层设备(传输介质,中继器,集线器等)能够直接通讯的那一部分。例如,从192.168.0.1到192.168.255.255这之间就是一个网段。
在中文的网络知识入门中,这个词更经常地被误用来指代“子网”,也就是网络层中由网关或路由器等设备隔开的不同部分。例如IP为 192.168.0.1 ~ 192.168.0.254 的设备就位于掩码 255.255.255.0 的同一子网中,这句话经常被说成“位于192.168.0.x ‘网段’中”,如果不涉及网络层之下的结构,这么说不会引起混淆,但是在深入探讨互联网底层结构的时候,应该避免使用“网段”来指代“子网”。

什么?你没看懂?是的,看到这里我也没看懂。那么让咱们先理解“子网掩码”。

(以下是百度百科的解释)

在同一网段,要求网络标识相同。网络标识就是用IP的二进制与子网掩码的二进制数据作'与'运算(可用WINDOWS计算器算二进制),所得结果,而不是IP地址前几段相同就表示在同一网段。若网络标识相同,就表示在同一网段。

例:192.168.0.1 255.255.255.0的网络标识为:192.168.0.0
192.168.0.1: 11000000.10101000.00000000.00000001
255.255.255.0:11111111.11111111.11111111.00000000
做 “与”运算
11000000.10101000.00000000.00000000
结果:192.168.0.0 

还没看懂吗?反正我是看懂了。下面是我的理解,可能比较粗糙。

1、IP网段的理解:
与“子网掩码”进行“与”运算后结果相同的这些IP就在同一个“IP网段”之中。
2、子网掩码的理解:
中文网络知识中,大家经常把“子网”理解为“网段”,“子网掩码”就是用来划分“网段”的。与“子网掩码”进行“与”运算后结果相同的这些IP就在同一个“IP网段”之中。

是的,这2个概念的理解就是鸡生蛋蛋生鸡,不能单独理解。

什么是onvif全网通

什么是onvif协议,我在本文就不详细解释了,以后有机会再做个专题解释。先简单理解为基于HTTP协议的一个国际通用的网络通信规范,在安防监控领域之中被广泛应用于“IPC”与“NVR”之间的通信,NVR通过onvif协议可以添加IPC,并获取/设置IPC的相关配置,以及控制IPC的相关功能。

很多NVR常常不能跨网段添加和配置IPC,但是可以通过UDP广播方法跨网段搜索到同一个路由器里的IPC。onvif全网通的意思就是让NVR添加IPC突破不同网段的限制,不管NVR和IPC的IP是否在同一个网段、是否存在IP冲突,即插即用,只要都接到路由器中用NVR搜索,搜出来的IPC就可以直接添加使用。

IPC如何实现onvif全网通

IPC实现onvif全网通的方法可能有很多种,本文使用的方法是:IPC收到NVR的udp广播包时,识别出NVR的IP地址,然后根据IPC当前的子网掩码和NVR的IP地址算出IP网段,知道IP网段就可以把IPC的IP改为与NVR同一个网段的IP了。
这里还有一个很重要的问题需要解决,那就是IP冲突:

一方面,同一批IPC出厂设置时的默认IP都是一样的,一上电之后IP都是冲突的。
另一方面,因为一开始时NVR的网段和IPC的网段不是同一个网段,而传统的通过ping某个IP判断IP是否正在使用的方法显然不可取,因为ping是不能跨网段的。那么IPC修改自身IP之前要如何跨网段知道NVR所在网段有哪些IP是正在使用,哪些IP是未被使用的呢?这就需要使用ARP协议了。下面解释一下ARP协议。

使用ARP协议跨网段判断某个IP是否正在使用

1、ARP协议

ARP协议是TCP/IP协议网际层的一种协议,是地址解析协议,可以根据IP地址获取物理地址(MAC地址)。

也就是说通过ARP协议可以获取某个IP地址的MAC地址,如果得到的MAC地址不存在或者与本机的MAC地址一致就说明这个IP地址没有被别的设备使用,如果得到的MAC地址存在且不是本机的MAC地址,就说明这个IP正在被别的设备使用。

2、怎么实现呢

在linux系统中的shell命令中有ping和arping,arping就是ARP级别的ping。具体实现可以参考linux源码中的arping实现源代码。或查看我的另一篇文章《linux socket使用ARP判断局域网指定IP是否被占用》