TCP SYN和TCP RST的TCP序列和ack值

时间:2013-11-06 11:36:14

标签: tcp

我发送了一些 TCP SYN 数据包,以便 TCP RST 返回。为了识别每个探测,我在TCP序列字段中包含一个计数器。我注意到以下几点:

  • 当SYN探测中的序列号为0,1,2,3 ...时,RST消息的ack = 1,2,3,4 ......,即 ack = syn_seq + 1
  

12:17:27.181993 IP X.X.X.X.10104> Y.Y.Y.10114:标志[S], seq 0 ,胜利   8192,长度0 12:17:27.182008 IP Y.Y.Y.Y.10114> X.X.X.X.10104:标志   [R.],seq 0, ack 1 ,win 0,length 0 12:17:27.683148 IP X.X.X.X.10104>   Y.Y.Y.Y.10114:Flags [S], seq 1,win 8192,length 0 12:17:27.683156 IP   Y.Y.Y.Y.10114> X.X.X.X.10104:标志[R.],seq 0, ack 2 ,赢0,长度   0 12:17:28.184140 IP X.X.X.X.10104> Y.Y.Y.Y.10114:旗帜[S], seq 2 ,   获胜8192,长度0 12:17:28.184147 IP Y.Y.Y.Y.10114> X.X.X.X.10104:   标志[R.],seq 0, ack 3 ,赢0,长0 12:17:28.684993 IP   X.X.X.X.10104> Y.Y.Y.Y.10114:标志[S], seq 3 ,赢8192,长度0   12:17:28.685000 IP Y.Y.Y.Y.10114> X.X.X.X.10104:Flags [R.],seq 0,    ack 4 ,赢0,长0

  • 另一方面,当我的探测开始时, seq> 1 第一 rst会像往常一样 ack = syn_seq + 1 , 但是,无论探测器的序列值如何,以下第一个都将 ack = 2,3,4
  

12:11:25.274636 IP X.X.X.X.59150> Y.Y.Y.Y.59160:标志[S], seq   299 ,获胜8192,长度0 12:11:25.274649 IP Y.Y.Y.Y.59160>   X.X.X.X.59150:标志[R.],序号0, ack 300 ,赢0,长0   12:11:25.775218 IP X.X.X.X.59150> Y.Y.Y.Y.59160:标志[S], seq   300 ,获胜8192,长度0 12:11:25.775226 IP Y.Y.Y.Y.59160>   X.X.X.X.59150:标志[R.],seq 0, ack 2 ,赢0,长0   12:11:26.276324 IP X.X.X.X.59150> Y.Y.Y.Y.59160:标志[S], seq   301 ,win 8192,length 0 12:11:26.276332 IP Y.Y.Y.Y.59160>   X.X.X.X.59150:标志[R.],seq 0, ack 3 ,赢0,长0   12:11:26.776940 IP X.X.X.X.59150> Y.Y.Y.Y.59160:标志[S], seq   302 ,win 8192,length 0 12:11:26.776948 IP Y.Y.Y.Y.59160>   X.X.X.X.59150:Flags [R.],seq 0, ack 4 ,赢0,长0

这是预期的行为吗?

2 个答案:

答案 0 :(得分:1)

TCP会话的每一端都以(相对)序列号为零开始。

同样,确认号也是零,因为还没有一个互补的方面要承认。

服务器以序列号零响应客户端,因为这是此TCP会话中的第一个数据包,相对确认号为1.

确认号设置为1表示在数据包

中收到客户端的SYN标志

现在你的情况:

序列号起双重作用:

  

如果设置了SYN标志(1),则这是初始序列号。   实际第一个数据字节的序列号和已确认的   相应的ACK中的数字则是此序列号加1。

     

如果SYN标志清零(0),则这是累计序列   当前会话的该段的第一个数据字节的编号。

(Wikipedia

复制的Blockquoted部分

所以你的Syn标志可能是0。

如果是,那就是默认行为。

答案 1 :(得分:0)

好的,实际上没有真正的问题。当我使用Wireshark检查数据包并查看数据包中的实际位时,每个RST数据包的ack值都像往常一样设置为seq_of_syn + 1

tcpdump只是在输出中使用相对确认号。就是这样。