前端100问

【前端100问】Q16:谈谈你对 TCP 三次握手和四次挥手的理

2020-12-12  本文已影响0人  alanwhy

写在前面

此系列来源于开源项目:前端 100 问:能搞懂 80%的请把简历给我
为了备战 2021 春招
每天一题,督促自己
从多方面多角度总结答案,丰富知识
谈谈你对 TCP 三次握手和四次挥手的理解

正文回答

q16-1.png

三次握手讲解

  1. 客户端发送位码为 syn = 1,随机产生 seq number=1234567 的数据包到服务器,服务器由 SYN=1 知道客户端要求建立联机(客户端:我要连接你)
  2. 服务器收到请求后要确认联机信息,向 A 发送 ack number=(客户端的 seq+1),syn=1,ack=1,随机产生 seq=7654321 的包(服务器:好的,你来连吧)
  3. 客户端收到后检查 ack number 是否正确,即第一次发送的 seq number+1,以及位码 ack 是否为 1,若正确,客户端会再发送 ack number=(服务器的 seq+1),ack=1,服务器收到后确认 seq 值与 ack=1 则连接建立成功。(客户端:好的,我来了)

为什么 http 建立连接需要三次握手,不是两次或四次?

三次是最少的安全次数,两次不安全,四次浪费资源;

TCP 关闭连接过程

  1. Client 向 Server 发送 FIN 包,表示 Client 主动要关闭连接,然后进入 FIN_WAIT_1 状态,等待 Server 返回 ACK 包。此后 Client 不能再向 Server 发送数据,但能读取数据。
  2. Server 收到 FIN 包后向 Client 发送 ACK 包,然后进入 CLOSE_WAIT 状态,此后 Server 不能再读取数据,但可以继续向 Client 发送数据。
  3. Client 收到 Server 返回的 ACK 包后进入 FIN_WAIT_2 状态,等待 Server 发送 FIN 包。
  4. Server 完成数据的发送后,将 FIN 包发送给 Client,然后进入 LAST_ACK 状态,等待 Client 返回 ACK 包,此后 Server 既不能读取数据,也不能发送数据。
  5. Client 收到 FIN 包后向 Server 发送 ACK 包,然后进入 TIME_WAIT 状态,接着等待足够长的时间(2MSL)以确保 Server 接收到 ACK 包,最后回到 CLOSED 状态,释放网络资源。
  6. Server 收到 Client 返回的 ACK 包后便回到 CLOSED 状态,释放网络资源。

为什么要四次挥手?

TCP 是全双工信道,何为全双工就是客户端与服务端建立两条通道

通道 1:客户端的输出连接服务端的输入

通道 2:客户端的输入连接服务端的输出

两个通道可以同时工作:客户端向服务端发送信号的同时服务端也可以向客户端发送信号。

所以关闭双通道的时候就是这样:

幽默一下

男:我要挂了哦
女:等哈,我还要敷面膜
女:我敷完了,现在可以挂了
男:我舍不得挂,你挂吧
女:好吧,我挂了
男:等了 2MSL 听见嘟嘟嘟的声音后挂断

上一篇下一篇

猜你喜欢

热点阅读