【问题标题】:why does TCP buffer data on receiver side为什么TCP在接收端缓冲数据
【发布时间】:2012-10-24 15:08:03
【问题描述】:

在 TCP PUSH 功能的大部分描述中,都提到了 PUSH 功能不仅要求发送方立即发送数据(无需等待其缓冲区填满),还要求将数据推送到接收应用程序在接收端,没有被缓冲。

我不明白的是,为什么 TCP 会在接收端缓冲数据?毕竟,TCP 数据段在 IP 数据报中传播,这些数据报被完整地处理(即,在对承载任何给定数据段的 IP 数据报的片段进行任何必要的重组之后,IP 层仅将整个数据段传递给 TCP 层)。那么,为什么接收 TCP 层要等待将这些数据传递给它的应用程序呢?一种情况可能是应用程序在该时间点没有读取数据。但是,如果是这种情况,那么强制将数据推送到应用程序无论如何都是不可能的。因此,我的问题是,为什么 PUSH 功能需要规定有关接收方行为的任何内容?假设应用程序在段到达时正在读取数据,那么无论如何该段都应该直接交付给应用程序。

谁能帮助解决我的疑问?

【问题讨论】:

    标签: networking tcp


    【解决方案1】:

    TCP 必须缓冲接收到的数据,因为它不知道应用程序何时真正读取数据并且它已经告诉发送者它愿意接收(可用的“窗口”) .所有这些数据都存储在“接收窗口”中,直到被应用程序读出。

    一旦应用程序读取了数据,它就会从接收窗口中删除数据,并增加它在下一个 ACK​​ 中报告给发送者的大小。如果这个窗口不存在,那么发送者将不得不推迟发送,直到接收者告诉它继续,直到应用程序发出读取,它才能这样做。这会给每个读取调用增加一个完整的往返延迟延迟,如果不是更多的话。

    大多数现代实现还利用此缓冲区来保持接收到的乱序数据包,以便发送方可以仅重新传输丢失的数据包,而不是之后的所有数据包。

    PSH 位通常不使用。是的,实现会发送它,但它通常不会改变接收端的行为。

    【讨论】:

    • 为什么声称没有使用PSH位?我已经看过很多次了,我相信这个应用非常广泛。而是似乎没有使用URG...
    • @codewarrior 已设置但从未读取。无论是否设置了 PSH 标志,TCP 堆栈对传入数据的行为方式相同。它最初是为某种中断编程 API 设计的。它在 Sockets API 中没有任何用途。
    • 谢谢您,Brian 和 EJP,您的回答提供了最丰富的信息!我怀疑缓冲区在那里保存数据,直到应用程序读取它,但是 PUSH 位的描述让我对此感到困惑。很有趣的是,大多数 TCP 实现不会在接收端解释 PUSH 位,这与广泛记录的内容不同。
    【解决方案2】:

    请注意,尽管其他 cmets 是正确的(在大多数实现中,PSH 位根本不会影响应用程序的行为),但 TCP 仍然使用它来确定 ACK 行为。具体来说,当设置了 PSH 位时,接收 TCP 将立即 ACK,而不是使用延迟的 ACK。小细节;)

    【讨论】:

    • 感谢 Neville 提供的额外信息。但是,TCP 什么时候会正常延迟 ACK?
    • 通常 TCP 会延迟确认任何内容,直到它收到两个完整大小的段,或者延迟的 ACK 计时器到期(我相信通常是 ~200 毫秒)。
    • 我不记得来自 RFC 的内容(尽管我承认已经有一段时间了)。可以提供参考吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    • 2016-07-05
    相关资源
    最近更新 更多