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

TCP/UDP协议深度解析(四):TCP的粘包问题以及异常情况处理

 在这里插入图片描述


🔍 开发者资源导航 🔍
🏷️ 博客主页: 个人主页
📚 专栏订阅: JavaEE全栈专栏

 本系列往期内容~

TCP/UDP协议深度解析(一):UDP特性与TCP确认应答以及重传机制

TCP/UDP协议深度解析(二):TCP连接管理全解,三次握手四次挥手的完整流程

TCP/UDP协议深度解析(三):TCP流量控制的魔法—滑动窗口、拥塞控制与ACK的智慧

一、 粘包问题

因为TCP协议是面向字节流的,因此接收方收到的数据是一段连续的数据,接收方无法判断那一段数据是一个整体,这一段连续的数据就像是“粘”在了一起,无法区分,而这就称之为“粘包问题”。

 1.1 解决方法

该问题在传输层层面无解,想要解决这个问题需要站在应用层角度来解决。

1.约定包与包之间的分隔符

约定某一个字符作为该段数据的结束标志,例如使用换行符'\n'。

2.约定包的长度或格式

例如:约定包的前n个字节表示数据的长度 。

解决粘包问题是在自定义应用层格式的时候要考虑的问题,但是已经存在成熟的解决方案,例如:json、protobuf等,因此不必过多操心该问题。

 二、TCP连接时的异常情况处理

2.1 进程崩溃

四次挥手的进行并不依赖进程,因此如果某个进程崩溃,它和正常退出没有本质区别,并不会出现异常情况。

2.2 主机关机

正常的关机都会先杀死用户的进程,但是关机也需要一定的时间,如果这段时间内挥手结束,那么就和正常一样,如果这段时间没有挥完也是可以将连接释放掉的。

2.3 接收方掉电

如果接收方掉电,发送方发送的信息将不会再收到ack,此时无论多少次的超时重传都无法解决问题,当达到一定次数后,发送方会主动发送一个“复位报文”,重置TCP连接,如果还是收不到ack,那么发送方就会主动释放掉连接。

 2.4 发送方掉电

如果发送方突然掉电了,接收方因为是被动的一方,无法确认对方现在是休息了还是挂掉了,因此他只能等待下去,但是并不会无限等待,超过一定的时间后会主动的发送“心跳包”,来确认对方的状况。

心跳包并不包含载荷,他只是为了触发对方的ack,如果没有心跳就认为对方挂掉了,进行RST复位,再不行就会释放掉该连接。

 

http://www.lryc.cn/news/593145.html

相关文章:

  • 100条常用SQL语句
  • 【人工智能】AI Agent 实战:使用 Dify 搭建个人在线旅游助手
  • 多模态交互视角下生成式人工智能在中小学探究式学习中的认知支架效能研究
  • python基础笔记
  • Spring Boot 与微服务详细总结
  • 【黑马SpringCloud微服务开发与实战】(三)微服务01
  • 软考 系统架构设计师系列知识点之杂项集萃(112)
  • Go-Redis × 向量检索实战用 HNSW 在 Redis 中索引与查询文本 Embedding(Hash JSON 双版本)
  • 微服务的编程测评系统-网关-身份认证-redis-jwt
  • 【C# in .NET】20. 探秘静态类:抽象与密封的结合体
  • 【安卓笔记】RxJava的Hook机制,整体拦截器
  • Kotlin内联函数
  • kotlin部分常用特性总结
  • Window延迟更新10000天配置方案
  • 【设计模式C#】状态模式(用于解决解耦多种状态之间的交互)
  • 使用目标检测yolo11去训练微藻细胞检测数据集YOLO格式703张6类别步骤和流程
  • 云端成本治理利器:亚马逊云科技智能仪表盘(AWS Cost Intelligence Dashboard)深度解析
  • Java 大视界 -- Java 大数据机器学习模型在自然语言处理中的对话系统多轮交互优化与用户体验提升(351)
  • 前端面试专栏-工程化:27.工程化实践(CI/CD、代码规范)
  • NLP中情感分析如何结合知识图谱在跨文化领域提升观念分析和价值判断的准确性?
  • 基于Socket来构建无界数据流并通过Flink框架进行处理
  • xss-dom漏洞
  • 力扣 hot100 Day49
  • 【Python练习】050. 编写一个函数,实现简单的日历功能,显示当前日期和星期
  • Uniapp之键盘弹窗
  • 了解pycharm的基本运用
  • Android无需授权直接访问Android/data目录漏洞
  • 开启你的专属智能时代:枫清科技个人智能体限时体验计划上线!
  • 网络基础DAY13-NAT技术
  • 嵌入式学习-PyTorch(9)-day25