使用TCP协议连续传输大量数据时,是否会丢包,应如何避免

38、Internet传输协议之TCP之一(传输层) 引言 对于大多数Internet应用来说,它们需要可靠的、按序递交的传输特性。UDP不能提供这样的功能,所以Internet还需要另一个协议。这就是TCP,它是Internet上的主力军。 1、TCP概述 传输控制协议(TCP)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。因为互联网络的不同部分可能有不同的拓扑结构、带宽、延迟、数据包大小和其他参数。TCP的设计目... 阅读详情
AI摘要

本文探讨了使用TCP协议进行大量数据传输时的丢包问题及解决方案,分析了TCP协议的可靠性及其在网络故障情况下的表现,并提出了应用层确认机制的设计思路。

使用TCP协议连续传输大量数据时,是否会丢包,应如何避免

这个问题看看似比较容易,但很多人有不同的理解。开发中遇到是否每包(包数据可能大于1460)发送完之后需要由server->client确认一下,还是等待发送完成之后再确认。个人一直坚持用后者,开发中测试发现,client发送出来的数据到server->client确认,这个有时好几秒甚至更长时间.在此记录以便今后参考.

比如发送文件。记得有人提过可能会发生什么堆栈溢出。怎样避免呢?是不是可以收到数据后发送确认包,收到确认包后再继续发送。或是发送方发送了一些数据后sleep一下。
还有,我们都知道,使用UDP协议发送包时需要确认,但TCP协议时面向连接的可靠传输,是不是发出的包肯定可以收到,不需要确认呢?
比如发送文件。记得有人提过可能会发生什么堆栈溢出。怎样避免呢?
------->分段发送,定长接收,正确接收后响应前台。
例如:
前台-->后台:先发文件名,长度等信息,
后台-->前台:发OK,0(这个0表示期待接收的文件偏移)
。。
前台-->后台:发一段
后台-->前台:发OK,下一段偏移。
。。
重复。。到发完
使用UDP协议发送包时需要确认,但TCP协议时面向连接的可靠传输,是不是发出的包肯定可以收到,不需要确认呢?
--->不一定,虽然TCP保证你的数据传输,但是万一接收方突然拆线,或者中间交换设备掉线,那么数据完全可能到不到后台,因此得发接收响应包确认。
丢包是因为发送端发送太快时,接收端会把后面的包和前面的包叠起来了,例如
发送端:发送包1,发送包2
接收端只收到一个包,内容是:包1+包2
我以前也遇到个这种情况,后来用下面的方法解决了替每个包加一个包头(数据长度+数据,不用担心粘包问题,但需要解析),接收缓冲区建足够大,然后把接收缓冲区里解出来的包放到一个消息队列里
PS:最好发送时就在包头里标下整个包的长度,方便解包
队列可以用STL中的deque容器解决
如果TCP的发送函数返回成功 那么就是一定发送成功了,这是TCP协议的特征掉线后发送函数肯定会返回错误

比如发送文件。记得有人提过可能会发生什么堆栈溢出。???
TCP传输是可以保证数据交换的可靠性的,但这是指一方的主机将数据正确的传输到目标机器中,目标机器的协议栈的堆栈是有一定限制的,如果在目标机器中不及时处理接收到的数据,有可能堆栈会溢出!而这种溢出并不是因为TCP协议本身,而是因为系统的IP协议栈的缓冲区溢出造成!
应该说来是可以避免的,在发送端需要加入Select()选项,等待Select()返回后才会发送下一个包。
Select()作用判断当前网络是否可读或者可写,如果不可读或者不可写函数会被阻塞。
虽然这样可能会影响一些速度,但是一般不会造成堆栈溢出的。

youngwhz(sunbird) 说得非常对。
建议的解决方法:
将文件分块发送,接收端每收到一块数据就发送一个收到确认给发送方(包括收到的数据长度)
发送方在收到接收方发送的“收到确认”后才接着发送下一块数据。。。。
直到整个文件发送完毕。
每块数据都加一个包头,里面可以包含一些标志信息,如:是否所有数据发送完毕(即最后一个包了)
Top
TCP连接在不断开的情况下可以保证不丢数据
系统的IP协议栈的缓冲区溢出不叫溢出,只能说是丢弃包,属于正常现象,只是会影响性能,而且TCP自己就有流控,你做TCP时可以不用考虑
至于“收到确认”完全不必要,为了对付连接断开,可以每个包都带序号,断开连接时,发送端重发未发送完的包
我觉得很多人没有理解tcp/ip的分层概念
用tcp协议时,用send函数发送数据成功,应该指的是应用层向本机tcp那一层传递数据成功,而并非指这些数据已经得到对方tcp层确认.
如果连接正常,你向本机tcp层传递的数据,对方tcp层绝对可以正确收到,这是tcp协议可以保证的,否则tcp的可靠就没有意义了.但是如果网络突然中断了,那么尚还在本机tcp协议栈中未发完的数据将可能被丢弃,因此如果连接中断后你又重新连接发送数据时,你发送数据的依据不能由你传给本机tcp层多少数据来决定,而是应该询问对方应用层已经收到了多少数据
如果你的程序要求发送的数据必须一字不漏的被接受方收到,那么你必须把发送的数据存为文件,然后发送,发送的规则如上所述,另外,文件传完时也应该确认,但是你没必要每个包都确认。
如果没有这个必要,那么你就用不着确认
同意楼上的了.的确,tcpip会帮你确认你的包信息,但是如果由于网络异常引起的,有些时候tcpip也不能够帮你解决,所以建议把东西保存为一个文件,然后分块发送,然后自己添加头尾信息,
不过一般情况下没有这个必要了.
使用TCP协议在任何时候都不会丢包,因为:
TCP/IP模型中,IP层负责发送包但不保证正确接收,而TCP层在IP层上,保证每个包正确接收。
在应用程序中,如果用Socket的send发送一段数据,只要函数返回OK,对方肯定正确接收了。
使用TCP传送数据不用关心数据是否正确接收(TCP保证做到)更不用自己写应答机制(TCP对每个包都作应答)否则就成udp了。
如果网络故障,socket会有错误报告,tcp连接会断开,但是已发送的数据肯定正确发送了,你所需要的就是试图重新连接,然后把没有发送的数据接着发送出去。
楼上:我不太同意你关于send函数的说法
首先必须明确send函数究竟作了什么,他是负责将数据传递给本地tcp层后返回,还是同时负责将应用层传递的数据得到接受方tcp层确认后才返回
如果是后者你说的无疑是正确的,但是,事实上完全不是这样,这是因为如果这样,那么nagle算法就没用了,因为这个算法就是将多次send函数的传入的小数据拼凑成为一个较大的包,然后再发送。
可见,即使是send函数ok了,对方也不一定可以接受到,因为tcp协议只是在tcp层上尽他的义务,而send函数只不过扮演了一个应用层向tcp层传递数据的角色,除此之外,他和tcp层没有任何关系。
还有一种特殊情况,虽说非常罕见,但是并非不可能发生,那就是:如果接受方tcp层确实接受到数据并向发送方发送了确认信息,但是,在他向应用层传递数据时,应用层程序突然崩溃,那么接受方的应用程序也是无法接受到数据的,而此时,发送方tcp层得到了确认信息认为这些数据已经发送成功了,这是一书里举的极端例子,不信的话你可以看一看这本书吧
总之,不要把send函数和tcp协议混在一起,send函数并不是tcp协议里面的东西,send函数并不能保证任何东西,而这些保证是由tcp来完成的
 再说一句,tcp不会丢包和send返回ok接受方一定收到没有任何关系,前者并不意味着后者
没有任何一个函数,协议可以保证完全不丢包,
只不过TCP要好得多,因为它是具有连接和错误重发的协议。
在极端情况下(通信线路突然中断),那么TCP可以报错,应用程序可以重新建立连接再重传。
但是中间如果有第三方攻击(如窃听者或者线路故障),那么TCP也不能保证你的数据完全到了对方,因此在关键的数据交互场合(如网上交易),必须通过应用层的协议加以控制。
每种语言的send函数都不一样啊
如果是异步调用,不保证正确发送
但是我用的是java.net.Socket
只要不发生IOException,那肯定正确发送出去了
我在tcp/ip上学的,怎么与上楼上,上的有很多不同呀?
如果是blocking模式send应该是得到对方TCP协议确认后才返回而不是仅仅得到本机TCP模块回应就返回,否则send永远都返回成功,可以如下测试一下,建立连接后断开物理线路,操作系统不会立即得知物理链路已断开(如拨号),程序再调用send,如果返回失败说明send是等待确认后才返回,如果返回成功就说明send只需要发到本机TCP就返回。
、
在TCP上再实现一个窗口控制,缓冲区,确认发送如何?
tcp的作用就是可靠性传播
但如果是大量数据而且网络很快就会出现sequence的重复
这才是最主要的问题!!
关于wwwdfq1977(qswl) 和asklxf(xuefeng)的讨论,在网络编程里这样的深入不很多见,我想发表一下我的看法。
首先,tcp协议send函数调用后,应用程序里的数据肯定是被传到TCP/IP协议占的TCP的发送缓冲区里了。
然后,当send函数返回到应用程序时,数据是否发送出去要看Nagle算法开没开。
1.如果不开Nagle算法,发送方的TCP/IP协议占则执行发送动作。
2.如果开了,看看发送条件是否满足(如缓冲区是否有一个MSS的数据),不满足则不发送而返回
满足则发送之后再返回。
至于对方是否收到并进一步发确认,仅就此无法判断。
基本原理这样了,具体系统实现可能还有机制
我认为楼主的问题是:是否应该使用应答机制来保证不丢包
但是设计tcp协议的目的就是使用应答机制来确保可靠传输,tcp已经在传输层实现了这一机制,如果自己在应用层在实现一次,有什么意义呢?还不如改用udp。
tcp本身就是用滑动窗口模型,对每个包都会确认,使用tcp连接关心的是处理建立连接和关闭连接,以及连接中断引发的异常,对传送数据你就应该完全交给tcp。
我们在学校下电影常常一个文件600-700M,传输速度500k-2MB/s,如果tcp不可靠,用ftp怎么保证一次下载几个G不出错?ftp协议是基于tcp的。
想说说关于send函数的问题。send应该是对方收到确认后才返回的,很简单,从send函数的返回错误信息就可以看出,这里随便举几个WSAETIMEDOUT:该错误是由于网络故障或远程主机当机等原因导致的异常中止连接还有WSAECONNRESET错误,这是由远程主机上的程序强行退出或死掉引起的。 ,如果按照wwwdfq1977(qswl) 的说法只是把数据发送到本机的传输层,又怎么能检测出这些问题?
还有大家在send函数处设置断点,如果缓冲区够大,也不是立即返回,还是有一定的时延的。这也说明send函数做了一些底层的工作,接收了对方的确认信息
能不能检测到错误和我的说法有矛盾吗?
send函数确实不是仅仅把数据传递给传输层,但是,他一定要等待对方应答后才返回吗?难道有错误就不能在下一次调用时返回
缓冲区太大,有时延,这和他收到了确认信息有什么关系,因为它完全可能作其他工作
注意tcp协议所在的线程和应用程序不再同一个线程内,并不是send一返回tcp就什么都不干了,在此期间他完全可能作一些诸如设置错误或正常状态一类工作,以便程序下次调用send或者closeSocket时返回这些错误
(1)如果网线等硬件出现故障,比如网线断了、一方的SOCKET没有任何反映,所以检验一个连接是否正常,通常采用心跳测试;
(2)send()等函数只是把你要发送的数据写入你的SOCKET缓冲区,并不保证对方能正确接收到;
(3)TCP是一个可靠的连接,它有自己的一套安全机制,但也不能保证对方能正确接收到;
(4)我的解决方案:自己定义一套应用层的数据传输规约,通过搂上几位提供的方法,可以定义一套安全性很好的规约。
网络基础:TCP协议-如何保证传输的高性能 TCP高性能的保证 TCP传输相比于UDP传输,其更具有可靠性,安全性。但是传输效率与速度都比UDP要稍逊一筹。不过TCP协议自身是保证其效率及性能的。 TCP协议保证高性能的方式有: 滑动窗口 快速重传 延迟应答 捎带应答 滑动窗口 在保证TCP传输的可靠的性的时候,其中有一条就是确认应答。倘若是每发送一条数据,就等待一次ACK应答的话。大量的时间就会浪费在数据的往返上,这样性能会... 阅读详情

相关推荐

TCP重传问题分析及解决方法

但是,在使用TCP通讯时,常会遇到数据包丢失或传输错误导致的TCP重传问题,这会给通讯稳定性带来很大影响。在编写TCP通讯代码时,需要注意以上几点,并通过抓包等方式对数据进行分析,以确保TCP通讯的稳定性和可靠性。当发送的数据包在网络传输中出现问题,如丢失、超时等,接收方未收到数据包会触发ACK未确认或未收到的情况。TCP的确认机制通过对收到的数据包进行ACK确认,确认后即可删除已确认的数据包。在网络延迟过大的情况下,可以优化网络环境,例如使用增加带宽或加入负载均衡器等措施,以缩短网络传输时间。

qq_37934722的博客 5001

【转】使用TCP协议连续传输大量数据时,是否会丢包,应如何避免?

【转】使用TCP协议连续传输大量数据时,是否会丢包,应如何避免? Posted on 2008-06-11 15:24 路缘 阅读(3868) 评论(0) 编辑 收藏  http://www.cnblogs.com/xuyuan77/archive/2008/06/11/1217416.html 使用TCP协议连续传输大量数据时,是否会丢包,应如何避免? 比

迷茫的小莱 5295

RK3399平台开发系列讲解(网络调试)7.30、TCP 数据包的发送过程会受什么影响?

TCP 数据包的发送过程会受什么影响?

内核笔记 2321

使用TCP协议连续传输大量数据时,是否会丢包,应如何避免?

使用TCP协议连续传输大量数据时,是否会丢包,应如何避免? 比如发送文件。记得有人提过可能会发生什么堆栈溢出。怎样避免呢?是不是可以收到数据后发送确认包,收到确认包后再继续发送。或是发送方发送了一些数据后sleep一下。 还有,我们都知道,使用UDP协议发送包时需要确认,但TCP协议时面向连接的可靠传输,是不是发出的包肯定可以收到,不需要确认呢?  1 楼netsys2(来电!)

我呢D浪子又点会有初恋啊 9321

TCP粘包以及UDP丢包问题

1、TCP和UDP。 TCP(transport controlprotocol,传输控制协议)是面向连接的,提供高可靠性服务。UDP(user datagramprotocol,用户数据报协议)是无连接的,提供高效率服务。在实际工程应用中,对可靠性和效率的选择取决于应用的环境和需求。一般情况下,普通数据的网络传输采用高效率的udp,重要数据的网络传输采用高可靠性的TCP。 TCP的目标是为用户提供可靠的端到端连接,保证信息有序无误的传输。它除了提供基本的数据传输功能外,还为保证可靠性采用了数据编号

yy_hear的博客 4951

MAIXCAM无线连接实战:5分钟搞定远程调试与代码烧录(避坑版)

本文提供了一份详细的MAIXCAM无线连接实战指南,帮助嵌入式视觉开发者快速配置远程调试与代码烧录。文章重点介绍了通过MaixHub IDE进行Wi-Fi配置、建立远程终端连接、使用SFTP进行文件传输以及管理自启动应用程序的完整流程,并针对IP地址变动、信号中断等常见问题提供了实用的避坑解决方案,旨在提升开发效率与灵活性。

weixin_29188043的博客 298

面试:TCP、UDP如何解决丢包问题

TCP、UDP如何解决丢包问题。TCP:基于数据块传输/数据分片、对失序数据包重新排序以及去重、流量控制(滑动窗口)、拥塞控制、自主重传ARQ;UDP:程序执行后马上开始监听、控制报文大小、每个分割块的长度小于MTU

qq_44700578的博客 4240

DSP28335做FFT傅里叶变换

1. 看了一下例程,居然没有FFT的例程,难道这个DSP28335不能做FFT吗?对了C2000系列是有C2000 ware这个库的。方便很多,不过目前不确定在C5000上运行的FFT能直接迁移到DSP28335上行不?测试了一下,是可以的,因为都是用的math.h,下面的一些正弦函数基本一样的 2. 硬件简介,其中DSP28335和TLV320AIC23B之间使用I2C接口进行寄存器配置,...

weixin_30390075的博客 3331

传输层协议——TCP

TCP 全称为 "传输控制协议(Transmission Control Protocol"). ,这种协议是对数据的传输进行一个详细的控制;

make_day_day_up的博客 2688

RK3588视频转码实战:如何用FFmpeg+MPP实现16路1080P硬解压(附完整命令)

本文详细介绍了如何在RK3588处理器上使用FFmpeg和MPP框架实现16路1080P视频的硬件加速转码。通过解析RK3588的视频处理架构、环境搭建步骤和实战配置,提供了完整的命令示例和性能调优建议,帮助开发者高效处理多路视频转码任务。

weixin_29233333的博客 556

生产实习-实习报告-Raspberry Pi的应用

生产实习-Raspberry Pi的应用 一.设计任务: 1、搭建树莓派开发环境 主要包括烧录树莓派操作系统,远程访问树莓派,树莓派接口配置以及树莓派与windows实现文件共享等。 2、树莓派的基本操作 控制GPIO点亮LED灯以及树莓派舵机云台控制 3、安装OpenCV及图像采集实验 OpenCV配合树莓派,直接读取来自树莓派摄像头Pi Camera的视频,进行人脸识别、边缘检测、颜色判别等各种计算机视觉开发。 4、树莓派小车远程Wi-Fi控制 使用树莓派驱动L298N,用树莓派板载Wi-Fi控制

青竹小轩的博客 750

认识网络随机丢包

如漏水管类比,随机丢包的补偿一定要增加流量,额外的这部分流量要在丢包处损失掉,但这部分额外流量可能增加丢包处上游链路的拥塞,因此随机丢包可能造成拥塞丢包,随机丢包率越高,拥塞越可能发生,这反馈环很有趣。对端到端拥塞控制算法如何应对随机丢包,没有定论,各算法都在宣扬自家抗随机丢包能力,但实际上没有任何端到端算法有这能力。网络丢包分两类,拥塞丢包和随机丢包,拥塞丢包是自找的,来自传输协议自身,可避免,随机丢包则来自下层,可能是路由问题,可能是信道质量问题,这种丢包无法避免,只能补偿。

TCP/IP 1万+

RK3568平台开发系列讲解:Linux wifi的调试

查询结果中state为ENABLE,表示hostapd程序启用成功。首先查看设备是否存在。

内核笔记 167

【网络】TCP丢包对带宽的影响分析|TCP丢包原因分析

TCP在网络拥塞等情况时也会丢包,TCP协议本身确保传输的消息数据不会丢失完整性。但TCP是一个“流”协议,一个消息数据可能会被TCP拆分为好几个包传输,在传输过程中数据包是有可能丢包的,TCP会重传这些丢失的包,保证最终的消息数据的完整性。观察到在低数据包丢失率(1%)下,性能也受到影响,并且随着数据包丢失率的增加,性能急剧下降。我们发现TCP甚至无法处理1%的数据包丢失。我们会曾预计性能会出现合理的小幅下降,但实际上观察到性能会大幅下降。我们已经调查了这个问题的性质,并测试了不同的TCP。

我的笔记本 1429

Sparse-ICP—(4) 加权稀疏迭代最近点算法(matlab版)

本文介绍了加权稀疏迭代最近点算法的实现。

点云侠的博客 642

SAR合成孔径雷达成像及处理(附带Matlab源代码)

总结:本文介绍了SAR合成孔径雷达的基本原理,并提供了使用Matlab实现SAR成像和处理的源代码示例。然后,在慢时间域进行方位压缩处理,通过计算每个接收通道的延迟和频移,将多次接收的信号叠加得到最终的成像结果。SAR成像的基本原理是通过接收雷达发射的脉冲信号的回波,并利用多次接收的信号进行叠加处理。以多普勒频移校正为例,根据雷达飞行速度和方位角,计算实际的多普勒频率,并对每个接收通道的数据进行频移校正,以消除因目标运动引起的频率偏移。通过调整参数和算法,可以实现不同的SAR成像和处理效果。

ByteJolt的博客 689

TCP协议详解

主要协议httpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttps。

qq_52655865的博客 5626

13、离散时间系统建模与分析

本文系统介绍了离散时间系统的建模与分析方法,涵盖连续时间模型的离散化过程、系统稳定性判断准则、输入输出模型转换方法以及有限脉冲响应和阶跃响应模型的应用。通过多个示例详细展示了不同系统在离散化过程中的特性变化,并探讨了采样间隔对系统动态特性的影响。此外,文章还分析了时间延迟的处理方法,并总结了关键知识点及操作步骤,为离散时间系统的实际应用提供了理论基础和实践指导。

2w3e4r5t6y的博客 189

传输层协议TCP和UDP的区别详解

一、TCP协议 1、TCP的优点: 可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。 2、TCP的缺点: 慢,效率低,占用系统资源高,易被攻击 TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。 而且,因为TCP有确认

chaopingyao的博客 4155

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

TCP的丢包问题

快速重传是基于接收端的反馈,当接收端收到一个失序的数据包时,会立即发送重复的 ACK。例如,在一个带宽有限的网络环境中,如果同时有多个设备进行大数据量的传输,如在家庭网络中多个设备同时进行高清视频的在线播放,路由器的缓存就可能会被填满。此时,新到达的 TCP 数据包就可能会被丢弃。:当服务器或客户端的处理能力达到极限时,无法及时处理接收到的 TCP 数据包,也可能会导致丢包。例如,一个性能较差的服务器同时处理大量的连接请求和数据传输,CPU 和内存资源被耗尽,就可能会丢弃部分数据包。

2408_89166609的博客 960

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

传输层协议---TCP的进化之路

传输层协议之TCP的进化,简要总结TCP知识点

hjlogzw的博客 989

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: apache的ab压力测试
下一篇: post和get传输速度比较
longzai89757
博客等级 码龄9年 14粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值