TCP 标头中的序列号和确认号被指定为包含字节计数。但是,包括 RFC 在内的许多资源都说“重新传输丢失的段”而不是“重新传输丢失的字节”。
例如,如果发送了 4 个 500 字节的段并且第 2 和第 3 段丢失了,是否允许将字节 500-1500(之前在第 2 和第 3 段中发送)作为一个段重新传输?如果是,作为一个段重传的优缺点是什么?有没有常见的实现呢?在这里,我假设 MTU 对于组合包始终足够大(分开传输第 2 和第 3 段的原因可能是例如禁用了 Nagle 算法)。
是否使用选择性确认对这个问题有影响吗?需要选择性确认以避免重传第 4 段。但是在这种情况下它是否有任何其他影响(在第 2 和第 3 段)?
查看Linux内核源代码,它似乎将段放入输出队列。它可以细分已经在队列中的段(在 MTU 减少的情况下)。在 TCP 实现中,我没有看到任何将较小段重新组装成较大段的代码。但是我可以想象 TCP 分段卸载 (TSO) 可能会导致传输更大的分段。我不知道是否有可能找出确切的分割边界。从协议理论的角度来看会有什么好处吗?