使用Seq No,Ack No和/或Datasize区分TCP连接

时间:2011-11-20 04:48:40

标签: ruby tcp network-programming packet-sniffers tcpdump

我通过收集使用TCPDUMP收集的数据包转储来聚合连接。我的代码是Ruby。 代码将区分使用4元组的连接(SrcIP,SrcPort,DstIP,DstPort) 现在,如果连接在同一台机器之间,具有相同的IP和相同的端口,则通过以下方法区分连接。 1.如果连接之间的时间超过2小时,则为新连接 2.如果我们看到我们已经看到FIN或RST,则新数据包来自新连接 3.如果SYN的数量超过两个(每个方向一个),则连接是新连接。

我无法解决的问题如下 如果相同的两个主机(具有相同的4元组)之间的新连接在2小时内发生,并且TCPDUMP丢弃了先前的RST或FIN数据包,并且它还从两个连接中丢弃了2个或更多个SYN数据包。在这种情况下,我设置的上述条件都不起作用。剩下的唯一信息集是新的数据包,Seq Nos,Ack Nos和数据大小的时间。只是使用这些信息,我可以确定连接是新连接还是旧连接?

我试图查看序列号中是否存在模式,或者SeqNo和AckNo之间是否存在模式但似乎没有确定。

1 个答案:

答案 0 :(得分:1)

因为TCP(主要)使用sliding acknowledgement window,所以SeqNo和AckNo将单调增加字段 - 直到它们因integer overflow而回绕。

此外,来自一个交通方向的SeqNo对应于另一个交通方向的AckNo,提供另一个可以检查的不变量。

一个复杂因素是最初选择SeqNo是随机的,以降低man in the middle attacks的可能性;因此,具有其他相同参数的新会话可能会选择大于先前可见序列号的初始序列号,并使您的算法混淆。