【问题标题】:In TCP, is the SEQ number/SND.NXT incremented when sending pure ACKs在 TCP 中,发送纯 ACK 时是否增加 SEQ 编号/SND.NXT
【发布时间】:2015-03-17 19:06:09
【问题描述】:

所以我明白,在大多数情况下,SEQ 和 ACK 编号是如何确定的(SEQ = SND.NXT = ISN + 发送的字节数,ACK = RCV.NXT = 预计从下一个收到的数据包开始的 SEQ)。我想知道发送纯 ACK 数据包时 SEQ 如何增加(连同 SND.NXT 和 SND.UNA)。

例如: (我给客户端 A ISN = 1,服务器 B ISN = 100)

A -> (SEQ = 1, ACK = 100, LEN = 412 bytes)
(A) RCV.NXT = 100, SND.NXT = 413, SND.UNA = 1
(B) RCV.NXT = 413, SND.NXT = 100, SND.UNA = 100

A <- (SEQ = 100, ACK = 413, LEN = 0)
(A) RCV.NXT = 101, SND.NXT = 413, SND.UNA = 413
(B) RCV.NXT = 413, SND.NXT = 101, SND.UNA = 101 **(or 101?)**

A <- (SEQ = 101, ACK = 413, LEN = 1448)
(A) RCV.NXT = 101, SND.NXT = 413, SND.UNA = 413
(B) RCV.NXT = 413, SND.NXT = 1549, SND.UNA = 101

A -> (SEQ = 413, ACK = 1549, LEN = 0)
(A) RCV.NXT = 1549, SND.NXT = 414, SND.UNA = 414 **(or 413?)**
(B) RCV.NXT = 414, SND.NXT = 1549, SND.UNA = 1549

每次发送数据包时增加 SND.NXT 似乎是有意义的(即使有效负载 len = 0),但您是否也会增加 SND.UNA?对于 SND.UNA = ACK 分配,这似乎是相当随意和奇怪的例外。但是,在我看来,如果您不这样做,那么您的 SND.UNA 将在交换结束时减一。

我有什么遗漏吗?

【问题讨论】:

    标签: tcp increment seq


    【解决方案1】:

    让我们用最初的 SYN 重写您的示例以保持清晰:

    A- ISN 1000
    B- ISN 2000
    
    A -> ([SYN] SEQ = 1000, ACK = ----, LEN = 0 bytes)
    (A) RCV.NXT = ----, SND.NXT = 1001, SND.UNA = 1000
    (B) RCV.NXT = 1001, SND.NXT = 2000, SND.UNA = ----
    
    A <- ([SYN,ACK] SEQ = 2000, ACK = 1001, LEN = 0)
    (A) RCV.NXT = 2001, SND.NXT = 1001, SND.UNA = 1001
    (B) RCV.NXT = 1001, SND.NXT = 2001, SND.UNA = 2000
    
    A -> ([ACK] SEQ = 1001, ACK = 2001, LEN = 0 bytes)
    (A) RCV.NXT = 2001, SND.NXT = 1001, SND.UNA = 1001
    (B) RCV.NXT = 1001, SND.NXT = 2001, SND.UNA = 2001
    

    这样就完成了 TCP 连接的建立。该序列中的最后一个数据包是“纯 ACK”,即带有 ACK 信号和 0 数据长度的 TCP 数据包。它不提前发送者序列号,因此不提前 snd.nxt 或 snd.una。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 2022-12-10
      • 2011-07-29
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 2014-04-27
      相关资源
      最近更新 更多