在TCP中,是发送纯ACK时增加的SEQ编号/SND.NXT



所以我在很大程度上理解了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将在交换结束时被取消一个。

我有什么东西不见了吗?

让我们用最初的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。

最新更新