TCP传输协议中如何解决丢包问题

TCP在不可靠的网络上实现可靠的传输,必然会有丢包。TCP是一个“流”协议,一个详细的包将会被TCP拆分为好几个包上传,也是将会把小的封裝成大的上传,这就是说TCP粘包和拆包难题。
但是许多人有不同的理解。TCP协议本身确保传输的数据不会丢失完整性。如果在传输过程中发现数据丢失或数据包丢失,最大的可能性是在发送或接收程序的过程中出现问题。

例如,服务器向客户端发送大量数据,并且发送频率非常高,因此发送链接中很可能会出现错误(1、程序处理逻辑错误;2、多线程同步问题;3、缓冲区溢出等)如果发送失败得不到处理,那么客户端收到得数据将少于理论数据,这将导致数据丢失与数据包丢失。这种现象,其实本质上来说不是丢包,也不是丢数据,只是因为程序处理有错误,导致有些数据没有成功地被socket发送出去。
关于send函数的问题:
首先必须明确send函数做了什么。 他是将数据传递给本地TCP层,还是将数据传递给应用层,确认接收方TCP层后再返回。在后者的情况下,你说的没错,其实不然。 那是由于nagle算法不能使用了,即该算法将send函数接收的小数据汇总成大数据包发送。
即使send函数能进行数据发送,对方也不一定被接受。 TCP协议只是在传输层履行义务,send函数只是应用层起到向TCP层传递数据的作用,除此之外与TCP层没有任何关系。
常见的解决方案包括拆包、添加包头和发送组合包。如果服务器或客户端断开连接,一般会使用心跳测试。
心跳测试:每隔一段时间向服务器发送数据包。为了节省资源,通常会发送空数据包。如果发送失败表明套接字已断开,此时需要根据特定条件释放资源并重新连接。

TCP传输可以保证数据交换的可靠性,这意味着一台主机将数据正确地传输到目标计算机,目标计算机的协议栈有一定的限制,如果不及时处理在目标计算机上接收到的数据,堆栈就会溢出。
这种溢出不是由TCP协议本身引起的,而是由系统的IP协议栈的缓冲区溢出引起的!
TCP传输协议中如何解决丢包问题的更多相关文章
- TCP\IP协议实践:wireshark抓包分析之链路层与网络层
目录 TCP\IP协议实践:wireshark抓包分析之链路层与网络层 从ping开始 链路层之以太网封装 ip首部 开启ping程序,开始抓包 由一个ping的结果引出来的两个协议ARP ICMP ...
- 《连载 | 物联网框架ServerSuperIO教程》- 9. 协议过滤器,解决一包多发、粘包、冗余数据
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- Android IOS WebRTC 音视频开发总结(五五)-- 音视频通讯中的抗丢包与带宽自适应原理
本文主要分析webrtc中的抗丢包与带宽自适应原理,文章来自博客园RTC.Blacker,欢迎关注微信公众号blacker,更多详见www.rtc.help 文章内容主要来自中国电信北京研究院丁博士在 ...
- TCP之三:TCP/IP协议中backlog参数(队列参数)
目录: <TCP洪水攻击(SYN Flood)的诊断和处理> <TCP/IP协议中backlog参数> TCP建立连接是要进行三次握手,但是否完成三次握手后,服务器就处理(ac ...
- TCP/IP协议中backlog参数
TCP建立连接是要进行三次握手,但是否完成三次握手后,服务器就处理(accept)呢? backlog其实是一个连接队列,在Linux内核2.2之前,backlog大小包括半连接状态和全连接状态两种队 ...
- TCP传输协议使用
TCP传输协议,也称之为套接字连接,比较安全,三次握手!,必须确保对方计算机存在,才能连接,而且是长时间连接. 缺点是传输速度有点慢. 你用 socket 去连接 ServiceSocaket 服务器 ...
- Unity C# 自定义TCP传输协议以及封包拆包、解决粘包问题
本文只是初步实现了一个简单的TCP自定协议,更为复杂的协议可以根据这种方式去扩展. TCP协议,通俗一点的讲,它是一种基于socket传输的由发送方和接收方事先协商好的一种消息包组成结构,主要由消息头 ...
- 【转】TCP/IP协议中TCP和UDP的区别
TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚网络通信! ...
- TCP/IP 协议中的滑动窗口
一个例子明白发送缓冲区.接受缓冲区.滑动窗口协议之间的关系. 在上面的几篇文章中简单介绍了上述几个概念在TCP网络编程中的关系,也对应了几个基本socket系统调用的几个行为,这里再列举一个例子,由于 ...
随机推荐
- Win8 Metro(C#)数字图像处理--2.37Wallis图象锐化
原文:Win8 Metro(C#)数字图像处理--2.37Wallis图象锐化 [函数名称] Wallis图象锐化 WallisSharpen(WriteableBitmap sr ...
- Java HashMap实现原理 源码剖析
HashMap是基于哈希表的Map接口实现,提供了所有可选的映射操作,并允许使用null值和null建,不同步且不保证映射顺序.下面记录一下研究HashMap实现原理. HashMap内部存储 在Ha ...
- Android零基础入门第72节:SwipeRefreshLayout下拉刷新
在实际开发中,经常都会遇到下拉刷新.上拉加载更多的情形,这一期就一起来学习Android系统的SwipeRefreshLayout下拉刷新组件. 一.SwipeRefreshLayout简介 Swip ...
- .NET重思(一)sealed和interface
博主这几天正好闲着,砸砸基础,毕竟自学,基础不牢靠很致命,要踏实啊~~~ 1.sealed关键字修饰一个类,也可以修饰实现方法或者属性.当sealed用于修饰一个类时,这个类不可以被继承,因此,这个类 ...
- MiTeC System Information Component Suite 10.9.2 D5-XE3 Full Source
The most complex system information probe in Delphi world, it consists of many standalone components ...
- stdlib.h,string.h,wchar.h的函数列表(cplusplus.com就有,很清楚)goodx
Multibyte characters mblen Get length of multibyte character (function ) mbtowc Convert multibyte se ...
- Delphi Thread.Queue与Synchronize的区别(差别: Synchronize是阻塞,Queue是非阻塞)
前话: 其实大家要学会看源码, 我接下来要说的这些东东,与其等别人讲,还不如自己搞几个代码试一下,印象还深刻点 TThread.Queue和TThread.Synchronize的区别, 效果上:二 ...
- How Qt Signals and Slots Work(感觉是通过Meta根据名字来调用)
Qt is well known for its signals and slots mechanism. But how does it work? In this blog post, we wi ...
- C# Task 的用法
C# Task 的用法(转自:http://www.wxzzz.com/683.html#) 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来 ...
- 【Linux】Linux 环境下splite以及一些正则使用
由于在windows下,遍历目录,想查找满足条件的文件: dir /s > ..\fileresult.txt 结果得到的文件过大,999多MB的txt: split -b 10k date.f ...