【前端100问】Q16:谈谈你对 TCP 三次握手和四次挥手的理
2020-12-12 本文已影响0人
alanwhy
写在前面
此系列来源于开源项目:前端 100 问:能搞懂 80%的请把简历给我
为了备战 2021 春招
每天一题,督促自己
从多方面多角度总结答案,丰富知识
谈谈你对 TCP 三次握手和四次挥手的理解
正文回答
q16-1.png三次握手讲解
- 客户端发送位码为 syn = 1,随机产生 seq number=1234567 的数据包到服务器,服务器由 SYN=1 知道客户端要求建立联机(客户端:我要连接你)
- 服务器收到请求后要确认联机信息,向 A 发送 ack number=(客户端的 seq+1),syn=1,ack=1,随机产生 seq=7654321 的包(服务器:好的,你来连吧)
- 客户端收到后检查 ack number 是否正确,即第一次发送的 seq number+1,以及位码 ack 是否为 1,若正确,客户端会再发送 ack number=(服务器的 seq+1),ack=1,服务器收到后确认 seq 值与 ack=1 则连接建立成功。(客户端:好的,我来了)
为什么 http 建立连接需要三次握手,不是两次或四次?
三次是最少的安全次数,两次不安全,四次浪费资源;
TCP 关闭连接过程
- Client 向 Server 发送 FIN 包,表示 Client 主动要关闭连接,然后进入 FIN_WAIT_1 状态,等待 Server 返回 ACK 包。此后 Client 不能再向 Server 发送数据,但能读取数据。
- Server 收到 FIN 包后向 Client 发送 ACK 包,然后进入 CLOSE_WAIT 状态,此后 Server 不能再读取数据,但可以继续向 Client 发送数据。
- Client 收到 Server 返回的 ACK 包后进入 FIN_WAIT_2 状态,等待 Server 发送 FIN 包。
- Server 完成数据的发送后,将 FIN 包发送给 Client,然后进入 LAST_ACK 状态,等待 Client 返回 ACK 包,此后 Server 既不能读取数据,也不能发送数据。
- Client 收到 FIN 包后向 Server 发送 ACK 包,然后进入 TIME_WAIT 状态,接着等待足够长的时间(2MSL)以确保 Server 接收到 ACK 包,最后回到 CLOSED 状态,释放网络资源。
- Server 收到 Client 返回的 ACK 包后便回到 CLOSED 状态,释放网络资源。
为什么要四次挥手?
TCP 是全双工信道,何为全双工就是客户端与服务端建立两条通道
通道 1:客户端的输出连接服务端的输入
通道 2:客户端的输入连接服务端的输出
两个通道可以同时工作:客户端向服务端发送信号的同时服务端也可以向客户端发送信号。
所以关闭双通道的时候就是这样:
- 客户端:我要关闭输入通道了。
- 服务端:好的,你关闭吧,我这边也关闭这个通道。
- 服务端:我也要关闭输入通道了。
- 客户端:好的你关闭吧,我也把这个通道关闭。
幽默一下
男:我要挂了哦
女:等哈,我还要敷面膜
女:我敷完了,现在可以挂了
男:我舍不得挂,你挂吧
女:好吧,我挂了
男:等了 2MSL 听见嘟嘟嘟的声音后挂断