个人网站icp备案网,网站上的高清动态图怎么做的,如何做视频网站首页,高密做网站的价格关于TCP单包数据大于1460字节会被拆包的问题
1、问题背景#xff1a; 最近在用STM32W5500做项目#xff0c;需要STM32通过TCP协议发送数据到上位机并显示。当数据量小的时候上位机显示正常#xff0c;一旦数据量大过大上位机就会出现数据丢失的情况#xff0c;甚至数据直接…关于TCP单包数据大于1460字节会被拆包的问题
1、问题背景 最近在用STM32W5500做项目需要STM32通过TCP协议发送数据到上位机并显示。当数据量小的时候上位机显示正常一旦数据量大过大上位机就会出现数据丢失的情况甚至数据直接不刷新。
2、问题分析过程 出现这个问题首先排查了一下代码,看看上报协议、帧头、帧尾、数据长度等有没有问题看了一圈没发现问题那就直接上wireshark抓包看吧。打开Wireshark看了下数据上报频率每秒都上报了符合预期。但是仔细看了一下数据长度每包都不超过1460字节而且自己明明控制的是每秒发一包数据但抓包结果看有时候每秒会有两三包。结合现象推测数据是被分包了把每秒的多包数据拼接起来后发现刚好可以组成一包完整的数据问题原因这就找到了。
3、问题原因 我上报数据的格式是帧头帧头标识数据长度设备个数…数据结束标志。从上面的现象推测上位机应该是根据我的包头去解析数据的当数据被拆包以后帧头的数据长度和上位实际接受的数据长度对不上所以数据被废弃了。 于是上网搜了一下TCP 1460了解到TCP协议是有这样的分包策略至于TCP为什么要分包可以参考下这篇文章,原文链接https://blog.csdn.net/weixin_52669146/article/details/131665316 当数据包太大无法在网络中一次传输完成时TCP/IP协议会将数据包分成小块进行传输这就是分片传输。这样做的原因是因为不同的网络设备或链路有最大传输大小的限制比如某些网络设备只能接收较小的数据包。 可以把数据包想象成一个大块的蛋糕而网络设备的MTU就是蛋糕切割的限制。如果蛋糕太大无法放进一个盘子里我们就需要将蛋糕切成小块适应盘子的大小。同样道理当数据包超过网络设备的MTU时我们需要将它分成小块每块都能适应设备的最大传输限制。
4、相关知识
MTU是网络的最大传输单元,通信术语:最大传输单元(Maximum Transmission UnitMTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)
UDP 包的大小就应该是 1500 - IP头(20) - UDP头(8) 1472(Bytes)
TCP 包的大小就应该是 1500 - IP头(20) - TCP头(20) 1460 (Bytes)
参考链接https://blog.csdn.net/caoshangpa/article/details/51530685