捕获并分析帧和IP报文

计算机网络实验3

实验目的

  • 捕获并分析以太网的帧,获取目标与源网卡的MAC 地址
  • 获取本机地址
  • 获取远端MAC地址

实验环境

  • Windows 10
  • C#
  • Visual Studio 2017

实验结果

 测试时,设置为超过10000Bps就会报警
实验结果

实验总结

  1. 全局初始化
    安装WinPcap和SharpPcap
    using
    struct
    全局变量
    初始化
  2. 查看网卡信息
    通过调用ipconfig.exe实现
    ipconfig
  3. 适配器
    适配器
    1. 计时动作
      计时动作
    2. 载入适配器列表
      load_devices
    3. 载入适配器信息
      载入适配器信息
  4. 开始侦听
    start
    1. 收包动作
      收包
    2. 成帧
      成帧1
      成帧2
      成帧3
      成帧4
      成帧5
      成帧6
      成帧7
      BitConverter
    3. 成帧时修改流量统计
      更新流量统计
    4. 监视流量
      计算流量
      报警
  5. 暂停侦听
    pause
  6. 继续侦听
    continue
  7. 停止侦听
    stop
  8. 保存日志
    save_diary
  9. 退出程序
    exit
  10. 技术细节
    1. 计算流量的方法
      构建新结构体(mac + ip +mode)放进dictionary当key,各key累计收发包大小当value。新建线程,每隔1s遍历各来源的收发流量,超过1MB的,可以认为在这1s内平流量达到1MBps以上,故而给本机警告
    2. 遍历dictionary
      因为多线程同时在访问dictionary,所以会出现在一个线程遍历dictionary的时候,另一个线程正在新增dictionary的项。此时采用foreach遍历会报错,因为foreach要求正在遍历的对象不能有变化
    3. 有网络但侦听不到包体
      如果确认程序没错,那么可能是
      1. 选错网卡,要注意选一个有网络的网卡
      2. 当前的网络收发包类型不是ip and tcp,应该是filter的问题,关掉filter即可
    4. BitConverter
      会反向获取。
      如,现有byte[] test={0x01,0x10,0x0f,0xff};
      二进制为00000001 00010000 00001111 11111111
      十进制为17829887
      此时进行uint ans=BitConverter.ToUInt32(test,0);
      会得到ans= 4279177217
      十六进制为ff0f1001
      二进制为11111111 00001111 00010000 00000001
      可见不能得到想要的结果,因为BitConverter会反向转换所给的byte数组
      所以应该先将要转换的数组反向,再使用BitConverter
  11. 参考链接
    SharpPcap
--It's the end.Thanks for your read.--