web性能优化基础篇之 DNS 与 TCP

1,789

这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

DNS

MDN释义:DNS(domain name system)域名系统,是一个层次化、分散化的Internet连接资源命名系统。DNS维护着一个包含域名与对应资源例如IP地址的列表。

一个示例:访问 juejin.cn

sequenceDiagram
用户->>浏览器: juejin.cn
浏览器->>操作系统: juejin.cn 的 IP 是多少
操作系统->>「移动、联通、电信」:juejin.cn 的 IP 是多少
「移动、联通、电信」->>操作系统:IP 是 1.2.3.4
操作系统->>浏览器:IP 是 1.2.3.4
浏览器->>1.2.3.4: 建立TCP连接

上述过程中,浏览器有浏览器的缓存,操作系统有操作系统的缓存,如果各自可以从各自的缓存中拿到所需要的信息时,流程就可以中断了。但是ISP「移动、联通、电信」运营商时候一定知道 juejin.cn 的IP地址是什么。我们有时会设置一个host,这个过程就相当于手动给操作系统中增加一个缓存。等浏览器再次访问的时候就可以从操作系统的缓存中访问对应的 IP 地址。

三次握手

TCP(Transmission Control Protocol) 传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。

一个例子:A和B打电话

sequenceDiagram
A-)B: 拨号
B--)A: 喂
A-)B: 喂
A-)B: 是这样的…

A拨号给B,B接起来回一句“喂”,A再回一句“喂”,前面这三步被称之为“三次握手”

是不是觉得A再回一句“喂”有点多余啊,A可以直接说事就行,严谨起见,这个还是需要的,下面介绍原因。

TCP连接建立过程的三次握手

sequenceDiagram
A-)B: SYN(x) x=100  『同步100』
B--)A: ACK(x+1) SYN(y) y=900  『知悉101 同步900』
A-)B: ACK(y+1)  『知悉901』
A-)B: HTTP内容
  • SYN 是同步synchronize的缩写,x为从0开始的任意正整数,此处比如100
  • ACK为获悉acknowledge的缩写,y为从0开始的任意正整数,此处比如900

这里来说一下,为什么需要A给B的ACK(y+1),总体来说是为了防止错误的发生。上面两步可以知道A可以发消息给B,B可以接收消息并且发送消息给A,但是并不清楚A是否可以接收消息。如果A等不到B的消息后就中断了通信,那么B在不知道A是否可以接收的情况下,就无法判断是否继续保持通讯了。

四次挥手

一个例子:A和B打完电话

sequenceDiagram
A-)B: 我说完了
B--)A: 哦
B--)A: 但我还有一句话,我爱你
B--)A: 我也说完了
A-)B: 哦

疑问:这不是五句吗?为什么是四次。因为 B 对 A 的那一句 “我爱你”,不是必须的。

TCP连接断开过程的四次挥手

sequenceDiagram
A-)B: FIN(x) x=500  『结束500』
B--)A: ACK(x+1) 『知悉501』
B--)A: …… 『额外的内容,可以没有』
B--)A: FIN(Y) 『结束999』
A-)B: ACK(y+1)  『知悉1000』
  • FIN 是结束FINISH的缩写,x为从1开始的任意正整数,此处比如500
  • ACK为获悉acknowledge的缩写,y为从1开始的任意正整数,此处比如999

为什么 B->A 的 ACK 和 FIN 不能合并呢?因为中间 B 可能还有别的内容需要传输。

TCP全过程

TCP过程2.png

习题

  • TCP 和 UDP 的区别是什么?「ACF」

    • A. TCP 面向连接有状态,UDP 无状态
    • B. TCP 无状态,UDP 面向连接有状态
    • C. TCP 可靠(不丢失不重复),UDP 不可靠
    • D. TCP 不可靠,UDP 可靠(不丢失不重复)
    • E. TCP 传输效率较高,UDP 较低
    • F. TCP 传输效率较低,UDP 较高
  • 为什么 TCP 的三次握手不能精简为两次?「B」

    • A. 为了看起来美观
    • B. 为了确保客户端(A端)能接收到服务端(B端)的数据
  • 为什么 TCP 的四次挥手不能将中间两步合并成一步? 「A」

    • A. 因为两步中间往往会有其他数据需要发送
    • B. 因为合成之后就不对称了

最后说一句

如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下,您的支持是我坚持写作最大的动力,多谢支持。