所以我理解,在大多数情况下,如何确定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将在交换结束时被一个人关闭。
我有什么遗失的吗?
答案 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。