TCP 粘包拆包

TCP粘包

  • 定义:指发送方在发送数据时,将多个逻辑上独立的数据包粘合在一起发送,导致接收方在接收时无法正确地区分这些数据包。
  • 原因
    • 发送端缓存机制:要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,比如发送端要发送“hello”和“world”两个消息,若缓冲区空间足够容纳这两个消息及其他数据,TCP可能会将它们合并成一个数据包发送。
    • Nagle算法:该算法会将小数据包合并成一个大的数据包发送,以减少网络传输的开销。
    • 接收端处理不及时:接收数据端的应用层没有及时读取接收缓冲区中的数据,新的数据到达后就会和缓冲区中未读取的数据合并在一起。
  • 表现形式
    • 多个数据包粘合:多个数据包粘合在一起,形成一个大的数据包,接收方难以区分每个数据包的边界。
    • 无法正确解析:多个数据包合并成一个数据包,在接收端无法正确地解析出每个数据包。

TCP拆包

  • 定义:指发送方在发送数据时,将一个逻辑上独立的数据包拆分成多个小的数据包发送,导致接收方在接收时无法正确地组装这些数据包。
  • 原因
    • 数据大小限制:要发送的数据大于TCP发送缓冲区剩余空间大小,或者待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。
    • 网络传输限制:网络中主机之间的MTU(最大传输单元)不是一个常数,当数据包过大不适合网络传输时,会被拆分以适应网络传输的限制。
  • 表现形式
    • 拆分无法组装:一个数据包被拆分成多个小的数据包,接收方无法正确地组装这些数据包。
    • 拆分可解析:一个数据包被拆分成多个小的数据包,但是在接收端可以正确地解析出每个数据包。

解决方法

  • 固定长度消息法:发送方将每个数据包的长度固定为一个固定的值,接收方按照这个固定的长度进行接收和解析。如在预知最大报文不超特定长度的情况下,规定报文大小固定,业务数据不足则以特定的空间占位。
  • 分隔符法:发送方在每个数据包的末尾添加一个特定的分隔符,接收方根据分隔符进行接收和解析。例如在文本数据传输中,可使用换行符“\n”作为分隔符。
  • 消息头部包含长度信息法:发送方在每个数据包的头部添加一个固定长度的字段,表示该数据包的长度,接收方先接收这个长度字段,再根据长度字段接收相应长度的数据。
  • 序列化和反序列化法:发送方在发送数据之前,将数据对象序列化为字节流,接收方在接收数据之后,将字节流反序列化为数据对象,确保数据的完整性和正确性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值