public void InsertTunnelingEvent(TunnelingEvent tunnelingEvent)
 {
     try
     {
         using (SQLiteConnection connection = new SQLiteConnection(connectionString))
         {
             connection.Open();
             SQLiteTransaction trans = connection.BeginTransaction();
             SQLiteCommand     cmd   = connection.CreateCommand();
             cmd.CommandText = string.Format("INSERT INTO {0}_TunnelingEvents(PacketID, Time, TunnelingSrc, TunnelingDst) VALUES(@PacketID, @Time, @TunnelingSrc, @TunnelingDst)", prefixNameOfTable);
             cmd.Parameters.Add("@PacketID", System.Data.DbType.Int32).Value     = tunnelingEvent.PacketID;
             cmd.Parameters.Add("@Time", System.Data.DbType.Double).Value        = tunnelingEvent.Time;
             cmd.Parameters.Add("@TunnelingSrc", System.Data.DbType.Int32).Value = tunnelingEvent.TunnelingSrc;
             cmd.Parameters.Add("@TunnelingDst", System.Data.DbType.Int32).Value = tunnelingEvent.TunnelingDst;
             cmd.ExecuteNonQuery();
             trans.Commit();
         }
     }
     catch { }
 }
예제 #2
0
        public void Run(int attackPacketPerSec, int normalPacketPerSec, int totalPacket, int percentageOfAttackPacket, double probibilityOfPacketTunneling, double probibilityOfPacketMarking, double startFiltering, int initialTimeOfAttackPacket, bool dynamicProbability, bool considerDistance)
        {
            Random     rd = new Random();
            int        victimID;
            int        attackerIndex = 0;
            List <int> path;

            List <PacketEvent>     packetEventList     = new List <PacketEvent>();
            List <PacketSentEvent> packetSentEventList = new List <PacketSentEvent>();
            List <TunnelingEvent>  tunnelingEventList  = new List <TunnelingEvent>();
            List <MarkingEvent>    markingEventList    = new List <MarkingEvent>();
            List <FilteringEvent>  filteringEventList  = new List <FilteringEvent>();

            foreach (NetworkTopology.Node node in topology.Nodes)
            {
                if (node.Tracer == NetworkTopology.TracerType.Tunneling)
                {
                    node.ProbabilityOfTunneling = probibilityOfPacketTunneling;
                    node.FilteringCount         = probibilityOfPacketTunneling * 10;
                    node.IsTunnelingActive      = true;
                }
            }

            for (int i = 0; i < totalPacket; i++)
            {
                int tunnelingNodeID = -1;

                bool isTunneling = false;
                bool isMarking   = false;
                bool isFiltering = false;

                bool shouldMarking   = false;
                bool shouldFiltering = false;

                NetworkTopology.Node SourceNode;
                victimID = topology.idOfVictims[rd.Next(topology.idOfVictims.Count)];

                do
                {
                    if (rd.NextDouble() < (double)percentageOfAttackPacket / 100)
                    {
                        SourceNode = attackNode[attackerIndex % attackNode.Count];
                        attackerIndex++;
                    }
                    else
                    {
                        SourceNode = topology.Nodes[rd.Next(topology.Nodes.Count)];
                    }
                } while (SourceNode.ID == victimID);


                path = topology.GetShortestPath(SourceNode.ID, victimID);

                PacketEvent packetEvent = new PacketEvent()
                {
                    PacketID    = i,
                    Source      = SourceNode.ID,
                    Destination = victimID,
                    Time        = SourceNode.Type == NetworkTopology.NodeType.Attacker ? initialTimeOfAttackPacket : 0,
                    Type        = SourceNode.Type
                };

                packetEventList.Add(packetEvent);

                for (int j = 0; j < path.Count; j++)
                {
                    packetEvent.Time = j == 0 ? packetEvent.Time : packetEvent.Time += topology.AdjacentMatrix[topology.NodeID2Index(path[j - 1]), topology.NodeID2Index(path[j])].Delay;

                    switch (topology.Nodes[topology.NodeID2Index(path[j])].Tracer)
                    {
                    case NetworkTopology.TracerType.Tunneling:
                        if (!isTunneling && !isMarking && rd.NextDouble() <= topology.Nodes.Find(node => node.ID == path[j]).ProbabilityOfTunneling&& topology.Nodes.Find(node => node.ID == path[j]).IsTunnelingActive)
                        {
                            TunnelingEvent tunnelingEvent = new TunnelingEvent(packetEvent);
                            tunnelingEvent.TunnelingSrc = path[j];

                            // Re-computing path.
                            //if (i < startFiltering * totalPacket / 100)
                            if (markingEventList.Count * 100 / totalPacket < startFiltering)
                            {
                                path          = ChooseTunnelingNode(path, j, NetworkTopology.TracerType.Marking, ref tunnelingEvent, considerDistance);
                                shouldMarking = true;
                            }
                            else
                            {
                                path            = ChooseTunnelingNode(path, j, NetworkTopology.TracerType.Filtering, ref tunnelingEvent, considerDistance);
                                shouldFiltering = true;
                            }

                            tunnelingNodeID = tunnelingEvent.TunnelingSrc;

                            tunnelingEventList.Add(tunnelingEvent);
                            isTunneling = true;
                        }
                        break;

                    case NetworkTopology.TracerType.Marking:
                        if ((!isMarking && rd.NextDouble() <= probibilityOfPacketMarking && markingEventList.Count * 100 / totalPacket < startFiltering && !shouldFiltering) || shouldMarking)
                        {
                            MarkingEvent markingEvent = new MarkingEvent(packetEvent);

                            if (shouldMarking && tunnelingNodeID != -1)
                            {
                                markingEvent.MarkingNodeID = tunnelingNodeID;
                            }
                            else
                            {
                                markingEvent.MarkingNodeID = path[j];
                            }

                            markingEventList.Add(markingEvent);
                            isMarking     = true;
                            shouldMarking = false;

                            if (markingEventList.Count * 100 / totalPacket >= startFiltering)
                            {
                                foreach (MarkingEvent e in markingEventList.Where(e => e.Type != NetworkTopology.NodeType.Attacker))
                                {
                                    NetworkTopology.Node n = topology.Nodes.Find(node => node.ID == e.MarkingNodeID);
                                    if (n.Tracer == NetworkTopology.TracerType.Tunneling)
                                    {
                                        n.IsTunnelingActive = false;
                                    }
                                }
                            }
                        }
                        break;

                    case NetworkTopology.TracerType.Filtering:
                        if (shouldFiltering || markingEventList.Count * 100 / totalPacket >= startFiltering)
                        {
                            if (packetEvent.Type == NetworkTopology.NodeType.Attacker)
                            {
                                FilteringEvent filteringEvent = new FilteringEvent(packetEvent);
                                filteringEvent.FilteringNodeID = path[j];
                                filteringEventList.Add(filteringEvent);
                                isFiltering = true;

                                // Adjust probability of Tunneling tracer which tunneling from...
                                if (dynamicProbability && tunnelingNodeID != -1)
                                {
                                    Network_Simulation.NetworkTopology.Node node = topology.Nodes.Find(n => n.ID == tunnelingNodeID);
                                    node.FilteringCount         = node.FilteringCount >= 10 ? 10 : node.FilteringCount + 1;
                                    node.ProbabilityOfTunneling = node.FilteringCount / 10;
                                }
                            }
                            else if (dynamicProbability && tunnelingNodeID != -1)
                            {
                                Network_Simulation.NetworkTopology.Node node = topology.Nodes.Find(n => n.ID == tunnelingNodeID);
                                node.FilteringCount         = node.FilteringCount <= 0 ? 0 : node.FilteringCount - 1;
                                node.ProbabilityOfTunneling = node.FilteringCount / 10;
                            }
                        }
                        break;
                    }

                    if (isFiltering)
                    {
                        break;
                    }

                    PacketSentEvent packetSentEvent = new PacketSentEvent(packetEvent);
                    packetSentEvent.CurrentNodeID = path[j];
                    packetSentEvent.NextHopID     = j == path.Count - 1 ? -1 : path[j + 1];
                    packetSentEvent.Length        = j == path.Count - 1 ? 0 : topology.AdjacentMatrix[topology.NodeID2Index(path[j]), topology.NodeID2Index(path[j + 1])].Length;

                    packetSentEventList.Add(packetSentEvent);
                }
                Report(i + 1, totalPacket);

                //DataUtility.Log("==============================");
                //foreach (NetworkTopology.Node node in topology.Nodes)
                //    DataUtility.Log(string.Format("Node%{0} FC:{1} Tp:{2}\n", node.ID, node.FilteringCount, node.ProbabilityOfTunneling));
            }

            List <PacketSentEvent> tracingList = new List <PacketSentEvent>();
            int        packetID = 0;
            List <int> FilteringAndMarkingTracerID = new List <int>();

            if (deployment.FilteringTracerID != null)
            {
                FilteringAndMarkingTracerID.AddRange(deployment.FilteringTracerID);
            }

            if (deployment.MarkingTracerID != null)
            {
                FilteringAndMarkingTracerID.AddRange(deployment.MarkingTracerID);
            }

            foreach (int victim in topology.idOfVictims)
            {
                foreach (int nodeID in FilteringAndMarkingTracerID)
                {
                    if (victim == nodeID)
                    {
                        continue;
                    }

                    path = topology.GetShortestPath(victim, nodeID);
                    for (int i = 0; i < path.Count - 1; i++)
                    {
                        tracingList.Add(new PacketSentEvent(packetID)
                        {
                            CurrentNodeID = path[i],
                            NextHopID     = path[i + 1],
                            Length        = topology.AdjacentMatrix[topology.NodeID2Index(path[i]), topology.NodeID2Index(path[i + 1])].Length
                        });
                    }
                    packetID++;
                }

                if (version == "Random" || version == "V2")
                {
                    foreach (int nodeID in deployment.TunnelingTracerID)
                    {
                        if (victim == nodeID)
                        {
                            continue;
                        }

                        path = topology.GetShortestPath(victim, nodeID);
                        for (int i = 0; i < path.Count - 1; i++)
                        {
                            tracingList.Add(new PacketSentEvent(packetID)
                            {
                                CurrentNodeID = path[i],
                                NextHopID     = path[i + 1],
                                Length        = topology.AdjacentMatrix[topology.NodeID2Index(path[i]), topology.NodeID2Index(path[i + 1])].Length
                            });
                        }
                        packetID++;
                    }
                }
            }

            if (version == "V1")
            {
                foreach (int nodeID in deployment.TunnelingTracerID)
                {
                    deployment.FilteringTracerID.Sort((x, y) => { return(topology.GetShortestPathCount(x, nodeID).CompareTo(topology.GetShortestPathCount(y, nodeID))); });
                    path = topology.GetShortestPath(deployment.FilteringTracerID.First(), nodeID);
                    for (int i = 0; i < path.Count - 1; i++)
                    {
                        tracingList.Add(new PacketSentEvent(packetID)
                        {
                            CurrentNodeID = path[i],
                            NextHopID     = path[i + 1],
                            Length        = topology.AdjacentMatrix[topology.NodeID2Index(path[i]), topology.NodeID2Index(path[i + 1])].Length
                        });
                    }
                    packetID++;
                }
            }

            sql.InsertTracingCost(tracingList);

            sql.InsertPacketEvent(packetEventList);
            sql.InsertPacketSentEvent(packetSentEventList);
            sql.InsertTunnelingEvent(tunnelingEventList);
            sql.InsertMarkingEvent(markingEventList);
            sql.InsertFilteringEvent(filteringEventList);

            sql.LogDeploymentResult(topology, deployment);
        }
예제 #3
0
        private List <int> ChooseTunnelingNode(List <int> path, int source, NetworkTopology.TracerType tracerType, ref TunnelingEvent tunelingEvent, bool considerDistance)
        {
            double     totalDelay       = double.MaxValue;
            List <int> newPath          = new List <int>();
            List <int> tunnelingTargets = null;

            switch (tracerType)
            {
            case NetworkTopology.TracerType.Marking:
                tunnelingTargets = deployment.MarkingTracerID;
                break;

            case NetworkTopology.TracerType.Filtering:
                tunnelingTargets = deployment.FilteringTracerID;
                break;
            }

            foreach (var tunnelingNodeID in tunnelingTargets)
            {
                List <int> tmpPath       = new List <int>();
                double     tmpTotalDelay = 0;

                if (!path.GetRange(source, path.Count - source).Contains(tunnelingNodeID))
                {
                    tmpPath = topology.GetShortestPath(path[source], tunnelingNodeID);
                    tmpPath.Remove(tmpPath.Last());
                    tmpPath.AddRange(topology.GetShortestPath(tunnelingNodeID, path.Last()));

                    for (int i = source - 1; i >= 0; i--)
                    {
                        tmpPath.Insert(0, path[i]);
                    }
                }
                else
                {
                    tmpPath = path;
                }

                for (int i = 0; i < tmpPath.Count - 1; i++)
                {
                    tmpTotalDelay += topology.AdjacentMatrix[topology.NodeID2Index(tmpPath[i]), topology.NodeID2Index(tmpPath[i + 1])].Delay;
                }

                if (tmpTotalDelay < totalDelay)
                {
                    newPath    = tmpPath;
                    totalDelay = tmpTotalDelay;
                    tunelingEvent.TunnelingDst = tunnelingNodeID;
                }
            }

            if (considerDistance)
            {
                if (tunnelingTargets.Exists(nodeID => newPath.Contains(nodeID)))
                {
                    double ori_dist             = 0;
                    double new_dist             = 0;
                    int    tunnelingNodeID      = tunnelingTargets.Find(nodeID => newPath.Contains(nodeID));
                    int    tunnelingTargetIndex = newPath.IndexOf(tunnelingNodeID);

                    for (int i = source; i < tunnelingTargetIndex; i++)
                    {
                        new_dist += topology.AdjacentMatrix[topology.NodeID2Index(newPath[i]), topology.NodeID2Index(newPath[i + 1])].Length;
                    }

                    for (int i = source; i < path.Count - 1; i++)
                    {
                        ori_dist += topology.AdjacentMatrix[topology.NodeID2Index(path[i]), topology.NodeID2Index(path[i + 1])].Length;
                    }

                    if (new_dist > ori_dist)
                    {
                        return(path);
                    }
                }
            }

            return(newPath);
        }