【问题标题】:TCP Window and Buffer - check my understanding?TCP 窗口和缓冲区 - 检查我的理解?
【发布时间】:2018-03-03 18:44:04
【问题描述】:

我目前正在尝试实现单向 TCP,我想澄清一下 TCP 发送方/接收方窗口和接收缓冲区的行为。

我对加窗过程的理解如下:

窗口大小表示发送方一次可以发送的最大未确认字节数。

这个尺寸是在连接时商定的。

TCP 发送方应跟踪具有较低序列号的 ACK,并在收到 ACK 时将数据包标记为 ACKed。如果最低序列号(它正在跟踪)与当前窗口中的第一个字节匹配,则将窗口向右滑动。

现在,我对接收缓冲区的理解...

当数据包无序到达时使用。数据被放入缓冲区,接收方不确认它,而是继续确认它在最早的乱序数据包之前收到的最后一个数据包。这会导致发送方在重复的 ACK 号之后“快速”重新传输下一个数据包。

这是对这两个概念的正确理解吗?如果不是,请澄清。

谢谢!

【问题讨论】:

    标签: tcp buffer network-protocols


    【解决方案1】:

    窗口大小表示发送方一次可以发送的最大未确认字节数。

    没有。它是可以传输的未确认字节的最大数量。当发件人达到该限制时,他必须停止发送。

    这个尺寸是在连接时商定的。

    没有。在协议中动态调整。

    TCP 发送方应跟踪具有较低序列号的 ACK,并在收到 ACK 时将数据包标记为 ACK。

    发送者应该缓冲发送的数据,直到它被确认,此时它可以被丢弃。如果它没有被确认,它可能会被重传等等。

    如果最低序列号(它正在跟踪)与当前窗口中的第一个字节匹配,则将窗口向右滑动。

    任何 ACK 都包含一个序列号。可以丢弃低于该序列号的所有缓冲发送数据。

    现在,我对接收缓冲区的理解...

    当数据包乱序到达时使用。

    不,它在任何 in-order 数据包到达时使用。它一直存在,直到被应用程序读取。乱序段根本不需要缓冲。

    数据被放入缓冲区,接收方不确认它,而是继续确认它在最早的乱序数据包之前收到的最后一个数据包。这会导致发送方在重复的 ACK 号之后“快速”重新传输下一个数据包。

    或多或少,但缓冲部分是可选的。

    【讨论】:

    • 关于接收缓冲区。 AFAIK,当按顺序数据到达时,它被放入缓冲区,发送一个 ACK​​ 作为响应,并且 RCV.NXT 指针被更新为预期接下来要接收的第一个字节。当应用程序可用时,它会读取数据直到 RCV.NXT - 1 但它如何知道要检索的第一个字节是哪个?应该有另一个变量/指针来控制它,对吧?
    • @rutex 要检索的第一个字节是缓冲区中的第一个字节。当它被检索时,它被删除。如何做到这一点是一个实现细节,而不是协议的一部分。
    猜你喜欢
    • 2018-11-21
    • 1970-01-01
    • 2015-04-16
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    相关资源
    最近更新 更多