当前位置: 首页 > 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.xdnf.cn/news/1150633.html

相关文章:

  • GaussDB 数据库架构师修炼(六) 集群工具管理-1
  • 异步解决一切问题 |消息队列 |减少嵌套 |hadoop |rabbitmq |postsql
  • 深入解析 Amazon Q:AWS 推出的企业级生成式 AI 助手
  • 【设计模式C#】外观模式(用于解决客户端对系统的许多类进行频繁沟通)
  • LangGraph教程10:LangGraph ReAct应用
  • 访问 gitlab 跳转 0.0.0.0
  • 深入理解设计模式:策略模式的艺术与实践
  • XSS原型与原型链
  • 告别项目混乱:基于 pnpm + Turborepo 的现代化 Monorepo 工程化最佳实践
  • C++控制台贪吃蛇开发:从0到1绘制游戏世界
  • Git 完全手册:从入门到团队协作实战(2)
  • GaussDB union 的用法
  • Maven 依赖管理
  • Java从入门到精通:全面学习路线指南
  • uniapp props、$ref、$emit、$parent、$child、$on
  • MySQL练习3
  • 【橘子分布式】gRPC(编程篇-中)
  • 《Origin画百图》之多分类矩阵散点图
  • 从零开始学Tailwind CSS : 颜色配置原理与实践
  • (后者可以节约内存/GPU显存)Pytorch中求逆torch.inverse和解线性方程组torch.linalg.solve有什么关系
  • 93.数字信号处理相关的一些问题
  • 发明专利怎么写,与学术文章异同点与注意事项
  • 月舟科技近调记录
  • Python+ArcGIS+AI蒸散发与GPP估算|Penman-Monteith模型|FLUXNET数据处理|多源产品融合|专业科研绘图与可视化等
  • 实验-华为综合
  • Visual Studio Code(VSCode)中设置中文界面
  • 【Python库包】Gurobi-Optimize (求解 MIP) 安装
  • GATE:基于移动嵌入式设备的实时边缘构建图注意力神经网络用于鲁棒室内定位
  • ElasticSearch:商品SKU+SPU实现join查询,设计及优化
  • 【数据结构】二叉树初阶详解(一):树与二叉树基础 + 堆结构全解析