协议
- DNS协议----DNS请求报文:向指定DNS域名服务器发送DNS请求报文,以解析域名www.target.com对应的IP地址。
- UDP协议—DNS基于UDP协议的。
- TCP协议----TCP连接报文:根据IP地址,与www.target.com服务器建立TCP连接。
- ARP协议----ARP请求报文:根据默认网关的IP地址查询其MAC地址。
- HTTP协议—HTTP请求报文:向www.target.com网页服务器发送HTTP请求报文,以获取该网站首页的内容。
- ICMP协议—提供网络传输中的差错检测。
- LLC和MAC—提供数据链路层的组帧、透明传输等功能。
在浏览器输入URL会发生什么?和一个HTTP请求过程等同。
输入URL后会发生:
- 进行DNS的域名解析
- 建立TCP三次握手连接
- 发送一个HTTP的请求报文
- 服务器处理相关的请求
- 服务器向客户端返回响应的结果,HTTP的响应报文
- 通过四次挥手关闭TCP的连接
- 浏览器解析HTML
- 浏览器进行布局渲染(图片等)
other
DNS查询选择的两种方式
域名服务器:根域名服务器;顶级域名服务器(二级域名,org,com,edu);权威域名服务器;本地域名服务器
eg:
https://www.xidian.edu.cn/----cn-根,edu-顶级域名,xidian-权威域名
递归查询—以本地域名服务器为中心查询—默认方式
客户端—》本地-----》根–》本地–》顶级—》本地—》权威—》本地—》客户端–》Web服务器
迭代查询----以DNS客户端为中心查询
客户端–》本地—》客户端—》根—》客户端—》顶级–》客户端–》权威–》客户端–》Web服务器
总结:递归本地域名服务器为中心,默认;迭代DNS客户端为中心。
DNS 查询选择 UDP 或者 TCP 两种不同协议时的主要原因:
-
UDP协议
DNS查询的数据包较小,机制简单;
UDP协议的额外开销小,有着更好的性能表现; -
TCP协议
DNS 查询由于 DNSSEC 和 IPv6 的引入迅速膨胀,导致 DNS 响应经常超过 MTU 造成数据的分片和丢失,我们需要依靠更加可靠的 TCP 协议完成数据的传输;
随着 DNS 查询中包含的数据不断增加,TCP 协议头以及三次握手带来的额外开销比例逐渐降低,不再是占据总传输数据大小的主要部分;
总结:无论是选择 UDP 还是 TCP,最核心的矛盾就在于需要传输的数据包大小,如果数据包小到一定程度,UDP 协议绝对最佳的选择,但是当数据包逐渐增大直到突破 512 字节以及 MTU 1500 字节的限制时,我们也只能选择使用更可靠的 TCP 协议来传输 DNS 查询和相应。
递归与迭代
- 程序结构不同:
递归是重复调用函数自身实现循环。迭代是函数内某段代码实现循环。
- 算法结束方式不同:
遇到满足终止提交的情况是逐层返回来结束。当n=1时结束;
迭代使用计数器结束循环,当n=n时结束。
- 效率不同:
在循环的次数较大的时候,迭代的效率明显高于递归。
递归与迭代的关系
a.递归中一定有迭代,但是迭代中不一定有递归;大部分可以相互转换。
b.相对来说,能用迭代不用递归(因为递归不断调用函数,浪费空间,容易造成堆栈溢出)
例子:
基于Python用递归和迭代实现阶乘
递归—重复调用函数自身实现循环
def factorial1(n):
if n==1: #1!=1
resutl=1
else:
result = n*factorial1(n-1)#重复调用函数自身实现循环
return result
n=3
进入else: result=3factorial1(2)
n=2
进入else:result=2factorial(1)
n=1
进入if:result=1
迭代—函数内某段代码实现循环
def factorial2(n):
result=1
for i in range(1,n+1):
result= result*i #该段代码实现循环
return result
#range(1,n+1)==[m+1 for m in range(n)]