DNS 与 TCP
一图概览
DNS & hosts
DNS,全称:Domain Name System,中文:域名系统
域名系统本身的原理是比较复杂的,但域名系统的功能很简单,就是输入一个域名,输出一个 IP,这里我们只对 DNS 做简单讨论
举例说明:
在浏览器输入 baidu.com 这个地址
浏览器需要知道你访问的这个地址对应的 IP 是多少,于是浏览器就会去问操作系统
如果操作系统也不知道,就会去问电信、移动、联通这样的网络运行商(以下简称 ISP)
当你付费之后,网络运营商就会告诉你 baidu.com 这个地址对应的 IP 是多少(假设这里 baidu.com 对应的 IP 是 1.2.3.4),然后将 IP 返回给你
浏览器获取到 baidu.com 对应的 IP 之后,就会与 1.2.3.4 这个 IP 建立 TCP 连接
细化过程:
在浏览器输入 baidu.com 这个地址的时候,浏览器首先会去检查自身是否有缓存,如果发现之前访问过 baidu.com ,那么浏览器就会直接将上一次的 IP 进行返回
如果浏览器没有缓存,就回去询问操作系统,然后操作系统首先也是会检查自身是否有缓存,如果没有就会去询问 ISP(网络运行商)
平时我们修改 hosts 这个文件,其实就是在手动给操作系统设置缓存,比如我们在 hosts 中写入
baidu.com 2.3.4.5
,以后每次访问 baidu.com 这个地址的时候就不会再去询问 ISP 了,直接会通过 hosts 中的设置去访问 2.3.4.5 这个 IP
TCP 三次握手
TCP 全称:Transmission Control Protocol,即传输控制协议
假设 A 是浏览器,B 是服务器
A 首先会向 B 发送一个叫做
SYN(x)
(假设这里 x = 100)的信息SYN 是 synchronize(同步) 的缩写,同步不是指「同步异步」中的同步,而是「同步信息」中的同步;这里的 x 一般是一个数字编号,且 x 和 y 一般都是从 0 开始的,这里我们对 x 和 y 的意义不做讨论,有兴趣的请自行研究
B 收到 A 发来的同步信息后,就会返回
ACK(x+1)
(101)SYN(y)
(这里假设 y = 200)ACK 是 acknowledge(知道) 的缩写
然后 A 会回复消息
ACK(y+1)
(201)给 B
从以上过程中能够确保以下几件事:
- A 可以向 B 发送信息
- B 能收到 A 发送的信息
- B 也可以向 A 发送信息
- A 也能收到 B 发送的信息
三次握手成功后就开始建立 TCP 连接了,建立连接后就可以开始传输内容了(一般是 HTTP 内容,也可以是其他内容,且传输的过程也可以是双向的,并非一定是单向的),HTTP 内容传输结束后,就会「关闭」
TCP 四次挥手
上述内容传输完成后,A 会发送一个
FIN(x)
注意:不一定是 A 先发送 FIN,也可以是 B 先发送
B 先回复
ACK(x+1)
注意:关闭时的 x 和 y 一般都不是 0
然后再回复
FIN(y)
步骤 2 和步骤 3 中间可能会夹杂着其他内容
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)