# 一图概览

image.png

# DNS & hosts

DNS,全称:Domain Name System,中文:域名系统

域名系统本身的原理是比较复杂的,但域名系统的功能很简单,就是输入一个域名,输出一个 IP,这里我们只对 DNS 做简单讨论

举例说明:

  1. 在浏览器输入 baidu.com 这个地址

  2. 浏览器需要知道你访问的这个地址对应的 IP 是多少,于是浏览器就会去问操作系统

  3. 如果操作系统也不知道,就会去问电信、移动、联通这样的网络运行商(以下简称 ISP)

  4. 当你付费之后,网络运营商就会告诉你 baidu.com 这个地址对应的 IP 是多少(假设这里 baidu.com 对应的 IP 是 1.2.3.4),然后将 IP 返回给你

  5. 浏览器获取到 baidu.com 对应的 IP 之后,就会与 1.2.3.4 这个 IP 建立 TCP 连接

细化过程:

  1. 在浏览器输入 baidu.com 这个地址的时候,浏览器首先会去检查自身是否有缓存,如果发现之前访问过 baidu.com ,那么浏览器就会直接将上一次的 IP 进行返回

  2. 如果浏览器没有缓存,就回去询问操作系统,然后操作系统首先也是会检查自身是否有缓存,如果没有就会去询问 ISP(网络运行商)

  3. 平时我们修改 hosts 这个文件,其实就是在手动给操作系统设置缓存,比如我们在 hosts 中写入 baidu.com 2.3.4.5 ,以后每次访问 baidu.com 这个地址的时候就不会再去询问 ISP 了,直接会通过 hosts 中的设置去访问 2.3.4.5 这个 IP

# TCP 三次握手

TCP 全称:Transmission Control Protocol,即传输控制协议

image.png

假设 A 是浏览器,B 是服务器

  1. A 首先会向 B 发送一个叫做 SYN(x) (假设这里 x = 100)的信息

    SYN 是 synchronize (同步) 的缩写,同步不是指「同步异步」中的同步,而是「同步信息」中的同步;这里的 x 一般是一个数字编号,且 x 和 y 一般都是从 0 开始的,这里我们对 x 和 y 的意义不做讨论,有兴趣的请自行研究

  2. B 收到 A 发来的同步信息后,就会返回 ACK(x+1) (101) SYN(y) (这里假设 y = 200)

    ACK 是 acknowledge (知道) 的缩写

  3. 然后 A 会回复消息 ACK(y+1) (201)给 B

从以上过程中能够确保以下几件事:

  • A 可以向 B 发送信息
  • B 能收到 A 发送的信息
  • B 也可以向 A 发送信息
  • A 也能收到 B 发送的信息

三次握手成功后就开始建立 TCP 连接了,建立连接后就可以开始传输内容了(一般是 HTTP 内容,也可以是其他内容,且传输的过程也可以是双向的,并非一定是单向的),HTTP 内容传输结束后,就会「关闭」

# TCP 四次挥手

image.png

  1. 上述内容传输完成后,A 会发送一个 FIN(x)

    注意:不一定是 A 先发送 FIN,也可以是 B 先发送

  2. B 先回复 ACK(x+1)

    注意:关闭时的 x 和 y 一般都不是 0

  3. 然后再回复 FIN(y)

    步骤 2 和步骤 3 中间可能会夹杂着其他内容

  4. A 回复 ACK(y+1)

最后,A 和 B 各自关闭自己的 TCP 连接

# 一些 Q & A

# 为什么需要关闭 TCP 连接?

因为一直保持连接会浪费内存和 CPU

# TCP 和 UDP 的区别是什么?

八股文,面试必背

  • TCP 面向连接有状态,UDP 无状态
  • TCP 可靠(不丢失不重复),UDP 不可靠
  • TCP 传输效率较低,UDP 较高

# 为什么 TCP 的三次握手不能精简为两次?

为了确保客户端(A 端)能接收到服务端(B 端)的数据(只有两次的话,无法判断 A 是否能接收到 B 的数据)

# 为什么 TCP 的四次挥手不能将中间两步合并成一步?

因为两步中间(指发送 ACK(x+1)FIN(y) 之间)往往会有其他数据需要发送,需要等其他数据发送完成之后,再发送 FIN(y)

更新于