潍坊制作网站公司,安庆网站建设推广,wordpress登录查看,太原快速排名粘包问题出现的原因 由于TCP协议网络传输数据的基本单位是字节流#xff0c;所以当应用程序收到了传输的数据时#xff0c;看到的是一连串的字节数据#xff0c;而TCP协议网络传输数据有滑动窗口的机制#xff08;核心就是批量传输数据#xff0c;推荐看TCP中窗口和滑动窗…粘包问题出现的原因 由于TCP协议网络传输数据的基本单位是字节流所以当应用程序收到了传输的数据时看到的是一连串的字节数据而TCP协议网络传输数据有滑动窗口的机制核心就是批量传输数据推荐看TCP中窗口和滑动窗口的含义以及流量控制所以传输过来的数据可能是多个数据包因此就不知道从哪个部分到哪个部分是一个完整的应用层数据包
如何避免粘包问题 避免粘包问题的核心就是明确两个包之间的边界 1.对于定长的包保证每次都按固定大小读取即可 2.对于变长的包可以在包头的位置约定一个包总长度的字段从而就知道了包的结束位置
例子约定包的前两个字段表示包总长度程序员规定的这样约定后应用程序在获得数据时就会先读取包头的两个字段读取到包总长度后再根据包总长度准确读取当前数据包的所有数据 后面再重复上述操作即可 3.对于变长的包可以在包和包之间添加明确的分隔符应用层协议程序猿自己来定的只有保证分隔符不和正文冲突就行
粘包问题的一些注意点 1.首先要明确粘包问题中的“包”是应用层的数据包 2.在TCP的协议头中没有如同UDP一样的”报文长度“这样的字段有一个首部长度的字段表示的只是TCP报头的长度但有一个”序号“字段 3.站在传输层的角度TCP是一个一个报文过来的按照序号排好序放在缓冲区中 4.站在应用层的角度看到的只是一连串的字节数据
对于UDP来说是否存在粘包问题呢 UDP是不存在粘包问题的 1.对于UDP如果上层还没有交付数据UDP的报文长度依然存在同时UDP是一个一个把数据交付给应用层就有很明确的数据边界 2.站在应用层的角度使用UDP时要么收到完整的UDP报文要么不收不会出现”半个的情况“