ToB企服应用市场:ToB评测及商务社交产业平台

标题: 计算机网络应用层:DNS、P2P和Socket编程 [打印本页]

作者: 守听    时间: 2022-11-10 01:44
标题: 计算机网络应用层:DNS、P2P和Socket编程
DNS
域名系统Domain Name System,DNS)的主要任务是主机名到IP地址的转换的目录服务。DNS是:
DNS服务器是运行BINDBerkeley Internet Name Domain)软件的UNIX机器,运行在UDP之上,使用53号端口。
DNS被其他应用层协议所使用,举例某用户主机请求某URL:
除提供IP转换以外,DNS还具有以下服务
DNS工作机理综述:
分布式、层次数据库

DNS使用了大量的DNS服务器,以层次方式组织。大致说来有3类DNS服务器:根DNS服务器顶级域Top-Level DomainDNS服务器权威DNS服务器。假设一个DNS客户要决定www.amazon.com的IP地址,首先与根服务器之一联系,得到顶级域名com的TLD服务器IP,再与这些TLD服务器之一联系,将为amazon.com返回权威DNS服务器IP,最后,客户与amazon.com权威服务器之一联系,返回www.amazon.com的IP地址。
根、TLD和权威DNS服务器都处在该DNS服务器的层次结构中。
还有另一类重要的DNS服务器,称为本地DNS服务器local DNS server)。严格说来,一个本地DNS服务器并不属于该服务器的层次结构,但它对DNS层次结构是至关重要的。
每个ISP(如一个居民区的1SP或一个机构的ISP)都有一台本地DNS服务器(也叫默认名字服务器)。当主机与某个ISP连接时,该ISP提供一台主机的IP地址,该主机具有一台或多台其本地DNS服务器的IP地址(通常通过DHCP)。通过访问Windows或UNIX的网络状态窗口,用户能够容易地确定他的本地DNS服务器的IP地址。 主机的本地DNS服务器通常“邻近”本主机。对某机构ISP而言,本地DNS服务器可能就与主机在同一个局域网中;对于某居民区ISP来说,本地DNS服务器通常与主机相隔不超过几台路由器。当主机发岀DNS请求时,该请求被发往本地DNS服务器,它起着代理的作用,并将该请求转发到DNS服务器层次结构中。
举例:
假设主机cse.nyu.edu想知道主机gaia.cs.umass.edu的IP地址。同时假设(NYU)的cse.nyu.edu主机的本地DNS服务器为dns.nyu.edu,并且gaia.cs.umass.edu的权威DNS服务器为dns.umass.edu
如图所示:

注意到在本例中,为了获得一台主机名的映射,共发送了8份DNS报文:4份查询报文和4份回答报文!利用DNS缓存能减少这种査询流量
图中所示的例子利用了递归查询(recursive query)和迭代查询(iterative query)。
从理论上讲,任何DNS查询既可以是迭代的也能是递归的。
 
DNS缓存:
DNS缓存DNS caching),实际上,为了改善时延性能并减少在因特网上到处传输的DNS报文数量,DNS广泛使用了缓存技术。
DNS缓存的原理非常简单。在一个请求链中,当某DNS服务器接收一个DNS回答(例如,包含某主机名到IP地址的映射)时,它能将映射缓存在本地存储器中。
例如,在上图中,每当本地DNS服务器dns.nyu.edu从某个DNS服务器接收到一个回答,它能够缓存包含在该回答中的任何信息。如果在DNS服务器中缓存了一台主机名/IP地址对,另一个对相同主机名的查询到达该DNS服务器时,该DNS服务器就能够提供所要求的IP地址,即使它不是该主机名的权威服务器。DNS服务器在一段时间后(通常设置为两天)将丢弃缓存的信息。
DNS记录和报文:
共同实现DNS分布式数据库的所有DNS服务器存储了资源记录(Resource Record, RR), RR提供了主机名到IP地址的映射。每个DNS回答报文包含了一条或多条资源记录。
资源记录是一个包含了下列字段的4元组:
  1. (Name, Valuer,Type, TTL)
复制代码
TTL是该记录的生存时间,它决定了资源记录应当从缓存中删除的时间。在下面给岀的记录例子中,我们忽略掉TTL字段。Name和Value的值取决于Type:
DNS报文:
DNS只有查询和回答报文,且有着相同的格式:

DNS数据库中插入记录:
假定你刚刚创建一个称为网络乌托邦(Network Utopia)的新创业公司。你必定要做的第一件事是在注册登记机构注册域名networkutopia.com注册登记机构registrar)是一个商业实体,它验证该域名的唯一性,将该域名输入DNS数据库。
当你向某些注册登记机构注册域名networkutopia.com时,需要向该机构提供你的基本和辅助权威DNS服务器的名字和IP地址。假定该名字和IP地址是dnsl.networkutopia.comdns2.networkutopia.com212.212.212.1212.212.212.2
对这两个权威DNS服务器的每一个,该注册登记机构确保将一个类型NS和一个类型A的记录输入TLD com服务器。特别是对于用于networkutopia.com的基本权威服务器,该注册登记机构将下列两条资源记录插入该DNS系统中:
  1. (networkutopia.com, dns1.networkutopia.com, NS)
  2. (dns1.networkutopia.com, 212.212.212.1, A)
复制代码
你还必须确保用于Web服务器www.networkutopia.com的类型A资源记录和用于邮件服务器的mail.networkutopia.com的类型MX资源记录被输入你的权威DNS服务器中。
 
P2P文件分发
P2P文件分发中,每个对等方能够向任何其他对等方重新分发它已经收到的该文件的任何部分,从而在分发过程中协助该服务器。到2016年止,最为流行的P2P文件分发协议是BitTorrent
P2P体系结构到的扩展性:

 
 
 

 
 
BitTorrent:
BitTorrent是一种用于文件分发的流行P2P协议。参与一个特定文件分发的所有对等方的集合被称为一个洪流torrent),在一个洪流中的对等方彼此下载等长度的文件块chunk),典型的块长度为256KB。当一个对等方首次加入一个洪流时,它没有块。随着时间的流逝,它累积了越来越多的块。当它下载块时,也为其他对等方上载了多个块。一旦某对等方获得了整个文件,它也许(自私地)离开洪流,或(大公无私地)留在该洪流中并继续向其他对等方上载块。同时,任何对等方可能在任何时候仅具有块的子集就离开该洪流,并在以后重新加入该洪流中。
每个洪流具有一个基础设施节点,称为追踪器tracker)。当一个对等方加入某洪流时,它向追踪器注册自己,并周期性地通知追踪器它仍在该洪流中。以这种方式,追踪器跟踪参与在洪流中的对等方。一个给定的洪流可能在任何时刻具有数以百计或数以千计的对等方。

 
套接字编程:
简单的UDP套接字编程


UDPClient.py
  1. from socket import *
  2. server_name = "localhost"
  3. server_port = 12000
  4. client_socket = socket(AF_INET, SOCK_DGRAM)
  5. while True:
  6.     message = input("input lowercase: ")
  7.     if message == "quit":
  8.         break
  9.     client_socket.sendto(message.encode(), (server_name, server_port))
  10.     modified_message, server_address = client_socket.recvfrom(2048)
  11.     print(modified_message.decode())
  12. client_socket.close()
复制代码
UDPServer.py
  1. from socket import *
  2. server_port = 12000
  3. server_socket = socket(AF_INET, SOCK_DGRAM)
  4. server_socket.bind(("", server_port))
  5. print("server is ready to receive")
  6. while True:
  7.     message, client_address = server_socket.recvfrom(2048)
  8.     print(f"receive {message}")
  9.     modified_message = message.decode().upper()
  10.     server_socket.sendto(modified_message.encode(), client_address)
复制代码
简单的TCP套接字编程
与UDP不同,TCP是一个面向连接的协议。这意味着在客户和服务器能够开始互相发送数据之前,它们先要握手和创建一个TCP连接。TCP连接的一端与客户套接字相联系,另一端与服务器套接字相联系。当创建该TCP连接时,我们将其与客户套接字地址(IP地址和端口号)和服务器套接字地址(IP地址和端口号)关联起来。使用创建的TCP连接,当一侧要向另一侧发送数据时,它只需经过其套接字将数据丢进TCP连接。这与UDP不同,UDP服务器在将分组丢进套接字之前必须为其附上一个目的地地址。
服务器程序必须具有一扇特殊的门,更精确地说是一个特殊的套接字,该门欢迎来自运行在任意主机上的客户进程的某种初始接触。使用房子与门来比喻进程与套接字,有时我们将客户的初始接触称为“敲欢迎之门” 。
随着服务器进程的运行,客户进程能够向服务器发起一个TCP连接。这是由客户程序通过创建一个TCP套接字完成的。当该客户生成其TCP套接字时,它指定了服务器中的欢迎套接字的地址,即服务器主机的IP地址及其套接字的端口号。生成其套接字后,该客
户发起了一个三次握手并创建与服务器的一个TCP连接。发生在运输层的三次握手,对于客户和服务器程序是完全透明的。
在三次握手期间,客户进程敲服务器进程的欢迎之门。当该服务器“听”到敲门声时,它将生成一扇新门(更精确地讲是一个新套接字),它专门用于特定的客户。

 

TCPClient.py
  1. from socket import *
  2. server_name = "localhost"
  3. server_port = 12000
  4. client_socket = socket(AF_INET, SOCK_STREAM)
  5. client_socket.connect((server_name, server_port))
  6. while True:
  7.     message = input("input lowercase: ")
  8.     if message == "quit":
  9.         break
  10.     client_socket.send(message.encode())
  11.     modified_message = client_socket.recv(1024)
  12.     print(f"modified: {modified_message.decode()}")
  13. client_socket.close()
复制代码
TCPServer.py
  1. from socket import *
  2. server_port = 12000
  3. server_socket = socket(AF_INET, SOCK_STREAM)
  4. server_socket.bind(("", server_port))
  5. server_socket.listen(2)
  6. print("server is ready receive")
  7. while True:
  8.     connect_socket, client_address = server_socket.accept()
  9.     message = connect_socket.recv(1024).decode()
  10.     print(f"receive {message}")
  11.     modified_message = message.upper()
  12.     connect_socket.send(modified_message.encode())
  13.     connect_socket.close()
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4