因此,我理解,在大多数情况下,如何确定seq和ack数字(seq=snd.nxt=is+发送的字节数,ack=rcv.nxt=seq预期从下一个接收的数据包)。我想知道的是当发送一个纯ack包时seq如何增加(以及snd.nxt和snd.una)。
前任:
(我给客户机a一个is=1,服务器b一个is=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将在一次交换结束时被一个关闭。
我有什么东西不见了吗?
最佳答案
让我们用初始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。
关于tcp - 在TCP中,在发送纯ACK时,SEQ number/SND.NXT是递增的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29107636/