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

Networking 为什么重新传输整个TCP/UDP数据包而不是丢失数据,networking,tcp,udp,router,packet,Networking,Tcp,Udp,Router,Packet,所以,这可能是一个愚蠢的问题,但据我所知,如果我通过TCP或UDP发送数据,如果组成TCP/UDP数据包的任何一个IP数据包被丢弃,整个TCP/UDP数据包都会被重新传输,但我的问题是,为什么我们不能只发送丢失的部分数据呢。目前,我唯一的理由是,如果我们为收到的每个IP数据包发送一个ACK,这将增加网络拥塞。这是正确的,还是因为其他原因,当只有一个或几个IP数据包被丢弃时,我们必须重新发送TCP/UDP数据包中的所有数据?IP碎片和重新组装对上层来说是透明的:上层没有意识到这一点。此外,TCP的

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

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

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


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

好的,我想我知道你的答案了。是这样吗?据我所知,由于IP碎片,TCP段只会碎片化为IP数据报,在这种情况下,特定IP数据报被丢弃的事实对TCP层来说是完全透明的。但是,TCP遵守MTU/MSS,因此可能会选择将数据拆分为多个TCP数据包,此时它可以重新发送该部分数据包,因为TCP已知该部分数据包。在这种情况下,我唯一的问题是为什么IP层不这样做,假设IP分段为2个IP数据包,如果其中1个数据包丢失,则重新传输其中1个。@user2776326 TCP堆栈将用户数据分段为TCP段,并发送/接收完整的TCP段。TCP无法发送或接收TCP段的一部分。看,我猜原因是你可能根本不在乎数据包是否真的到达了UDP之类的东西,所以如果一个段失败了,你就不能依靠IP级别来请求重新传输,因为在不保证数据传输的协议中,在IP级别实现这样的事情是浪费的。TCP将请求丢失的数据,但是UDP并没有做任何类似的事情。ACK不是针对IP数据包的,因为IP和UDP一样是无连接的。ACK用于TCP段。TCP知道段是否丢失,但UDP不知道数据报是否丢失,也不确认数据。由使用UDP的应用程序确定数据是否丢失。