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

【2018-06-18】TCP的三次握手与四次挥手

[历史归档]本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。
发布时间:2018-06-18| 标题:TCP的三次握手与四次挥手分类:编程 |标签:TCPUDP


TCP握手简单笔记

    • 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包**(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN
(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包
ACK(ack=y+1)**,此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
确认号:其数值等于发送方的发送序号+1(即接收方期望接收的下一个序列号)。

TCP四次挥手

与建立连接的“三次握手”类似,断开一个TCP连接则需要“四次挥手”。
第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接受数据。
第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。
TCP的四次挥手过程(简言之):主动关闭方向被动关闭方发送不会再给你发数据了的信息;被动关闭方对收到的主动关闭方的报文段进行确认;被动关闭方向主动关闭方发送我也不会再给你发数据了的信息;主动关闭方再次对被动关闭方的确认进行确认。

TCP三次握手和四次挥手的全过程如下图:

TCP头部

SYN:SYN= 1 表示这是一个连接请求或连接接受报文。在建立连接时用来进行同步序号(个人理解是,在建立连接的时候,提醒对方记录本方的起始序号)。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若是同意建立连接,则应响应的报文段中使SYN=1、ACK=1。因此SYN=1表示该报文是一个连接请求报文或者是一个连接请求接收报文。
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*MSL(Max 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 可用状态了。

http://www.jsqmd.com/news/1213937/

相关文章:

  • 3步快速搭建Minecraft游戏环境:PCL2启动器新手完整指南
  • 混沌工程:故障注入测试——故障场景设计、自动恢复验证与韧性评估
  • vmtop多架构支持:x86与ARM平台的监控差异详解
  • 衡水文武学校有哪些?2026 河北优质文武学校推荐,石家庄圣龙文武学校官方招生公告 - 全国文武学校招生
  • 每天一个知识点——Linux 的文件管理命令
  • 具身智能的技能进化机制:从机械执行到物理世界自适应
  • 如何高效永久保存微信聊天记录:WeChatMsg让你的数字记忆永不丢失
  • 2026合肥7月名表回收榜单出炉,闲置腕表变现避坑指南请查收 - 分享测评官
  • Unity WebGL文件上传:从浏览器沙箱到JS桥接的完整实现方案
  • Navicat Premium重置指南:三款脚本助你无限试用数据库管理神器
  • 人形机器人终局:技术坐标校准与商业落地交点
  • 如何快速构建多平台数据采集系统:面向开发者的完整指南
  • 为什么你的即梦AI生成图总缺质感?揭秘渲染引擎底层逻辑与3步质感强化法
  • 2026湘潭筑宅安房屋修缮|全域防水补漏一站式服务,根治雨季渗漏难题 - 筑宅安
  • 具身智能训练实战指南:从仿真建模到实机部署的因果闭环构建
  • 华为MetaERP Oracle EBS 与 Fusion OM 模块对比内容
  • Wayca-scheduler未来路线图:下一代用户空间调度器的技术演进方向
  • 运维——互联网IP访问政务系统
  • 具身智能分层运行时系统:VLA与小脑模型的协同架构
  • 合肥蜀山区奢侈品名表回收报价明细,劳力士万国欧米茄真实案例 - 逸程奢侈品回收中心
  • PDFsam:免费开源的PDF处理神器,让文档编辑变得如此简单
  • TVA与具身智能互为支撑的底层逻辑(15)
  • Unity自定义Button组件:实现长按、双击与拖拽等高级交互事件
  • 2026成都奢包回收指南|持证龙头机构盘点,无隐形扣费靠谱变现 - 商业每日快报
  • 亲身到店探访北京芝柏官方售后服务中心|完整维修地址与售后热线(2026年7月最新) - 亨得利官方服务中心
  • BEVformer在WSL2上的CUDA环境配置与复现排障指南
  • 基于Java协同过滤的小程序畜牧养殖交易平台任务书
  • Spek音频频谱分析器终极指南:免费开源的专业音频分析工具
  • 抖音批量下载完全指南:免费工具实现内容自动化采集
  • 搜索技术债正在吞噬你的CTO预算(2024全球IT支出审计报告独家拆解)