1.域名系统定义

DNS计算机域名系统由域名服务器和域名解析器组成。通常输入的是网址就是一个域名。

2.域名查询

查询方式包括:

1)正向查询:由域名查找对应的IP(如:www.baidu.com—>119.75.218.77

2)反向查询:由IP查找域名(如:119.75.218.77 –> www.baidu.com

查询方式包括:

1)递归查询:当DNS服务器接收到客户端的查询请求时,会做出相应的反应(本地DNS服务器查询、其他服务器查询)(主要发生在客户端与DNS服务器端)

2)迭代查询:这一部分是对收到的客户端请求做出反应。首先会在本地DNS服务器缓存中进行查询数据,如果查询到对应的ip则进行返回给客户端。否则,返回一个指针,指向下一级的DNS服务器,继续该过程直到找到所查名字的DNS服务器。

查询过程:

以正向查询为例:

当客户端程序要通过一个主机名称来访问网络中的一台主机时,它首先要得到这个主机名称所对应的IP地址,因为IP数据报中允许放置的是目地主机的IP地址,而不是主机名称。

步骤:

1)客户端向本地DNS服务器查询 www.redhat.com,(递归查询)

2)本地DNS服务器检查区域数据库,由于服务器没有查询到www.redhat.com 于是它将查询请求传递给跟服务器(“.”DNS服务器),请求解析主机名称。根名称服务器把“com”DNS服务器IP返回给本地服务器,(迭代)

3)本地DNS服务器将请求发给“com”DNS服务器,该服务器根据请求将“redhat.com”DNS服务器IP地址返回给本地DNS服务器(迭代查询)。

4)本地DNS服务器向“redhat.com”DNS服务器发送请求,由于该服务器具有“www.redhat.com”记录,它将www.redhat.com的IP地址返回给本地DNS服务器。

5)本地DNS服务器将www.redhat.com的IP地址发送给客户端。

3.示例:

正向查询函数: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可以直接忽略

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

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

(family,socktype,proto,canonname,sockaddr)

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

import socket
host=raw_input('host:')
result=socket.getaddrinfo(host,None)
counter=0
for i in result:
print "%-2d:%s"%(counter,i)
counter+=1
raw_input('Press ENTER')

结果:

为什么一个域名有多个IP?

反向查询函数:gethostbyaddr(addr,len,type)

gethostbyaddr(addr,len,type)

参数addr可以为IPv4或IPv6的IP地址,参数len为参数addr的长度,参数type为AF_INET。

import socket
hostip=raw_input('ip:')
try:
result=socket.gethostbyaddr(hostip)
print "hostname:"+result[0]
print "\n Addresses:"
for i in result[2]:
print " " +i
except socket.herror, e:
print "counld not look up name:",e

使用PyDNS进行高级查询

pyDNS提供了一个功能更强的访问DNS系统的接口。其下载地址为http://pydns.sourceforge.net

首先调用DNS.DiscoverNameServers()查找系统中的名称服务器。然后建立一个请求对象DNS.Request()。DNS.Request()的req()方法用来执行实际的查询。通常有两个参数:name给出了实际查询的名称;qtype指定了record类型。当使用请求对象来发出查询请求时,pyDNS会返回一个包含结果的应答对象(answer object),该对象有个属性叫answers,包含所有返回的应答列表。

import DNS
query=raw_input('输入DNS:')
DNS.DiscoverNameServers() reqobj=DNS.Request()
answerobj=reqobj.req(name=query,qtype=DNS.Type.ANY)
if not len(answerobj.answers):
print "Not found"
for i in answerobj.answers:
print "%-5s %s"%(i['typename'],i['data'])

这个包功能非常强大,在此不细说了。

参考:http://www.jinlie.net/?p=638

http://www.cnblogs.com/xiaowuyi/archive/2012/08/20/2646725.html

python 网络编程(五)---DNS域名系统的更多相关文章

  1. Python网络编程基础 PDF 完整超清版|网盘链接内附提取码下载|

    点此获取下载地址提取码:y9u5 Python网络编程最好新手入门书籍!175个详细案例,事实胜于雄辩,Sockets.DNS.Web Service.FTP.Email.SMTP.POP.IMAP. ...

  2. Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型

    Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...

  3. python网络编程01 /C/S架构|B/S架构、网络通信原理、五层协议、七层协议简述、端口映射技术

    python网络编程01 /C/S架构|B/S架构.网络通信原理.五层协议.七层协议简述.端口映射技术 目录 python网络编程01 /C/S架构|B/S架构.网络通信原理.五层协议.七层协议简述. ...

  4. Python网络编程基础|百度网盘免费下载|零基础入门学习资料

    百度网盘免费下载:Python网络编程基础|零基础学习资料 提取码:k7a1 目录: 第1部分 底层网络 第1章 客户/服务器网络介绍 第2章 网络客户端 第3章 网络服务器 第4章 域名系统 第5章 ...

  5. Python 网络编程(二)

    Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...

  6. Python 网络编程(一)

    Python 网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...

  7. Python学习(22)python网络编程

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  8. Day07 - Python 网络编程 Socket

    1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...

  9. python网络编程-01

    python网络编程 1.socket模块介绍 ①在网络编程中的一个基本组件就是套接字(socket),socket是两个程序之间的“信息通道”. ②套接字包括两个部分:服务器套接字.客户机套接字 ③ ...

  10. Linux网络编程(五)

    /*Linux网络编程(五)——多路IO复用之select() 网络编程中,使用IO复用的典型场合: 1.当客户处理多个描述字时(交互式输入以及网络接口),必须使用IO复用. 2.一个客户同时处理多个 ...

随机推荐

  1. 3140:[HNOI2013]消毒 - BZOJ

    题目描述 Description 最近在生物实验室工作的小 T 遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为 a*b*c,a.b.c均为正整数.为了实验的方便,它被划 ...

  2. SNMP的工作原理&软件开发

    SNMP(Simple Network Management Protocol,简单网络管理协议)首先是由IETF的研究小组为了解决Internet上的路由器管理问题而提出的.SNMP的设计原则是简单 ...

  3. FlushMode属性与transaction(spring注入的事务)

    一.参见hibernate的api http://tool.oschina.net/apidocs/apidoc?api=hibernate-3.6.10 http://tool.oschina.ne ...

  4. json2.js使用参考

    json2.js的源码地址: https://github.com/douglascrockford/JSON-js Visual Studio用户可以直接通过Nuget来获得. json2.js提供 ...

  5. [转载]JS对URL的编码

    虽然escape().encodeURI().encodeURIComponent()三种方法都能对一些影响URL完整性的特殊字符进行过滤.但后两者是将字符串转换为UTF-8的方式来传输,解决了页面编 ...

  6. 自助Linux之问题诊断工具strace

    转  http://www.cnblogs.com/bangerlee/archive/2012/02/20/2356818.html 引言 “Oops,系统挂死了..." “Oops,程序 ...

  7. linux fork函数与vfork函数

    一.fork1. 调用方法#include <sys/types.h>#include <unistd.h> pid_t fork(void);正确返回:在父进程中返回子进程的 ...

  8. Why does yum return error: [Errno 256] No more mirrors to try ?

    https://access.redhat.com/solutions/203603 ISSUE yum update fails with the error : [Errno 256] No mo ...

  9. MVC项目总结(别人的好文章)

    引用 http://www.cnblogs.com/xling/archive/2012/07/11/2587002.html

  10. HeadFirst设计模式之观察者模式

    一.什么是观察者模式 观察者模式定义了一系列对象间一对多的关系,当主题对象的状态发生变化时,会通知所有观察者 二.自定义观察模式 1. 2. package headfirst.designpatte ...