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

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

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

最新推荐文章于 2025-08-14 15:41:40 发布

longzai89757

最新推荐文章于 2025-08-14 15:41:40 发布

阅读量2.2w

收藏

53

点赞数

10

分类专栏:

服务器

文章标签:

tcp协议

传输大量数据

丢包

服务器

专栏收录该内容

10 篇文章

订阅专栏

本文探讨了使用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)我的解决方案:自己定义一套应用层的数据传输规约,通过搂上几位提供的方法,可以定义一套安全性很好的规约。

确定要放弃本次机会?

福利倒计时

:

:

立减 ¥

普通VIP年卡可用

立即使用

longzai89757

关注

关注

10

点赞

53

收藏

觉得还不错?

一键收藏

知道了

0

评论

分享

复制链接

分享到 QQ

分享到新浪微博

扫一扫

举报

举报

专栏目录

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

qq_37934722的博客

07-23

4743

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

TCP数据传输与性能

凉茶铺的博客

07-22

2222

串行加载的另一个缺点是,有些浏览器在对象加载完毕之前无法获知对象的尺寸,而且它们可能需要尺寸信息来决定将对象放在屏幕的什么位置上,所以在加载了足够多的对象之前,无法在屏幕上显示任何内容。在这种情况下,可能浏览器串行装载对象的进度很正常,但用户面对的却是一个空白的屏幕,对装载的进度一无所知。那么就从小到大的增加拥塞窗口的大小,即增加发送窗口的大小,用于防止因特网的突然过载和拥塞。接下来的操作就是一样的了,确认包后,窗口往后移继续将未发送的包读进缓存,把“待发送“状态的包变为”已发送“。...

参与评论

您还未登录,请先

登录

后发表或查看评论

什么是网络丢包,如果出现丢包又该如何处理?网络安全零基础入门到精通看这一篇就够了

最新发布

白帽阿叁的博客

08-14

1329

网络丢包故障分析与处理指南 网络丢包是指数据包在传输过程中丢失的现象,常见原因涉及网卡设备、驱动和协议栈问题。本文介绍了三种典型丢包故障及处理方法: 周期性丢包:通常由网络环路引起,表现为规则性丢包曲线。处理方法是排查交换机环路并断开异常连接。 随机性丢包:多由病毒攻击导致,表现为不规则丢包。可通过抓包分析定位感染主机并进行隔离杀毒。 严重时延:常因带宽占用过高,表现为外网访问缓慢。需要检查交换机负载并终止异常流量进程。 此外,文章推荐使用mtr工具结合ping/traceroute功能进行更全面的网络诊断

38、Internet传输协议之TCP之一(传输层)

跃寒的博客

03-16

1224

引言

对于大多数Internet应用来说,它们需要可靠的、按序递交的传输特性。UDP不能提供这样的功能,所以Internet还需要另一个协议。这就是TCP,它是Internet上的主力军。

1、TCP概述

传输控制协议(TCP)是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。因为互联网络的不同部分可能有不同的拓扑结构、带宽、延迟、数据包大小和其他参数。TCP的设计目...

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

迷茫的小莱

03-01

5231

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

Posted on 2008-06-11 15:24 路缘 阅读(3868) 评论(0) 编辑 收藏

http://www.cnblogs.com/xuyuan77/archive/2008/06/11/1217416.html

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

Windows下基于TCP协议的大文件传输(流形式)

热门推荐

逝去的浪花

06-20

1万+

1

1

1

1

1

#ifndef TCPRECVFILE

#define TCPRECVFILE

#include

#include

#include

#include

#define DESTADDRESS "192.168.27.170"

#define FILENAME "D:\\file.jpg"

#define SERVER_PORT 5210 //侦听端口

tcp发送大数据块

imyangjianwei的专栏

08-08

2287

tcp是基于流的,所以发送的数据长度超过tcp缓冲也能够发送成功,但是协议会将数据分割,分多次发送,刚刚试验了一下,在ubuntu下发送10w字节的数据,会最大分割为192k的流(第一次会小一些,可能默认值),这样就需要多次接收数据(在libevent中会多次出发read的回调函数)。

但是利用read/write发送,每次长度都是不固定的。

这样就需要判断何时数据完全发送成功,我的想...

(网络)传输层:TCP协议特性——可靠传输详解(安全传输+避免丢包+提高性能)

Monster的博客

04-02

1188

文章目录安全有序传输包序管理避免丢包机制1. 滑动窗口机制 ——流量控制窗口滑动窗口机制中的协议2. 拥塞控制提高性能1. 快速重传机制2. 捎带应答机制3. 延迟应答机制

可靠传输:确保数据安全到达对端,并且保证有序交付

安全有序传输

确保数据安全有序到达对端

可靠传输的前提:面向连接。这里不再细说,有兴趣的小伙伴可以戳(网络)传输层:TCP协议特性——面向连接详解(连接建立、断开详细过程+常见面试题)

确认应答机制:发送的每一条数据都要求接收方进行确认回复,收到确认回复则认为数据安全到达。

超时重

TCP/IP协议传输层详解

weixin_59371851的博客

10-26

5082

传输层协议主要有两个,分别是UDP协议和TCP协议。我们说了TCP是可靠连接, 那么是不是TCP一定就优于UDP呢?TCP和UDP之间的优点和缺点, 不能简单, 绝对的进行比较。归根结底, TCP和UDP都是程序员的工具, 什么时机用, 具体怎么用, 还是要根据具体的需求场景去判定。

【计算机网络】详解传输层 TCP 协议

qq_63271124的博客

06-06

1124

传输层可以负责数据能够从发送端传输接收端. 其中有两个特别重要的协议, 一个是UDP协议, 一个是TCP协议. 前面的文章已经介绍了UDP协议, 本文我们介绍更可靠的TCP协议.TCP,即Transmission Control Protocol,传输控制协议。人如其名,是对数据的传输进行一个详细的控制。非常希望大家可以提出宝贵的建议!!🎇这篇文章介绍了传输层中一个特别重要的协议——TCP协议. 通过对TCP实现机制的了解我们更加确定了TCP相对于UDP协议的可靠性与高效性。

TCP协议

AAAAA_9的博客

04-11

355

TCP 协议报文格式,TCP 如何实现可靠传输(确认应答,超时重传), TCP 连接管理机制(三次握手,四次挥手),其他机制,异常情况。

传输层(二)网络抓包分析TCP协议的传输可靠性

duchenlong的博客

05-30

908

通过网络抓包来分析TCP到底是如何让传输变的可靠,记录TCP的确认应答机制,超时重传机制,滑动窗口机制,拥塞控制机制,捎带应答机制,延时应答机制

用了TCP协议,就一定不会丢包吗?

java_beautiful的博客

08-02

566

数据从发送端到接收端,链路很长,任何一个地方都可能发生丢包,几乎可以说丢包不可避免。平时没事也不用关注丢包,大部分时候TCP的重传机制保证了消息可靠性。当你发现服务异常的时候,比如接口延时很高,总是失败的时候,可以用ping或者mtr命令看下是不是中间链路发生了丢包。TCP只保证传输层的消息可靠性,并不保证应用层的消息可靠性。如果我们还想保证应用层的消息可靠性,就需要应用层自己去实现逻辑做保证。最后给大家留个问题吧,mtr命令是怎么知道每一跳的IP地址的?一碗水要端平。微信不丢包。叫我靓仔。...

TCP避免丢包机制(滑动窗口机制)

XHumble的博客

07-27

1141

滑动窗口机制的作用:

滑动窗口机制实现了流量控制(接收方控制发送方的发送速度),如果发送方发送大量的数据可能会占满接收缓冲区,这样就会导致后续发送的数据无法存放在缓冲区中而丢弃,导致发送方产生了大量的丢包重传。

通过流量控制可以避免发送方发送数据过多而导致的丢包重传

滑动窗口机制如何实现

16为窗口大小是实现滑动窗口机制的关键信息

接收方接收到每条数据之后,会进行确认回复,在确认回复的窗口中接收方会填入一个值,这个值不能大于接收方剩余缓冲区的大小,发送方在收到这个回复后,通过窗口大小就知道自己最多

使用TCP协议就一定零丢包了吗?

weixin_73077810的博客

04-02

1173

本文介绍了 TCP 协议的基本特性和数据包发送流程,包括三次握手建立连接过程以及数据包在网络中的传输路径。随后,分析导致数据包丢失的几种常见情况,包括建立连接时丢包、流量控制丢包、网卡丢包、接收缓冲区丢包等。对每种情况进行了详细解释,并给出了可能的解决方案。还强调了 TCP 协议只保证传输层的消息可靠性,并不保证应用层的消息可靠性,因此在实际应用中,需要应用层自行实现消息的可靠性保证机制。最后,通过引入第三方服务器来解决消息可靠性保证问题,并分析了引入服务器的优势,包括减少资源消耗、增强安

4.21 用了 TCP 协议,数据一定不会丢吗?

加油加油

08-27

339

此时目的机器的网卡会通知DMA将数据包信息放到RingBuffer中,再触发一个硬中断给CPU,CPU触发软中断让ksoftirqd去RingBuffer收包,于是一个数据包就这样顺着物理层,数据链路层,网络层,传输层,最后从内核空间拷贝到用户空间里的聊天软件里。建立TCP连接的两端,发送端在发出数据后会等待接收端回复ack包,ack包的目的是为了告诉对方自己确实收到了数据,但如果中间链路层发生了丢包,那发送端会迟迟收不到确认ack,于是就会进行重传。,告诉发送端,"球球了,顶不住了,别发了"。

tcp发送文件、多路复用

hqb_newfarmer的博客

02-22

734

tcp发送文件、多路复用

听说TCP能保证不丢包?图解TCP六大丢包场景

kevin_tech的博客,微信搜「网管叨bi叨」

08-25

3480

咱大家每天都背八股文,但是有没有考证过背的对不对呢?比如说早年不知网上那份儿资料上说 TCP 协议能保证不丢包,那很多人不管自己面试还是面别人都说TCP 协议不丢包,那到底对不对呢,今天就用图解给大家分析一下。 分析道最后你会发现,很多时候一些结论开始时是有定语的,传着传着定语就丢了。聊到 TCP 协议丢不丢包,咱们得从头开始聊起:“两千多年前,古希腊的仲夏夜,亚里士多德在......” 好像这个...

用了TCP协议,就一定不会丢包吗

KookeeyLena3的博客

09-14

1040

在网络通信的世界里,传输控制协议(TCP)被广泛认为是实现数据可靠传输的关键协议。TCP通过一系列复杂的机制确保数据包能够正确无误地从源头传送到目的地。然而,尽管TCP提供了诸多保障,它并不能保证100%的数据包不丢失。本文将探讨TCP协议的工作原理,它如何减少丢包,以及在什么情况下TCP仍然可能遇到丢包问题。

Opencv与Socket TCP协议实现视频流传输

在深入分析这篇标题为"【二】Opencv结合socket进行视频传输(TCP协议)——附件包"的知识点之前,需要首先了解其涉及的几个核心概念:OpenCV、Socket编程、TCP协议以及视频传输。这四个方面共同构成了利用OpenCV库...

相关创作

淘宝店铺推广的30个方法是什么?最常用的方法分享
beat365体育登陆网址

淘宝店铺推广的30个方法是什么?最常用的方法分享

📅 06-28 👁️ 648
闪回赛季还有多久结束,编年史看
正规365体育投注

闪回赛季还有多久结束,编年史看

📅 08-11 👁️ 2773