TCP - 确认和重新传输 - 这种情况可能吗?

网络工程 tcp 第 4 层
2022-02-22 05:54:24

假设 C 是 TCP 客户端,S 是 TCP 服务器。

C 向 S 发送了一个 TCP 段,其中包含字节 10、11、12 ... 20 (seq = 10)。到达 S 段(沿途没有丢失)。S是否有可能发送例如。ack 15,并且他丢弃所有其他字节(15、16、17、18、19、20),因此 C 必须在这次 seq = 15 时发送另一个段。

换句话说,“段拆分”是否可能:该服务器接受一个段的第一部分字节并丢弃第二部分(由于例如完整的缓冲区或类似的东西),然后从下一个获取第二部分字节分割?还是段总是被完全接受?

我知道窗口大小应该防止这种情况:在三次握手期间,服务器将发送他的窗口大小,客户端不会发送大于该大小的段。服务器稍后将更新他的窗口大小,客户端将继续尊重这一点。

但是这个呢:在三次握手期间,服务器发送他的窗口大小,例如 65000。当这个客户端发送他的段时,另一个客户端开始三次握手并向服务​​器发送一些大的东西,这使服务器窗口大小变小。第二个客户收到通知,但第一个没有。第一个可能会发送一个适合旧窗口大小但不适合新窗口大小的段。那么会发生什么呢?

4个回答

我认为您正在混合字节和序列号。序列号是每个段的,与段的大小无关。所以我猜你的问题是if a segment of segment number 10 is sent and contains 100 bytes, however if the server has the capacity to accept only 50 bytes. can it send accept half a segment ?

答案是不。直观地说,如果作为接收者你得到一个段但你不能存储所有段,你必须丢弃整个段数据。因为细分的不同部分具有不同的重要性。

例如。您不能保留 TCP 标头,而是留下应用层数据。

所以不,你不能接受半段

由于 fe 不对称路由,段可能以不同的顺序到达目的地。有些段可能会丢失,必须重新传输。服务器将不接受该段的一部分——只接受整个段或什么都不接受。如果主机由于缓冲区溢出而丢失了该段,则它通过发送 ICMP 消息通知源,并且 TCP 窗口将重新设置为启动 - 他们称之为“慢启动”。

不可以,不能接收分段的一部分。这是因为校验和计算将不正确。本博文所述:

当目的地接收到 TCP 数据包时,接收 TCP 代码也会执行 TCP 计算并查看是否存在不匹配。如果有,则表示数据包有错误,将被丢弃。可以使用用于 IP 标头校验和验证的相同验证逻辑。

我知道这是一个迟到的答案,但我会回答这个问题。

我认为在“真实世界的网络”中实际上是可能的,当 C 和 S 之间有一些中间盒 tcp 产品时。

C < - > FW < - > S

例如,防火墙或类似的东西..它可以如下所示。

  1. 防火墙收到一个段。
  2. 防火墙将它收到的分段分段,并将其作为多个分段发送。

例如,当 FW 接收到“a”包(10, 11, ... 20 (seq=10)) 时,它可以将其分割为两个包 (10, 11, ..., 14) & (15, 16, ……,20)。在这种情况下,TCP 校验和不会有问题,因为这个 FW 会重新创建数据包并重新计算校验和。

所以我的结论是……

  1. 只要 C 和 S 之间没有 middle-box-tcp-product,就没有。接受 C 发送的一半大小的段是不可能的。
  2. 但是,如果有一些中间盒 tcp 产品,是的。S 有可能收到 C 发送的一半大小的段。