分分钟出结果?python实现高效流量统计(附源码)

2023-12-13 11:42:58

在一个计算机上运行着许多网络应用进程,每个进程能够关联多个网络端口。每个网络端口在任何时刻仅能与一个进程关联,且一旦成功关联即可接收网络数据包。

基于此场景,我们设计了一个简易的网络流量监控系统,具备以下功能接口:

FlowMonitorSystem() - 系统初始化。

assign_port(self, pid: int, port: int) - 将特定端口port分配给进程pid。

release_port(self, port: int) - 解绑指定端口。

若端口已绑定,则解除绑定,保留已接收的数据量,返回True;若未绑定,返回False。
receive_data(self, port: int, data_length: int) - 指定端口接收一定长度的数据包。

若端口未绑定任何进程,则返回0,表示数据丢失。
若端口已绑定进程,则该进程的接收数据量增加data_length,返回增加后的数据量。
top_processes(self, top_limit: int) - 统计接收最多数据的前top_limit个进程,并按以下规则返回进程ID列表。

不统计未接收过数据的进程。
首先按接收数据总量降序排序,若总量相同,按进程ID升序。
若符合条件的进程数少于top_limit,则根据实际数量返回;若无符合条件的,返回空列表。
该系统为计算机网络监控提供了一个基础而有效的工具,可以帮助管理员监测网络流量和进程活动,确保网络稳定运行。

class FlowStatsSystem:
    def __init__(self):
        # 存储绑定的进程和端口
        self.bind_port_dt = {}  # {port: pid, ...}
        self.stat_packet_map = {}  # {pid: 10, ...}

    def bind_port(self, pid: int, port: int):
        if port in self.bind_port_dt:
            return False
        else:
            self.bind_port_dt[port] = pid
            self.stat_packet_map[pid] = self.stat_packet_map.get(pid, 0)
            return True

    def unbind_port(self, port: int):
        if port in self.bind_port_dt:
            del self.bind_port_dt[port]
            return True
        else:
            return False

    def recv_packet(self, port: int, packet_len: int):
        pid = self.bind_port_dt.get(port)
        if pid:
            self.stat_packet_map[pid] += packet_len  # 该进程上累加报文长度
            return self.stat_packet_map[pid]
        return 0  # 端口没有绑定在pid上,则直接返回0

    def stat_packet(self, top_num: int):
        # 统计接收过报文的进程
        items = {pid: packet_len for pid, packet_len in self.stat_packet_map.items() if packet_len > 0}
        sorted_items = sorted(items.items(), key=lambda x: (-x[1], x[0]))
        if len(sorted_items) >= top_num:
            result = [pid for pid, _ in list(sorted_items)[:top_num]]
        else:
            result = [pid for pid, _ in sorted_items]
        return result


if __name__ == '__main__':
    flow = FlowStatsSystem()
    print(flow.bind_port(23215, 443))
    print(flow.bind_port(23215, 443))
    print(flow.bind_port(23215, 3306))
    print(flow.bind_port(23216, 3306))
    print(flow.bind_port(23216, 80))
    print(flow.recv_packet(3306, 100))
    print(flow.recv_packet(443, 200))
    print(flow.recv_packet(80, 300))
    print(flow.unbind_port(443))
    print(flow.stat_packet(3))

总结

Python 简易网络流量监控系统提供了基础而有效的网络管理工具。系统初始化后,通过 assign_port 可以将网络端口分配给特定进程,而 release_port 负责解绑端口。receive_data 接口用于记录端口接收数据的量,若端口未绑定则数据丢失。最关键的功能 top_processes 能统计并返回接收最多数据的顶级进程列表。这一系统便于网络管理员监控网络流量,保障网络的稳定性和效率。通过这些接口,管理员能有效追踪网络资源的分配和使用情况,确保网络环境的优化运行。

文章来源:https://blog.csdn.net/liaozp88/article/details/134966048
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。