TCP 的三次握手和四次挥手是前端面试中经常被问到的网络基础知识。它们保证了可靠的连接建立和断开。下面我分别描述一下这两个过程:
三次握手 (Three-way handshake)
三次握手的目的是同步连接双方的序列号和确认号,并交换 TCP 窗口大小信息。
-
SYN (Synchronize):客户端发送一个 SYN 包到服务器,其中包含客户端的初始序列号 (client_isn)。这个包表明客户端希望建立连接。此时,客户端进入
SYN-SENT
状态。 -
SYN-ACK (Synchronize-Acknowledge):服务器收到 SYN 包后,发送一个 SYN-ACK 包给客户端。这个包包含服务器的初始序列号 (server_isn) 和对客户端 SYN 包的确认号 (client_isn + 1)。此时,服务器进入
SYN-RECEIVED
状态。 -
ACK (Acknowledge):客户端收到 SYN-ACK 包后,发送一个 ACK 包给服务器。这个包包含对服务器 SYN-ACK 包的确认号 (server_isn + 1)。此时,客户端进入
ESTABLISHED
状态。服务器收到 ACK 包后也进入ESTABLISHED
状态,连接建立完成。
图示:
Client Server
SYN(client_isn)
----------------------------------------->
SYN-RECEIVED
<-----------------------------------------
SYN-ACK(server_isn, client_isn+1)
SYN-SENT
ACK(server_isn+1)
----------------------------------------->
ESTABLISHED ESTABLISHED
四次挥手 (Four-way handshake)
四次挥手的目的是确保双方都完成了数据的传输,并有序地释放连接。
-
FIN (Finish):客户端发送一个 FIN 包给服务器,表示客户端不再发送数据,准备关闭连接。客户端进入
FIN-WAIT-1
状态。 -
ACK (Acknowledge):服务器收到 FIN 包后,发送一个 ACK 包给客户端,确认收到 FIN 包。服务器进入
CLOSE-WAIT
状态。此时,客户端到服务器的连接已经关闭,但服务器到客户端的连接仍然可以传输数据。 -
FIN (Finish):服务器发送一个 FIN 包给客户端,表示服务器也不再发送数据,准备关闭连接。服务器进入
LAST-ACK
状态。 -
ACK (Acknowledge):客户端收到 FIN 包后,发送一个 ACK 包给服务器,确认收到 FIN 包。客户端进入
TIME-WAIT
状态,等待 2MSL(Maximum Segment Lifetime,最大报文段生存时间)后,进入CLOSED
状态。服务器收到 ACK 包后,进入CLOSED
状态,连接完全关闭。
图示:
Client Server
FIN
----------------------------------------->
FIN-WAIT-1 CLOSE-WAIT
<-----------------------------------------
ACK
FIN
<-----------------------------------------
LAST-ACK FIN-WAIT-2
ACK
----------------------------------------->
TIME-WAIT CLOSED
(after 2MSL)
CLOSED
前端开发中的意义:
理解 TCP 的三次握手和四次挥手,有助于前端开发者:
- 排查网络问题: 当网页加载缓慢或连接失败时,可以结合网络工具分析 TCP 连接的状态,判断问题所在。
- 优化网络性能: 了解 TCP 的工作原理,可以帮助前端开发者选择合适的网络优化策略,例如减少 HTTP 请求次数、使用持久连接等。
- 理解 WebSocket: WebSocket 是基于 TCP 协议的,理解 TCP 有助于理解 WebSocket 的工作原理。
希望以上解释能够帮助你理解 TCP 的三次握手和四次挥手。
标签:ACK,握手,SYN,TCP,四次,服务器,FIN,客户端 From: https://www.cnblogs.com/ai888/p/18580866