Пример #1
0
        public async Task InitializeAsync(IConversationsModel model)
        {
            if (this.Initialized)
            {
                return;
            }
            this.Initialized = true;

            await Task.Run(() => { this.Initialize(model); });
        }
Пример #2
0
        private void Initialize(IConversationsModel model)
        {
            //var conversationsStatistics = new ConversationsStatistics
            //{
            //    Frames = model.Frames.Count(),
            //    CaptureStart = DateTime.MaxValue,
            //    CaptureFinish = DateTime.MinValue
            //};

            this.ConversationsStatistics.Frames        = model.Frames.Count();
            this.ConversationsStatistics.CaptureStart  = DateTime.MaxValue;
            this.ConversationsStatistics.CaptureFinish = DateTime.MinValue;

            this.ComputeConversationStatistics(model);
        }
Пример #3
0
 public ConversationsGroup(IConversationsModel conversationsModel) : this()
 {
     //todo fix this.Investigation = investigation;
     foreach (var conv in conversationsModel.L3Conversations)
     {
         this.L3Conversations.Add(conv);
     }
     foreach (var conv in conversationsModel.L4Conversations)
     {
         this.L4Conversations.Add(conv);
     }
     foreach (var conv in conversationsModel.L7Conversations)
     {
         this.L7Conversations.Add(conv);
     }
 }
Пример #4
0
        private void ComputeConversationStatistics(IConversationsModel model)
        {
            var hosts               = new List <IPAddress>();
            var protoDistribution   = new Dictionary <string, long>();
            var missingBytesListNew = new SortedList <DateTime, KeyValue <DateTime, long> >();
            var historyListNew      = new SortedList <DateTime, KeyValue <DateTime, long> >();
            var hostsTraffic        = new Dictionary <IPAddress, HostTraffic>();
            var avg = (long)this.Average(model.L7Conversations, conversation => conversation.ConversationStats.Bytes);

            foreach (var l7Conversation in model.L7Conversations)
            {
                if (!l7Conversation.L7PDUs.Any())
                {
                    // TODO: Is this correct?
                    continue;
                }

                // TO L3 foreach
                if (this.ConversationsStatistics.CaptureStart > l7Conversation.FirstSeen.ToUniversalTime())
                {
                    this.ConversationsStatistics.CaptureStart = l7Conversation.FirstSeen.ToUniversalTime();
                }
                if (this.ConversationsStatistics.CaptureFinish < l7Conversation.LastSeen.ToUniversalTime())
                {
                    this.ConversationsStatistics.CaptureFinish = l7Conversation.LastSeen.ToUniversalTime();
                }
                switch (l7Conversation.L3ProtocolType)
                {
                case AddressFamily.InterNetwork:
                    this.ConversationsStatistics.IPv4Conversations++;
                    break;

                case AddressFamily.InterNetworkV6:
                    this.ConversationsStatistics.IPv6Conversations++;
                    break;
                }
                hosts.Add(l7Conversation.SourceEndPoint.Address);
                hosts.Add(l7Conversation.DestinationEndPoint.Address);

                // To L4 foreach
                switch (l7Conversation.L4ProtocolType)
                {
                case IPProtocolType.TCP:
                    this.ConversationsStatistics.TcpConversations++;
                    this.ConversationsStatistics.UpFlowTcpLostBytes   += l7Conversation.UpConversationStatistic?.MissingBytes ?? 0;
                    this.ConversationsStatistics.DownFlowTcpLostBytes += l7Conversation.DownConversationStatistic?.MissingBytes ?? 0;
                    this.ConversationsStatistics.TotalTcpBytes        += ((long?)l7Conversation.ConversationStats?.Bytes) ?? 0;
                    break;

                case IPProtocolType.UDP:
                    this.ConversationsStatistics.UdpConversations++;
                    this.ConversationsStatistics.TotalUdpBytes += ((long?)l7Conversation.ConversationStats?.Bytes) ?? 0;
                    break;
                }

                // TO L7 statistics
                this.ConversationsStatistics.UpFlowFrames   += l7Conversation.UpConversationStatistic?.Frames ?? 0;
                this.ConversationsStatistics.DownFlowFrames += l7Conversation.DownConversationStatistic?.Frames ?? 0;
                this.ConversationsStatistics.UpFlowBytes    += l7Conversation.UpConversationStatistic?.Bytes ?? 0;
                this.ConversationsStatistics.DownFlowBytes  += l7Conversation.DownConversationStatistic?.Bytes ?? 0;

                //TODO how this should be implemented? What happens if there are more app tags at once
                string apptag;
                if (l7Conversation.ApplicationTags.IsNullOrEmpty())
                {
                    apptag = "unknown";
                }
                else if (l7Conversation.ApplicationTags.Count() == 1)
                {
                    apptag = l7Conversation.ApplicationTags.First();
                    if (apptag.IsNullOrEmpty())
                    {
                        apptag = "unknown";
                    }
                }
                else
                {
                    apptag = "multiple-protocols";
                }

                if (l7Conversation.ConversationStats == null)
                {
                    continue;
                }

                if (!protoDistribution.ContainsKey(apptag))
                {
                    protoDistribution.Add(apptag, l7Conversation.ConversationStats.Bytes);
                }
                else
                {
                    protoDistribution[apptag] += l7Conversation.ConversationStats.Bytes;
                }


                // Traffic errors and history
                if (l7Conversation.FirstSeen != DateTime.MinValue && l7Conversation.FirstSeen != DateTime.MaxValue)
                {
                    var ct = l7Conversation.FirstSeen.ToUniversalTime();

                    KeyValue <DateTime, long> tmp;
                    if (!missingBytesListNew.TryGetValue(ct, out tmp))
                    {
                        tmp = new KeyValue <DateTime, long>(ct, l7Conversation.ConversationStats.MissingBytes);
                        missingBytesListNew.Add(ct, tmp);
                    }
                    else
                    {
                        tmp.Value += l7Conversation.ConversationStats.MissingBytes;
                    }
                    if (!historyListNew.TryGetValue(ct, out tmp))
                    {
                        tmp = new KeyValue <DateTime, long>(ct, l7Conversation.ConversationStats.Bytes);
                        historyListNew.Add(ct, tmp);
                    }
                    else
                    {
                        tmp.Value += l7Conversation.ConversationStats.Bytes;
                    }
                }

                // hosts traffic
                if (l7Conversation.ConversationStats.Bytes < avg)
                {
                    continue;
                }

                var         srcHostAddress = l7Conversation.SourceEndPoint.Address;
                HostTraffic srcHost;
                if (!hostsTraffic.TryGetValue(srcHostAddress, out srcHost))
                {
                    srcHost = new HostTraffic
                    {
                        Host = srcHostAddress
                    };
                    hostsTraffic.Add(srcHostAddress, srcHost);
                }

                var         dstHostAddress = l7Conversation.DestinationEndPoint.Address;
                HostTraffic dstHost;
                if (!hostsTraffic.TryGetValue(dstHostAddress, out dstHost))
                {
                    dstHost = new HostTraffic
                    {
                        Host = dstHostAddress
                    };
                    hostsTraffic.Add(dstHostAddress, dstHost);
                }

                srcHost.UpTraffic   += l7Conversation.UpConversationStatistic.Bytes;
                srcHost.DownTraffic += l7Conversation.DownConversationStatistic.Bytes;
                dstHost.UpTraffic   += l7Conversation.DownConversationStatistic.Bytes;
                dstHost.DownTraffic += l7Conversation.UpConversationStatistic.Bytes;
            }

            this.ConversationsStatistics.UniqueHostsCount = (uint)hosts.Distinct().Count();

            //TODO: hack, Cant bind KeyValuePair (value type)
            // this.ConversationsStatistics.AppProtocolsDistribution = protoDistribution.ToArray();
            this.ConversationsStatistics.ReckognizedProtocolsCount = (uint)protoDistribution.Count();
            this.ConversationsStatistics.AppProtocolsDistribution  = new KeyValue <string, long> [this.ConversationsStatistics.ReckognizedProtocolsCount];
            this.ConversationsStatistics.AppProtocolsSummary       = new ProtocolSummaryItem[this.ConversationsStatistics.ReckognizedProtocolsCount];
            var i = 0;

            foreach (var proto in protoDistribution)
            {
                this.ConversationsStatistics.AppProtocolsDistribution[i] = new KeyValue <string, long>(proto.Key, proto.Value);
                this.ConversationsStatistics.AppProtocolsSummary[i]      = new ProtocolSummaryItem(proto.Key, proto.Value,
                                                                                                   (float)proto.Value / this.ConversationsStatistics.TotalFlowBytes * 100);
                i++;
            }

            this.ConversationsStatistics.TransportProtocolsDistribution    = new KeyValue <string, long> [TransportProtocolsCount];
            this.ConversationsStatistics.TransportProtocolsSummary         = new ProtocolSummaryItem[TransportProtocolsCount];
            this.ConversationsStatistics.TransportProtocolsDistribution[0] = new KeyValue <string, long>("TCP", this.ConversationsStatistics.TotalTcpBytes);
            this.ConversationsStatistics.TransportProtocolsDistribution[1] = new KeyValue <string, long>("UDP", this.ConversationsStatistics.TotalUdpBytes);
            var tcpPerc = (float)this.ConversationsStatistics.TotalTcpBytes / (this.ConversationsStatistics.TotalTcpBytes + this.ConversationsStatistics.TotalUdpBytes) * 100;
            var udpPerc = (float)this.ConversationsStatistics.TotalUdpBytes / (this.ConversationsStatistics.TotalTcpBytes + this.ConversationsStatistics.TotalUdpBytes) * 100;

            this.ConversationsStatistics.TransportProtocolsSummary[0] = new ProtocolSummaryItem("TCP", this.ConversationsStatistics.TotalTcpBytes, tcpPerc);
            this.ConversationsStatistics.TransportProtocolsSummary[1] = new ProtocolSummaryItem("UDP", this.ConversationsStatistics.TotalUdpBytes, udpPerc);

            // traffic errors
            this.ConversationsStatistics.TrafficErrors = missingBytesListNew.Values.ToArray();

            // history
            this.ConversationsStatistics.TrafficHistory = historyListNew.Values.ToArray();

            // hosts traffic
            this.ConversationsStatistics.HostsTraffic = hostsTraffic.Values.OrderByDescending(h => h.TotalTraffic).ToArray();
        }