`
在下个路口
  • 浏览: 111422 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Tcp消息沾包与心跳包发送问题

阅读更多
  TCP和UDP想必是通讯中用的最多的协议了,具体的协议规则就不介绍了,在此只是记录一下在项目中遇到的一些问题,文字没有怎么组织,基本上是想到哪写到哪,莫怪.......
  tcp问题一:心跳包
  因为tcp的长连接问题,需要保活连接,常规的做法就是发送心跳包,通过往服务器一端发送一小段数据包,接收端可以不处理。考虑到这种需求,mSocket.sendUrgentData(0xff);这个方法可能会很合适,因为接受端接受到这种消息会自动忽略,不需要自己着手处理。在测试中,发现通过该方法由手机端发送心跳到pc上,pc为xp系统tcp连接正常,不会断线,而在win7系统时,tcp连接会在80s准时断开,虽然有重连机制,但是频繁的重连还是会影响性能。经过一段时间的排查,发现原因是在win7上,发送sendUrgentData该数据最多只能发送16次,而我的心跳包是5s发送一次,正好是80s。在win7上发送sendUrgentData数据16次会造成网络拥塞,造成连接中断。
  tcp问题二:消息沾包
  在移动端接收pc发送的tcp消息时发现会有两个甚至多个数据沾包的情况,造成两个消息粘连在一起,接收端解析消息时发生错误,并且这种情况只是在网路状况较差时发生。在TCP中因为三次握手原理,发生数据会接收ack的反馈,如果频繁的发生的小数据消息,会造成网络的拥塞,影响性能,因此为了防止网络中频繁的有小数据发生,tcp底层会启用nagle算法,每个tcp套接字都有一个缓冲区,每次发送其实都是从这个缓冲区中取数据发送,只有当数据包的大小达到套接字的缓冲区大小才会发送,在项目中由于我发送的是很小的字符串消息,它会等待下一个消息到达一定大小一起发送,这个tcp套接字缓冲区大小由系统内核缓冲区大小决定,这也就造成了消息沾连在一起的情况。解决的办法有以下几种:一,连续发送多个消息时,每个消息间隔40ms发送,tcp发送消息会有两个前提,一个是数据大小达到缓冲区大小马上发送,再者就是数据没有达到缓冲区大小,但是40ms还没有数据进入缓冲区,此时也会发送(有些说法是200ms,但经过测试在linux系统只有40ms,Android内核属于linux,因此只需在发送消息时间隔40ms);二,设置tcp无延迟,也就是不启用nagle算法,如果不设置是会默认开启,不启用的方法也很简单,调用mSocket.setTcpNoDelay(true);即可。但其实这种解决办法在需要高效率的网络通讯其实是不适用的,因为你可能无法忍受每次发送消息都得有40ms的延迟,而不启用nagle算法,频繁的发送小数据,又会造成网络拥塞,同样是会严重影响通讯性能的,所以在网络编程时最好避免这种多次发送,在接收的模式,应该保持“一发一收”的模式。
 
 
分享到:
评论

相关推荐

    TCP通信心跳包源码C语言实现

    3. **心跳包发送与接收**:心跳包通常是空的TCP数据包,可以通过`send()`或`write()`函数发送,通过`recv()`或`read()`函数接收。在心跳包实现中,通常需要设置一个定时器,定期发送心跳包并检查响应。 4. **错误...

    Java心跳包功能TCP实现

    在Java编程中,心跳包(Heartbeat Packet)是一种在网络通信中维持连接活性的重要机制,尤其在TCP协议下,心跳包可以解决长连接因网络延迟或静默而导致的连接超时问题。TCP是一种面向连接的、可靠的传输层协议,它...

    基于MFC的TCP心跳检测包

    5. 处理异常:如果在指定时间内没有收到心跳响应,可以认为连接有问题,此时可以选择重新发送心跳包、断开连接或者执行其他恢复策略。 在开发过程中,你需要注意处理好线程同步问题,因为心跳检测可能在不同的线程...

    node.js的TCP通信,有心跳保活

    心跳包的发送,通常有两种技术 方法1:应用层自己实现的心跳包 由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个 Timer事件中定时 向客户端发送一个短小精悍的数据包,然后启动一个低级别的线程,...

    C# 实现 TCP服务端+客户端 带心跳机制.zip

    在服务端,可以设置一个定时器,每隔一定时间向客户端发送心跳包,同时监听客户端的心跳响应。如果一段时间内未收到响应,则认为连接已断开。 客户端则需要连接到服务端,并同样实现心跳机制。C#中的TcpClient类...

    Socket长连接+心跳包+发送读取

    心跳包就是定期发送的小数据包,用来检测连接是否仍然活跃,同时也可以用来刷新网络连接的超时设置,防止连接因长时间无数据传输而被自动关闭。心跳包通常包含简单的信息,如时间戳或特定的标识符,接收方接收到后会...

    socketTCP通信心跳包实例

    - 发送心跳包:在一个循环中,定期调用`Send()`方法发送心跳包数据,数据可以是简单的字符串或自定义的协议格式。 - 接收响应:同时,通过`Receive()`方法监听服务器的响应,如果在一定时间内未收到响应,可以认为...

    TCP心跳包-定时连接检测

    3. **发送心跳包**:在设定的时间间隔到达时,客户端发送一个空的数据包或特殊标记的数据包到服务器。这通常可以通过write函数实现。 4. **接收响应**:服务器收到心跳包后,一般会回传一个确认响应,表明它仍然...

    TCP之心跳包理解

    让初学者更容易理解心跳包是怎么回事,客户端和服务端是如何处理心跳包的

    tcp同步连接发消息心跳检测

    4. 若接收端未回应,发送端会在一定时间内(通常是间隔时间的倍数)重复发送心跳包,直到达到预设的重试次数。 5. 如果在重试次数内仍未收到回应,发送端认为连接已断开,会触发相应的错误处理,如关闭连接。 在...

    心跳包 (优化算法的心跳包)

    例如,在负载均衡器中,它会定期向后端服务器发送心跳包,以确认服务器是否正常工作。 3. **数据同步**:在算法优化过程中,心跳包可以携带少量的状态信息,用于同步各个节点的算法进度或者共享参数,确保所有节点...

    精品软件工具--tcp心跳检测工具库,由客户端库和服务端软件两部分组成。服务端通过心跳端口6969发送心跳请求包,客户.zip

    TCP心跳是TCP连接维护的一种方式,通过周期性发送心跳包(Keep-Alive Packet)来确认网络连接的健康状态。在默认情况下,TCP连接并不会自动发送心跳包,但开发者可以通过设置特定参数启用这一功能。心跳检测工具库的...

    C# Socket心跳包跟图片传输,TCP/IP协议响应Demo供学习之用

    在C#的Socket编程中,可以设定一个定时器,周期性地发送心跳包,并监听返回的响应,确保连接的稳定。 3. **TCP/IP协议**: TCP(传输控制协议)和IP(网际协议)是互联网上广泛使用的两种协议。TCP提供面向连接的...

    tcp.rar_TCP 心跳_TCP心跳_tcp 心跳_心跳_心跳 TCP

    - 如果连续几次未收到心跳响应,或者发送心跳消息失败,可以认为连接已断开,这时应关闭当前连接并尝试重新连接。 - 为了防止死锁,应正确处理异常,并确保在异常发生时关闭网络资源。 5. **性能优化:** - 考虑...

    TCP 发包工具(windows)

    7. **多线程支持**:对于需要同时与多个目标进行通信的场景,工具可能支持多线程,能够并发地发送和接收TCP数据包。 8. **协议扩展**:某些工具可能包含额外的功能,如支持TCP选项的设置,或者能够模拟延迟、丢包等...

    心跳包实现

    3. **心跳发送**:客户端或服务器按照预设的时间间隔(如每隔几秒)发送心跳包,可以通过一个定时器(Timer)来实现。 4. **心跳接收**:另一方接收到心跳包后,确认连接有效性,并可能回应一个心跳包,以确保双方...

    C#与Android进行Tcp通讯(心跳包;长连接,自动重连,发送失败时自动重发)

    c#写tcpListener;Android写tcpClient 具有心跳包,长连接,自动重连,发送失败自动重发等功能 电脑与Android需要同属一个局域网 tcpListener设计成只能与一...tcpClient具有重连,长连接,与tcpListener进行心跳包通讯

    Android下Tcp通信心跳实例

    5. **心跳发送**:在客户端,可以设置一个定时任务或者使用Handler/Looper周期性地向服务器发送心跳包。在服务器端,接收到心跳包后应立即回应,表示已收到。 6. **心跳检测**:如果在规定时间内未收到服务器的回应...

    基于TCP协议的心跳包

    将资料client.c文件的IP地址,修改成虚拟机当前环境下的IP地址即可实现,开发板与虚拟机之间的信息交互

    mina心跳包机制

    客户端在Mina中实现心跳包机制,通常会创建一个定时任务,周期性地发送心跳请求到服务器。这些请求可以是自定义的协议命令,例如特定的字节序列或者特定的报文结构。心跳包通常包含一个标识符,以便服务器能够识别并...

Global site tag (gtag.js) - Google Analytics