private bool selectStartNode(NetworkTopology topo, out int selectNode, bool isNeedRecompute) { int eccentricity; int diameter = int.MinValue; int minDegree = int.MaxValue; bool isSelected = false; // If find center point. if (topo.FindCenterNodeID(out selectNode, out eccentricity, isNeedRecompute)) { foreach (var node in topo.Nodes) { if (diameter < node.Eccentricity) { diameter = node.Eccentricity; } } // Check whether the diameter is greater than 2 * K, then select the point from center. if (diameter > 2 * K) { isSelected = true; } // Select the point from minimum degree. else { foreach (var n in topo.Nodes) { if (minDegree > topo.Degree(n.ID)) { minDegree = topo.Degree(n.ID); selectNode = n.ID; isSelected = true; } } } } // Select the point from minimum degree. else { foreach (var n in topo.Nodes) { if (minDegree > topo.Degree(n.ID)) { minDegree = topo.Degree(n.ID); selectNode = n.ID; isSelected = true; } } } return(isSelected); }
protected override void doDeploy(NetworkTopology networkTopology) { List <NetworkTopology> allRoundScopeList = new List <NetworkTopology>(); List <int> deployNodes = new List <int>(); NetworkTopology tmp_src_net_topo = networkTopology; int centerID; int e; // Finding the center node to run all level's process. while (tmp_src_net_topo.FindCenterNodeID(out centerID, out e)) { NetworkTopology scope_net_topo = new NetworkTopology(0, 0); // Adding the center node to scope network topology. scope_net_topo.Nodes.Add(tmp_src_net_topo.Nodes.Find(n => n.ID == centerID)); // Starting run algorithm with this level. tmp_src_net_topo = startAlgorithm(tmp_src_net_topo, 4, ref scope_net_topo, ref deployNodes); // Adding this round generated scope network topology to list. allRoundScopeList.Add(scope_net_topo); DataUtility.Log(string.Format("================= Level {0} ==================\n", allRoundScopeList.Count)); DataUtility.Log(string.Format("Scope Count:\t{0}\n", scope_net_topo.Nodes.Count)); DataUtility.Log(string.Format("Deploy Count/Node Count:\t{0}/{1} = {2:0.0000}\n", deployNodes.Count, networkTopology.Nodes.Count, (float)deployNodes.Count / (float)networkTopology.Nodes.Count)); } // Adding the remain nodes to deployment node list. //deployNodes.AddRange(tmp_src_net_topo.Nodes.Select(x => x.ID)); // Modifying actual tracer type on network topology depend on computed deployment node. foreach (int id in deployNodes) { networkTopology.Nodes.Find(n => n.ID == id).Tracer = NetworkTopology.TracerType.Marking; } }
private bool selectStartNode(NetworkTopology topo, out int selectNode, bool isNeedRecompute) { int eccentricity; return(topo.FindCenterNodeID(out selectNode, out eccentricity, isNeedRecompute)); }
protected override void doDeploy(NetworkTopology networkTopology) { if (checkHaveRunned(networkTopology)) { isNeedWriteing2SQLite = false; isNeedReset = false; } else { NetworkTopology process_topo = networkTopology; NetworkTopology center_tmp_topo = null; NetworkTopology side_tmp_topo = null; int centerNode; int sideNode; int eccentricity; int minDegree; isNeedRecompute = false; lastDeployCount = 0; allLevelDeploy = new List <List <int> >(); while (process_topo.Nodes.Count > 0) { centerNode = -1; sideNode = -1; minDegree = int.MaxValue; process_topo.FindCenterNodeID(out centerNode, out eccentricity, isNeedRecompute); foreach (var n in process_topo.Nodes) { if (minDegree > process_topo.Degree(n.ID)) { minDegree = process_topo.Degree(n.ID); sideNode = n.ID; } } NetworkTopology center_scope_net_topo = new NetworkTopology(networkTopology.Nodes); NetworkTopology side_scope_net_topo = new NetworkTopology(networkTopology.Nodes); List <int> center_deploy = new List <int>(); List <int> side_deploy = new List <int>(); center_scope_net_topo.AdjacentMatrix = networkTopology.AdjacentMatrix; side_scope_net_topo.AdjacentMatrix = networkTopology.AdjacentMatrix; if (centerNode != -1) { center_scope_net_topo.Nodes.Add(process_topo.Nodes.Find(n => n.ID == centerNode)); center_tmp_topo = startAlgorithm(process_topo, center_scope_net_topo, center_deploy); } if (sideNode != -1) { side_scope_net_topo.Nodes.Add(process_topo.Nodes.Find(n => n.ID == sideNode)); side_tmp_topo = startAlgorithm(process_topo, side_scope_net_topo, side_deploy); } if (center_deploy.Count < side_deploy.Count) { process_topo = center_tmp_topo; allRoundScopeList.Add(center_scope_net_topo); deployNodes.AddRange(center_deploy); allLevelDeploy.Add(center_deploy); DataUtility.Log(string.Format("================= Level {0} ==================\n", allRoundScopeList.Count)); DataUtility.Log(string.Format("Start From Center Node:\t{0}\n", center_scope_net_topo.Nodes[0].ID)); DataUtility.Log(string.Format("Scope Node Count:\t{0}\n", center_scope_net_topo.Nodes.Count)); DataUtility.Log(string.Format("Deploy Count/Node Count:\t{0}/{1} = {2:0.0000}\n", deployNodes.Count, networkTopology.Nodes.Count, (float)deployNodes.Count / (float)networkTopology.Nodes.Count)); } else { process_topo = side_tmp_topo; allRoundScopeList.Add(side_scope_net_topo); deployNodes.AddRange(side_deploy); allLevelDeploy.Add(side_deploy); DataUtility.Log(string.Format("================= Level {0} ==================\n", allRoundScopeList.Count)); DataUtility.Log(string.Format("Start From Side Node:\t{0}\n", side_scope_net_topo.Nodes[0].ID)); DataUtility.Log(string.Format("Scope Node Count:\t{0}\n", side_scope_net_topo.Nodes.Count)); DataUtility.Log(string.Format("Deploy Count/Node Count:\t{0}/{1} = {2:0.0000}\n", deployNodes.Count, networkTopology.Nodes.Count, (float)deployNodes.Count / (float)networkTopology.Nodes.Count)); } isNeedRecompute = deployNodes.Count != lastDeployCount; lastDeployCount = deployNodes.Count; } if (process_topo.Nodes.Count != 0) { allRoundScopeList.Add(process_topo); } } // Modifying actual tracer type on network topology depend on computed deployment node. foreach (int id in deployNodes) { networkTopology.Nodes.Find(n => n.ID == id).Tracer = NetworkTopology.TracerType.Tunneling; } }
private void simSpecificDeployMethod() { int centerID, minE; List <int> path; List <MarkingEvent> markingEventList = new List <MarkingEvent>(); //List<PacketEvent> packetEventList = new List<PacketEvent>(); //List<PacketSentEvent> packetSentEventList = new List<PacketSentEvent>(); List <int> firstMeetTracerHopCountList = new List <int>(); List <int> srcToScopeCenterHopCountList = new List <int>(); List <int> attackerAreaCounts = new List <int>(); List <int> pathCountList = new List <int>(); Random rd = new Random(Guid.NewGuid().GetHashCode()); for (int i = 0; i < c_packetNumber; i++) { bool isMarking = false; NetworkTopology.Node srcNode = m_networkTopology.Nodes[rd.Next(m_networkTopology.Nodes.Count)]; NetworkTopology.Node desNode = null; while (desNode == null || desNode == srcNode) { desNode = m_networkTopology.Nodes[rd.Next(m_networkTopology.Nodes.Count)]; } NetworkTopology sourceScope = m_deployment.AllRoundScopeList.Find(scope => scope.Nodes.Exists(n => n.ID == srcNode.ID)); if (sourceScope != null) { if (sourceScope.FindCenterNodeID(out centerID, out minE) && srcNode.ID != centerID) { srcToScopeCenterHopCountList.Add(m_networkTopology.GetShortestPathCount(srcNode.ID, centerID) - 1); } else { srcToScopeCenterHopCountList.Add(0); } attackerAreaCounts.Add(sourceScope.Nodes.Count); } else { srcToScopeCenterHopCountList.Add(0); attackerAreaCounts.Add(0); } path = m_networkTopology.GetShortestPath(srcNode.ID, desNode.ID); PacketEvent packetEvent = new PacketEvent() { PacketID = i, Source = srcNode.ID, Destination = desNode.ID, Time = 0, Type = NetworkTopology.NodeType.Attacker }; //packetEventList.Add(packetEvent); for (int j = 0; j < path.Count; j++) { switch (m_networkTopology.Nodes[m_networkTopology.NodeID2Index(path[j])].Tracer) { case NetworkTopology.TracerType.None: break; case NetworkTopology.TracerType.Marking: if (!isMarking) { MarkingEvent markingEvent = new MarkingEvent(packetEvent); markingEvent.MarkingNodeID = path[j]; firstMeetTracerHopCountList.Add(j); isMarking = true; markingEventList.Add(markingEvent); } break; case NetworkTopology.TracerType.Tunneling: break; case NetworkTopology.TracerType.Filtering: break; default: 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 : m_networkTopology.AdjacentMatrix[m_networkTopology.NodeID2Index(path[j]), m_networkTopology.NodeID2Index(path[j + 1])].Length; //packetSentEventList.Add(packetSentEvent); } pathCountList.Add(path.Count - 1); if (!isMarking) { firstMeetTracerHopCountList.Add(path.Count - 1); } } m_networkTopology.Reset(); // Log into db double theoreticalUndetectedRatio = (double)m_deployment.AllRoundScopeList.Sum(s => s.Nodes.Count > 1 ? DataUtility.Combination(s.Nodes.Count, 2) : 0) / (double)DataUtility.Combination(m_networkTopology.Nodes.Count, 2); double upperboundUndetectedRatio = m_networkTopology.m_prob_hop.Sum(i => (m_networkTopology.m_prob_hop.ToList().IndexOf(i) >= 1 && m_networkTopology.m_prob_hop.ToList().IndexOf(i) <= m_deployment.K - 1) ? i : 0); double undetectedRatio = (double)(c_packetNumber - markingEventList.Count) / (double)c_packetNumber; double firstMeetTracerSearchingCost = (double)firstMeetTracerHopCountList.Sum() / (double)c_packetNumber; double srcToScopeCenterSearchingCost = (double)srcToScopeCenterHopCountList.Sum() / (double)c_packetNumber; double attackerScopeCountSearchingCost = attackerAreaCounts.Average(); double savingCost = 0; double survivalTrafficRatio = (double)firstMeetTracerHopCountList.Sum() / (double)pathCountList.Sum(); for (int i = 0; i < c_packetNumber; i++) { savingCost += pathCountList[i] - firstMeetTracerHopCountList[i]; } savingCost /= c_packetNumber; string cmd; // UndetectedRatio cmd = "INSERT INTO UndetectedRatio(file_name, node_counts, edge_counts, diameter, k, n, metric_name, ratio) VALUES(@file_name, @node_counts, @edge_counts, @diameter, @k, @n, @metric_name, @ratio);"; m_sqlite_utils.RunCommnad(cmd, new List <SQLiteParameter>() { new SQLiteParameter("@file_name", m_networkTopology.FileName), new SQLiteParameter("@node_counts", m_networkTopology.Nodes.Count), new SQLiteParameter("@edge_counts", m_networkTopology.Edges.Count), new SQLiteParameter("@diameter", m_networkTopology.Diameter), new SQLiteParameter("@k", m_deployment.K), new SQLiteParameter("@n", m_deployment.N), new SQLiteParameter("@metric_name", "K-Cut Deployment"), new SQLiteParameter("@ratio", undetectedRatio) }); cmd = "INSERT INTO UndetectedRatio(file_name, node_counts, edge_counts, diameter, k, n, metric_name, ratio) VALUES(@file_name, @node_counts, @edge_counts, @diameter, @k, @n, @metric_name, @ratio);"; m_sqlite_utils.RunCommnad(cmd, new List <SQLiteParameter>() { new SQLiteParameter("@file_name", m_networkTopology.FileName), new SQLiteParameter("@node_counts", m_networkTopology.Nodes.Count), new SQLiteParameter("@edge_counts", m_networkTopology.Edges.Count), new SQLiteParameter("@diameter", m_networkTopology.Diameter), new SQLiteParameter("@k", m_deployment.K), new SQLiteParameter("@n", m_deployment.N), new SQLiteParameter("@metric_name", "Theoretical Undetected Ratio"), new SQLiteParameter("@ratio", theoreticalUndetectedRatio) }); cmd = "INSERT INTO UndetectedRatio(file_name, node_counts, edge_counts, diameter, k, n, metric_name, ratio) VALUES(@file_name, @node_counts, @edge_counts, @diameter, @k, @n, @metric_name, @ratio);"; m_sqlite_utils.RunCommnad(cmd, new List <SQLiteParameter>() { new SQLiteParameter("@file_name", m_networkTopology.FileName), new SQLiteParameter("@node_counts", m_networkTopology.Nodes.Count), new SQLiteParameter("@edge_counts", m_networkTopology.Edges.Count), new SQLiteParameter("@diameter", m_networkTopology.Diameter), new SQLiteParameter("@k", m_deployment.K), new SQLiteParameter("@n", m_deployment.N), new SQLiteParameter("@metric_name", "Theoretical Undetected Ratio Upper Bound"), new SQLiteParameter("@ratio", upperboundUndetectedRatio) }); // Searching Cost cmd = "INSERT INTO SearchingCost(file_name, node_counts, edge_counts, diameter, k, n, metric_name, ratio) VALUES(@file_name, @node_counts, @edge_counts, @diameter, @k, @n, @metric_name, @ratio);"; m_sqlite_utils.RunCommnad(cmd, new List <SQLiteParameter>() { new SQLiteParameter("@file_name", m_networkTopology.FileName), new SQLiteParameter("@node_counts", m_networkTopology.Nodes.Count), new SQLiteParameter("@edge_counts", m_networkTopology.Edges.Count), new SQLiteParameter("@diameter", m_networkTopology.Diameter), new SQLiteParameter("@k", m_deployment.K), new SQLiteParameter("@n", m_deployment.N), new SQLiteParameter("@metric_name", "K-Cut Deployment - First Meet Tracer"), new SQLiteParameter("@ratio", firstMeetTracerSearchingCost) }); cmd = "INSERT INTO SearchingCost(file_name, node_counts, edge_counts, diameter, k, n, metric_name, ratio) VALUES(@file_name, @node_counts, @edge_counts, @diameter, @k, @n, @metric_name, @ratio);"; m_sqlite_utils.RunCommnad(cmd, new List <SQLiteParameter>() { new SQLiteParameter("@file_name", m_networkTopology.FileName), new SQLiteParameter("@node_counts", m_networkTopology.Nodes.Count), new SQLiteParameter("@edge_counts", m_networkTopology.Edges.Count), new SQLiteParameter("@diameter", m_networkTopology.Diameter), new SQLiteParameter("@k", m_deployment.K), new SQLiteParameter("@n", m_deployment.N), new SQLiteParameter("@metric_name", @"K-Cut Deployment - Attacker to Scope Center"), new SQLiteParameter("@ratio", srcToScopeCenterSearchingCost) }); cmd = "INSERT INTO SearchingCost(file_name, node_counts, edge_counts, diameter, k, n, metric_name, ratio) VALUES(@file_name, @node_counts, @edge_counts, @diameter, @k, @n, @metric_name, @ratio);"; m_sqlite_utils.RunCommnad(cmd, new List <SQLiteParameter>() { new SQLiteParameter("@file_name", m_networkTopology.FileName), new SQLiteParameter("@node_counts", m_networkTopology.Nodes.Count), new SQLiteParameter("@edge_counts", m_networkTopology.Edges.Count), new SQLiteParameter("@diameter", m_networkTopology.Diameter), new SQLiteParameter("@k", m_deployment.K), new SQLiteParameter("@n", m_deployment.N), new SQLiteParameter("@metric_name", @"K-Cut Deployment - The Number of Nodes in Attacker Area"), new SQLiteParameter("@ratio", attackerScopeCountSearchingCost) }); // Saving Cost cmd = "INSERT INTO SavingCost(file_name, node_counts, edge_counts, diameter, k, n, metric_name, ratio) VALUES(@file_name, @node_counts, @edge_counts, @diameter, @k, @n, @metric_name, @ratio);"; m_sqlite_utils.RunCommnad(cmd, new List <SQLiteParameter>() { new SQLiteParameter("@file_name", m_networkTopology.FileName), new SQLiteParameter("@node_counts", m_networkTopology.Nodes.Count), new SQLiteParameter("@edge_counts", m_networkTopology.Edges.Count), new SQLiteParameter("@diameter", m_networkTopology.Diameter), new SQLiteParameter("@k", m_deployment.K), new SQLiteParameter("@n", m_deployment.N), new SQLiteParameter("@metric_name", "K-Cut Deployment"), new SQLiteParameter("@ratio", savingCost) }); // Survival Malicious Traffic Ratio cmd = "INSERT INTO SurvivalMaliciousTrafficRatio(file_name, node_counts, edge_counts, diameter, k, n, metric_name, ratio) VALUES(@file_name, @node_counts, @edge_counts, @diameter, @k, @n, @metric_name, @ratio);"; m_sqlite_utils.RunCommnad(cmd, new List <SQLiteParameter>() { new SQLiteParameter("@file_name", m_networkTopology.FileName), new SQLiteParameter("@node_counts", m_networkTopology.Nodes.Count), new SQLiteParameter("@edge_counts", m_networkTopology.Edges.Count), new SQLiteParameter("@diameter", m_networkTopology.Diameter), new SQLiteParameter("@k", m_deployment.K), new SQLiteParameter("@n", m_deployment.N), new SQLiteParameter("@metric_name", "K-Cut Deployment"), new SQLiteParameter("@ratio", survivalTrafficRatio) }); }