首页 > 编程知识 正文

androidtcpbuffer,udp协议和tcp协议

时间:2023-05-06 13:49:05 阅读:16057 作者:3606

1 ) TCP分组和解包问题的主要原因是,当操作系统发送TCP数据时,TCP有多个基本的缓冲器,如1024字节大小,用于一次发送的数据量小并且没有达到缓冲器大小,则TCP可以具有多个如果一次请求发送的数据量超过缓冲区大小,则TCP将其分成多次发送。 这就是解包。 也就是说,将一个大数据包分割成多个数据包进行发送。 TCP是传输层协议,传输层除了TCP协议外还有UDP协议。 那么,UDP会发生粘合和开箱吗? 答案是否定的。 UDP是基于消息发送的,从UDP的帧结构中可以看出,UDP报头采用16比特来指示UDP数据消息的长度,从而可以在APP应用层成功区分不同的数据消息,分组的粘贴和拆包虽然TCP基于字节流,并且APP应用层和TCP传输层之间的数据交换是大小不同的数据块,但是TCP仅将这些数据块视为没有一系列结构的字节流,并且没有边界; 如从TCP帧结构可知的,TCP的头部没有表示数据长度的字段,并且从上述两点,在使用TCP传输数据的情况下,分组有可能首次粘附,或者分组被剥离。 下图显示了TCP包和开箱的图像。

上图显示了TCP包和开箱三种情况。

A和b的分组均正好满足TCP缓冲器的大小,或等待时间已经达到TCP等待时间,因而使用两个独立分组来进行发送;

由于a和b两次请求间隔短且分组小,所以将一个分组集中发送到服务端;

B分组比较大,所以分割成两个分组B_1和B_2来发送,但在此,由于分割后的B_2比较小,所以与a分组一起发送。

2 )粘包和开包问题的常见解决方案有四种。

当客户端发送分组时,每个分组具有固定的长度,例如1024字节的大小,并且如果客户端发送的数据的长度小于1024字节,则通过补充空间来补充到指定的长度

客户端在每个数据包末尾使用固定的分隔符,例如rn。 如果一个数据包被分割,则等待下一个数据包被发送,然后找到其中的rn,将分割的开头部分和前面的数据包的其馀部分合并,得到完整的数据包。

将消息分为消息头和消息体,在消息头中保存当前消息的总长度,在阅读足够长的消息后才阅读完整的消息;

定制协议打包开箱处理。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。