• python网络编程域名系统


    python网络编程学习笔记(4):域名系统

     

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi

    一、什么是域名系统

    DNS 计算机域名系统 (DNS) 是由解析器以及域名服务器组成的。当我们在上网的时候,通常输入的是网址,其实这就是一个域名,而我们计算机网络上的计算机彼此之间只能用IP地址才能相互识别。再如,我们去一WEB服务器中请求一WEB页面,我们可以在浏览器中输入网址或者是相应的IP地址,例如我们要上新浪网,我们可以在IE的地址栏中输入网址,也可输入IP地址,但是这样子的IP地址我们记不住或说是很难记住,所以有了域名的说法,这样的域名会让我们容易的记住。

     

    名称

    含义

    特性

    域名服务器

    保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。

    域名必须对应一个IP地址,而IP地址不一定只对应一个域名,采用类似目录树的等级结构。

    域名解析服务器

    域名与IP地址之间的转换工作

    域名解析过程中的查询顺序为:本地缓存记录、区域记录、转发域名服务器、根域名服务器。 

     

    二、访问DNS的方法一:使用socket模块

     

    1、DNS查询

     

    以查询www.external.example.com为例。首先,程序会和操作系统配置文件指定的本地名称服务器通信。这个服务器是一个递归的名称服务器,它收到请求并以适当的方式传递下去。递归服务器做的第一件事情是询问.com域,回答是以一种指向另外一外名称服务器的提名形式给出的。这个名称服务器可以提供名称中包含.com的信息。查询发送到该服务器后,该服务器将以另一个提名回答进行回应,指向另外一台服务器,而这个服务器可以提供example.com的名称信息。这个循环重复多次,直到查询到external.example.com服务的名称服务器。 

    2、正向查询 

    最基本的查询是正向查询,即根据一个主机名来查找ip地址。Socket库可以实现这种查询,主要用函数socket.getaddrinfo()。注意,该函数和ipv6不兼容。

     

    Getaddrinfo(host,port[,family[,sockettype[,proto[,flags]]]])

     

    参数host为域名,以字符串形式给出代表一个IPV4/IPV6地址或者None.   

    参数port如果字符串形式就代表一个服务名,比如“http”"ftp""email"等,或者为数字,或者为None   

    参数family为地主族,可以为AF_INET  AF_INET6 AF_UNIX.   

    参数socketype可以为SOCK_STREAM(TCP)或者SOCK_DGRAM(UDP)   

    参数proto通常为0可以直接忽略   

    参数flagsAI_*的组合,比如AI_NUMERICHOST,它会影响函数的返回值  

    该函数返回值是一列tuple,每一个tuple如下: 

    family,socktype,proto,canonname,sockaddr 

    其中sockaddr实际上就是远程机器的地址和端口,也就是查询的数据。 

    例如: 

    >>> import socket 

    >>> print socket.getaddrinfo('www.baidu.com',None) 

    [(2, 0, 0, '', ('61.135.169.125', 0)), (2, 0, 0, '', ('61.135.169.105', 0))] 

    >>> print socket.getaddrinfo('www.baidu.com',None)[0][4][0] 

    61.135.169.125 

    >>> print socket.getaddrinfo('www.baidu.com',None)[0][4][1] 

    0

    注意:因为一个网站可能有多个网址,所以两次查询时,结果不同也是很正常的。这里用一段代码将所有查询结果列出:

    复制代码
    ##@小五义 http://www.cnblogs.com/xiaowuyi
    import socket
    host=raw_input('host:')
    result=socket.getaddrinfo(host,None)
    counter=0
    for i in result:
  • 相关阅读:
    NodeJs搭建简单的Http和Https服务器
    VSCode C++开发环境配置
    OpenCV查找并发现轮廓
    OpenCV使用连通组件检测并输出图像中的对象
    OpenCV使用阈值截断实现二值分割(黑白图)
    使用OpenCV实现背景减除
    get current UTC datetime of Python
    setTimeout and setInterval counterpart of Python
    setup airflow on MySQL
    HeidiSQL
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2647945.html
Copyright © 2020-2023  润新知