TCP序列编号机制的例外情况?

时间:2017-01-02 06:30:53

标签: tcp handshake

在客户端和服务器都将其各自的序列号设置为0的情况下,我读到以下情况:

C-->S: SYN=1, SEQ=0 (No data bytes)
C<--S: SYN=1, SEQ=0, ACK=1 (No data bytes)
C-->S: SEQ=1, ACK=1 (Data bytes optional)

在第三部分中,我了解服务器期望下一个序列号为1,但是不应该将序列号设置为initial_seq_num + sent_data_bytes_num?由于在握手的第一部分没有发送数据字节,所以seq#不应该是0?

这是握手过程中的一个例外,还是发送到没有数据字节的段,如果它们可以被发送,则应该将序列号递增1?

(有一个类似的Q&amp; A但答案并没有解释在握手阶段这是否是一个例外,或者如果在TCP连接建立后发生这种情况。我甚至不确定如果甚至可以发送没有数据字节的段。我假设你不能

ADDED 似乎TCP保持活动数据包也没有有效负载。 RFC 1122在这些数据包SEG.SEQ = SND.NXT-1中说,并且因为此序列号将是已经确认的数字,并且将发送重复的ACK,以便保持服务器的序列号相同。 / p>

否则,当序列号正确但没有有效载荷时,我无法找到需要做什么的任何迹象。我可能错了,因为我只是简单地扫描了文档,但除了示例之外,在握手期间也没有关于序列编号规则的陈述。

在RFC 1122中,它说

  

不幸的是,一些行为不端的TCP实现无法响应具有SEG.SEQ = SND.NXT-1的段,除非该段包含数据。

所以我假设它取决于每个实现,但是如果有任何声明a)握手期间的序列编号,以及b)当序列#正确但没有有效载荷时如何表现,我如果有人能指出我那部分,我会非常感激。

谢谢!

1 个答案:

答案 0 :(得分:1)

第一个ACK(作为握手的一部分发生)确认从另一端接收SYN。 SYN段不携带任何数据。但是为了允许确认接收SYN,第一个ACK增加,尽管没有有效载荷。