计算机网络自顶向下方法第2章-应用层(application-layer).2
2.4 DNS:因特网的目录服务
2.4.1 DNS提供的服务
DNS的定义
- 实体层面看,DNS是一个由分层的DNS服务器实现的分布式数据库
- 协议层面看,DNS是一个使得主机能够查询分布式数据库的应用层协议
- DNS运行在UDP之上,使用53号端口
1)主机名到IP地址映射的转换服务
2)主机别名(host aliasing)
3)提供负载均衡(load distribution)
2.4.2 DNS工作机理概述
DNS是一个在因特网上实现分布式数据库的精彩范例。
1.分布式、层次数据库
DNS服务器是有层次的,它可以分为三种类型:根DNS服务器, 顶级域(Top-Level Domain, TLD )DNS服务器和权威DNS服务器,分别对应下面三个层次(从上至下)
- 根DNS服务器:有400多个根名字服务器遍及全世界,由13个不同的组织管理
- 顶级域DNS服务器:顶级域服务器负责顶级域名,如com,org,net,edu和gov和所有国家的顶级域名如cn,uk,jp (edu 教育机构域名, gov 政府部门域名 , org 非盈利性的组织 ,com 企业域名 )权威DNS服务器:在因特网上具有公共可访问的主机的每个组织机构必须提供公共可访问的DNS记录,这些记录将这些主机的名字映射为IP地址。 由组织机构的权威DNS服务器保存这些DNS记录,组织机构可以选择实现它自己的权威DNS服务器来保持这些记录,或者通过支付费用将这些记录存储在某个服务提供商的DNS服务器中。多数大学和大公司实现和维护它们自己基本的权威DNS服务器。
- 本地DNS服务器:还有另一类比较重要的DNS服务器,叫做本地DNS服务器(local DNS server),它并不在我们上面所说的DNS层次结构中。本地DNS服务器的作用有以下两点:
- 1)主机和本地DNS服务器一般是相邻的,当主机发出DNS请求的时候,该请求会被发往本地DNS服务器,它起着代理的作用,并将该请求转发到DNS服务器层次结构中
- 2)本地DNS服务器可以通过缓存主机名/IP地址,减少对相同主机名的查询而消耗的时间,改善时延和性能
实际上,在DNS服务中, 并不能通过对某个DNS服务器,通过仅仅一次的“请求/响应”就取得主机名/IP地址的查询结果。相反,需要多个不同的DNS服务器之间进行多次交互才能获取最终的查询结果:
2.DNS缓存
因为缓存,除了少数DNS查询以外,根服务器被绕过了。
2.4.3 DNS记录和报文
1.DNS报文
DNS只有两种报文,即查询和回答报文,并且这两种报文有着相同的格式。下图是DNS报文格式:
2.在DNS数据库中插入记录
假设你刚刚创建了一个网络乌托邦(Network Utopia)公司, 要做的第一件事情就是到注册登记机构注册域名(networkutopia.com), 注册的时候,需要向该机构提供你的权威DNS服务器的名字和IP地址,该注册机构将确保将一个NS记录和A记录被插入com顶级域DNS服务器中。
2.5 P2P文件分发
在P2P文件分发中,每个对等方能够向任务其他对等方重新分发它已经收到的该文件的任何部分,从而在分发过程中协助该服务器
1.P2P体系结构的扩展性
扩展性的直接成因是:对等方除了是比特的消费者外还是它们的重新分发者。
2.BitTorrent
BitTorrent是一种用于文件分发的流行P2P协议。每个下载者在下载的同时不断向其他下载者上传已下载的数据。
2.6 视频流和内容分发网
2.6.1 因特网视频
我们也能使用压缩生成相同视频的多个版本,每个版本有不同的质量等级。
2.6.2 HTTP流和DASH
由于HTTP流具有缺陷,不管客户可用的带宽大小,所有客户都接收到的相同编码的视频。这导致了一种新型基于HTTP的流的研发,称为经HTTP的动态适应性流(Dynamic Adaptive Streaming over HTTP,DASH).在DASH中,视频编码为几个不同的版本,其中每个版本具有不同的比特率,对应于不同的质量水平。
2.6.3 内容分发网(Content Distribution Network,CDN)
几乎所有主要的视频流公司都利用内空分发网。CDN通常采用两种不同的服务器安置原则。
- 深入。
- 邀请做客
1.CDN操作
2.集群选择策略。
2.7 套接字编程:生成网络应用
2.7.1 UDP套接字编程
- UDP是无连接的,从一个端系统向另一个端系统发送独立的数据分组,不对交付提供任何保证。
- 如下图所示,使用UDP的两个通信进程之间的交互有以下几个过程:
1.UDPClient.py
客户端代码:
#socket 模块形成了在python中所有网络通信的基础
from socket import * serverName='45.76.204.40' #包含服务器的主机名或IP地址
serverPort=12000 #目标端口号 #使用socket()创建客户套接字。
#第一个参数指示了地址簇:AF_INET指示了底层网络使用了IPv4
#第二个参数,SOCK_DGRAM指示了它是一个UDP套接字(而不是TCP套接字)
#特别注意:我们无需指定客户端套接字的端口号,这个工作由操作系统完成
clientSocket=socket(AF_INET,SOCK_DGRAM)
message=input('Input lowercase sentence:') #提示用户从键盘输入,并将输入读取到message中 #sendto()为报文message附上目的地址(serverName,serverPort),
#并向进程的套接字clientSocket发送结果分组
clientSocket.sendto(message.encode(),(serverName,serverPort)) #来自因特网的分组到达该客户的套接字时,其分组数据放在变量ModifiedMessage中,源地址放置在serverAddress中
#方法recvfrom取长度2048作为输入
ModifiedMessage,serverAddress=clientSocket.recvfrom(2048)
print (ModifiedMessage.decode()) clientSocket.close()
2.UDPServer.py
from socket import *
serverPort=12000
serverSocket=socket(AF_INET,SOCK_DGRAM)
serverSocket.bind(('',serverPort)) #将端口号与服务器的套接字显示绑定在一起
print('The server is ready to receive')
#这个while允许服务器无限期地接收来自客户端的分组
while True:
message,clientAddress=serverSocket.recvfrom(2048)
modifiedMessage=message.upper()
serverSocket.sendto(modifiedMessage,clientAddress)
2.7.2 TCP套接字编程
与UDP不同,TCP是一个面向连接的协议。这意味着,在客户端和服务器能够开始互相发送数据之前,它们要先握手和创建一个TCP连接。连接建立之后,当有一方需要给另一方发送数据,它只需经套接字把数据丢个TCP连接,无需再为数据附上目的地地址。
如下图所示,使用TCP的两个通信进程之间的交互有以下几个过程:
1.TCPClient.py
from socket import *
serverName='127.0.0.1' #服务器的IP地址或主机名(这里是本地回送地址)
serverPort=12000 #第一个参数AF_INET表明底层网络使用IPv4,
#第二个参数SOCK_STREAM表明它是一个TCP套接字(而不是UDP)
clientSocket=socket(AF_INET,SOCK_STREAM) #connect()执行完后,执行三次握手,并在客户和服务器程序之间创建起一条TCP连接
clientSocket.connect((serverName,serverPort)) sentence=input('Input lowercase sentence:') #进入客户套接字,并通过TCP连接发送数据
#无需附上目的地地址
clientSocket.send(sentence.decode()) #当字符到达套接字时,它们被放在modifiedSentence,其缓存长度为2048
#知道收到回车符才会结束该行
modifiedSentence=clientSocket.recv(2048) print('From Server:',modifiedSentence.encode())
clientSocket.close()
2.TCPServer.py
from socket import *
serverPort=12000 #创建一个欢迎套接字serverSocket,将其绑定在serverPort上
serverSocket=socket(AF_INET,SOCK_STREAM)
serverSocket.bind(('',serverPort)) #聆听来自客户的连接请求;参数1表示请求连接的最大数
serverSocket.listen(1) print('The server is ready to receive.')
while True: #当有客户敲门时,seerverSocket调用accept(),
#在服务器中创建一个叫connectionSocket由这个客户专用
connectionSocket,addr=serverSocket.accept() sentence=connectionSocket.recv(2048)
capitalizedSentence=sentence.upper()
connectionSocket.send(capitalizedSentence) #关闭连接套接字,没有关闭欢迎套接字
connectionSocket.close()
参考:
https://blog.csdn.net/qq_36464448/article/details/80305497
https://blog.csdn.net/qq_36464448/article/details/80302793
https://www.cnblogs.com/hithongming/category/1245180.html
计算机网络自顶向下方法第2章-应用层(application-layer).2的更多相关文章
- 计算机网络自顶向下方法第2章-应用层(application-layer).1
2.1 应用层协议原理 2.1.1网络应用程序体系结构 1)在客户-服务器体系结构 (client-server architecture)中,有一个总是打开的主机称为服务器,它服务于来自许多其他称为 ...
- 计算机网络自顶向下方法第3章-传输层 (Transport Layer).1
3.1 概述和运输层服务 运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信(logic communication)功能. 3.1.1 运输层和网络层的关系 网络层提供了主机之间的逻辑通信,而 ...
- 计算机网络自顶向下方法第4章 网络层:数据平面 (Network layer)
4.1 网络层概述 网络层主要功能为转发(将数据从路由器输入接口转移到合适的输出接口)和路由选择(端到端的路径选择),每台路由器都有一张转发表,用最长前缀匹配规则来转发. 4.1.1 转发和路由选择 ...
- 计算机网络自顶向下方法第3章-传输层 (Transport Layer).2
3.5 面向连接的运输: TCP 3.5.1 TCP连接 TCP是因特网运输层的面向连接的可靠的运输协议. TCP连接提供全双工服务(full-duplex service). TCP连接是点对点的连 ...
- 《计算机网络 自顶向下方法》 第2章 应用层 Part1
常见的应用层协议有哪些? HTTP(HyperText Transfer Protocol):超文本传输协议 FTP(File Transfer Protocol):文件传输协议 SMTP(Sim ...
- 《计算机网络 自顶向下方法》 第2章 应用层 Part2
域名.主机名? 从范围上看: 域名的范围比主机名大 一个域名下通常有多个主机名 从组成上看: 主机名 = 服务器名(或计算机名) + 域名 举例说明: baidu.com 是百度的域名 www.b ...
- 《计算机网络 自顶向下方法》 第8章 计算机网络中的安全 Part2
SSL(使 TCP 连接安全) SSL(Secure Socket Layer),即安全套接字层,是对 TCP 的强化 HTTPS 使用 SSL,而 HTTP 不使用 SSL 通过采用机密性.数据完整 ...
- 《计算机网络 自顶向下方法》 第3章 运输层 Part2
待补充完善 TCP 相关基本点 1.面向连接 两个不同主机上的进程在通过 TCP 进行通信之前,必须先通过三次握手来建立 TCP 连接 2.全双工服务 即,如果一台主机上的进程 A 与另一台主机上的进 ...
- 《计算机网络 自顶向下方法》 第3章 运输层 Part1
由于个人精力和智商有限,又喜欢想太多.钻牛角尖,导致学习系统性知识很痛苦,尝试改变学习方式,慢慢摸索 现在看到 rdt2.0,又有点看不下去 现在的想法: 要有个目标,且有截止时间(作业模式.考试模式 ...
随机推荐
- spring - quartz - experssion 表达式
字段 允许值 允许的特殊字符 秒 0-59 , - * / 分 0-59 , - * / 小时 0-23 , - * / 日期 1-31 , - * ? / L W C 月份 1-12 或者 JAN- ...
- java编程题(一)
[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题 p ...
- AdminLTE框架基础布局使用
boxbox-solid:去掉顶部边框线box-headerwith-border:添加头底部边框线 按钮:—— btn btn-default 默认<div class="btn-g ...
- Day4 循环结构
for-in循环 如果明确的知道循环执行的次数或者是要对一个容器进行迭代(后面会讲到),那么我们推荐使用for-in循环,例如下面代码中计算$\sum_{n=1}^{100}n$. range函数用法 ...
- NOIP2013 DAY2 T3火车运输
传送门 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重的情况 ...
- mkdir:创建目录
mkdir:命令 1.命令详解 [功能说明] mkdir命令是“make directories”中每个单词的粗体字母组合而成,其功能是创建目录,默认情况下,如果要创建的目录已经存在,则会提示此文件 ...
- 如鹏网JAVA培训笔记2(晓伟整理)
输入输出: 我们使用System.out.println(“abc”);作用:向控制台输入东西. Scaner sc=new Scanner(System.in)://从输入流中去读取 int age ...
- 1013MySQL监控利器-Innotop
转自 http://www.cnblogs.com/ivictor/p/5101506.html 安装过程中 可以使用 YUM INSTALL INNOTOP进行直接安装 Innotop是一款十分强大 ...
- [bzoj1084][SCOI2005]最大子矩阵_动态规划_伪·轮廓线dp
最大子矩阵 bzoj-1084 SCOI-2005 题目大意:给定一个n*m的矩阵,请你选出k个互不重叠的子矩阵使得它们的权值和最大. 注释:$1\le n \le 100$,$1\le m\le 2 ...
- Android学习心得(13) --- Android代码混淆(1)
我在博客上发表一些我的Android学习心得,希望对大家能有帮助. 这一篇我们讲述一下最新的ADT环境下怎样进行Android混淆 在新版本号的ADT创建项目时.混码的文件不再是proguard.cf ...