当前位置: 首页 > 知识库问答 >
问题:

为什么重新传输整个TCP/UDP数据包而不是丢失数据

微生德运
2023-03-14

所以,这可能是一个愚蠢的问题,但据我所知,如果我通过TCP或UDP发送数据,如果组成该TCP/UDP数据包的任何一个IP数据包被丢弃,整个TCP/UDP数据包将被重传,但我的问题是为什么我们不能只发送丢失的部分数据吗?目前,我对此的唯一推理是,如果我们要为收到的每个IP数据包发送确认字符,这将增加网络拥塞。这是正确的,还是有其他原因,当只有一个或几个IP数据包被丢弃时,我们必须重新发送TCP/UDP数据包中的所有数据?

共有1个答案

翟俊远
2023-03-14

IP碎片和重组对上层来说是透明的:上层没有意识到这一点。此外,用于TCP的传输不一定是IP。

TCP堆栈跟踪TCP段的分派和重传。每个TCP段都有一个序列号。TCP堆栈跟踪TCP序列号,并且只能重新传输整个TCP段。

如果一个TCP段被分割成多个IP数据报,TCP堆栈不会意识到这一点,并且可能会在中间跳上发生分割。但是,通常情况下,TCP段碎片不会发生,因为TCP特别遵守MTU/MSS,以避免IP级别上的TCP段碎片。

 类似资料:
  • 根据Stevens(图示为TCP/IP),traceroute程序用增量TTL(1、2、3等)向目的主机发送UDP数据包,以从ICMP TTL过期消息中获取中间跳信息。 “到达目的地”条件是ICMP端口无法到达的消息,因为traceroute寻址的随机端口数量很高(也就是说,不太可能有人在那里监听) 所以我的问题是:是否有技术原因(缺点、RFCs等)使用UDP数据包而不使用例如ICMP回送请求消息

  • 我正在尝试编写一个非常简单的UDP客户机/服务器对,它将在同一台计算机上一起工作(目前),但是我的包没有一个被传送。以下代码是一个100%完整的VB.NET控制台应用程序。它运行时不会抛出错误,但是mListener。接收命令从不返回。 问题 1:为什么我没有收到任何数据包? 问题2:为什么我不能让我的客户使用IP地址。有没有终点?当我尝试连接到NewIPEndPoint(IPAddress.An

  • 我一直在写一个程序,它使用UDP上的停止和等待协议通过局域网和广域网发送数据包。我最近一直在测试我的程序,并注意到较大的数据包(接近64k字节)的丢包率更高。直觉上这是有道理的,但实际原因是什么?

  • 问题内容: 如PHP文档中所述,当使用包含长整数的数据结构时,它们将被转换为浮点数。解决方法是使用,而是将其保留为字符串。当荷兰国际集团这样的值,将编码这些数字背到大的整数: 使用此方法进行正确的数据往返很容易出错。如果属性包含,则数字字符串应保留为字符串,它将被编码为整数。 我想从服务器获取一个对象,修改一个属性,然后将整个数据结构放回去。我需要保留原始类型。除了要处理的属性外,我不想保留其他属

  • 下面是我在连接末尾看到的数据包序列(需要更多数据): 接收者在21:24:43重新打开窗户,再也没有听到发送者的声音。一分钟后,接收器超时连接(关闭由应用程序启动),并发送一系列未确认的FIN-ACK。 看起来与发送方的通信就这样丢失了(捕获是在接收方的网络上进行的)。如果不是,那么是否应该一直期待对Fin-ACK的确认,即使在一段足够长的时间使对等体忘记了连接之后也是如此?

  • 使用Flume源syslogudp,我看到大约25%的数据丢失。 这是我的配置 a1.sources = r1 a1.sinks=k1 a1 .通道= c1 a1.sources.r1.type = syslogudp a1.sources.r1.bind = 172.24.1.78 a1.sources.r1.port = 65535 a1.sinks.k1.type=文件滚动 水槽。水槽。目录