news 2026/8/29 7:28:25

深入理解TCP状态转换:从三次握手到四次挥手的完整实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入理解TCP状态转换:从三次握手到四次挥手的完整实战

一、引言

TCP(传输控制协议)是互联网最重要的传输层协议之一,其可靠性建立在复杂的状态机制之上。本文将通过详细的代码示例和实际运行结果,深入剖析TCP连接从建立到断开的完整状态转换过程,帮助你彻底理解三次握手四次挥手背后的原理。

二、TCP状态转换全景图

TCP连接的生命周期包含三个核心阶段:

┌─────────────────────────────────────────────────────────┐ │ 阶段1: 三次握手 (Connection Establishment) │ │ CLOSED → SYN_SENT → SYN_RCVD → ESTABLISHED │ ├─────────────────────────────────────────────────────────┤ │ 阶段2: 数据传输 (Data Transfer) │ │ ESTABLISHED ←→ ESTABLISHED (状态保持不变) │ ├─────────────────────────────────────────────────────────┤ │ 阶段3: 四次挥手 (Connection Termination) │ │ FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED │ │ CLOSE_WAIT → LAST_ACK → CLOSED │ └─────────────────────────────────────────────────────────┘

三、三次握手详解与代码实现

3.1 三次握手状态转换流程

客户端 服务器 CLOSED CLOSED | | | socket() | socket() | | bind() | | listen() | ↓ | LISTEN | connect() | ↓ | SYN_SENT --------[SYN, seq=x]----------→ | | ↓ | SYN_RCVD | ←----[SYN+ACK, seq=y, ack=x+1]---| ↓ | ESTABLISHED ----[ACK, ack=y+1]--------→ | | ↓ | ESTABLISHED

3.2 服务器端代码实现

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<arpa/inet.h>#include<sys/socket.h>#include<netinet/tcp.h>#definePORT8888#defineBACKLOG5// 打印当前TCP状态的辅助函数voidprint_tcp_state(intsockfd,constchar*stage){structtcp_infoinfo;socklen_tinfo_len=sizeof(info);if(getsockopt(sockfd,IPPROTO_TCP,TCP_INFO,&info,&info_len)==0){printf("[%s] TCP状态: %d\n",stage,info.tcpi_state);}}intmain(){intlistenfd,connfd;structsockaddr_inservaddr,cliaddr;socklen_tclilen;charbuffer[1024];// 步骤1: 创建socket (状态: CLOSED)listenfd=socket(AF_INET,SOCK_STREAM,0);if(listenfd<0){perror("socket error");exit(1);}printf("✓ 服务器socket创建成功 (状态: CLOSED)\n");// 设置地址重用intopt=1;setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));// 步骤2: 绑定地址memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_addr.s_addr=htonl(INADDR_ANY);servaddr.sin_port=htons(PORT);if(bind(listenfd,(structsockaddr*)&servaddr,sizeof(servaddr))<0){perror("bind error");exit(1);}printf("✓ 绑定端口 %d 成功\n",PORT);// 步骤3: 开始监听 (状态: CLOSED → LISTEN)if(listen(listenfd,BACKLOG)<0){perror("listen error");exit(1);}printf("✓ 服务器进入LISTEN状态,等待客户端连接...\n");printf("═══════════════════════════════════════\n");// 步骤4: 接受连接 (三次握手过程)clilen=sizeof(cliaddr);printf("⏳ 等待客户端发起第一次握手 (SYN)...\n");connfd=accept(listenfd,(structsockaddr*)&cliaddr,&clilen);if(connfd<0){perror("accept error");exit(1);}// 三次握手完成,连接建立charclient_ip[INET_ADDRSTRLEN];inet_ntop(AF_INET,&cliaddr.sin_addr,client_ip,INET_ADDRSTRLEN);printf("\n🎉 三次握手完成!\n");printf("✓ 客户端 %s:%d 已连接\n",client_ip,ntohs(cliaddr.sin_port));printf("✓ 服务器状态: ESTABLISHED\n");printf("═══════════════════════════════════════\n");// 步骤5: 数据传输阶段 (状态保持ESTABLISHED)printf("\n📡 进入数据传输阶段 (状态保持ESTABLISHED)...\n");while(1){ssize_tn=read(connfd,buffer,sizeof(buffer)-1);if(n<=0){printf("\n⚠️ 客户端断开连接,准备进入四次挥手...\n");break;}buffer[n]='\0';printf("收到数据: %s",buffer);// 回显数据write(connfd,buffer,n);}// 步骤6: 关闭连接 (四次挥手)printf("✓ 关闭连接\n");close(connfd);close(listenfd);return0;}

3.3 客户端代码实现

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<arpa/inet.h>#include<sys/socket.h>#defineSERVER_IP"127.0.0.1"#defineSERVER_PORT8888intmain(){intsockfd;structsockaddr_inservaddr;charsend_buf[1024];charrecv_buf[1024];// 步骤1: 创建socket (状态: CLOSED)sockfd=socket(AF_INET,SOCK_STREAM,0);if(
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/20 19:25:00

杰理之时钟波形质量检查【篇】

◦ 用示波器观察时钟信号的上升沿 / 下降沿是否陡峭&#xff08;过冲 < 10%&#xff0c;毛刺 < 50mV&#xff09;&#xff0c;避免因线路阻抗不匹配导致的波形畸变&#xff08;畸变会导致从设备采样错误&#xff09;。 ◦ 检查 MCLK 是否稳定&#xff08;无突然中断或频率…

作者头像 李华
网站建设 2026/8/22 11:37:24

MiniMax Agent 代理开发框架

一段时间前&#xff0c;我注意到我自己的AI项目中有些奇怪的事情。 我的代理变得越"高级"&#xff0c;它们感觉越脆弱。 更多的提示。 更多的工具。 更多的条件。 更多的粘合代码。 而且不知何故&#xff0c;清晰度更差。 这就是我开始探索来自MiniMax的MiniMax …

作者头像 李华
网站建设 2026/8/20 0:24:37

滑动窗口-----找到所有字母异位词

&#x1f525;个人主页&#xff1a;Milestone-里程碑 ❄️个人专栏: <<力扣hot100>> <<C>><<Linux>> <<Git>><<MySQL>> &#x1f31f;心向往之行必能至 题目解读 给定两个字符串 s 和 p&#xff0c;我们需要在…

作者头像 李华
网站建设 2026/8/24 9:27:55

失物招领平台信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着城市化进程的加快和人口流动性的增强&#xff0c;物品遗失现象日益频繁&#xff0c;传统失物招领方式效率低下且信息传播范围有限。为解决这一问题&#xff0c;开发一套高效、便捷的失物招领平台信息管理系统具有重要意义。该系统通过整合线上线下资源&#xff0c;为…

作者头像 李华
网站建设 2026/8/20 20:11:23

前后端分离华府便利店信息管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

摘要 随着信息技术的快速发展&#xff0c;传统便利店管理模式逐渐暴露出效率低下、数据冗余等问题。华府便利店作为一家中小型连锁企业&#xff0c;亟需一套高效、便捷的信息管理系统来优化商品管理、库存监控和销售分析等业务流程。信息化管理不仅能提升运营效率&#xff0c;…

作者头像 李华
网站建设 2026/8/25 13:18:05

如何选择西安优质小程序开发服务与本凡码农合作?

在选择西安优质小程序开发服务时&#xff0c;首先要清晰了解自己的需求。这个过程包括明确小程序的功能、设计风格及目标受众。其次&#xff0c;调查潜在开发公司的背景和案例&#xff0c;将其与市场中其他公司进行比较&#xff0c;确保其具备良好的口碑和丰富的项目经验。此外…

作者头像 李华