三次握手四次挥手

一、三次握手:建立 TCP 连接
TCP 是 “面向连接” 的协议,通信前必须先通过三次握手确认双方的收发能力,确保连接可正常传输数据。
核心目的
让客户端和服务器互相确认 “对方能发、也能收”,避免因单方面能通信而导致数据丢失。
协商初始序列号(ISN),为后续数据传输的 “按序、去重” 打下基础。
具体过程(以 “客户端→服务器” 建立连接为例)
第一次握手(客户端→服务器)客户端主动发送 “连接请求报文”(标志位SYN=1),并生成一个随机的初始序列号(seq=x),发送给服务器。→ 客户端状态:从CLOSED变为SYN-SENT(等待服务器确认)。
第二次握手(服务器→客户端)服务器收到请求后,确认 “自己能收、客户端能发”,随即回复 “确认 + 连接请求报文”(标志位SYN=1,ACK=1):
ACK=1:确认收到客户端的seq=x,确认号为ack=x+1(表示 “下次希望收到 x+1 开始的数据”);
SYN=1:服务器同时向客户端发起连接请求,生成自己的初始序列号seq=y。
→ 服务器状态:从LISTEN变为SYN-RCVD(等待客户端最终确认)。
第三次握手(客户端→服务器)客户端收到服务器的回复后,确认 “自己能收、服务器能发”,再发送 “最终确认报文”(标志位ACK=1):
确认号ack=y+1(表示 “已收到服务器的 seq=y,下次希望收到 y+1 开始的数据”);
自身序列号seq=x+1(延续第一次的序列号)。
→ 客户端状态:从SYN-SENT变为ESTABLISHED(连接建立,可传输数据);
→ 服务器收到该报文后,状态也变为ESTABLISHED,双方正式开始数据传输。
二、四次挥手:断开 TCP 连接
当数据传输完成后,双方需通过四次挥手释放连接(TCP 是 “全双工” 通信,需分别关闭 “客户端→服务器” 和 “服务器→客户端” 两个方向的通信)。
核心目的
确保双方已 “完全发送 / 接收完所有数据”,避免断开连接时丢失数据。
分别关闭两个方向的通信通道,最终释放资源。
具体过程(以 “客户端主动发起断开” 为例)
第一次挥手(客户端→服务器)客户端数据发送完毕,主动发送 “断开请求报文”(标志位FIN=1),表示 “我不再向你发数据了”,自身序列号seq=u(u 是客户端已发数据的最后一个字节序号 + 1)。→ 客户端状态:从ESTABLISHED变为FIN-WAIT-1(等待服务器确认)。
第二次挥手(服务器→客户端)服务器收到FIN后,先回复 “确认报文”(标志位ACK=1),确认号ack=u+1(表示 “已收到你要断开的请求,后续不再接收你的数据”),自身序列号seq=v(v 是服务器已发数据的最后一个字节序号 + 1)。→ 此时,“客户端→服务器” 的通信方向已关闭,但服务器仍可向客户端发数据;→ 客户端状态:从FIN-WAIT-1变为FIN-WAIT-2(等待服务器的断开请求);→ 服务器状态:从ESTABLISHED变为CLOSE-WAIT(准备关闭自己的发送方向)。
第三次挥手(服务器→客户端)服务器确认 “自己向客户端的数据已全部发送完毕” 后,发送 “断开请求报文”(标志位FIN=1,ACK=1),表示 “我也不再向你发数据了”,自身序列号seq=w(w 是服务器补充发送数据后的最后一个字节序号 + 1),确认号仍为ack=u+1。→ 服务器状态:从CLOSE-WAIT变为LAST-ACK(等待客户端的最终确认)。
第四次挥手(客户端→服务器)
、、客户端收到服务器的FIN后,回复 “最终确认报文”(标志位ACK=1),确认号ack=w+1(表示 “已收到你要断开的请求”),自身序列号seq=u+1。→ 客户端状态:从FIN-WAIT-2变为TIME-WAIT(等待 2 个 “最大报文段生存时间” MSL,确保服务器能收到确认,避免服务器重发FIN);→ 服务器收到确认后,状态变为CLOSED(资源释放);→ 客户端等待 2MSL 后,未收到服务器重发的FIN,确认服务器已释放,自身状态也变为CLOSED,连接彻底断开。

posted on 2025-10-27 10:32  拾壹凪  阅读(10)  评论(0)    收藏  举报

导航