三次握手四次挥手
TCP 三次握手(建立连接)
核心目的:双方确认自己和对方的收发能力正常,协商初始序列号seq
- 第一次握手:客户端发送 SYN 包,请求建立连接,客户端进入 SYN‑SENT。
我想跟你建立连接,我的序列号是 x
- 第二次握手:服务端收到SYN,回复
SYN+ACK。SYN代表服务端也要建连接,ACK确认客户端请求;服务端seq=y,ack=x+1,服务端进入 SYN‑RCVD。
收到你的请求,我也准备好,我的序列号y,确认你的序号x
- 第三次握手:客户端回复 ACK,ack=y+1。客户端、服务端双双进入 ESTABLISHED,连接建立完成,可以传数据。
收到你的确认,连接正式就绪
SYN、ACK 是TCP头部标志位;SYN/ACK报文不携带业务数据。
TCP 四次挥手(断开连接,双向关闭)
TCP是全双工,读和写通道独立,一方关闭,另一方还可以继续发数据,所以需要4次
- 第一次挥手:客户端发送 FIN,客户端进入 FIN‑WAIT‑1
我这边不再发送数据了
- 第二次挥手:服务端回 ACK,服务端进入 CLOSE‑WAIT
收到,我知道你不发了;但服务端还可以继续给客户端发剩下的数据
- 第三次挥手:服务端自己数据全部发送完毕,发送 FIN,服务端进入 LAST‑ACK
我这边数据也发完,我也要关闭
- 第四次挥手:客户端回复 ACK,进入 TIME‑WAIT(等待2MSLS时间);服务端收到ACK直接CLOSED。等2MSLS超时后,客户端也关闭。
收到,连接关闭。
TIME‑WAIT作用:防止最后ACK丢失,留给对方重传FIN的机会。
极简口诀
- 建连接:SYN → SYN+ACK → ACK(3次握手)
- 断连接:FIN → ACK → FIN → ACK(4次挥手)
小补充:为什么握手3次,挥手要4次?
握手时 SYN 和 ACK 可以合并成一个报文;
挥手阶段,收到FIN后的ACK不能和自己的FIN合并,因为服务端可能还有剩余数据要发送,要等数据发完才敢发FIN,因此拆成两步,总共4次。
浙公网安备 33010602011771号