当前位置: 首页 > news >正文

TCP 三握四挥

TCP 三握四挥

TCP 三次握手与四次挥手 笔记


一、TCP 三次握手(连接建立)

TCP 是面向连接的协议,连接建立需要三次握手,确保双方收发能力正常,为双向数据传输通道做准备。

1. 三次握手过程

步骤 方向 报文 客户端状态 服务端状态 说明
第一次握手 客户端 → 服务端 SYN=1, seq=x CLOSED → SYN_SENT LISTEN 客户端调用 connect(),主动发起连接请求,携带初始序列号 x
第二次握手 服务端 → 客户端 SYN=1, ACK=1, seq=y, ack=x+1 SYN_SENT LISTEN → SYN_RECV 服务端回复 SYN+ACK,携带自身初始序列号 y,确认客户端的 x+1
第三次握手 客户端 → 服务端 ACK=1, seq=x+1, ack=y+1 SYN_SENT → ESTABLISHED SYN_RECV → ESTABLISHED 客户端回复 ACK,确认服务端的 y+1,连接正式建立

2. 关键细节补充

  • 客户端 connect() 函数会阻塞,直到三次握手完成后才返回。
  • 服务端调用 listen() 后进入 LISTEN 状态,调用 accept() 会阻塞,直到收到第三次握手的 ACK 后才返回。
  • SYN_RECV 状态的连接也称为“半连接”,未完成三次握手的请求会被记录在半连接队列中。
  • CLOSED 是协议定义的虚拟状态,实际运行中不存在。
  • listen() 函数的第二个参数 +1,是已连接队列(ESTABLISHED 状态)的大小,用于存放三次握手完成但未被 accept() 处理的连接,高并发场景建议调大。

二、TCP 四次挥手(连接拆除)

断开 TCP 连接需要四次挥手,因为 TCP 是全双工协议,双方都需要确认对方的发送请求,由任意一方调用 close() 触发。

1. 四次挥手过程(以客户端主动关闭为例)

步骤 方向 报文 主动关闭端状态 对端状态 说明
第一次挥手 主动关闭端 → 对端 FIN=1, seq=u ESTABLISHED → FIN_WAIT1 ESTABLISHED 主动关闭端调用 close(),发送 FIN,表示不再发送数据
第二次挥手 对端 → 主动关闭端 ACK=1, seq=v, ack=u+1 FIN_WAIT1 → FIN_WAIT2 ESTABLISHED → CLOSE_WAIT 对端回复 ACK,确认收到 FIN,此时主动关闭端到对端的通道关闭,但对端仍可发送数据
第三次挥手 对端 → 主动关闭端 FIN=1, ACK=1, seq=w, ack=u+1 FIN_WAIT2 CLOSE_WAIT → LAST_ACK 对端调用 close(),发送 FIN,表示不再发送数据
第四次挥手 主动关闭端 → 对端 ACK=1, seq=u+1, ack=w+1 FIN_WAIT2 → TIME_WAIT LAST_ACK → CLOSED 主动关闭端回复 ACK,对端收到后立即关闭;主动关闭端进入 TIME_WAIT 状态,持续 2MSL

2. 关键细节补充

  • TIME_WAIT 状态会持续 2MSL(Maximum Segment Lifetime,报文在网络中存在的最长时间,通常为30秒~2分钟),作用是确保对端收到最后一个 ACK,避免报文延迟导致新连接受干扰。
  • 客户端主动断开时,TIME_WAIT 状态几乎无危害:客户端端口是随机分配的,不会影响端口复用。
  • 服务端主动断开时,TIME_WAIT 会导致端口无法立即复用,影响服务重启。

三、端口与 bind()/listen() 相关细节

  1. 客户端的 socket 也有端口号,由系统随机分配,程序员无需手动管理。
  2. 服务端 bind() 函数:普通用户只能绑定1024以上的端口,root 用户可绑定任意端口。
  3. netstat -na 命令可查看 TCP 连接状态,例如服务端的 LISTEN 状态、已建立的 ESTABLISHED 连接等。

四、解决服务端 TIME_WAIT 端口复用问题

为了避免服务端主动断开后端口无法立即复用,可在 bind() 之前设置 SO_REUSEADDR 选项:

int opt = 1;
setsockopt(m_listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
  • 该选项允许服务端绑定处于 TIME_WAIT 状态的端口,需放在 bind() 之前调用。
  • 适用于服务端频繁重启的场景,避免端口占用导致启动失败。

五、核心状态总结

状态 场景 说明
LISTEN 服务端 监听客户端连接请求
SYN_SENT 客户端 已发送 SYN,等待服务端回复
SYN_RECV 服务端 已收到 SYN,回复 SYN+ACK,等待客户端 ACK
ESTABLISHED 双方 连接建立完成,可传输数据
FIN_WAIT1 主动关闭端 已发送 FIN,等待对端 ACK
FIN_WAIT2 主动关闭端 已收到对端 ACK,等待对端 FIN
CLOSE_WAIT 被动关闭端 已收到 FIN,回复 ACK,等待应用层 close()
LAST_ACK 被动关闭端 已发送 FIN,等待主动关闭端的 ACK
TIME_WAIT 主动关闭端 已收到 FIN 并回复 ACK,等待 2MSL 确保连接关闭
http://www.jsqmd.com/news/834782/

相关文章:

  • 2026年|AI写的文献综述AI味太浓?推荐插入个人观点衔接句,高效降低AI率! - 降AI实验室
  • 愚人节比赛
  • 长沙个人写真摄影:栖沐影像vs其他工作室,2026年5月深度对比 - 麦克杰
  • 面向对象程序设计——前三次作业集总结
  • Ubuntu 26.04使用笔记
  • 2026年我家孩子高二数学从85提到113,柯桥蓝天附近找辅导班的经历说几句大实话 - 奔跑123
  • 北京三大专业沙发翻新品牌|匠阁沙发翻新御匠沙发翻新锦修沙发翻新|换皮换布上门维修|全城服务电话一览
  • Linux 如何禁用密码登录并配置 SSH 密钥认证防止暴力破解?
  • 2026年4月市场评价高的化学品防爆柜实力厂家推荐,危废品存放间/压滤机/小型焚烧炉/焚烧炉,化学品防爆柜生产厂家找哪家 - 品牌推荐师
  • 2026京东E卡回收渠道横评:同样处理闲置卡,为什么鼎鼎收到账快折扣还高? - 鼎鼎收礼品卡回收
  • 2026年4月精细化酒店施工运营推荐,奶油风民宿/原木民宿/庭院酒店/新中式酒店/酒店装修设计,酒店施工改造多少钱 - 品牌推荐师
  • LangChain开发核心技巧,动态切换AI大模型参数
  • # 2026年国产三维扫描仪品牌推荐:TOP5品牌技术与服务全解析 - 科技焦点
  • 2026年测评|AIGC率怎么降?6个自用工具分享,AI率从90%到10% - 降AI实验室
  • 循环赛日程表问题
  • 2026年国产三维扫描仪推荐:扫描精度、速率与核心技术创新全解析 - 科技焦点
  • 哈尔滨保险拒赔律师推荐 李晓伟律师:12年深耕保险理赔,用专业与责任为当事人保驾护航 - 铅笔写好字
  • # 2026年国产三维扫描仪哪家性价比高?TOP5品牌盘点 - 科技焦点
  • 匠阁沙发翻新、御匠沙发翻新、锦修沙发翻新三大沙发翻新品牌全解析:服务、网络与实力
  • AI智能体的赢家诅咒:为什么最自信的智能体最危险
  • 2026年紧急降AI率:实测5款降AI工具,快速将80%AIGC率降至安全线【必备收藏】 - 降AI实验室
  • 机械行业3D扫描仪怎么选?2026年扫描精度、便携部署与自动化能力全对比 - 科技焦点
  • L型骨牌覆盖
  • 阿里云 ECS 安全组规则配置错误导致无法远程连接怎么排查?
  • 2026年4月河北热门的景区必去点,旅游景点/景区/景点/游玩景点/夜游景点,景区好去处 - 品牌推荐师
  • MCP 调试工具
  • 2026年5月自来水厂悬浮物浓度计前五品牌实测 - 水质仪表品牌排行榜
  • 2026年5月在线超声波明渠流量计十大知名品牌盘点 - 水质仪表品牌排行榜
  • 2026年3C电子零件影像测量仪哪家口碑好?TOP5品牌全维度测评 - 科技焦点
  • P9243 [蓝桥杯 2023 省 B] 岛屿个数