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

Why Does Entire TCP/UDP Packet Get Retransmitted Instead of Just Missing Data

所以,这可能是一个愚蠢的问题,但据我所知,如果我通过 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 遵守 MTU/MSS specifically to avoid TCP segment fragmentation on IP level.