一种域名解析方法及装置制造方法
【专利摘要】本申请公开了一种域名解析方法和装置,其中包括:多线程域名解析模块建立两个以上用于域名解析的线程;请求响应模块获取域名解析请求,发送给所述线程选择模块;线程选择模块从所述用于域名解析的线程中选择一个可用线程,发送所述获取的域名解析请求给所选的线程进行域名解析处理,接收该线程的域名解析结果,并返回给所述请求响应模块;所述请求响应模块将域名解析结果返回给请求方。利用本发明,可以提高域名解析的效率,降低由于域名解析问题导致的网络请求阻塞率。
【专利说明】一种域名解析方法及装置
【技术领域】
[0001]本申请涉及计算机处理【技术领域】,尤其涉及一种域名解析方法及装置。
【背景技术】
[0002]目前,互联网上标准的资源地址都以统一资源定位符(URL)来标识,所述URL也被称为网页地址,是因特网上标准的资源的地址,其中包含域名。所述域名是指由一串用点分隔的名字组成的因特网上的某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置),目前域名已经成为互联网的品牌、网上商标保护必备
的产品之一。
[0003]用户在访问网络上的资源(如网页)的时候,资源的地址通常是以URL的形式表述的,而URL中的域名则表示了服务器所在的地址,但是服务器在网络上一般是使用IP地址来表示其地址。所以在连接服务器之前,就需要将域名转换成IP地址,这个转换过程叫做域名解析。域名解析是指把域名指向网站空间的IP地址,让访问者通过注册的域名可以方便地访问到网站的资源。
[0004]在对包含域名的URL网络请求进行处理时,通常要进行域名解析,如果域名解析的效率不高,则会导致网络请求的阻塞进而造成网页的假死。所谓网页假死就是所访问的网页停滞、没有反应。
[0005]例如,下面介绍一种常见的涉及域名解析场景:
[0006]在计算机上使用Windows操作系统的网络模块发送含有域名的URL网络请求时,主要包括如图1所示的几个基本步骤:
[0007]101、查找域名对应的代理服务器。
[0008]102、连接服务器。
[0009]103、发送网络请求。
[0010]104、接收服务器回应。
[0011]其中,上述步骤101和102也称为代理解析过程,其中可能会触发一次或多次域名解析的操作,而且域名解析是与上述步骤101和102是同步的,所以如果任一次域名解析操作出现问题,就会导致代理解析过程阻塞,之后的流程都将无法进行,于是就造成了网页的假死。
[0012]目前,很多软件中都使用了WINDOWS的网络模块进行网络请求,其中比较常见的就是浏览器的内核软件,如IE浏览器内核。IE浏览器内核中用于浏览网页的部分就是建立在Windows网络模块的基础之上的,所以,这就导致了 IE浏览器内核在浏览网页的时候会出现网页假死的问题。
[0013]虽然目前许多浏览器采用了对每个网页进行单独并行请求的技术,但是只要网络请求中涉及到上述的代理解析过程,则WINDOWS的网络模块就会利用一个单独的线程来对所有的网络请求依次进行代理解析处理,这个线程被称为代理解析线程。因此,即使浏览器采用了对每个网页进行单独并行请求的技术,只要其中一个网络请求的代理解析过程没有结束,后续其它网页的网络请求就无法处理,导致网页假死。图2为由于代理解析线程域名 解析假死导致所有网页假死的流程示意图。参见图2,涉及代理解析的所有网络请求线程 都会触发同一代理解析线程,所述代理解析线程只有一个,并且在每次处理代理解析时,会 触发一次或者多次的域名解析请求。目前的域名解析都是单线程处理,域名解析的效率不 高,只要其中一次域名解析出现问题发生阻塞,则会造成代理解析线程的阻塞,无法返回代 理解析结果,不但当前处理的网页会出现假死,之后所有网页的网络请求都无法进行,于是 将无法打开任何新的网页。
[0014]因此,现有技术中由于域名解析的效率不高,由域名解析问题造成的网络请求阻
塞率较高。
【发明内容】
[0015]有鉴于此,本发明的主要目的在于提供一种域名解析方法和装置,以提高域名解 析的效率,降低由于域名解析问题导致的网络请求阻塞率。
[0016]本发明的技术方案是这样实现的:
[0017]一种域名解析方法,包括:
[0018]建立两个以上用于域名解析的线程;
[0019]获取域名解析请求后,包括:
[0020]从所述用于域名解析的线程中选择一个可用线程;
[0021]利用所选的线程对所述域名解析请求进行域名解析处理,得到该线程的域名解析 结果,向请求方返回该域名解析结果。
[0022]一种域名解析装置,包括:
[0023]多线程域名解析模块,用于建立两个以上用于域名解析的线程;
[0024]请求响应模块,用于获取域名解析请求,发送给所述线程选择模块,将域名解析结 果返回给请求方;
[0025]线程选择模块,用于从所述用于域名解析的线程中选择一个可用线程,发送所述 获取的域名解析请求给所选的线程进行域名解析处理,接收该线程的域名解析结果,并返 回给所述请求响应模块。
[0026]与现有技术相比,本发明至少建立两个域名解析线程可供选择,用于处理域名解 析请求,在获取到域名解析请求后,可以从中选择一个可用的线程,将域名解析请求交给该 线程处理,其中任一个域名解析线程出现问题都不会影响其它域名解析线程的处理,因此 可以提高域名解析的效率,降低由于域名解析问题导致的网络请求阻塞率。
【专利附图】
【附图说明】
[0027]图1为目前Windows操作系统的网络模块发送网络请求的主要流程图;
[0028]图2为由于代理解析线程域名解析假死导致所有网页假死的流程示意图;
[0029]图3为本发明所述域名解析装置的一种组成示意图;
[0030]图4为本发明所述域名解析装置的又一种组成示意图;
[0031]图5为本发明所述域名解析装置的再一种组成示意图
[0032]图6为本发明所述方法的一种实施例的具体流程图。【具体实施方式】
[0033]下面结合附图及具体实施例对本发明再作进一步详细的说明
[0034]本发明的核心技术方案是公开了一种域名解析方法,包括:建立两个以上用于域 名解析的线程;在获取域名解析请求后,从所述用于域名解析的线程中选择一个可用线程, 利用所选的线程对所述域名解析请求进行域名解析处理,得到该线程的域名解析结果,向 请求方返回该域名解析结果。
[0035]与本发明的方法对应的,本发明还公开了一种域名解析装置,用于执行本发明的 方法。图3为本发明所述域名解析装置的一种组成示意图。参见图3,该域名解析装置包 括:
[0036]多线程域名解析模块301,用于建立两个以上用于域名解析的线程。
[0037]请求响应模块302,用于获取域名解析请求,发送给所述线程选择模块303,将域 名解析结果返回给请求方。
[0038]线程选择模块303,用于从所述用于域名解析的线程中选择一个可用线程,发送所 述获取的域名解析请求给所选的线程进行域名解析处理,接收该线程的域名解析结果,并 返回给所述请求响应模块302。
[0039]本发明中,所述可用线程是指当前没有进行域名解析处理的空闲线程。至于所建 立的域名解析线程中具体的处理过程,只需要执行现有的域名解析过程即可。
[0040]本发明所述的方法和装置的各种实施例可以适用于任何需要进行域名解析的场 景,只要获取到请求方发出的域名解析请求,则可以利用本发明的方案进行域名解析,并向 请求方返回域名解析结果。
[0041]例如,本发明尤其可以适用于需要发出一个或一个以上域名解析请求的单线程所 导致的域名解析问题。所述单线程例如是WINDOWS操作系统网络模块中的代理解析线程, 或者是其它在该网络模块基础上实现的应用程序线程。WINDOWS操作系统网络模块中的代 理解析线程通常会发起一个或一个以上的域名解析请求,在一个域名解析请求处理结束后 才会发起下一个域名解析请求。下面实施例以WINDOWS操作系统网络模块中的代理解析线 程(单线程)为例进行说明。
[0042]假设本实施例中所述获取的域名解析请求由WINDOWS操作系统网络模块中的代 理解析线程发起,所述域名解析结果返回给该代理解析线程。如果返回给代理解析线程的 域名解析结果为解析失败的结果,则所述代理解析线程中止本次代理解析,即中止本次域 名解析请求处理;或者,在所述代理解析线程发起域名解析请求后,如果在超过指定时间没 有得到域名解析结果,则停止该域名解析请求的过程,向代理解析线程返回域名解析失败 的结果,所述代理解析线程中止本次代理解析。然后可以应请求方的请求,可以开始新的代 理解析过程,从而不会因为一次域名解析失败导致代理解析线程阻塞,进而造成整个网络 请求的阻塞。
[0043]在这种WINDOWS操作系统网络模块中的代理解析线程触发域名解析请求的场景 下,通过本发明所述的域名解析处理,一方面可以提高单次域名解析的效率,从而降低代理 解析过程中的阻塞率,降低网页的假死概率;另一方面也可以在域名解析失败或无响应的 情况下及时中止当前代理解析,进一步降低由于域名解析问题导致代理解析的阻塞率,进而降低网络请求阻塞率,可以及时对后续网页的网络请求进行处理,进一步降低网页的假 死概率。
[0044]在Windows操作系统中,代理解析触发的域名解析处理一般都是通过应用编 程接口(Api)来进行的,例如Wiondows操作系统中的用于域名解析处理的API包括: getaddrinfo>GetAddrInfoA或者GetAddrInfoW等。为了实现在代理解析的场景下利用本 发明的多线程域名解析,需要替换这几个API的实现,在一种实施例中可以采用Windows操 作系统中的API钩子(HOOK)来替换系统中所述进行域名解析处理的API。所述API HOOK 可以改变一个系统api的原有功能,基本的方法就是通过HOOK接触到需要修改的API函数 的入口点,改变它的地址指向本发明所述域名解析装置,本发明所述的域名解析装置将解 析结果返回给所述API的请求方,即代理解析线程。这样可以尽量保留Windows操作系统 网络模块的现有逻辑,使得本发明实现起来的实现难度较低,稳定性也较高。
[0045]本发明中,建立两个以上用于域名解析的线程的时机是:在程序初始化时,在使用 HOOK替换域名解析函数getaddrinfo之前,主动创建两个以上的用于域名解析的线程。
[0046]在本发明所述方法的一种实施例中,所述获取域名解析请求后,如果所述用于域 名解析的线程中没有可用线程,则包括:
[0047]新建一个用于域名解析的线程,利用该线程对所述域名解析请求进行域名解析处 理,从而保证一定有一个可用的工作线程来进行新的域名解析请求;
[0048]或者,将所述域名解析请求放入等候队列,待所述用于域名解析的线程中有可用 线程后,选择该可用线程对所述等候队列中的域名解析请求进行域名解析处理。如果所述 等候队列中有两个以上的域名解析请求,则按照次序优先处理先进入等候对了的域名解析 请求。如果这个域名解析需要花费很长的时间,那么最多就是导致这个工作线程占用很长 时间,但是不影响其他工作线程的域名解析过程。
[0049]对应的,在本发明所述域名解析装置的一种实施例中,所述线程选择模块303进 一步用于:如果所述用于域名解析的线程中没有可用线程,则:触发所述多线程域名解析 模块301新建一个用于域名解析的线程,发送所述域名解析请求给该新建线程进行域名解 析处理;或者,将所述域名解析请求放入等候队列,待所述用于域名解析的线程中有可用线 程后,发送所述域名解析请求给该可用线程进行域名解析处理。
[0050]在本发明所述方法的一种实施例中,所述在获取域名解析请求后、从所述用于域 名解析的线程中选择一个可用线程之前,进一步包括:
[0051]判断所述用于域名解析的线程中是否已经有线程正在处理与当前获取的域名解 析请求中的域名相同的域名解析请求,如果有则将当前获取的域名解析请求放入该线程的 等候队列,待该线程处理完上一个域名解析请求后再处理该等候队列中的域名解析请求; 如果没有则再从所述用于域名解析的线程中选择一个可用的线程,后续利用该可用线程进 行域名解析。
[0052]在具体实现时,例如可以在发送每一个域名解析请求给所选的线程进行域名解析 之后,接收该线程的域名解析结果之前,进一步包括:在一个存储空间中暂存该域名解析请 求中的域名及所选线程的对应关系(该域名即正在处理的域名);在接收到该线程的域名解 析结果之后,进一步将该域名及其与线程的对应关系从所述存储空间中清除。所述在获得 新的域名解析请求后、从所述用于域名解析的线程中选择一个可用线程之前,进一步包括:判断该新的域名解析请求中的域名是否在所述暂存的正在处理的域名中,如果是则将该新 的域名解析请求放入与该域名有对应关系的线程的等候队列,待该线程处理完上一个域名 解析请求后再处理该等候队列中的域名解析请求。
[0053]利用上述这种实施方式,可以减少对工作线程(即正在处理域名解析请求的线程) 的占用,特别如果当前域名有错误,解析需要花费很长时间的时候,这种方法可以避免所有 的工作线程被占满而导致处理阻塞的问题。
[0054]对应的,在本发明所述域名处理装置的一种实施例中,所述线程选择模块303进 一步用于:从所述用于域名解析的线程中选择一个可用线程之前,判断所述用于域名解析 的线程中是否已经有线程正在处理与当前获取的域名解析请求中的域名相同的域名解析 请求,如果有则将当前获取的域名解析请求放入该线程的等候队列,待收到该线程的上一 个域名解析的结果后,再发送该等候队列中的域名解析请求给该线程处理;如果没有则从 所述用于域名解析的线程中选择一个可用的线程,将当前获取的域名解析请求发送给该可 用线程进行域名解析。
[0055]在本发明所述方法的一种实施例中,所述在得到所述线程的域名解析结果之后, 还可以进一步将所述域名解析结果存入域名解析缓存中,并记录存入时间。在获得新的域 名解析请求后、从所述用于域名解析的线程中选择一个可用线程之前,进一步包括:判断该 域名解析请求中的域名是否在所述域名解析缓存的域名解析结果中、且该域名解析结果从 存入到当前的时长未超过预定的时限,如果是则向所述请求方返回所述域名解析缓存中的 该域名解析结果;否则再从所述用于域名解析的线程中选择一个线程进行后续的域名解析 处理。
[0056]由于大部分域名与IP地址的对应关系在一定时间内是相对固定的,因此通过这 种处理实施方式,可以进一步提高对域名解析请求的处理效率,降低对所述用于域名解析 的线程的压力,进一步降低阻塞的几率。
[0057]对应的,在本发明所述域名解析装置的一种实施例中,如图4所示,该域名解析装 置进一步包括:第一过滤模块304,用于将所述线程选择模块303返回的域名解析结果存入 域名解析缓存中,并记录存入时间;在该装置获取到域名解析请求后,请求响应模块302会 将该域名解析请求发送给该第一过滤模块304,该第一过滤模块304判断该域名解析请求 中的域名是否在所述域名解析缓存的域名解析结果中、且该域名解析结果从存入到当前的 时长未超过预定的时限,如果是则向所述请求响应模块302返回所述域名解析缓存中的该 域名解析结果,所述请求响应模块302向请求方返回该域名解析结果;否则,该第一过滤模 块304将所述域名解析请求交给所述线程选择模块303处理或交给下述的第二过滤模块 305继续进行过滤处理。
[0058]在本发明所述方法的一种实施例中,还可以进一步存储域名解析名单,该域名解 析名单可以进一步减少域名解析错误带来的问题,其中保存具有固定解析结果的域名及其 对应的固定域名解析结果。所述域名的固定域名解析结果例如包括:域名对应的固定IP地 址、或域名对应的固定的解析错误,如下表I所示为一种域名解析名单的实例:
[0059]
域名rip
【权利要求】
1.一种域名解析方法,其特征在于,包括: 建立两个以上用于域名解析的线程; 获取域名解析请求后,包括: 从所述用于域名解析的线程中选择一个可用线程; 利用所选的线程对所述域名解析请求进行域名解析处理,得到该线程的域名解析结果,向请求方返回该域名解析结果。
2.根据权利要求1所述的方法,其特征在于,所述获取域名解析请求后,如果所述用于域名解析的线程中没有可用线程,则包括: 新建一个用于域名解析的线程,利用该线程对所述域名解析请求进行域名解析处理; 或者,将所述域名解析请求放入等候队列,待所述用于域名解析的线程中有可用线程后,选择该可用线程对所述等候队列中的域名解析请求进行域名解析处理。
3.根据权利要求1所述的方法,其特征在于, 所述在获取域名解析请求后、从所述用于域名解析的线程中选择一个可用线程之前,进一步包括: 判断所述用于域名解析的线程中是否已经有线程正在处理与当前获取的域名解析请求中的域名相同的域名解析请求,如果有则将当前获取的域名解析请求放入该线程的等候队列,待该线程处理完上一个域名解析请求后再处理该等候队列中的域名解析请求。
4.根据权利要求1所述的方法,其特征在于, 所述在得到所述线程的域名解析结果之后,进一步包括:将所述域名解析结果存入域名解析缓存中,并记录存入时间; 在获得新的域名解析请求后、从所述用于域名解析的线程中选择一个可用线程之前,进一步包括:判断该域名解析请求中的域名是否在所述域名解析缓存的域名解析结果中、且该域名解析结果从存入到当前的时长未超过预定的时限,如果是则向所述请求方返回所述域名解析缓存中的该域名解析结果。
5.根据权利要求1所述的方法,其特征在于, 该方法进一步存储域名解析名单,其中保存具有固定解析结果的域名及其对应的固定域名解析结果; 所述获取域名解析请求后、从所述用于域名解析的线程中选择一个可用线程之前,进一步包括:从所述域名解析名单中查找是否有该域名解析请求中的域名,如果查找到,则向所述请求方返回该域名对应的固定域名解析结果。
6.根据权利要求5所述的方法,其特征在于,所述域名的固定域名解析结果包括:域名对应的固定IP地址、或域名对应的固定的解析错误。
7.根据权利要求1所述的方法,其特征在于,预设超时时限,在所述利用所选的线程对所述域名解析请求进行域名解析处理之后,进一步包括:在超出预设的超时时限后还没有得到所选线程的域名处理结果时,将所述域名解析请求定向到指定的域名解析服务器上,接收该域名解析服务器的域名解析结果,并向所述请求方返回该域名解析结果。
8.根据权利要求1至7任一项所述的方法,其特征在于,所述域名解析请求由需要发出一个或一个以上域名解析请求的单线程发起,所述域名解析结果返回给该单线程。
9.根据 权利要求8所述的方法,其特征在于,如果返回给所述单线程的域名解析结果为解析失败的结果,则所述单线程中止本次代理解析;或者,在所述单线程发起域名解析请求后,如果在超过指定时间没有得到域名解析结果,则停止该域名解析请求的过程,向单线程返回域名解析失败的结果,所述单线程中止本次域名解析请求处理。
10.一种域名解析装置,其特征在于,包括:多线程域名解析模块,用于建立两个以上用于域名解析的线程;请求响应模块,用于获取域名解析请求,发送给所述线程选择模块,将域名解析结果返回给请求方;线程选择模块,用于从所述用于域名解析的线程中选择一个可用线程,发送所述获取的域名解析请求给所选的线程进行域名解析处理,接收该线程的 域名解析结果,并返回给所述请求响应模块。
11.根据权利要求10所述的装置,其特征在于,所述线程选择模块进一步用于:如果所述用于域名解析的线程中没有可用线程,则:触发所述多线程域名解析模块新建一个用于域名解析的线程,发送所述域名解析请求给该新建线程进行域名解析处理;或者,将所述域名解析请求放入等候队列,待所述用于域名解析的线程中有可用线程后,发送所述域名解析请求给该可用线程进行域名解析处理。
12.根据权利要求10所述的装置,其特征在于,所述线程选择模块进一步用于:从所述用于域名解析的线程中选择一个可用线程之前,判断所述用于域名解析的线程中是否已经有线程正在处理与当前获取的域名解析请求中的域名相同的域名解析请求,如果有则将当前获取的域名解析请求放入该线程的等候队列,待收到该线程的上一个域名解析的结果后,再发送该等候队列中的域名解析请求给该线程处理。
13.根据权利要求10所述的装置,其特征在于,该装置进一步包括:第一过滤模块,用于将所述线程选择模块返回的域名解析结果存入域名解析缓存中,并记录存入时间;在该装置获取到域名解析请求后,该第一过滤模块判断该域名解析请求中的域名是否在所述域名解析缓存的域名解析结果中、且该域名解析结果从存入到当前的时长未超过预定的时限,如果是则向所述请求响应模块返回所述域名解析缓存中的该域名解析结果,所述请求响应模块向请求方返回该域名解析结果。
14.根据权利要求10所述的装置,其特征在于,该装置进一步包括:第二过滤模块,用于存储域名解析名单,该名单中保存具有固定解析结果的域名及其对应的固定域名解析结果;在该装置获取域名解析请求后,该第二过滤模块从所述域名解析名单中查找是否有该域名解析请求中的域名,如果查找到,则向所述请求响应模块返回所述域名解析缓存中的该域名解析结果,所述请求响应模块向请求方返回该域名解析结果。
15.根据权利要求10所述的装置,其特征在于,所述线程选择模块进一步用于:预设超时时限,在发送所述域名解析请求给所选的线程后计时,在超出所述超时时限后还没有得到所选线程的域名处理结果时,将所述域名解析请求定向到指定的域名解析服务器上,接收该域名解析服务器的域名解析结果,并向所述请求响应模块返回该域名解析结果。
【文档编号】H04L29/06GK103581349SQ201210256884
【公开日】2014年2月12日 申请日期:2012年7月24日 优先权日:2012年7月24日
【发明者】司天歌, 张宁, 蒋进舟, 周振兴 申请人:腾讯科技(深圳)有限公司