2011-11-20 165 views
1

我通過收集使用TCPDUMP收集的數據包轉儲來聚合連接。我的代碼是在Ruby中。 代碼將區分使用4元組(SrcIP,SrcPort,DstIP,DstPort)連接 現在,如果連接位於同一臺計算機之間,具有相同的IP和相同的端口,則通過以下方法區分連接。 1.如果連接之間的時間超過2Hrs,則其新連接 2.如果我們看到我們已經看到FIN或RST,則新數據包來自新連接 3.如果SYN的否是兩個以上(每個方向一個),那麼連接是一個新的連接。使用Seq No,Ack No和/或Datasize區分TCP連接

我無法解決的情況如下 如果在2Hrs內發生同一個兩個主機(具有相同的4元組)之間的新連接,並且TCPDUMP丟棄先前的RST或FIN包,並且它也丟棄了2或來自兩個連接的更多SYN數據包。在這種情況下,我所設定的上述條件都不起作用。並且剩下的唯一一組信息是新數據包集的時間,Seq Nos,Ack Nos和數據大小。只要使用這些信息,我可以確定連接是新連接還是舊連接?

我試圖查看序列號中是否存在一個模式,或者序列號和確認號之間是否存在模式,但沒有一個似乎確定。

回答

1

由於TCP(主要)使用sliding acknowledgement window,SeqNo和AckNo將單調增加字段 - 直到它們由於integer overflow而回繞。

此外,來自一個方向的流量的SeqNo對應於另一個流量方向的AckNo,提供了另一個可以檢查的不變量。

一個複雜的因素是SeqNo最初被選爲隨機降低man in the middle attacks的可能性;因此,具有其他相同參數的新會話可能會選擇比先前可見序列號更大的初始序列號,並會混淆算法。