[0034] 为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明一部份实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
[0035] 本发明公开了一种本发明方法,实施例一如图1所示,包括:
[0036] S100私网终端向公网终端发送ICMP请求报文,所述ICMP请求报文含有定义为请求自身公网IP的特征码;
[0037] S200所述公网终端在接收到所述ICMP请求报文后,检测所述ICMP请求报文中是否含有所述特征码,若是,则进入步骤S300,否则进入步骤S400;
[0038] S300所述公网终端提取所述ICMP请求报文的所述私网终端所在的源IP地址,构造ICMP应答报文,并将含有所述特征码及所述私网终端所在的源IP地址的ICMP应答报文发送给所述私网终端;
[0039] S400所述公网终端复制所述ICMP请求报文的有效载荷字段至ICMP应答报文中,并将所述ICMP应答报文发送给所述私网终端;
[0040] S500所述私网终端在接收到所述ICMP应答报文后,检测所述ICMP应答报文中是否含有所述特征码,若是,则提取所述ICMP应答报文中的所述私网终端所在的源IP地址,所述私网终端所在的源IP地址即为所述私网终端的公网IP地址。
[0041] 具体的,假如在私网上的主机A想要知道自己的公网IP地址,通过本发明实现方式如下:首先,私网上的主机A来ping公网上终端B的IP地址后,Ping命令会构建一个固定格式的ICMP请求数据包,该请求数据包会包含特征码X,然后由ICMP协议将这个数据包连同终端B的IP地址一起交给IP层协议(和ICMP一样,实际上是一组后台运行的进程),IP层协议通过终端B的IP地址和自己的子网掩码,发现它跟自己不属于同一网段内,就直接交给路由处理,路由得到这个数据帧后再跟公网终端B进行联系,将ICMP请求报文发送给公网终端B,终端B在收到ICMP请求报文后检测看该报文中是否含有特征码X,如果是的话,则说明是私网终端A想要获取自身的公网IP地址,于是,公网终端B便提取ICMP请求报文的源IP地址,也就是路由的IP地址,然后构建ICMP应答报文,该报文中包含了特征码X和提取的源IP地址,然后将该应答报文发送给路由,路由在接收到该ICMP应答报文后再转发给主机A,主机A在收到应答报文后,先要查看是否有特征码X,有的话则说明公网终端B对获取公网IP的请求报文做了回应,主机A可从应答的报文中看到其所在网络的公网IP地址。
[0042] 在上述实施例中,我们还需要对私网终端的ping、公网终端的ping功能进行相应的设置,具体的,包括步骤:
[0043] S010在所述私网终端中定义请求自身公网IP的特征码,设置用于获取公网IP的ICMP请求报文的有效载荷字段的格式;
[0044] S020在所述公网终端中定义请求公网IP的特征码,设置用于获取公网IP的ICMP应答报文的有效载荷字段的格式。
[0045] 比如我们定义“321532”为请求自身公网IP的特征码,设置报文的payload(有效载荷)格式为一6byte的特征码,其后为一字符串:“Reply with my IP”,ICMP一般要求最小payload为64字节,我们对不满64字节的部分可以用0来填充,所以整个payload格式如下:
[0046] 特征码 “Reply with my IP” Pad 0
[0047] 当然,由于我们已经定义了特征码,因此,特征码后的字符串我们也可以不设定,或者干脆全用0填充亦可。只是如果定义了特征码和字符串的话,可以进行双重的校验,以便公网终端更加确定该报文是为了获取公网IP而来。避免请求报文由于偶然也出现了特征码数据,但并不是为了获取公网IP。
[0048] 同样的,公网终端也需要进行相应的设置,同样需要定义请求公网IP的特征码,以便收到请求报文后,若发现该请求报文中含有特征码,便知道这个报文是发送方想要获取自身的公网IP,从而进行相应的提取动作,应答的报文的payload同样需要设置格式,相应的,应答报文的payload同样均为64字节,分成三部分:特征码、XX.XX.XX.XX(提取的公网IP地址)、若干0(不64字节部分用0填充)。
[0049] 较佳的,上述特征码位于所述ICMP请求报文的有效载荷字段的首部。只要双方约定好位置即可,一般位于首部的话便于检测。
[0050] 较佳的,所述特征码长度小于或等于10字节。值得注意的是,特征码的长度太小则容易与普通的报文混淆,特征码长度太长也较为繁冗,因此一般设定10字节左右较为合适。
[0051] 本发明方法的另一实施例,首先假设有某台服务器处于公网位置。我们现在改进ICMP,即ping。正常按照ICMP协议,当某个IP终端A ping另外一个终端B,即发送ICMP request报文时,我们会在ICMP request报文的payload中加一段数据。当B收到ICMP response时,会构建一个ICMP response报文,对于response报文的payload,B会原封不动的复制A的payload。
[0052] 现在我们进行改进:我们把payload定义格式如下:
[0053] Payload最前面为一10byte特征码,例如1234512345,可自定义。其后为一字符串:“Vendor:Please reply with my public IPv4address”,因为ICMP一般要求最小payload为64byte,我们对字符串后门不满64byte的部分填充0。
[0054] 所以整个payload(64bypte长)如下所示:
[0055]特征码 “Vendor:Please reply with my public IPv4ddress” Pad 0[0056] 现在AP为了获得自己的公网地址,发送这个改进的ICMP request给B。当B收到后,开始检测payload的前10byte,如果不是所定义的特征码,则B回送正常的ICMP response给A,即复制ICMP request的payload到ICMP response中。如果是特征码。则ICMP response按以下格式:
[0057]特征码 “xx.xx.xx.xx” Pad 0
[0058] 其中ICMP response的特征码和ICMP request的特征码一致,字符串“xx.xx.xx.xx”是公网地址。注:B由于在公网上,可以提取ICMP request的源IP地址,而这个地址一定就A的公网地址。
[0059] 基于相同的技术构思,本发明实施例还提供一种私网终端100获取公网IP的系统,该系统可执行上述方法实施例。本发明实施例提供的系统如图3所示,包括私网终端100、路由器200、公网终端300,所述私网终端100通过所述路由器200与所述公网终端300通信连接,所述私网终端100包括第一报文构建模块110、第一报文收发模块120、第一检测模块130,所述第一报文收发模块120分别与所述第一报文构建模块110、第一检测模块130相连;
所述公网终端300包括第二报文构建模块310、第二报文收发模块330、第二检测模块320、IP提取模块340,所述第二检测模块320分别与所述第二报文构建模块310、所述第二检测模块
320及所述IP提取模块340,所述IP提取模块340与所述第二报文构建模块310相连;其中:所述私网终端100的第一报文构建模块110构建用于获取自身公网IP的ICMP请求报文,所述第一报文收发模块120通过所述路由器200向所述公网终端300的第二报文收发模块330发送所述ICMP请求报文,所述ICMP请求报文含有定义为请求自身公网IP的特征码;所述公网终端300的第二报文收发模块330在接收到所述ICMP请求报文后,所述公网终端300的第二检测模块320检测所述ICMP请求报文中是否含有所述特征码,若是,则通过所述IP提取模块
340提取所述ICMP请求报文的所述私网终端100所在的源IP地址,所述第二报文构建模块
310构建ICMP应答报文,并将含有所述特征码及所述私网终端100所在的源IP地址的ICMP应答报文通过所述路由器200发送给所述私网终端100的第一报文收发模块120;若所述公网终端300的第二检测模块320未检测到所述ICMP请求报文中含有所述特征码,则所述第二报文构建模块310复制所述ICMP请求报文的有效载荷字段至ICMP应答报文中,并通过所述第二报文收发模块330将所述ICMP应答报文通过所述路由器200发送给所述私网终端100的第一报文收发模块120;所述私网终端100的第一报文收发模块120在接收到所述ICMP应答报文后,所述私网终端100的第一检测模块130检测所述ICMP应答报文中是否含有所述特征码,若是,则提取所述ICMP应答报文中的所述私网终端100所在的源IP地址,所述私网终端
100所在的源IP地址即为所述私网终端100的公网IP地址。
[0060] 在上述系统实施例一的基础上,所述路由器200包括中转模块210、存储模块230、及分别与所述中转模块210、存储模块230相连的查找模块220,其中:所述私网终端100的第一报文收发模块120将目的地址为公网终端300的ICMP请求报文发送给所述路由器200的中转模块210,所述ICMP请求报文含有定义为请求自身公网IP的特征码;所述路由器200的中转模块210在接收到所述ICMP请求报文后,通过所述查找模块220在所述存储模块230中存储的路由表项查找公网终端300的IP地址;所述路由器200的中转模块210根据所述查找到的公网终端300IP地址,将所述ICMP请求报文发送给所述公网终端300的第二报文收发模块330。
[0061] 由于私网终端100与公网终端300不在同一网段(即不在同一网络),因此需要路由器200来进行中转。
[0062] 在上述任一实施例的基础上,所述私网终端100还包括与所述第一报文构建模块110相连的第一设置模块140,所述公网终端300还包括与所述第二报文构建模块310相连的第二设置模块350,其中:所述私网终端100的第一设置模块140在所述私网终端100中定义请求自身公网IP的特征码,设置用于获取公网IP的ICMP请求报文的有效载荷字段的格式;
所述公网终端300的第二设置模块350在所述公网终端300中定义请求公网IP的特征码,设置用于获取公网IP的ICMP应答报文的有效载荷字段的格式。
[0063] 本发明系统在用于获取公网IP之前,需要对各自终端上的ICMP的ping功能进行相应的设置。
[0064] 上述任一实施例中,所述特征码位于所述ICMP请求报文的有效载荷字段的首部。
[0065] 上述任一实施例中,所述特征码长度小于或等于10字节。
[0066] 尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
[0067] 显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。