【2018-06-18】TCP的三次握手与四次挥手
[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2018-06-18 标题TCP的三次握手与四次挥手分类编程 标签TCPUDPTCP握手简单笔记TCP三次握手TCP四次挥手TCP头部11种状态参考链接《 https://blog.csdn.net/qzcsu/article/details/72861891 》《 https://blog.csdn.net/yanxiaolx/article/details/52123628 》《 https://www.cnblogs.com/qingergege/p/6603488.html 》TCP三次握手第一次握手客户端发送syn包**(synx)到服务器并进入SYN_SEND状态等待服务器确认第二次握手服务器收到syn包必须确认客户的SYNackx1同时自己也发送一个SYN包syny即SYNACK包此时服务器进入SYN_RECV状态第三次握手客户端收到服务器的SYNACK包向服务器发送确认包ACK(acky1)**此包发送完毕客户端和服务器进入ESTABLISHED状态完成三次握手。握手过程中传送的包里不包含数据三次握手完毕后客户端与服务器才正式开始传送数据。理想状态下TCP连接一旦建立在通信双方中的任何一方主动关闭连接之前TCP 连接都将被一直保持下去。确认号其数值等于发送方的发送序号1(即接收方期望接收的下一个序列号)。TCP四次挥手与建立连接的“三次握手”类似断开一个TCP连接则需要“四次挥手”。第一次挥手主动关闭方发送一个FIN用来关闭主动方到被动关闭方的数据传送也就是主动关闭方告诉被动关闭方我已经不会再给你发数据了(当然在fin包之前发送出去的数据如果没有收到对应的ack确认报文主动关闭方依然会重发这些数据)但是此时主动关闭方还可以接受数据。第二次挥手被动关闭方收到FIN包后发送一个ACK给对方确认序号为收到序号1与SYN相同一个FIN占用一个序号。第三次挥手被动关闭方发送一个FIN用来关闭被动关闭方到主动关闭方的数据传送也就是告诉主动关闭方我的数据也发送完了不会再给你发数据了。第四次挥手主动关闭方收到FIN后发送一个ACK给被动关闭方确认序号为收到序号1至此完成四次挥手。TCP的四次挥手过程简言之主动关闭方向被动关闭方发送不会再给你发数据了的信息被动关闭方对收到的主动关闭方的报文段进行确认被动关闭方向主动关闭方发送我也不会再给你发数据了的信息主动关闭方再次对被动关闭方的确认进行确认。TCP三次握手和四次挥手的全过程如下图TCP头部SYNSYN 1 表示这是一个连接请求或连接接受报文。在建立连接时用来进行同步序号个人理解是在建立连接的时候提醒对方记录本方的起始序号。当SYN1而ACK0时表明这是一个连接请求报文段。对方若是同意建立连接则应响应的报文段中使SYN1、ACK1。因此SYN1表示该报文是一个连接请求报文或者是一个连接请求接收报文。ACK确认号只有在该位设置为1的时候才生效当该位为0是表示确认号无效。TCP规定在TCP连接建立后所有传送的数据报文段ACK都必须设置为1。FIN当 FIN 1 时表明此报文段的发送方的数据已经发送完毕并要求释放连接。序号占4个字节它的范围在0-2^32-1序号随着通信的进行不断的递增当达到最大值的时候重新回到0在开始递增。TCP是面向字节流的在一个TCP连接中传送的字节流中的每一个字节都按照顺序编号。整个要传送的字节流的起始号必须在连接建立时设置。首部中的序列号字段指的是本报文段所发送的数据的第一个字节的序号。****例如一个报文序号是301而携带的数据共有100字节。则表示本次报文中的序号是301下一个报文的序号是401.重复一下每一个报文的序号是该报文包含的字节中第一个字节的编号。确认号占4个字节确认号是对下一个想要接受的字节的期望这里隐式确认了对上一个数据包的成功接收。如上例在成功接收了序号为301的数据包想要接收下一个数据包因为上个数据包包含100字节所以此时的确认号应该是401表示希望接收下一个序号是401的数据包。11种状态简单解释CLOSED初始状态表示TCP连接是“关闭着的”或“未打开的”。LISTEN 表示服务器端的某个SOCKET处于监听状态可以接受客户端的连接。SYN_RCVD 表示服务器接收到了来自客户端请求连接的SYN报文。在正常情况下这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态很短暂基本上用netstat很难看到这种状态除非故意写一个监测程序将三次TCP握手过程中最后一个ACK报文不予发送。当TCP连接处于此状态时再收到客户端的ACK报文它就会进入到ESTABLISHED 状态。SYN_SENT 这个状态与SYN_RCVD 状态相呼应当客户端SOCKET执行connect()进行连接时它首先发送SYN报文然后随即进入到SYN_SENT 状态并等待服务端的发送三次握手中的第2个报文。SYN_SENT 状态表示客户端已发送SYN报文。ESTABLISHED 表示TCP连接已经成功建立。FIN_WAIT_1 这个状态得好好解释一下其实FIN_WAIT_1 和FIN_WAIT_2 两种状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时它想主动关闭连接向对方发送了FIN报文此时该SOCKET进入到FIN_WAIT_1 状态。而当对方回应ACK报文后则进入到FIN_WAIT_2 状态。当然在实际的正常情况下无论对方处于任何种情况下都应该马上回应ACK报文所以FIN_WAIT_1 状态一般是比较难见到的而FIN_WAIT_2 状态有时仍可以用netstat看到。FIN_WAIT_2 上面已经解释了这种状态的由来实际上FIN_WAIT_2状态下的SOCKET表示半连接即有一方调用close()主动要求关闭连接。注意FIN_WAIT_2 是没有超时的不像TIME_WAIT 状态这种状态下如果对方不关闭不配合完成4次挥手过程那这个 FIN_WAIT_2 状态将一直保持到系统重启越来越多的FIN_WAIT_2 状态会导致内核crash。TIME_WAIT 表示收到了对方的FIN报文并发送出了ACK报文。 TIME_WAIT状态下的TCP连接会等待2*MSLMax Segment Lifetime最大分段生存期指一个TCP报文在Internet上的最长生存时间。每个具体的TCP协议实现都必须选择一个确定的MSL值RFC 1122建议是2分钟但BSD传统实现采用了30秒Linux可以cat /proc/sys/net/ipv4/tcp_fin_timeout看到本机的这个值然后即可回到CLOSED 可用状态了。如果FIN_WAIT_1状态下收到了对方同时带FIN标志和ACK标志的报文时可以直接进入到TIME_WAIT状态而无须经过FIN_WAIT_2状态。这种情况应该就是四次挥手变成三次挥手的那种情况CLOSING 这种状态在实际情况中应该很少见属于一种比较罕见的例外状态。正常情况下当一方发送FIN报文后按理来说是应该先收到或同时收到对方的ACK报文再收到对方的FIN报文。但是CLOSING 状态表示一方发送FIN报文后并没有收到对方的ACK报文反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢那就是当双方几乎在同时close()一个SOCKET的话就出现了双方同时发送FIN报文的情况这是就会出现CLOSING 状态表示双方都正在关闭SOCKET连接。CLOSE_WAIT 表示正在等待关闭。怎么理解呢当对方close()一个SOCKET后发送FIN报文给自己你的系统毫无疑问地将会回应一个ACK报文给对方此时TCP连接则进入到CLOSE_WAIT状态。接下来呢你需要检查自己是否还有数据要发送给对方如果没有的话那你也就可以close()这个SOCKET并发送FIN报文给对方即关闭自己到对方这个方向的连接。有数据的话则看程序的策略继续发送或丢弃。简单地说当你处于CLOSE_WAIT 状态下需要完成的事情是等待你去关闭连接。LAST_ACK 当被动关闭的一方在发送FIN报文后等待对方的ACK报文的时候就处于LAST_ACK 状态。当收到对方的ACK报文后也就可以进入到CLOSED 可用状态了。

相关新闻

C++赋值运算符重载:从浅拷贝陷阱到深拷贝实现与最佳实践

C++赋值运算符重载:从浅拷贝陷阱到深拷贝实现与最佳实践

1. 项目概述:为什么赋值运算符重载是C入门的“分水岭”?刚接触C类的时候,你可能觉得构造函数、析构函数这些默认成员函数还挺好理解的,不就是创建和销毁对象嘛。但当你开始写一些稍微复杂点的类,比如管理动态内存的字符…

2026/7/18 15:37:33阅读更多 →
C++内存管理深度解析:从new/delete原理到智能指针实战

C++内存管理深度解析:从new/delete原理到智能指针实战

1. 项目概述:为什么C内存管理是程序员的必修课 在C的世界里,内存管理就像驾驶手动挡汽车,它给了你无与伦比的操控感,但也意味着你必须对自己的每一个操作负责。 new 和 delete 这对操作符,正是这把双刃剑的剑柄。新…

2026/7/18 15:35:32阅读更多 →
ChatGPT口语输出质量暴跌的3大隐形陷阱:语音转文本延迟、语境记忆衰减、情感建模偏差(附LSTM补偿方案)

ChatGPT口语输出质量暴跌的3大隐形陷阱:语音转文本延迟、语境记忆衰减、情感建模偏差(附LSTM补偿方案)

更多请点击: https://intelliparadigm.com 第一章:ChatGPT口语输出质量暴跌的3大隐形陷阱:语音转文本延迟、语境记忆衰减、情感建模偏差(附LSTM补偿方案) 当语音交互系统从“能说”迈向“说得像人”,三大底…

2026/7/18 15:35:32阅读更多 →
基于SpringBoot的大学生电动车租赁平台开题报告

基于SpringBoot的大学生电动车租赁平台开题报告

一、课题研究背景与意义 随着高校办学规模持续扩大,现代化大学校园占地面积广、教学区与生活区分布分散,学生日常上课、取快递、校园通勤、校内出行距离大幅增加,传统步行出行耗时久、效率低,难以满足学生高效便捷的短途出行需求。…

2026/7/18 16:37:45阅读更多 →
5分钟部署Qwen大模型:本地离线运行与OpenAI兼容方案

5分钟部署Qwen大模型:本地离线运行与OpenAI兼容方案

1. 项目概述 最近在折腾本地大模型部署时,发现了一个超级简单的Qwen通义千问部署方案。这个方案不仅能让普通用户5分钟内完成部署,还能完美兼容OpenAI接口,直接替换各种依赖ChatGPT的应用。作为国内首个全尺寸开源大模型,Qwen1.5在…

2026/7/18 16:37:45阅读更多 →
多层堆焊怎么做才均匀?新手常犯的层间错误汇总

多层堆焊怎么做才均匀?新手常犯的层间错误汇总

在耐磨、耐蚀高端工件加工中,多层堆焊是常用工艺,通过多层合金堆叠,实现加厚防护、长效耐磨耐蚀的效果。但很多加工厂做多层堆焊时,普遍出现层厚不均、层间夹杂、分层脱落、硬度不稳等问题,多层焊接不仅没有提升工件性…

2026/7/18 16:37:45阅读更多 →
2026小红书视频下载方法合集,手机电脑无水印保存教程

2026小红书视频下载方法合集,手机电脑无水印保存教程

在日常使用小红书的过程中,很多用户都会有素材保存需求,比如备份自己发布的视频、收藏已获得授权的优质教程素材、整理个人学习素材库等。2026年小红书平台持续更新权限规则,不少视频默认关闭官方下载入口,直接保存会受限&#xf…

2026/7/18 16:37:45阅读更多 →
谷歌:一张自拍一段语音就能生成“个人虚拟形象”,Vids借Gemini Omni支持视频编辑

谷歌:一张自拍一段语音就能生成“个人虚拟形象”,Vids借Gemini Omni支持视频编辑

谷歌推“个人虚拟形象”,Vids升级视频编辑功能谷歌推出了一项新功能,用户只需提供一张自拍和一段语音片段,就能生成所谓的“个人虚拟形象”。这一数字化的形象可以朗读用户输入的文字内容。而Vids早在去年就推出了AI生成的虚拟形象&#xff0…

2026/7/18 16:37:45阅读更多 →
cann/asc-devkit printf调试接口

cann/asc-devkit printf调试接口

printf 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/can…

2026/7/18 16:35:45阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/18 10:49:13阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/18 8:49:08阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/18 14:49:24阅读更多 →
从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

更多请点击: https://kaifayun.com 第一章:从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 在Claude驱动的产品需求文档(PRD)生成实践中,原始业务意图往往以自然语言片…

2026/7/18 0:00:14阅读更多 →
Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

更多请点击: https://codechina.net 第一章:Cursor配置生成失效?3大隐藏陷阱4行修复代码,资深工程师连夜整理的紧急补救清单 Cursor 配置生成突然失效,是近期高频报障场景。表面看是 cursor.config.json 未更新或 LSP…

2026/7/18 0:00:14阅读更多 →
某智驾大牛创业

某智驾大牛创业

作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…

2026/7/18 0:00:14阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/17 22:48:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/18 14:49:24阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/17 17:26:50阅读更多 →