我试图从福鲁赞的书了解TCP连接建立和终止步骤。
在连接建立的三次握手的第三步,它说:
客户端发送第三段。这只是一个ACK片段。它确认收到了带有ACK标志和确认号字段的第二段。注意,如果ACK段不携带数据,它不会消耗任何序列号,但是有些实现允许连接阶段的第三个段从客户端携带第一个数据块。在这种情况下,段消耗的序列号与数据字节数一样多。

Q1。我不喜欢直言不讳的句子。它说,第三段不消耗序列号,如果它只是ACK,并且不携带任何数据。但是,在图中,第一段和第二段都显示有不同的序列号8000和8001。我觉得两者都应该是8000。
在连接终止的三路握手的第三步中,它说:
客户端TCP发送最后一个段,即ACK段,以确认从TCP服务器接收FIN段。此段包含确认号,该确认号加上从服务器在FIN段中接收到的序列号。此段不能携带数据,并且不消耗序列号。

Q2。再说一遍,我没有大胆面对的句子。它说,如果ACK段不携带数据,就不会消耗序列号。但是在图中,第一段和第三段的序号是不同的: x和x+1,我觉得两者都应该是x。
我是不是在这里搞错了理解图表?
在本书后面的某个时候,在解释如何计算重传计时器的同时,它显示了连接建立阶段如下:

请注意,第一段和第三段具有相同的序列号,1400。那么,为什么第一和第二图表在第一和第三段有不同的序号?他们应该有相同的序列号,还是我错过了解释“不消耗序列号”?
发布于 2019-11-03 15:17:29
我认为您缺少的部分是确认号是接下来预期的数据数。一个带有ACK的段说,我在这个确认号之前确认一切,我期望的下一个数据将以这个确认号开始作为它的序列号。
在第一个图中,第一个段(SYN)中没有确认号,因为发送方还不知道接收方将使用哪个序列号来启动。下一段(SYN和ACK)具有两个序列号,确认号是它接收到的序列号加上一个,因为这是它下一步所期望的(下一个接收的数据将以该序列号开头)。设置了ACK标志,因此它在确认号码之前确认收到了所有信息,并设置了它接收的下一个数据序列号的预期值。第三段( ACK )也设置了ACK标志,因此它也是在确认号码之前确认收到了一切,并设置了它接收的下一个数据序列号的期望。
如果你明白这一点,那么第二个图表也是有意义的。请记住,在初始握手之后的几乎每个段都将同时携带数据并设置ACK标志。鳍段也可能携带数据;它只是简单地告诉对方它已经发送了,但是另一边可以继续发送数据,直到完成为止。显然,另一边也是这样,用一个鳍回答,但也是一个ACK,确认号需要是X+ 1,以表明它确认的所有事情都小于这一点,接下来收到的任何数据都需要从X+1开始。
在第三个图表中,序列号为1400的两个段是正确的,因为这两个段都没有显示任何数据。确定序列号的是数据,也是确认号中的下一个期望。
发布于 2019-11-04 17:42:48
Q1:即使它没有携带数据,SYN段正在消耗序列号中的一个字节,因为SYN标志必须由对等方添加。这就是服务器响应ACK为8001,下一个客户端段序列号为8001的原因。
Q2:鳍旗也必须加进(服务器回复中的so +1 ),意思是“我已经完成了发送数据的工作”。这就是为什么在这个段之后,客户端不能再发送任何数据了(但是它仍然可以从服务器接收,只要这个服务器还没有发送FIN标志)。
在第三个图中,这是一个故障,因为SYN标志计算为1字节(对等方正确地确认了SYN )。在实际网络中,这将使服务器陷入麻烦,因为它看起来就像没有SYN标志的重传.)。第三段的序列号应该是1401 (与第四段一样)。
https://networkengineering.stackexchange.com/questions/63325
复制相似问题