传递客户端IPv6地址及端口至后端服务器的方法及装置转让专利

申请号 : CN201210054431.7

文献号 : CN103297407B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 罗枫吴教仁刘涛刘宁张诚

申请人 : 百度在线网络技术(北京)有限公司

摘要 :

本发明提出一种从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的方法和装置。方法包括:客户端向IPv6负载均衡设备发送数据包;IPv6负载均衡设备对客户端的原始IPv6地址及端口进行地址转换,将客户端的原始IPv6地址及端口存储在TCP选项字段中并发送带有TCP选项字段的数据包;后端服务器的Linux内核层截获syn_recv_sock钩子,挂载tcp_v6_syn_recv_sock_ttm钩子函数,以得到TCP选项字段中的客户端的原始IPv6地址及端口并存储;后端服务器的Linux内核层截获getname钩子,挂载inet6_getname_ttm钩子函数,以提取客户端的原始IPv6地址及端口供服务器的Linux应用层使用。本发明通过在TCP选项字段中增加客户端的原始IPv6地址和端口信息,使得后端服务器能够获取客户端的原始IP和端口信息,从而能够对客户进行地址定位。

权利要求 :

1.一种从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的方法,其特征在于,包括以下步骤:(A)所述客户端向所述IPv6负载均衡设备发送数据包;

(B)所述IPv6负载均衡设备对所述客户端的原始IPv6地址及端口进行地址转换,将所述客户端的原始IPv6地址及端口存储在TCP选项字段中并发送带有所述TCP选项字段的数据包;

(F)将所述TCP选项字段的kind号写入作为TCPOPT_TTM并将所述TCP选项字段的总长度写入作为TCPOLEN_TTM;(C)所述后端服务器的Linux内核层截获syn_recv_sock钩子,挂载tcp_v6_syn_recv_sock_ttm钩子函数,以得到所述TCP选项字段中的所述客户端的原始IPv6地址及端口并存储;

(D)所述后端服务器的Linux内核层截获getname钩子,挂载inet6_getname_ttm钩子函数,以提取所述客户端的原始IPv6地址及端口供所述后端服务器的Linux应用层使用。

2.根据权利要求1所述的方法,其特征在于,进一步包括步骤:(E)截获_sk_stream_mem_reclaim函数,使用跳转指令码替换所述_sk_stream_mem_reclaim函数开始部分的指令代码,进而调用__sk_stream_mem_reclaim_ttm函数,并完成sock结构体以及高速缓存的释放。

3.根据权利要求1所述的方法,其特征在于,所述步骤(C)包括:所述服务器的Linux内核层调用linux内核原生的tcp_v6_syn_recv_sock函数;

判断所述TCP选项字段的kind号是否为TCPOPT_TTM并判断所述TCP选项字段的总长度是否为TCPOLEN_TTM;

如果是,则获取存储在所述TCP选项字段中的所述客户端的原始IPv6地址及端口;

为所述客户端的原始IPv6地址及端口分配高速缓存;

将sock结构体的sk_user_data指针指向所述高速缓存;以及将所述客户端的原始IPv6地址及端口保存到所述高速缓存中。

4.根据权利要求3所述的方法,其特征在于,进一步包括:如果不存在kind号为TCPOPT_TTM且长度为TCPOLEN_TTM的所述TCP选项字段,则返回。

5.根据权利要求3所述的方法,其特征在于,进一步包括:如果没有成功分配所述高速缓存,则返回。

6.根据权利要求2所述的方法,其特征在于,步骤(D)包括:调用linux内核原生的inet6_getname函数;

判断所述sk_user_data指针指向的所述高速缓存是否为空;

如果否,则判断所述高速缓存中是否存储有所述客户端的原始IPv6地址及端口;以及如果所述高速缓存中存储有所述客户端的原始IPv6地址及端口,则将所述sk_user_data指针指向的所述高速缓存中存储的所述客户端的原始IPv6地址及端口赋值到uaddr的sin6_addr和sin6_port。

7.根据权利要求6所述的方法,其特征在于,进一步包括步骤:如果判断所述sk_user_data指针指向的所述高速缓存为空,则返回。

8.根据权利要求6所述的方法,其特征在于,进一步包括步骤:如果判断所述高速缓存中没有存储所述客户端的原始IPv6地址及端口,则返回。

9.一种从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的装置,其特征在于,所述客户端向所述IPv6负载均衡设备发送数据包,所述IPv6负载均衡设备对所述客户端的原始IPv6地址及端口进行地址转换,将所述客户端的原始IPv6地址及端口存储在TCP选项字段中并发送带有所述TCP选项字段的数据包,所述装置包括:写入模块,所述写入模块用于将所述TCP选项字段的kind号写入作为TCPOPT_TTM并将所述TCP选项字段的总长度写入作为TCPOLEN_TTM;

第一截获模块,所述第一截获模块用于截获syn_recv_sock钩子,挂载tcp_v6_syn_recv_sock_ttm钩子函数,以得到所述TCP选项字段中的所述客户端的原始IPv6地址及端口并存储;以及第二截获模块,所述第二截获模块用于截获getname钩子,挂载inet6_getname_ttm钩子函数,以提取所述客户端的原始IPv6地址及端口供所述服务器的Linux应用层使用。

10.根据权利要求9所述的装置,其特征在于,进一步包括:第三截获模块,所述第三截获模块用于截获_sk_stream_mem_reclaim函数,使用跳转指令码替换所述_sk_stream_mem_reclaim函数开始部分的指令代码,进而调用__sk_stream_mem_reclaim_ttm函数,并完成sock结构体以及高速缓存的释放。

11.根据权利要求9所述的装置,其特征在于,所述第一截获模块用于:调用所述tcp_v6_syn_recv_sock函数;

判断所述TCP选项字段的kind号是否为TCPOPT_TTM并判断所述TCP选项的总长度是否为TCPOLEN_TTM;

如果是,则获取存储在所述TCP选项字段中的所述客户端的原始IPv6地址及端口;

为所述客户端的原始IPv6地址及端口分配高速缓存;

将sock结构体的sk_user_data指针指向所述高速缓存;以及将所述客户端的原始IPv6地址及端口保存到所述高速缓存中。

12.根据权利要求11所述的装置,其特征在于,所述第一截获模块进一步用于:如果不存在kind号为TCPOPT_TTM且长度为TCPOLEN_TTM的所述TCP选项字段,则返回。

13.根据权利要求11所述的装置,其特征在于,所述第一截获模块进一步用于:如果没有成功分配所述高速缓存,则返回。

14.根据权利要求10所述的装置,其特征在于,所述第二截获模块用于:调用inet6_getname函数;

判断sk_user_data指针指向的所述高速缓存是否为空;

如果否,则判断所述高速缓存中是否存储有所述客户端的原始IPv6地址及端口;以及如果是,则将所述sk_user_data指针指向的所述高速缓存中存储的所述客户端的原始IPv6地址及端口赋值到uaddr的sin6_addr和sin6_port。

15.根据权利要求14所述的装置,其特征在于,所述第二截获模块进一步用于:如果判断所述sk_user_data指针指向的所述高速缓存为空,则返回。

16.根据权利要求14所述的装置,其特征在于,所述第二截获模块进一步用于:如果判断所述高速缓存中没有存储所述客户端的原始IPv6地址及端口,则返回。

说明书 :

传递客户端IPv6地址及端口至后端服务器的方法及装置

技术领域

[0001] 本发明涉及计算机技术领域,尤其涉及一种从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的方法。

背景技术

[0002] 现有的负载均衡设备中,如果采用了NAT(Network Address Translation,网络地址转换)模式,那么后端服务器只能看到负载均衡设备的后端IP,而无法看到客户端的真实源IP,因此无法对客户端进行地址定位,从而无法正常开展基于地理信息的相关业务。

发明内容

[0003] 本发明旨在至少解决上述技术问题之一。
[0004] 为此,本发明的一个目的在于提出一种可以将客户端的原始IPv6地址和端口传递到后端服务器的方法。
[0005] 本发明的另一目的在于提出一种从IPv6负载均衡设备传递客户端的原始IPv6地址和端口至后端服务器的系统。
[0006] 为了实现上述目的,根据本发明第一方面的实施例的从IPv6负载均衡设备获取客户端的原始IPv6地址和端口的方法包括以下步骤:(A)所述客户端向所述IPv6负载均衡设备发送数据包;(B)所述IPv6负载均衡设备对所述客户端的原始IPv6地址及端口进行地址转换,将所述客户端的原始IPv6地址及端口存储在TCP选项字段中并发送带有所述TCP选项字段的数据包;(C)所述后端服务器的Linux内核层截获syn_recv_sock钩子,挂载tcp_v6_syn_recv_sock_ttm钩子函数,以得到所述TCP选项字段中的所述客户端的原始IPv6地址及端口并存储;(D)所述后端服务器的Linux内核层截获getname钩子,挂载inet6_getname_ttm钩子函数,以提取所述客户端的原始IPv6地址及端口供所述后端服务器的Linux应用层使用。
[0007] 根据本发明实施例的从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的方法,通过在TCP选项字段中增加客户端的原始IPv6地址和端口信息,使得后端服务器能够提取TCP选项字段中的信息获取客户端的原始IP和端口信息,从而能够对客户进行地址定位并开展基于地理信息的相关服务。而且本发明的方法不需要对Linux内核做任何的修改,具有较强的灵活性,可移植性高。
[0008] 为了实现上述目的,根据本发明第二方面的实施例的从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的装置包括第一截获模块和第二截获模块,所述客户端向所述IPv6负载均衡设备发送数据包,所述IPv6负载均衡设备对所述客户端的原始IPv6地址及端口进行地址转换,将所述客户端的原始IPv6地址及端口存储在TCP选项字段中并发送带有所述TCP选项字段的数据包,所述第一截获模块用于截获syn_recv_sock钩子,挂载tcp_v6_syn_recv_sock_ttm钩子函数,以得到所述TCP选项字段中的所述客户端的原始IPv6地址及端口并保存,所述第二截获模块用于截获getname钩子,挂载inet6_getname_ttm钩子函数,以提取所述客户端的原始IPv6地址及端口供所述后端服务器的Linux应用层使用。
[0009] 根据本发明实施例的从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的装置,通过在TCP选项字段中增加客户端的原始IPv6地址和端口信息,并通过截获模块截获TCP选项字段中的信息获取客户端的原始IP和端口信息,从而能够对客户进行地址定位并开展基于地理信息的相关服务。而且实现过程中不需要对Linux内核做任何的修改,具有较强的灵活性,可移植性高。
[0010] 本发明附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。

附图说明

[0011] 本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中,
[0012] 图1是根据本发明一个实施例的从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的方法的流程图;
[0013] 图2是根据本发明一个实施例的从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的方法的流程图;
[0014] 图3是根据本发明一个实施例的分析TCP选项并提取客户端的原始IPv6地址及端口的方法的流程图;
[0015] 图4是根据本发明一个实施例的inet6_getname_ttm钩子函数的工作流程图;
[0016] 图5是根据本发明一个实施例的从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的方法的流程图;
[0017] 图6是根据本发明一个实施例的从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的装置的结构框图;
[0018] 图7是根据本发明一个实施例的从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的装置的结构框图;以及
[0019] 图8是根据本发明一个实施例的从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的装置的结构框图。

具体实施方式

[0020] 下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。相反,本发明的实施例包括落入所附加权利要求书的精神和内涵范围内的所有变化、修改和等同物。
[0021] 在本发明的描述中,需要理解的是,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性。在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。此外,在本发明的描述中,除非另有说明,“多个”的含义是两个或两个以上。
[0022] 流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现特定逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本发明的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本发明的实施例所属技术领域的技术人员所理解。
[0023] 下面参考附图描述根据本发明实施例的从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的方法及装置。
[0024] 图1是根据本发明一个实施例的从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的方法的流程图。
[0025] 如图1所示,从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的方法包括下述步骤。后端服务器是向客户端提供服务的真实服务器。
[0026] 步骤S101,客户端向IPv6负载均衡设备发送数据包。
[0027] 步骤S102,IPv6负载均衡设备对客户端的原始IPv6地址及端口进行地址转换,将客户端的原始IPv6地址及端口存储在TCP选项字段中并发送带有TCP选项字段的数据包。
[0028] 步骤S103,后端服务器的Linux内核层截获syn_recv_sock钩子,挂载tcp_v6_syn_recv_sock_ttm钩子函数,以得到TCP选项字段中的客户端的原始IPv6地址及端口并存储。
[0029] 步骤S104,后端服务器的Linux内核层截获getname钩子,挂载inet6_getname_ttm钩子函数,以提取客户端的原始IPv6地址及端口供后端服务器的Linux应用层使用。
[0030] 根据本发明实施例的从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的方法,通过在TCP选项字段中增加客户端的原始IPv6地址和端口信息,使得后端服务器能够提取TCP选项字段中的信息获取客户端的原始IP和端口信息,从而能够对客户进行地址定位并开展基于地理信息的相关服务。
[0031] 图2是根据本发明一个实施例的从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的方法的流程图。
[0032] 如图2所示,从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的方法包括下述步骤。
[0033] 步骤S201,客户端向IPv6负载均衡设备发送数据包。
[0034] 步骤S202,IPv6负载均衡设备对客户端的原始IPv6地址及端口进行地址转换,将客户端的原始IPv6地址及端口存储在TCP选项字段中并发送带有该TCP选项字段的数据包。
[0035] 步骤S203,将TCP选项字段的kind号写入作为TCPOPT_TTM并将TCP选项字段的总长度写入作为TCPOLEN_TTM。例如,kind号为253,总长度为20,即1字节的kind类型+1字节的选项长度+2字节的端口+16字节的IPv6地址。
[0036] 步骤S204,服务器的Linux内核层截获syn_recv_sock钩子,挂载tcp_v6_syn_recv_sock_ttm钩子函数,以得到TCP选项字段中的客户端的原始IPv6地址及端口并存储。
[0037] Linux内核在监听套接字收到三次握手的ACK包之后,会从SYN_REVC状态进入到TCP_ESTABLISHED状态,在这个过程中服务器的Linux内核层会调用tcp_v6_syn_recv_sock函数。客户端的原始IPv6地址和端口号作为TCP选项在负载均衡设备和后端服务器的三次握手之间进行传递。本发明通过截获tcp_v6_syn_recv_sock钩子函数对TCP选项字段中的客户端的原始IPv6地址及端口进行提取并存储到分配的高速缓存中,然后将对应的sock结构体中的sk_user_data指针指向这片缓存,以备inet6_getname使用。
[0038] 具体地,图3为本发明一个实施例的分析TCP选项并提取客户端的IPv6地址和端口的方法的流程图。如图3所示,该方法包括以下步骤:
[0039] 步骤S311,后端服务器的Linux内核层调用Linux内核原生的tcp_v6_syn_recv_sock函数。
[0040] 步骤S312,判断TCP选项字段的kind号是否为TCPOPT_TTM并判断TCP选项字段的总长度是否为TCPOLEN_TTM。
[0041] 步骤S313,如果TCP选项字段的kind号是TCPOPT_TTM且TCP选项字段的总长度是TCPOLEN_TTM,则获取存储在TCP选项字段中的客户端的原始IPv6地址及端口。
[0042] 步骤S314,为客户端的原始IPv6地址及端口分配高速缓存。
[0043] 步骤S315,将sock结构体中的sk_user_data指针指向分配的高速缓存。
[0044] 步骤S316,将客户端的原始IPv6地址及端口保存到高速缓存中。
[0045] 应理解,在本发明的另一个实施例中,该分析TCP选项并提取客户端的IPv6地址和端口的方法还可以包括步骤S317:如果不存在kind号为TCPOPT_TTM且长度为TCPOLEN的TCP选项字段,则返回。
[0046] 类似地,在本发明的又一个实施例中,该分析TCP选项并提取客户端的IPv6地址和端口的方法还可以包括步骤S318:如果没有成功分配高速缓存,则返回。
[0047] 由此,成功提取到TCP选项字段中的客户端的原始IPv6地址及端口并存储到高速缓存中,以备inet6_getname使用。
[0048] 步骤S205,后端服务器的Linux内核层截获getname钩子,挂载inet6_getname_ttm钩子函数,以提取客户端的原始IPv6地址及端口供后端服务器的Linux应用层使用。
[0049] 用户在使用套接字中的accept方法时,会调用到inet6_getname将sock结构体中存储的源IPv6地址和端口号返回。由于在这个阶段客户端的真实IPv6地址和端口号已经提取出来存储在sock结构中,因此只需要提取出这个数据返回即可。在本发明中对inet6_getname钩子函数进行截获完成客户端的原始IPv6地址和端口到用户的传递。具体的工作流程如图4所示。
[0050] 图4为本发明一个实施例的inet6_getname_ttm钩子函数的工作流程图。如图4所示,inet6_getname_ttm钩子函数的工作流程包括以下步骤:
[0051] 步骤S411,调用linux内核原生的inet6_getname函数。
[0052] 步骤S412,判断sk_user_data指针指向的高速缓存是否为空。
[0053] 步骤S413,如果sk_user_data指针指向的高速缓存不为空,则进一步判断高速缓存中是否存储有客户端的原始IPv6地址及端口。
[0054] 步骤S414,如果高速缓存中存储有客户端的原始IPv6地址及端口,则将sk_user_data指针指向的高速缓存中存储的客户端的原始IPv6地址及端口赋值到uaddr的sin6_addr和sin6_port。
[0055] 应理解,在本发明的另一个实施例中,该方法还可以包括步骤S415:如果判断sk_user_data指针指向的高速缓存为空,则返回。
[0056] 类似地,在本发明的又一个实施例中,该方法还可以包括步骤S416:如果判断高速缓存中没有存储客户端的原始IPv6地址及端口,则返回。
[0057] 图5是根据本发明一个实施例的从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的方法的流程图。
[0058] 如图5所示,从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的方法包括下述步骤。
[0059] 步骤S501,客户端向IPv6负载均衡设备发送数据包。
[0060] 步骤S502,IPv6负载均衡设备对客户端的原始IPv6地址及端口进行地址转换,将客户端的原始IPv6地址及端口存储在TCP选项字段中并发送带有该TCP选项字段的数据包。
[0061] 步骤S503,将TCP选项字段的kind号写入作为TCPOPT_TTM并将TCP选项字段的总长度写入作为TCPOLEN_TTM。
[0062] 步骤S504,后端服务器的Linux内核层截获syn_recv_sock钩子,挂载tcp_v6_syn_recv_sock_ttm钩子函数,以得到TCP选项字段中的客户端的原始IPv6地址及端口并存储。
[0063] 步骤S505,后端服务器的Linux内核层截获getname钩子,挂载inet6_getname_ttm钩子函数,以提取客户端的原始IPv6地址及端口供后端服务器的Linux应用层使用。
[0064] 上述步骤S501至步骤S505的具体实现过程可与上述步骤S201至步骤S205的实现相同,此处不再详细描述。
[0065] 步骤S506,截获_sk_stream_mem_reclaim函数,使用跳转指令码替换_sk_stream_mem_reclaim函数开始部分的指令代码,进而调用__sk_stream_mem_reclaim_ttm函数,并完成sock结构体以及高速缓存的释放。
[0066] 在本发明的一个实施例中,客户端的原始IPv6地址和端口信息的存储采用的是高速缓存,在每一个TCP连接中都要分配一个高速缓存进行存储,在TCP连接关闭或者连接超时等情况下,该高速缓存必须释放。本发明的一个实施例采用的方法是在释放skb的时候,同时释放高速缓存。释放skb的函数为_sk_stream_mem_reclaim函数,这是一个普通的内核函数。本发明的一个实施例中采用了二进制hack的方式对这个函数进行了截获,具体为:截获_sk_stream_mem_reclaim函数,使用跳转指令码替换_sk_stream_mem_reclaim函数开始部分的指令代码,进而调用__sk_stream_mem_reclaim_ttm函数,完成sock结构体以及高速缓存的释放。
[0067] 根据本发明实施例的从IPV6负载均衡设备中传递客户端的原始IPv6地址及端口至后端服务器的方法,通过在TCP选项字段中增加客户端的原始IPv6地址和端口信息,使得后端服务器能够提取TCP选项字段中的信息获取客户端的原始IP和端口信息,从而能够对客户进行地址定位并开展基于地理信息的相关服务。而且本发明的方法不需要对Linux内核做任何的修改,具有较强的灵活性,可移植性高。
[0068] 本发明还提出一种从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的装置。
[0069] 图6是根据本发明一个实施例的从IPv6负载均衡传递获取客户端的原始IPv6地址及端口至后端服务器的装置的结构框图。如图6所示,从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的装置30包括第一截获模块310和第二截获模块320。
[0070] 客户端10向IPv6负载均衡设备20发送数据包。IPv6负载均衡设备20对客户端10的原始IPv6地址及端口进行地址转换,将客户端10的原始IPv6地址及端口存储在TCP选项字段中并发送带有该TCP选项字段的数据包。第一截获模块310截获syn_recv_sock钩子,挂载tcp_v6_syn_recv_sock_ttm钩子函数,以得到TCP选项字段中的客户端10的原始IPv6地址及端口并存储。第二截获模块320截获getname钩子,挂载inet6_getname_ttm钩子函数,以提取客户端10的原始IPv6地址及端口供后端服务器40的Linux应用层使用。
[0071] 根据本发明实施例的从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的装置,通过在TCP选项字段中增加客户端的原始IPv6地址和端口信息,并通过截获模块截获TCP选项字段中的信息获取客户端的原始IP和端口信息,从而能够对客户进行地址定位并开展基于地理信息的相关服务。
[0072] 图7为根据本发明一个实施例的从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的装置的结构框图。如图7所示,在图6所示的实施例的基础上,该装置还包括写入模块330。写入模块330用于将TCP选项字段的kind号写入作为TCPOPT_TTM并将所述TCP选项字段的总长度写入作为TCPOLEN_TTM。例如,kind号为253,总长度为20,即1字节的kind号+1字节的选项长度+2字节的端口+16字节的IPv6地址。
[0073] 由此,第一截获模块310首先调用linux内核原生的tcp_v6_syn_recv_sock函数,然后判断TCP选项字段的kind号是否为TCPOPT_TTM并判断TCP选项字段的总长度是否为TCPOLEN_TTM。如果TCP选项字段的kind号是TCPOPT_TTM且TCP选项字段的总长度是TCPOLEN_TTM,则获取存储在TCP选项字段中的客户端的原始IPv6地址及端口。接着,为客户端的原始IPv6地址及端口分配高速缓存,并将sock结构体的sk_user_data指针指向该高速缓存。然后,将客户端的原始IPv6地址及端口保存到高速缓存中,以备inet6_getname使用。
[0074] 此外,如果不存在kind号为TCPOPT_TTM且长度为TCPOLEN_TTM的TCP选项字段,或者如果没有成功分配缓存,则返回。
[0075] 第二截获模块320首先调用linux内核原生的inet6_getname函数,判断sk_user_data指针指向的高速缓存是否为空。如果sk_user_data指针指向的高速缓存不为空,则进一步判断高速缓存中是否存储有客户端的原始IPv6地址及端口。如果高速缓存中存储有客户端的原始IPv6地址及端口,则将sk_user_data指针指向的高速缓存中存储的客户端的原始IPv6地址及端口赋值到uaddr的sin6_addr和sin6_port。
[0076] 此外,如果判断sk_user_data指针指向的高速缓存为空,或者如果判断高速缓存中没有存储客户端的原始IPv6地址及端口,则返回。
[0077] 图8为根据本发明一个实施例的从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的装置的结构框图。如图8所示,在图7所示的实施例的基础上,该装置还包括第三截获模块340。第三截获模块340用于截获_sk_stream_mem_reclaim函数,使用跳转指令码替换_sk_stream_mem_reclaim函数开始部分的指令代码,进而调用__sk_stream_mem_reclaim_ttm函数,并完成sock结构体以及高速缓存的释放。
[0078] 根据本发明实施例的从IPv6负载均衡设备传递客户端的原始IPv6地址及端口至后端服务器的装置,通过在TCP选项字段中增加客户端的原始IPv6地址和端口信息,并通过截获模块截获TCP选项字段中的信息获取客户端的原始IP和端口信息,从而能够对客户进行地址定位并开展基于地理信息的相关服务。而且实现过程中不需要对Linux内核做任何的修改,具有较强的灵活性,可移植性高。
[0079] 应当理解,本发明的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(PGA),现场可编程门阵列(FPGA)等。
[0080] 在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
[0081] 尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同限定。