这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记
这节课主要围绕的是“抖音网络是怎么交互的”,又很类似于“打开浏览器,网络发生了怎样的变化”
首先,我又去小林的《图解网络》文章中深入的建立、断开以及为什么需要三次握手和四次断开,如下文所示:
TCP建立连接的过程。
- 第⼀次握⼿(客户端发送syn包到服务器端):客户端发送syn包到服务器端,进⼊syn_send状态,等待服务器端的确认;
- 第⼆次握⼿(服务器返回syn+ack标志位置一的包给客户端):服务器端收到客户端的syn包,发送syn+ack包给客户端,进⼊syn_recv状态;
- 第三次握⼿(客服端返回ack包给服务端):客户端收到服务器端的syn+ack包,发送个ack包到服务器端,⾄此,客户端与服务器端进⼊established状态;
\
TCP断开连接的过程。
- 客户端打算关闭连接,此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文,也即 FIN 报文,之后客户端进入 FIN_WAIT_1 状态。
- 服务端收到该报文后,就向客户端发送 ACK 应答报文,接着服务端进入 CLOSED_WAIT 状态。
- 客户端收到服务端的 ACK 应答报文后,之后进入 FIN_WAIT_2 状态。
- 第三次断手:等待服务端处理完数据后,也向客户端发送 FIN 报文,之后服务端进入 LAST_ACK 状态。
- 客户端收到服务端的 FIN 报文后,回一个 ACK 应答报文,之后进入 TIME_WAIT 状态
- 服务器收到了 ACK 应答报文后,就进入了 CLOSED 状态,至此服务端已经完成连接的关闭。
- 客户端在经过 2MSL 一段时间后,自动进入 CLOSED 状态,至此客户端也完成连接的关闭。
为什么要三次握手才建立连接?
(可以从两次握手的角度逆向分析)
- 三次握手才可以阻止重复历史连接的初始化(从网络阻塞的角度分析)
- 三次握手才可以同步双方的初始序列号
- 三次握手才可以避免资源浪费
为什么要四次挥手
(因为发送跟处理报文是两回事)
- 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
- 服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。