【问题标题】:TCP -- acknowledgementTCP——确认
【发布时间】:2015-10-24 01:16:48
【问题描述】:

TCP 标头上的 32 位确认字段,例如 x 告诉另一台主机“我收到了所有字节,直到并包括 x-1, 现在期待 从 x 开始的字节”。在这种情况下,接收者可能已经收到了一些 更多字节,例如 x+100 到 x+180, 但它还没有收到第 x 个字节。

有没有一种情况,虽然接收方没有收到 x 到 x+100 字节,但收到的字节是 x+100 到 x+180, 接收方确认收到 x+180?

我读到的一个资源表明,尽管前面的字节有间隙,但已确认接收到的字节。 但是,其他所有消息来源都告诉

“x 的确认告诉所有字节直到收到 x-1”。

有什么特殊情况吗?我正在寻找验证这一点。

TIA。

【问题讨论】:

    标签: tcp


    【解决方案1】:

    这可以通过称为 SACK 的 TCP 选项来实现。

    在这里,客户端可以通过重复的 ACK 说它只有特定的数据包编号 2(数据包的序列号),并为接收到的连续数据包的范围附加 SACK(选择性确认)选项,例如编号为 4 到5(序号)。这反过来将使服务器能够仅重传客户端未收到的数据包(3个序列号)。

    以下提供 RFC 2018 的摘录:TCP 选择性确认选项

    SACK 选项将由数据接收方发送以通知数据 已接收的非连续数据块的发送方,并且
    排队。数据接收方等待数据的接收(可能通过
    重传的方式)来填补之间序列空间的空白
    收到的块。当收到缺失的段时,数据
    接收方通过推进左侧窗口正常确认数据
    TCP 报头的确认号字段中的边缘。袋子 选项不会改变确认号的含义
    字段。

    【讨论】:

    • 您知道如何在 TCP 标头中进行管理吗?对于确认,标头只有 ACK 标志才能用于纯 ACK。 SACK 是如何进入头部的?
    • TCP 的可选头域。 TCP 提供了可选的头字段,而这些头字段又由选项类型字段标识。 SACK 是类型 5 的 TCP 可选标头字段之一。另外,请注意 SACK 使用 2 个 TCP 选项。第一个在会话建立时使用,客户端将通过向服务器发送允许 SACK 的选项来表示愿意通过 SYN 接收 SACK 选项。第二个是 SACK 选项本身,一旦 SACK-permitted 给予许可,它就会在已建立的 TCP 连接中发送。
    • TCP 序列号是字节范围,而不是数据包号。
    【解决方案2】:

    来自https://www.rfc-editor.org/rfc/rfc793.txt 的 TCP RFC:

    3.3。序号

    设计中的一个基本概念是发送的每个八位字节数据 通过 TCP 连接有一个序列号。由于每个八位字节都是 排序后,它们中的每一个都可以被确认。致谢 采用的机制是累积的,因此序列的确认 数字 X 表示直到但不包括 X 的所有八位字节都已 收到了。

    这对我来说似乎很清楚,序列号在第一个丢失的数据处停止。

    【讨论】:

    • 对我也是。但是 - 另有说明的来源是有信誉的来源。
    • 这是来自 TCP 标准。关于 TCP 的实现方式,没有比这更可靠的来源了。随意阅读它,如果您对 TCP 的工作原理有一个大致的了解,这并不太难理解。我曾在网络设备上工作过,并且我已经进入了处理 ACK 计算的 Linux 内核领域,但我从未见过任何允许 ACK 覆盖丢失数据包的东西。除了 ACK 号之外,没有任何机制可以将丢失的数据包返回给对等方。
    猜你喜欢
    • 2016-11-10
    • 2013-11-17
    • 2017-01-12
    • 1970-01-01
    • 2010-10-12
    • 2017-03-07
    • 2013-06-20
    • 1970-01-01
    • 2019-09-10
    相关资源
    最近更新 更多