在TCP中,在发送纯ACK时,SEQ number / SND.NXT是递增的

时间:2015-03-17 19:06:09

标签: tcp increment seq

所以我理解,在大多数情况下,如何确定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

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

我有什么遗失的吗?

1 个答案:

答案 0 :(得分: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。