1.DNS的两种解析方式
比如请求一个 abc.xyz.com 的域名
- 递归查询
- 递归即一个问一个,有去有回
- 当浏览器发起域名请求时,会先检查本机的DNS缓存中是否存在地址映射,若存在则直接返回,若不存在则查询本机的host文件中是否存在
- 若还不存在,则会向本机配置的tcp/ip中的互联网服务提供商(ISP)的DNS服务器发送查询请求,若该DNS服务器中有该记录,则直接返回,若没有,则向根服务器发起请求
- 根服务器是否有
abc.xyz.com的记录
- 根服务器是否有
- 若有,则返回,若没有,则根服务器会向 .com服务器发起请求
- .com服务器,你是否有
abc.xyz.com的记录
- .com服务器,你是否有
- 若有,则返回,若没有,则.com服务器会继续向 .xyz.com 服务器发起请求
- .xyz.com服务器,你是否有
abc.xyz.com的记录
- .xyz.com服务器,你是否有
- 此时,若存在,则会将记录返回 .com服务器
- .com服务器再将记录返回 根服务器
- 根服务器将记录返回给 ISP服务器
- 最后将记录返回给发起请求的客户端
- 迭代查询
- 迭代即重复、机械的发起请求
- 当浏览器发起域名请求时,会先检查本机的DNS缓存中是否存在地址映射,若存在则直接返回,若不存在则查询本机的host文件中是否存在
- 若还不存在,则会向本机配置的tcp/ip中的互联网服务提供商(ISP)的DNS服务器发送查询请求,若该DNS服务器中有该记录,则直接返回,若没有,则返回根服务器的ip地址
- 客户端收到ISP返回的IP地址后,向根服务器发起请求
- 根服务器是否有
abc.xyz.com的记录
- 根服务器是否有
- 若有则返回,没有就继续返回 .com服务器的IP地址
- 客户端收到根服务器返回的IP地址后,向.com服务器发起请求
- .com服务器,你是否有
abc.xyz.com的记录
- .com服务器,你是否有
- 若有,则返回
- www.bilibili.com/video/BV1JZ…
2.tcp三次握手和四次挥手
2.1 tcp和udp的区别
- tpc就类似于打电话,通话双方都能确保电话是否接通、通话的内容以及什么时候结束通话。
- udp则类似于写信,我们无法得知对方是否接收到书信,无法知道对方接收到的书信是否完整,也无法知道对方收到的书信,是否按发送的书信顺序接收到
2.2 tcp的三次握手
2.2.1 三次握手的过程
- 第一次
- 客户端发送的一个SYN包,告诉服务端我想要连接
- 第二次
- 服务端接收到SYN包后,回复客户端一个SYN+ACK包,告诉客户端我已经准备好了
- 第三次
- 客户端收到服务端返回的SYN+ACK包后,向服务端发送了一个ACK确认包
- 之后开始建立连接
2.2.2 为什么是三次握手而不是两次
- 当客户端发送一个SYN包,告诉服务端我想要连接时,如果因为网络拥堵,导致该包堵在路上
- 此时服务端无法接收到
- 隔了一段时间后,客户端再次发送了一个SYN包,告诉服务端我想要连接,此时这个包顺利到达服务端
- 服务端返回了一个SYN+ACK包,告诉客户端我准备好了,客户端接收到后,也返回了一个ACK确认包,此时双方建立了连接
- 又过了一会,第一个SYN包不拥堵了,顺利到达服务端,此时服务端以为客户端又发起了一个新的连接,就会返回一个SYN+ACK包,告诉客户端我准备好了
- 此时,对于客户端来说,只建立了一个连接,但对于服务端来说,是两个连接
- 若此时只有两次握手,则会导致服务端一直开着连接等待客户端,会无端消耗资源
2.3 tcp的四次挥手
- 第一次
- 客户端向服务端发送了一个FIN包,告诉服务端我完事了,想要断开连接了
- 第二次
- 服务端接收到FIN包后,返回一个ACK确认包,告诉客户端我收到你的请求了
- 第三次
- 服务端在返回ACK确认包后,接着进入了等待关闭状态,然后返回一个FIN包,告诉客户端我准备好要关闭了
- 第四次
- 客户端在接收到FIN包后, 向服务端发送了一个ACK确认包,告诉服务端我知道了
- 此时服务端接收到FIN包后,直接关闭了连接
- 但此时客户端会进入最后的超时等待状态,
- 这个状态是为了确保服务端接收到了最后的ACK确认包
- 比如,在第三次服务端返回FIN包后,客户端接收到后,发送了ACK确认包,但由于某种原因,服务端没有接收到
- 在经过一段时间后,服务端会再次发送一个FIN包向客户端确认,
- 客户端接收到后,刷新了超时等待的时间,再次发送ACK包
- 若此时服务端接收到ACK确认包后,则直接关闭连接
- 客户端在最后的超时等待时间中没有接收到服务端的请求,则关闭连接
2.4 tcp的稳定性
- 因为tcp会将数据切割为多份,然后通过报文发送
- 在发送的报头中会记录对应的序列号、长度和数据内容
- 服务端在接收到所有报文后,会对报文进行校验组装
- 当发现缺失某个包时,会向客户端发送包含对应的序列号和长度的报文
- 客户端接收到后,就会重新发送缺失的包,即丢失重发
3.udp的不稳定
-
因为udp发送仅是简单的对数据进行包装,故对cpu的资源消耗比较小,但在网络传输中,容易存在丢包,即丢了就是真的丢了
-
因此,udp比较适合对实时传输要求高且对少量丢包不在意的情况,如视频通话