TCP协议—粘包和分包的演示以及解决方案

本文介绍了TCP协议中可能出现的粘包和分包现象,通过实例展示了粘包(数据过小或传输过快导致多个信息一起传输)和分包(数据过大而拆分传输)的情况。提出了解决方案,即在数据前添加长度字段,通过读取长度字段来正确地分割和处理每条消息。在客户端和服务器端的代码中分别进行了相应的修改以实现这一解决方案。
摘要由CSDN通过智能技术生成

初始代码来源 :https://blog.csdn.net/weixin_44003309     我的另外一篇:Socket_TCP协议的同步与异步调用

粘包:传输数据时 数据过小或数据传输过快时,将多个信息粘在一起传输

分包:传输的数据过大时,可能会拆分成多个进行传输

粘包演示:

在客户端代码中将发送消息的代码改为用for循环发送100条消息给服务器:

            //发送消息
            //while (true)
            //{
            //    string str = Console.ReadLine();
            //    if (str == "c")
            //    {
            //        tcpSocket.Close();
            //        return;
            //    }
            //    byte[] data = Encoding.UTF8.GetBytes(str);
            //    tcpSocket.Send(data);
            //}

            for (int i = 0; i < 100; i++)
            {
                tcpSocket.Send(Encoding.UTF8.GetBytes(i.ToString()));
            }

分包:一次性传输较大的数据

如下图,会分成好几份分别发送:

解决方案:在每次传输的数据前加上数据长度,假设添加的数据长度为40时,后面的长度若不为40,则不处理,等待下一次传输,在判断是否满足40个,满足后再处理消息。即可一条一条的处理消息

将数据长度固定的存储,使用int32,固定为4个字节

每次接收到数据时,先取得前四个字节,再转化为一个长度,按这个长度往后读取

 

在客户端发送数据的时候加上数据长度 :

在客户端中添加一个新的Message类:

using System;
using System.Collections.Generic;
usi
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP协议是一种面向连接的可靠传输协议,它将数据分成一个一个的数据包进行传输。但是,由于网络传输的不确定性,TCP粘包分包问题就会出现。 1. TCP粘包问题 TCP粘包问题是指发送方将多个数据包合并成一个数据包发送,接收方无法区分多个数据包的边界,从而无法正确处理数据包。造成TCP粘包问题的原因有多种,比如发送方发送的数据包过大、发送速度过快、网络延迟等。 解决方法: (1) 设置消息边界标识符 在发送的消息中添加一个特殊的标识符,如换行符、空格等,用来标识消息的边界。接收方根据标识符来判断消息的边界,将消息分隔成多个数据包。 (2) 定长消息 可以设置一个固定长度的消息,每次发送的数据都是定长的。这样接收方就可以根据固定长度来将消息分隔成多个数据包。 2. TCP分包问题 TCP分包问题是指发送方将一个数据包分成多个数据包发送,接收方接收后需要将多个数据包组合成一个完整的数据包,才能进行处理。造成TCP分包问题的原因有多种,比如发送方发送的数据包过大、网络拥塞等。 解决方法: (1) 设置消息长度 在消息中添加消息长度信息,接收方接收到数据后,根据长度信息将多个数据包组合成一个完整的数据包。 (2) 固定长度消息 发送方每次发送的数据都是固定长度的,接收方根据固定长度来将多个数据包组合成一个完整的数据包。 总之,TCP粘包分包问题可以通过合理的协议设计和网络优化来解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值