DNS解析过程、TCP三次握手、四次挥手及UDP

133 阅读5分钟

1.DNS的两种解析方式

比如请求一个 abc.xyz.com 的域名

  • 递归查询
    • 递归即一个问一个,有去有回
    • 当浏览器发起域名请求时,会先检查本机的DNS缓存中是否存在地址映射,若存在则直接返回,若不存在则查询本机的host文件中是否存在
    • 若还不存在,则会向本机配置的tcp/ip中的互联网服务提供商(ISP)的DNS服务器发送查询请求,若该DNS服务器中有该记录,则直接返回,若没有,则向根服务器发起请求
      • 根服务器是否有 abc.xyz.com 的记录
    • 若有,则返回,若没有,则根服务器会向 .com服务器发起请求
      • .com服务器,你是否有 abc.xyz.com 的记录
    • 若有,则返回,若没有,则.com服务器会继续向 .xyz.com 服务器发起请求
      • .xyz.com服务器,你是否有 abc.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 的记录
    • 若有,则返回
  • www.bilibili.com/video/BV1JZ…

2.tcp三次握手和四次挥手

2.1 tcp和udp的区别

  • tpc就类似于打电话,通话双方都能确保电话是否接通、通话的内容以及什么时候结束通话。
  • udp则类似于写信,我们无法得知对方是否接收到书信,无法知道对方接收到的书信是否完整,也无法知道对方收到的书信,是否按发送的书信顺序接收到 image.png

2.2 tcp的三次握手

2.2.1 三次握手的过程

  • 第一次
    • 客户端发送的一个SYN包,告诉服务端我想要连接
  • 第二次
    • 服务端接收到SYN包后,回复客户端一个SYN+ACK包,告诉客户端我已经准备好了
  • 第三次
    • 客户端收到服务端返回的SYN+ACK包后,向服务端发送了一个ACK确认包
  • 之后开始建立连接

2.2.2 为什么是三次握手而不是两次

  • 当客户端发送一个SYN包,告诉服务端我想要连接时,如果因为网络拥堵,导致该包堵在路上
    • 此时服务端无法接收到
  • 隔了一段时间后,客户端再次发送了一个SYN包,告诉服务端我想要连接,此时这个包顺利到达服务端
    • 服务端返回了一个SYN+ACK包,告诉客户端我准备好了,客户端接收到后,也返回了一个ACK确认包,此时双方建立了连接
  • 又过了一会,第一个SYN包不拥堵了,顺利到达服务端,此时服务端以为客户端又发起了一个新的连接,就会返回一个SYN+ACK包,告诉客户端我准备好了
    • 此时,对于客户端来说,只建立了一个连接,但对于服务端来说,是两个连接
    • 若此时只有两次握手,则会导致服务端一直开着连接等待客户端,会无端消耗资源

image.png

2.3 tcp的四次挥手

  • 第一次
    • 客户端向服务端发送了一个FIN包,告诉服务端我完事了,想要断开连接了
  • 第二次
    • 服务端接收到FIN包后,返回一个ACK确认包,告诉客户端我收到你的请求了
  • 第三次
    • 服务端在返回ACK确认包后,接着进入了等待关闭状态,然后返回一个FIN包,告诉客户端我准备好要关闭了
  • 第四次
    • 客户端在接收到FIN包后, 向服务端发送了一个ACK确认包,告诉服务端我知道了
    • 此时服务端接收到FIN包后,直接关闭了连接
    • 但此时客户端会进入最后的超时等待状态,
      • 这个状态是为了确保服务端接收到了最后的ACK确认包
      • 比如,在第三次服务端返回FIN包后,客户端接收到后,发送了ACK确认包,但由于某种原因,服务端没有接收到
      • 在经过一段时间后,服务端会再次发送一个FIN包向客户端确认,
      • 客户端接收到后,刷新了超时等待的时间,再次发送ACK包
      • 若此时服务端接收到ACK确认包后,则直接关闭连接
      • 客户端在最后的超时等待时间中没有接收到服务端的请求,则关闭连接

image.png

2.4 tcp的稳定性

  • 因为tcp会将数据切割为多份,然后通过报文发送
    • 在发送的报头中会记录对应的序列号、长度和数据内容
  • 服务端在接收到所有报文后,会对报文进行校验组装
    • 当发现缺失某个包时,会向客户端发送包含对应的序列号和长度的报文
  • 客户端接收到后,就会重新发送缺失的包,即丢失重发

3.udp的不稳定

  • 因为udp发送仅是简单的对数据进行包装,故对cpu的资源消耗比较小,但在网络传输中,容易存在丢包,即丢了就是真的丢了

  • 因此,udp比较适合对实时传输要求高且对少量丢包不在意的情况,如视频通话

  • www.bilibili.com/video/BV1kV…